diff --git a/.gitattributes b/.gitattributes
index 7e5534c..0f5ea98 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,8 +1,10 @@
+# Source files should not be normalized to avoid confusing clang-format-diff.py
+*.c text eol=lf
+*.cc text eol=lf
+*.cpp text eol=lf
+*.h text eol=lf
+
 # Explicitly declare text files we want to be normalized.
-*.c text
-*.cc text
-*.cpp text
-*.h text
 *.gyp text
 *.gypi text
 *.dart text
diff --git a/DEPS b/DEPS
index 32fb239..ef26510 100644
--- a/DEPS
+++ b/DEPS
@@ -32,6 +32,7 @@
 
   # Revisions of GN related dependencies.
   "buildtools_revision": "@39b1db2ab4aa4b2ccaa263c29bdf63e7c1ee28aa",
+  "clang_format_rev": "@0ed791d1387a3c9146ea6c453c646f3c0fc97784",
 
   "gperftools_revision": "@02eeed29df112728564a5dde6417fa4622b57a06",
 
@@ -56,7 +57,7 @@
   "csslib_tag" : "@0.13.2",
   "dart2js_info_tag" : "@0.5.0",
   "dart_services_rev" : "@7aea2574e6f3924bf409a80afb8ad52aa2be4f97",
-  "dart_style_tag": "@v0.2.11+1",
+  "dart_style_rev": "@a2b84e46a9e4044e61e3cc130087c18da40b9665",
   "dartdoc_tag" : "@v0.9.7+6",
   "fixnum_tag": "@0.10.5",
   "func_tag": "@0.1.0",
@@ -134,6 +135,9 @@
   Var("dart_root") + "/buildtools":
      Var('chromium_git') + '/chromium/buildtools.git' +
      Var('buildtools_revision'),
+  Var("dart_root") + "/buildtools/clang_format/script":
+    Var("chromium_git") + "/chromium/llvm-project/cfe/tools/clang-format.git" +
+    Var("clang_format_rev"),
 
   Var("dart_root") + "/tests/co19/src":
       (Var("github_mirror") % "co19") + Var("co19_rev"),
@@ -201,7 +205,7 @@
       (Var("github_mirror") % "dart-services") +
       Var("dart_services_rev"),
   Var("dart_root") + "/third_party/pkg_tested/dart_style":
-      (Var("github_mirror") % "dart_style") + Var("dart_style_tag"),
+      (Var("github_mirror") % "dart_style") + Var("dart_style_rev"),
   Var("dart_root") + "/third_party/pkg/dart2js_info":
       (Var("github_mirror") % "dart2js_info") + Var("dart2js_info_tag"),
   Var("dart_root") + "/third_party/pkg/dartdoc":
@@ -406,6 +410,21 @@
   },
   # Pull clang-format binaries using checked-in hashes.
   {
+    'name': 'clang_format_win',
+    'pattern': '.',
+    'action': [
+      'download_from_google_storage',
+      '--no_auth',
+      '--no_resume',
+      '--quiet',
+      '--platform=win32',
+      '--bucket',
+      'chromium-clang-format',
+      '-s',
+      Var('dart_root') + '/buildtools/win/clang-format.exe.sha1',
+    ],
+  },
+  {
     'name': 'clang_format_linux',
     'pattern': '.',
     'action': [
diff --git a/build/compiled_action.gni b/build/compiled_action.gni
index b6d0c4d..e4e999a 100644
--- a/build/compiled_action.gni
+++ b/build/compiled_action.gni
@@ -72,6 +72,8 @@
   _host_executable_suffix = ""
 }
 
+_dart_root = rebase_path("..")
+
 template("compiled_action") {
   assert(defined(invoker.tool), "tool must be defined for $target_name")
   assert(defined(invoker.outputs), "outputs must be defined for $target_name")
@@ -85,7 +87,7 @@
       visibility = invoker.visibility
     }
 
-    script = "//build/gn_run_binary.py"
+    script = "$_dart_root/build/gn_run_binary.py"
 
     if (defined(invoker.inputs)) {
       inputs = invoker.inputs
@@ -118,7 +120,10 @@
 
     # The script takes as arguments the binary to run, and then the arguments
     # to pass it.
-    args = [ rebase_path(host_executable, root_build_dir) ] + invoker.args
+    args = [
+      "compiled_action",
+      rebase_path(host_executable, root_build_dir)
+    ] + invoker.args
   }
 }
 
@@ -134,7 +139,7 @@
       visibility = invoker.visibility
     }
 
-    script = "//build/gn_run_binary.py"
+    script = "$_dart_root/build/gn_run_binary.py"
     sources = invoker.sources
 
     if (defined(invoker.inputs)) {
@@ -168,6 +173,9 @@
 
     # The script takes as arguments the binary to run, and then the arguments
     # to pass it.
-    args = [ rebase_path(host_executable, root_build_dir) ] + invoker.args
+    args = [
+      "compiled_action",
+      rebase_path(host_executable, root_build_dir)
+    ] + invoker.args
   }
 }
diff --git a/build/executable_suffix.gni b/build/executable_suffix.gni
new file mode 100644
index 0000000..e2b0dd8
--- /dev/null
+++ b/build/executable_suffix.gni
@@ -0,0 +1,9 @@
+# Copyright (c) 2016, 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.
+
+if (defined(is_win) && is_win) {
+  executable_suffix = ".exe"
+} else {
+  executable_suffix = ""
+}
diff --git a/build/gn_run_binary.py b/build/gn_run_binary.py
old mode 100644
new mode 100755
index 7d83f61..76d1992
--- a/build/gn_run_binary.py
+++ b/build/gn_run_binary.py
@@ -1,3 +1,4 @@
+#!/usr/bin/env python
 # Copyright 2014 The Chromium Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
@@ -5,18 +6,56 @@
 """Helper script for GN to run an arbitrary binary. See compiled_action.gni.
 
 Run with:
-  python gn_run_binary.py <binary_name> [args ...]
+  python gn_run_binary.py <invoker> <binary_name> [args ...]
+
+Where <invoker> is either "compiled_action" or "exec_script". If it is
+"compiled_action" the script has a non-zero exit code on a failure. If it is
+"exec_script" the script has no output on success and produces output otherwise,
+but always has an exit code of 0.
 """
 
+import os
 import sys
 import subprocess
 
-# This script is designed to run binaries produced by the current build. We
-# always prefix it with "./" to avoid picking up system versions that might
-# also be on the path.
-path = './' + sys.argv[1]
+# Run a command, swallowing the output unless there is an error.
+def run_command(command):
+  try:
+    subprocess.check_output(command, stderr=subprocess.STDOUT)
+    return 0
+  except subprocess.CalledProcessError as e:
+    return ("Command failed: " + ' '.join(command) + "\n" +
+            "output: " + e.output)
 
-# The rest of the arguements are passed directly to the executable.
-args = [path] + sys.argv[2:]
+def main(argv):
+  error_exit = 0
+  if argv[1] == "compiled_action":
+    error_exit = 1
+  elif argv[1] != "exec_script":
+    print ("The first argument should be either "
+           "'compiled_action' or 'exec_script")
+    return 1
 
-sys.exit(subprocess.call(args))
+  # Unless the path is absolute, this script is designed to run binaries
+  # produced by the current build. We always prefix it with "./" to avoid
+  # picking up system versions that might also be on the path.
+  if os.path.isabs(argv[2]):
+    path = argv[2]
+  else:
+    path = './' + argv[2]
+
+  if not os.path.isfile(path):
+    print "Binary not found: " + path
+    return error_exit
+
+  # The rest of the arguements are passed directly to the executable.
+  args = [path] + argv[3:]
+
+  result = run_command(args)
+  if result != 0:
+    print result
+    return error_exit
+  return 0
+
+if __name__ == '__main__':
+  sys.exit(main(sys.argv))
diff --git a/build/prebuilt_dart_sdk.gni b/build/prebuilt_dart_sdk.gni
new file mode 100644
index 0000000..1a3299a
--- /dev/null
+++ b/build/prebuilt_dart_sdk.gni
@@ -0,0 +1,18 @@
+# Copyright (c) 2016, 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("executable_suffix.gni")
+
+_dart_root = rebase_path("..")
+
+_prebuilt_dart_exe = "$_dart_root/tools/sdks/$host_os/dart-sdk/bin/dart"
+
+# Our gn_run_binary swallows output unless there is an error.
+_prebuilt_dart_exe_trial = exec_script("gn_run_binary.py",
+    ["exec_script", _prebuilt_dart_exe, "--version"], "string")
+if (_prebuilt_dart_exe_trial == "") {
+  prebuilt_dart_exe_works = true
+} else {
+  prebuilt_dart_exe_works = false
+}
diff --git a/build/toolchain/linux/BUILD.gn b/build/toolchain/linux/BUILD.gn
index 265eea9..3c51133 100644
--- a/build/toolchain/linux/BUILD.gn
+++ b/build/toolchain/linux/BUILD.gn
@@ -88,7 +88,6 @@
   nm = "nm"
   ar = "ar"
   ld = cxx
-  strip = "strip"
 
   toolchain_cpu = "x64"
   toolchain_os = "linux"
diff --git a/docs/language/dart.sty b/docs/language/dart.sty
index 6b21815..d22dde6 100644
--- a/docs/language/dart.sty
+++ b/docs/language/dart.sty
@@ -7,95 +7,75 @@
 \def\gt{$>$}
 \def\<{$\langle$}
 \def\>{$\rangle$}
-
-  \def\ABSTRACT{\builtinId{abstract}}
-  \def\AS{\builtinId{as}}  
-  \def\ASSERT{\keyword{assert}}
-  \def\ASYNC{\keyword{async}}
-  \def\AWAIT{\keyword{await}}
-  \def\BOOLEAN{\keyword{boolean}}
-  \def\BREAK{\keyword{break}}
-  \def\CASE{\keyword{case}}
-  \def\CLASS{\keyword{class}}
-   \def\CALL{\keyword{call}}
-  \def\CATCH{\keyword{catch}}
-  \def\CONST{\keyword{const}}
-  \def\CONTINUE{\keyword{continue}}
-  \def\DEFAULT{\keyword{default}}
-  \def\DEFERRED{\keyword{deferred}}
-  \def\DYNAMIC{\builtinId{dynamic}}
-  \def\DO{\keyword{do}}
-  \def\ELSE{\keyword{else}}
-  \def\ENUM{\keyword{enum}}
-  \def\EQUALS{\keyword{equals}}
-  \def\EXPORT{\builtinId{export}}
-  \def\EXTENDS{\keyword{extends}}
-  \def\EXTERNAL{\builtinId{external}}
-  \def\FACTORY{\builtinId{factory}}  
-  \def\FALSE{\keyword{false}}  
-  \def\FINAL{\keyword{final}} 
-  \def\FINALLY{\keyword{finally}}
-  \def\FOR{\keyword{for}}
-  \def\GET{\builtinId{get}}  
-  \def\HIDE{\keyword{hide}}
-  \def\IF{\keyword{if}}  
-  \def\IMPLEMENTS{\builtinId{implements}}
-  \def\IMPORT{\builtinId{import}}
-  \def\IN{\keyword{in}}
-  \def\INT{\keyword{int}}
-  \def\INTERFACE{\keyword{interface}}
-  \def\IS{\keyword{is}}
-  \def\LIBRARY{\builtinId{library}}
-  \def\NATIVE{\keyword{native}}  
-  \def\NEGATE{\keyword{negate}}  
-  \def\NEW{\keyword{new}}      
-  \def\NULL{\keyword{null}}
-  \def\ON{\keyword{on}}  
-  \def\OF{\keyword{of}}  
-  \def\OPERATOR{\builtinId{operator}}
-  \def\PART{\builtinId{part}} 
-  \def\PRIVATE{\keyword{private}}
-  \def\RETHROW{\keyword{rethrow}}
-  \def\RETURN{\keyword{return}}
-  \def\SET{\builtinId{set}} 
-  \def\SHOW{\keyword{show}} 
-  \def\SOURCE{\keyword{source}}  
-  \def\STATIC{\builtinId{static}}
-  \def\SUPER{\keyword{super}}  
-  \def\SWITCH{\keyword{switch}}  
-  \def\SYNC{\keyword{sync}}  
-  \def\THIS{\keyword{this}}
-  \def\THROW{\keyword{throw}}
-  \def\TRUE{\keyword{true}}
-  \def\TRY{\keyword{try}}
-  \def\TYPEDEF{\builtinId{typedef}}
-  \def\THIS{\keyword{this}}
-  \def\VAR{\keyword{var}}  
-  \def\VOID{\keyword{void}}
-  \def\WHILE{\keyword{while}}
-  \def\WITH{\keyword{with}}
-  \def\YIELD{\keyword{yield}} 
-
-
-
- 
- % \def\PUBLIC{\keyword{public}}
-
-  %\def\PROTECTED{\keyword{protected}}
-
-
-
-
-    
-
- 
-
-
-
- % \def\OUTER{\keyword{outer}}
-
-  \def\TRUE{\keyword{true}}
-
+\def\metavar#1{\ensuremath{\mathit{#1}}}
+\def\ABSTRACT{\builtinId{abstract}}
+\def\AS{\builtinId{as}}
+\def\ASSERT{\keyword{assert}}
+\def\ASYNC{\keyword{async}}
+\def\AWAIT{\keyword{await}}
+\def\BOOLEAN{\keyword{boolean}}
+\def\BREAK{\keyword{break}}
+\def\CASE{\keyword{case}}
+\def\CLASS{\keyword{class}}
+\def\CALL{\keyword{call}}
+\def\CATCH{\keyword{catch}}
+\def\CONST{\keyword{const}}
+\def\CONTINUE{\keyword{continue}}
+\def\DEFAULT{\keyword{default}}
+\def\DEFERRED{\keyword{deferred}}
+\def\DYNAMIC{\builtinId{dynamic}}
+\def\DO{\keyword{do}}
+\def\ELSE{\keyword{else}}
+\def\ENUM{\keyword{enum}}
+\def\EQUALS{\keyword{equals}}
+\def\EXPORT{\builtinId{export}}
+\def\EXTENDS{\keyword{extends}}
+\def\EXTERNAL{\builtinId{external}}
+\def\FACTORY{\builtinId{factory}}
+\def\FALSE{\keyword{false}}
+\def\FINAL{\keyword{final}}
+\def\FINALLY{\keyword{finally}}
+\def\FOR{\keyword{for}}
+\def\GET{\builtinId{get}}
+\def\HIDE{\keyword{hide}}
+\def\IF{\keyword{if}}
+\def\IMPLEMENTS{\builtinId{implements}}
+\def\IMPORT{\builtinId{import}}
+\def\IN{\keyword{in}}
+\def\INT{\keyword{int}}
+\def\INTERFACE{\keyword{interface}}
+\def\IS{\keyword{is}}
+\def\LIBRARY{\builtinId{library}}
+\def\NATIVE{\keyword{native}}
+\def\NEGATE{\keyword{negate}}
+\def\NEW{\keyword{new}}
+\def\NULL{\keyword{null}}
+\def\ON{\keyword{on}}
+\def\OF{\keyword{of}}
+\def\OPERATOR{\builtinId{operator}}
+\def\PART{\builtinId{part}}
+\def\PRIVATE{\keyword{private}}
+\def\RETHROW{\keyword{rethrow}}
+\def\RETURN{\keyword{return}}
+\def\SET{\builtinId{set}}
+\def\SHOW{\keyword{show}}
+\def\SOURCE{\keyword{source}}
+\def\STATIC{\builtinId{static}}
+\def\SUPER{\keyword{super}}
+\def\SWITCH{\keyword{switch}}
+\def\SYNC{\keyword{sync}}
+\def\THIS{\keyword{this}}
+\def\THROW{\keyword{throw}}
+\def\TRUE{\keyword{true}}
+\def\TRY{\keyword{try}}
+\def\TYPEDEF{\builtinId{typedef}}
+\def\THIS{\keyword{this}}
+\def\VAR{\keyword{var}}
+\def\VOID{\keyword{void}}
+\def\WHILE{\keyword{while}}
+\def\WITH{\keyword{with}}
+\def\YIELD{\keyword{yield}}
+\def\TRUE{\keyword{true}}
 
 \newenvironment{Q}[1]{{\bf #1}}
 
@@ -114,7 +94,6 @@
   %\end{verbatim}
 }
 
-
 % ----------------------------------------------------------------------
 % Support for hash valued Location Markers
 
@@ -144,4 +123,3 @@
   \vspace{-\baselineskip}\hspace{0pt}\OriginalLMHash{\raisebox{10ex}{#1}}%
   \label{#1}}
 % ----------------------------------------------------------------------
-
diff --git a/docs/language/dartLangSpec.tex b/docs/language/dartLangSpec.tex
index 5e009e6..4e37d5d 100644
--- a/docs/language/dartLangSpec.tex
+++ b/docs/language/dartLangSpec.tex
@@ -5,6 +5,7 @@
 \usepackage{bnf}
 \usepackage{hyperref}
 \usepackage{lmodern}
+\usepackage[T1]{fontenc}
 \newcommand{\code}[1]{{\sf #1}}
 \title{Dart Programming Language  Specification  \\
 {4th edition draft}\\
@@ -214,7 +215,7 @@
 
 \begin{dartCode}
 \CLASS{} HighlyStrung \{
-  String() $=>$ "?";
+  String() => "?";
 \}
 \end{dartCode}
 
@@ -233,15 +234,15 @@
 
 \LIBRARY{} L2;
 \IMPORT{} `L1.dart';
-foo() =$>$ 42;
-\CLASS{} C \EXTENDS{} S\{ bar() =$>$ foo();\}
+foo() => 42;
+\CLASS{} C \EXTENDS{} S\{ bar() => foo();\}
 \end{dartCode}
 
 \rationale{Now assume a method \code{foo()} is added to \code{S}. }
 
 \begin{dartCode}
 \LIBRARY{} L1;
-\CLASS{} S \{foo() =$>$ 91;\}
+\CLASS{} S \{foo() => 91;\}
 \end{dartCode}
 
 \rationale{
@@ -570,7 +571,7 @@
 }
 
 OR
-\item of the form   \code{=$>$ $e$} which is equivalent to a body of the form \code{\{\RETURN{} $e$;\}} or the form \code{\ASYNC{} =$>$ $e$} which is equivalent to a body of the form \code{\ASYNC{} \{\RETURN{} $e$;\}}. \rationale{The other modifiers do not apply here, because they apply only to generators, discussed below, and generators do not allow the form \code{\RETURN{} $e$}; values are added to the generated stream or iterable using \YIELD{} instead.}
+\item of the form   \code{=> $e$} which is equivalent to a body of the form \code{\{\RETURN{} $e$;\}} or the form \code{\ASYNC{} => $e$} which is equivalent to a body of the form \code{\ASYNC{} \{\RETURN{} $e$;\}}. \rationale{The other modifiers do not apply here, because they apply only to generators, discussed below, and generators do not allow the form \code{\RETURN{} $e$}; values are added to the generated stream or iterable using \YIELD{} instead.}
 
 \end{itemize}
 
@@ -592,9 +593,9 @@
 One could allow modifiers for factories. A factory for \code{Future} could be modified by \ASYNC{}, a factory for \code{Stream} could be modified by \ASYNC* and a factory for \code{Iterable} could be modified by \SYNC*. No other scenario makes sense because the object returned by the factory would be of the wrong type. This situation is very unusual so it is not worth making an exception to the general rule for constructors in order to allow it.
 }
 \LMHash{}
-It is a static warning if the declared return type of a function marked \ASYNC{} is not a supertype of \code{Future$<$\mbox{$T$}$>$} for some type $T$.
-It is a static warning if the declared return type of a function marked \SYNC* is not a supertype of \code{Iterable$<$\mbox{$T$}$>$} for some type $T$.
-It is a static warning if the declared return type of a function marked \ASYNC* is not a supertype of \code{Stream$<$\mbox{$T$}$>$} for some type $T$.
+It is a static warning if the declared return type of a function marked \ASYNC{} is not a supertype of \code{Future<\mbox{$T$}>} for some type $T$.
+It is a static warning if the declared return type of a function marked \SYNC* is not a supertype of \code{Iterable<\mbox{$T$}>} for some type $T$.
+It is a static warning if the declared return type of a function marked \ASYNC* is not a supertype of \code{Stream<\mbox{$T$}>} for some type $T$.
 
 \subsection{Function Declarations}
 \LMLabel{functionDeclarations}
@@ -876,6 +877,7 @@
 \LMHash{}
 A class has constructors,  instance members and static members. The instance members of a class are its instance methods, getters, setters and instance variables. The static members of a class are its static methods, getters, setters and static variables. The members of a class are its static and instance members.
 
+\LMHash{}
 A class has several scopes:
 \begin{itemize}
 \item A {\em type-parameter scope}, which is empty if the class is not generic (\ref{generics}).  The enclosing scope of the type-parameter scope of a class is the enclosing scope of the class declaration.
@@ -884,8 +886,10 @@
 The enclosing scope of a class' instance scope is the class' static scope.
 \end{itemize}
 
+\LMHash{}
 The enclosing scope of an instance member declaration is the instance scope of the class in which it is declared.
 
+\LMHash{}
 The enclosing scope of a static member declaration is the static scope of the class in which it is declared.
 
 
@@ -928,7 +932,7 @@
 \CLASS{} A \{
   \VAR{} i = 0;
   \VAR{} j;
-  f(x) =$>$ 3;
+  f(x) => 3;
 \}
 
 \CLASS{} B \EXTENDS{} A \{
@@ -937,7 +941,7 @@
   //instance getter \& setter
 
   /* compile-time error: static method conflicts with instance method */
-  \STATIC{} f(x) =$>$ 3;
+  \STATIC{} f(x) => 3;
 \}
 \end{dartCode}
 
@@ -993,11 +997,11 @@
 An operator declaration is identified using the built-in identifier (\ref{identifierReference}) \OPERATOR{}.
 
 \LMHash{}
-The following names are allowed for user-defined operators: \code{$<$, $>$, $<$=, $>$=, ==,  -, +, /, \~{}/, *, \%, $|$, \^{}, \&, $<<$, $>>$,  []=, [], \~{}.}
+The following names are allowed for user-defined operators: \code{<, >, <=, >=, ==,  -, +, /, \~{}/, *, \%, $|$, \^{}, \&, $<<$, $>>$,  []=, [], \~{}.}
 
 
 \LMHash{}
-It is a compile-time error if the arity of the user-declared operator \code{[]=} is not 2. It is a compile-time error if the arity of a user-declared operator with one of the names:  \code{ $<$, $>$, $<$=, $>$=, ==, -, +,  \~{}/, /, *, \%, $|$, \^{}, \&, $<<$, $>>$, []} is not 1. It is a compile-time error if the arity of the user-declared operator  \code{-} is not 0 or 1.
+It is a compile-time error if the arity of the user-declared operator \code{[]=} is not 2. It is a compile-time error if the arity of a user-declared operator with one of the names:  \code{ <, >, <=, >=, ==, -, +,  \~{}/, /, *, \%, $|$, \^{}, \&, $<<$, $>>$, []} is not 1. It is a compile-time error if the arity of the user-declared operator  \code{-} is not 0 or 1.
 
 \commentary{
 The \code{-} operator is unique in that two overloaded versions are permitted. If the operator has no arguments, it denotes unary minus. If it has an argument, it denotes binary subtraction.
@@ -1142,12 +1146,12 @@
 
 \begin{dartCode}
  class Base \{
-    int get one =$>$ 1;
+    int get one => 1;
  \}
 
  abstract class Mix \{
     int get one;
-    int get two =$>$ one + one;
+    int get two => one + one;
  \}
 
  class C extends Base with Mix \{ \}
@@ -1234,7 +1238,7 @@
  \end{grammar}
 
 \LMHash{}
-A {\em constructor parameter list} is a parenthesized, comma-separated list of formal constructor parameters. A {\em formal constructor parameter} is either a formal parameter (\ref{formalParameters}) or an initializing formal. An {\em initializing formal} has the form \code{\THIS{}.id}, where \code{id} is the name of an instance variable of the immediately enclosing class.  It is a compile-time error if \code{id} is not an instance variable of the immediately enclosing class. It is a compile-time error if an initializing formal is used by a function other than a non-redirecting generative constructor.
+A {\em constructor parameter list} is a parenthesized, comma-separated list of formal constructor parameters. A {\em formal constructor parameter} is either a formal parameter (\ref{formalParameters}) or an initializing formal. An {\em initializing formal} has the form \code{\THIS{}.$id$}, where $id$ is the name of an instance variable of the immediately enclosing class.  It is a compile-time error if \code{id} is not an instance variable of the immediately enclosing class. It is a compile-time error if an initializing formal is used by a function other than a non-redirecting generative constructor.
 
 \LMHash{}
 If an explicit type is attached to the initializing formal, that is its static type. Otherwise, the type of an initializing formal named \code{id} is $T_{id}$, where $T_{id}$ is the type of the field named \code{id} in the immediately enclosing class. It is a static warning if the static type of \code{id} is not assignable to $T_{id}$.
@@ -1497,25 +1501,25 @@
 
 
 %\begin{dartCode}
-%\CLASS{} W$<$T$>$ \IMPLEMENTS{} A$<$T$>$ { W(w) {...} ...}
-%\CLASS{} X$<$T$>$ \IMPLEMENTS{} A$<$T$>$ { X(x) {...} ...}
-%\CLASS{} Y$<$T$>$ \IMPLEMENTS{} A$<$T$>$ { Y(y) {...} ...}
-%\CLASS{} Z$<$T$>$ \IMPLEMENTS{} A$<$T$>$ { Z(z) {...} ...}
+%\CLASS{} W<T> \IMPLEMENTS{} A<T> { W(w) {...} ...}
+%\CLASS{} X<T> \IMPLEMENTS{} A<T> { X(x) {...} ...}
+%\CLASS{} Y<T> \IMPLEMENTS{} A<T> { Y(y) {...} ...}
+%\CLASS{} Z<T> \IMPLEMENTS{} A<T> { Z(z) {...} ...}
 
 
-%\CLASS{} F$<$T$>$ { // note that F does not implement A
-%  \STATIC{} F$<$T$>$ idw(w) $=>$ \NEW{}  W$<$T$>$(w); // illegal - T not in scope in idw
-%  \FACTORY{} F.idx(x) $=>$ \NEW{} X$<$T$>$(x);
-%  \FACTORY{} F.idy(y) $=>$ \NEW{} Y$<$T$>$(y);
-%  \STATIC{} F idz(z) $=>$ \NEW{}  Z(z); // does not capture the type argument
+%\CLASS{} F<T> { // note that F does not implement A
+%  \STATIC{} F<T> idw(w) => \NEW{}  W<T>(w); // illegal - T not in scope in idw
+%  \FACTORY{} F.idx(x) => \NEW{} X<T>(x);
+%  \FACTORY{} F.idy(y) => \NEW{} Y<T>(y);
+%  \STATIC{} F idz(z) => \NEW{}  Z(z); // does not capture the type argument
 %}
 
-%\CLASS{} A$<$T$>${
-%  \FACTORY{} A.idw(w) $=>$ F$<$T$>$.idw(w);
+%\CLASS{} A<T>{
+%  \FACTORY{} A.idw(w) => F<T>.idw(w);
 %// illegal - cannot pass type parameter to static method
-%  \FACTORY{} A.idx(x) $=> \NEW{} $F$<$T$>$.idx(x); // works, but allocates a gratuitous instance of F
-%  \FACTORY{} A.idy(y) = Y$<$T$>$; // works
-%  \FACTORY{} A.idz(z) $=>$ F.idz(z); // wrong - returns Z$<$Dynamic$>$; no way to pass type argument
+%  \FACTORY{} A.idx(x) $=> \NEW{} $F<T>.idx(x); // works, but allocates a gratuitous instance of F
+%  \FACTORY{} A.idy(y) = Y<T>; // works
+%  \FACTORY{} A.idz(z) => F.idz(z); // wrong - returns Z<Dynamic>; no way to pass type argument
 }
 %\end{dartCode}
 
@@ -1753,7 +1757,7 @@
 class T \{\}
 
 /* Compilation error: Attempt to subclass a type parameter */
-class G$<$T$>$ extends T \{\}
+class G<T> extends T \{\}
 
 \end{dartCode}
 
@@ -2169,8 +2173,8 @@
   \STATIC{} \CONST{} E id$_0$ = \CONST{} E(0);
   $\ldots$
   \STATIC{} \CONST{} E id$_{n-1}$ = const E(n - 1);
-  \STATIC{} \CONST{} List$<$E$>$ values = const $<$E$>$[id$_0 \ldots $ id$_{n-1}$];
-  String toString() =$>$ \{ 0: `E.id$_0$', $\ldots$, n-1: `E.id$_{n-1}$'\}[index]
+  \STATIC{} \CONST{} List<E> values = const <E>[id$_0 \ldots $ id$_{n-1}$];
+  String toString() => \{ 0: `E.id$_0$', $\ldots$, n-1: `E.id$_{n-1}$'\}[index]
 \}
 \end{dartCode}
 
@@ -2210,12 +2214,12 @@
 }
 
 \begin{dartCode}
-\INTERFACE{} Ordered$<$T$>$ \{
-  operator $>$ (T x);
+\INTERFACE{} Ordered<T> \{
+  operator > (T x);
 \}
 
-\CLASS{} Sorter$<$T \EXTENDS{} Ordered$<$T$>>$ \{
-   sort(List$<$T$>$ l) {... l[n] $<$ l[n+1] ...}
+\CLASS{} Sorter<T \EXTENDS{} Ordered<T$>>$ \{
+   sort(List<T> l) {... l[n] < l[n+1] ...}
 \}
 
 \end{dartCode}
@@ -2242,23 +2246,23 @@
 %\rationale {A typical recursive type declaration such as}
 
 %\begin{dartCode}
-%\CLASS{} B$<$S$>$ \{\}
-%\CLASS{} D$<$T$>$ \EXTENDS{} B$<$D$<$T$>>$ \{\}
+%\CLASS{} B<S> \{\}
+%\CLASS{} D<T> \EXTENDS{} B<D<T$>>$ \{\}
 %\end{dartCode}
 
 %\rationale{
-%poses no problem under this rule. The instantiation \cd{D$<$T$>$} has an induced
-%set consisting of: \cd{B$<$D$<$T$>>$, Object, D$<$T$>$, T}. However, the following variant
+%poses no problem under this rule. The instantiation \cd{D<T>} has an induced
+%set consisting of: \cd{B<D<T$>>$, Object, D<T>, T}. However, the following variant
 %}
 
 %\begin{dartCode}
-%\CLASS{} B$<$S$>$ \{\}
-%\CLASS{} D$<$T$>$ \EXTENDS{} B$<$D$<$D$<$T$>>>$ \{\}
+%\CLASS{} B<S> \{\}
+%\CLASS{} D<T> \EXTENDS{} B<D<D<T$>>>$ \{\}
 %\end{dartCode}
 
 %\rationale{
-%is disallowed. Consider again the instantiation \cd{D$<$T$>$}. It leads to the
-%superclass \cd{B$<$D$<$D$<$T$>>>$}, and so adds \cd{D$<$D$< $T$>>$} to the induced set. The latter in turn leads to  \cd{B$<$D$<$D$<$D$<$T$>>>>$} and \cd{D$<$D$<$D$<$T$>>>$}
+%is disallowed. Consider again the instantiation \cd{D<T>}. It leads to the
+%superclass \cd{B<D<D<T$>>>$}, and so adds \cd{D<D$< $T$>>$} to the induced set. The latter in turn leads to  \cd{B<D<D<D<T$>>>>$} and \cd{D<D<D<T$>>>$}
 %and so on ad infinitum.}
 
 %\commentary{
@@ -2457,7 +2461,7 @@
 \item An expression of one of the forms \code{!$e$}, \code{$e_1$ \&\& $e_2$} or \code{$e_1 || e_2$}, where  $e$, $e_1$ and $e_2$ are constant expressions that evaluate to a boolean value.
 \item An expression of one of the forms \~{}$e$, $e_1$ \^{} $e_2$, \code{$e_1$ \& $e_2$}, $e_1 | e_2$, $e_1 >> e_2$ or $e_1 <<  e_2$, where  $e$, $e_1$ and $e_2$ are constant expressions that evaluate to an integer value  or to \NULL{}.
 \item An expression of the form \code{$e_1 + e_2$} where $e_1$ and $e_2$ are constant expressions that evaluate to a numeric or string value or to \NULL{}.
-\item An expression of one of the forms \code{$-e$}, \code{$e_1$ - $e_2$}, \code{$e_1$ * $e_2$}, \code{$e_1$ / $e_2$,} \code{$e_1$ \~{}/ $e_2$},  \code{$e_1  >  e_2$}, \code{$e_1  <  e_2$}, \code{$e_1$ $>$= $e_2$}, \code{$e_1$ $<$= $e_2$} or \code{$e_1$ \% $e_2$},  where $e$, $e_1$ and $e_2$ are constant expressions that evaluate to a numeric value  or to \NULL{}.
+\item An expression of one of the forms \code{$-e$}, \code{$e_1$ - $e_2$}, \code{$e_1$ * $e_2$}, \code{$e_1$ / $e_2$,} \code{$e_1$ \~{}/ $e_2$},  \code{$e_1  >  e_2$}, \code{$e_1  <  e_2$}, \code{$e_1$ >= $e_2$}, \code{$e_1$ <= $e_2$} or \code{$e_1$ \% $e_2$},  where $e$, $e_1$ and $e_2$ are constant expressions that evaluate to a numeric value  or to \NULL{}.
 \item An expression of the form \code{$e_1$?$e_2$:$e3$} where $e_1$, $e_2$ and $e_3$ are constant expressions and $e_1$ evaluates to a boolean value.
 \item An expression of the form \code{$e_1 ?? e_2$} where $e_1$ and $e_2$ are constant expressions.
 \item An expression of the form \code{$e$.length} where $e$ is a constant expression that evaluates to a string value.
@@ -2880,10 +2884,10 @@
 \end{grammar}
 
 \LMHash{}
-A symbol literal \code{\#id} where \code{id} does not begin with an underscore ('\code{\_}')  is equivalent to the expression \code{\CONST{} Symbol('id')}.
+A symbol literal \code{\#$id$} where $id$ does not begin with an underscore ('\code{\_}')  is equivalent to the expression \code{\CONST{} Symbol('$id$')}.
 
 \LMHash{}
-A symbol literal \code{\#\_id} evaluates to the object that would be returned by the call \code{MirrorSystem.getSymbol("\_id", libraryMirror)} where \code{libraryMirror} is an instance of the class \code{LibraryMirror} defined in the library \code{dart:mirrors}, reflecting the current library.
+A symbol literal \code{\#\_$id$} evaluates to the object that would be returned by the call \code{MirrorSystem.getSymbol("\_$id$", \metavar{libraryMirror})} where \metavar{libraryMirror} is an instance of the class \code{LibraryMirror} defined in the library \code{dart:mirrors}, reflecting the current library.
 
 \rationale{
 One may well ask what is the motivation for introducing literal symbols? In some languages, symbols are canonicalized whereas strings are not. However literal strings are already canonicalized in Dart.  Symbols are slightly easier to type compared to strings and their use can become strangely addictive, but this is not nearly sufficient justification for adding a literal form to the language. The primary motivation is related to the use of reflection and a web specific practice known as minification.
@@ -3150,7 +3154,7 @@
 
 The  exception to that would be a type $X$ that extended or implemented \code{Future}. In that case, only one unwrapping takes place. As an example of why this is done, consider
 
-\cd{\CLASS{} C$<$T$>$  \IMPLEMENTS{}  Future$<$C$<$C$<$T$>>>$ \ldots }
+\cd{\CLASS{} C<T>  \IMPLEMENTS{}  Future<C<C<T$>>>$ \ldots }
 
 Here, a naive definition of $flatten$ diverges; there is not even a fixed point. A more sophisticated definition of $flatten$ is possible, but the existing rule deals with most realistic examples while remaining relatively simple to understand.
 
@@ -3509,7 +3513,7 @@
  \CONST{} IntPair(\THIS{}.x, \THIS{}.y);
  \FINAL{} int x;
  \FINAL{} int y;
- \OPERATOR *(v) $=>$ \NEW{} IntPair(x*v, y*v);
+ \OPERATOR *(v) => \NEW{} IntPair(x*v, y*v);
 \}
 
 \CONST{} A(\CONST{} IntPair(1,2)); // compile-time error: illegal in a subtler way
@@ -3821,36 +3825,41 @@
 An ordinary method invocation can be {\em conditional} or {\em unconditional}.
 
 \LMHash{}
-Evaluation of a {\em conditional ordinary method invocation} $e$ of the form
+Evaluation of a {\em conditional ordinary method invocation} $i$ of the form
 
 \LMHash{}
-$o?.m(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$
+$e?.m(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$
 
 \LMHash{}
-is equivalent to the evaluation of the expression
+proceeds as follows:
 
 \LMHash{}
-$((x) => x == \NULL ? \NULL : x.m(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k}))(o)$.
-
-unless $o$ is  a type literal, in which case it is equivalent to $o.m(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$.
+If $e$ is a type literal, $i$ is equivalent to \code{$e$.$m$($a_1$, \ldots , $a_n$, $x_{n+1}$: $a_{n+1}$, \ldots , $x_{n+k}$: $a_{n+k}$)}.
 
 \LMHash{}
-The static type of $e$ is the same as the static type of $o.m(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$. Exactly the same static warnings that would be caused by $o.m(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$ are also generated in the case of $o?.m(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$.
+Otherwise, evaluate $e$ to an object $o$.
+If $o$ is the null value, $i$ evaluates to the null value.
+Otherwise let $v$ be a fresh variable bound to $o$ and evaluate
+\code{$v$.$m$($a_1$, $\ldots$ , $a_n$, $x_{n+1}$: $a_{n+1}$, $\ldots$ , $x_{n+k}$: $a_{n+k}$))} to a value $r$, and then $e$ evaluates to $r$.
+
+
+\LMHash{}
+The static type of $i$ is the same as the static type of $e.m(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$. Exactly the same static warnings that would be caused by $e.m(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$ are also generated in the case of $e?.m(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$.
 
 \LMHash{}
 An {\em unconditional ordinary method invocation} $i$ has the form
 
-$o.m(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$.
+$e.m(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$.
 
 \LMHash{}
 Evaluation of an unconditional ordinary method invocation $i$ of the form
 
-$o.m(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$
+$e.m(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$
 
 proceeds as follows:
 
 \LMHash{}
-First, the expression $o$ is evaluated to a value $v_o$. Next, the argument list $(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$ is evaluated yielding actual argument objects $o_1, \ldots , o_{n+k}$. Let $f$ be the result of looking up (\ref{methodLookup}) method $m$  in $v_o$ with respect to the current library $L$.
+First, the expression $e$ is evaluated to a value $o$. Next, the argument list $(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$ is evaluated yielding actual argument objects $o_1, \ldots , o_{n+k}$. Let $f$ be the result of looking up (\ref{methodLookup}) method $m$  in $o$ with respect to the current library $L$.
 
 \LMHash{}
 Let $p_1 \ldots p_h$ be the required parameters of $f$,  let $p_1 \ldots p_m$ be the positional parameters of $f$ and let $p_{h+1}, \ldots, p_{h+l}$ be the optional parameters declared by $f$.
@@ -3860,15 +3869,15 @@
 }
 
 \LMHash{}
-If  $n < h$, or $n > m$, the method lookup has failed. Furthermore, each $x_i, n+1 \le i \le n+k$,  must have a corresponding named parameter in the set $\{p_{m+1}, \ldots, p_{h+l}\}$ or the method lookup also fails.  If $v_o$ is an instance of \code{Type} but $o$ is not a constant type literal, then if $m$ is a method that forwards (\ref{functionDeclarations}) to a static method, method lookup fails. Otherwise method lookup has succeeded.
+If  $n < h$, or $n > m$, the method lookup has failed. Furthermore, each $x_i, n+1 \le i \le n+k$,  must have a corresponding named parameter in the set $\{p_{m+1}, \ldots, p_{h+l}\}$ or the method lookup also fails.  If $o$ is an instance of \code{Type} but $e$ is not a constant type literal, then if $m$ is a method that forwards (\ref{functionDeclarations}) to a static method, method lookup fails. Otherwise method lookup has succeeded.
 
 \LMHash{}
-If the method lookup succeeded, the body of $f$ is executed with respect to the bindings that resulted from the evaluation of the argument list, and with \THIS{} bound to $v_o$. The value of $i$ is the value returned after $f$ is executed.
+If the method lookup succeeded, the body of $f$ is executed with respect to the bindings that resulted from the evaluation of the argument list, and with \THIS{} bound to $o$. The value of $i$ is the value returned after $f$ is executed.
 
 \LMHash{}
-If the method lookup has failed, then let $g$ be the result of looking up getter (\ref{getterAndSetterLookup}) $m$ in $v_o$ with respect to $L$.
-If $v_o$ is an instance of \code{Type} but $o$ is not a constant type literal, then if $g$ is a getter that forwards to a static getter, getter lookup fails.
-If the getter lookup succeeded, let $v_g$ be the value of the getter invocation $o.m$. Then the value of $i$ is the result of invoking
+If the method lookup has failed, then let $g$ be the result of looking up getter (\ref{getterAndSetterLookup}) $m$ in $o$ with respect to $L$.
+If $o$ is an instance of \code{Type} but $e$ is not a constant type literal, then if $g$ is a getter that forwards to a static getter, getter lookup fails.
+If the getter lookup succeeded, let $v_g$ be the value of the getter invocation $e.m$. Then the value of $i$ is the result of invoking
 the static method \code{Function.apply()} with arguments $v.g, [o_1, \ldots , o_n], \{\#x_{n+1}: o_{n+1}, \ldots , \#x_{n+k}: o_{n+k}\}$.
 
 \LMHash{}
@@ -3896,7 +3905,7 @@
 
 \begin{code}
 \CLASS{} Perverse \{
-    noSuchMethod(x,y) =$>$ x + y;
+    noSuchMethod(x,y) => x + y;
 \}
 
 \NEW{} Perverse.unknownMethod();
@@ -3925,8 +3934,8 @@
 \LMLabel{cascadedInvocations}
 
 \LMHash{}
-A {\em cascaded method invocation} has the form {\em e..suffix}
-where $e$ is an expression and {\em suffix} is a sequence of operator, method, getter or setter invocations.
+A {\em cascaded method invocation} has the form \code{$e$..\metavar{suffix}}
+where $e$ is an expression and \metavar{suffix} is a sequence of operator, method, getter or setter invocations.
 
 \begin{grammar}
 {\bf cascadeSection:}
@@ -3939,10 +3948,15 @@
 \end{grammar}
 
 \LMHash{}
-A cascaded method invocation expression of the form {\em e..suffix} is equivalent to the expression \code{(t)\{t.{\em suffix}; \RETURN{} t;\}($e$)}.
+Evaluation of a cascaded method invocation expression $e$ of the form \code{$e$..\metavar{suffix}} proceeds as follows:
+
+Evaluate $e$ to an object $o$.
+Let $t$ be a fresh variable bound to $o$.
+Evaluate \code{$t$.\metavar{suffix}} to an object.
+Then $e$ evaluates to $o$.
 
 \rationale{
-With the introduction of null-aware conditional assignable expressions (\ref{assignableExpressions}), it would make sense to extend cascades with a null-aware conditional form as well. One might define {\em e?..suffix}  to be equivalent to the expression \code{(t)\{t?.{\em suffix}; \RETURN{} t;\}($e$)}.
+With the introduction of null-aware conditional assignable expressions (\ref{assignableExpressions}), it would make sense to extend cascades with a null-aware conditional form as well. One might define \code{$e$?..\metavar{suffix}} to be equivalent to the expression \code{$t$ == null ? null : $t$.\metavar{suffix}} where $t$ is a fresh variable bound to the value of $e$.
 
 The present specification has not added such a construct, in the interests of simplicity and rapid language evolution. However, Dart implementations may experiment with such constructs, as noted in section \ref{ecmaConformance}.
 }
@@ -4029,10 +4043,22 @@
 
 Property extraction can be either {\em conditional} or {\em unconditional}.
 
-Evaluation of a {\em conditional property extraction expression} $e$ of the form $e_1?.id$  is equivalent to the evaluation of the expression  $((x) => x == \NULL ? \NULL : x.id)(e_1)$.
-unless $e_1$ is  a type literal, in which case it is equivalent to $e_1.m$.
+\LMHash{}
+Evaluation of a {\em conditional property extraction expression} $e$
+of the form \code{$e_1$?.\metavar{id}} proceeds as follows:
 
-The static type of $e$ is the same as the static type of $e_1.id$. Let $T$ be the static type of $e_1$ and let $y$ be a fresh variable of type $T$. Exactly the same static warnings that would be caused by $y.id$ are also generated in the case of $e_1?.id$.
+\LMHash{}
+If $e_1$ is a type literal, $e$ is equivalent to \code{$e_1$.$m$}.
+
+\LMHash{}
+Otherwise evaluate $e_1$ to an object $o$.
+If $o$ is the null value, $e$ evaluates to the null value.
+Otherwise let $x$ be a fresh variable bound to $o$
+and evaluate \code{$x$.\metavar{id}} to a value $r$.
+Then $e$ evaluates to $r$.
+
+
+The static type of $e$ is the same as the static type of \code{$e_1$.\metavar{id}}. Let $T$ be the static type of $e_1$ and let $y$ be a fresh variable of type $T$. Exactly the same static warnings that would be caused by \code{$y$.\metavar{id}} are also generated in the case of \code{$e_1$?.\metavar{id}}.
 
 \LMHash{}
 Unconditional property extraction has one of two syntactic forms: $e.m$ (\ref{getterAccessAndMethodExtraction}) or $\SUPER.m$ (\ref{superGetterAccessAndMethodClosurization}), where $e$ is an expression and $m$ is an identifier.
@@ -4145,7 +4171,7 @@
 Let $o$ be an object, and let $u$ be a fresh final variable bound to $o$.
 The {\em closurization of method $f$ on object $o$} is defined to be equivalent to:
 \begin{itemize}
-%\item $(a) \{\RETURN{}$ $u$ $op$ $a;$\} if $f$ is named $op$ and $op$ is one of  \code{$<$, $>$, $<$=, $>$=, ==,  -, +, /, \~{}/, *, \%, $|$, \^{}, \&, $<<$, $>>$} (this precludes closurization of unary -).
+%\item $(a) \{\RETURN{}$ $u$ $op$ $a;$\} if $f$ is named $op$ and $op$ is one of  \code{<, >, <=, >=, ==,  -, +, /, \~{}/, *, \%, $|$, \^{}, \&, $<<$, $>>$} (this precludes closurization of unary -).
 %\item $() \{\RETURN{}$ \~{} $u;$\} if $f$ is named \~{}.
 %\item $(a) \{\RETURN{}$ $u[a];$\} if $f$ is named $[]$.
 %\item $(a, b) \{\RETURN{}$ $u[a] = b;$\} if $f$ is named $[]=$.
@@ -4163,7 +4189,7 @@
 \}
 \end{dartCode}
 if $f$ is named $m$ and has required parameters $r_1, \ldots, r_n$, and optional positional parameters $p_1, \ldots, p_k$ with defaults $d_1, \ldots, d_k$.
-%\end{itemize}
+\end{itemize}
 
 \LMHash{}
 Except that iff  \code{identical($o_1, o_2$)}  then \cd{$o_1.m$ == $o_2.m$}.
@@ -4186,7 +4212,7 @@
 
 \LMHash{}
 \begin{itemize}
-%\item $(a) \{\RETURN{}$ \SUPER{} $op$ $a;$\} if $f$ is named $op$ and $op$ is one of  \code{$<$, $>$, $<$=, $>$=, ==,  -, +, /, \~{}/, *, \%, $|$, \^{}, \&, $<<$, $>>$}.
+%\item $(a) \{\RETURN{}$ \SUPER{} $op$ $a;$\} if $f$ is named $op$ and $op$ is one of  \code{<, >, <=, >=, ==,  -, +, /, \~{}/, *, \%, $|$, \^{}, \&, $<<$, $>>$}.
 %\item $() \{\RETURN{}$ \~{}\SUPER;\} if $f$ is named \~{}.
 %\item $(a) \{\RETURN{}$ $\SUPER[a];$\} if $f$ is named $[]$.
 %\item $(a, b) \{\RETURN{}$ $\SUPER[a] = b;$\} if $f$ is named $[]=$.
@@ -4263,12 +4289,24 @@
 It is a static type warning if the static type of $e$ may not be assigned to the static type of $v$. The static type of the expression $v$ \code{=} $e$ is the static type of $e$.
 
 \LMHash{}
-Evaluation of an assignment $a$ of the form $e_1?.v$ \code{=} $e_2$ is equivalent to the evaluation of the expression $((x) => x == \NULL? \NULL: x.v = e_2)(e_1)$
- unless $e_1$ is  a type literal, in which case it is equivalent to $e_1.v$ \code{=} $e_2$.
-. The static type of $a$ is the static type of $e_2$. Let $T$ be the static type of $e_1$ and let $y$ be a fresh variable of type $T$. Exactly the same static warnings that would be caused by $y.v = e_2$ are also generated in the case of $e_1?.v$ \code{=} $e_2$.
+Evaluation of an assignment $a$ of the form \code{$e_1$?.$v$ = $e_2$}
+proceeds as follows:
+
+\LMHash
+If $e_1$ is a type literal, $a$ is equivalent to \code{$e_1$.$v$ = $e_2$}.
 
 \LMHash{}
-Evaluation of an assignment of the form $e_1.v$ \code{=} $e_2$ proceeds as follows:
+Otherwise evaluate $e_1$ to an object $o$.
+If $o$ is the null value, $a$ evaluates to the null value.
+Otherwise let $x$ be a fresh variable bound to $o$
+and evaluate \code{$x$.$v$ = $e_2$} to an object $r$.
+Then $a$ evaluates to $r$.
+
+\LMHash{}
+The static type of $a$ is the static type of $e_2$. Let $T$ be the static type of $e_1$ and let $y$ be a fresh variable of type $T$. Exactly the same static warnings that would be caused by \code{$y$.$v$ = $e_2$} are also generated in the case of \code{$e_1$?.$v$ = $e_2$}.
+
+\LMHash{}
+Evaluation of an assignment of the form \code{$e_1$.$v$ = $e_2$} proceeds as follows:
 
 \LMHash{}
 The expression $e_1$ is evaluated to an object $o_1$. Then, the expression $e_2$  is evaluated to an object $o_2$. Then, the setter $v=$ is looked up (\ref{getterAndSetterLookup}) in $o_1$ with respect to the current library.  If $o_1$ is an instance of \code{Type} but $e_1$ is not a constant type literal, then if $v=$ is a setter that forwards (\ref{functionDeclarations}) to a static setter, setter lookup fails. Otherwise, the body  of $v=$ is executed with its formal parameter bound to $o_2$ and \THIS{} bound to $o_1$.
@@ -4348,16 +4386,20 @@
 \LMHash{}
 It is a static type warning if the static type of $e$ may not be assigned to the static type of the formal parameter of the setter $v=$.   The static type of the expression $\SUPER.v$ \code{=} $e$ is the static type of $e$.
 
-
-
-
-
+\LMHash{}
+Evaluation of an assignment $e$ of the form \code{$e_1$[$e_2$] = $e_3$}
+proceeds as follows:
 
 \LMHash{}
-Evaluation of an assignment of the form $e_1[e_2]$ \code{=} $e_3$ is equivalent to the evaluation of the expression \code{(a, i, e)\{a.[]=(i, e); \RETURN{} e; \} ($e_1, e_2, e_3$)}.  The static type of the expression $e_1[e_2]$ \code{=} $e_3$ is the static type of $e_3$.
+Evaluate $e_1$ to an object $a$, then evaluate $e_2$ to an object $i$, and finally evaluate $e_3$ to an object $v$.
+Call the method \code{[]=} on $a$ with $i$ as first argument and $v$ as second argument.
+Then $e$ evaluates to $v$.
 
 \LMHash{}
-An assignment of the form $\SUPER[e_1]$ \code{=} $e_2$ is equivalent to the expression $\SUPER.[e_1]$ \code{=} $e_2$.  The static type of the expression $\SUPER[e_1]$ \code{=} $e_2$ is the static type of $e_2$.
+The static type of the expression \code{$e_1$[$e_2$] = $e_3$} is the static type of $e_3$.
+
+\LMHash{}
+An assignment of the form \code{\SUPER[$e_1$] = $e_2$} is equivalent to the expression \code{\SUPER.[$e_1$] = $e_2$}.  The static type of the expression \code{\SUPER[$e_1$] = $e_2$} is the static type of $e_2$.
 
 
 % Should we add: It is a dynamic error if $e_1$ evaluates to an  constant list or map.
@@ -4374,27 +4416,71 @@
 \LMLabel{compoundAssignment}
 
 \LMHash{}
-Evaluation of a compound assignment of the form $v$ {\em ??=} $e$ is equivalent to the evaluation of the expression  $((x) => x == \NULL{}$ ?  $v=e : x)(v)$ where $x$ is a fresh variable that is not used in $e$.
+Evaluation of a compound assignment $a$ of the form \code{$v$ ??= $e$}
+proceeds as follows:
+
+Evaluate $v$ to an object $o$.
+If $o$ is not the null value, $a$ evaluates to $o$.
+Otherwise evaluate \code{$v$ = $e$} to a value $r$,
+and then $a$ evaluates to $r$.
 
 \LMHash{}
-Evaluation of a compound assignment of the form $C.v$ {\em ??=} $e$, where $C$ is a type literal, is equivalent to the evaluation of the expression  $((x) => x == \NULL{}$?  $C.v=e: x)(C.v)$ where $x$ is a fresh variable that is not used in $e$.
+Evaluation of a compound assignment, $a$ of the form \code{$C$.$v$ ??= $e$}, where $C$ is a type literal, proceeds as follow:
+
+Evaluate \code{$C$.$v$} to an object $o$.
+If $o$ is not the null value, $a$ evaluates to $o$.
+Otherwise evaluate \code{$C$.$v$ = $e$} to a value $r$,
+and then $a$ evaluates to $r$.
 
 \commentary {
 The two rules above also apply when the variable v or the type C is prefixed.
 }
 
 \LMHash{}
-Evaluation of a compound assignment of the form $e_1.v$ {\em ??=} $e_2$ is equivalent to the evaluation of the expression  $((x) =>((y) => y == \NULL{}$ ? $ x.v = e_2: y)(x.v))(e_1)$ where $x$ and $y$ are distinct fresh variables that are not used in $e_2$.
+Evaluation of a compound assignment $a$ of the form \code{$e_1$.$v$ ??= $e_2$}
+proceeds as follows:
 
 \LMHash{}
-Evaluation of a compound assignment of the form  $e_1[e_2]$  {\em ??=} $e_3$ is equivalent to the evaluation of the expression
-$((a, i) => ((x) => x == \NULL{}$ ?  $a[i] = e_3: x)(a[i]))(e_1, e_2)$ where $x$, $a$ and $i$ are distinct fresh variables that are not used in $e_3$.
+Evaluate $e_1$ to an object $u$.
+Let $x$ be a fresh variable bound to $u$.
+Evalute \code{$x$.$v$} to an object $o$.
+If $o$ is not the null value, $a$ evaluates to $o$.
+Otherwise evaluate \code{$x$.$v$ = $e_2$} to an object $r$,
+and then $a$ evaluates to $r$.
 
 \LMHash{}
-Evaluation of a compound assignment of the form $\SUPER.v$  {\em ??=} $e$ is equivalent to the evaluation of the expression  $((x) => x == \NULL{}$ ? $\SUPER.v = e: x)(\SUPER.v)$ where $x$ is a fresh variable that is not used in $e$.
+Evaluation of a compound assignment $a$ of the form \code{$e_1$[$e_2$] ??= $e_3$}
+proceeds as follows:
 
 \LMHash{}
-Evaluation of a compound assignment of the form $e_1?.v$  {\em ??=} $e_2$ is equivalent to the evaluation of the expression \code{((x) $=>$ x == \NULL{} ?  \NULL: $x.v ??=  e_2$)($e_1$)} where $x$ is a variable that is not used in $e_2$.
+Evaluate $e_1$ to an object $u$ and then evaluate $e_2$ to an object $i$.
+Call the \code{[]} method on $u$ with argument $i$, and let $o$ be the returned value.
+If $o$ is not the null value, $a$ evaluates to $o$.
+Otherwise evaluate $e_3$ to an object $v$
+and then call the \code{[]=} method on $u$ with $i$ as first argument and $v$ as second argument.
+Then $a$ evaluates to $v$.
+
+\LMHash{}
+Evaluation of a compound assignment $a$ of the form \code{\SUPER.$v$ ??= $e$}
+proceeds as follows:
+
+\LMHash{}
+Evaluate \code{\SUPER.$v$} to an object $o$.
+If $o$ is not the null value then $a$ evaluats to $o$.
+Otherwise evaluate \code{\SUPER.$v$ = $e$} to an object $r$,
+and then $a$ evaluates to $r$.
+
+\LMHash{}
+Evaluation of a compound assignment $a$ of the form \code{$e_1$?.$v$ ??= $e_2$}
+proceeds as follows:
+
+\LMHash{}
+Evaluate $e_1$ to an object $u$ and let $x$ be a fresh variable bound to $u$.
+Evaluate \code{$x$.$v$} to an object $o$.
+If $o$ is not the null value then $a$ evaluates to $o$.
+Otherwise evaluate \code{$x$.$v$ = $e_2$} to an object $r$,
+and then $a$ evaluates to $r$.
+
 % But what about C?.v ??= e
 
 \LMHash{}
@@ -4403,7 +4489,6 @@
 \LMHash{}
 The static type of a compound assignment of the form $v$ {\em ??=} $e$ is the least upper bound of the static type of $v$ and the static type of $e$.  Exactly the same static warnings that would be caused by $v = e$ are also generated in the case of $v$ {\em ??=} $e$.
 
-
 \LMHash{}
 The static type of a compound assignment of the form  $C.v$ {\em ??=} $e$  is the least upper bound of the static type of $C.v$ and the static type of $e$.  Exactly the same static warnings that would be caused by $C.v = e$ are also generated in the case of $C.v$ {\em ??=} $e$.
 
@@ -4417,11 +4502,33 @@
 The static type of a compound assignment of the form $\SUPER.v$  {\em ??=} $e$  is the least upper bound of the static type of $\SUPER.v$ and the static type of $e$. Exactly the same static warnings that would be caused by $\SUPER.v = e$ are also generated in the case of $\SUPER.v$  {\em ??=} $e$.
 
 \LMHash{}
-For any other valid operator $op$, a compound assignment of the form $v$ $op\code{=} e$ is equivalent to $v \code{=} v$ $op$ $e$. A compound assignment of the form $C.v$ $op \code{=} e$ is equivalent to $C.v \code{=} C.v$ $op$ $e$. A compound assignment of the form $e_1.v$ $op = e_2$ is equivalent to \code{((x) $=>$ x.v = x.v $op$ $e_2$)($e_1$)} where $x$ is a variable that is not used in $e_2$. A compound assignment of the form  $e_1[e_2]$ $op\code{=} e_3$ is equivalent to
-\code{((a, i) $=>$ a[i] = a[i] $op$ $e_3$)($e_1, e_2$)} where $a$ and $i$ are a variables that are not used in $e_3$.
+For any other valid operator $op$, a compound assignment of the form \code{$v$ $op$= $e$} is equivalent to \code{$v$ = $v$ $op$ $e$}. A compound assignment of the form \code{$C$.$v$ $op$= $e$} is equivalent to \code{$C$.$v$ = $C$.$v$ $op$ $e$}.
 
 \LMHash{}
-Evaluation of a compound assignment of the form $e_1?.v$ $op = e_2$ is equivalent to \code{((x) $=>$ x?.v = x.v $op$ $e_2$)($e_1$)} where $x$ is a variable that is not used in $e_2$. The static type of $e_1?.v$ $op = e_2$ is the static type of $e_1.v$ $op$ $e_2$. Exactly the same static warnings that would be caused by $e_1.v$ $op = e_2$ are also generated in the case of $e_1?.v$ $op = e_2$.
+Evaluation of a compound assignment $a$ of the form \code{$e_1$.$v$ $op$= $e_2$} proceeds as follows:
+Evaluate $e_1$ to an object $u$ and let $x$ be a fresh variable bound to $u$.
+Evaluate \code{$x$.$v$ = $x$.$v$ $op$ $e_2$} to an object $r$
+and then $a$ evaluates to $r$.
+
+\LMHash{}
+Evaluation of s compound assignment $a$ of the form \code{$e_1$[$e_2$] $op$= $e_3$} proceeds as follows:
+Evaluate $e_1$ to an object $u$ and evaluate $e_2$ to an object $v$.
+Let $a$ and $i$ be fresh variables bound to $u$ and $v$ respectively.
+Evaluate \code{$a$[$i$] = $a$[$i$] $op$ $e_3$} to an object $r$,
+and then $a$ evaluates to $r$.
+
+\LMHash{}
+Evaluation of a compound assignment $a$ of the form \code{$e_1$?.$v$ $op$ = $e_2$} proceeds as follows:
+
+\LMHash{}
+Evaluate $e_1$ to an object $u$.
+If $u$ is the null value, then $a$ evaluates to the null value.
+Otherwise let $x$ be a fresh variable bound to $u$.
+Evaluate \code{$x$.$v$ $op$= $e_2$} to an object $r$.
+Then $a$ evaluates to $r$.
+
+\LMHash{}
+The static type of \code{$e_1$?.$v$ $op$= $e_2$} is the static type of \code{$e_1$.$v$ $op$ $e_2$}. Exactly the same static warnings that would be caused by \code{$e_1$.$v$ $op$= $e_2$} are also generated in the case of \code{$e_1$?.$v$ $op$= $e_2$}.
 
 \LMHash{}
 A compound assignment of the form $C?.v$ $op = e_2$ is equivalent to the expression
@@ -4489,7 +4596,17 @@
 \end{grammar}
 
 \LMHash{}
-Evaluation of an if-null expression $e$ of the form $e_1??e_2 $ is equivalent to the evaluation of the expression $((x) => x == \NULL? e_2: x)(e_1)$. The static type of $e$ is least upper bound (\ref{leastUpperBounds}) of the static type of $e_1$ and the static type of $e_2$.
+Evaluation of an if-null expression $e$ of the form \code{$e_1$ ?? $e_2$}
+proceeds as follows:
+
+\LMHash{}
+Evaluate $e_1$ to an object $o$.
+If $o$ is not the null value, then $e$ evaluates to $o$.
+Otherwise evaluate $e_2$ to an object $r$,
+and then $e$ evaluates to $r$.
+
+\LMHash{}
+The static type of $e$ is the least upper bound (\ref{leastUpperBounds}) of the static type of $e_1$ and the static type of $e_2$.
 
 
 \subsection{ Logical Boolean Expressions}
@@ -4860,7 +4977,12 @@
  A {\em postfix expression} is either a primary expression, a function, method or getter invocation, or an invocation of a postfix operator on an expression $e$.
 
 \LMHash{}
-Execution of a postfix expression of the form \code{$v$++}, where $v$ is an identifier, is equivalent to executing \code{()\{\VAR{} r = $v$; $v$ = r + 1; \RETURN{} r\}()}.
+Evaluation of a postfix expression $e$ of the form \code{$v$++}, where $v$ is an identifier, proceeds as follows:
+
+\LMHash{}
+Evaluate $v$ to an object $r$ and let $y$ be a fresh variable bound to $r$.
+Evaluate \code{$v$ = $y$ + 1}.
+Then $e$ evaluates to $r$.
 
 \LMHash{}
 The static type of such an expression is the static type of $v$.
@@ -4870,86 +4992,140 @@
 }
 
 \LMHash{}
-Execution of a postfix expression of the form \code{$C.v$ ++} is equivalent to executing
-
-\code{()\{\VAR{} r = $C.v$; $C.v$ = r + 1; \RETURN{} r\}()}.
+Evaluation of a postfix expression $e$ of the form \code{$C$.$v$++}
+proceeds as follows:
 
 \LMHash{}
-The static type of such an expression is the static type of $C.v$.
+Evaluate \code{$C$.$v$} to a value $r$
+and let $y$ be a fresh variable bound to $r$.
+Evaluate \code{$C$.$v$ = $y$ + 1}.
+Then $e$ evaluates to $r$.
+
+\LMHash{}
+The static type of such an expression is the static type of \code{$C$.$v$}.
 
 
 \LMHash{}
-Execution of a postfix expression of the form \code{$e_1.v$++} is equivalent to executing
-
-\code{(x)\{\VAR{} r = x.v; x.v = r + 1; \RETURN{} r\}($e_1$)}.
+Evaluation of a postfix expression $e$ of the form \code{$e_1$.$v$++}
+proceeds as follows:
 
 \LMHash{}
-The static type of such an expression is the static type of $e_1.v$.
+Evaluate $e_1$ to an object $u$ and let $x$ be a fresh variable bound to $u$.
+Evaluate \code{$x$.$v$} to a value $r$
+and let $y$ be a fresh variable bound to $r$.
+Evaluate \code{$x$.$v$ = $y$ + 1}.
+Then $e$ evaluates to $r$.
+
+\LMHash{}
+The static type of such an expression is the static type of \code{$e_1$.$v$}.
 
 
 \LMHash{}
-Execution of a postfix expression of the form \code{$e_1[e_2]$++},  is equivalent to executing
-
-\code{(a, i)\{\VAR{} r = a[i]; a[i] = r + 1; \RETURN{} r\}($e_1$, $e_2$)}.
+Evaluation of a postfix expression $e$ of the form \code{$e_1$[$e_2$]++}
+proceeds as follows:
 
 \LMHash{}
-The static type of such an expression is the static type of $e_1[e_2]$.
+Evaluate $e_1$ to an object $u$ and $e_2$ to an object $v$.
+Let $a$ and $i$ be fresh variables bound to $u$ and $v$ respectively.
+Evaluate \code{$a$[$i$]} to an object $r$
+and let $y$ be a fresh variable bound to $r$.
+Evaluate \code{$a$[$i$] = $y$ + 1}.
+Then $e$ evaluates to $r$.
+
+\LMHash{}
+The static type of such an expression is the static type of \code{$e_1$[$e_2$]}.
 
 
 \LMHash{}
-Execution of a postfix expression of the form \code{$v$-{}-}, where $v$ is an identifier, is equivalent to executing
+Evaluation of a postfix expression $e$ of the form \code{$v$-{}-}, where $v$ is an identifier, proceeds as follows:
 
-\code{()\{\VAR{} r = $v$; $v$ = r - 1; \RETURN{} r\}()}.
+\LMHash{}
+Evaluate the expression $v$ to an object $r$
+and let $y$ be a fresh variable bound to $r$.
+Evaluate \code{$v$ = $y$ - 1}.
+Then $e$ evaluates to $r$.
 
 \LMHash{}
 The static type of such an expression is the static type of $v$.
 
 
 \LMHash{}
-Execution of a postfix expression of the form \code{$C.v$-{}-} is equivalent to executing
-
-\code{()\{\VAR{} r = $C.v$; $C.v$ = r - 1; \RETURN{} r\}()}.
+Evaluation of a postfix expression $e$ of the form \code{$C$.$v$-{}-}
+proceeds as follows:
 
 \LMHash{}
-The static type of such an expression is the static type of $C.v$.
+Evaluate \code{$C$.$v$} to a value $r$
+and let $y$ be a fresh variable bound to $r$.
+Evaluate \code{$C$.$v$ = $y$ - 1}.
+Then $e$ evaluates to $r$.
+
+\LMHash{}
+The static type of such an expression is the static type of \code{$C$.$v$}.
 
 
 \LMHash{}
-Execution of a postfix expression of the form \code{$e_1.v$-{}-} is equivalent to executing
-
-\code{(x)\{\VAR{} r = x.v; x.v = r - 1; \RETURN{} r\}($e_1$)}.
+Evaluation of a postfix expression of the form \code{$e_1$.$v$-{}-}
+proceeds as follows:
 
 \LMHash{}
-The static type of such an expression is the static type of $e_1.v$.
+Evaluate $e_1$ to an object $u$ and let $x$ be a fresh variable bound to $u$.
+Evaluate \code{$x$.$v$} to a value $r$
+and let $y$ be a fresh variable bound to $r$.
+Evaluate \code{$x$.$v$ = $y$ - 1}.
+Then $e$ evaluates to $r$.
 
 
 \LMHash{}
-Execution of a postfix expression of the form \code{$e_1[e_2]$-{}-},  is equivalent to executing
+The static type of such an expression is the static type of \code{$e_1$.$v$}.
 
-\code{(a, i)\{\VAR{} r = a[i]; a[i] = r - 1; \RETURN{} r\}($e_1$, $e_2$)}.
 
 \LMHash{}
-The static type of such an expression is the static type of $e_1[e_2]$.
+Evaluation of a postfix expression $e$ of the form \code{$e_1$[$e_2$]-{}-}
+proceeds as follows:
 
 \LMHash{}
-Execution of a postfix expression of the form \code{$e_1?.v$++} is equivalent to executing
-
-\code{((x) =$>$ x == \NULL? \NULL : x.v++)($e_1$)}
-unless $e_1$ is a type literal, in which case it is equivalent to \code{$e_1.v$++}
-.
+Evaluate $e_1$ to an object $u$ and $e_2$ to an object $v$.
+Let $a$ and $i$ be fresh variables bound to $u$ and $v$ respectively.
+Evaluate \code{$a$[$i$]} to an object $r$
+and let $y$ be a fresh variable bound to $r$.
+Evaluate \code{$a$[$i$] = $y$ - 1}.
+Then $e$ evaluates to $r$.
 
 \LMHash{}
-The static type of such an expression is the static type of $e_1.v$.
+The static type of such an expression is the static type of \code{$e_1$[$e_2$]}.
 
 \LMHash{}
-Execution of a postfix expression of the form \code{$e_1?.v$-{}-} is equivalent to executing
-
-\code{((x) =$>$ x == \NULL? \NULL : x.v-{}-)($e_1$)}
-unless $e_1$ is a type literal, in which case it is equivalent to \code{$e_1.v$-{}-}
-.
+Evaluation of a postfix expression $e$ of the form \code{$e_1$?.$v$++}
+where $e_1$ is not a type literal, proceeds as follows:
 
 \LMHash{}
-The static type of such an expression is the static type of $e_1.v$.
+If $e_1$ is a type literal, $e$ is equivalent to \code{$e_1$.$v$++}.
+
+\LMHash{}
+Otherwise evaluate $e_1$ to an object $u$.
+if $u$ is the null value, $e$ evaluates to the null value.
+Otherwise let $x$ be a fresh variable bound to $u$.
+Evaluate \code{$x$.$v$++} to an object $o$.
+Then $e$ evaluates to $o$.
+
+\LMHash{}
+The static type of such an expression is the static type of \code{$e_1$.$v$}.
+
+\LMHash{}
+Evaluation of a postfix expression $e$ of the form \code{$e_1$?.$v$-{}-}
+where $e_1$ is not a type literal, proceeds as follows:
+
+If $e_1$ is a type literal, $e$ is equivalent to \code{$e_1$.$v$-{}-}.
+
+Otherwise evaluate $e_1$ to an object $u$.
+If $u$ is the null value, $e$ evalkuates to the null value.
+Otherwise let $x$ be a fresh variable bound to $u$.
+Evaluate \code{$x$.$v$-{}-} to an object $o$.
+Then $e$ evaluates to $o$.
+
+
+\LMHash{}
+The static type of such an expression is the static type of \code{$e_1$.$v$}.
 
 
 \subsection{ Assignable Expressions}
@@ -5217,7 +5393,6 @@
 \LMHash{}
 The static type of a cast expression  \code{$e$ \AS{} $T$}  is $T$.
 
-
 \section{Statements}
 \LMLabel{statements}
 
@@ -5313,7 +5488,7 @@
  A variable declaration statement of the form \VAR{} $v;$ is equivalent to \VAR{} $v = \NULL{};$. A variable declaration statement of the form $T$ $v;$ is equivalent to $T$ $v = \NULL{};$.
 
 \commentary{
-This holds regardless of the type $T$. For example, \code{int i;} does not cause \code{i} to be initialized to zero. Instead, \code{i} is initialized to \NULL{}, just as if we had written \VAR{} \code{i;} or \code{Object i;} or \code{Collection$<$String$>$ i;}.
+This holds regardless of the type $T$. For example, \code{int i;} does not cause \code{i} to be initialized to zero. Instead, \code{i} is initialized to \NULL{}, just as if we had written \VAR{} \code{i;} or \code{Object i;} or \code{Collection<String> i;}.
 }
 
 \rationale{
@@ -5353,19 +5528,19 @@
 }
 
 \begin{dartCode}
-f(x) =$>$ x++;  // a top level function
+f(x) => x++;  // a top level function
 top() \{ // another top level function
   f(3); // illegal
-  f(x) $=>$ x $>$ 0? x*f(x-1): 1;  // recursion is legal
-  g1(x) $=>$ h(x, 1); // error: h is not declared yet
-  h(x, n) $=>$ x $>$ 1? h(x-1, n*x): n; // again, recursion is fine
-  g2(x) $=>$ h(x, 1); // legal
+  f(x) => x > 0? x*f(x-1): 1;  // recursion is legal
+  g1(x) => h(x, 1); // error: h is not declared yet
+  h(x, n) => x > 1? h(x-1, n*x): n; // again, recursion is fine
+  g2(x) => h(x, 1); // legal
 
-  p1(x) $=>$ q(x,x); // illegal
-  q1(a, b)$ =>$ a $>$ 0 ? p1(a-1): b; // fine
+  p1(x) => q(x,x); // illegal
+  q1(a, b)$ =>$ a > 0 ? p1(a-1): b; // fine
 
-  q2(a, b) $=>$ a $>$ 0 ? p2(a-1): b; // illegal
-  p1(x) $=>$ q2(x,x); // fine
+  q2(a, b) => a > 0 ? p2(a-1): b; // illegal
+  p1(x) => q2(x,x); // fine
 \}
 \end{dartCode}
 
@@ -5376,8 +5551,8 @@
 \begin{dartCode}
 top2() \{ // a top level function
  \VAR{} p, q;
-  p = (x) $=>$ q(x,x);
-  q = (a, b) $=>$ a $>$ 0 ? p(a-1): b;
+  p = (x) => q(x,x);
+  q = (a, b) => a > 0 ? p(a-1): b;
 
 \}
 \end{dartCode}
@@ -5949,7 +6124,8 @@
 Otherwise, execution resumes at the end of the try statement.
 
 \LMHash{}
-Execution of an \ON{}-\CATCH{} clause \code{\ON{} $T$ \CATCH{} ($p_1$, $p_2$)} $s$ of a try statement $t$ proceeds as follows: The statement $s$ is executed in the dynamic scope of the exception handler defined by the finally clause of $t$. Then, the current exception and active stack trace both become undefined.
+Execution of an \ON{}-\CATCH{} clause \code{\ON{} $T$ \CATCH{} ($p_1$, $p_2$)} $s$ of a try statement $t$ proceeds as follows:
+The statement $s$ is executed in the dynamic scope of the exception handler defined by the finally clause of $t$. Then, the current exception and active stack trace both become undefined.
 
 \LMHash{}
 Execution of a \FINALLY{} clause \FINALLY{} $s$ of a try statement proceeds as follows:
@@ -6023,12 +6199,12 @@
 Let $T$ be the static type of $e$ and let $f$ be the immediately enclosing function.
 
 \LMHash{}
-It is a static type warning if the body of $f$ is marked \ASYNC{} and the type \code{Future$<$flatten(T)$>$} (\ref{functionExpressions}) may not be assigned to the declared return type of $f$.    Otherwise, it is a static type warning if $T$ may not be assigned to the declared return type of $f$.
+It is a static type warning if the body of $f$ is marked \ASYNC{} and the type \code{Future<flatten(T)>} (\ref{functionExpressions}) may not be assigned to the declared return type of $f$.    Otherwise, it is a static type warning if $T$ may not be assigned to the declared return type of $f$.
 
 \LMHash{}
 Let $S$ be the runtime type of $o$. In checked mode:
 \begin{itemize}
-\item  If the body of $f$ is marked \ASYNC{} (\ref{functions}) it is a dynamic type error if $o$ is not \NULL{} (\ref{null}) and \code{Future$<$flatten(S)$>$} is not a subtype of the actual return type  (\ref{actualTypeOfADeclaration}) of $f$.
+\item  If the body of $f$ is marked \ASYNC{} (\ref{functions}) it is a dynamic type error if $o$ is not \NULL{} (\ref{null}) and \code{Future<flatten(S)>} is not a subtype of the actual return type  (\ref{actualTypeOfADeclaration}) of $f$.
 \item Otherwise, it is a dynamic type error if $o$ is not \NULL{} and the runtime type of $o$ is not a subtype of the actual return type of $f$.
 \end{itemize}
 
@@ -6050,15 +6226,15 @@
 Let $f$ be the function immediately enclosing a return statement of the form \RETURN{}; It is a static warning  $f$ is neither a generator nor a generative constructor and either:
 \begin{itemize}
 \item  $f$ is synchronous and the return type of $f$ may not be assigned to \VOID{} (\ref{typeVoid}) or,
-\item  $f$ is asynchronous and the return type of $f$ may not be assigned to \code{Future$<$Null$>$}.
+\item  $f$ is asynchronous and the return type of $f$ may not be assigned to \code{Future<Null>}.
 \end{itemize}
 
  \commentary{
-Hence, a static warning will not be issued if $f$ has no declared return type, since the return type would be  \DYNAMIC{} and  \DYNAMIC{} may be assigned to \VOID{} and to \code{Future$<$Null$>$}. However, any synchronous non-generator function that declares a return type must return an expression explicitly.
+Hence, a static warning will not be issued if $f$ has no declared return type, since the return type would be  \DYNAMIC{} and  \DYNAMIC{} may be assigned to \VOID{} and to \code{Future<Null>}. However, any synchronous non-generator function that declares a return type must return an expression explicitly.
 }
 \rationale{This helps catch situations where users forget to return a value in a return statement.}
 
-\rationale{ An asynchronous non-generator always returns a future of some sort. If no expression is given, the future will be completed with \NULL{} and this motivates the requirement above.} \commentary{Leaving the return type of a function marked \ASYNC{}  blank will be interpreted as \DYNAMIC{} as always, and cause no type error. Using \code{Future} or \code{Future$<$Object$>$} is acceptable as well, but any other type will cause a warning, since \NULL{} has no subtypes.}
+\rationale{ An asynchronous non-generator always returns a future of some sort. If no expression is given, the future will be completed with \NULL{} and this motivates the requirement above.} \commentary{Leaving the return type of a function marked \ASYNC{}  blank will be interpreted as \DYNAMIC{} as always, and cause no type error. Using \code{Future} or \code{Future<Object>} is acceptable as well, but any other type will cause a warning, since \NULL{} has no subtypes.}
 
 \LMHash{}
 A return statement with no expression, \code{\RETURN;} is executed as follows:
@@ -6218,9 +6394,9 @@
 Let $T$ be the static type of $e$ and let $f$ be the immediately enclosing function.  It is a static type warning if either:
 \begin{itemize}
 \item
- the body of $f$ is marked \ASYNC* and the type \code{Stream$<$T$>$} may not be assigned to the declared return type of $f$.
+ the body of $f$ is marked \ASYNC* and the type \code{Stream<T>} may not be assigned to the declared return type of $f$.
  \item
- the body of $f$ is marked \SYNC* and the type \code{Iterable$<$T$>$} may not be assigned to the declared return type of $f$.
+ the body of $f$ is marked \SYNC* and the type \code{Iterable<T>} may not be assigned to the declared return type of $f$.
  \end{itemize}
 
 
@@ -6753,9 +6929,9 @@
 A script $S$ may be executed as follows:
 
 \LMHash{}
-First, $S$ is compiled as a library as specified above. Then, the top-level function \code{main} that is in the exported namespace of $S$ is invoked. If \code{main} has no positional parameters, it is invoked with no arguments. Otherwise if \code{main} has exactly one positional parameter, it is invoked with a single actual argument whose runtime type implements \code{List$<$String$>$}.  Otherwise \code{main} is invoked with the following two actual arguments:
+First, $S$ is compiled as a library as specified above. Then, the top-level function \code{main} that is in the exported namespace of $S$ is invoked. If \code{main} has no positional parameters, it is invoked with no arguments. Otherwise if \code{main} has exactly one positional parameter, it is invoked with a single actual argument whose runtime type implements \code{List<String>}.  Otherwise \code{main} is invoked with the following two actual arguments:
 \begin{enumerate}
-\item An object whose runtime type implements \code{List$<$String$>$}.
+\item An object whose runtime type implements \code{List<String>}.
 \item The initial message of the current isolate $i$ as determined by the invocation of \code{Isolate.spawnUri} that spawned $i$.
 \end{enumerate}
 
@@ -6929,7 +7105,7 @@
 
 \begin{dartCode}
 \TYPEDEF{} F(bool x);
-f(foo x) $=>$ x;
+f(foo x) => x;
 main() \{
   if (f is F) \{
     print("yoyoma");
@@ -6961,10 +7137,10 @@
 }
 
 \begin{dartCode}
-\CLASS{} I$<$T \EXTENDS{} num$>$ \{\}
+\CLASS{} I<T \EXTENDS{} num> \{\}
 \CLASS{} J \{\}
 
-\CLASS{} A$<$T$>$ \IMPLEMENTS{} J,  I$<$T$>$ // type warning: T is not a subtype of num
+\CLASS{} A<T> \IMPLEMENTS{} J,  I<T> // type warning: T is not a subtype of num
 \{ ...
 \}
 \end{dartCode}
@@ -6972,24 +7148,24 @@
 \commentary{Given the declarations above, the following}
 
 \begin{dartCode}
-I x = \NEW{} A$<$String$>$();
+I x = \NEW{} A<String>();
 \end{dartCode}
 
 \commentary{
-will cause a dynamic type error in checked mode, because the assignment requires a subtype test A$<$String$>$ $<$: I. To show that this holds, we need to show that A$<$String$>$  $<<$ I$<$String$>$, but I$<$String$>$ is a malbounded type, causing the dynamic error.  No error is thrown in production mode. Note that
+will cause a dynamic type error in checked mode, because the assignment requires a subtype test A<String> <: I. To show that this holds, we need to show that A<String>  $<<$ I<String>, but I<String> is a malbounded type, causing the dynamic error.  No error is thrown in production mode. Note that
 }
 
 \begin{dartCode}
-J x = \NEW{} A$<$String$>$();
+J x = \NEW{} A<String>();
 \end{dartCode}
 
 \commentary{
-does not cause a dynamic error, as there is no need to test against \code{I$<$String$>$} in this case.
+does not cause a dynamic error, as there is no need to test against \code{I<String>} in this case.
 Similarly, in production mode
 }
 
 \begin{dartCode}
-A x = \NEW{} A$<$String$>$();
+A x = \NEW{} A<String>();
 bool b = x is I;
 \end{dartCode}
 
@@ -7514,7 +7690,7 @@
 \hline
 Bitwise Or &  $|$ & Left & 9\\
 \hline
-Relational & $<$, $>$, $<=$, $>=$, \AS{}, \IS{}, \IS{}! &  None & 8\\
+Relational & <, >, $<=$, $>=$, \AS{}, \IS{}, \IS{}! &  None & 8\\
 \hline
 Equality &  ==, != & None & 7\\
 \hline
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index 99f3724..391a76a 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -37,6 +37,7 @@
 import 'package:analyzer/src/dart/analysis/driver.dart' as nd;
 import 'package:analyzer/src/dart/analysis/file_byte_store.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart' as nd;
+import 'package:analyzer/src/dart/analysis/status.dart' as nd;
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/sdk.dart';
@@ -317,7 +318,9 @@
    */
   PubSummaryManager pubSummaryManager;
 
+  nd.PerformanceLog _analysisPerformanceLogger;
   ByteStore byteStore;
+  nd.AnalysisDriverScheduler analysisDriverScheduler;
 
   /**
    * The set of the files that are currently priority.
@@ -363,10 +366,15 @@
         options.finerGrainedInvalidation;
     defaultContextOptions.generateImplicitErrors = false;
     operationQueue = new ServerOperationQueue();
+    _analysisPerformanceLogger = new nd.PerformanceLog(io.stdout);
     byteStore = new MemoryCachingByteStore(
         new FileByteStore(
             resourceProvider.getStateLocation('.analysis-driver')),
-        1024);
+        64 * 1024 * 1024);
+    analysisDriverScheduler =
+        new nd.AnalysisDriverScheduler(_analysisPerformanceLogger);
+    analysisDriverScheduler.status.listen(sendStatusNotificationNew);
+    analysisDriverScheduler.start();
     if (useSingleContextManager) {
       contextManager = new SingleContextManager(resourceProvider, sdkManager,
           packageResolverProvider, analyzedFilesGlobs, defaultContextOptions);
@@ -576,7 +584,7 @@
   nd.AnalysisDriver getAnalysisDriver(String path) {
     Iterable<nd.AnalysisDriver> drivers = driverMap.values;
     if (drivers.isNotEmpty) {
-      return drivers.firstWhere((driver) => driver.isAddedFile(path),
+      return drivers.firstWhere((driver) => driver.knownFiles.contains(path),
           orElse: () => drivers.first);
     }
     return null;
@@ -1119,6 +1127,25 @@
   }
 
   /**
+   * Send status notification to the client. The `operation` is the operation
+   * being performed or `null` if analysis is complete.
+   */
+  void sendStatusNotificationNew(nd.AnalysisStatus status) {
+    // Only send status when subscribed.
+    if (!serverServices.contains(ServerService.STATUS)) {
+      return;
+    }
+    // Only send status when it changes
+    if (statusAnalyzing == status.isAnalyzing) {
+      return;
+    }
+    statusAnalyzing = status.isAnalyzing;
+    AnalysisStatus analysis = new AnalysisStatus(status.isAnalyzing);
+    channel.sendNotification(
+        new ServerStatusParams(analysis: analysis).toNotification());
+  }
+
+  /**
    * Implementation for `analysis.setAnalysisRoots`.
    *
    * TODO(scheglov) implement complete projects/contexts semantics.
@@ -1153,7 +1180,7 @@
             subscriptions.values.expand((files) => files).toSet();
         for (String file in allNewFiles) {
           nd.AnalysisDriver driver = drivers.firstWhere(
-              (driver) => driver.isAddedFile(file),
+              (driver) => driver.addedFiles.contains(file),
               orElse: () => drivers.first);
           // The result will be produced by the "results" stream with
           // the fully resolved unit, and processed with sending analysis
@@ -1748,7 +1775,8 @@
       context.dispose();
     }
     nd.AnalysisDriver analysisDriver = new nd.AnalysisDriver(
-        new nd.PerformanceLog(io.stdout),
+        analysisServer.analysisDriverScheduler,
+        analysisServer._analysisPerformanceLogger,
         resourceProvider,
         analysisServer.byteStore,
         analysisServer.fileContentOverlay,
@@ -1765,25 +1793,30 @@
       _runDelayed(() {
         new_sendErrorNotification(analysisServer, result);
       });
+      String path = result.path;
       CompilationUnit unit = result.unit;
       if (unit != null) {
         if (analysisServer._hasAnalysisServiceSubscription(
-            AnalysisService.HIGHLIGHTS, result.path)) {
+            AnalysisService.HIGHLIGHTS, path)) {
           _runDelayed(() {
-            sendAnalysisNotificationHighlights(
-                analysisServer, result.path, unit);
+            sendAnalysisNotificationHighlights(analysisServer, path, unit);
           });
         }
         if (analysisServer._hasAnalysisServiceSubscription(
-            AnalysisService.NAVIGATION, result.path)) {
+            AnalysisService.NAVIGATION, path)) {
           _runDelayed(() {
             new_sendDartNotificationNavigation(analysisServer, result);
           });
         }
+        if (analysisServer._hasAnalysisServiceSubscription(
+            AnalysisService.OVERRIDES, path)) {
+          _runDelayed(() {
+            sendAnalysisNotificationOverrides(analysisServer, path, unit);
+          });
+        }
       }
       // TODO(scheglov) Implement more notifications.
       // IMPLEMENTED
-      // OVERRIDES
       // OCCURRENCES (not used in IDEA)
       // OUTLINE (not used in IDEA)
     });
@@ -1879,15 +1912,21 @@
 
   @override
   void removeContext(Folder folder, List<String> flushedFiles) {
-    AnalysisContext context = analysisServer.folderMap.remove(folder);
-    sendAnalysisNotificationFlushResults(analysisServer, flushedFiles);
+    if (analysisServer.options.enableNewAnalysisDriver) {
+      sendAnalysisNotificationFlushResults(analysisServer, flushedFiles);
+      nd.AnalysisDriver driver = analysisServer.driverMap.remove(folder);
+      driver.dispose();
+    } else {
+      AnalysisContext context = analysisServer.folderMap.remove(folder);
+      sendAnalysisNotificationFlushResults(analysisServer, flushedFiles);
 
-    analysisServer.operationQueue.contextRemoved(context);
-    analysisServer._onContextsChangedController
-        .add(new ContextsChangedEvent(removed: [context]));
-    analysisServer.sendContextAnalysisDoneNotifications(
-        context, AnalysisDoneReason.CONTEXT_REMOVED);
-    context.dispose();
+      analysisServer.operationQueue.contextRemoved(context);
+      analysisServer._onContextsChangedController
+          .add(new ContextsChangedEvent(removed: [context]));
+      analysisServer.sendContextAnalysisDoneNotifications(
+          context, AnalysisDoneReason.CONTEXT_REMOVED);
+      context.dispose();
+    }
   }
 
   @override
diff --git a/pkg/analysis_server/lib/src/context_manager.dart b/pkg/analysis_server/lib/src/context_manager.dart
index a543ad5..083874b 100644
--- a/pkg/analysis_server/lib/src/context_manager.dart
+++ b/pkg/analysis_server/lib/src/context_manager.dart
@@ -949,20 +949,31 @@
    * file.)
    */
   List<String> _computeFlushedFiles(ContextInfo info) {
-    AnalysisContext context = info.context;
-    HashSet<String> flushedFiles = new HashSet<String>();
-    for (Source source in context.sources) {
-      flushedFiles.add(source.fullName);
-    }
-    for (ContextInfo contextInfo in rootInfo.descendants) {
-      AnalysisContext contextN = contextInfo.context;
-      if (context != contextN) {
-        for (Source source in contextN.sources) {
-          flushedFiles.remove(source.fullName);
+    if (enableNewAnalysisDriver) {
+      Set<String> flushedFiles = info.analysisDriver.knownFiles.toSet();
+      for (ContextInfo contextInfo in rootInfo.descendants) {
+        AnalysisDriver other = contextInfo.analysisDriver;
+        if (other != info.analysisDriver) {
+          flushedFiles.removeAll(other.knownFiles);
         }
       }
+      return flushedFiles.toList(growable: false);
+    } else {
+      AnalysisContext context = info.context;
+      HashSet<String> flushedFiles = new HashSet<String>();
+      for (Source source in context.sources) {
+        flushedFiles.add(source.fullName);
+      }
+      for (ContextInfo contextInfo in rootInfo.descendants) {
+        AnalysisContext contextN = contextInfo.context;
+        if (context != contextN) {
+          for (Source source in contextN.sources) {
+            flushedFiles.remove(source.fullName);
+          }
+        }
+      }
+      return flushedFiles.toList(growable: false);
     }
-    return flushedFiles.toList(growable: false);
   }
 
   /**
@@ -1440,7 +1451,9 @@
         break;
       case ChangeType.MODIFY:
         if (enableNewAnalysisDriver) {
-          info.analysisDriver.changeFile(path);
+          for (AnalysisDriver driver in driverMap.values) {
+            driver.changeFile(path);
+          }
         } else {
           List<Source> sources = info.context.getSourcesWithFullName(path);
           if (!sources.isEmpty) {
diff --git a/pkg/analysis_server/lib/src/edit/edit_domain.dart b/pkg/analysis_server/lib/src/edit/edit_domain.dart
index 6d3bec4..3ab679a 100644
--- a/pkg/analysis_server/lib/src/edit/edit_domain.dart
+++ b/pkg/analysis_server/lib/src/edit/edit_domain.dart
@@ -250,7 +250,8 @@
       } else if (requestName == EDIT_GET_REFACTORING) {
         return _getRefactoring(request);
       } else if (requestName == EDIT_ORGANIZE_DIRECTIVES) {
-        return organizeDirectives(request);
+        organizeDirectives(request);
+        return Response.DELAYED_RESPONSE;
       } else if (requestName == EDIT_SORT_MEMBERS) {
         sortMembers(request);
         return Response.DELAYED_RESPONSE;
@@ -261,36 +262,58 @@
     return null;
   }
 
-  Response organizeDirectives(Request request) {
+  Future<Null> organizeDirectives(Request request) async {
     var params = new EditOrganizeDirectivesParams.fromRequest(request);
     // prepare file
     String file = params.file;
     if (!engine.AnalysisEngine.isDartFileName(file)) {
-      return new Response.fileNotAnalyzed(request, file);
+      server.sendResponse(new Response.fileNotAnalyzed(request, file));
+      return;
     }
-    // prepare resolved units
-    List<CompilationUnit> units = server.getResolvedCompilationUnits(file);
-    if (units.isEmpty) {
-      return new Response.fileNotAnalyzed(request, file);
+    // Prepare the file information.
+    int fileStamp;
+    String code;
+    CompilationUnit unit;
+    List<engine.AnalysisError> errors;
+    if (server.options.enableNewAnalysisDriver) {
+      AnalysisResult result = await server.getAnalysisResult(file);
+      if (result == null) {
+        server.sendResponse(new Response.fileNotAnalyzed(request, file));
+        return;
+      }
+      fileStamp = -1;
+      code = result.content;
+      unit = result.unit;
+      errors = result.errors;
+    } else {
+      // prepare resolved units
+      List<CompilationUnit> units = server.getResolvedCompilationUnits(file);
+      if (units.isEmpty) {
+        server.sendResponse(new Response.fileNotAnalyzed(request, file));
+        return;
+      }
+      // prepare context
+      unit = units.first;
+      engine.AnalysisContext context = unit.element.context;
+      Source source = unit.element.source;
+      errors = context.computeErrors(source);
+      // prepare code
+      fileStamp = context.getModificationStamp(source);
+      code = context.getContents(source).data;
     }
-    // prepare context
-    CompilationUnit unit = units.first;
-    engine.AnalysisContext context = unit.element.context;
-    Source source = unit.element.source;
-    List<engine.AnalysisError> errors = context.computeErrors(source);
     // check if there are scan/parse errors in the file
     int numScanParseErrors = _getNumberOfScanParseErrors(errors);
     if (numScanParseErrors != 0) {
-      return new Response.organizeDirectivesError(
-          request, 'File has $numScanParseErrors scan/parse errors.');
+      server.sendResponse(new Response.organizeDirectivesError(
+          request, 'File has $numScanParseErrors scan/parse errors.'));
+      return;
     }
     // do organize
-    int fileStamp = context.getModificationStamp(source);
-    String code = context.getContents(source).data;
     DirectiveOrganizer sorter = new DirectiveOrganizer(code, unit, errors);
     List<SourceEdit> edits = sorter.organize();
     SourceFileEdit fileEdit = new SourceFileEdit(file, fileStamp, edits: edits);
-    return new EditOrganizeDirectivesResult(fileEdit).toResponse(request.id);
+    server.sendResponse(
+        new EditOrganizeDirectivesResult(fileEdit).toResponse(request.id));
   }
 
   Future<Null> sortMembers(Request request) async {
@@ -299,6 +322,7 @@
     String file = params.file;
     if (!engine.AnalysisEngine.isDartFileName(file)) {
       server.sendResponse(new Response.sortMembersInvalidFile(request));
+      return;
     }
     // Prepare the file information.
     int fileStamp;
@@ -308,6 +332,10 @@
     if (server.options.enableNewAnalysisDriver) {
       AnalysisDriver driver = server.getAnalysisDriver(file);
       ParseResult result = await driver.parseFile(file);
+      if (result == null) {
+        server.sendResponse(new Response.fileNotAnalyzed(request, file));
+        return;
+      }
       fileStamp = -1;
       code = result.content;
       unit = result.unit;
diff --git a/pkg/analysis_server/lib/src/provisional/completion/dart/completion_dart.dart b/pkg/analysis_server/lib/src/provisional/completion/dart/completion_dart.dart
index b25375ad..bec47b4 100644
--- a/pkg/analysis_server/lib/src/provisional/completion/dart/completion_dart.dart
+++ b/pkg/analysis_server/lib/src/provisional/completion/dart/completion_dart.dart
@@ -100,6 +100,11 @@
   DartType get objectType;
 
   /**
+   * Return the [SourceFactory] of the request.
+   */
+  SourceFactory get sourceFactory;
+
+  /**
    * Return the completion target.  This determines what part of the parse tree
    * will receive the newly inserted text.
    * At a minimum, all declarations in the completion scope in [target.unit]
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 069b071..ea320be 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
@@ -177,8 +177,11 @@
 
   @override
   LibraryElement get coreLib {
-    if (_coreLib == null) {
-      Source coreUri = context.sourceFactory.forUri('dart:core');
+    if (result != null) {
+      AnalysisContext context = result.unit.element.context;
+      _coreLib = context.typeProvider.objectType.element.library;
+    } else {
+      Source coreUri = sourceFactory.forUri('dart:core');
       _coreLib = context.computeLibraryElement(coreUri);
     }
     return _coreLib;
@@ -222,6 +225,11 @@
     return _opType;
   }
 
+  @override
+  SourceFactory get sourceFactory {
+    return context?.sourceFactory ?? result.sourceFactory;
+  }
+
   /**
    * Throw [AbortCompletion] if the completion request has been aborted.
    */
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/uri_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/uri_contributor.dart
index 7b99353..802beae 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/uri_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/uri_contributor.dart
@@ -77,8 +77,7 @@
             }
           }
         }
-      }
-      else if (offset == start && offset == end) {
+      } else if (offset == start && offset == end) {
         String data = request.source.contents.data;
         if (end == data.length) {
           String ch = data[end - 1];
@@ -112,7 +111,7 @@
 
   void _addDartSuggestions() {
     _addSuggestion('dart:');
-    SourceFactory factory = request.context.sourceFactory;
+    SourceFactory factory = request.sourceFactory;
     for (SdkLibrary lib in factory.dartSdk.sdkLibraries) {
       if (!lib.isInternal && !lib.isImplementation) {
         if (!lib.shortName.startsWith('dart:_')) {
@@ -192,7 +191,7 @@
   }
 
   void _addPackageSuggestions(String partial) {
-    SourceFactory factory = request.context.sourceFactory;
+    SourceFactory factory = request.sourceFactory;
     Map<String, List<Folder>> packageMap = factory.packageMap;
     if (packageMap != null) {
       _addSuggestion('package:');
diff --git a/pkg/analysis_server/lib/src/status/get_handler.dart b/pkg/analysis_server/lib/src/status/get_handler.dart
index c89a26f..32ba194 100644
--- a/pkg/analysis_server/lib/src/status/get_handler.dart
+++ b/pkg/analysis_server/lib/src/status/get_handler.dart
@@ -413,7 +413,7 @@
    */
   String _encodeSdkDescriptor(SdkDescription descriptor) {
     StringBuffer buffer = new StringBuffer();
-    buffer.write(descriptor.options.encodeCrossContextOptions());
+    buffer.write(descriptor.options.encodeCrossContextOptions().join(','));
     for (String path in descriptor.paths) {
       buffer.write('+');
       buffer.write(path);
diff --git a/pkg/analysis_server/test/edit/organize_directives_test.dart b/pkg/analysis_server/test/edit/organize_directives_test.dart
index 89b8c30..d35439a 100644
--- a/pkg/analysis_server/test/edit/organize_directives_test.dart
+++ b/pkg/analysis_server/test/edit/organize_directives_test.dart
@@ -38,7 +38,7 @@
     await waitForTasksFinished();
     Request request =
         new EditOrganizeDirectivesParams('/no/such/file.dart').toRequest('0');
-    Response response = handler.handleRequest(request);
+    Response response = await waitResponse(request);
     expect(
         response, isResponseFailure('0', RequestErrorCode.FILE_NOT_ANALYZED));
   }
@@ -51,7 +51,7 @@
 ''');
     await waitForTasksFinished();
     Request request = new EditOrganizeDirectivesParams(testFile).toRequest('0');
-    Response response = handler.handleRequest(request);
+    Response response = await waitResponse(request);
     expect(response,
         isResponseFailure('0', RequestErrorCode.ORGANIZE_DIRECTIVES_ERROR));
   }
@@ -60,7 +60,7 @@
     await waitForTasksFinished();
     Request request =
         new EditOrganizeDirectivesParams('/not-a-Dart-file.txt').toRequest('0');
-    Response response = handler.handleRequest(request);
+    Response response = await waitResponse(request);
     expect(
         response, isResponseFailure('0', RequestErrorCode.FILE_NOT_ANALYZED));
   }
@@ -158,14 +158,14 @@
 
   Future _assertOrganized(String expectedCode) async {
     await waitForTasksFinished();
-    _requestOrganize();
+    await _requestOrganize();
     String resultCode = SourceEdit.applySequence(testCode, fileEdit.edits);
     expect(resultCode, expectedCode);
   }
 
-  void _requestOrganize() {
+  Future _requestOrganize() async {
     Request request = new EditOrganizeDirectivesParams(testFile).toRequest('0');
-    Response response = handleSuccessfulRequest(request);
+    Response response = await waitResponse(request);
     var result = new EditOrganizeDirectivesResult.fromResponse(response);
     fileEdit = result.edit;
   }
diff --git a/pkg/analyzer/BUILD.gn b/pkg/analyzer/BUILD.gn
index 1f39031..7db0a5e 100644
--- a/pkg/analyzer/BUILD.gn
+++ b/pkg/analyzer/BUILD.gn
@@ -10,6 +10,7 @@
   source_dir = "lib"
 
   deps = [
+    "//dart/pkg/front_end",
     "//third_party/dart-pkg/pub/args",
     "//third_party/dart-pkg/pub/charcode",
     "//third_party/dart-pkg/pub/crypto",
diff --git a/pkg/analyzer/lib/dart/ast/ast.dart b/pkg/analyzer/lib/dart/ast/ast.dart
index 7ec7be4..b027e4c 100644
--- a/pkg/analyzer/lib/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/dart/ast/ast.dart
@@ -323,29 +323,35 @@
 }
 
 /**
- * An assert statement.
+ * An assert in the initializer list of a constructor.
  *
- *    assertStatement ::=
- *        'assert' '(' [Expression] ')' ';'
+ *    assertInitializer ::=
+ *        'assert' '(' [Expression] (',' [Expression])? ')'
  *
  * Clients may not extend, implement or mix-in this class.
  */
-abstract class AssertStatement extends Statement {
+abstract class AssertInitializer implements Assertion, ConstructorInitializer {
   /**
-   * Initialize a newly created assert statement. The [comma] and [message] can
-   * be `null` if there is no message.
+   * Initialize a newly created assert initializer. The [comma] and [message]
+   * can be `null` if there is no message.
    */
-  factory AssertStatement(
+  factory AssertInitializer(
           Token assertKeyword,
           Token leftParenthesis,
           Expression condition,
           Token comma,
           Expression message,
-          Token rightParenthesis,
-          Token semicolon) =>
-      new AssertStatementImpl(assertKeyword, leftParenthesis, condition, comma,
-          message, rightParenthesis, semicolon);
+          Token rightParenthesis) =>
+      new AssertInitializerImpl(assertKeyword, leftParenthesis, condition,
+          comma, message, rightParenthesis);
+}
 
+/**
+ * An assertion, either in a block or in the initializer list of a constructor.
+ *
+ * Clients may not extend, implement or mix-in this class.
+ */
+abstract class Assertion implements AstNode {
   /**
    * Return the token representing the 'assert' keyword.
    */
@@ -363,7 +369,8 @@
   Token get comma;
 
   /**
-   * Set the comma between the [condition] and the [message] to the given [token].
+   * Set the comma between the [condition] and the [message] to the given
+   * [token].
    */
   void set comma(Token token);
 
@@ -409,6 +416,31 @@
    *  Set the right parenthesis to the given [token].
    */
   void set rightParenthesis(Token token);
+}
+
+/**
+ * An assert statement.
+ *
+ *    assertStatement ::=
+ *        'assert' '(' [Expression] (',' [Expression])? ')' ';'
+ *
+ * Clients may not extend, implement or mix-in this class.
+ */
+abstract class AssertStatement implements Assertion, Statement {
+  /**
+   * Initialize a newly created assert statement. The [comma] and [message] can
+   * be `null` if there is no message.
+   */
+  factory AssertStatement(
+          Token assertKeyword,
+          Token leftParenthesis,
+          Expression condition,
+          Token comma,
+          Expression message,
+          Token rightParenthesis,
+          Token semicolon) =>
+      new AssertStatementImpl(assertKeyword, leftParenthesis, condition, comma,
+          message, rightParenthesis, semicolon);
 
   /**
    * Return the semicolon terminating the statement.
@@ -638,6 +670,8 @@
 
   R visitAsExpression(AsExpression node);
 
+  R visitAssertInitializer(AssertInitializer node);
+
   R visitAssertStatement(AssertStatement assertStatement);
 
   R visitAssignmentExpression(AssignmentExpression node);
diff --git a/pkg/analyzer/lib/dart/ast/syntactic_entity.dart b/pkg/analyzer/lib/dart/ast/syntactic_entity.dart
index bc8271a..5ab6c78 100644
--- a/pkg/analyzer/lib/dart/ast/syntactic_entity.dart
+++ b/pkg/analyzer/lib/dart/ast/syntactic_entity.dart
@@ -4,25 +4,5 @@
 
 library analyzer.dart.ast.syntactic_entity;
 
-/**
- * Interface representing a syntactic entity (either a token or an AST node)
- * which has a location and extent in the source file.
- */
-abstract class SyntacticEntity {
-  /**
-   * Return the offset from the beginning of the file to the character after the
-   * last character of the syntactic entity.
-   */
-  int get end;
-
-  /**
-   * Return the number of characters in the syntactic entity's source range.
-   */
-  int get length;
-
-  /**
-   * Return the offset from the beginning of the file to the first character in
-   * the syntactic entity.
-   */
-  int get offset;
-}
+export 'package:front_end/src/scanner/syntactic_entity.dart'
+    show SyntacticEntity;
diff --git a/pkg/analyzer/lib/dart/ast/token.dart b/pkg/analyzer/lib/dart/ast/token.dart
index fce7f24..a361c5ab 100644
--- a/pkg/analyzer/lib/dart/ast/token.dart
+++ b/pkg/analyzer/lib/dart/ast/token.dart
@@ -8,737 +8,5 @@
  */
 library analyzer.dart.ast.token;
 
-import 'dart:collection';
-
-import 'package:analyzer/dart/ast/syntactic_entity.dart';
-import 'package:analyzer/src/dart/ast/token.dart' show SimpleToken, TokenClass;
-
-/**
- * The keywords in the Dart programming language.
- *
- * Clients may not extend, implement or mix-in this class.
- */
-class Keyword {
-  static const Keyword ABSTRACT = const Keyword._('ABSTRACT', "abstract", true);
-
-  static const Keyword AS = const Keyword._('AS', "as", true);
-
-  static const Keyword ASSERT = const Keyword._('ASSERT', "assert");
-
-  static const Keyword BREAK = const Keyword._('BREAK', "break");
-
-  static const Keyword CASE = const Keyword._('CASE', "case");
-
-  static const Keyword CATCH = const Keyword._('CATCH', "catch");
-
-  static const Keyword CLASS = const Keyword._('CLASS', "class");
-
-  static const Keyword CONST = const Keyword._('CONST', "const");
-
-  static const Keyword CONTINUE = const Keyword._('CONTINUE', "continue");
-
-  static const Keyword DEFAULT = const Keyword._('DEFAULT', "default");
-
-  static const Keyword DEFERRED = const Keyword._('DEFERRED', "deferred", true);
-
-  static const Keyword DO = const Keyword._('DO', "do");
-
-  static const Keyword DYNAMIC = const Keyword._('DYNAMIC', "dynamic", true);
-
-  static const Keyword ELSE = const Keyword._('ELSE', "else");
-
-  static const Keyword ENUM = const Keyword._('ENUM', "enum");
-
-  static const Keyword EXPORT = const Keyword._('EXPORT', "export", true);
-
-  static const Keyword EXTENDS = const Keyword._('EXTENDS', "extends");
-
-  static const Keyword EXTERNAL = const Keyword._('EXTERNAL', "external", true);
-
-  static const Keyword FACTORY = const Keyword._('FACTORY', "factory", true);
-
-  static const Keyword FALSE = const Keyword._('FALSE', "false");
-
-  static const Keyword FINAL = const Keyword._('FINAL', "final");
-
-  static const Keyword FINALLY = const Keyword._('FINALLY', "finally");
-
-  static const Keyword FOR = const Keyword._('FOR', "for");
-
-  static const Keyword GET = const Keyword._('GET', "get", true);
-
-  static const Keyword IF = const Keyword._('IF', "if");
-
-  static const Keyword IMPLEMENTS =
-      const Keyword._('IMPLEMENTS', "implements", true);
-
-  static const Keyword IMPORT = const Keyword._('IMPORT', "import", true);
-
-  static const Keyword IN = const Keyword._('IN', "in");
-
-  static const Keyword IS = const Keyword._('IS', "is");
-
-  static const Keyword LIBRARY = const Keyword._('LIBRARY', "library", true);
-
-  static const Keyword NEW = const Keyword._('NEW', "new");
-
-  static const Keyword NULL = const Keyword._('NULL', "null");
-
-  static const Keyword OPERATOR = const Keyword._('OPERATOR', "operator", true);
-
-  static const Keyword PART = const Keyword._('PART', "part", true);
-
-  static const Keyword RETHROW = const Keyword._('RETHROW', "rethrow");
-
-  static const Keyword RETURN = const Keyword._('RETURN', "return");
-
-  static const Keyword SET = const Keyword._('SET', "set", true);
-
-  static const Keyword STATIC = const Keyword._('STATIC', "static", true);
-
-  static const Keyword SUPER = const Keyword._('SUPER', "super");
-
-  static const Keyword SWITCH = const Keyword._('SWITCH', "switch");
-
-  static const Keyword THIS = const Keyword._('THIS', "this");
-
-  static const Keyword THROW = const Keyword._('THROW', "throw");
-
-  static const Keyword TRUE = const Keyword._('TRUE', "true");
-
-  static const Keyword TRY = const Keyword._('TRY', "try");
-
-  static const Keyword TYPEDEF = const Keyword._('TYPEDEF', "typedef", true);
-
-  static const Keyword VAR = const Keyword._('VAR', "var");
-
-  static const Keyword VOID = const Keyword._('VOID', "void");
-
-  static const Keyword WHILE = const Keyword._('WHILE', "while");
-
-  static const Keyword WITH = const Keyword._('WITH', "with");
-
-  static const List<Keyword> values = const <Keyword>[
-    ABSTRACT,
-    AS,
-    ASSERT,
-    BREAK,
-    CASE,
-    CATCH,
-    CLASS,
-    CONST,
-    CONTINUE,
-    DEFAULT,
-    DEFERRED,
-    DO,
-    DYNAMIC,
-    ELSE,
-    ENUM,
-    EXPORT,
-    EXTENDS,
-    EXTERNAL,
-    FACTORY,
-    FALSE,
-    FINAL,
-    FINALLY,
-    FOR,
-    GET,
-    IF,
-    IMPLEMENTS,
-    IMPORT,
-    IN,
-    IS,
-    LIBRARY,
-    NEW,
-    NULL,
-    OPERATOR,
-    PART,
-    RETHROW,
-    RETURN,
-    SET,
-    STATIC,
-    SUPER,
-    SWITCH,
-    THIS,
-    THROW,
-    TRUE,
-    TRY,
-    TYPEDEF,
-    VAR,
-    VOID,
-    WHILE,
-    WITH,
-  ];
-
-  /**
-   * A table mapping the lexemes of keywords to the corresponding keyword.
-   */
-  static final Map<String, Keyword> keywords = _createKeywordMap();
-
-  /**
-   * The name of the keyword type.
-   */
-  final String name;
-
-  /**
-   * The lexeme for the keyword.
-   */
-  final String syntax;
-
-  /**
-   * A flag indicating whether the keyword is a pseudo-keyword. Pseudo keywords
-   * can be used as identifiers.
-   */
-  final bool isPseudoKeyword;
-
-  /**
-   * Initialize a newly created keyword to have the given [name] and [syntax].
-   * The keyword is a pseudo-keyword if the [isPseudoKeyword] flag is `true`.
-   */
-  const Keyword._(this.name, this.syntax, [this.isPseudoKeyword = false]);
-
-  @override
-  String toString() => name;
-
-  /**
-   * Create a table mapping the lexemes of keywords to the corresponding keyword
-   * and return the table that was created.
-   */
-  static Map<String, Keyword> _createKeywordMap() {
-    LinkedHashMap<String, Keyword> result =
-        new LinkedHashMap<String, Keyword>();
-    for (Keyword keyword in values) {
-      result[keyword.syntax] = keyword;
-    }
-    return result;
-  }
-}
-
-/**
- * A token that was scanned from the input. Each token knows which tokens
- * precede and follow it, acting as a link in a doubly linked list of tokens.
- *
- * Clients may not extend, implement or mix-in this class.
- */
-abstract class Token implements SyntacticEntity {
-  /**
-   * Initialize a newly created token to have the given [type] and [offset].
-   */
-  factory Token(TokenType type, int offset) = SimpleToken;
-
-  @override
-  int get end;
-
-  /**
-   * Return `true` if this token represents an operator.
-   */
-  bool get isOperator;
-
-  /**
-   * Return `true` if this token is a synthetic token. A synthetic token is a
-   * token that was introduced by the parser in order to recover from an error
-   * in the code.
-   */
-  bool get isSynthetic;
-
-  /**
-   * Return `true` if this token represents an operator that can be defined by
-   * users.
-   */
-  bool get isUserDefinableOperator;
-
-  /**
-   * Return the keyword, if a keyword token, or `null` otherwise.
-   */
-  Keyword get keyword;
-
-  @override
-  int get length;
-
-  /**
-   * Return the lexeme that represents this token.
-   */
-  String get lexeme;
-
-  /**
-   * Return the next token in the token stream.
-   */
-  Token get next;
-
-  @override
-  int get offset;
-
-  /**
-   * Set the offset from the beginning of the file to the first character in
-   * the token to the given [offset].
-   */
-  void set offset(int offset);
-
-  /**
-   * Return the first comment in the list of comments that precede this token,
-   * or `null` if there are no comments preceding this token. Additional
-   * comments can be reached by following the token stream using [next] until
-   * `null` is returned.
-   *
-   * For example, if the original contents were `/* one */ /* two */ id`, then
-   * the first preceding comment token will have a lexeme of `/* one */` and
-   * the next comment token will have a lexeme of `/* two */`.
-   */
-  Token get precedingComments;
-
-  /**
-   * Return the previous token in the token stream.
-   */
-  Token get previous;
-
-  /**
-   * Set the previous token in the token stream to the given [token].
-   */
-  void set previous(Token token);
-
-  /**
-   * Return the type of the token.
-   */
-  TokenType get type;
-
-  /**
-   * Apply (add) the given [delta] to this token's offset.
-   */
-  void applyDelta(int delta);
-
-  /**
-   * Return a newly created token that is a copy of this token but that is not a
-   * part of any token stream.
-   */
-  Token copy();
-
-  /**
-   * Copy a linked list of comment tokens identical to the given comment tokens.
-   */
-  Token copyComments(Token token);
-
-  /**
-   * Return `true` if this token has any one of the given [types].
-   */
-  bool matchesAny(List<TokenType> types);
-
-  /**
-   * Set the next token in the token stream to the given [token]. This has the
-   * side-effect of setting this token to be the previous token for the given
-   * token. Return the token that was passed in.
-   */
-  Token setNext(Token token);
-
-  /**
-   * Set the next token in the token stream to the given token without changing
-   * which token is the previous token for the given token. Return the token
-   * that was passed in.
-   */
-  Token setNextWithoutSettingPrevious(Token token);
-
-  /**
-   * Return the value of this token. For keyword tokens, this is the keyword
-   * associated with the token, for other tokens it is the lexeme associated
-   * with the token.
-   */
-  Object value();
-
-  /**
-   * Compare the given [tokens] to find the token that appears first in the
-   * source being parsed. That is, return the left-most of all of the tokens.
-   * The list must be non-`null`, but the elements of the list are allowed to be
-   * `null`. Return the token with the smallest offset, or `null` if the list is
-   * empty or if all of the elements of the list are `null`.
-   */
-  static Token lexicallyFirst(List<Token> tokens) {
-    Token first = null;
-    int offset = -1;
-    int length = tokens.length;
-    for (int i = 0; i < length; i++) {
-      Token token = tokens[i];
-      if (token != null && (offset < 0 || token.offset < offset)) {
-        first = token;
-        offset = token.offset;
-      }
-    }
-    return first;
-  }
-}
-
-/**
- * The types of tokens that can be returned by the scanner.
- *
- * Clients may not extend, implement or mix-in this class.
- */
-class TokenType {
-  /**
-   * The type of the token that marks the start or end of the input.
-   */
-  static const TokenType EOF = const _EndOfFileTokenType();
-
-  static const TokenType DOUBLE = const TokenType._('DOUBLE');
-
-  static const TokenType HEXADECIMAL = const TokenType._('HEXADECIMAL');
-
-  static const TokenType IDENTIFIER = const TokenType._('IDENTIFIER');
-
-  static const TokenType INT = const TokenType._('INT');
-
-  static const TokenType KEYWORD = const TokenType._('KEYWORD');
-
-  static const TokenType MULTI_LINE_COMMENT =
-      const TokenType._('MULTI_LINE_COMMENT');
-
-  static const TokenType SCRIPT_TAG = const TokenType._('SCRIPT_TAG');
-
-  static const TokenType SINGLE_LINE_COMMENT =
-      const TokenType._('SINGLE_LINE_COMMENT');
-
-  static const TokenType STRING = const TokenType._('STRING');
-
-  static const TokenType AMPERSAND =
-      const TokenType._('AMPERSAND', TokenClass.BITWISE_AND_OPERATOR, '&');
-
-  static const TokenType AMPERSAND_AMPERSAND = const TokenType._(
-      'AMPERSAND_AMPERSAND', TokenClass.LOGICAL_AND_OPERATOR, '&&');
-
-  static const TokenType AMPERSAND_AMPERSAND_EQ = const TokenType._(
-      'AMPERSAND_AMPERSAND_EQ', TokenClass.ASSIGNMENT_OPERATOR, '&&=');
-
-  static const TokenType AMPERSAND_EQ =
-      const TokenType._('AMPERSAND_EQ', TokenClass.ASSIGNMENT_OPERATOR, '&=');
-
-  static const TokenType AT = const TokenType._('AT', TokenClass.NO_CLASS, '@');
-
-  static const TokenType BANG =
-      const TokenType._('BANG', TokenClass.UNARY_PREFIX_OPERATOR, '!');
-
-  static const TokenType BANG_EQ =
-      const TokenType._('BANG_EQ', TokenClass.EQUALITY_OPERATOR, '!=');
-
-  static const TokenType BAR =
-      const TokenType._('BAR', TokenClass.BITWISE_OR_OPERATOR, '|');
-
-  static const TokenType BAR_BAR =
-      const TokenType._('BAR_BAR', TokenClass.LOGICAL_OR_OPERATOR, '||');
-
-  static const TokenType BAR_BAR_EQ =
-      const TokenType._('BAR_BAR_EQ', TokenClass.ASSIGNMENT_OPERATOR, '||=');
-
-  static const TokenType BAR_EQ =
-      const TokenType._('BAR_EQ', TokenClass.ASSIGNMENT_OPERATOR, '|=');
-
-  static const TokenType COLON =
-      const TokenType._('COLON', TokenClass.NO_CLASS, ':');
-
-  static const TokenType COMMA =
-      const TokenType._('COMMA', TokenClass.NO_CLASS, ',');
-
-  static const TokenType CARET =
-      const TokenType._('CARET', TokenClass.BITWISE_XOR_OPERATOR, '^');
-
-  static const TokenType CARET_EQ =
-      const TokenType._('CARET_EQ', TokenClass.ASSIGNMENT_OPERATOR, '^=');
-
-  static const TokenType CLOSE_CURLY_BRACKET =
-      const TokenType._('CLOSE_CURLY_BRACKET', TokenClass.NO_CLASS, '}');
-
-  static const TokenType CLOSE_PAREN =
-      const TokenType._('CLOSE_PAREN', TokenClass.NO_CLASS, ')');
-
-  static const TokenType CLOSE_SQUARE_BRACKET =
-      const TokenType._('CLOSE_SQUARE_BRACKET', TokenClass.NO_CLASS, ']');
-
-  static const TokenType EQ =
-      const TokenType._('EQ', TokenClass.ASSIGNMENT_OPERATOR, '=');
-
-  static const TokenType EQ_EQ =
-      const TokenType._('EQ_EQ', TokenClass.EQUALITY_OPERATOR, '==');
-
-  static const TokenType FUNCTION =
-      const TokenType._('FUNCTION', TokenClass.NO_CLASS, '=>');
-
-  static const TokenType GT =
-      const TokenType._('GT', TokenClass.RELATIONAL_OPERATOR, '>');
-
-  static const TokenType GT_EQ =
-      const TokenType._('GT_EQ', TokenClass.RELATIONAL_OPERATOR, '>=');
-
-  static const TokenType GT_GT =
-      const TokenType._('GT_GT', TokenClass.SHIFT_OPERATOR, '>>');
-
-  static const TokenType GT_GT_EQ =
-      const TokenType._('GT_GT_EQ', TokenClass.ASSIGNMENT_OPERATOR, '>>=');
-
-  static const TokenType HASH =
-      const TokenType._('HASH', TokenClass.NO_CLASS, '#');
-
-  static const TokenType INDEX =
-      const TokenType._('INDEX', TokenClass.UNARY_POSTFIX_OPERATOR, '[]');
-
-  static const TokenType INDEX_EQ =
-      const TokenType._('INDEX_EQ', TokenClass.UNARY_POSTFIX_OPERATOR, '[]=');
-
-  static const TokenType IS =
-      const TokenType._('IS', TokenClass.RELATIONAL_OPERATOR, 'is');
-
-  static const TokenType LT =
-      const TokenType._('LT', TokenClass.RELATIONAL_OPERATOR, '<');
-
-  static const TokenType LT_EQ =
-      const TokenType._('LT_EQ', TokenClass.RELATIONAL_OPERATOR, '<=');
-
-  static const TokenType LT_LT =
-      const TokenType._('LT_LT', TokenClass.SHIFT_OPERATOR, '<<');
-
-  static const TokenType LT_LT_EQ =
-      const TokenType._('LT_LT_EQ', TokenClass.ASSIGNMENT_OPERATOR, '<<=');
-
-  static const TokenType MINUS =
-      const TokenType._('MINUS', TokenClass.ADDITIVE_OPERATOR, '-');
-
-  static const TokenType MINUS_EQ =
-      const TokenType._('MINUS_EQ', TokenClass.ASSIGNMENT_OPERATOR, '-=');
-
-  static const TokenType MINUS_MINUS =
-      const TokenType._('MINUS_MINUS', TokenClass.UNARY_PREFIX_OPERATOR, '--');
-
-  static const TokenType OPEN_CURLY_BRACKET =
-      const TokenType._('OPEN_CURLY_BRACKET', TokenClass.NO_CLASS, '{');
-
-  static const TokenType OPEN_PAREN =
-      const TokenType._('OPEN_PAREN', TokenClass.UNARY_POSTFIX_OPERATOR, '(');
-
-  static const TokenType OPEN_SQUARE_BRACKET = const TokenType._(
-      'OPEN_SQUARE_BRACKET', TokenClass.UNARY_POSTFIX_OPERATOR, '[');
-
-  static const TokenType PERCENT =
-      const TokenType._('PERCENT', TokenClass.MULTIPLICATIVE_OPERATOR, '%');
-
-  static const TokenType PERCENT_EQ =
-      const TokenType._('PERCENT_EQ', TokenClass.ASSIGNMENT_OPERATOR, '%=');
-
-  static const TokenType PERIOD =
-      const TokenType._('PERIOD', TokenClass.UNARY_POSTFIX_OPERATOR, '.');
-
-  static const TokenType PERIOD_PERIOD =
-      const TokenType._('PERIOD_PERIOD', TokenClass.CASCADE_OPERATOR, '..');
-
-  static const TokenType PLUS =
-      const TokenType._('PLUS', TokenClass.ADDITIVE_OPERATOR, '+');
-
-  static const TokenType PLUS_EQ =
-      const TokenType._('PLUS_EQ', TokenClass.ASSIGNMENT_OPERATOR, '+=');
-
-  static const TokenType PLUS_PLUS =
-      const TokenType._('PLUS_PLUS', TokenClass.UNARY_PREFIX_OPERATOR, '++');
-
-  static const TokenType QUESTION =
-      const TokenType._('QUESTION', TokenClass.CONDITIONAL_OPERATOR, '?');
-
-  static const TokenType QUESTION_PERIOD = const TokenType._(
-      'QUESTION_PERIOD', TokenClass.UNARY_POSTFIX_OPERATOR, '?.');
-
-  static const TokenType QUESTION_QUESTION =
-      const TokenType._('QUESTION_QUESTION', TokenClass.IF_NULL_OPERATOR, '??');
-
-  static const TokenType QUESTION_QUESTION_EQ = const TokenType._(
-      'QUESTION_QUESTION_EQ', TokenClass.ASSIGNMENT_OPERATOR, '??=');
-
-  static const TokenType SEMICOLON =
-      const TokenType._('SEMICOLON', TokenClass.NO_CLASS, ';');
-
-  static const TokenType SLASH =
-      const TokenType._('SLASH', TokenClass.MULTIPLICATIVE_OPERATOR, '/');
-
-  static const TokenType SLASH_EQ =
-      const TokenType._('SLASH_EQ', TokenClass.ASSIGNMENT_OPERATOR, '/=');
-
-  static const TokenType STAR =
-      const TokenType._('STAR', TokenClass.MULTIPLICATIVE_OPERATOR, '*');
-
-  static const TokenType STAR_EQ =
-      const TokenType._('STAR_EQ', TokenClass.ASSIGNMENT_OPERATOR, "*=");
-
-  static const TokenType STRING_INTERPOLATION_EXPRESSION = const TokenType._(
-      'STRING_INTERPOLATION_EXPRESSION', TokenClass.NO_CLASS, '\${');
-
-  static const TokenType STRING_INTERPOLATION_IDENTIFIER = const TokenType._(
-      'STRING_INTERPOLATION_IDENTIFIER', TokenClass.NO_CLASS, '\$');
-
-  static const TokenType TILDE =
-      const TokenType._('TILDE', TokenClass.UNARY_PREFIX_OPERATOR, '~');
-
-  static const TokenType TILDE_SLASH = const TokenType._(
-      'TILDE_SLASH', TokenClass.MULTIPLICATIVE_OPERATOR, '~/');
-
-  static const TokenType TILDE_SLASH_EQ = const TokenType._(
-      'TILDE_SLASH_EQ', TokenClass.ASSIGNMENT_OPERATOR, '~/=');
-
-  static const TokenType BACKPING =
-      const TokenType._('BACKPING', TokenClass.NO_CLASS, '`');
-
-  static const TokenType BACKSLASH =
-      const TokenType._('BACKSLASH', TokenClass.NO_CLASS, '\\');
-
-  static const TokenType PERIOD_PERIOD_PERIOD =
-      const TokenType._('PERIOD_PERIOD_PERIOD', TokenClass.NO_CLASS, '...');
-
-  static const TokenType GENERIC_METHOD_TYPE_LIST =
-      const TokenType._('GENERIC_METHOD_TYPE_LIST');
-
-  static const TokenType GENERIC_METHOD_TYPE_ASSIGN =
-      const TokenType._('GENERIC_METHOD_TYPE_ASSIGN');
-
-  /**
-   * The class of the token.
-   */
-  final TokenClass _tokenClass;
-
-  /**
-   * The name of the token type.
-   */
-  final String name;
-
-  /**
-   * The lexeme that defines this type of token, or `null` if there is more than
-   * one possible lexeme for this type of token.
-   */
-  final String lexeme;
-
-  /**
-   * Initialize a newly created token type to have the given [name],
-   * [_tokenClass] and [lexeme].
-   */
-  const TokenType._(this.name,
-      [this._tokenClass = TokenClass.NO_CLASS, this.lexeme = null]);
-
-  /**
-   * Return `true` if this type of token represents an additive operator.
-   */
-  bool get isAdditiveOperator => _tokenClass == TokenClass.ADDITIVE_OPERATOR;
-
-  /**
-   * Return `true` if this type of token represents an assignment operator.
-   */
-  bool get isAssignmentOperator =>
-      _tokenClass == TokenClass.ASSIGNMENT_OPERATOR;
-
-  /**
-   * Return `true` if this type of token represents an associative operator. An
-   * associative operator is an operator for which the following equality is
-   * true: `(a * b) * c == a * (b * c)`. In other words, if the result of
-   * applying the operator to multiple operands does not depend on the order in
-   * which those applications occur.
-   *
-   * Note: This method considers the logical-and and logical-or operators to be
-   * associative, even though the order in which the application of those
-   * operators can have an effect because evaluation of the right-hand operand
-   * is conditional.
-   */
-  bool get isAssociativeOperator =>
-      this == AMPERSAND ||
-      this == AMPERSAND_AMPERSAND ||
-      this == BAR ||
-      this == BAR_BAR ||
-      this == CARET ||
-      this == PLUS ||
-      this == STAR;
-
-  /**
-   * Return `true` if this type of token represents an equality operator.
-   */
-  bool get isEqualityOperator => _tokenClass == TokenClass.EQUALITY_OPERATOR;
-
-  /**
-   * Return `true` if this type of token represents an increment operator.
-   */
-  bool get isIncrementOperator =>
-      identical(lexeme, '++') || identical(lexeme, '--');
-
-  /**
-   * Return `true` if this type of token represents a multiplicative operator.
-   */
-  bool get isMultiplicativeOperator =>
-      _tokenClass == TokenClass.MULTIPLICATIVE_OPERATOR;
-
-  /**
-   * Return `true` if this token type represents an operator.
-   */
-  bool get isOperator =>
-      _tokenClass != TokenClass.NO_CLASS &&
-      this != OPEN_PAREN &&
-      this != OPEN_SQUARE_BRACKET &&
-      this != PERIOD;
-
-  /**
-   * Return `true` if this type of token represents a relational operator.
-   */
-  bool get isRelationalOperator =>
-      _tokenClass == TokenClass.RELATIONAL_OPERATOR;
-
-  /**
-   * Return `true` if this type of token represents a shift operator.
-   */
-  bool get isShiftOperator => _tokenClass == TokenClass.SHIFT_OPERATOR;
-
-  /**
-   * Return `true` if this type of token represents a unary postfix operator.
-   */
-  bool get isUnaryPostfixOperator =>
-      _tokenClass == TokenClass.UNARY_POSTFIX_OPERATOR;
-
-  /**
-   * Return `true` if this type of token represents a unary prefix operator.
-   */
-  bool get isUnaryPrefixOperator =>
-      _tokenClass == TokenClass.UNARY_PREFIX_OPERATOR;
-
-  /**
-   * Return `true` if this token type represents an operator that can be defined
-   * by users.
-   */
-  bool get isUserDefinableOperator =>
-      identical(lexeme, '==') ||
-      identical(lexeme, '~') ||
-      identical(lexeme, '[]') ||
-      identical(lexeme, '[]=') ||
-      identical(lexeme, '*') ||
-      identical(lexeme, '/') ||
-      identical(lexeme, '%') ||
-      identical(lexeme, '~/') ||
-      identical(lexeme, '+') ||
-      identical(lexeme, '-') ||
-      identical(lexeme, '<<') ||
-      identical(lexeme, '>>') ||
-      identical(lexeme, '>=') ||
-      identical(lexeme, '>') ||
-      identical(lexeme, '<=') ||
-      identical(lexeme, '<') ||
-      identical(lexeme, '&') ||
-      identical(lexeme, '^') ||
-      identical(lexeme, '|');
-
-  /**
-   * Return the precedence of the token, or `0` if the token does not represent
-   * an operator.
-   */
-  int get precedence => _tokenClass.precedence;
-
-  @override
-  String toString() => name;
-}
-
-/**
- * A token representing the end (either the head or the tail) of a stream of
- * tokens.
- */
-class _EndOfFileTokenType extends TokenType {
-  /**
-   * Initialize a newly created token.
-   */
-  const _EndOfFileTokenType() : super._('EOF', TokenClass.NO_CLASS, '');
-
-  @override
-  String toString() => '-eof-';
-}
+export 'package:front_end/src/scanner/token.dart'
+    show Keyword, Token, TokenType;
diff --git a/pkg/analyzer/lib/dart/ast/visitor.dart b/pkg/analyzer/lib/dart/ast/visitor.dart
index d3e55d3..ad96bed 100644
--- a/pkg/analyzer/lib/dart/ast/visitor.dart
+++ b/pkg/analyzer/lib/dart/ast/visitor.dart
@@ -165,6 +165,9 @@
   R visitAsExpression(AsExpression node) => visitExpression(node);
 
   @override
+  R visitAssertInitializer(AssertInitializer node) => visitNode(node);
+
+  @override
   R visitAssertStatement(AssertStatement node) => visitStatement(node);
 
   @override
@@ -323,7 +326,7 @@
 
   @override
   R visitFunctionExpressionInvocation(FunctionExpressionInvocation node) =>
-      visitExpression(node);
+      visitInvocationExpression(node);
 
   @override
   R visitFunctionTypeAlias(FunctionTypeAlias node) => visitTypeAlias(node);
@@ -366,6 +369,9 @@
   R visitInterpolationString(InterpolationString node) =>
       visitInterpolationElement(node);
 
+  R visitInvocationExpression(InvocationExpression node) =>
+      visitExpression(node);
+
   @override
   R visitIsExpression(IsExpression node) => visitExpression(node);
 
@@ -396,7 +402,8 @@
   R visitMethodDeclaration(MethodDeclaration node) => visitClassMember(node);
 
   @override
-  R visitMethodInvocation(MethodInvocation node) => visitExpression(node);
+  R visitMethodInvocation(MethodInvocation node) =>
+      visitInvocationExpression(node);
 
   R visitNamedCompilationUnitMember(NamedCompilationUnitMember node) =>
       visitCompilationUnitMember(node);
@@ -597,6 +604,12 @@
   }
 
   @override
+  R visitAssertInitializer(AssertInitializer node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
   R visitAssertStatement(AssertStatement node) {
     node.visitChildren(this);
     return null;
@@ -1244,6 +1257,9 @@
   R visitAsExpression(AsExpression node) => null;
 
   @override
+  R visitAssertInitializer(AssertInitializer node) => null;
+
+  @override
   R visitAssertStatement(AssertStatement node) => null;
 
   @override
@@ -1616,6 +1632,14 @@
   }
 
   @override
+  T visitAssertInitializer(AssertInitializer node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitAssertInitializer(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
   T visitAssertStatement(AssertStatement node) {
     stopwatch.start();
     T result = _baseVisitor.visitAssertStatement(node);
@@ -2475,6 +2499,9 @@
   R visitAsExpression(AsExpression node) => visitNode(node);
 
   @override
+  R visitAssertInitializer(AssertInitializer node) => visitNode(node);
+
+  @override
   R visitAssertStatement(AssertStatement node) => visitNode(node);
 
   @override
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index ce8b384..388e0c8 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -13,6 +13,628 @@
 import 'package:analyzer/src/generated/java_core.dart';
 import 'package:analyzer/src/generated/parser.dart' show ParserErrorCode;
 import 'package:analyzer/src/generated/source.dart';
+import 'package:front_end/src/scanner/errors.dart';
+
+export 'package:front_end/src/scanner/errors.dart'
+    show ErrorCode, ErrorSeverity, ErrorType;
+
+const List<ErrorCode> errorCodeValues = const [
+  //
+  // Manually generated. You can mostly reproduce this list by running the
+  // following command from the root of the analyzer package:
+  //
+  // > cat
+  //       lib/src/analysis_options/error/option_codes.dart';
+  //       lib/src/dart/error/hint_codes.dart';
+  //       lib/src/dart/error/lint_codes.dart';
+  //       lib/src/dart/error/todo_codes.dart';
+  //       lib/src/html/error/html_codes.dart';
+  //       lib/src/dart/error/syntactic_errors.dart
+  //       lib/src/error/codes.dart
+  //       ../front_end/lib/src/scanner/errors.dart |
+  //     grep 'static const .*Code' |
+  //     awk '{print $3"."$4","}' |
+  //     sort > codes.txt
+  //
+  // There are a few error codes that are wrapped such that the name of the
+  // error code in on the line following the pattern we're grepping for. Those
+  // need to be filled in by hand.
+  //
+  AnalysisOptionsErrorCode.PARSE_ERROR,
+  AnalysisOptionsWarningCode.UNRECOGNIZED_ERROR_CODE,
+  AnalysisOptionsWarningCode.UNSUPPORTED_OPTION_WITH_LEGAL_VALUE,
+  AnalysisOptionsWarningCode.UNSUPPORTED_OPTION_WITH_LEGAL_VALUES,
+  AnalysisOptionsWarningCode.UNSUPPORTED_VALUE,
+  CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH,
+  CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
+  CheckedModeCompileTimeErrorCode.CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE,
+  CheckedModeCompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,
+  CheckedModeCompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE,
+  CheckedModeCompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE,
+  CheckedModeCompileTimeErrorCode.VARIABLE_TYPE_MISMATCH,
+  CompileTimeErrorCode.ACCESS_PRIVATE_ENUM_FIELD,
+  CompileTimeErrorCode.AMBIGUOUS_EXPORT,
+  CompileTimeErrorCode.ANNOTATION_WITH_NON_CLASS,
+  CompileTimeErrorCode.ARGUMENT_DEFINITION_TEST_NON_PARAMETER,
+  CompileTimeErrorCode.ASYNC_FOR_IN_WRONG_CONTEXT,
+  CompileTimeErrorCode.AWAIT_IN_WRONG_CONTEXT,
+  CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE,
+  CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME,
+  CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_NAME,
+  CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME,
+  CompileTimeErrorCode.CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS,
+  CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD,
+  CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD,
+  CompileTimeErrorCode.CONFLICTING_GETTER_AND_METHOD,
+  CompileTimeErrorCode.CONFLICTING_METHOD_AND_GETTER,
+  CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_CLASS,
+  CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER,
+  CompileTimeErrorCode.CONST_CONSTRUCTOR_THROWS_EXCEPTION,
+  CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_FIELD_INITIALIZED_BY_NON_CONST,
+  CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN,
+  CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER,
+  CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD,
+  CompileTimeErrorCode.CONST_DEFERRED_CLASS,
+  CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION,
+  CompileTimeErrorCode.CONST_EVAL_THROWS_IDBZE,
+  CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL,
+  CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING,
+  CompileTimeErrorCode.CONST_EVAL_TYPE_INT,
+  CompileTimeErrorCode.CONST_EVAL_TYPE_NUM,
+  CompileTimeErrorCode.CONST_FORMAL_PARAMETER,
+  CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE,
+  CompileTimeErrorCode
+      .CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY,
+  CompileTimeErrorCode.CONST_INSTANCE_FIELD,
+  CompileTimeErrorCode.CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS,
+  CompileTimeErrorCode.CONST_NOT_INITIALIZED,
+  CompileTimeErrorCode.CONST_WITH_INVALID_TYPE_PARAMETERS,
+  CompileTimeErrorCode.CONST_WITH_NON_CONST,
+  CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT,
+  CompileTimeErrorCode.CONST_WITH_NON_TYPE,
+  CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS,
+  CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR,
+  CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT,
+  CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER,
+  CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS,
+  CompileTimeErrorCode.DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR,
+  CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_DEFAULT,
+  CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_NAME,
+  CompileTimeErrorCode.DUPLICATE_DEFINITION,
+  CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE,
+  CompileTimeErrorCode.DUPLICATE_NAMED_ARGUMENT,
+  CompileTimeErrorCode.DUPLICATE_PART,
+  CompileTimeErrorCode.EXPORT_INTERNAL_LIBRARY,
+  CompileTimeErrorCode.EXPORT_OF_NON_LIBRARY,
+  CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS,
+  CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+  CompileTimeErrorCode.EXTENDS_ENUM,
+  CompileTimeErrorCode.EXTENDS_NON_CLASS,
+  CompileTimeErrorCode.EXTRA_ARGUMENT_TO_ASSERT,
+  CompileTimeErrorCode.EXTRA_POSITIONAL_ARGUMENTS,
+  CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS,
+  CompileTimeErrorCode.FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER,
+  CompileTimeErrorCode.FIELD_INITIALIZER_FACTORY_CONSTRUCTOR,
+  CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR,
+  CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR,
+  CompileTimeErrorCode.FINAL_INITIALIZED_MULTIPLE_TIMES,
+  CompileTimeErrorCode.GETTER_AND_METHOD_WITH_SAME_NAME,
+  CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS,
+  CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS,
+  CompileTimeErrorCode.IMPLEMENTS_DYNAMIC,
+  CompileTimeErrorCode.IMPLEMENTS_ENUM,
+  CompileTimeErrorCode.IMPLEMENTS_NON_CLASS,
+  CompileTimeErrorCode.IMPLEMENTS_REPEATED,
+  CompileTimeErrorCode.IMPLEMENTS_SUPER_CLASS,
+  CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER,
+  CompileTimeErrorCode.IMPORT_INTERNAL_LIBRARY,
+  CompileTimeErrorCode.IMPORT_OF_NON_LIBRARY,
+  CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES,
+  CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTENT_FIELD,
+  CompileTimeErrorCode.INITIALIZER_FOR_STATIC_FIELD,
+  CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD,
+  CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_STATIC_FIELD,
+  CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_FACTORY,
+  CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_STATIC,
+  CompileTimeErrorCode.INSTANTIATE_ENUM,
+  CompileTimeErrorCode.INVALID_ANNOTATION,
+  CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY,
+  CompileTimeErrorCode.INVALID_CONSTANT,
+  CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME,
+  CompileTimeErrorCode.INVALID_FACTORY_NAME_NOT_A_CLASS,
+  CompileTimeErrorCode.INVALID_IDENTIFIER_IN_ASYNC,
+  CompileTimeErrorCode.INVALID_MODIFIER_ON_CONSTRUCTOR,
+  CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER,
+  CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS,
+  CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_LIST,
+  CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP,
+  CompileTimeErrorCode.INVALID_URI,
+  CompileTimeErrorCode.LABEL_IN_OUTER_SCOPE,
+  CompileTimeErrorCode.LABEL_UNDEFINED,
+  CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME,
+  CompileTimeErrorCode.METHOD_AND_GETTER_WITH_SAME_NAME,
+  CompileTimeErrorCode.MISSING_CONST_IN_LIST_LITERAL,
+  CompileTimeErrorCode.MISSING_CONST_IN_MAP_LITERAL,
+  CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR,
+  CompileTimeErrorCode.MIXIN_DEFERRED_CLASS,
+  CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS,
+  CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT,
+  CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS,
+  CompileTimeErrorCode.MIXIN_OF_ENUM,
+  CompileTimeErrorCode.MIXIN_OF_NON_CLASS,
+  CompileTimeErrorCode.MIXIN_REFERENCES_SUPER,
+  CompileTimeErrorCode.MIXIN_WITH_NON_CLASS_SUPERCLASS,
+  CompileTimeErrorCode.MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS,
+  CompileTimeErrorCode.MULTIPLE_SUPER_INITIALIZERS,
+  CompileTimeErrorCode.NON_CONSTANT_ANNOTATION_CONSTRUCTOR,
+  CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION,
+  CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY,
+  CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE,
+  CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY,
+  CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT,
+  CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY,
+  CompileTimeErrorCode.NON_CONSTANT_MAP_KEY,
+  CompileTimeErrorCode.NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY,
+  CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE,
+  CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY,
+  CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER,
+  CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY,
+  CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT,
+  CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR,
+  CompileTimeErrorCode.NOT_ENOUGH_REQUIRED_ARGUMENTS,
+  CompileTimeErrorCode.NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS,
+  CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT,
+  CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT,
+  CompileTimeErrorCode.OBJECT_CANNOT_EXTEND_ANOTHER_CLASS,
+  CompileTimeErrorCode.OPTIONAL_PARAMETER_IN_OPERATOR,
+  CompileTimeErrorCode.PART_OF_NON_PART,
+  CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER,
+  CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT,
+  CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAMETER,
+  CompileTimeErrorCode.RECURSIVE_COMPILE_TIME_CONSTANT,
+  CompileTimeErrorCode.RECURSIVE_CONSTRUCTOR_REDIRECT,
+  CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT,
+  CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
+  CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS,
+  CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS,
+  CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_WITH,
+  CompileTimeErrorCode.REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR,
+  CompileTimeErrorCode.REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR,
+  CompileTimeErrorCode.REDIRECT_TO_MISSING_CONSTRUCTOR,
+  CompileTimeErrorCode.REDIRECT_TO_NON_CLASS,
+  CompileTimeErrorCode.REDIRECT_TO_NON_CONST_CONSTRUCTOR,
+  CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION,
+  CompileTimeErrorCode.RETHROW_OUTSIDE_CATCH,
+  CompileTimeErrorCode.RETURN_IN_GENERATIVE_CONSTRUCTOR,
+  CompileTimeErrorCode.RETURN_IN_GENERATOR,
+  CompileTimeErrorCode.SHARED_DEFERRED_PREFIX,
+  CompileTimeErrorCode.SUPER_INITIALIZER_IN_OBJECT,
+  CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT,
+  CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR,
+  CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF,
+  CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS,
+  CompileTimeErrorCode.UNDEFINED_CLASS,
+  CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER,
+  CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT,
+  CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER,
+  CompileTimeErrorCode.URI_DOES_NOT_EXIST,
+  CompileTimeErrorCode.URI_HAS_NOT_BEEN_GENERATED,
+  CompileTimeErrorCode.URI_WITH_INTERPOLATION,
+  CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR,
+  CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS,
+  CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER,
+  CompileTimeErrorCode.YIELD_EACH_IN_NON_GENERATOR,
+  CompileTimeErrorCode.YIELD_IN_NON_GENERATOR,
+  HintCode.ABSTRACT_SUPER_MEMBER_REFERENCE,
+  HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE,
+  HintCode.CAN_BE_NULL_AFTER_NULL_AWARE,
+  HintCode.DEAD_CODE,
+  HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH,
+  HintCode.DEAD_CODE_ON_CATCH_SUBTYPE,
+  HintCode.DEPRECATED_MEMBER_USE,
+  HintCode.DIVISION_OPTIMIZATION,
+  HintCode.DUPLICATE_IMPORT,
+  HintCode.FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE,
+  HintCode.FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE,
+  HintCode.IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION,
+  HintCode.INVALID_ASSIGNMENT,
+  HintCode.INVALID_FACTORY_ANNOTATION,
+  HintCode.INVALID_FACTORY_METHOD_DECL,
+  HintCode.INVALID_FACTORY_METHOD_IMPL,
+  HintCode.INVALID_METHOD_OVERRIDE_TYPE_PARAMETERS,
+  HintCode.INVALID_METHOD_OVERRIDE_TYPE_PARAMETER_BOUND,
+  HintCode.INVALID_USE_OF_PROTECTED_MEMBER,
+  HintCode.IS_DOUBLE,
+  HintCode.IS_INT,
+  HintCode.IS_NOT_DOUBLE,
+  HintCode.IS_NOT_INT,
+  HintCode.MISSING_JS_LIB_ANNOTATION,
+  HintCode.MISSING_REQUIRED_PARAM,
+  HintCode.MISSING_REQUIRED_PARAM_WITH_DETAILS,
+  HintCode.MISSING_RETURN,
+  HintCode.MUST_CALL_SUPER,
+  HintCode.NULL_AWARE_IN_CONDITION,
+  HintCode.OVERRIDE_EQUALS_BUT_NOT_HASH_CODE,
+  HintCode.OVERRIDE_ON_NON_OVERRIDING_FIELD,
+  HintCode.OVERRIDE_ON_NON_OVERRIDING_GETTER,
+  HintCode.OVERRIDE_ON_NON_OVERRIDING_METHOD,
+  HintCode.OVERRIDE_ON_NON_OVERRIDING_SETTER,
+  HintCode.PACKAGE_IMPORT_CONTAINS_DOT_DOT,
+  HintCode.TYPE_CHECK_IS_NOT_NULL,
+  HintCode.TYPE_CHECK_IS_NULL,
+  HintCode.UNDEFINED_GETTER,
+  HintCode.UNDEFINED_HIDDEN_NAME,
+  HintCode.UNDEFINED_METHOD,
+  HintCode.UNDEFINED_OPERATOR,
+  HintCode.UNDEFINED_SETTER,
+  HintCode.UNDEFINED_SHOWN_NAME,
+  HintCode.UNNECESSARY_CAST,
+  HintCode.UNNECESSARY_NO_SUCH_METHOD,
+  HintCode.UNNECESSARY_TYPE_CHECK_FALSE,
+  HintCode.UNNECESSARY_TYPE_CHECK_TRUE,
+  HintCode.UNUSED_CATCH_CLAUSE,
+  HintCode.UNUSED_CATCH_STACK,
+  HintCode.UNUSED_ELEMENT,
+  HintCode.UNUSED_FIELD,
+  HintCode.UNUSED_IMPORT,
+  HintCode.UNUSED_LOCAL_VARIABLE,
+  HintCode.UNUSED_SHOWN_NAME,
+  HintCode.USE_OF_VOID_RESULT,
+  HintCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD,
+  HtmlErrorCode.PARSE_ERROR,
+  HtmlWarningCode.INVALID_URI,
+  HtmlWarningCode.URI_DOES_NOT_EXIST,
+  ParserErrorCode.ABSTRACT_CLASS_MEMBER,
+  ParserErrorCode.ABSTRACT_ENUM,
+  ParserErrorCode.ABSTRACT_STATIC_METHOD,
+  ParserErrorCode.ABSTRACT_TOP_LEVEL_FUNCTION,
+  ParserErrorCode.ABSTRACT_TOP_LEVEL_VARIABLE,
+  ParserErrorCode.ABSTRACT_TYPEDEF,
+  ParserErrorCode.ANNOTATION_ON_ENUM_CONSTANT,
+  ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER,
+  ParserErrorCode.BREAK_OUTSIDE_OF_LOOP,
+  ParserErrorCode.CLASS_IN_CLASS,
+  ParserErrorCode.COLON_IN_PLACE_OF_IN,
+  ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE,
+  ParserErrorCode.CONST_AND_FINAL,
+  ParserErrorCode.CONST_AND_VAR,
+  ParserErrorCode.CONST_CLASS,
+  ParserErrorCode.CONST_CONSTRUCTOR_WITH_BODY,
+  ParserErrorCode.CONST_ENUM,
+  ParserErrorCode.CONST_FACTORY,
+  ParserErrorCode.CONST_METHOD,
+  ParserErrorCode.CONST_TYPEDEF,
+  ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP,
+  ParserErrorCode.CONTINUE_WITHOUT_LABEL_IN_CASE,
+  ParserErrorCode.DEPRECATED_CLASS_TYPE_ALIAS,
+  ParserErrorCode.DIRECTIVE_AFTER_DECLARATION,
+  ParserErrorCode.DUPLICATED_MODIFIER,
+  ParserErrorCode.DUPLICATE_LABEL_IN_SWITCH_STATEMENT,
+  ParserErrorCode.EMPTY_ENUM_BODY,
+  ParserErrorCode.ENUM_IN_CLASS,
+  ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND,
+  ParserErrorCode.EXPECTED_CASE_OR_DEFAULT,
+  ParserErrorCode.EXPECTED_CLASS_MEMBER,
+  ParserErrorCode.EXPECTED_EXECUTABLE,
+  ParserErrorCode.EXPECTED_LIST_OR_MAP_LITERAL,
+  ParserErrorCode.EXPECTED_STRING_LITERAL,
+  ParserErrorCode.EXPECTED_TOKEN,
+  ParserErrorCode.EXPECTED_TYPE_NAME,
+  ParserErrorCode.EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE,
+  ParserErrorCode.EXTERNAL_AFTER_CONST,
+  ParserErrorCode.EXTERNAL_AFTER_FACTORY,
+  ParserErrorCode.EXTERNAL_AFTER_STATIC,
+  ParserErrorCode.EXTERNAL_CLASS,
+  ParserErrorCode.EXTERNAL_CONSTRUCTOR_WITH_BODY,
+  ParserErrorCode.EXTERNAL_ENUM,
+  ParserErrorCode.EXTERNAL_FIELD,
+  ParserErrorCode.EXTERNAL_GETTER_WITH_BODY,
+  ParserErrorCode.EXTERNAL_METHOD_WITH_BODY,
+  ParserErrorCode.EXTERNAL_OPERATOR_WITH_BODY,
+  ParserErrorCode.EXTERNAL_SETTER_WITH_BODY,
+  ParserErrorCode.EXTERNAL_TYPEDEF,
+  ParserErrorCode.FACTORY_TOP_LEVEL_DECLARATION,
+  ParserErrorCode.FACTORY_WITHOUT_BODY,
+  ParserErrorCode.FACTORY_WITH_INITIALIZERS,
+  ParserErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR,
+  ParserErrorCode.FINAL_AND_VAR,
+  ParserErrorCode.FINAL_CLASS,
+  ParserErrorCode.FINAL_CONSTRUCTOR,
+  ParserErrorCode.FINAL_ENUM,
+  ParserErrorCode.FINAL_METHOD,
+  ParserErrorCode.FINAL_TYPEDEF,
+  ParserErrorCode.FUNCTION_TYPED_PARAMETER_VAR,
+  ParserErrorCode.GETTER_IN_FUNCTION,
+  ParserErrorCode.GETTER_WITH_PARAMETERS,
+  ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE,
+  ParserErrorCode.IMPLEMENTS_BEFORE_EXTENDS,
+  ParserErrorCode.IMPLEMENTS_BEFORE_WITH,
+  ParserErrorCode.IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE,
+  ParserErrorCode.INITIALIZED_VARIABLE_IN_FOR_EACH,
+  ParserErrorCode.INVALID_AWAIT_IN_FOR,
+  ParserErrorCode.INVALID_CODE_POINT,
+  ParserErrorCode.INVALID_COMMENT_REFERENCE,
+  ParserErrorCode.INVALID_HEX_ESCAPE,
+  ParserErrorCode.INVALID_LITERAL_IN_CONFIGURATION,
+  ParserErrorCode.INVALID_OPERATOR,
+  ParserErrorCode.INVALID_OPERATOR_FOR_SUPER,
+  ParserErrorCode.INVALID_STAR_AFTER_ASYNC,
+  ParserErrorCode.INVALID_SYNC,
+  ParserErrorCode.INVALID_UNICODE_ESCAPE,
+  ParserErrorCode.LIBRARY_DIRECTIVE_NOT_FIRST,
+  ParserErrorCode.LOCAL_FUNCTION_DECLARATION_MODIFIER,
+  ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR,
+  ParserErrorCode.MISSING_ASSIGNMENT_IN_INITIALIZER,
+  ParserErrorCode.MISSING_CATCH_OR_FINALLY,
+  ParserErrorCode.MISSING_CLASS_BODY,
+  ParserErrorCode.MISSING_CLOSING_PARENTHESIS,
+  ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE,
+  ParserErrorCode.MISSING_ENUM_BODY,
+  ParserErrorCode.MISSING_EXPRESSION_IN_INITIALIZER,
+  ParserErrorCode.MISSING_EXPRESSION_IN_THROW,
+  ParserErrorCode.MISSING_FUNCTION_BODY,
+  ParserErrorCode.MISSING_FUNCTION_PARAMETERS,
+  ParserErrorCode.MISSING_GET,
+  ParserErrorCode.MISSING_IDENTIFIER,
+  ParserErrorCode.MISSING_INITIALIZER,
+  ParserErrorCode.MISSING_KEYWORD_OPERATOR,
+  ParserErrorCode.MISSING_METHOD_PARAMETERS,
+  ParserErrorCode.MISSING_NAME_IN_LIBRARY_DIRECTIVE,
+  ParserErrorCode.MISSING_NAME_IN_PART_OF_DIRECTIVE,
+  ParserErrorCode.MISSING_PREFIX_IN_DEFERRED_IMPORT,
+  ParserErrorCode.MISSING_STAR_AFTER_SYNC,
+  ParserErrorCode.MISSING_STATEMENT,
+  ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP,
+  ParserErrorCode.MISSING_TYPEDEF_PARAMETERS,
+  ParserErrorCode.MISSING_VARIABLE_IN_FOR_EACH,
+  ParserErrorCode.MIXED_PARAMETER_GROUPS,
+  ParserErrorCode.MULTIPLE_EXTENDS_CLAUSES,
+  ParserErrorCode.MULTIPLE_IMPLEMENTS_CLAUSES,
+  ParserErrorCode.MULTIPLE_LIBRARY_DIRECTIVES,
+  ParserErrorCode.MULTIPLE_NAMED_PARAMETER_GROUPS,
+  ParserErrorCode.MULTIPLE_PART_OF_DIRECTIVES,
+  ParserErrorCode.MULTIPLE_POSITIONAL_PARAMETER_GROUPS,
+  ParserErrorCode.MULTIPLE_VARIABLES_IN_FOR_EACH,
+  ParserErrorCode.MULTIPLE_WITH_CLAUSES,
+  ParserErrorCode.NAMED_FUNCTION_EXPRESSION,
+  ParserErrorCode.NAMED_PARAMETER_OUTSIDE_GROUP,
+  ParserErrorCode.NATIVE_CLAUSE_IN_NON_SDK_CODE,
+  ParserErrorCode.NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE,
+  ParserErrorCode.NON_CONSTRUCTOR_FACTORY,
+  ParserErrorCode.NON_IDENTIFIER_LIBRARY_NAME,
+  ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART,
+  ParserErrorCode.NON_STRING_LITERAL_AS_URI,
+  ParserErrorCode.NON_USER_DEFINABLE_OPERATOR,
+  ParserErrorCode.NORMAL_BEFORE_OPTIONAL_PARAMETERS,
+  ParserErrorCode.NULLABLE_TYPE_IN_EXTENDS,
+  ParserErrorCode.NULLABLE_TYPE_IN_IMPLEMENTS,
+  ParserErrorCode.NULLABLE_TYPE_IN_WITH,
+  ParserErrorCode.NULLABLE_TYPE_PARAMETER,
+  ParserErrorCode.POSITIONAL_AFTER_NAMED_ARGUMENT,
+  ParserErrorCode.POSITIONAL_PARAMETER_OUTSIDE_GROUP,
+  ParserErrorCode.REDIRECTING_CONSTRUCTOR_WITH_BODY,
+  ParserErrorCode.REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR,
+  ParserErrorCode.SETTER_IN_FUNCTION,
+  ParserErrorCode.STATIC_AFTER_CONST,
+  ParserErrorCode.STATIC_AFTER_FINAL,
+  ParserErrorCode.STATIC_AFTER_VAR,
+  ParserErrorCode.STATIC_CONSTRUCTOR,
+  ParserErrorCode.STATIC_GETTER_WITHOUT_BODY,
+  ParserErrorCode.STATIC_OPERATOR,
+  ParserErrorCode.STATIC_SETTER_WITHOUT_BODY,
+  ParserErrorCode.STATIC_TOP_LEVEL_DECLARATION,
+  ParserErrorCode.SWITCH_HAS_CASE_AFTER_DEFAULT_CASE,
+  ParserErrorCode.SWITCH_HAS_MULTIPLE_DEFAULT_CASES,
+  ParserErrorCode.TOP_LEVEL_OPERATOR,
+  ParserErrorCode.TYPEDEF_IN_CLASS,
+  ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP,
+  ParserErrorCode.UNEXPECTED_TOKEN,
+  ParserErrorCode.VAR_AND_TYPE,
+  ParserErrorCode.VAR_AS_TYPE_NAME,
+  ParserErrorCode.VAR_CLASS,
+  ParserErrorCode.VAR_ENUM,
+  ParserErrorCode.VAR_RETURN_TYPE,
+  ParserErrorCode.VAR_TYPEDEF,
+  ParserErrorCode.VOID_PARAMETER,
+  ParserErrorCode.VOID_VARIABLE,
+  ParserErrorCode.WITH_BEFORE_EXTENDS,
+  ParserErrorCode.WITH_WITHOUT_EXTENDS,
+  ParserErrorCode.WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER,
+  ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP,
+  ScannerErrorCode.ILLEGAL_CHARACTER,
+  ScannerErrorCode.MISSING_DIGIT,
+  ScannerErrorCode.MISSING_HEX_DIGIT,
+  ScannerErrorCode.MISSING_QUOTE,
+  ScannerErrorCode.UNABLE_GET_CONTENT,
+  ScannerErrorCode.UNTERMINATED_MULTI_LINE_COMMENT,
+  ScannerErrorCode.UNTERMINATED_STRING_LITERAL,
+  StaticTypeWarningCode.EXPECTED_ONE_LIST_TYPE_ARGUMENTS,
+  StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS,
+  StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE,
+  StaticTypeWarningCode.FOR_IN_OF_INVALID_TYPE,
+  StaticTypeWarningCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE,
+  StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE,
+  StaticTypeWarningCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE,
+  StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE,
+  StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER,
+  StaticTypeWarningCode.INVALID_ASSIGNMENT,
+  StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION,
+  StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION,
+  StaticTypeWarningCode.NON_BOOL_CONDITION,
+  StaticTypeWarningCode.NON_BOOL_EXPRESSION,
+  StaticTypeWarningCode.NON_BOOL_NEGATION_EXPRESSION,
+  StaticTypeWarningCode.NON_BOOL_OPERAND,
+  StaticTypeWarningCode.NON_NULLABLE_FIELD_NOT_INITIALIZED,
+  StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT,
+  StaticTypeWarningCode.RETURN_OF_INVALID_TYPE,
+  StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS,
+  StaticTypeWarningCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND,
+  StaticTypeWarningCode.UNDEFINED_ENUM_CONSTANT,
+  StaticTypeWarningCode.UNDEFINED_FUNCTION,
+  StaticTypeWarningCode.UNDEFINED_GETTER,
+  StaticTypeWarningCode.UNDEFINED_METHOD,
+  StaticTypeWarningCode.UNDEFINED_METHOD_WITH_CONSTRUCTOR,
+  StaticTypeWarningCode.UNDEFINED_OPERATOR,
+  StaticTypeWarningCode.UNDEFINED_SETTER,
+  StaticTypeWarningCode.UNDEFINED_SUPER_GETTER,
+  StaticTypeWarningCode.UNDEFINED_SUPER_METHOD,
+  StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR,
+  StaticTypeWarningCode.UNDEFINED_SUPER_SETTER,
+  StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER,
+  StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS,
+  StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD,
+  StaticTypeWarningCode.YIELD_OF_INVALID_TYPE,
+  StaticWarningCode.AMBIGUOUS_IMPORT,
+  StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE,
+  StaticWarningCode.ASSIGNMENT_TO_CONST,
+  StaticWarningCode.ASSIGNMENT_TO_FINAL,
+  StaticWarningCode.ASSIGNMENT_TO_FINAL_NO_SETTER,
+  StaticWarningCode.ASSIGNMENT_TO_FUNCTION,
+  StaticWarningCode.ASSIGNMENT_TO_METHOD,
+  StaticWarningCode.ASSIGNMENT_TO_TYPE,
+  StaticWarningCode.CASE_BLOCK_NOT_TERMINATED,
+  StaticWarningCode.CAST_TO_NON_TYPE,
+  StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER,
+  StaticWarningCode.CONFLICTING_DART_IMPORT,
+  StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER,
+  StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER,
+  StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER2,
+  StaticWarningCode.CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER,
+  StaticWarningCode.CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER,
+  StaticWarningCode.CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER,
+  StaticWarningCode.CONST_WITH_ABSTRACT_CLASS,
+  StaticWarningCode.EQUAL_KEYS_IN_MAP,
+  StaticWarningCode.EXPORT_DUPLICATED_LIBRARY_NAMED,
+  StaticWarningCode.EXTRA_POSITIONAL_ARGUMENTS,
+  StaticWarningCode.FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION,
+  StaticWarningCode.FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR,
+  StaticWarningCode.FIELD_INITIALIZER_NOT_ASSIGNABLE,
+  StaticWarningCode.FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE,
+  StaticWarningCode.FINAL_NOT_INITIALIZED,
+  StaticWarningCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_1,
+  StaticWarningCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_2,
+  StaticWarningCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_3_PLUS,
+  StaticWarningCode.FUNCTION_WITHOUT_CALL,
+  StaticWarningCode.IMPORT_DUPLICATED_LIBRARY_NAMED,
+  StaticWarningCode.IMPORT_OF_NON_LIBRARY,
+  StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD,
+  StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC,
+  StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE,
+  StaticWarningCode.INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE,
+  StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE,
+  StaticWarningCode.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE,
+  StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE,
+  StaticWarningCode.INVALID_METHOD_OVERRIDE_TYPE_PARAMETERS,
+  StaticWarningCode.INVALID_METHOD_OVERRIDE_TYPE_PARAMETER_BOUND,
+  StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED,
+  StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL,
+  StaticWarningCode.INVALID_OVERRIDE_NAMED,
+  StaticWarningCode.INVALID_OVERRIDE_POSITIONAL,
+  StaticWarningCode.INVALID_OVERRIDE_REQUIRED,
+  StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE,
+  StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,
+  StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE,
+  StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE,
+  StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES,
+  StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE,
+  StaticWarningCode.MISSING_ENUM_CONSTANT_IN_SWITCH,
+  StaticWarningCode.MIXED_RETURN_TYPES,
+  StaticWarningCode.NEW_WITH_ABSTRACT_CLASS,
+  StaticWarningCode.NEW_WITH_INVALID_TYPE_PARAMETERS,
+  StaticWarningCode.NEW_WITH_NON_TYPE,
+  StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR,
+  StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT,
+  StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS,
+  StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR,
+  StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
+  StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE,
+  StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO,
+  StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE,
+  StaticWarningCode.NON_VOID_RETURN_FOR_OPERATOR,
+  StaticWarningCode.NON_VOID_RETURN_FOR_SETTER,
+  StaticWarningCode.NOT_A_TYPE,
+  StaticWarningCode.NOT_ENOUGH_REQUIRED_ARGUMENTS,
+  StaticWarningCode.PART_OF_DIFFERENT_LIBRARY,
+  StaticWarningCode.REDIRECT_TO_INVALID_FUNCTION_TYPE,
+  StaticWarningCode.REDIRECT_TO_INVALID_RETURN_TYPE,
+  StaticWarningCode.REDIRECT_TO_MISSING_CONSTRUCTOR,
+  StaticWarningCode.REDIRECT_TO_NON_CLASS,
+  StaticWarningCode.RETURN_WITHOUT_VALUE,
+  StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER,
+  StaticWarningCode.SWITCH_EXPRESSION_NOT_ASSIGNABLE,
+  StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS,
+  StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC,
+  StaticWarningCode.TYPE_TEST_WITH_NON_TYPE,
+  StaticWarningCode.TYPE_TEST_WITH_UNDEFINED_NAME,
+  StaticWarningCode.UNDEFINED_CLASS,
+  StaticWarningCode.UNDEFINED_CLASS_BOOLEAN,
+  StaticWarningCode.UNDEFINED_GETTER,
+  StaticWarningCode.UNDEFINED_IDENTIFIER,
+  StaticWarningCode.UNDEFINED_IDENTIFIER_AWAIT,
+  StaticWarningCode.UNDEFINED_NAMED_PARAMETER,
+  StaticWarningCode.UNDEFINED_SETTER,
+  StaticWarningCode.UNDEFINED_STATIC_METHOD_OR_GETTER,
+  StaticWarningCode.UNDEFINED_SUPER_GETTER,
+  StaticWarningCode.UNDEFINED_SUPER_SETTER,
+  StaticWarningCode.VOID_RETURN_FOR_GETTER,
+  StrongModeCode.ASSIGNMENT_CAST,
+  StrongModeCode.COULD_NOT_INFER,
+  StrongModeCode.DOWN_CAST_COMPOSITE,
+  StrongModeCode.DOWN_CAST_IMPLICIT,
+  StrongModeCode.DOWN_CAST_IMPLICIT_ASSIGN,
+  StrongModeCode.DYNAMIC_CAST,
+  StrongModeCode.DYNAMIC_INVOKE,
+  StrongModeCode.IMPLICIT_DYNAMIC_FIELD,
+  StrongModeCode.IMPLICIT_DYNAMIC_FUNCTION,
+  StrongModeCode.IMPLICIT_DYNAMIC_INVOKE,
+  StrongModeCode.IMPLICIT_DYNAMIC_LIST_LITERAL,
+  StrongModeCode.IMPLICIT_DYNAMIC_MAP_LITERAL,
+  StrongModeCode.IMPLICIT_DYNAMIC_METHOD,
+  StrongModeCode.IMPLICIT_DYNAMIC_PARAMETER,
+  StrongModeCode.IMPLICIT_DYNAMIC_RETURN,
+  StrongModeCode.IMPLICIT_DYNAMIC_TYPE,
+  StrongModeCode.IMPLICIT_DYNAMIC_VARIABLE,
+  StrongModeCode.INFERRED_TYPE,
+  StrongModeCode.INFERRED_TYPE_ALLOCATION,
+  StrongModeCode.INFERRED_TYPE_CLOSURE,
+  StrongModeCode.INFERRED_TYPE_LITERAL,
+  StrongModeCode.INVALID_CAST_LITERAL,
+  StrongModeCode.INVALID_CAST_LITERAL_LIST,
+  StrongModeCode.INVALID_CAST_LITERAL_MAP,
+  StrongModeCode.INVALID_CAST_FUNCTION_EXPR,
+  StrongModeCode.INVALID_CAST_NEW_EXPR,
+  StrongModeCode.INVALID_CAST_METHOD,
+  StrongModeCode.INVALID_CAST_FUNCTION,
+  StrongModeCode.INVALID_FIELD_OVERRIDE,
+  StrongModeCode.INVALID_METHOD_OVERRIDE,
+  StrongModeCode.INVALID_METHOD_OVERRIDE_FROM_BASE,
+  StrongModeCode.INVALID_METHOD_OVERRIDE_FROM_MIXIN,
+  StrongModeCode.INVALID_PARAMETER_DECLARATION,
+  StrongModeCode.INVALID_SUPER_INVOCATION,
+  StrongModeCode.NON_GROUND_TYPE_CHECK_INFO,
+  StrongModeCode.UNSAFE_BLOCK_CLOSURE_INFERENCE,
+  TodoCode.TODO,
+];
+
+/**
+ * The lazy initialized map from [ErrorCode.uniqueName] to the [ErrorCode]
+ * instance.
+ */
+HashMap<String, ErrorCode> _uniqueNameToCodeMap;
+
+/**
+ * Return the [ErrorCode] with the given [uniqueName], or `null` if not
+ * found.
+ */
+ErrorCode errorCodeByUniqueName(String uniqueName) {
+  if (_uniqueNameToCodeMap == null) {
+    _uniqueNameToCodeMap = new HashMap<String, ErrorCode>();
+    for (ErrorCode errorCode in errorCodeValues) {
+      _uniqueNameToCodeMap[errorCode.uniqueName] = errorCode;
+    }
+  }
+  return _uniqueNameToCodeMap[uniqueName];
+}
 
 /**
  * An error discovered during the analysis of some Dart code.
@@ -231,732 +853,6 @@
 }
 
 /**
- * An error code associated with an [AnalysisError].
- *
- * Generally, we want to provide messages that consist of three sentences. From
- * the user's perspective these sentences should explain:
- *
- * 1. what is wrong,
- * 2. why is it wrong, and
- * 3. how do I fix it.
- *
- * However, we combine the first two in the [message] and the last in the
- * [correction].
- *
- * When composing messages (including correction messages) keep the following
- * guidelines in mind.
- *
- * 1. The message should be a complete sentence starting with an uppercase
- * letter, and ending with a period.
- *
- * 2. Reserved words and embedded identifiers should be in single quotes, so
- * prefer double quotes for the complete message. For example,
- * ```
- * "The class '{0}' can't use 'super'."
- * ```
- * Notice that the word 'class' in the preceding message is not quoted as it
- * refers to the concept 'class', not the reserved word. On the other hand,
- * 'super' refers to the reserved word. Do not quote 'null' and numeric literals.
- *
- * 3. Do not try to compose messages, as it can make translating them hard.
- *
- * 4. Try to keep the error messages short, but informative.
- *
- * 5. Use simple words and terminology, assume the reader of the message doesn't
- * have an advanced degree in math, and that English is not the reader's native
- * language. Do not assume any formal computer science training. For example, do
- * not use Latin abbreviations (prefer "that is" over "i.e.", and "for example"
- * over "e.g."). Also avoid phrases such as "if and only if" and "iff"; that
- * level of precision is unnecessary.
- *
- * 6. Prefer contractions when they are in common use, for example, prefer
- * "can't" over "cannot". Using "cannot", "must not", "shall not", etc. is
- * off-putting to people new to programming.
- *
- * 7. Use common terminology, preferably from the Dart Language Specification.
- * This increases the user's chance of finding a good explanation on the web.
- *
- * 8. Do not try to be cute or funny. It is extremely frustrating to work on a
- * product that crashes with a "tongue-in-cheek" message, especially if you did
- * not want to use this product to begin with.
- *
- * 9. Do not lie, that is, do not write error messages containing phrases like
- * "can't happen".  If the user ever saw this message, it would be a lie. Prefer
- * messages like: "Internal error: This function should not be called when 'x'
- * is null.".
- *
- * 10. Prefer to not use the imperative tone. That is, the message should not
- * sound accusing or like it is ordering the user around. The computer should
- * describe the problem, not criticize the user for violating the specification.
- */
-abstract class ErrorCode {
-  /**
-   * Engine error code values.
-   */
-  static const List<ErrorCode> values = const [
-    //
-    // Manually generated. You can mostly reproduce this list by running the
-    // following command from the root of the analyzer package:
-    //
-    // > cat
-    //       lib/src/analysis_options/error/option_codes.dart';
-    //       lib/src/dart/error/hint_codes.dart';
-    //       lib/src/dart/error/lint_codes.dart';
-    //       lib/src/dart/error/todo_codes.dart';
-    //       lib/src/html/error/html_codes.dart';
-    //       lib/src/dart/error/syntactic_errors.dart
-    //       lib/src/error/codes.dart |
-    //     grep 'static const .*Code' |
-    //     awk '{print $3"."$4","}' |
-    //     sort > codes.txt
-    //
-    // There are a few error codes that are wrapped such that the name of the
-    // error code in on the line following the pattern we're grepping for. Those
-    // need to be filled in by hand.
-    //
-    AnalysisOptionsErrorCode.PARSE_ERROR,
-    AnalysisOptionsWarningCode.UNRECOGNIZED_ERROR_CODE,
-    AnalysisOptionsWarningCode.UNSUPPORTED_OPTION_WITH_LEGAL_VALUE,
-    AnalysisOptionsWarningCode.UNSUPPORTED_OPTION_WITH_LEGAL_VALUES,
-    AnalysisOptionsWarningCode.UNSUPPORTED_VALUE,
-    CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH,
-    CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
-    CheckedModeCompileTimeErrorCode.CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE,
-    CheckedModeCompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,
-    CheckedModeCompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE,
-    CheckedModeCompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE,
-    CheckedModeCompileTimeErrorCode.VARIABLE_TYPE_MISMATCH,
-    CompileTimeErrorCode.ACCESS_PRIVATE_ENUM_FIELD,
-    CompileTimeErrorCode.AMBIGUOUS_EXPORT,
-    CompileTimeErrorCode.ANNOTATION_WITH_NON_CLASS,
-    CompileTimeErrorCode.ARGUMENT_DEFINITION_TEST_NON_PARAMETER,
-    CompileTimeErrorCode.ASYNC_FOR_IN_WRONG_CONTEXT,
-    CompileTimeErrorCode.AWAIT_IN_WRONG_CONTEXT,
-    CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE,
-    CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME,
-    CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_NAME,
-    CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME,
-    CompileTimeErrorCode.CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS,
-    CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD,
-    CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD,
-    CompileTimeErrorCode.CONFLICTING_GETTER_AND_METHOD,
-    CompileTimeErrorCode.CONFLICTING_METHOD_AND_GETTER,
-    CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_CLASS,
-    CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER,
-    CompileTimeErrorCode.CONST_CONSTRUCTOR_THROWS_EXCEPTION,
-    CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_FIELD_INITIALIZED_BY_NON_CONST,
-    CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN,
-    CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER,
-    CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD,
-    CompileTimeErrorCode.CONST_DEFERRED_CLASS,
-    CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION,
-    CompileTimeErrorCode.CONST_EVAL_THROWS_IDBZE,
-    CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL,
-    CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING,
-    CompileTimeErrorCode.CONST_EVAL_TYPE_INT,
-    CompileTimeErrorCode.CONST_EVAL_TYPE_NUM,
-    CompileTimeErrorCode.CONST_FORMAL_PARAMETER,
-    CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE,
-    CompileTimeErrorCode
-        .CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY,
-    CompileTimeErrorCode.CONST_INSTANCE_FIELD,
-    CompileTimeErrorCode.CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS,
-    CompileTimeErrorCode.CONST_NOT_INITIALIZED,
-    CompileTimeErrorCode.CONST_WITH_INVALID_TYPE_PARAMETERS,
-    CompileTimeErrorCode.CONST_WITH_NON_CONST,
-    CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT,
-    CompileTimeErrorCode.CONST_WITH_NON_TYPE,
-    CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS,
-    CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR,
-    CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT,
-    CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER,
-    CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS,
-    CompileTimeErrorCode.DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR,
-    CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_DEFAULT,
-    CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_NAME,
-    CompileTimeErrorCode.DUPLICATE_DEFINITION,
-    CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE,
-    CompileTimeErrorCode.DUPLICATE_NAMED_ARGUMENT,
-    CompileTimeErrorCode.DUPLICATE_PART,
-    CompileTimeErrorCode.EXPORT_INTERNAL_LIBRARY,
-    CompileTimeErrorCode.EXPORT_OF_NON_LIBRARY,
-    CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS,
-    CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
-    CompileTimeErrorCode.EXTENDS_ENUM,
-    CompileTimeErrorCode.EXTENDS_NON_CLASS,
-    CompileTimeErrorCode.EXTRA_ARGUMENT_TO_ASSERT,
-    CompileTimeErrorCode.EXTRA_POSITIONAL_ARGUMENTS,
-    CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS,
-    CompileTimeErrorCode.FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER,
-    CompileTimeErrorCode.FIELD_INITIALIZER_FACTORY_CONSTRUCTOR,
-    CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR,
-    CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR,
-    CompileTimeErrorCode.FINAL_INITIALIZED_MULTIPLE_TIMES,
-    CompileTimeErrorCode.GETTER_AND_METHOD_WITH_SAME_NAME,
-    CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS,
-    CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS,
-    CompileTimeErrorCode.IMPLEMENTS_DYNAMIC,
-    CompileTimeErrorCode.IMPLEMENTS_ENUM,
-    CompileTimeErrorCode.IMPLEMENTS_NON_CLASS,
-    CompileTimeErrorCode.IMPLEMENTS_REPEATED,
-    CompileTimeErrorCode.IMPLEMENTS_SUPER_CLASS,
-    CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER,
-    CompileTimeErrorCode.IMPORT_INTERNAL_LIBRARY,
-    CompileTimeErrorCode.IMPORT_OF_NON_LIBRARY,
-    CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES,
-    CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTENT_FIELD,
-    CompileTimeErrorCode.INITIALIZER_FOR_STATIC_FIELD,
-    CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD,
-    CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_STATIC_FIELD,
-    CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_FACTORY,
-    CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_STATIC,
-    CompileTimeErrorCode.INSTANTIATE_ENUM,
-    CompileTimeErrorCode.INVALID_ANNOTATION,
-    CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY,
-    CompileTimeErrorCode.INVALID_CONSTANT,
-    CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME,
-    CompileTimeErrorCode.INVALID_FACTORY_NAME_NOT_A_CLASS,
-    CompileTimeErrorCode.INVALID_IDENTIFIER_IN_ASYNC,
-    CompileTimeErrorCode.INVALID_MODIFIER_ON_CONSTRUCTOR,
-    CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER,
-    CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS,
-    CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_LIST,
-    CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP,
-    CompileTimeErrorCode.INVALID_URI,
-    CompileTimeErrorCode.LABEL_IN_OUTER_SCOPE,
-    CompileTimeErrorCode.LABEL_UNDEFINED,
-    CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME,
-    CompileTimeErrorCode.METHOD_AND_GETTER_WITH_SAME_NAME,
-    CompileTimeErrorCode.MISSING_CONST_IN_LIST_LITERAL,
-    CompileTimeErrorCode.MISSING_CONST_IN_MAP_LITERAL,
-    CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR,
-    CompileTimeErrorCode.MIXIN_DEFERRED_CLASS,
-    CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS,
-    CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT,
-    CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS,
-    CompileTimeErrorCode.MIXIN_OF_ENUM,
-    CompileTimeErrorCode.MIXIN_OF_NON_CLASS,
-    CompileTimeErrorCode.MIXIN_REFERENCES_SUPER,
-    CompileTimeErrorCode.MIXIN_WITH_NON_CLASS_SUPERCLASS,
-    CompileTimeErrorCode.MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS,
-    CompileTimeErrorCode.MULTIPLE_SUPER_INITIALIZERS,
-    CompileTimeErrorCode.NON_CONSTANT_ANNOTATION_CONSTRUCTOR,
-    CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION,
-    CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY,
-    CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE,
-    CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY,
-    CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT,
-    CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY,
-    CompileTimeErrorCode.NON_CONSTANT_MAP_KEY,
-    CompileTimeErrorCode.NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY,
-    CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE,
-    CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY,
-    CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER,
-    CompileTimeErrorCode
-        .NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY,
-    CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT,
-    CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR,
-    CompileTimeErrorCode.NOT_ENOUGH_REQUIRED_ARGUMENTS,
-    CompileTimeErrorCode.NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS,
-    CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT,
-    CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT,
-    CompileTimeErrorCode.OBJECT_CANNOT_EXTEND_ANOTHER_CLASS,
-    CompileTimeErrorCode.OPTIONAL_PARAMETER_IN_OPERATOR,
-    CompileTimeErrorCode.PART_OF_NON_PART,
-    CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER,
-    CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT,
-    CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAMETER,
-    CompileTimeErrorCode.RECURSIVE_COMPILE_TIME_CONSTANT,
-    CompileTimeErrorCode.RECURSIVE_CONSTRUCTOR_REDIRECT,
-    CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT,
-    CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
-    CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS,
-    CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS,
-    CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_WITH,
-    CompileTimeErrorCode.REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR,
-    CompileTimeErrorCode.REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR,
-    CompileTimeErrorCode.REDIRECT_TO_MISSING_CONSTRUCTOR,
-    CompileTimeErrorCode.REDIRECT_TO_NON_CLASS,
-    CompileTimeErrorCode.REDIRECT_TO_NON_CONST_CONSTRUCTOR,
-    CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION,
-    CompileTimeErrorCode.RETHROW_OUTSIDE_CATCH,
-    CompileTimeErrorCode.RETURN_IN_GENERATIVE_CONSTRUCTOR,
-    CompileTimeErrorCode.RETURN_IN_GENERATOR,
-    CompileTimeErrorCode.SHARED_DEFERRED_PREFIX,
-    CompileTimeErrorCode.SUPER_INITIALIZER_IN_OBJECT,
-    CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT,
-    CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR,
-    CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF,
-    CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS,
-    CompileTimeErrorCode.UNDEFINED_CLASS,
-    CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER,
-    CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT,
-    CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER,
-    CompileTimeErrorCode.URI_DOES_NOT_EXIST,
-    CompileTimeErrorCode.URI_HAS_NOT_BEEN_GENERATED,
-    CompileTimeErrorCode.URI_WITH_INTERPOLATION,
-    CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR,
-    CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS,
-    CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER,
-    CompileTimeErrorCode.YIELD_EACH_IN_NON_GENERATOR,
-    CompileTimeErrorCode.YIELD_IN_NON_GENERATOR,
-    HintCode.ABSTRACT_SUPER_MEMBER_REFERENCE,
-    HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE,
-    HintCode.CAN_BE_NULL_AFTER_NULL_AWARE,
-    HintCode.DEAD_CODE,
-    HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH,
-    HintCode.DEAD_CODE_ON_CATCH_SUBTYPE,
-    HintCode.DEPRECATED_MEMBER_USE,
-    HintCode.DIVISION_OPTIMIZATION,
-    HintCode.DUPLICATE_IMPORT,
-    HintCode.FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE,
-    HintCode.FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE,
-    HintCode.IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION,
-    HintCode.INVALID_ASSIGNMENT,
-    HintCode.INVALID_FACTORY_ANNOTATION,
-    HintCode.INVALID_FACTORY_METHOD_DECL,
-    HintCode.INVALID_FACTORY_METHOD_IMPL,
-    HintCode.INVALID_USE_OF_PROTECTED_MEMBER,
-    HintCode.IS_DOUBLE,
-    HintCode.IS_INT,
-    HintCode.IS_NOT_DOUBLE,
-    HintCode.IS_NOT_INT,
-    HintCode.MISSING_JS_LIB_ANNOTATION,
-    HintCode.MISSING_REQUIRED_PARAM,
-    HintCode.MISSING_REQUIRED_PARAM_WITH_DETAILS,
-    HintCode.MISSING_RETURN,
-    HintCode.MUST_CALL_SUPER,
-    HintCode.NULL_AWARE_IN_CONDITION,
-    HintCode.OVERRIDE_EQUALS_BUT_NOT_HASH_CODE,
-    HintCode.OVERRIDE_ON_NON_OVERRIDING_FIELD,
-    HintCode.OVERRIDE_ON_NON_OVERRIDING_GETTER,
-    HintCode.OVERRIDE_ON_NON_OVERRIDING_METHOD,
-    HintCode.OVERRIDE_ON_NON_OVERRIDING_SETTER,
-    HintCode.PACKAGE_IMPORT_CONTAINS_DOT_DOT,
-    HintCode.TYPE_CHECK_IS_NOT_NULL,
-    HintCode.TYPE_CHECK_IS_NULL,
-    HintCode.UNDEFINED_GETTER,
-    HintCode.UNDEFINED_HIDDEN_NAME,
-    HintCode.UNDEFINED_METHOD,
-    HintCode.UNDEFINED_OPERATOR,
-    HintCode.UNDEFINED_SETTER,
-    HintCode.UNDEFINED_SHOWN_NAME,
-    HintCode.UNNECESSARY_CAST,
-    HintCode.UNNECESSARY_NO_SUCH_METHOD,
-    HintCode.UNNECESSARY_TYPE_CHECK_FALSE,
-    HintCode.UNNECESSARY_TYPE_CHECK_TRUE,
-    HintCode.UNUSED_CATCH_CLAUSE,
-    HintCode.UNUSED_CATCH_STACK,
-    HintCode.UNUSED_ELEMENT,
-    HintCode.UNUSED_FIELD,
-    HintCode.UNUSED_IMPORT,
-    HintCode.UNUSED_LOCAL_VARIABLE,
-    HintCode.UNUSED_SHOWN_NAME,
-    HintCode.USE_OF_VOID_RESULT,
-    HtmlErrorCode.PARSE_ERROR,
-    HtmlWarningCode.INVALID_URI,
-    HtmlWarningCode.URI_DOES_NOT_EXIST,
-    ParserErrorCode.ABSTRACT_CLASS_MEMBER,
-    ParserErrorCode.ABSTRACT_ENUM,
-    ParserErrorCode.ABSTRACT_STATIC_METHOD,
-    ParserErrorCode.ABSTRACT_TOP_LEVEL_FUNCTION,
-    ParserErrorCode.ABSTRACT_TOP_LEVEL_VARIABLE,
-    ParserErrorCode.ABSTRACT_TYPEDEF,
-    ParserErrorCode.ANNOTATION_ON_ENUM_CONSTANT,
-    ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER,
-    ParserErrorCode.BREAK_OUTSIDE_OF_LOOP,
-    ParserErrorCode.CLASS_IN_CLASS,
-    ParserErrorCode.COLON_IN_PLACE_OF_IN,
-    ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE,
-    ParserErrorCode.CONST_AND_FINAL,
-    ParserErrorCode.CONST_AND_VAR,
-    ParserErrorCode.CONST_CLASS,
-    ParserErrorCode.CONST_CONSTRUCTOR_WITH_BODY,
-    ParserErrorCode.CONST_ENUM,
-    ParserErrorCode.CONST_FACTORY,
-    ParserErrorCode.CONST_METHOD,
-    ParserErrorCode.CONST_TYPEDEF,
-    ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP,
-    ParserErrorCode.CONTINUE_WITHOUT_LABEL_IN_CASE,
-    ParserErrorCode.DEPRECATED_CLASS_TYPE_ALIAS,
-    ParserErrorCode.DIRECTIVE_AFTER_DECLARATION,
-    ParserErrorCode.DUPLICATED_MODIFIER,
-    ParserErrorCode.DUPLICATE_LABEL_IN_SWITCH_STATEMENT,
-    ParserErrorCode.EMPTY_ENUM_BODY,
-    ParserErrorCode.ENUM_IN_CLASS,
-    ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND,
-    ParserErrorCode.EXPECTED_CASE_OR_DEFAULT,
-    ParserErrorCode.EXPECTED_CLASS_MEMBER,
-    ParserErrorCode.EXPECTED_EXECUTABLE,
-    ParserErrorCode.EXPECTED_LIST_OR_MAP_LITERAL,
-    ParserErrorCode.EXPECTED_STRING_LITERAL,
-    ParserErrorCode.EXPECTED_TOKEN,
-    ParserErrorCode.EXPECTED_TYPE_NAME,
-    ParserErrorCode.EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE,
-    ParserErrorCode.EXTERNAL_AFTER_CONST,
-    ParserErrorCode.EXTERNAL_AFTER_FACTORY,
-    ParserErrorCode.EXTERNAL_AFTER_STATIC,
-    ParserErrorCode.EXTERNAL_CLASS,
-    ParserErrorCode.EXTERNAL_CONSTRUCTOR_WITH_BODY,
-    ParserErrorCode.EXTERNAL_ENUM,
-    ParserErrorCode.EXTERNAL_FIELD,
-    ParserErrorCode.EXTERNAL_GETTER_WITH_BODY,
-    ParserErrorCode.EXTERNAL_METHOD_WITH_BODY,
-    ParserErrorCode.EXTERNAL_OPERATOR_WITH_BODY,
-    ParserErrorCode.EXTERNAL_SETTER_WITH_BODY,
-    ParserErrorCode.EXTERNAL_TYPEDEF,
-    ParserErrorCode.FACTORY_TOP_LEVEL_DECLARATION,
-    ParserErrorCode.FACTORY_WITHOUT_BODY,
-    ParserErrorCode.FACTORY_WITH_INITIALIZERS,
-    ParserErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR,
-    ParserErrorCode.FINAL_AND_VAR,
-    ParserErrorCode.FINAL_CLASS,
-    ParserErrorCode.FINAL_CONSTRUCTOR,
-    ParserErrorCode.FINAL_ENUM,
-    ParserErrorCode.FINAL_METHOD,
-    ParserErrorCode.FINAL_TYPEDEF,
-    ParserErrorCode.FUNCTION_TYPED_PARAMETER_VAR,
-    ParserErrorCode.GETTER_IN_FUNCTION,
-    ParserErrorCode.GETTER_WITH_PARAMETERS,
-    ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE,
-    ParserErrorCode.IMPLEMENTS_BEFORE_EXTENDS,
-    ParserErrorCode.IMPLEMENTS_BEFORE_WITH,
-    ParserErrorCode.IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE,
-    ParserErrorCode.INITIALIZED_VARIABLE_IN_FOR_EACH,
-    ParserErrorCode.INVALID_AWAIT_IN_FOR,
-    ParserErrorCode.INVALID_CODE_POINT,
-    ParserErrorCode.INVALID_COMMENT_REFERENCE,
-    ParserErrorCode.INVALID_HEX_ESCAPE,
-    ParserErrorCode.INVALID_LITERAL_IN_CONFIGURATION,
-    ParserErrorCode.INVALID_OPERATOR,
-    ParserErrorCode.INVALID_OPERATOR_FOR_SUPER,
-    ParserErrorCode.INVALID_STAR_AFTER_ASYNC,
-    ParserErrorCode.INVALID_SYNC,
-    ParserErrorCode.INVALID_UNICODE_ESCAPE,
-    ParserErrorCode.LIBRARY_DIRECTIVE_NOT_FIRST,
-    ParserErrorCode.LOCAL_FUNCTION_DECLARATION_MODIFIER,
-    ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR,
-    ParserErrorCode.MISSING_ASSIGNMENT_IN_INITIALIZER,
-    ParserErrorCode.MISSING_CATCH_OR_FINALLY,
-    ParserErrorCode.MISSING_CLASS_BODY,
-    ParserErrorCode.MISSING_CLOSING_PARENTHESIS,
-    ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE,
-    ParserErrorCode.MISSING_ENUM_BODY,
-    ParserErrorCode.MISSING_EXPRESSION_IN_INITIALIZER,
-    ParserErrorCode.MISSING_EXPRESSION_IN_THROW,
-    ParserErrorCode.MISSING_FUNCTION_BODY,
-    ParserErrorCode.MISSING_FUNCTION_PARAMETERS,
-    ParserErrorCode.MISSING_GET,
-    ParserErrorCode.MISSING_IDENTIFIER,
-    ParserErrorCode.MISSING_INITIALIZER,
-    ParserErrorCode.MISSING_KEYWORD_OPERATOR,
-    ParserErrorCode.MISSING_METHOD_PARAMETERS,
-    ParserErrorCode.MISSING_NAME_IN_LIBRARY_DIRECTIVE,
-    ParserErrorCode.MISSING_NAME_IN_PART_OF_DIRECTIVE,
-    ParserErrorCode.MISSING_PREFIX_IN_DEFERRED_IMPORT,
-    ParserErrorCode.MISSING_STAR_AFTER_SYNC,
-    ParserErrorCode.MISSING_STATEMENT,
-    ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP,
-    ParserErrorCode.MISSING_TYPEDEF_PARAMETERS,
-    ParserErrorCode.MISSING_VARIABLE_IN_FOR_EACH,
-    ParserErrorCode.MIXED_PARAMETER_GROUPS,
-    ParserErrorCode.MULTIPLE_EXTENDS_CLAUSES,
-    ParserErrorCode.MULTIPLE_IMPLEMENTS_CLAUSES,
-    ParserErrorCode.MULTIPLE_LIBRARY_DIRECTIVES,
-    ParserErrorCode.MULTIPLE_NAMED_PARAMETER_GROUPS,
-    ParserErrorCode.MULTIPLE_PART_OF_DIRECTIVES,
-    ParserErrorCode.MULTIPLE_POSITIONAL_PARAMETER_GROUPS,
-    ParserErrorCode.MULTIPLE_VARIABLES_IN_FOR_EACH,
-    ParserErrorCode.MULTIPLE_WITH_CLAUSES,
-    ParserErrorCode.NAMED_FUNCTION_EXPRESSION,
-    ParserErrorCode.NAMED_PARAMETER_OUTSIDE_GROUP,
-    ParserErrorCode.NATIVE_CLAUSE_IN_NON_SDK_CODE,
-    ParserErrorCode.NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE,
-    ParserErrorCode.NON_CONSTRUCTOR_FACTORY,
-    ParserErrorCode.NON_IDENTIFIER_LIBRARY_NAME,
-    ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART,
-    ParserErrorCode.NON_STRING_LITERAL_AS_URI,
-    ParserErrorCode.NON_USER_DEFINABLE_OPERATOR,
-    ParserErrorCode.NORMAL_BEFORE_OPTIONAL_PARAMETERS,
-    ParserErrorCode.NULLABLE_TYPE_IN_EXTENDS,
-    ParserErrorCode.NULLABLE_TYPE_IN_IMPLEMENTS,
-    ParserErrorCode.NULLABLE_TYPE_IN_WITH,
-    ParserErrorCode.NULLABLE_TYPE_PARAMETER,
-    ParserErrorCode.POSITIONAL_AFTER_NAMED_ARGUMENT,
-    ParserErrorCode.POSITIONAL_PARAMETER_OUTSIDE_GROUP,
-    ParserErrorCode.REDIRECTING_CONSTRUCTOR_WITH_BODY,
-    ParserErrorCode.REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR,
-    ParserErrorCode.SETTER_IN_FUNCTION,
-    ParserErrorCode.STATIC_AFTER_CONST,
-    ParserErrorCode.STATIC_AFTER_FINAL,
-    ParserErrorCode.STATIC_AFTER_VAR,
-    ParserErrorCode.STATIC_CONSTRUCTOR,
-    ParserErrorCode.STATIC_GETTER_WITHOUT_BODY,
-    ParserErrorCode.STATIC_OPERATOR,
-    ParserErrorCode.STATIC_SETTER_WITHOUT_BODY,
-    ParserErrorCode.STATIC_TOP_LEVEL_DECLARATION,
-    ParserErrorCode.SWITCH_HAS_CASE_AFTER_DEFAULT_CASE,
-    ParserErrorCode.SWITCH_HAS_MULTIPLE_DEFAULT_CASES,
-    ParserErrorCode.TOP_LEVEL_OPERATOR,
-    ParserErrorCode.TYPEDEF_IN_CLASS,
-    ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP,
-    ParserErrorCode.UNEXPECTED_TOKEN,
-    ParserErrorCode.VAR_AND_TYPE,
-    ParserErrorCode.VAR_AS_TYPE_NAME,
-    ParserErrorCode.VAR_CLASS,
-    ParserErrorCode.VAR_ENUM,
-    ParserErrorCode.VAR_RETURN_TYPE,
-    ParserErrorCode.VAR_TYPEDEF,
-    ParserErrorCode.VOID_PARAMETER,
-    ParserErrorCode.VOID_VARIABLE,
-    ParserErrorCode.WITH_BEFORE_EXTENDS,
-    ParserErrorCode.WITH_WITHOUT_EXTENDS,
-    ParserErrorCode.WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER,
-    ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP,
-    ScannerErrorCode.ILLEGAL_CHARACTER,
-    ScannerErrorCode.MISSING_DIGIT,
-    ScannerErrorCode.MISSING_HEX_DIGIT,
-    ScannerErrorCode.MISSING_QUOTE,
-    ScannerErrorCode.UNABLE_GET_CONTENT,
-    ScannerErrorCode.UNTERMINATED_MULTI_LINE_COMMENT,
-    ScannerErrorCode.UNTERMINATED_STRING_LITERAL,
-    StaticTypeWarningCode.EXPECTED_ONE_LIST_TYPE_ARGUMENTS,
-    StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS,
-    StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE,
-    StaticTypeWarningCode.FOR_IN_OF_INVALID_TYPE,
-    StaticTypeWarningCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE,
-    StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE,
-    StaticTypeWarningCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE,
-    StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE,
-    StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER,
-    StaticTypeWarningCode.INVALID_ASSIGNMENT,
-    StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION,
-    StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION,
-    StaticTypeWarningCode.NON_BOOL_CONDITION,
-    StaticTypeWarningCode.NON_BOOL_EXPRESSION,
-    StaticTypeWarningCode.NON_BOOL_NEGATION_EXPRESSION,
-    StaticTypeWarningCode.NON_BOOL_OPERAND,
-    StaticTypeWarningCode.NON_NULLABLE_FIELD_NOT_INITIALIZED,
-    StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT,
-    StaticTypeWarningCode.RETURN_OF_INVALID_TYPE,
-    StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS,
-    StaticTypeWarningCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND,
-    StaticTypeWarningCode.UNDEFINED_ENUM_CONSTANT,
-    StaticTypeWarningCode.UNDEFINED_FUNCTION,
-    StaticTypeWarningCode.UNDEFINED_GETTER,
-    StaticTypeWarningCode.UNDEFINED_METHOD,
-    StaticTypeWarningCode.UNDEFINED_METHOD_WITH_CONSTRUCTOR,
-    StaticTypeWarningCode.UNDEFINED_OPERATOR,
-    StaticTypeWarningCode.UNDEFINED_SETTER,
-    StaticTypeWarningCode.UNDEFINED_SUPER_GETTER,
-    StaticTypeWarningCode.UNDEFINED_SUPER_METHOD,
-    StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR,
-    StaticTypeWarningCode.UNDEFINED_SUPER_SETTER,
-    StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER,
-    StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS,
-    StaticTypeWarningCode.YIELD_OF_INVALID_TYPE,
-    StaticWarningCode.AMBIGUOUS_IMPORT,
-    StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE,
-    StaticWarningCode.ASSIGNMENT_TO_CONST,
-    StaticWarningCode.ASSIGNMENT_TO_FINAL,
-    StaticWarningCode.ASSIGNMENT_TO_FINAL_NO_SETTER,
-    StaticWarningCode.ASSIGNMENT_TO_FUNCTION,
-    StaticWarningCode.ASSIGNMENT_TO_METHOD,
-    StaticWarningCode.ASSIGNMENT_TO_TYPE,
-    StaticWarningCode.CASE_BLOCK_NOT_TERMINATED,
-    StaticWarningCode.CAST_TO_NON_TYPE,
-    StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER,
-    StaticWarningCode.CONFLICTING_DART_IMPORT,
-    StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER,
-    StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER,
-    StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER2,
-    StaticWarningCode.CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER,
-    StaticWarningCode.CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER,
-    StaticWarningCode.CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER,
-    StaticWarningCode.CONST_WITH_ABSTRACT_CLASS,
-    StaticWarningCode.EQUAL_KEYS_IN_MAP,
-    StaticWarningCode.EXPORT_DUPLICATED_LIBRARY_NAMED,
-    StaticWarningCode.EXTRA_POSITIONAL_ARGUMENTS,
-    StaticWarningCode.FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION,
-    StaticWarningCode.FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR,
-    StaticWarningCode.FIELD_INITIALIZER_NOT_ASSIGNABLE,
-    StaticWarningCode.FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE,
-    StaticWarningCode.FINAL_NOT_INITIALIZED,
-    StaticWarningCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_1,
-    StaticWarningCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_2,
-    StaticWarningCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_3_PLUS,
-    StaticWarningCode.FUNCTION_WITHOUT_CALL,
-    StaticWarningCode.IMPORT_DUPLICATED_LIBRARY_NAMED,
-    StaticWarningCode.IMPORT_OF_NON_LIBRARY,
-    StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD,
-    StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC,
-    StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE,
-    StaticWarningCode.INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE,
-    StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE,
-    StaticWarningCode.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE,
-    StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE,
-    StaticWarningCode.INVALID_METHOD_OVERRIDE_TYPE_PARAMETERS,
-    StaticWarningCode.INVALID_METHOD_OVERRIDE_TYPE_PARAMETER_BOUND,
-    StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED,
-    StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL,
-    StaticWarningCode.INVALID_OVERRIDE_NAMED,
-    StaticWarningCode.INVALID_OVERRIDE_POSITIONAL,
-    StaticWarningCode.INVALID_OVERRIDE_REQUIRED,
-    StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE,
-    StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,
-    StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE,
-    StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE,
-    StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES,
-    StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE,
-    StaticWarningCode.MISSING_ENUM_CONSTANT_IN_SWITCH,
-    StaticWarningCode.MIXED_RETURN_TYPES,
-    StaticWarningCode.NEW_WITH_ABSTRACT_CLASS,
-    StaticWarningCode.NEW_WITH_INVALID_TYPE_PARAMETERS,
-    StaticWarningCode.NEW_WITH_NON_TYPE,
-    StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR,
-    StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT,
-    StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS,
-    StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR,
-    StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
-    StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE,
-    StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO,
-    StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE,
-    StaticWarningCode.NON_VOID_RETURN_FOR_OPERATOR,
-    StaticWarningCode.NON_VOID_RETURN_FOR_SETTER,
-    StaticWarningCode.NOT_A_TYPE,
-    StaticWarningCode.NOT_ENOUGH_REQUIRED_ARGUMENTS,
-    StaticWarningCode.PART_OF_DIFFERENT_LIBRARY,
-    StaticWarningCode.REDIRECT_TO_INVALID_FUNCTION_TYPE,
-    StaticWarningCode.REDIRECT_TO_INVALID_RETURN_TYPE,
-    StaticWarningCode.REDIRECT_TO_MISSING_CONSTRUCTOR,
-    StaticWarningCode.REDIRECT_TO_NON_CLASS,
-    StaticWarningCode.RETURN_WITHOUT_VALUE,
-    StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER,
-    StaticWarningCode.SWITCH_EXPRESSION_NOT_ASSIGNABLE,
-    StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS,
-    StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC,
-    StaticWarningCode.TYPE_TEST_WITH_NON_TYPE,
-    StaticWarningCode.TYPE_TEST_WITH_UNDEFINED_NAME,
-    StaticWarningCode.UNDEFINED_CLASS,
-    StaticWarningCode.UNDEFINED_CLASS_BOOLEAN,
-    StaticWarningCode.UNDEFINED_GETTER,
-    StaticWarningCode.UNDEFINED_IDENTIFIER,
-    StaticWarningCode.UNDEFINED_IDENTIFIER_AWAIT,
-    StaticWarningCode.UNDEFINED_NAMED_PARAMETER,
-    StaticWarningCode.UNDEFINED_SETTER,
-    StaticWarningCode.UNDEFINED_STATIC_METHOD_OR_GETTER,
-    StaticWarningCode.UNDEFINED_SUPER_GETTER,
-    StaticWarningCode.UNDEFINED_SUPER_SETTER,
-    StaticWarningCode.VOID_RETURN_FOR_GETTER,
-    StrongModeCode.ASSIGNMENT_CAST,
-    StrongModeCode.COULD_NOT_INFER,
-    StrongModeCode.DOWN_CAST_COMPOSITE,
-    StrongModeCode.DOWN_CAST_IMPLICIT,
-    StrongModeCode.DOWN_CAST_IMPLICIT_ASSIGN,
-    StrongModeCode.DYNAMIC_CAST,
-    StrongModeCode.DYNAMIC_INVOKE,
-    StrongModeCode.IMPLICIT_DYNAMIC_FIELD,
-    StrongModeCode.IMPLICIT_DYNAMIC_FUNCTION,
-    StrongModeCode.IMPLICIT_DYNAMIC_INVOKE,
-    StrongModeCode.IMPLICIT_DYNAMIC_LIST_LITERAL,
-    StrongModeCode.IMPLICIT_DYNAMIC_MAP_LITERAL,
-    StrongModeCode.IMPLICIT_DYNAMIC_METHOD,
-    StrongModeCode.IMPLICIT_DYNAMIC_PARAMETER,
-    StrongModeCode.IMPLICIT_DYNAMIC_RETURN,
-    StrongModeCode.IMPLICIT_DYNAMIC_TYPE,
-    StrongModeCode.IMPLICIT_DYNAMIC_VARIABLE,
-    StrongModeCode.INFERRED_TYPE,
-    StrongModeCode.INFERRED_TYPE_ALLOCATION,
-    StrongModeCode.INFERRED_TYPE_CLOSURE,
-    StrongModeCode.INFERRED_TYPE_LITERAL,
-    StrongModeCode.INVALID_CAST_LITERAL,
-    StrongModeCode.INVALID_CAST_LITERAL_LIST,
-    StrongModeCode.INVALID_CAST_LITERAL_MAP,
-    StrongModeCode.INVALID_CAST_FUNCTION_EXPR,
-    StrongModeCode.INVALID_CAST_NEW_EXPR,
-    StrongModeCode.INVALID_CAST_METHOD,
-    StrongModeCode.INVALID_CAST_FUNCTION,
-    StrongModeCode.INVALID_FIELD_OVERRIDE,
-    StrongModeCode.INVALID_METHOD_OVERRIDE,
-    StrongModeCode.INVALID_METHOD_OVERRIDE_FROM_BASE,
-    StrongModeCode.INVALID_METHOD_OVERRIDE_FROM_MIXIN,
-    StrongModeCode.INVALID_PARAMETER_DECLARATION,
-    StrongModeCode.INVALID_SUPER_INVOCATION,
-    StrongModeCode.NON_GROUND_TYPE_CHECK_INFO,
-    StrongModeCode.UNSAFE_BLOCK_CLOSURE_INFERENCE,
-    TodoCode.TODO,
-  ];
-
-  /**
-   * The lazy initialized map from [uniqueName] to the [ErrorCode] instance.
-   */
-  static HashMap<String, ErrorCode> _uniqueNameToCodeMap;
-
-  /**
-   * An empty list of error codes.
-   */
-  static const List<ErrorCode> EMPTY_LIST = const <ErrorCode>[];
-
-  /**
-   * The name of the error code.
-   */
-  final String name;
-
-  /**
-   * The template used to create the message to be displayed for this error. The
-   * message should indicate what is wrong and why it is wrong.
-   */
-  final String message;
-
-  /**
-   * The template used to create the correction to be displayed for this error,
-   * or `null` if there is no correction information for this error. The
-   * correction should indicate how the user can fix the error.
-   */
-  final String correction;
-
-  /**
-   * Initialize a newly created error code to have the given [name]. The message
-   * associated with the error will be created from the given [message]
-   * template. The correction associated with the error will be created from the
-   * given [correction] template.
-   */
-  const ErrorCode(this.name, this.message, [this.correction]);
-
-  /**
-   * The severity of the error.
-   */
-  ErrorSeverity get errorSeverity;
-
-  /**
-   * The type of the error.
-   */
-  ErrorType get type;
-
-  /**
-   * The unique name of this error code.
-   */
-  String get uniqueName => "$runtimeType.$name";
-
-  @override
-  String toString() => uniqueName;
-
-  /**
-   * Return the [ErrorCode] with the given [uniqueName], or `null` if not
-   * found.
-   */
-  static ErrorCode byUniqueName(String uniqueName) {
-    if (_uniqueNameToCodeMap == null) {
-      _uniqueNameToCodeMap = new HashMap<String, ErrorCode>();
-      for (ErrorCode errorCode in values) {
-        _uniqueNameToCodeMap[errorCode.uniqueName] = errorCode;
-      }
-    }
-    return _uniqueNameToCodeMap[uniqueName];
-  }
-}
-
-/**
  * The properties that can be associated with an [AnalysisError].
  */
 class ErrorProperty<V> implements Comparable<ErrorProperty> {
@@ -1009,177 +905,3 @@
   @override
   String toString() => name;
 }
-
-/**
- * The severity of an [ErrorCode].
- */
-class ErrorSeverity implements Comparable<ErrorSeverity> {
-  /**
-   * The severity representing a non-error. This is never used for any error
-   * code, but is useful for clients.
-   */
-  static const ErrorSeverity NONE = const ErrorSeverity('NONE', 0, " ", "none");
-
-  /**
-   * The severity representing an informational level analysis issue.
-   */
-  static const ErrorSeverity INFO = const ErrorSeverity('INFO', 1, "I", "info");
-
-  /**
-   * The severity representing a warning. Warnings can become errors if the `-Werror` command
-   * line flag is specified.
-   */
-  static const ErrorSeverity WARNING =
-      const ErrorSeverity('WARNING', 2, "W", "warning");
-
-  /**
-   * The severity representing an error.
-   */
-  static const ErrorSeverity ERROR =
-      const ErrorSeverity('ERROR', 3, "E", "error");
-
-  static const List<ErrorSeverity> values = const [NONE, INFO, WARNING, ERROR];
-
-  /**
-   * The name of this error code.
-   */
-  final String name;
-
-  /**
-   * The ordinal value of the error code.
-   */
-  final int ordinal;
-
-  /**
-   * The name of the severity used when producing machine output.
-   */
-  final String machineCode;
-
-  /**
-   * The name of the severity used when producing readable output.
-   */
-  final String displayName;
-
-  /**
-   * Initialize a newly created severity with the given names.
-   */
-  const ErrorSeverity(
-      this.name, this.ordinal, this.machineCode, this.displayName);
-
-  @override
-  int get hashCode => ordinal;
-
-  @override
-  int compareTo(ErrorSeverity other) => ordinal - other.ordinal;
-
-  /**
-   * Return the severity constant that represents the greatest severity.
-   */
-  ErrorSeverity max(ErrorSeverity severity) =>
-      this.ordinal >= severity.ordinal ? this : severity;
-
-  @override
-  String toString() => name;
-}
-
-/**
- * The type of an [ErrorCode].
- */
-class ErrorType implements Comparable<ErrorType> {
-  /**
-   * Task (todo) comments in user code.
-   */
-  static const ErrorType TODO = const ErrorType('TODO', 0, ErrorSeverity.INFO);
-
-  /**
-   * Extra analysis run over the code to follow best practices, which are not in
-   * the Dart Language Specification.
-   */
-  static const ErrorType HINT = const ErrorType('HINT', 1, ErrorSeverity.INFO);
-
-  /**
-   * Compile-time errors are errors that preclude execution. A compile time
-   * error must be reported by a Dart compiler before the erroneous code is
-   * executed.
-   */
-  static const ErrorType COMPILE_TIME_ERROR =
-      const ErrorType('COMPILE_TIME_ERROR', 2, ErrorSeverity.ERROR);
-
-  /**
-   * Checked mode compile-time errors are errors that preclude execution in
-   * checked mode.
-   */
-  static const ErrorType CHECKED_MODE_COMPILE_TIME_ERROR = const ErrorType(
-      'CHECKED_MODE_COMPILE_TIME_ERROR', 3, ErrorSeverity.ERROR);
-
-  /**
-   * Static warnings are those warnings reported by the static checker. They
-   * have no effect on execution. Static warnings must be provided by Dart
-   * compilers used during development.
-   */
-  static const ErrorType STATIC_WARNING =
-      const ErrorType('STATIC_WARNING', 4, ErrorSeverity.WARNING);
-
-  /**
-   * Many, but not all, static warnings relate to types, in which case they are
-   * known as static type warnings.
-   */
-  static const ErrorType STATIC_TYPE_WARNING =
-      const ErrorType('STATIC_TYPE_WARNING', 5, ErrorSeverity.WARNING);
-
-  /**
-   * Syntactic errors are errors produced as a result of input that does not
-   * conform to the grammar.
-   */
-  static const ErrorType SYNTACTIC_ERROR =
-      const ErrorType('SYNTACTIC_ERROR', 6, ErrorSeverity.ERROR);
-
-  /**
-   * Lint warnings describe style and best practice recommendations that can be
-   * used to formalize a project's style guidelines.
-   */
-  static const ErrorType LINT = const ErrorType('LINT', 7, ErrorSeverity.INFO);
-
-  static const List<ErrorType> values = const [
-    TODO,
-    HINT,
-    COMPILE_TIME_ERROR,
-    CHECKED_MODE_COMPILE_TIME_ERROR,
-    STATIC_WARNING,
-    STATIC_TYPE_WARNING,
-    SYNTACTIC_ERROR,
-    LINT
-  ];
-
-  /**
-   * The name of this error type.
-   */
-  final String name;
-
-  /**
-   * The ordinal value of the error type.
-   */
-  final int ordinal;
-
-  /**
-   * The severity of this type of error.
-   */
-  final ErrorSeverity severity;
-
-  /**
-   * Initialize a newly created error type to have the given [name] and
-   * [severity].
-   */
-  const ErrorType(this.name, this.ordinal, this.severity);
-
-  String get displayName => name.toLowerCase().replaceAll('_', ' ');
-
-  @override
-  int get hashCode => ordinal;
-
-  @override
-  int compareTo(ErrorType other) => ordinal - other.ordinal;
-
-  @override
-  String toString() => name;
-}
diff --git a/pkg/analyzer/lib/file_system/file_system.dart b/pkg/analyzer/lib/file_system/file_system.dart
index ac8c0db..139330b 100644
--- a/pkg/analyzer/lib/file_system/file_system.dart
+++ b/pkg/analyzer/lib/file_system/file_system.dart
@@ -21,8 +21,14 @@
   Stream<WatchEvent> get changes;
 
   /**
+   * Synchronously get the length of the file.
+   * Throws a [FileSystemException] if the operation fails.
+   */
+  int get lengthSync;
+
+  /**
    * Return the last-modified stamp of the file.
-   * Throws [FileSystemException] if the file does not exist.
+   * Throws a [FileSystemException] if the file does not exist.
    */
   int get modificationStamp;
 
diff --git a/pkg/analyzer/lib/file_system/memory_file_system.dart b/pkg/analyzer/lib/file_system/memory_file_system.dart
index 44f8a06..42731be 100644
--- a/pkg/analyzer/lib/file_system/memory_file_system.dart
+++ b/pkg/analyzer/lib/file_system/memory_file_system.dart
@@ -306,6 +306,11 @@
   bool get exists => false;
 
   @override
+  int get lengthSync {
+    throw new FileSystemException(path, 'File could not be read');
+  }
+
+  @override
   int get modificationStamp {
     int stamp = _provider._pathToTimestamp[path];
     if (stamp == null) {
@@ -371,6 +376,11 @@
   bool get exists => _provider._pathToResource[path] is _MemoryFile;
 
   @override
+  int get lengthSync {
+    return readAsBytesSync().length;
+  }
+
+  @override
   int get modificationStamp {
     int stamp = _provider._pathToTimestamp[path];
     if (stamp == null) {
diff --git a/pkg/analyzer/lib/file_system/physical_file_system.dart b/pkg/analyzer/lib/file_system/physical_file_system.dart
index a9cf94b..411d0d1 100644
--- a/pkg/analyzer/lib/file_system/physical_file_system.dart
+++ b/pkg/analyzer/lib/file_system/physical_file_system.dart
@@ -127,6 +127,15 @@
   Stream<WatchEvent> get changes => new FileWatcher(_entry.path).events;
 
   @override
+  int get lengthSync {
+    try {
+      return _file.lengthSync();
+    } on io.FileSystemException catch (exception) {
+      throw new FileSystemException(exception.path, exception.message);
+    }
+  }
+
+  @override
   int get modificationStamp {
     try {
       return _file.lastModifiedSync().millisecondsSinceEpoch;
diff --git a/pkg/analyzer/lib/src/context/context.dart b/pkg/analyzer/lib/src/context/context.dart
index d0a2104..c09171c 100644
--- a/pkg/analyzer/lib/src/context/context.dart
+++ b/pkg/analyzer/lib/src/context/context.dart
@@ -307,7 +307,8 @@
         this._options.enableStrictCallChecks !=
             options.enableStrictCallChecks ||
         this._options.enableGenericMethods != options.enableGenericMethods ||
-        this._options.enableSuperMixins != options.enableSuperMixins;
+        this._options.enableSuperMixins != options.enableSuperMixins ||
+        this._options.patchPlatform != options.patchPlatform;
     this._options.analyzeFunctionBodiesPredicate =
         options.analyzeFunctionBodiesPredicate;
     this._options.generateImplicitErrors = options.generateImplicitErrors;
@@ -336,6 +337,7 @@
     this._options.trackCacheDependencies = options.trackCacheDependencies;
     this._options.disableCacheFlushing = options.disableCacheFlushing;
     this._options.finerGrainedInvalidation = options.finerGrainedInvalidation;
+    this._options.patchPlatform = options.patchPlatform;
     if (options is AnalysisOptionsImpl) {
       this._options.strongModeHints = options.strongModeHints;
       this._options.implicitCasts = options.implicitCasts;
@@ -720,6 +722,12 @@
     CacheEntry entry = getCacheEntry(target);
     CacheState state = entry.getState(descriptor);
     if (state == CacheState.FLUSHED || state == CacheState.INVALID) {
+      // Check the result provider.
+      bool success = aboutToComputeResult(entry, descriptor);
+      if (success) {
+        return entry.getValue(descriptor);
+      }
+      // Compute the result.
       driver.computeResult(target, descriptor);
       entry = getCacheEntry(target);
     }
diff --git a/pkg/analyzer/lib/src/dart/analysis/byte_store.dart b/pkg/analyzer/lib/src/dart/analysis/byte_store.dart
index fb07ac0..e8079ee 100644
--- a/pkg/analyzer/lib/src/dart/analysis/byte_store.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/byte_store.dart
@@ -30,40 +30,65 @@
 }
 
 /**
- * A wrapper around [ByteStore] which adds an in-memory LRU cache to it.
- *
- * TODO(scheglov) Consider implementing size and/or time eviction policies.
+ * [ByteStore] which stores data only in memory.
  */
-class MemoryCachingByteStore implements ByteStore {
-  final ByteStore store;
-  final int maxEntries;
-
-  final _map = <String, List<int>>{};
-  final _keys = new LinkedHashSet<String>();
-
-  MemoryCachingByteStore(this.store, this.maxEntries);
+class MemoryByteStore implements ByteStore {
+  final Map<String, List<int>> _map = {};
 
   @override
   List<int> get(String key) {
-    _keys.remove(key);
-    _keys.add(key);
-    _evict();
-    return _map.putIfAbsent(key, () => store.get(key));
+    return _map[key];
   }
 
   @override
   void put(String key, List<int> bytes) {
-    store.put(key, bytes);
     _map[key] = bytes;
-    _keys.add(key);
+  }
+}
+
+/**
+ * A wrapper around [ByteStore] which adds an in-memory LRU cache to it.
+ */
+class MemoryCachingByteStore implements ByteStore {
+  final ByteStore _store;
+  final int _maxSizeBytes;
+
+  final _map = new LinkedHashMap<String, List<int>>();
+  int _currentSizeBytes = 0;
+
+  MemoryCachingByteStore(this._store, this._maxSizeBytes);
+
+  @override
+  List<int> get(String key) {
+    List<int> bytes = _map.remove(key);
+    if (bytes == null) {
+      bytes = _store.get(key);
+      _map[key] = bytes;
+      _currentSizeBytes += bytes?.length ?? 0;
+      _evict();
+    } else {
+      _map[key] = bytes;
+    }
+    return bytes;
+  }
+
+  @override
+  void put(String key, List<int> bytes) {
+    _store.put(key, bytes);
+    _currentSizeBytes -= _map[key]?.length ?? 0;
+    _map[key] = bytes;
+    _currentSizeBytes += bytes.length;
     _evict();
   }
 
   void _evict() {
-    if (_keys.length > maxEntries) {
-      String key = _keys.first;
-      _keys.remove(key);
-      _map.remove(key);
+    while (_currentSizeBytes > _maxSizeBytes) {
+      if (_map.isEmpty) {
+        break;
+      }
+      String key = _map.keys.first;
+      List<int> bytes = _map.remove(key);
+      _currentSizeBytes -= bytes.length;
     }
   }
 }
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index ee355c4..f18e767 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -13,6 +13,7 @@
 import 'package:analyzer/src/context/context.dart';
 import 'package:analyzer/src/dart/analysis/byte_store.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
+import 'package:analyzer/src/dart/analysis/status.dart';
 import 'package:analyzer/src/generated/engine.dart'
     show AnalysisContext, AnalysisEngine, AnalysisOptions, ChangeSet;
 import 'package:analyzer/src/generated/source.dart';
@@ -66,9 +67,22 @@
   /**
    * The version of data format, should be incremented on every format change.
    */
-  static const int DATA_VERSION = 1;
+  static const int DATA_VERSION = 5;
 
+  /**
+   * The name of the driver, e.g. the name of the folder.
+   */
   String name;
+
+  /**
+   * The scheduler that schedules analysis work in this, and possibly other
+   * analysis drivers.
+   */
+  final AnalysisDriverScheduler _scheduler;
+
+  /**
+   * The logger to write performed operations and performance to.
+   */
   final PerformanceLog _logger;
 
   /**
@@ -103,7 +117,8 @@
   /**
    * The salt to mix into all hashes used as keys for serialized data.
    */
-  final Uint32List _salt = new Uint32List(2);
+  final Uint32List _salt =
+      new Uint32List(1 + AnalysisOptions.crossContextOptionsLength);
 
   /**
    * The current file system state.
@@ -144,24 +159,31 @@
   final _filesToAnalyze = new LinkedHashSet<String>();
 
   /**
+   * The mapping from the files for which analysis was requested using
+   * [getResult], and which were found to be parts without known libraries,
+   * to the [Completer]s to report the result.
+   */
+  final _requestedParts = <String, List<Completer<AnalysisResult>>>{};
+
+  /**
+   * The set of part files that are currently scheduled for analysis.
+   */
+  final _partsToAnalyze = new LinkedHashSet<String>();
+
+  /**
+   * The controller for the [results] stream.
+   */
+  final _resultController = new StreamController<AnalysisResult>();
+
+  /**
    * Mapping from library URIs to the dependency signature of the library.
    */
   final _dependencySignatureMap = <Uri, String>{};
 
   /**
-   * The monitor that is signalled when there is work to do.
+   * The instance of the status helper.
    */
-  final _Monitor _hasWork = new _Monitor();
-
-  /**
-   * The controller for the [status] stream.
-   */
-  final _statusController = new StreamController<AnalysisStatus>();
-
-  /**
-   * The last status sent to the [status] stream.
-   */
-  AnalysisStatus _currentStatus = AnalysisStatus.IDLE;
+  final StatusSupport _statusSupport = new StatusSupport();
 
   /**
    * Create a new instance of [AnalysisDriver].
@@ -169,16 +191,33 @@
    * The given [SourceFactory] is cloned to ensure that it does not contain a
    * reference to a [AnalysisContext] in which it could have been used.
    */
-  AnalysisDriver(this._logger, this._resourceProvider, this._byteStore,
-      this._contentOverlay, SourceFactory sourceFactory, this._analysisOptions)
+  AnalysisDriver(
+      this._scheduler,
+      this._logger,
+      this._resourceProvider,
+      this._byteStore,
+      this._contentOverlay,
+      SourceFactory sourceFactory,
+      this._analysisOptions)
       : _sourceFactory = sourceFactory.clone() {
     _fillSalt();
     _sdkBundle = sourceFactory.dartSdk.getLinkedBundle();
     _fsState = new FileSystemState(_logger, _byteStore, _contentOverlay,
         _resourceProvider, _sourceFactory, _analysisOptions, _salt);
+    _scheduler._add(this);
   }
 
   /**
+   * Return the set of files added to analysis using [addFile].
+   */
+  Set<String> get addedFiles => _explicitFiles;
+
+  /**
+   * Return the set of files that are known, i.e. added or used implicitly.
+   */
+  Set<String> get knownFiles => _fsState.knownFiles;
+
+  /**
    * Set the list of files that the driver should try to analyze sooner.
    *
    * Every path in the list must be absolute and normalized.
@@ -190,20 +229,19 @@
   void set priorityFiles(List<String> priorityPaths) {
     _priorityFiles.clear();
     _priorityFiles.addAll(priorityPaths);
-    _transitionToAnalyzing();
-    _hasWork.notify();
+    _statusSupport.transitionToAnalyzing();
+    _scheduler._notify(this);
   }
 
   /**
    * Return the [Stream] that produces [AnalysisResult]s for added files.
    *
-   * Analysis starts when the client starts listening to the stream, and stops
-   * when the client cancels the subscription. Note that the stream supports
-   * only one single subscriber.
+   * Note that the stream supports only one single subscriber.
    *
-   * When the client starts listening, the analysis state transitions to
-   * "analyzing" and an analysis result is produced for every added file prior
-   * to the next time the analysis state transitions to "idle".
+   * Analysis starts when the [AnalysisDriverScheduler] is started and the
+   * driver is added to it. The analysis state transitions to "analyzing" and
+   * an analysis result is produced for every added file prior to the next time
+   * the analysis state transitions to "idle".
    *
    * At least one analysis result is produced for every file passed to
    * [addFile] or [changeFile] prior to the next time the analysis state
@@ -217,95 +255,39 @@
    * Results might be produced even for files that have never been added
    * using [addFile], for example when [getResult] was called for a file.
    */
-  Stream<AnalysisResult> get results async* {
-    try {
-      PerformanceLogSection analysisSection = null;
-      while (true) {
-        // Pump the event queue to allow IO and other asynchronous data
-        // processing while analysis is active. For example Analysis Server
-        // needs to be able to process `updateContent` or `setPriorityFiles`
-        // requests while background analysis is in progress.
-        //
-        // The number of pumpings is arbitrary, might be changed if we see that
-        // analysis or other data processing tasks are starving. Ideally we
-        // would need to be able to set priority of (continuous) asynchronous
-        // tasks.
-        await _pumpEventQueue(128);
-
-        await _hasWork.signal;
-
-        if (analysisSection == null) {
-          analysisSection = _logger.enter('Analyzing');
-        }
-
-        // Verify all changed files one at a time.
-        if (_changedFiles.isNotEmpty) {
-          String path = _removeFirst(_changedFiles);
-          _verifyApiSignature(path);
-          // Repeat the processing loop.
-          _hasWork.notify();
-          continue;
-        }
-
-        // Analyze a requested file.
-        if (_requestedFiles.isNotEmpty) {
-          String path = _requestedFiles.keys.first;
-          AnalysisResult result = _computeAnalysisResult(path, withUnit: true);
-          // Notify the completers.
-          _requestedFiles.remove(path).forEach((completer) {
-            completer.complete(result);
-          });
-          // Remove from to be analyzed and produce it now.
-          _filesToAnalyze.remove(path);
-          yield result;
-          // Repeat the processing loop.
-          _hasWork.notify();
-          continue;
-        }
-
-        // Analyze a priority file.
-        if (_priorityFiles.isNotEmpty) {
-          bool analyzed = false;
-          for (String path in _priorityFiles) {
-            if (_filesToAnalyze.remove(path)) {
-              analyzed = true;
-              AnalysisResult result =
-                  _computeAnalysisResult(path, withUnit: true);
-              yield result;
-              break;
-            }
-          }
-          // Repeat the processing loop.
-          if (analyzed) {
-            _hasWork.notify();
-            continue;
-          }
-        }
-
-        // Analyze a general file.
-        if (_filesToAnalyze.isNotEmpty) {
-          String path = _removeFirst(_filesToAnalyze);
-          AnalysisResult result = _computeAnalysisResult(path, withUnit: false);
-          yield result;
-          // Repeat the processing loop.
-          _hasWork.notify();
-          continue;
-        }
-
-        // There is nothing to do.
-        analysisSection.exit();
-        analysisSection = null;
-        _transitionToIdle();
-      }
-    } finally {
-      print('The stream was cancelled.');
-    }
-  }
+  Stream<AnalysisResult> get results => _resultController.stream;
 
   /**
    * Return the stream that produces [AnalysisStatus] events.
    */
-  Stream<AnalysisStatus> get status => _statusController.stream;
+  Stream<AnalysisStatus> get status => _statusSupport.stream;
+
+  /**
+   * Return the priority of work that the driver needs to perform.
+   */
+  AnalysisDriverPriority get _workPriority {
+    if (_requestedFiles.isNotEmpty) {
+      return AnalysisDriverPriority.interactive;
+    }
+    if (_priorityFiles.isNotEmpty) {
+      for (String path in _priorityFiles) {
+        if (_filesToAnalyze.contains(path)) {
+          return AnalysisDriverPriority.priority;
+        }
+      }
+    }
+    if (_filesToAnalyze.isNotEmpty) {
+      return AnalysisDriverPriority.general;
+    }
+    if (_changedFiles.isNotEmpty) {
+      return AnalysisDriverPriority.general;
+    }
+    if (_requestedParts.isNotEmpty || _partsToAnalyze.isNotEmpty) {
+      return AnalysisDriverPriority.general;
+    }
+    _statusSupport.transitionToIdle();
+    return AnalysisDriverPriority.nothing;
+  }
 
   /**
    * Add the file with the given [path] to the set of files to analyze.
@@ -319,8 +301,8 @@
       _explicitFiles.add(path);
       _filesToAnalyze.add(path);
     }
-    _transitionToAnalyzing();
-    _hasWork.notify();
+    _statusSupport.transitionToAnalyzing();
+    _scheduler._notify(this);
   }
 
   /**
@@ -348,8 +330,15 @@
         _filesToAnalyze.add(path);
       }
     }
-    _transitionToAnalyzing();
-    _hasWork.notify();
+    _statusSupport.transitionToAnalyzing();
+    _scheduler._notify(this);
+  }
+
+  /**
+   * Notify the driver that the client is going to stop using it.
+   */
+  void dispose() {
+    _scheduler._remove(this);
   }
 
   /**
@@ -371,20 +360,12 @@
     _requestedFiles
         .putIfAbsent(path, () => <Completer<AnalysisResult>>[])
         .add(completer);
-    _transitionToAnalyzing();
-    _hasWork.notify();
+    _statusSupport.transitionToAnalyzing();
+    _scheduler._notify(this);
     return completer.future;
   }
 
   /**
-   * Return `true` if the file with the given [path] was explicitly added
-   * to analysis using [addFile].
-   */
-  bool isAddedFile(String path) {
-    return _explicitFiles.contains(path);
-  }
-
-  /**
    * Return the [Future] that completes with a [ParseResult] for the file
    * with the given [path].
    *
@@ -447,19 +428,45 @@
    *
    * The result will have the fully resolved unit and will always be newly
    * compute only if [withUnit] is `true`.
+   *
+   * Return `null` if the file is a part of an unknown library, so cannot be
+   * analyzed yet. But [asIsIfPartWithoutLibrary] is `true`, then the file is
+   * analyzed anyway, even without a library.
    */
-  AnalysisResult _computeAnalysisResult(String path, {bool withUnit: false}) {
+  AnalysisResult _computeAnalysisResult(String path,
+      {bool withUnit: false, bool asIsIfPartWithoutLibrary: false}) {
+    /**
+     * If the [file] is a library, return the [file] itself.
+     * If the [file] is a part, return a library it is known to be a part of.
+     * If there is no such library, return `null`.
+     */
+    FileState getLibraryFile(FileState file) {
+      FileState libraryFile = file.isPart ? file.library : file;
+      if (libraryFile == null && asIsIfPartWithoutLibrary) {
+        libraryFile = file;
+      }
+      return libraryFile;
+    }
+
     // If we don't need the fully resolved unit, check for the cached result.
     if (!withUnit) {
       FileState file = _fsState.getFileForPath(path);
+
+      // Prepare the library file - the file itself, or the known library.
+      FileState libraryFile = getLibraryFile(file);
+      if (libraryFile == null) {
+        return null;
+      }
+
       // Prepare the key for the cached result.
-      String key = _getResolvedUnitKey(file);
+      String key = _getResolvedUnitKey(libraryFile, file);
       if (key == null) {
         _logger.run('Compute the dependency hash for $path', () {
-          _createLibraryContext(file);
-          key = _getResolvedUnitKey(file);
+          _createLibraryContext(libraryFile);
+          key = _getResolvedUnitKey(libraryFile, file);
         });
       }
+
       // Check for the cached result.
       AnalysisResult result = _getCachedAnalysisResult(file, key);
       if (result != null) {
@@ -469,15 +476,22 @@
 
     // We need the fully resolved unit, or the result is not cached.
     return _logger.run('Compute analysis result for $path', () {
-      // Still no result, compute and store it.
       FileState file = _verifyApiSignature(path);
-      _LibraryContext libraryContext = _createLibraryContext(file);
+
+      // Prepare the library file - the file itself, or the known library.
+      FileState libraryFile = getLibraryFile(file);
+      if (libraryFile == null) {
+        return null;
+      }
+
+      _LibraryContext libraryContext = _createLibraryContext(libraryFile);
       AnalysisContext analysisContext = _createAnalysisContext(libraryContext);
       try {
         analysisContext.setContents(file.source, file.content);
         // TODO(scheglov) Add support for parts.
         CompilationUnit resolvedUnit = withUnit
-            ? analysisContext.resolveCompilationUnit2(file.source, file.source)
+            ? analysisContext.resolveCompilationUnit2(
+                file.source, libraryFile.source)
             : null;
         List<AnalysisError> errors = analysisContext.computeErrors(file.source);
 
@@ -493,13 +507,14 @@
                           correction: error.correction))
                       .toList())
               .toBuffer();
-          String key = _getResolvedUnitKey(file);
+          String key = _getResolvedUnitKey(libraryFile, file);
           _byteStore.put(key, bytes);
         }
 
         // Return the result, full or partial.
         _logger.writeln('Computed new analysis result.');
         return new AnalysisResult(
+            _sourceFactory,
             file.path,
             file.uri,
             withUnit ? file.content : null,
@@ -629,10 +644,14 @@
    * Fill [_salt] with data.
    */
   void _fillSalt() {
-    int analysisOptionsSalt = 0;
-    analysisOptionsSalt |= _analysisOptions.strongMode ? (1 << 0) : 0;
     _salt[0] = DATA_VERSION;
-    _salt[1] = analysisOptionsSalt;
+    List<int> crossContextOptions =
+        _analysisOptions.encodeCrossContextOptions();
+    assert(crossContextOptions.length ==
+        AnalysisOptions.crossContextOptionsLength);
+    for (int i = 0; i < crossContextOptions.length; i++) {
+      _salt[i + 1] = crossContextOptions[i];
+    }
   }
 
   /**
@@ -648,22 +667,23 @@
               file.source,
               error.offset,
               error.length,
-              ErrorCode.byUniqueName(error.uniqueName),
+              errorCodeByUniqueName(error.uniqueName),
               error.message,
               error.correction))
           .toList();
-      return new AnalysisResult(file.path, file.uri, null, file.contentHash,
-          file.lineInfo, null, errors);
+      return new AnalysisResult(_sourceFactory, file.path, file.uri, null,
+          file.contentHash, file.lineInfo, null, errors);
     }
     return null;
   }
 
   /**
-   * Return the key to store fully resolved results for the [file] into the
-   * cache. Return `null` if the dependency signature is not known yet.
+   * Return the key to store fully resolved results for the [file] in the
+   * [library] into the cache. Return `null` if the dependency signature is
+   * not known yet.
    */
-  String _getResolvedUnitKey(FileState file) {
-    String dependencyHash = _dependencySignatureMap[file.uri];
+  String _getResolvedUnitKey(FileState library, FileState file) {
+    String dependencyHash = _dependencySignatureMap[library.uri];
     if (dependencyHash != null) {
       ApiSignature signature = new ApiSignature();
       signature.addUint32List(_salt);
@@ -675,31 +695,93 @@
   }
 
   /**
-   * Send a notifications to the [status] stream that the driver started
-   * analyzing.
+   * Perform a single chunk of work and produce [results].
    */
-  void _transitionToAnalyzing() {
-    if (_currentStatus != AnalysisStatus.ANALYZING) {
-      _currentStatus = AnalysisStatus.ANALYZING;
-      _statusController.add(AnalysisStatus.ANALYZING);
+  Future<Null> _performWork() async {
+    // Verify all changed files one at a time.
+    if (_changedFiles.isNotEmpty) {
+      String path = _removeFirst(_changedFiles);
+      _verifyApiSignature(path);
+      return;
     }
-  }
 
-  /**
-   * Send a notifications to the [status] stream that the driver is idle.
-   */
-  void _transitionToIdle() {
-    if (_currentStatus != AnalysisStatus.IDLE) {
-      _currentStatus = AnalysisStatus.IDLE;
-      _statusController.add(AnalysisStatus.IDLE);
+    // Analyze a requested file.
+    if (_requestedFiles.isNotEmpty) {
+      String path = _requestedFiles.keys.first;
+      AnalysisResult result = _computeAnalysisResult(path, withUnit: true);
+      // If a part without a library, delay its analysis.
+      if (result == null) {
+        _requestedParts
+            .putIfAbsent(path, () => [])
+            .addAll(_requestedFiles.remove(path));
+        return;
+      }
+      // Notify the completers.
+      _requestedFiles.remove(path).forEach((completer) {
+        completer.complete(result);
+      });
+      // Remove from to be analyzed and produce it now.
+      _filesToAnalyze.remove(path);
+      _resultController.add(result);
+      return;
+    }
+
+    // Analyze a priority file.
+    if (_priorityFiles.isNotEmpty) {
+      for (String path in _priorityFiles) {
+        if (_filesToAnalyze.remove(path)) {
+          AnalysisResult result = _computeAnalysisResult(path, withUnit: true);
+          if (result == null) {
+            _partsToAnalyze.add(path);
+          } else {
+            _resultController.add(result);
+          }
+          return;
+        }
+      }
+    }
+
+    // Analyze a general file.
+    if (_filesToAnalyze.isNotEmpty) {
+      String path = _removeFirst(_filesToAnalyze);
+      AnalysisResult result = _computeAnalysisResult(path, withUnit: false);
+      if (result == null) {
+        _partsToAnalyze.add(path);
+      } else {
+        _resultController.add(result);
+      }
+      return;
+    }
+
+    // Analyze a requested part file.
+    if (_requestedParts.isNotEmpty) {
+      String path = _requestedParts.keys.first;
+      AnalysisResult result = _computeAnalysisResult(path,
+          withUnit: true, asIsIfPartWithoutLibrary: true);
+      // Notify the completers.
+      _requestedParts.remove(path).forEach((completer) {
+        completer.complete(result);
+      });
+      // Remove from to be analyzed and produce it now.
+      _filesToAnalyze.remove(path);
+      _resultController.add(result);
+      return;
+    }
+
+    // Analyze a general part.
+    if (_partsToAnalyze.isNotEmpty) {
+      String path = _removeFirst(_partsToAnalyze);
+      AnalysisResult result = _computeAnalysisResult(path,
+          withUnit: _priorityFiles.contains(path),
+          asIsIfPartWithoutLibrary: true);
+      _resultController.add(result);
+      return;
     }
   }
 
   /**
    * Verify the API signature for the file with the given [path], and decide
    * which linked libraries should be invalidated, and files reanalyzed.
-   *
-   * TODO(scheglov) I see that adding a local var changes (full) API signature.
    */
   FileState _verifyApiSignature(String path) {
     return _logger.run('Verify API signature of $path', () {
@@ -721,6 +803,133 @@
   }
 
   /**
+   * Remove and return the first item in the given [set].
+   */
+  static Object/*=T*/ _removeFirst/*<T>*/(LinkedHashSet<Object/*=T*/ > set) {
+    Object/*=T*/ element = set.first;
+    set.remove(element);
+    return element;
+  }
+}
+
+/**
+ * Priorities of [AnalysisDriver] work. The farther a priority to the beginning
+ * of the list, the earlier the corresponding [AnalysisDriver] should be asked
+ * to perform work.
+ */
+enum AnalysisDriverPriority { nothing, general, priority, interactive }
+
+/**
+ * Instances of this class schedule work in multiple [AnalysisDriver]s so that
+ * work with the highest priority is performed first.
+ */
+class AnalysisDriverScheduler {
+  final PerformanceLog _logger;
+  final List<AnalysisDriver> _drivers = [];
+  final Monitor _hasWork = new Monitor();
+  final StatusSupport _statusSupport = new StatusSupport();
+
+  bool _started = false;
+
+  AnalysisDriverScheduler(this._logger);
+
+  /**
+   * Return the stream that produces [AnalysisStatus] events.
+   */
+  Stream<AnalysisStatus> get status => _statusSupport.stream;
+
+  /**
+   * Start the scheduler, so that any [AnalysisDriver] created before or
+   * after will be asked to perform work.
+   */
+  void start() {
+    if (_started) {
+      throw new StateError('The scheduler has already been started.');
+    }
+    _started = true;
+    _run();
+  }
+
+  /**
+   * Add the given [driver] and schedule it to perform its work.
+   */
+  void _add(AnalysisDriver driver) {
+    _drivers.add(driver);
+    _statusSupport.transitionToAnalyzing();
+    _hasWork.notify();
+  }
+
+  /**
+   * Notify that there is a change to the [driver], it it might need to
+   * perform some work.
+   */
+  void _notify(AnalysisDriver driver) {
+    _statusSupport.transitionToAnalyzing();
+    _hasWork.notify();
+  }
+
+  /**
+   * Remove the given [driver] from the scheduler, so that it will not be
+   * asked to perform any new work.
+   */
+  void _remove(AnalysisDriver driver) {
+    _drivers.remove(driver);
+    _statusSupport.transitionToAnalyzing();
+    _hasWork.notify();
+  }
+
+  /**
+   * Run infinitely analysis cycle, selecting the drivers with the highest
+   * priority first.
+   */
+  Future<Null> _run() async {
+    PerformanceLogSection analysisSection;
+    while (true) {
+      // Pump the event queue to allow IO and other asynchronous data
+      // processing while analysis is active. For example Analysis Server
+      // needs to be able to process `updateContent` or `setPriorityFiles`
+      // requests while background analysis is in progress.
+      //
+      // The number of pumpings is arbitrary, might be changed if we see that
+      // analysis or other data processing tasks are starving. Ideally we
+      // would need to be able to set priority of (continuous) asynchronous
+      // tasks.
+      await _pumpEventQueue(128);
+
+      await _hasWork.signal;
+
+      if (analysisSection == null) {
+        analysisSection = _logger.enter('Analyzing');
+      }
+
+      // Find the driver with the highest priority.
+      AnalysisDriver bestDriver;
+      AnalysisDriverPriority bestPriority = AnalysisDriverPriority.nothing;
+      for (AnalysisDriver driver in _drivers) {
+        AnalysisDriverPriority priority = driver._workPriority;
+        if (bestPriority == null || priority.index > bestPriority.index) {
+          bestDriver = driver;
+          bestPriority = priority;
+        }
+      }
+
+      // Continue to sleep if no work to do.
+      if (bestPriority == AnalysisDriverPriority.nothing) {
+        analysisSection.exit();
+        analysisSection = null;
+        _statusSupport.transitionToIdle();
+        continue;
+      }
+
+      // Ask the driver to perform a chunk of work.
+      await bestDriver._performWork();
+
+      // Schedule one more cycle.
+      _hasWork.notify();
+    }
+  }
+
+  /**
    * Returns a [Future] that completes after performing [times] pumpings of
    * the event queue.
    */
@@ -730,15 +939,6 @@
     }
     return new Future.delayed(Duration.ZERO, () => _pumpEventQueue(times - 1));
   }
-
-  /**
-   * Remove and return the first item in the given [set].
-   */
-  static Object/*=T*/ _removeFirst/*<T>*/(LinkedHashSet<Object/*=T*/ > set) {
-    Object/*=T*/ element = set.first;
-    set.remove(element);
-    return element;
-  }
 }
 
 /**
@@ -754,6 +954,11 @@
  */
 class AnalysisResult {
   /**
+   * The [SourceFactory] with which the file was analyzed.
+   */
+  final SourceFactory sourceFactory;
+
+  /**
    * The path of the analysed file, absolute and normalized.
    */
   final String path;
@@ -790,30 +995,8 @@
    */
   final List<AnalysisError> errors;
 
-  AnalysisResult(this.path, this.uri, this.content, this.contentHash,
-      this.lineInfo, this.unit, this.errors);
-}
-
-/**
- * The status of [AnalysisDriver]
- */
-class AnalysisStatus {
-  static const IDLE = const AnalysisStatus._(false);
-  static const ANALYZING = const AnalysisStatus._(true);
-
-  final bool _analyzing;
-
-  const AnalysisStatus._(this._analyzing);
-
-  /**
-   * Return `true` is the driver is analyzing.
-   */
-  bool get isAnalyzing => _analyzing;
-
-  /**
-   * Return `true` is the driver is idle.
-   */
-  bool get isIdle => !_analyzing;
+  AnalysisResult(this.sourceFactory, this.path, this.uri, this.content,
+      this.contentHash, this.lineInfo, this.unit, this.errors);
 }
 
 /**
@@ -1000,32 +1183,3 @@
   @override
   String toString() => uri.toString();
 }
-
-/**
- * [_Monitor] can be used to wait for a signal.
- *
- * Signals are not queued, the client will receive exactly one signal
- * regardless of the number of [notify] invocations. The [signal] is reset
- * after completion and will not complete until [notify] is called next time.
- */
-class _Monitor {
-  Completer<Null> _completer = new Completer<Null>();
-
-  /**
-   * Return a [Future] that completes when [notify] is called at least once.
-   */
-  Future<Null> get signal async {
-    await _completer.future;
-    _completer = new Completer<Null>();
-  }
-
-  /**
-   * Complete the [signal] future if it is not completed yet. It is safe to
-   * call this method multiple times, but the [signal] will complete only once.
-   */
-  void notify() {
-    if (!_completer.isCompleted) {
-      _completer.complete(null);
-    }
-  }
-}
diff --git a/pkg/analyzer/lib/src/dart/analysis/file_state.dart b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
index 3df2b1a..89a3d7b 100644
--- a/pkg/analyzer/lib/src/dart/analysis/file_state.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
@@ -128,6 +128,25 @@
   List<FileState> get importedFiles => _importedFiles;
 
   /**
+   * Return `true` if the file has a `part of` directive, so is probably a part.
+   */
+  bool get isPart => _unlinked.isPartOf;
+
+  /**
+   * If the file [isPart], return a currently know library the file is a part
+   * of. Return `null` if a library is not known, for example because we have
+   * not processed a library file yet.
+   */
+  FileState get library {
+    List<FileState> libraries = _fsState._partToLibraries[this];
+    if (libraries == null || libraries.isEmpty) {
+      return null;
+    } else {
+      return libraries.first;
+    }
+  }
+
+  /**
    * Return information about line in the file.
    */
   LineInfo get lineInfo => _lineInfo;
@@ -226,6 +245,13 @@
         !_equalByteLists(_apiSignature, newApiSignature);
     _apiSignature = newApiSignature;
 
+    // This file is potentially not a library for its previous parts anymore.
+    if (_partedFiles != null) {
+      for (FileState part in _partedFiles) {
+        _fsState._partToLibraries[part]?.remove(this);
+      }
+    }
+
     // Build the graph.
     _importedFiles = <FileState>[];
     _exportedFiles = <FileState>[];
@@ -255,6 +281,10 @@
         FileState file = _fileForRelativeUri(uri);
         if (file != null) {
           _partedFiles.add(file);
+          // TODO(scheglov) Sort for stable results?
+          _fsState._partToLibraries
+              .putIfAbsent(file, () => <FileState>[])
+              .add(this);
         }
       }
     }
@@ -333,6 +363,11 @@
    */
   final Map<String, FileState> _pathToCanonicalFile = {};
 
+  /**
+   * Mapping from a part to the libraries it is a part of.
+   */
+  final Map<FileState, List<FileState>> _partToLibraries = {};
+
   FileSystemState(
       this._logger,
       this._byteStore,
@@ -343,6 +378,11 @@
       this._salt);
 
   /**
+   * Return the set of known files.
+   */
+  Set<String> get knownFiles => _pathToFiles.keys.toSet();
+
+  /**
    * Return the canonical [FileState] for the given absolute [path]. The
    * returned file has the last known state since if was last refreshed.
    *
diff --git a/pkg/analyzer/lib/src/dart/analysis/status.dart b/pkg/analyzer/lib/src/dart/analysis/status.dart
new file mode 100644
index 0000000..3e2d79c
--- /dev/null
+++ b/pkg/analyzer/lib/src/dart/analysis/status.dart
@@ -0,0 +1,96 @@
+// Copyright (c) 2016, 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:async';
+
+/**
+ * The status of analysis.
+ */
+class AnalysisStatus {
+  static const IDLE = const AnalysisStatus._(false);
+  static const ANALYZING = const AnalysisStatus._(true);
+
+  final bool _analyzing;
+
+  const AnalysisStatus._(this._analyzing);
+
+  /**
+   * Return `true` is the driver is analyzing.
+   */
+  bool get isAnalyzing => _analyzing;
+
+  /**
+   * Return `true` is the driver is idle.
+   */
+  bool get isIdle => !_analyzing;
+}
+
+/**
+ * [Monitor] can be used to wait for a signal.
+ *
+ * Signals are not queued, the client will receive exactly one signal
+ * regardless of the number of [notify] invocations. The [signal] is reset
+ * after completion and will not complete until [notify] is called next time.
+ */
+class Monitor {
+  Completer<Null> _completer = new Completer<Null>();
+
+  /**
+   * Return a [Future] that completes when [notify] is called at least once.
+   */
+  Future<Null> get signal async {
+    await _completer.future;
+    _completer = new Completer<Null>();
+  }
+
+  /**
+   * Complete the [signal] future if it is not completed yet. It is safe to
+   * call this method multiple times, but the [signal] will complete only once.
+   */
+  void notify() {
+    if (!_completer.isCompleted) {
+      _completer.complete(null);
+    }
+  }
+}
+
+/**
+ * Helper for managing transitioning [AnalysisStatus].
+ */
+class StatusSupport {
+  /**
+   * The controller for the [stream].
+   */
+  final _statusController = new StreamController<AnalysisStatus>();
+
+  /**
+   * The last status sent to the [stream].
+   */
+  AnalysisStatus _currentStatus = AnalysisStatus.IDLE;
+
+  /**
+   * Return the stream that produces [AnalysisStatus] events.
+   */
+  Stream<AnalysisStatus> get stream => _statusController.stream;
+
+  /**
+   * Send a notifications to the [stream] that the driver started analyzing.
+   */
+  void transitionToAnalyzing() {
+    if (_currentStatus != AnalysisStatus.ANALYZING) {
+      _currentStatus = AnalysisStatus.ANALYZING;
+      _statusController.add(AnalysisStatus.ANALYZING);
+    }
+  }
+
+  /**
+   * Send a notifications to the [stream] stream that the driver is idle.
+   */
+  void transitionToIdle() {
+    if (_currentStatus != AnalysisStatus.IDLE) {
+      _currentStatus = AnalysisStatus.IDLE;
+      _statusController.add(AnalysisStatus.IDLE);
+    }
+  }
+}
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index 930cebf..4d388d2 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -558,21 +558,16 @@
 }
 
 /**
- * An assert statement.
+ * An assert in the initializer list of a constructor.
  *
- *    assertStatement ::=
- *        'assert' '(' [Expression] ')' ';'
+ *    assertInitializer ::=
+ *        'assert' '(' [Expression] (',' [Expression])? ')'
  */
-class AssertStatementImpl extends StatementImpl implements AssertStatement {
-  /**
-   * The token representing the 'assert' keyword.
-   */
+class AssertInitializerImpl extends ConstructorInitializerImpl
+    implements AssertInitializer {
   @override
   Token assertKeyword;
 
-  /**
-   * The left parenthesis.
-   */
   @override
   Token leftParenthesis;
 
@@ -581,27 +576,104 @@
    */
   Expression _condition;
 
-  /**
-   * The comma, if a message expression was supplied.  Otherwise `null`.
-   */
   @override
   Token comma;
 
   /**
-   * The message to report if the assertion fails.  `null` if no message was
+   * The message to report if the assertion fails, or `null` if no message was
    * supplied.
    */
   Expression _message;
 
-  /**
-   * The right parenthesis.
-   */
   @override
   Token rightParenthesis;
 
   /**
-   * The semicolon terminating the statement.
+   * Initialize a newly created assert initializer.
    */
+  AssertInitializerImpl(
+      this.assertKeyword,
+      this.leftParenthesis,
+      ExpressionImpl condition,
+      this.comma,
+      ExpressionImpl message,
+      this.rightParenthesis) {
+    _condition = _becomeParentOf(condition);
+    _message = _becomeParentOf(message);
+  }
+
+  @override
+  Token get beginToken => assertKeyword;
+
+  @override
+  Iterable<SyntacticEntity> get childEntities => new ChildEntities()
+    ..add(assertKeyword)
+    ..add(leftParenthesis)
+    ..add(_condition)
+    ..add(comma)
+    ..add(_message)
+    ..add(rightParenthesis);
+
+  @override
+  Expression get condition => _condition;
+
+  @override
+  void set condition(Expression condition) {
+    _condition = _becomeParentOf(condition as AstNodeImpl);
+  }
+
+  @override
+  Token get endToken => rightParenthesis;
+
+  @override
+  Expression get message => _message;
+
+  @override
+  void set message(Expression expression) {
+    _message = _becomeParentOf(expression as AstNodeImpl);
+  }
+
+  @override
+  dynamic/*=E*/ accept/*<E>*/(AstVisitor/*<E>*/ visitor) =>
+      visitor.visitAssertInitializer(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _condition?.accept(visitor);
+    message?.accept(visitor);
+  }
+}
+
+/**
+ * An assert statement.
+ *
+ *    assertStatement ::=
+ *        'assert' '(' [Expression] ')' ';'
+ */
+class AssertStatementImpl extends StatementImpl implements AssertStatement {
+  @override
+  Token assertKeyword;
+
+  @override
+  Token leftParenthesis;
+
+  /**
+   * The condition that is being asserted to be `true`.
+   */
+  Expression _condition;
+
+  @override
+  Token comma;
+
+  /**
+   * The message to report if the assertion fails, or `null` if no message was
+   * supplied.
+   */
+  Expression _message;
+
+  @override
+  Token rightParenthesis;
+
   @override
   Token semicolon;
 
diff --git a/pkg/analyzer/lib/src/dart/ast/token.dart b/pkg/analyzer/lib/src/dart/ast/token.dart
index baae1b8..ee5df9f 100644
--- a/pkg/analyzer/lib/src/dart/ast/token.dart
+++ b/pkg/analyzer/lib/src/dart/ast/token.dart
@@ -4,400 +4,21 @@
 
 library analyzer.src.dart.ast.token;
 
-import 'package:analyzer/dart/ast/token.dart';
-import 'package:analyzer/src/generated/java_engine.dart';
+import 'package:front_end/src/scanner/token.dart';
 
-/**
- * The opening half of a grouping pair of tokens. This is used for curly
- * brackets ('{'), parentheses ('('), and square brackets ('[').
- */
-class BeginToken extends SimpleToken {
-  /**
-   * The token that corresponds to this token.
-   */
-  Token endToken;
-
-  /**
-   * Initialize a newly created token to have the given [type] at the given
-   * [offset].
-   */
-  BeginToken(TokenType type, int offset) : super(type, offset) {
-    assert(type == TokenType.OPEN_CURLY_BRACKET ||
-        type == TokenType.OPEN_PAREN ||
-        type == TokenType.OPEN_SQUARE_BRACKET ||
-        type == TokenType.STRING_INTERPOLATION_EXPRESSION);
-  }
-
-  @override
-  Token copy() => new BeginToken(type, offset);
-}
-
-/**
- * A begin token that is preceded by comments.
- */
-class BeginTokenWithComment extends BeginToken implements TokenWithComment {
-  /**
-   * The first comment in the list of comments that precede this token.
-   */
-  @override
-  CommentToken _precedingComment;
-
-  /**
-   * Initialize a newly created token to have the given [type] at the given
-   * [offset] and to be preceded by the comments reachable from the given
-   * [_precedingComment].
-   */
-  BeginTokenWithComment(TokenType type, int offset, this._precedingComment)
-      : super(type, offset) {
-    _setCommentParent(_precedingComment);
-  }
-
-  @override
-  CommentToken get precedingComments => _precedingComment;
-
-  @override
-  void set precedingComments(CommentToken comment) {
-    _precedingComment = comment;
-    _setCommentParent(_precedingComment);
-  }
-
-  @override
-  void applyDelta(int delta) {
-    super.applyDelta(delta);
-    Token token = precedingComments;
-    while (token != null) {
-      token.applyDelta(delta);
-      token = token.next;
-    }
-  }
-
-  @override
-  Token copy() =>
-      new BeginTokenWithComment(type, offset, copyComments(precedingComments));
-}
-
-/**
- * A token representing a comment.
- */
-class CommentToken extends StringToken {
-  /**
-   * The token that contains this comment.
-   */
-  TokenWithComment parent;
-
-  /**
-   * Initialize a newly created token to represent a token of the given [type]
-   * with the given [value] at the given [offset].
-   */
-  CommentToken(TokenType type, String value, int offset)
-      : super(type, value, offset);
-
-  @override
-  CommentToken copy() => new CommentToken(type, _value, offset);
-
-  /**
-   * Remove this comment token from the list.
-   *
-   * This is used when we decide to interpret the comment as syntax.
-   */
-  void remove() {
-    if (previous != null) {
-      previous.setNextWithoutSettingPrevious(next);
-      next?.previous = previous;
-    } else {
-      assert(parent.precedingComments == this);
-      parent.precedingComments = next;
-    }
-  }
-}
-
-/**
- * A documentation comment token.
- */
-class DocumentationCommentToken extends CommentToken {
-  /**
-   * The references embedded within the documentation comment.
-   * This list will be empty unless this is a documentation comment that has
-   * references embedded within it.
-   */
-  final List<Token> references = <Token>[];
-
-  /**
-   * Initialize a newly created token to represent a token of the given [type]
-   * with the given [value] at the given [offset].
-   */
-  DocumentationCommentToken(TokenType type, String value, int offset)
-      : super(type, value, offset);
-
-  @override
-  CommentToken copy() {
-    DocumentationCommentToken copy =
-        new DocumentationCommentToken(type, _value, offset);
-    references.forEach((ref) => copy.references.add(ref.copy()));
-    return copy;
-  }
-}
-
-/**
- * A token representing a keyword in the language.
- */
-class KeywordToken extends SimpleToken {
-  @override
-  final Keyword keyword;
-
-  /**
-   * Initialize a newly created token to represent the given [keyword] at the
-   * given [offset].
-   */
-  KeywordToken(this.keyword, int offset) : super(TokenType.KEYWORD, offset);
-
-  @override
-  String get lexeme => keyword.syntax;
-
-  @override
-  Token copy() => new KeywordToken(keyword, offset);
-
-  @override
-  Keyword value() => keyword;
-}
-
-/**
- * A keyword token that is preceded by comments.
- */
-class KeywordTokenWithComment extends KeywordToken implements TokenWithComment {
-  /**
-   * The first comment in the list of comments that precede this token.
-   */
-  @override
-  CommentToken _precedingComment;
-
-  /**
-   * Initialize a newly created token to to represent the given [keyword] at the
-   * given [offset] and to be preceded by the comments reachable from the given
-   * [_precedingComment].
-   */
-  KeywordTokenWithComment(Keyword keyword, int offset, this._precedingComment)
-      : super(keyword, offset) {
-    _setCommentParent(_precedingComment);
-  }
-
-  @override
-  CommentToken get precedingComments => _precedingComment;
-
-  void set precedingComments(CommentToken comment) {
-    _precedingComment = comment;
-    _setCommentParent(_precedingComment);
-  }
-
-  @override
-  void applyDelta(int delta) {
-    super.applyDelta(delta);
-    Token token = precedingComments;
-    while (token != null) {
-      token.applyDelta(delta);
-      token = token.next;
-    }
-  }
-
-  @override
-  Token copy() => new KeywordTokenWithComment(
-      keyword, offset, copyComments(precedingComments));
-}
-
-/**
- * A token that was scanned from the input. Each token knows which tokens
- * precede and follow it, acting as a link in a doubly linked list of tokens.
- */
-class SimpleToken implements Token {
-  /**
-   * The type of the token.
-   */
-  @override
-  final TokenType type;
-
-  /**
-   * The offset from the beginning of the file to the first character in the
-   * token.
-   */
-  @override
-  int offset = 0;
-
-  /**
-   * The previous token in the token stream.
-   */
-  @override
-  Token previous;
-
-  /**
-   * The next token in the token stream.
-   */
-  Token _next;
-
-  /**
-   * Initialize a newly created token to have the given [type] and [offset].
-   */
-  SimpleToken(this.type, this.offset);
-
-  @override
-  int get end => offset + length;
-
-  @override
-  bool get isOperator => type.isOperator;
-
-  @override
-  bool get isSynthetic => length == 0;
-
-  @override
-  bool get isUserDefinableOperator => type.isUserDefinableOperator;
-
-  @override
-  Keyword get keyword => null;
-
-  @override
-  int get length => lexeme.length;
-
-  @override
-  String get lexeme => type.lexeme;
-
-  @override
-  Token get next => _next;
-
-  @override
-  CommentToken get precedingComments => null;
-
-  @override
-  void applyDelta(int delta) {
-    offset += delta;
-  }
-
-  @override
-  Token copy() => new Token(type, offset);
-
-  @override
-  Token copyComments(Token token) {
-    if (token == null) {
-      return null;
-    }
-    Token head = token.copy();
-    Token tail = head;
-    token = token.next;
-    while (token != null) {
-      tail = tail.setNext(token.copy());
-      token = token.next;
-    }
-    return head;
-  }
-
-  @override
-  bool matchesAny(List<TokenType> types) {
-    for (TokenType type in types) {
-      if (this.type == type) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  @override
-  Token setNext(Token token) {
-    _next = token;
-    token.previous = this;
-    return token;
-  }
-
-  @override
-  Token setNextWithoutSettingPrevious(Token token) {
-    _next = token;
-    return token;
-  }
-
-  @override
-  String toString() => lexeme;
-
-  @override
-  Object value() => type.lexeme;
-
-  /**
-   * Sets the `parent` property to `this` for the given [comment] and all the
-   * next tokens.
-   */
-  void _setCommentParent(CommentToken comment) {
-    while (comment != null) {
-      comment.parent = this;
-      comment = comment.next;
-    }
-  }
-}
-
-/**
- * A token whose value is independent of it's type.
- */
-class StringToken extends SimpleToken {
-  /**
-   * The lexeme represented by this token.
-   */
-  String _value;
-
-  /**
-   * Initialize a newly created token to represent a token of the given [type]
-   * with the given [value] at the given [offset].
-   */
-  StringToken(TokenType type, String value, int offset) : super(type, offset) {
-    this._value = StringUtilities.intern(value);
-  }
-
-  @override
-  String get lexeme => _value;
-
-  @override
-  Token copy() => new StringToken(type, _value, offset);
-
-  @override
-  String value() => _value;
-}
-
-/**
- * A string token that is preceded by comments.
- */
-class StringTokenWithComment extends StringToken implements TokenWithComment {
-  /**
-   * The first comment in the list of comments that precede this token.
-   */
-  CommentToken _precedingComment;
-
-  /**
-   * Initialize a newly created token to have the given [type] at the given
-   * [offset] and to be preceded by the comments reachable from the given
-   * [comment].
-   */
-  StringTokenWithComment(
-      TokenType type, String value, int offset, this._precedingComment)
-      : super(type, value, offset) {
-    _setCommentParent(_precedingComment);
-  }
-
-  @override
-  CommentToken get precedingComments => _precedingComment;
-
-  void set precedingComments(CommentToken comment) {
-    _precedingComment = comment;
-    _setCommentParent(_precedingComment);
-  }
-
-  @override
-  void applyDelta(int delta) {
-    super.applyDelta(delta);
-    Token token = precedingComments;
-    while (token != null) {
-      token.applyDelta(delta);
-      token = token.next;
-    }
-  }
-
-  @override
-  Token copy() => new StringTokenWithComment(
-      type, lexeme, offset, copyComments(precedingComments));
-}
+export 'package:front_end/src/scanner/token.dart'
+    show
+        BeginToken,
+        BeginTokenWithComment,
+        CommentToken,
+        DocumentationCommentToken,
+        KeywordToken,
+        KeywordTokenWithComment,
+        SimpleToken,
+        StringToken,
+        StringTokenWithComment,
+        TokenClass,
+        TokenWithComment;
 
 /**
  * A token whose value is independent of it's type.
@@ -413,162 +34,3 @@
   @override
   bool get isSynthetic => true;
 }
-
-/**
- * The classes (or groups) of tokens with a similar use.
- */
-class TokenClass {
-  /**
-   * A value used to indicate that the token type is not part of any specific
-   * class of token.
-   */
-  static const TokenClass NO_CLASS = const TokenClass('NO_CLASS');
-
-  /**
-   * A value used to indicate that the token type is an additive operator.
-   */
-  static const TokenClass ADDITIVE_OPERATOR =
-      const TokenClass('ADDITIVE_OPERATOR', 13);
-
-  /**
-   * A value used to indicate that the token type is an assignment operator.
-   */
-  static const TokenClass ASSIGNMENT_OPERATOR =
-      const TokenClass('ASSIGNMENT_OPERATOR', 1);
-
-  /**
-   * A value used to indicate that the token type is a bitwise-and operator.
-   */
-  static const TokenClass BITWISE_AND_OPERATOR =
-      const TokenClass('BITWISE_AND_OPERATOR', 11);
-
-  /**
-   * A value used to indicate that the token type is a bitwise-or operator.
-   */
-  static const TokenClass BITWISE_OR_OPERATOR =
-      const TokenClass('BITWISE_OR_OPERATOR', 9);
-
-  /**
-   * A value used to indicate that the token type is a bitwise-xor operator.
-   */
-  static const TokenClass BITWISE_XOR_OPERATOR =
-      const TokenClass('BITWISE_XOR_OPERATOR', 10);
-
-  /**
-   * A value used to indicate that the token type is a cascade operator.
-   */
-  static const TokenClass CASCADE_OPERATOR =
-      const TokenClass('CASCADE_OPERATOR', 2);
-
-  /**
-   * A value used to indicate that the token type is a conditional operator.
-   */
-  static const TokenClass CONDITIONAL_OPERATOR =
-      const TokenClass('CONDITIONAL_OPERATOR', 3);
-
-  /**
-   * A value used to indicate that the token type is an equality operator.
-   */
-  static const TokenClass EQUALITY_OPERATOR =
-      const TokenClass('EQUALITY_OPERATOR', 7);
-
-  /**
-   * A value used to indicate that the token type is an if-null operator.
-   */
-  static const TokenClass IF_NULL_OPERATOR =
-      const TokenClass('IF_NULL_OPERATOR', 4);
-
-  /**
-   * A value used to indicate that the token type is a logical-and operator.
-   */
-  static const TokenClass LOGICAL_AND_OPERATOR =
-      const TokenClass('LOGICAL_AND_OPERATOR', 6);
-
-  /**
-   * A value used to indicate that the token type is a logical-or operator.
-   */
-  static const TokenClass LOGICAL_OR_OPERATOR =
-      const TokenClass('LOGICAL_OR_OPERATOR', 5);
-
-  /**
-   * A value used to indicate that the token type is a multiplicative operator.
-   */
-  static const TokenClass MULTIPLICATIVE_OPERATOR =
-      const TokenClass('MULTIPLICATIVE_OPERATOR', 14);
-
-  /**
-   * A value used to indicate that the token type is a relational operator.
-   */
-  static const TokenClass RELATIONAL_OPERATOR =
-      const TokenClass('RELATIONAL_OPERATOR', 8);
-
-  /**
-   * A value used to indicate that the token type is a shift operator.
-   */
-  static const TokenClass SHIFT_OPERATOR =
-      const TokenClass('SHIFT_OPERATOR', 12);
-
-  /**
-   * A value used to indicate that the token type is a unary operator.
-   */
-  static const TokenClass UNARY_POSTFIX_OPERATOR =
-      const TokenClass('UNARY_POSTFIX_OPERATOR', 16);
-
-  /**
-   * A value used to indicate that the token type is a unary operator.
-   */
-  static const TokenClass UNARY_PREFIX_OPERATOR =
-      const TokenClass('UNARY_PREFIX_OPERATOR', 15);
-
-  /**
-   * The name of the token class.
-   */
-  final String name;
-
-  /**
-   * The precedence of tokens of this class, or `0` if the such tokens do not
-   * represent an operator.
-   */
-  final int precedence;
-
-  /**
-   * Initialize a newly created class of tokens to have the given [name] and
-   * [precedence].
-   */
-  const TokenClass(this.name, [this.precedence = 0]);
-
-  @override
-  String toString() => name;
-}
-
-/**
- * A normal token that is preceded by comments.
- */
-class TokenWithComment extends SimpleToken {
-  /**
-   * The first comment in the list of comments that precede this token.
-   */
-  CommentToken _precedingComment;
-
-  /**
-   * Initialize a newly created token to have the given [type] at the given
-   * [offset] and to be preceded by the comments reachable from the given
-   * [comment].
-   */
-  TokenWithComment(TokenType type, int offset, this._precedingComment)
-      : super(type, offset) {
-    _setCommentParent(_precedingComment);
-  }
-
-  @override
-  CommentToken get precedingComments => _precedingComment;
-
-  void set precedingComments(CommentToken comment) {
-    _precedingComment = comment;
-    _setCommentParent(_precedingComment);
-  }
-
-  @override
-  Token copy() =>
-      new TokenWithComment(type, offset, copyComments(precedingComments));
-}
diff --git a/pkg/analyzer/lib/src/dart/ast/utilities.dart b/pkg/analyzer/lib/src/dart/ast/utilities.dart
index 654772c..8e45f3c 100644
--- a/pkg/analyzer/lib/src/dart/ast/utilities.dart
+++ b/pkg/analyzer/lib/src/dart/ast/utilities.dart
@@ -143,6 +143,16 @@
       cloneNode(node.type));
 
   @override
+  AstNode visitAssertInitializer(AssertInitializer node) =>
+      new AssertInitializer(
+          cloneToken(node.assertKeyword),
+          cloneToken(node.leftParenthesis),
+          cloneNode(node.condition),
+          cloneToken(node.comma),
+          cloneNode(node.message),
+          cloneToken(node.rightParenthesis));
+
+  @override
   AstNode visitAssertStatement(AssertStatement node) => new AssertStatement(
       cloneToken(node.assertKeyword),
       cloneToken(node.leftParenthesis),
@@ -1116,6 +1126,17 @@
   }
 
   @override
+  bool visitAssertInitializer(AssertInitializer node) {
+    AssertStatement other = _other as AssertStatement;
+    return isEqualTokens(node.assertKeyword, other.assertKeyword) &&
+        isEqualTokens(node.leftParenthesis, other.leftParenthesis) &&
+        isEqualNodes(node.condition, other.condition) &&
+        isEqualTokens(node.comma, other.comma) &&
+        isEqualNodes(node.message, other.message) &&
+        isEqualTokens(node.rightParenthesis, other.rightParenthesis);
+  }
+
+  @override
   bool visitAssertStatement(AssertStatement node) {
     AssertStatement other = _other as AssertStatement;
     return isEqualTokens(node.assertKeyword, other.assertKeyword) &&
@@ -2763,6 +2784,16 @@
   }
 
   @override
+  AstNode visitAssertInitializer(AssertInitializer node) =>
+      new AssertInitializer(
+          _mapToken(node.assertKeyword),
+          _mapToken(node.leftParenthesis),
+          _cloneNode(node.condition),
+          _mapToken(node.comma),
+          _cloneNode(node.message),
+          _mapToken(node.rightParenthesis));
+
+  @override
   AstNode visitAssertStatement(AssertStatement node) => new AssertStatement(
       _mapToken(node.assertKeyword),
       _mapToken(node.leftParenthesis),
@@ -4043,6 +4074,19 @@
   }
 
   @override
+  bool visitAssertInitializer(AssertInitializer node) {
+    if (identical(node.condition, _oldNode)) {
+      node.condition = _newNode as Expression;
+      return true;
+    }
+    if (identical(node.message, _oldNode)) {
+      node.message = _newNode as Expression;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
   bool visitAssertStatement(AssertStatement node) {
     if (identical(node.condition, _oldNode)) {
       node.condition = _newNode as Expression;
@@ -5221,6 +5265,18 @@
   }
 
   @override
+  bool visitAssertInitializer(AssertInitializer node) {
+    AssertInitializer toNode = this._toNode as AssertInitializer;
+    return _and(
+        _isEqualTokens(node.assertKeyword, toNode.assertKeyword),
+        _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
+        _isEqualNodes(node.condition, toNode.condition),
+        _isEqualTokens(node.comma, toNode.comma),
+        _isEqualNodes(node.message, toNode.message),
+        _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis));
+  }
+
+  @override
   bool visitAssertStatement(AssertStatement node) {
     AssertStatement toNode = this._toNode as AssertStatement;
     return _and(
@@ -6817,6 +6873,18 @@
   }
 
   @override
+  bool visitAssertInitializer(AssertInitializer node) {
+    _writer.print("assert (");
+    _visitNode(node.condition);
+    if (node.message != null) {
+      _writer.print(', ');
+      _visitNode(node.message);
+    }
+    _writer.print(")");
+    return null;
+  }
+
+  @override
   Object visitAssertStatement(AssertStatement node) {
     _writer.print("assert (");
     _visitNode(node.condition);
@@ -8092,6 +8160,18 @@
   }
 
   @override
+  bool visitAssertInitializer(AssertInitializer node) {
+    sink.write("assert (");
+    safelyVisitNode(node.condition);
+    if (node.message != null) {
+      sink.write(', ');
+      safelyVisitNode(node.message);
+    }
+    sink.write(");");
+    return null;
+  }
+
+  @override
   Object visitAssertStatement(AssertStatement node) {
     sink.write("assert (");
     safelyVisitNode(node.condition);
diff --git a/pkg/analyzer/lib/src/dart/element/builder.dart b/pkg/analyzer/lib/src/dart/element/builder.dart
index b421e75..17af70d 100644
--- a/pkg/analyzer/lib/src/dart/element/builder.dart
+++ b/pkg/analyzer/lib/src/dart/element/builder.dart
@@ -155,7 +155,7 @@
     element.labels = holder.labels;
     element.localVariables = holder.localVariables;
     element.parameters = holder.parameters;
-    element.const2 = node.constKeyword != null;
+    element.isConst = node.constKeyword != null;
     if (body.isAsynchronous) {
       element.asynchronous = true;
     }
@@ -198,8 +198,8 @@
       SimpleIdentifier constantName = constant.name;
       FieldElementImpl constantField =
           new ConstFieldElementImpl.forNode(constantName);
-      constantField.static = true;
-      constantField.const3 = true;
+      constantField.isStatic = true;
+      constantField.isConst = true;
       constantField.type = enumType;
       setElementDocumentationComment(constantField, constant);
       fields.add(constantField);
@@ -235,8 +235,8 @@
       FieldFormalParameterElementImpl parameter =
           new FieldFormalParameterElementImpl.forNode(parameterName);
       _setCodeRange(parameter, node);
-      parameter.const3 = node.isConst;
-      parameter.final2 = node.isFinal;
+      parameter.isConst = node.isConst;
+      parameter.isFinal = node.isFinal;
       parameter.parameterKind = node.kind;
       if (field != null) {
         parameter.field = field;
@@ -304,8 +304,8 @@
             .getTopLevelVariable(propertyName) as TopLevelVariableElementImpl;
         if (variable == null) {
           variable = new TopLevelVariableElementImpl(node.name.name, -1);
-          variable.final2 = true;
-          variable.synthetic = true;
+          variable.isFinal = true;
+          variable.isSynthetic = true;
           _currentHolder.addTopLevelVariable(variable);
         }
         if (node.isGetter) {
@@ -328,7 +328,7 @@
           }
           getter.variable = variable;
           getter.getter = true;
-          getter.static = true;
+          getter.isStatic = true;
           variable.getter = getter;
           if (node.returnType == null) {
             getter.hasImplicitReturnType = true;
@@ -357,12 +357,12 @@
           }
           setter.variable = variable;
           setter.setter = true;
-          setter.static = true;
+          setter.isStatic = true;
           if (node.returnType == null) {
             setter.hasImplicitReturnType = true;
           }
           variable.setter = setter;
-          variable.final2 = false;
+          variable.isFinal = false;
           _currentHolder.addAccessor(setter);
           expression.element = setter;
           propertyNameNode.staticElement = setter;
@@ -471,7 +471,7 @@
         element.labels = holder.labels;
         element.localVariables = holder.localVariables;
         element.parameters = holder.parameters;
-        element.static = isStatic;
+        element.isStatic = isStatic;
         element.typeParameters = holder.typeParameters;
         if (body.isAsynchronous) {
           element.asynchronous = true;
@@ -491,9 +491,9 @@
             synthetic: true) as FieldElementImpl;
         if (field == null) {
           field = new FieldElementImpl(node.name.name, -1);
-          field.final2 = true;
-          field.static = isStatic;
-          field.synthetic = true;
+          field.isFinal = true;
+          field.isStatic = isStatic;
+          field.isSynthetic = true;
           _currentHolder.addField(field);
         }
         if (node.isGetter) {
@@ -517,7 +517,7 @@
           getter.variable = field;
           getter.abstract = node.isAbstract;
           getter.getter = true;
-          getter.static = isStatic;
+          getter.isStatic = isStatic;
           field.getter = getter;
           if (node.returnType == null) {
             getter.hasImplicitReturnType = true;
@@ -546,12 +546,12 @@
           setter.variable = field;
           setter.abstract = node.isAbstract;
           setter.setter = true;
-          setter.static = isStatic;
+          setter.isStatic = isStatic;
           if (node.returnType == null) {
             setter.hasImplicitReturnType = true;
           }
           field.setter = setter;
-          field.final2 = false;
+          field.isFinal = false;
           _currentHolder.addAccessor(setter);
           propertyNameNode.staticElement = setter;
         }
@@ -621,7 +621,7 @@
         field = new FieldElementImpl.forNode(fieldName);
       }
       element = field;
-      field.static = fieldNode.isStatic;
+      field.isStatic = fieldNode.isStatic;
       _setCodeRange(element, node);
       setElementDocumentationComment(element, fieldNode);
       field.hasImplicitType = varList.type == null;
@@ -644,8 +644,8 @@
       _currentHolder.addTopLevelVariable(variable);
       variableName.staticElement = element;
     }
-    element.const3 = isConst;
-    element.final2 = isFinal;
+    element.isConst = isConst;
+    element.isFinal = isFinal;
     if (element is PropertyInducingElementImpl) {
       PropertyAccessorElementImpl_ImplicitGetter getter =
           new PropertyAccessorElementImpl_ImplicitGetter(element);
@@ -699,7 +699,7 @@
       ClassElementImpl definingClass) {
     ConstructorElementImpl constructor =
         new ConstructorElementImpl.forNode(null);
-    constructor.synthetic = true;
+    constructor.isSynthetic = true;
     constructor.enclosingElement = definingClass;
     return <ConstructorElement>[constructor];
   }
@@ -867,7 +867,7 @@
     if (!explicitlyImportsCore && coreLibrarySource != librarySource) {
       ImportElementImpl importElement = new ImportElementImpl(-1);
       importElement.importedLibrary = importLibraryMap[coreLibrarySource];
-      importElement.synthetic = true;
+      importElement.isSynthetic = true;
       imports.add(importElement);
     }
     //
@@ -1137,8 +1137,8 @@
     element.metadata = _createElementAnnotations(node.metadata);
     ForEachStatement statement = node.parent as ForEachStatement;
     element.setVisibleRange(statement.offset, statement.length);
-    element.const3 = node.isConst;
-    element.final2 = node.isFinal;
+    element.isConst = node.isConst;
+    element.isFinal = node.isFinal;
     if (node.type == null) {
       element.hasImplicitType = true;
     }
@@ -1283,8 +1283,8 @@
     element.hasImplicitType = varList.type == null;
     _currentHolder.addLocalVariable(element);
     variableName.staticElement = element;
-    element.const3 = isConst;
-    element.final2 = isFinal;
+    element.isConst = isConst;
+    element.isFinal = isFinal;
     buildVariableInitializer(element, initializerNode);
     return null;
   }
@@ -1344,7 +1344,7 @@
       initializer.labels = holder.labels;
       initializer.localVariables = holder.localVariables;
       initializer.parameters = holder.parameters;
-      initializer.synthetic = true;
+      initializer.isSynthetic = true;
       initializer.type = new FunctionTypeImpl(initializer);
       parameter.initializer = initializer;
       parameter.defaultValueCode = defaultValue.toSource();
@@ -1367,7 +1367,7 @@
       initializerElement.functions = holder.functions;
       initializerElement.labels = holder.labels;
       initializerElement.localVariables = holder.localVariables;
-      initializerElement.synthetic = true;
+      initializerElement.isSynthetic = true;
       initializerElement.type = new FunctionTypeImpl(initializerElement);
       variable.initializer = initializerElement;
       holder.validate();
@@ -1388,8 +1388,8 @@
       parameter = new DefaultParameterElementImpl.forNode(parameterName);
     }
     _setCodeRange(parameter, node);
-    parameter.const3 = node.isConst;
-    parameter.final2 = node.isFinal;
+    parameter.isConst = node.isConst;
+    parameter.isFinal = node.isFinal;
     parameter.parameterKind = node.kind;
     // visible range
     _setParameterVisibleRange(node, parameter);
@@ -1436,8 +1436,8 @@
       ParameterElementImpl parameter =
           new ParameterElementImpl.forNode(parameterName);
       _setCodeRange(parameter, node);
-      parameter.const3 = node.isConst;
-      parameter.final2 = node.isFinal;
+      parameter.isConst = node.isConst;
+      parameter.isFinal = node.isFinal;
       parameter.parameterKind = node.kind;
       _setParameterVisibleRange(node, parameter);
       if (node.type == null) {
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 3e29c82..dbb50df 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -546,7 +546,7 @@
       // Ensure at least implicit default constructor.
       if (_constructors.isEmpty) {
         ConstructorElementImpl constructor = new ConstructorElementImpl('', -1);
-        constructor.synthetic = true;
+        constructor.isSynthetic = true;
         constructor.enclosingElement = this;
         _constructors = <ConstructorElement>[constructor];
       }
@@ -1149,7 +1149,7 @@
         .map((ConstructorElement superclassConstructor) {
       ConstructorElementImpl implicitConstructor =
           new ConstructorElementImpl(superclassConstructor.name, -1);
-      implicitConstructor.synthetic = true;
+      implicitConstructor.isSynthetic = true;
       implicitConstructor.redirectedConstructor = superclassConstructor;
       List<ParameterElement> superParameters = superclassConstructor.parameters;
       int count = superParameters.length;
@@ -1160,10 +1160,10 @@
           ParameterElement superParameter = superParameters[i];
           ParameterElementImpl implicitParameter =
               new ParameterElementImpl(superParameter.name, -1);
-          implicitParameter.const3 = superParameter.isConst;
-          implicitParameter.final2 = superParameter.isFinal;
+          implicitParameter.isConst = superParameter.isConst;
+          implicitParameter.isFinal = superParameter.isFinal;
           implicitParameter.parameterKind = superParameter.parameterKind;
-          implicitParameter.synthetic = true;
+          implicitParameter.isSynthetic = true;
           implicitParameter.type =
               superParameter.type.substitute2(argumentTypes, parameterTypes);
           implicitParameters[i] = implicitParameter;
@@ -1221,12 +1221,12 @@
           field = new FieldElementImpl(fieldName, -1);
           implicitFields[fieldName] = field;
           field.enclosingElement = this;
-          field.synthetic = true;
-          field.final2 = e.kind == UnlinkedExecutableKind.getter;
+          field.isSynthetic = true;
+          field.isFinal = e.kind == UnlinkedExecutableKind.getter;
           field.type = fieldType;
-          field.static = e.isStatic;
+          field.isStatic = e.isStatic;
         } else {
-          field.final2 = false;
+          field.isFinal = false;
         }
         accessor.variable = field;
         if (e.kind == UnlinkedExecutableKind.getter) {
@@ -1857,7 +1857,7 @@
 class ConstFieldElementImpl_EnumValues extends ConstFieldElementImpl_ofEnum {
   ConstFieldElementImpl_EnumValues(EnumElementImpl enumElement)
       : super(enumElement) {
-    synthetic = true;
+    isSynthetic = true;
   }
 
   @override
@@ -1899,28 +1899,28 @@
   }
 
   @override
-  void set const3(bool isConst) {
-    assert(false);
-  }
-
-  @override
   void set evaluationResult(_) {
     assert(false);
   }
 
   @override
-  void set final2(bool isFinal) {
-    assert(false);
-  }
-
-  @override
   bool get isConst => true;
 
   @override
+  void set isConst(bool isConst) {
+    assert(false);
+  }
+
+  @override
+  void set isFinal(bool isFinal) {
+    assert(false);
+  }
+
+  @override
   bool get isStatic => true;
 
   @override
-  void set static(bool isStatic) {
+  void set isStatic(bool isStatic) {
     assert(false);
   }
 
@@ -2005,14 +2005,6 @@
       UnlinkedExecutable serializedExecutable, ClassElementImpl enclosingClass)
       : super.forSerialized(serializedExecutable, enclosingClass);
 
-  /**
-   * Set whether this constructor represents a 'const' constructor.
-   */
-  void set const2(bool isConst) {
-    _assertNotResynthesized(serializedExecutable);
-    setModifier(Modifier.CONST, isConst);
-  }
-
   List<ConstructorInitializer> get constantInitializers {
     if (serializedExecutable != null && _constantInitializers == null) {
       _constantInitializers ??= serializedExecutable.constantInitializers
@@ -2052,6 +2044,14 @@
     return hasModifier(Modifier.CONST);
   }
 
+  /**
+   * Set whether this constructor represents a 'const' constructor.
+   */
+  void set isConst(bool isConst) {
+    _assertNotResynthesized(serializedExecutable);
+    setModifier(Modifier.CONST, isConst);
+  }
+
   bool get isCycleFree {
     if (serializedExecutable != null) {
       return serializedExecutable.isConst &&
@@ -2888,6 +2888,13 @@
   @override
   bool get isSynthetic => hasModifier(Modifier.SYNTHETIC);
 
+  /**
+   * Set whether this element is synthetic.
+   */
+  void set isSynthetic(bool isSynthetic) {
+    setModifier(Modifier.SYNTHETIC, isSynthetic);
+  }
+
   @override
   LibraryElement get library =>
       getAncestor((element) => element is LibraryElement);
@@ -2952,13 +2959,6 @@
   }
 
   /**
-   * Set whether this element is synthetic.
-   */
-  void set synthetic(bool isSynthetic) {
-    setModifier(Modifier.SYNTHETIC, isSynthetic);
-  }
-
-  /**
    * Return the context to resolve type parameters in, or `null` if neither this
    * element nor any of its ancestors is of a kind that can declare type
    * parameters.
@@ -3519,8 +3519,8 @@
     // Build the 'index' field.
     fields.add(new FieldElementImpl('index', -1)
       ..enclosingElement = this
-      ..synthetic = true
-      ..final2 = true
+      ..isSynthetic = true
+      ..isFinal = true
       ..type = context.typeProvider.intType);
     // Build the 'values' field.
     fields.add(new ConstFieldElementImpl_EnumValues(this));
@@ -4220,6 +4220,14 @@
     return hasModifier(Modifier.STATIC);
   }
 
+  /**
+   * Set whether this field is static.
+   */
+  void set isStatic(bool isStatic) {
+    _assertNotResynthesized(_unlinkedVariable);
+    setModifier(Modifier.STATIC, isStatic);
+  }
+
   @override
   bool get isVirtual {
     for (ElementAnnotationImpl annotation in metadata) {
@@ -4233,14 +4241,6 @@
   @override
   ElementKind get kind => ElementKind.FIELD;
 
-  /**
-   * Set whether this field is static.
-   */
-  void set static(bool isStatic) {
-    _assertNotResynthesized(_unlinkedVariable);
-    setModifier(Modifier.STATIC, isStatic);
-  }
-
   @override
   accept(ElementVisitor visitor) => visitor.visitFieldElement(this);
 
@@ -4370,7 +4370,7 @@
   FunctionElementImpl.synthetic(
       List<ParameterElement> parameters, DartType returnType)
       : super("", -1) {
-    synthetic = true;
+    isSynthetic = true;
     this.returnType = returnType;
     this.parameters = parameters;
 
@@ -5461,14 +5461,20 @@
           _unlinkedDefiningUnit.exports.length == unlinkedPublicExports.length);
       int length = unlinkedNonPublicExports.length;
       if (length != 0) {
-        List<ExportElement> exports = new List<ExportElement>(length);
+        List<ExportElement> exports = new List<ExportElement>();
         for (int i = 0; i < length; i++) {
           UnlinkedExportPublic serializedExportPublic =
               unlinkedPublicExports[i];
-          UnlinkedExportNonPublic serializedExportNonPublic =
-              unlinkedNonPublicExports[i];
-          exports[i] = new ExportElementImpl.forSerialized(
-              serializedExportPublic, serializedExportNonPublic, library);
+          LibraryElement exportedLibrary = resynthesizerContext
+              .buildExportedLibrary(serializedExportPublic.uri);
+          if (exportedLibrary != null) {
+            UnlinkedExportNonPublic serializedExportNonPublic =
+                unlinkedNonPublicExports[i];
+            ExportElementImpl exportElement =
+                new ExportElementImpl.forSerialized(
+                    serializedExportPublic, serializedExportNonPublic, library);
+            exports.add(exportElement);
+          }
         }
         _exports = exports;
       } else {
@@ -5534,11 +5540,18 @@
       List<UnlinkedImport> unlinkedImports = _unlinkedDefiningUnit.imports;
       int length = unlinkedImports.length;
       if (length != 0) {
-        List<ImportElement> imports = new List<ImportElement>(length);
+        List<ImportElement> imports = new List<ImportElement>();
         LinkedLibrary linkedLibrary = resynthesizerContext.linkedLibrary;
         for (int i = 0; i < length; i++) {
-          imports[i] = new ImportElementImpl.forSerialized(
-              unlinkedImports[i], linkedLibrary.importDependencies[i], library);
+          int dependency = linkedLibrary.importDependencies[i];
+          LibraryElement importedLibrary =
+              resynthesizerContext.buildImportedLibrary(dependency);
+          if (importedLibrary != null) {
+            ImportElementImpl importElement =
+                new ImportElementImpl.forSerialized(
+                    unlinkedImports[i], dependency, library);
+            imports.add(importElement);
+          }
         }
         _imports = imports;
       } else {
@@ -5784,7 +5797,7 @@
   void createLoadLibraryFunction(TypeProvider typeProvider) {
     FunctionElementImpl function =
         new FunctionElementImpl(FunctionElement.LOAD_LIBRARY_NAME, -1);
-    function.synthetic = true;
+    function.isSynthetic = true;
     function.enclosingElement = this;
     function.returnType = typeProvider.futureDynamicType;
     function.type = new FunctionTypeImpl(function);
@@ -6164,6 +6177,14 @@
     return hasModifier(Modifier.STATIC);
   }
 
+  /**
+   * Set whether this method is static.
+   */
+  void set isStatic(bool isStatic) {
+    _assertNotResynthesized(serializedExecutable);
+    setModifier(Modifier.STATIC, isStatic);
+  }
+
   @override
   ElementKind get kind => ElementKind.METHOD;
 
@@ -6176,14 +6197,6 @@
     return super.name;
   }
 
-  /**
-   * Set whether this method is static.
-   */
-  void set static(bool isStatic) {
-    _assertNotResynthesized(serializedExecutable);
-    setModifier(Modifier.STATIC, isStatic);
-  }
-
   @override
   accept(ElementVisitor visitor) => visitor.visitMethodElement(this);
 
@@ -6593,7 +6606,7 @@
   List<ExecutableElement> _elements = MethodElement.EMPTY_LIST;
 
   MultiplyInheritedMethodElementImpl(Identifier name) : super.forNode(name) {
-    synthetic = true;
+    isSynthetic = true;
   }
 
   @override
@@ -6619,7 +6632,7 @@
 
   MultiplyInheritedPropertyAccessorElementImpl(Identifier name)
       : super.forNode(name) {
-    synthetic = true;
+    isSynthetic = true;
   }
 
   @override
@@ -6681,12 +6694,6 @@
   }
 
   @override
-  void set const3(bool isConst) {
-    _assertNotResynthesized(_unlinkedVariable);
-    super.const3 = isConst;
-  }
-
-  @override
   String get documentationComment {
     if (_unlinkedVariable != null) {
       return _unlinkedVariable?.documentationComment?.text;
@@ -6695,12 +6702,6 @@
   }
 
   @override
-  void set final2(bool isFinal) {
-    _assertNotResynthesized(_unlinkedVariable);
-    super.final2 = isFinal;
-  }
-
-  @override
   bool get hasImplicitType {
     if (_unlinkedVariable != null) {
       return _unlinkedVariable.type == null;
@@ -6720,7 +6721,7 @@
       UnlinkedExecutable unlinkedInitializer = _unlinkedVariable.initializer;
       if (unlinkedInitializer != null) {
         _initializer = new FunctionElementImpl.forSerialized(
-            unlinkedInitializer, this)..synthetic = true;
+            unlinkedInitializer, this)..isSynthetic = true;
       } else {
         return null;
       }
@@ -6746,6 +6747,12 @@
   }
 
   @override
+  void set isConst(bool isConst) {
+    _assertNotResynthesized(_unlinkedVariable);
+    super.isConst = isConst;
+  }
+
+  @override
   bool get isFinal {
     if (_unlinkedVariable != null) {
       return _unlinkedVariable.isFinal;
@@ -6754,6 +6761,12 @@
   }
 
   @override
+  void set isFinal(bool isFinal) {
+    _assertNotResynthesized(_unlinkedVariable);
+    super.isFinal = isFinal;
+  }
+
+  @override
   List<ElementAnnotation> get metadata {
     if (_unlinkedVariable != null) {
       return _metadata ??=
@@ -6895,7 +6908,7 @@
             unlinkedParameter, enclosingElement);
       }
     }
-    element.synthetic = synthetic;
+    element.isSynthetic = synthetic;
     return element;
   }
 
@@ -6906,7 +6919,7 @@
       String name, DartType type, ParameterKind kind) {
     ParameterElementImpl element = new ParameterElementImpl(name, -1);
     element.type = type;
-    element.synthetic = true;
+    element.isSynthetic = true;
     element.parameterKind = kind;
     return element;
   }
@@ -6928,12 +6941,6 @@
   }
 
   @override
-  void set const3(bool isConst) {
-    _assertNotResynthesized(_unlinkedParam);
-    super.const3 = isConst;
-  }
-
-  @override
   String get defaultValueCode {
     if (_unlinkedParam != null) {
       if (_unlinkedParam.initializer?.bodyExpr == null) {
@@ -6953,12 +6960,6 @@
   }
 
   @override
-  void set final2(bool isFinal) {
-    _assertNotResynthesized(_unlinkedParam);
-    super.final2 = isFinal;
-  }
-
-  @override
   bool get hasImplicitType {
     if (_unlinkedParam != null) {
       return _unlinkedParam.type == null;
@@ -7000,7 +7001,7 @@
       UnlinkedExecutable unlinkedInitializer = _unlinkedParam.initializer;
       if (unlinkedInitializer != null) {
         _initializer = new FunctionElementImpl.forSerialized(
-            unlinkedInitializer, this)..synthetic = true;
+            unlinkedInitializer, this)..isSynthetic = true;
       } else {
         return null;
       }
@@ -7026,6 +7027,12 @@
   }
 
   @override
+  void set isConst(bool isConst) {
+    _assertNotResynthesized(_unlinkedParam);
+    super.isConst = isConst;
+  }
+
+  @override
   bool get isCovariant {
     if (inheritsCovariant) {
       return true;
@@ -7047,6 +7054,12 @@
   }
 
   @override
+  void set isFinal(bool isFinal) {
+    _assertNotResynthesized(_unlinkedParam);
+    super.isFinal = isFinal;
+  }
+
+  @override
   bool get isInitializingFormal => false;
 
   @override
@@ -7291,7 +7304,7 @@
       : setter = setter,
         super('_${setter.variable.name}', setter.variable.nameOffset) {
     enclosingElement = setter;
-    synthetic = true;
+    isSynthetic = true;
     parameterKind = ParameterKind.REQUIRED;
   }
 
@@ -7453,8 +7466,8 @@
   PropertyAccessorElementImpl.forVariable(PropertyInducingElementImpl variable)
       : super(variable.name, variable.nameOffset) {
     this.variable = variable;
-    static = variable.isStatic;
-    synthetic = true;
+    isStatic = variable.isStatic;
+    isSynthetic = true;
   }
 
   /**
@@ -7544,6 +7557,14 @@
     return hasModifier(Modifier.STATIC);
   }
 
+  /**
+   * Set whether this accessor is static.
+   */
+  void set isStatic(bool isStatic) {
+    _assertNotResynthesized(serializedExecutable);
+    setModifier(Modifier.STATIC, isStatic);
+  }
+
   @override
   ElementKind get kind {
     if (isGetter) {
@@ -7571,14 +7592,6 @@
     setModifier(Modifier.SETTER, isSetter);
   }
 
-  /**
-   * Set whether this accessor is static.
-   */
-  void set static(bool isStatic) {
-    _assertNotResynthesized(serializedExecutable);
-    setModifier(Modifier.STATIC, isStatic);
-  }
-
   @override
   accept(ElementVisitor visitor) => visitor.visitPropertyAccessorElement(this);
 
@@ -7988,7 +8001,7 @@
       : _unlinkedTypeParam = null,
         nestingLevel = null,
         super(name, -1) {
-    synthetic = true;
+    isSynthetic = true;
   }
 
   DartType get bound {
@@ -8344,13 +8357,6 @@
       : super.forSerialized(enclosingElement);
 
   /**
-   * Set whether this variable is const.
-   */
-  void set const3(bool isConst) {
-    setModifier(Modifier.CONST, isConst);
-  }
-
-  /**
    * If this element represents a constant variable, and it has an initializer,
    * a copy of the initializer for the constant.  Otherwise `null`.
    *
@@ -8388,13 +8394,6 @@
         "Invalid attempt to set a compile-time constant result");
   }
 
-  /**
-   * Set whether this variable is final.
-   */
-  void set final2(bool isFinal) {
-    setModifier(Modifier.FINAL, isFinal);
-  }
-
   @override
   bool get hasImplicitType {
     return hasModifier(Modifier.IMPLICIT_TYPE);
@@ -8426,11 +8425,25 @@
     return hasModifier(Modifier.CONST);
   }
 
+  /**
+   * Set whether this variable is const.
+   */
+  void set isConst(bool isConst) {
+    setModifier(Modifier.CONST, isConst);
+  }
+
   @override
   bool get isFinal {
     return hasModifier(Modifier.FINAL);
   }
 
+  /**
+   * Set whether this variable is final.
+   */
+  void set isFinal(bool isFinal) {
+    setModifier(Modifier.FINAL, isFinal);
+  }
+
   @override
   bool get isPotentiallyMutatedInClosure => false;
 
diff --git a/pkg/analyzer/lib/src/dart/error/hint_codes.dart b/pkg/analyzer/lib/src/dart/error/hint_codes.dart
index 011b842..d9914a2 100644
--- a/pkg/analyzer/lib/src/dart/error/hint_codes.dart
+++ b/pkg/analyzer/lib/src/dart/error/hint_codes.dart
@@ -95,12 +95,6 @@
       "Try replacing the use of the deprecated member with the replacement.");
 
   /**
-   * Duplicate imports.
-   */
-  static const HintCode DUPLICATE_IMPORT = const HintCode('DUPLICATE_IMPORT',
-      "Duplicate import.", "Try removing all but one import of the library.");
-
-  /**
    * Hint to use the ~/ operator.
    */
   static const HintCode DIVISION_OPTIMIZATION = const HintCode(
@@ -109,40 +103,39 @@
       "Try re-writing the expression to use the '~/' operator.");
 
   /**
-   * Hint for the `x is double` type checks.
+   * Duplicate imports.
    */
-  static const HintCode IS_DOUBLE = const HintCode(
-      'IS_DOUBLE',
-      "When compiled to JS, this test might return true when the left hand "
-      "side is an int.",
-      "Try testing for 'num' instead.");
+  static const HintCode DUPLICATE_IMPORT = const HintCode('DUPLICATE_IMPORT',
+      "Duplicate import.", "Try removing all but one import of the library.");
 
   /**
-   * Hint for the `x is int` type checks.
+   * It is a bad practice for a source file in a package "lib" directory
+   * hierarchy to traverse outside that directory hierarchy. For example, a
+   * source file in the "lib" directory should not contain a directive such as
+   * `import '../web/some.dart'` which references a file outside the lib
+   * directory.
    */
-  static const HintCode IS_INT = const HintCode(
-      'IS_INT',
-      "When compiled to JS, this test might return true when the left hand "
-      "side is a double.",
-      "Try testing for 'num' instead.");
+  static const HintCode FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE =
+  const HintCode(
+      'FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE',
+      "A file in the 'lib' directory shouldn't import a file outside the "
+          "'lib' directory.",
+      "Try removing the import, or "
+          "moving the imported file inside the 'lib' directory.");
 
   /**
-   * Hint for the `x is! double` type checks.
+   * It is a bad practice for a source file ouside a package "lib" directory
+   * hierarchy to traverse into that directory hierarchy. For example, a source
+   * file in the "web" directory should not contain a directive such as
+   * `import '../lib/some.dart'` which references a file inside the lib
+   * directory.
    */
-  static const HintCode IS_NOT_DOUBLE = const HintCode(
-      'IS_NOT_DOUBLE',
-      "When compiled to JS, this test might return false when the left hand "
-      "side is an int.",
-      "Try testing for 'num' instead.");
-
-  /**
-   * Hint for the `x is! int` type checks.
-   */
-  static const HintCode IS_NOT_INT = const HintCode(
-      'IS_NOT_INT',
-      "When compiled to JS, this test might return false when the left hand "
-      "side is a double.",
-      "Try testing for 'num' instead.");
+  static const HintCode FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE =
+  const HintCode(
+      'FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE',
+      "A file outside the 'lib' directory shouldn't reference a file "
+          "inside the 'lib' directory using a relative path.",
+      "Try using a package: URI instead.");
 
   /**
    * Deferred libraries shouldn't define a top level function 'loadLibrary'.
@@ -199,6 +192,40 @@
       "Factory method '{0}' doesn't return a newly allocated object.");
 
   /**
+   * Generic Method DEP: number of type parameters must match.
+   * <https://github.com/leafpetersen/dep-generic-methods/blob/master/proposal.md#function-subtyping>
+   *
+   * Parameters:
+   * 0: the number of type parameters in the method
+   * 1: the number of type parameters in the overridden method
+   * 2: the name of the class where the overridden method is declared
+   */
+  static const HintCode INVALID_METHOD_OVERRIDE_TYPE_PARAMETERS =
+  const HintCode(
+      'INVALID_METHOD_OVERRIDE_TYPE_PARAMETERS',
+      "The method has {0} type parameters, but it is overriding a method "
+          "with {1} type parameters from '{2}'.",
+      "Try changing the number of type parameters so that they are the same.");
+
+  /**
+   * Generic Method DEP: bounds of type parameters must be compatible.
+   * <https://github.com/leafpetersen/dep-generic-methods/blob/master/proposal.md#function-subtyping>
+   *
+   * Parameters:
+   * 0: the type parameter name
+   * 1: the type parameter bound
+   * 2: the overridden type parameter name
+   * 3: the overridden type parameter bound
+   * 4: the name of the class where the overridden method is declared
+   */
+  static const HintCode INVALID_METHOD_OVERRIDE_TYPE_PARAMETER_BOUND =
+  const HintCode(
+      'INVALID_METHOD_OVERRIDE_TYPE_PARAMETER_BOUND',
+      "The type parameter '{0}' extends '{1}', but that is stricter than "
+          "'{2}' extends '{3}' in the overridden method from '{4}'.",
+      "Try changing the bounds on the type parameters so that they are compatible.");
+
+  /**
    * This hint is generated anywhere where a member annotated with `@protected`
    * is used outside an instance member of a subclass.
    *
@@ -212,6 +239,52 @@
       "of '{1}'.");
 
   /**
+   * Hint for the `x is double` type checks.
+   */
+  static const HintCode IS_DOUBLE = const HintCode(
+      'IS_DOUBLE',
+      "When compiled to JS, this test might return true when the left hand "
+          "side is an int.",
+      "Try testing for 'num' instead.");
+
+  /**
+   * Hint for the `x is int` type checks.
+   */
+  static const HintCode IS_INT = const HintCode(
+      'IS_INT',
+      "When compiled to JS, this test might return true when the left hand "
+          "side is a double.",
+      "Try testing for 'num' instead.");
+
+  /**
+   * Hint for the `x is! double` type checks.
+   */
+  static const HintCode IS_NOT_DOUBLE = const HintCode(
+      'IS_NOT_DOUBLE',
+      "When compiled to JS, this test might return false when the left hand "
+          "side is an int.",
+      "Try testing for 'num' instead.");
+
+  /**
+   * Hint for the `x is! int` type checks.
+   */
+  static const HintCode IS_NOT_INT = const HintCode(
+      'IS_NOT_INT',
+      "When compiled to JS, this test might return false when the left hand "
+          "side is a double.",
+      "Try testing for 'num' instead.");
+
+  /**
+   * Generate a hint for an element that is annotated with `@JS(...)` whose
+   * library declaration is not similarly annotated.
+   */
+  static const HintCode MISSING_JS_LIB_ANNOTATION = const HintCode(
+      'MISSING_JS_LIB_ANNOTATION',
+      "The @JS() annotation can only be used if it is also declared on the "
+          "library directive.",
+      "Try adding the annotation to the library directive.");
+
+  /**
    * Generate a hint for a constructor, function or method invocation where a
    * required parameter is missing.
    *
@@ -234,16 +307,6 @@
       "The parameter '{0}' is required. {1}.");
 
   /**
-   * Generate a hint for an element that is annotated with `@JS(...)` whose
-   * library declaration is not similarly annotated.
-   */
-  static const HintCode MISSING_JS_LIB_ANNOTATION = const HintCode(
-      'MISSING_JS_LIB_ANNOTATION',
-      "The @JS() annotation can only be used if it is also declared on the "
-      "library directive.",
-      "Try adding the annotation to the library directive.");
-
-  /**
    * Generate a hint for methods or functions that have a return type, but do
    * not have a non-void return statement on all branches. At the end of methods
    * or functions with no return, Dart implicitly returns `null`, avoiding these
@@ -282,6 +345,17 @@
       "necessary.");
 
   /**
+   * Hint for classes that override equals, but not hashCode.
+   *
+   * Parameters:
+   * 0: the name of the current class
+   */
+  static const HintCode OVERRIDE_EQUALS_BUT_NOT_HASH_CODE = const HintCode(
+      'OVERRIDE_EQUALS_BUT_NOT_HASH_CODE',
+      "The class '{0}' overrides 'operator==', but not 'get hashCode'.",
+      "Try implementing 'hashCode'.");
+
+  /**
    * A getter with the override annotation does not override an existing getter.
    */
   static const HintCode OVERRIDE_ON_NON_OVERRIDING_GETTER = const HintCode(
@@ -318,15 +392,14 @@
       "removing the override annotation.");
 
   /**
-   * Hint for classes that override equals, but not hashCode.
-   *
-   * Parameters:
-   * 0: the name of the current class
+   * It is a bad practice for a package import to reference anything outside the
+   * given package, or more generally, it is bad practice for a package import
+   * to contain a "..". For example, a source file should not contain a
+   * directive such as `import 'package:foo/../some.dart'`.
    */
-  static const HintCode OVERRIDE_EQUALS_BUT_NOT_HASH_CODE = const HintCode(
-      'OVERRIDE_EQUALS_BUT_NOT_HASH_CODE',
-      "The class '{0}' overrides 'operator==', but not 'get hashCode'.",
-      "Try implementing 'hashCode'.");
+  static const HintCode PACKAGE_IMPORT_CONTAINS_DOT_DOT = const HintCode(
+      'PACKAGE_IMPORT_CONTAINS_DOT_DOT',
+      "A package import shouldn't contain '..'.");
 
   /**
    * Type checks of the type `x is! Null` should be done with `x != null`.
@@ -450,6 +523,25 @@
       "Try correcting the type check, or removing the type check.");
 
   /**
+   * Unused catch exception variables.
+   */
+  static const HintCode UNUSED_CATCH_CLAUSE = const HintCode(
+      'UNUSED_CATCH_CLAUSE',
+      "The exception variable '{0}' isn't used, so the 'catch' clause can be removed.",
+  // TODO(brianwilkerson) Split this error code so that we can differentiate
+  // between removing the catch clause and replacing the catch clause with
+  // an on clause.
+      "Try removing the catch clause.");
+
+  /**
+   * Unused catch stack trace variables.
+   */
+  static const HintCode UNUSED_CATCH_STACK = const HintCode(
+      'UNUSED_CATCH_STACK',
+      "The stack trace variable '{0}' isn't used and can be removed.",
+      "Try removing the stack trace variable, or using it.");
+
+  /**
    * See [Modifier.IS_USED_IN_LIBRARY].
    */
   static const HintCode UNUSED_ELEMENT = const HintCode('UNUSED_ELEMENT',
@@ -470,25 +562,6 @@
       'UNUSED_IMPORT', "Unused import.", "Try removing the import directive.");
 
   /**
-   * Unused catch exception variables.
-   */
-  static const HintCode UNUSED_CATCH_CLAUSE = const HintCode(
-      'UNUSED_CATCH_CLAUSE',
-      "The exception variable '{0}' isn't used, so the 'catch' clause can be removed.",
-      // TODO(brianwilkerson) Split this error code so that we can differentiate
-      // between removing the catch clause and replacing the catch clause with
-      // an on clause.
-      "Try removing the catch clause.");
-
-  /**
-   * Unused catch stack trace variables.
-   */
-  static const HintCode UNUSED_CATCH_STACK = const HintCode(
-      'UNUSED_CATCH_STACK',
-      "The stack trace variable '{0}' isn't used and can be removed.",
-      "Try removing the stack trace variable, or using it.");
-
-  /**
    * Unused local variables are local variables which are never read.
    */
   static const HintCode UNUSED_LOCAL_VARIABLE = const HintCode(
@@ -516,43 +589,20 @@
       "The result of '{0}' is being used, even though it is declared to be 'void'.");
 
   /**
-   * It is a bad practice for a source file in a package "lib" directory
-   * hierarchy to traverse outside that directory hierarchy. For example, a
-   * source file in the "lib" directory should not contain a directive such as
-   * `import '../web/some.dart'` which references a file outside the lib
-   * directory.
+   * It will be a static type warning if <i>m</i> is not a generic method with
+   * exactly <i>n</i> type parameters.
+   *
+   * Parameters:
+   * 0: the name of the method being referenced (<i>G</i>)
+   * 1: the number of type parameters that were declared
+   * 2: the number of type arguments provided
    */
-  static const HintCode FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE =
-      const HintCode(
-          'FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE',
-          "A file in the 'lib' directory shouldn't import a file outside the "
-          "'lib' directory.",
-          "Try removing the import, or "
-          "moving the imported file inside the 'lib' directory.");
-
-  /**
-   * It is a bad practice for a source file ouside a package "lib" directory
-   * hierarchy to traverse into that directory hierarchy. For example, a source
-   * file in the "web" directory should not contain a directive such as
-   * `import '../lib/some.dart'` which references a file inside the lib
-   * directory.
-   */
-  static const HintCode FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE =
-      const HintCode(
-          'FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE',
-          "A file outside the 'lib' directory shouldn't reference a file "
-          "inside the 'lib' directory using a relative path.",
-          "Try using a package: URI instead.");
-
-  /**
-   * It is a bad practice for a package import to reference anything outside the
-   * given package, or more generally, it is bad practice for a package import
-   * to contain a "..". For example, a source file should not contain a
-   * directive such as `import 'package:foo/../some.dart'`.
-   */
-  static const HintCode PACKAGE_IMPORT_CONTAINS_DOT_DOT = const HintCode(
-      'PACKAGE_IMPORT_CONTAINS_DOT_DOT',
-      "A package import shouldn't contain '..'.");
+  static const HintCode WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD =
+  const HintCode(
+      'WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD',
+      "The method '{0}' is declared with {1} type parameters, "
+          "but {2} type arguments were given.",
+      "Try adjusting the number of type arguments.");
 
   /**
    * Initialize a newly created error code to have the given [name]. The message
diff --git a/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart b/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart
index ffc9fab..74d54d7 100644
--- a/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart
+++ b/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart
@@ -9,6 +9,8 @@
 
 import 'package:analyzer/error/error.dart';
 
+export 'package:front_end/src/scanner/errors.dart' show ScannerErrorCode;
+
 /**
  * The error codes used for errors detected by the parser. The convention for
  * this class is for the name of the error code to indicate the problem that
@@ -939,57 +941,3 @@
   @override
   ErrorType get type => ErrorType.SYNTACTIC_ERROR;
 }
-
-/**
- * The error codes used for errors detected by the scanner.
- */
-class ScannerErrorCode extends ErrorCode {
-  /**
-   * Parameters:
-   * 0: the illegal character
-   */
-  static const ScannerErrorCode ILLEGAL_CHARACTER =
-      const ScannerErrorCode('ILLEGAL_CHARACTER', "Illegal character '{0}'.");
-
-  static const ScannerErrorCode MISSING_DIGIT =
-      const ScannerErrorCode('MISSING_DIGIT', "Decimal digit expected.");
-
-  static const ScannerErrorCode MISSING_HEX_DIGIT = const ScannerErrorCode(
-      'MISSING_HEX_DIGIT', "Hexidecimal digit expected.");
-
-  static const ScannerErrorCode MISSING_QUOTE =
-      const ScannerErrorCode('MISSING_QUOTE', "Expected quote (' or \").");
-
-  /**
-   * Parameters:
-   * 0: the path of the file that cannot be read
-   */
-  static const ScannerErrorCode UNABLE_GET_CONTENT = const ScannerErrorCode(
-      'UNABLE_GET_CONTENT', "Unable to get content of '{0}'.");
-
-  static const ScannerErrorCode UNTERMINATED_MULTI_LINE_COMMENT =
-      const ScannerErrorCode(
-          'UNTERMINATED_MULTI_LINE_COMMENT',
-          "Unterminated multi-line comment.",
-          "Try terminating the comment with '*/', or "
-          "removing any unbalanced occurances of '/*' (because comments nest in Dart).");
-
-  static const ScannerErrorCode UNTERMINATED_STRING_LITERAL =
-      const ScannerErrorCode(
-          'UNTERMINATED_STRING_LITERAL', "Unterminated string literal.");
-
-  /**
-   * Initialize a newly created error code to have the given [name]. The message
-   * associated with the error will be created from the given [message]
-   * template. The correction associated with the error will be created from the
-   * given [correction] template.
-   */
-  const ScannerErrorCode(String name, String message, [String correction])
-      : super(name, message, correction);
-
-  @override
-  ErrorSeverity get errorSeverity => ErrorSeverity.ERROR;
-
-  @override
-  ErrorType get type => ErrorType.SYNTACTIC_ERROR;
-}
diff --git a/pkg/analyzer/lib/src/dart/scanner/reader.dart b/pkg/analyzer/lib/src/dart/scanner/reader.dart
index 81f506e..54f367b 100644
--- a/pkg/analyzer/lib/src/dart/scanner/reader.dart
+++ b/pkg/analyzer/lib/src/dart/scanner/reader.dart
@@ -4,6 +4,10 @@
 
 library analyzer.src.dart.scanner.reader;
 
+import 'package:front_end/src/scanner/reader.dart';
+
+export 'package:front_end/src/scanner/reader.dart' show CharacterReader;
+
 /**
  * A [CharacterReader] that reads a range of characters from another character
  * reader.
@@ -57,47 +61,6 @@
 }
 
 /**
- * An object used by the scanner to read the characters to be scanned.
- */
-abstract class CharacterReader {
-  /**
-   * The current offset relative to the beginning of the source. Return the
-   * initial offset if the scanner has not yet scanned the source code, and one
-   * (1) past the end of the source code if the entire source code has been
-   * scanned.
-   */
-  int get offset;
-
-  /**
-   * Set the current offset relative to the beginning of the source to the given
-   * [offset]. The new offset must be between the initial offset and one (1)
-   * past the end of the source code.
-   */
-  void set offset(int offset);
-
-  /**
-   * Advance the current position and return the character at the new current
-   * position.
-   */
-  int advance();
-
-  /**
-   * Return the substring of the source code between the [start] offset and the
-   * modified current position. The current position is modified by adding the
-   * [endDelta], which is the number of characters after the current location to
-   * be included in the string, or the number of characters before the current
-   * location to be excluded if the offset is negative.
-   */
-  String getString(int start, int endDelta);
-
-  /**
-   * Return the character at the current position without changing the current
-   * position.
-   */
-  int peek();
-}
-
-/**
  * A [CharacterReader] that reads characters from a character sequence.
  */
 class CharSequenceReader implements CharacterReader {
diff --git a/pkg/analyzer/lib/src/dart/scanner/scanner.dart b/pkg/analyzer/lib/src/dart/scanner/scanner.dart
index 3c74e78..3f87b84 100644
--- a/pkg/analyzer/lib/src/dart/scanner/scanner.dart
+++ b/pkg/analyzer/lib/src/dart/scanner/scanner.dart
@@ -4,123 +4,15 @@
 
 library analyzer.src.dart.scanner.scanner;
 
-import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
-import 'package:analyzer/src/dart/ast/token.dart';
 import 'package:analyzer/src/dart/error/syntactic_errors.dart';
 import 'package:analyzer/src/dart/scanner/reader.dart';
-import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/source.dart';
-import 'package:charcode/ascii.dart';
+import 'package:front_end/src/scanner/scanner.dart' as fe;
 
 export 'package:analyzer/src/dart/error/syntactic_errors.dart';
-
-/**
- * A state in a state machine used to scan keywords.
- */
-class KeywordState {
-  /**
-   * An empty transition table used by leaf states.
-   */
-  static List<KeywordState> _EMPTY_TABLE = new List<KeywordState>(26);
-
-  /**
-   * The initial state in the state machine.
-   */
-  static final KeywordState KEYWORD_STATE = _createKeywordStateTable();
-
-  /**
-   * A table mapping characters to the states to which those characters will
-   * transition. (The index into the array is the offset from the character
-   * `'a'` to the transitioning character.)
-   */
-  final List<KeywordState> _table;
-
-  /**
-   * The keyword that is recognized by this state, or `null` if this state is
-   * not a terminal state.
-   */
-  Keyword _keyword;
-
-  /**
-   * Initialize a newly created state to have the given transitions and to
-   * recognize the keyword with the given [syntax].
-   */
-  KeywordState(this._table, String syntax) {
-    this._keyword = (syntax == null) ? null : Keyword.keywords[syntax];
-  }
-
-  /**
-   * Return the keyword that was recognized by this state, or `null` if this
-   * state does not recognized a keyword.
-   */
-  Keyword keyword() => _keyword;
-
-  /**
-   * Return the state that follows this state on a transition of the given
-   * [character], or `null` if there is no valid state reachable from this state
-   * with such a transition.
-   */
-  KeywordState next(int character) => _table[character - $a];
-
-  /**
-   * Create the next state in the state machine where we have already recognized
-   * the subset of strings in the given array of [strings] starting at the given
-   * [offset] and having the given [length]. All of these strings have a common
-   * prefix and the next character is at the given [start] index.
-   */
-  static KeywordState _computeKeywordStateTable(
-      int start, List<String> strings, int offset, int length) {
-    List<KeywordState> result = new List<KeywordState>(26);
-    assert(length != 0);
-    int chunk = $nul;
-    int chunkStart = -1;
-    bool isLeaf = false;
-    for (int i = offset; i < offset + length; i++) {
-      if (strings[i].length == start) {
-        isLeaf = true;
-      }
-      if (strings[i].length > start) {
-        int c = strings[i].codeUnitAt(start);
-        if (chunk != c) {
-          if (chunkStart != -1) {
-            result[chunk - $a] = _computeKeywordStateTable(
-                start + 1, strings, chunkStart, i - chunkStart);
-          }
-          chunkStart = i;
-          chunk = c;
-        }
-      }
-    }
-    if (chunkStart != -1) {
-      assert(result[chunk - $a] == null);
-      result[chunk - $a] = _computeKeywordStateTable(
-          start + 1, strings, chunkStart, offset + length - chunkStart);
-    } else {
-      assert(length == 1);
-      return new KeywordState(_EMPTY_TABLE, strings[offset]);
-    }
-    if (isLeaf) {
-      return new KeywordState(result, strings[offset]);
-    } else {
-      return new KeywordState(result, null);
-    }
-  }
-
-  /**
-   * Create and return the initial state in the state machine.
-   */
-  static KeywordState _createKeywordStateTable() {
-    List<Keyword> values = Keyword.values;
-    List<String> strings = new List<String>(values.length);
-    for (int i = 0; i < values.length; i++) {
-      strings[i] = values[i].syntax;
-    }
-    strings.sort();
-    return _computeKeywordStateTable(0, strings, 0, strings.length);
-  }
-}
+export 'package:front_end/src/scanner/scanner.dart' show KeywordState;
 
 /**
  * The class `Scanner` implements a scanner for Dart code.
@@ -132,1224 +24,31 @@
  * any context, so it always resolves such conflicts by scanning the longest
  * possible token.
  */
-class Scanner {
+class Scanner extends fe.Scanner {
   /**
    * The source being scanned.
    */
   final Source source;
 
   /**
-   * The reader used to access the characters in the source.
-   */
-  final CharacterReader _reader;
-
-  /**
    * The error listener that will be informed of any errors that are found
    * during the scan.
    */
   final AnalysisErrorListener _errorListener;
 
   /**
-   * The flag specifying whether documentation comments should be parsed.
-   */
-  bool _preserveComments = true;
-
-  /**
-   * The token pointing to the head of the linked list of tokens.
-   */
-  Token _tokens;
-
-  /**
-   * The last token that was scanned.
-   */
-  Token _tail;
-
-  /**
-   * The first token in the list of comment tokens found since the last
-   * non-comment token.
-   */
-  Token _firstComment;
-
-  /**
-   * The last token in the list of comment tokens found since the last
-   * non-comment token.
-   */
-  Token _lastComment;
-
-  /**
-   * The index of the first character of the current token.
-   */
-  int _tokenStart = 0;
-
-  /**
-   * A list containing the offsets of the first character of each line in the
-   * source code.
-   */
-  List<int> _lineStarts = new List<int>();
-
-  /**
-   * A list, treated something like a stack, of tokens representing the
-   * beginning of a matched pair. It is used to pair the end tokens with the
-   * begin tokens.
-   */
-  List<BeginToken> _groupingStack = new List<BeginToken>();
-
-  /**
-   * The index of the last item in the [_groupingStack], or `-1` if the stack is
-   * empty.
-   */
-  int _stackEnd = -1;
-
-  /**
-   * A flag indicating whether any unmatched groups were found during the parse.
-   */
-  bool _hasUnmatchedGroups = false;
-
-  /**
-   * A flag indicating whether to parse generic method comments, of the form
-   * `/*=T*/` and `/*<T>*/`.
-   */
-  bool scanGenericMethodComments = false;
-
-  /**
-   * A flag indicating whether the lazy compound assignment operators '&&=' and
-   * '||=' are enabled.
-   */
-  bool scanLazyAssignmentOperators = false;
-
-  /**
    * Initialize a newly created scanner to scan characters from the given
-   * [source]. The given character [_reader] will be used to read the characters
+   * [source]. The given character [reader] will be used to read the characters
    * in the source. The given [_errorListener] will be informed of any errors
    * that are found.
    */
-  Scanner(this.source, this._reader, this._errorListener) {
-    _tokens = new Token(TokenType.EOF, -1);
-    _tokens.setNext(_tokens);
-    _tail = _tokens;
-    _tokenStart = -1;
-    _lineStarts.add(0);
-  }
+  Scanner(this.source, CharacterReader reader, this._errorListener)
+      : super(reader);
 
-  /**
-   * Return the first token in the token stream that was scanned.
-   */
-  Token get firstToken => _tokens.next;
-
-  /**
-   * Return `true` if any unmatched groups were found during the parse.
-   */
-  bool get hasUnmatchedGroups => _hasUnmatchedGroups;
-
-  /**
-   * Return an array containing the offsets of the first character of each line
-   * in the source code.
-   */
-  List<int> get lineStarts => _lineStarts;
-
-  /**
-   * Set whether documentation tokens should be preserved.
-   */
-  void set preserveComments(bool preserveComments) {
-    this._preserveComments = preserveComments;
-  }
-
-  /**
-   * Return the last token that was scanned.
-   */
-  Token get tail => _tail;
-
-  /**
-   * Append the given [token] to the end of the token stream being scanned. This
-   * method is intended to be used by subclasses that copy existing tokens and
-   * should not normally be used because it will fail to correctly associate any
-   * comments with the token being passed in.
-   */
-  void appendToken(Token token) {
-    _tail = _tail.setNext(token);
-  }
-
-  int bigSwitch(int next) {
-    _beginToken();
-    if (next == $cr) {
-      // '\r'
-      next = _reader.advance();
-      if (next == $lf) {
-        // '\n'
-        next = _reader.advance();
-      }
-      recordStartOfLine();
-      return next;
-    } else if (next == $lf) {
-      // '\n'
-      next = _reader.advance();
-      recordStartOfLine();
-      return next;
-    } else if (next == $tab || next == $space) {
-      // '\t' || ' '
-      return _reader.advance();
-    }
-    if (next == $r) {
-      // 'r'
-      int peek = _reader.peek();
-      if (peek == $double_quote || peek == $single_quote) {
-        // '"' || "'"
-        int start = _reader.offset;
-        return _tokenizeString(_reader.advance(), start, true);
-      }
-    }
-    if ($a <= next && next <= $z) {
-      // 'a'-'z'
-      return _tokenizeKeywordOrIdentifier(next, true);
-    }
-    if (($A <= next && next <= $Z) || next == $_ || next == $$) {
-      // 'A'-'Z' || '_' || '$'
-      return _tokenizeIdentifier(next, _reader.offset, true);
-    }
-    if (next == $lt) {
-      // '<'
-      return _tokenizeLessThan(next);
-    }
-    if (next == $gt) {
-      // '>'
-      return _tokenizeGreaterThan(next);
-    }
-    if (next == $equal) {
-      // '='
-      return _tokenizeEquals(next);
-    }
-    if (next == $exclamation) {
-      // '!'
-      return _tokenizeExclamation(next);
-    }
-    if (next == $plus) {
-      // '+'
-      return _tokenizePlus(next);
-    }
-    if (next == $minus) {
-      // '-'
-      return _tokenizeMinus(next);
-    }
-    if (next == $asterisk) {
-      // '*'
-      return _tokenizeMultiply(next);
-    }
-    if (next == $percent) {
-      // '%'
-      return _tokenizePercent(next);
-    }
-    if (next == $ampersand) {
-      // '&'
-      return _tokenizeAmpersand(next);
-    }
-    if (next == $bar) {
-      // '|'
-      return _tokenizeBar(next);
-    }
-    if (next == $caret) {
-      // '^'
-      return _tokenizeCaret(next);
-    }
-    if (next == $open_bracket) {
-      // '['
-      return _tokenizeOpenSquareBracket(next);
-    }
-    if (next == $tilde) {
-      // '~'
-      return _tokenizeTilde(next);
-    }
-    if (next == $backslash) {
-      // '\\'
-      _appendTokenOfType(TokenType.BACKSLASH);
-      return _reader.advance();
-    }
-    if (next == $hash) {
-      // '#'
-      return _tokenizeTag(next);
-    }
-    if (next == $open_paren) {
-      // '('
-      _appendBeginToken(TokenType.OPEN_PAREN);
-      return _reader.advance();
-    }
-    if (next == $close_paren) {
-      // ')'
-      _appendEndToken(TokenType.CLOSE_PAREN, TokenType.OPEN_PAREN);
-      return _reader.advance();
-    }
-    if (next == $comma) {
-      // ','
-      _appendTokenOfType(TokenType.COMMA);
-      return _reader.advance();
-    }
-    if (next == $colon) {
-      // ':'
-      _appendTokenOfType(TokenType.COLON);
-      return _reader.advance();
-    }
-    if (next == $semicolon) {
-      // ';'
-      _appendTokenOfType(TokenType.SEMICOLON);
-      return _reader.advance();
-    }
-    if (next == $question) {
-      // '?'
-      return _tokenizeQuestion();
-    }
-    if (next == $close_bracket) {
-      // ']'
-      _appendEndToken(
-          TokenType.CLOSE_SQUARE_BRACKET, TokenType.OPEN_SQUARE_BRACKET);
-      return _reader.advance();
-    }
-    if (next == $backquote) {
-      // '`'
-      _appendTokenOfType(TokenType.BACKPING);
-      return _reader.advance();
-    }
-    if (next == $lbrace) {
-      // '{'
-      _appendBeginToken(TokenType.OPEN_CURLY_BRACKET);
-      return _reader.advance();
-    }
-    if (next == $rbrace) {
-      // '}'
-      _appendEndToken(
-          TokenType.CLOSE_CURLY_BRACKET, TokenType.OPEN_CURLY_BRACKET);
-      return _reader.advance();
-    }
-    if (next == $slash) {
-      // '/'
-      return _tokenizeSlashOrComment(next);
-    }
-    if (next == $at) {
-      // '@'
-      _appendTokenOfType(TokenType.AT);
-      return _reader.advance();
-    }
-    if (next == $double_quote || next == $single_quote) {
-      // '"' || "'"
-      return _tokenizeString(next, _reader.offset, false);
-    }
-    if (next == $dot) {
-      // '.'
-      return _tokenizeDotOrNumber(next);
-    }
-    if (next == $0) {
-      // '0'
-      return _tokenizeHexOrNumber(next);
-    }
-    if ($1 <= next && next <= $9) {
-      // '1'-'9'
-      return _tokenizeNumber(next);
-    }
-    if (next == -1) {
-      // EOF
-      return -1;
-    }
-    _reportError(ScannerErrorCode.ILLEGAL_CHARACTER, [next]);
-    return _reader.advance();
-  }
-
-  /**
-   * Record the fact that we are at the beginning of a new line in the source.
-   */
-  void recordStartOfLine() {
-    _lineStarts.add(_reader.offset);
-  }
-
-  /**
-   * Record that the source begins on the given [line] and [column] at the
-   * current offset as given by the reader. Both the line and the column are
-   * one-based indexes. The line starts for lines before the given line will not
-   * be correct.
-   *
-   * This method must be invoked at most one time and must be invoked before
-   * scanning begins. The values provided must be sensible. The results are
-   * undefined if these conditions are violated.
-   */
-  void setSourceStart(int line, int column) {
-    int offset = _reader.offset;
-    if (line < 1 || column < 1 || offset < 0 || (line + column - 2) >= offset) {
-      return;
-    }
-    for (int i = 2; i < line; i++) {
-      _lineStarts.add(1);
-    }
-    _lineStarts.add(offset - column + 1);
-  }
-
-  /**
-   * Scan the source code to produce a list of tokens representing the source,
-   * and return the first token in the list of tokens that were produced.
-   */
-  Token tokenize() {
-    int next = _reader.advance();
-    while (next != -1) {
-      next = bigSwitch(next);
-    }
-    _appendEofToken();
-    return firstToken;
-  }
-
-  void _appendBeginToken(TokenType type) {
-    BeginToken token;
-    if (_firstComment == null) {
-      token = new BeginToken(type, _tokenStart);
-    } else {
-      token = new BeginTokenWithComment(type, _tokenStart, _firstComment);
-      _firstComment = null;
-      _lastComment = null;
-    }
-    _tail = _tail.setNext(token);
-    _groupingStack.add(token);
-    _stackEnd++;
-  }
-
-  void _appendCommentToken(TokenType type, String value) {
-    CommentToken token = null;
-    TokenType genericComment = _matchGenericMethodCommentType(value);
-    if (genericComment != null) {
-      token = new CommentToken(genericComment, value, _tokenStart);
-    } else if (!_preserveComments) {
-      // Ignore comment tokens if client specified that it doesn't need them.
-      return;
-    } else {
-      // OK, remember comment tokens.
-      if (_isDocumentationComment(value)) {
-        token = new DocumentationCommentToken(type, value, _tokenStart);
-      } else {
-        token = new CommentToken(type, value, _tokenStart);
-      }
-    }
-    if (_firstComment == null) {
-      _firstComment = token;
-      _lastComment = _firstComment;
-    } else {
-      _lastComment = _lastComment.setNext(token);
-    }
-  }
-
-  void _appendEndToken(TokenType type, TokenType beginType) {
-    Token token;
-    if (_firstComment == null) {
-      token = new Token(type, _tokenStart);
-    } else {
-      token = new TokenWithComment(type, _tokenStart, _firstComment);
-      _firstComment = null;
-      _lastComment = null;
-    }
-    _tail = _tail.setNext(token);
-    if (_stackEnd >= 0) {
-      BeginToken begin = _groupingStack[_stackEnd];
-      if (begin.type == beginType) {
-        begin.endToken = token;
-        _groupingStack.removeAt(_stackEnd--);
-      }
-    }
-  }
-
-  void _appendEofToken() {
-    Token eofToken;
-    if (_firstComment == null) {
-      eofToken = new Token(TokenType.EOF, _reader.offset + 1);
-    } else {
-      eofToken = new TokenWithComment(
-          TokenType.EOF, _reader.offset + 1, _firstComment);
-      _firstComment = null;
-      _lastComment = null;
-    }
-    // The EOF token points to itself so that there is always infinite
-    // look-ahead.
-    eofToken.setNext(eofToken);
-    _tail = _tail.setNext(eofToken);
-    if (_stackEnd >= 0) {
-      _hasUnmatchedGroups = true;
-      // TODO(brianwilkerson) Fix the ungrouped tokens?
-    }
-  }
-
-  void _appendKeywordToken(Keyword keyword) {
-    if (_firstComment == null) {
-      _tail = _tail.setNext(new KeywordToken(keyword, _tokenStart));
-    } else {
-      _tail = _tail.setNext(
-          new KeywordTokenWithComment(keyword, _tokenStart, _firstComment));
-      _firstComment = null;
-      _lastComment = null;
-    }
-  }
-
-  void _appendStringToken(TokenType type, String value) {
-    if (_firstComment == null) {
-      _tail = _tail.setNext(new StringToken(type, value, _tokenStart));
-    } else {
-      _tail = _tail.setNext(
-          new StringTokenWithComment(type, value, _tokenStart, _firstComment));
-      _firstComment = null;
-      _lastComment = null;
-    }
-  }
-
-  void _appendStringTokenWithOffset(TokenType type, String value, int offset) {
-    if (_firstComment == null) {
-      _tail = _tail.setNext(new StringToken(type, value, _tokenStart + offset));
-    } else {
-      _tail = _tail.setNext(new StringTokenWithComment(
-          type, value, _tokenStart + offset, _firstComment));
-      _firstComment = null;
-      _lastComment = null;
-    }
-  }
-
-  void _appendTokenOfType(TokenType type) {
-    if (_firstComment == null) {
-      _tail = _tail.setNext(new Token(type, _tokenStart));
-    } else {
-      _tail =
-          _tail.setNext(new TokenWithComment(type, _tokenStart, _firstComment));
-      _firstComment = null;
-      _lastComment = null;
-    }
-  }
-
-  void _appendTokenOfTypeWithOffset(TokenType type, int offset) {
-    if (_firstComment == null) {
-      _tail = _tail.setNext(new Token(type, offset));
-    } else {
-      _tail = _tail.setNext(new TokenWithComment(type, offset, _firstComment));
-      _firstComment = null;
-      _lastComment = null;
-    }
-  }
-
-  void _beginToken() {
-    _tokenStart = _reader.offset;
-  }
-
-  /**
-   * Return the beginning token corresponding to a closing brace that was found
-   * while scanning inside a string interpolation expression. Tokens that cannot
-   * be matched with the closing brace will be dropped from the stack.
-   */
-  BeginToken _findTokenMatchingClosingBraceInInterpolationExpression() {
-    while (_stackEnd >= 0) {
-      BeginToken begin = _groupingStack[_stackEnd];
-      if (begin.type == TokenType.OPEN_CURLY_BRACKET ||
-          begin.type == TokenType.STRING_INTERPOLATION_EXPRESSION) {
-        return begin;
-      }
-      _hasUnmatchedGroups = true;
-      _groupingStack.removeAt(_stackEnd--);
-    }
-    //
-    // We should never get to this point because we wouldn't be inside a string
-    // interpolation expression unless we had previously found the start of the
-    // expression.
-    //
-    return null;
-  }
-
-  /**
-   * Checks if [value] is the start of a generic method type annotation comment.
-   *
-   * This can either be of the form `/*<T>*/` or `/*=T*/`. The token type is
-   * returned, or null if it was not a generic method comment.
-   */
-  TokenType _matchGenericMethodCommentType(String value) {
-    if (scanGenericMethodComments) {
-      // Match /*< and >*/
-      if (StringUtilities.startsWith3(value, 0, $slash, $asterisk, $lt) &&
-          StringUtilities.endsWith3(value, $gt, $asterisk, $slash)) {
-        return TokenType.GENERIC_METHOD_TYPE_LIST;
-      }
-      // Match /*=
-      if (StringUtilities.startsWith3(value, 0, $slash, $asterisk, $equal)) {
-        return TokenType.GENERIC_METHOD_TYPE_ASSIGN;
-      }
-    }
-    return null;
-  }
-
-  /**
-   * Report an error at the current offset. The [errorCode] is the error code
-   * indicating the nature of the error. The [arguments] are any arguments
-   * needed to complete the error message
-   */
-  void _reportError(ScannerErrorCode errorCode, [List<Object> arguments]) {
-    _errorListener.onError(
-        new AnalysisError(source, _reader.offset, 1, errorCode, arguments));
-  }
-
-  int _select(int choice, TokenType yesType, TokenType noType) {
-    int next = _reader.advance();
-    if (next == choice) {
-      _appendTokenOfType(yesType);
-      return _reader.advance();
-    } else {
-      _appendTokenOfType(noType);
-      return next;
-    }
-  }
-
-  int _selectWithOffset(
-      int choice, TokenType yesType, TokenType noType, int offset) {
-    int next = _reader.advance();
-    if (next == choice) {
-      _appendTokenOfTypeWithOffset(yesType, offset);
-      return _reader.advance();
-    } else {
-      _appendTokenOfTypeWithOffset(noType, offset);
-      return next;
-    }
-  }
-
-  int _tokenizeAmpersand(int next) {
-    // &&= && &= &
-    next = _reader.advance();
-    if (next == $ampersand) {
-      next = _reader.advance();
-      if (scanLazyAssignmentOperators && next == $equal) {
-        _appendTokenOfType(TokenType.AMPERSAND_AMPERSAND_EQ);
-        return _reader.advance();
-      }
-      _appendTokenOfType(TokenType.AMPERSAND_AMPERSAND);
-      return next;
-    } else if (next == $equal) {
-      _appendTokenOfType(TokenType.AMPERSAND_EQ);
-      return _reader.advance();
-    } else {
-      _appendTokenOfType(TokenType.AMPERSAND);
-      return next;
-    }
-  }
-
-  int _tokenizeBar(int next) {
-    // ||= || |= |
-    next = _reader.advance();
-    if (next == $bar) {
-      next = _reader.advance();
-      if (scanLazyAssignmentOperators && next == $equal) {
-        _appendTokenOfType(TokenType.BAR_BAR_EQ);
-        return _reader.advance();
-      }
-      _appendTokenOfType(TokenType.BAR_BAR);
-      return next;
-    } else if (next == $equal) {
-      _appendTokenOfType(TokenType.BAR_EQ);
-      return _reader.advance();
-    } else {
-      _appendTokenOfType(TokenType.BAR);
-      return next;
-    }
-  }
-
-  int _tokenizeCaret(int next) =>
-      _select($equal, TokenType.CARET_EQ, TokenType.CARET);
-
-  int _tokenizeDotOrNumber(int next) {
-    int start = _reader.offset;
-    next = _reader.advance();
-    if ($0 <= next && next <= $9) {
-      return _tokenizeFractionPart(next, start);
-    } else if ($dot == next) {
-      return _select(
-          $dot, TokenType.PERIOD_PERIOD_PERIOD, TokenType.PERIOD_PERIOD);
-    } else {
-      _appendTokenOfType(TokenType.PERIOD);
-      return next;
-    }
-  }
-
-  int _tokenizeEquals(int next) {
-    // = == =>
-    next = _reader.advance();
-    if (next == $equal) {
-      _appendTokenOfType(TokenType.EQ_EQ);
-      return _reader.advance();
-    } else if (next == $gt) {
-      _appendTokenOfType(TokenType.FUNCTION);
-      return _reader.advance();
-    }
-    _appendTokenOfType(TokenType.EQ);
-    return next;
-  }
-
-  int _tokenizeExclamation(int next) {
-    // ! !=
-    next = _reader.advance();
-    if (next == $equal) {
-      _appendTokenOfType(TokenType.BANG_EQ);
-      return _reader.advance();
-    }
-    _appendTokenOfType(TokenType.BANG);
-    return next;
-  }
-
-  int _tokenizeExponent(int next) {
-    if (next == $plus || next == $minus) {
-      next = _reader.advance();
-    }
-    bool hasDigits = false;
-    while (true) {
-      if ($0 <= next && next <= $9) {
-        hasDigits = true;
-      } else {
-        if (!hasDigits) {
-          _reportError(ScannerErrorCode.MISSING_DIGIT);
-        }
-        return next;
-      }
-      next = _reader.advance();
-    }
-  }
-
-  int _tokenizeFractionPart(int next, int start) {
-    bool done = false;
-    bool hasDigit = false;
-    LOOP:
-    while (!done) {
-      if ($0 <= next && next <= $9) {
-        hasDigit = true;
-      } else if ($e == next || $E == next) {
-        hasDigit = true;
-        next = _tokenizeExponent(_reader.advance());
-        done = true;
-        continue LOOP;
-      } else {
-        done = true;
-        continue LOOP;
-      }
-      next = _reader.advance();
-    }
-    if (!hasDigit) {
-      _appendStringToken(TokenType.INT, _reader.getString(start, -2));
-      if ($dot == next) {
-        return _selectWithOffset($dot, TokenType.PERIOD_PERIOD_PERIOD,
-            TokenType.PERIOD_PERIOD, _reader.offset - 1);
-      }
-      _appendTokenOfTypeWithOffset(TokenType.PERIOD, _reader.offset - 1);
-      return bigSwitch(next);
-    }
-    _appendStringToken(
-        TokenType.DOUBLE, _reader.getString(start, next < 0 ? 0 : -1));
-    return next;
-  }
-
-  int _tokenizeGreaterThan(int next) {
-    // > >= >> >>=
-    next = _reader.advance();
-    if ($equal == next) {
-      _appendTokenOfType(TokenType.GT_EQ);
-      return _reader.advance();
-    } else if ($gt == next) {
-      next = _reader.advance();
-      if ($equal == next) {
-        _appendTokenOfType(TokenType.GT_GT_EQ);
-        return _reader.advance();
-      } else {
-        _appendTokenOfType(TokenType.GT_GT);
-        return next;
-      }
-    } else {
-      _appendTokenOfType(TokenType.GT);
-      return next;
-    }
-  }
-
-  int _tokenizeHex(int next) {
-    int start = _reader.offset - 1;
-    bool hasDigits = false;
-    while (true) {
-      next = _reader.advance();
-      if (($0 <= next && next <= $9) ||
-          ($A <= next && next <= $F) ||
-          ($a <= next && next <= $f)) {
-        hasDigits = true;
-      } else {
-        if (!hasDigits) {
-          _reportError(ScannerErrorCode.MISSING_HEX_DIGIT);
-        }
-        _appendStringToken(
-            TokenType.HEXADECIMAL, _reader.getString(start, next < 0 ? 0 : -1));
-        return next;
-      }
-    }
-  }
-
-  int _tokenizeHexOrNumber(int next) {
-    int x = _reader.peek();
-    if (x == $x || x == $X) {
-      _reader.advance();
-      return _tokenizeHex(x);
-    }
-    return _tokenizeNumber(next);
-  }
-
-  int _tokenizeIdentifier(int next, int start, bool allowDollar) {
-    while (($a <= next && next <= $z) ||
-        ($A <= next && next <= $Z) ||
-        ($0 <= next && next <= $9) ||
-        next == $_ ||
-        (next == $$ && allowDollar)) {
-      next = _reader.advance();
-    }
-    _appendStringToken(
-        TokenType.IDENTIFIER, _reader.getString(start, next < 0 ? 0 : -1));
-    return next;
-  }
-
-  int _tokenizeInterpolatedExpression(int next, int start) {
-    _appendBeginToken(TokenType.STRING_INTERPOLATION_EXPRESSION);
-    next = _reader.advance();
-    while (next != -1) {
-      if (next == $rbrace) {
-        BeginToken begin =
-            _findTokenMatchingClosingBraceInInterpolationExpression();
-        if (begin == null) {
-          _beginToken();
-          _appendTokenOfType(TokenType.CLOSE_CURLY_BRACKET);
-          next = _reader.advance();
-          _beginToken();
-          return next;
-        } else if (begin.type == TokenType.OPEN_CURLY_BRACKET) {
-          _beginToken();
-          _appendEndToken(
-              TokenType.CLOSE_CURLY_BRACKET, TokenType.OPEN_CURLY_BRACKET);
-          next = _reader.advance();
-          _beginToken();
-        } else if (begin.type == TokenType.STRING_INTERPOLATION_EXPRESSION) {
-          _beginToken();
-          _appendEndToken(TokenType.CLOSE_CURLY_BRACKET,
-              TokenType.STRING_INTERPOLATION_EXPRESSION);
-          next = _reader.advance();
-          _beginToken();
-          return next;
-        }
-      } else {
-        next = bigSwitch(next);
-      }
-    }
-    return next;
-  }
-
-  int _tokenizeInterpolatedIdentifier(int next, int start) {
-    _appendStringTokenWithOffset(
-        TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 0);
-    if (($A <= next && next <= $Z) ||
-        ($a <= next && next <= $z) ||
-        next == $_) {
-      _beginToken();
-      next = _tokenizeKeywordOrIdentifier(next, false);
-    }
-    _beginToken();
-    return next;
-  }
-
-  int _tokenizeKeywordOrIdentifier(int next, bool allowDollar) {
-    KeywordState state = KeywordState.KEYWORD_STATE;
-    int start = _reader.offset;
-    while (state != null && $a <= next && next <= $z) {
-      state = state.next(next);
-      next = _reader.advance();
-    }
-    if (state == null || state.keyword() == null) {
-      return _tokenizeIdentifier(next, start, allowDollar);
-    }
-    if (($A <= next && next <= $Z) ||
-        ($0 <= next && next <= $9) ||
-        next == $_ ||
-        next == $$) {
-      return _tokenizeIdentifier(next, start, allowDollar);
-    } else if (next < 128) {
-      _appendKeywordToken(state.keyword());
-      return next;
-    } else {
-      return _tokenizeIdentifier(next, start, allowDollar);
-    }
-  }
-
-  int _tokenizeLessThan(int next) {
-    // < <= << <<=
-    next = _reader.advance();
-    if ($equal == next) {
-      _appendTokenOfType(TokenType.LT_EQ);
-      return _reader.advance();
-    } else if ($lt == next) {
-      return _select($equal, TokenType.LT_LT_EQ, TokenType.LT_LT);
-    } else {
-      _appendTokenOfType(TokenType.LT);
-      return next;
-    }
-  }
-
-  int _tokenizeMinus(int next) {
-    // - -- -=
-    next = _reader.advance();
-    if (next == $minus) {
-      _appendTokenOfType(TokenType.MINUS_MINUS);
-      return _reader.advance();
-    } else if (next == $equal) {
-      _appendTokenOfType(TokenType.MINUS_EQ);
-      return _reader.advance();
-    } else {
-      _appendTokenOfType(TokenType.MINUS);
-      return next;
-    }
-  }
-
-  int _tokenizeMultiLineComment(int next) {
-    int nesting = 1;
-    next = _reader.advance();
-    while (true) {
-      if (-1 == next) {
-        _reportError(ScannerErrorCode.UNTERMINATED_MULTI_LINE_COMMENT);
-        _appendCommentToken(
-            TokenType.MULTI_LINE_COMMENT, _reader.getString(_tokenStart, 0));
-        return next;
-      } else if ($asterisk == next) {
-        next = _reader.advance();
-        if ($slash == next) {
-          --nesting;
-          if (0 == nesting) {
-            _appendCommentToken(TokenType.MULTI_LINE_COMMENT,
-                _reader.getString(_tokenStart, 0));
-            return _reader.advance();
-          } else {
-            next = _reader.advance();
-          }
-        }
-      } else if ($slash == next) {
-        next = _reader.advance();
-        if ($asterisk == next) {
-          next = _reader.advance();
-          ++nesting;
-        }
-      } else if (next == $cr) {
-        next = _reader.advance();
-        if (next == $lf) {
-          next = _reader.advance();
-        }
-        recordStartOfLine();
-      } else if (next == $lf) {
-        next = _reader.advance();
-        recordStartOfLine();
-      } else {
-        next = _reader.advance();
-      }
-    }
-  }
-
-  int _tokenizeMultiLineRawString(int quoteChar, int start) {
-    int next = _reader.advance();
-    outer:
-    while (next != -1) {
-      while (next != quoteChar) {
-        if (next == -1) {
-          break outer;
-        } else if (next == $cr) {
-          next = _reader.advance();
-          if (next == $lf) {
-            next = _reader.advance();
-          }
-          recordStartOfLine();
-        } else if (next == $lf) {
-          next = _reader.advance();
-          recordStartOfLine();
-        } else {
-          next = _reader.advance();
-        }
-      }
-      next = _reader.advance();
-      if (next == quoteChar) {
-        next = _reader.advance();
-        if (next == quoteChar) {
-          _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
-          return _reader.advance();
-        }
-      }
-    }
-    _reportError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL);
-    _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
-    return _reader.advance();
-  }
-
-  int _tokenizeMultiLineString(int quoteChar, int start, bool raw) {
-    if (raw) {
-      return _tokenizeMultiLineRawString(quoteChar, start);
-    }
-    int next = _reader.advance();
-    while (next != -1) {
-      if (next == $$) {
-        _appendStringToken(TokenType.STRING, _reader.getString(start, -1));
-        next = _tokenizeStringInterpolation(start);
-        _beginToken();
-        start = _reader.offset;
-        continue;
-      }
-      if (next == quoteChar) {
-        next = _reader.advance();
-        if (next == quoteChar) {
-          next = _reader.advance();
-          if (next == quoteChar) {
-            _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
-            return _reader.advance();
-          }
-        }
-        continue;
-      }
-      if (next == $backslash) {
-        next = _reader.advance();
-        if (next == -1) {
-          break;
-        }
-        if (next == $cr) {
-          next = _reader.advance();
-          if (next == $lf) {
-            next = _reader.advance();
-          }
-          recordStartOfLine();
-        } else if (next == $lf) {
-          recordStartOfLine();
-          next = _reader.advance();
-        } else {
-          next = _reader.advance();
-        }
-      } else if (next == $cr) {
-        next = _reader.advance();
-        if (next == $lf) {
-          next = _reader.advance();
-        }
-        recordStartOfLine();
-      } else if (next == $lf) {
-        recordStartOfLine();
-        next = _reader.advance();
-      } else {
-        next = _reader.advance();
-      }
-    }
-    _reportError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL);
-    if (start == _reader.offset) {
-      _appendStringTokenWithOffset(TokenType.STRING, "", 1);
-    } else {
-      _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
-    }
-    return _reader.advance();
-  }
-
-  int _tokenizeMultiply(int next) =>
-      _select($equal, TokenType.STAR_EQ, TokenType.STAR);
-
-  int _tokenizeNumber(int next) {
-    int start = _reader.offset;
-    while (true) {
-      next = _reader.advance();
-      if ($0 <= next && next <= $9) {
-        continue;
-      } else if (next == $dot) {
-        return _tokenizeFractionPart(_reader.advance(), start);
-      } else if (next == $e || next == $E) {
-        return _tokenizeFractionPart(next, start);
-      } else {
-        _appendStringToken(
-            TokenType.INT, _reader.getString(start, next < 0 ? 0 : -1));
-        return next;
-      }
-    }
-  }
-
-  int _tokenizeOpenSquareBracket(int next) {
-    // [ []  []=
-    next = _reader.advance();
-    if (next == $close_bracket) {
-      return _select($equal, TokenType.INDEX_EQ, TokenType.INDEX);
-    } else {
-      _appendBeginToken(TokenType.OPEN_SQUARE_BRACKET);
-      return next;
-    }
-  }
-
-  int _tokenizePercent(int next) =>
-      _select($equal, TokenType.PERCENT_EQ, TokenType.PERCENT);
-
-  int _tokenizePlus(int next) {
-    // + ++ +=
-    next = _reader.advance();
-    if ($plus == next) {
-      _appendTokenOfType(TokenType.PLUS_PLUS);
-      return _reader.advance();
-    } else if ($equal == next) {
-      _appendTokenOfType(TokenType.PLUS_EQ);
-      return _reader.advance();
-    } else {
-      _appendTokenOfType(TokenType.PLUS);
-      return next;
-    }
-  }
-
-  int _tokenizeQuestion() {
-    // ? ?. ?? ??=
-    int next = _reader.advance();
-    if (next == $dot) {
-      // '.'
-      _appendTokenOfType(TokenType.QUESTION_PERIOD);
-      return _reader.advance();
-    } else if (next == $question) {
-      // '?'
-      next = _reader.advance();
-      if (next == $equal) {
-        // '='
-        _appendTokenOfType(TokenType.QUESTION_QUESTION_EQ);
-        return _reader.advance();
-      } else {
-        _appendTokenOfType(TokenType.QUESTION_QUESTION);
-        return next;
-      }
-    } else {
-      _appendTokenOfType(TokenType.QUESTION);
-      return next;
-    }
-  }
-
-  int _tokenizeSingleLineComment(int next) {
-    while (true) {
-      next = _reader.advance();
-      if (-1 == next) {
-        _appendCommentToken(
-            TokenType.SINGLE_LINE_COMMENT, _reader.getString(_tokenStart, 0));
-        return next;
-      } else if ($lf == next || $cr == next) {
-        _appendCommentToken(
-            TokenType.SINGLE_LINE_COMMENT, _reader.getString(_tokenStart, -1));
-        return next;
-      }
-    }
-  }
-
-  int _tokenizeSingleLineRawString(int next, int quoteChar, int start) {
-    next = _reader.advance();
-    while (next != -1) {
-      if (next == quoteChar) {
-        _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
-        return _reader.advance();
-      } else if (next == $cr || next == $lf) {
-        _reportError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL);
-        _appendStringToken(TokenType.STRING, _reader.getString(start, -1));
-        return _reader.advance();
-      }
-      next = _reader.advance();
-    }
-    _reportError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL);
-    _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
-    return _reader.advance();
-  }
-
-  int _tokenizeSingleLineString(int next, int quoteChar, int start) {
-    while (next != quoteChar) {
-      if (next == $backslash) {
-        next = _reader.advance();
-      } else if (next == $$) {
-        _appendStringToken(TokenType.STRING, _reader.getString(start, -1));
-        next = _tokenizeStringInterpolation(start);
-        _beginToken();
-        start = _reader.offset;
-        continue;
-      }
-      if (next <= $cr && (next == $lf || next == $cr || next == -1)) {
-        _reportError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL);
-        if (start == _reader.offset) {
-          _appendStringTokenWithOffset(TokenType.STRING, "", 1);
-        } else if (next == -1) {
-          _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
-        } else {
-          _appendStringToken(TokenType.STRING, _reader.getString(start, -1));
-        }
-        return _reader.advance();
-      }
-      next = _reader.advance();
-    }
-    _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
-    return _reader.advance();
-  }
-
-  int _tokenizeSlashOrComment(int next) {
-    next = _reader.advance();
-    if ($asterisk == next) {
-      return _tokenizeMultiLineComment(next);
-    } else if ($slash == next) {
-      return _tokenizeSingleLineComment(next);
-    } else if ($equal == next) {
-      _appendTokenOfType(TokenType.SLASH_EQ);
-      return _reader.advance();
-    } else {
-      _appendTokenOfType(TokenType.SLASH);
-      return next;
-    }
-  }
-
-  int _tokenizeString(int next, int start, bool raw) {
-    int quoteChar = next;
-    next = _reader.advance();
-    if (quoteChar == next) {
-      next = _reader.advance();
-      if (quoteChar == next) {
-        // Multiline string.
-        return _tokenizeMultiLineString(quoteChar, start, raw);
-      } else {
-        // Empty string.
-        _appendStringToken(TokenType.STRING, _reader.getString(start, -1));
-        return next;
-      }
-    }
-    if (raw) {
-      return _tokenizeSingleLineRawString(next, quoteChar, start);
-    } else {
-      return _tokenizeSingleLineString(next, quoteChar, start);
-    }
-  }
-
-  int _tokenizeStringInterpolation(int start) {
-    _beginToken();
-    int next = _reader.advance();
-    if (next == $lbrace) {
-      return _tokenizeInterpolatedExpression(next, start);
-    } else {
-      return _tokenizeInterpolatedIdentifier(next, start);
-    }
-  }
-
-  int _tokenizeTag(int next) {
-    // # or #!.*[\n\r]
-    if (_reader.offset == 0) {
-      if (_reader.peek() == $exclamation) {
-        do {
-          next = _reader.advance();
-        } while (next != $lf && next != $cr && next > 0);
-        _appendStringToken(
-            TokenType.SCRIPT_TAG, _reader.getString(_tokenStart, 0));
-        return next;
-      }
-    }
-    _appendTokenOfType(TokenType.HASH);
-    return _reader.advance();
-  }
-
-  int _tokenizeTilde(int next) {
-    // ~ ~/ ~/=
-    next = _reader.advance();
-    if (next == $slash) {
-      return _select($equal, TokenType.TILDE_SLASH_EQ, TokenType.TILDE_SLASH);
-    } else {
-      _appendTokenOfType(TokenType.TILDE);
-      return next;
-    }
-  }
-
-  /**
-   * Checks if [value] is a single-line or multi-line comment.
-   */
-  static bool _isDocumentationComment(String value) {
-    return StringUtilities.startsWith3(value, 0, $slash, $slash, $slash) ||
-        StringUtilities.startsWith3(value, 0, $slash, $asterisk, $asterisk);
+  @override
+  void reportError(
+      ScannerErrorCode errorCode, int offset, List<Object> arguments) {
+    _errorListener
+        .onError(new AnalysisError(source, offset, 1, errorCode, arguments));
   }
 }
diff --git a/pkg/analyzer/lib/src/error/codes.dart b/pkg/analyzer/lib/src/error/codes.dart
index 48702e6..c73de06 100644
--- a/pkg/analyzer/lib/src/error/codes.dart
+++ b/pkg/analyzer/lib/src/error/codes.dart
@@ -3086,6 +3086,22 @@
           "Try adjusting the number of type arguments.");
 
   /**
+   * It will be a static type warning if <i>m</i> is not a generic method with
+   * exactly <i>n</i> type parameters.
+   *
+   * Parameters:
+   * 0: the name of the method being referenced (<i>G</i>)
+   * 1: the number of type parameters that were declared
+   * 2: the number of type arguments provided
+   */
+  static const StaticTypeWarningCode WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD =
+      const StaticTypeWarningCode(
+          'WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD',
+          "The method '{0}' is declared with {1} type parameters, "
+          "but {2} type arguments were given.",
+          "Try adjusting the number of type arguments.");
+
+  /**
    * 17.16.1 Yield: Let T be the static type of e [the expression to the right
    * of "yield"] and let f be the immediately enclosing function.  It is a
    * static type warning if either:
@@ -4421,6 +4437,19 @@
           "changing the import to not be deferred.");
 
   /**
+   * Not yet spec'd.
+   *
+   * Parameters:
+   * 0: the name of the generic function's type parameter that is being used in
+   *    an `is` expression
+   */
+  static const StaticWarningCode TYPE_ANNOTATION_GENERIC_FUNCTION_PARAMETER =
+      const StaticWarningCode(
+          'TYPE_ANNOTATION_GENERIC_FUNCTION_PARAMETER',
+          "The type parameter '{0}' can't be used in a type test.",
+          "Try using a different type.");
+
+  /**
    * 12.31 Type Test: It is a static warning if <i>T</i> does not denote a type
    * available in the current lexical scope.
    */
diff --git a/pkg/analyzer/lib/src/generated/declaration_resolver.dart b/pkg/analyzer/lib/src/generated/declaration_resolver.dart
index e1b68a8..595acb9 100644
--- a/pkg/analyzer/lib/src/generated/declaration_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/declaration_resolver.dart
@@ -64,6 +64,17 @@
   }
 
   @override
+  Object visitBlockFunctionBody(BlockFunctionBody node) {
+    if (_isBodyToCreateElementsFor(node)) {
+      _walker.consumeLocalElements();
+      node.accept(_walker.elementBuilder);
+      return null;
+    } else {
+      return super.visitBlockFunctionBody(node);
+    }
+  }
+
+  @override
   Object visitCatchClause(CatchClause node) {
     _walker.elementBuilder.buildCatchVariableElements(node);
     return super.visitCatchClause(node);
@@ -149,6 +160,17 @@
   }
 
   @override
+  Object visitExpressionFunctionBody(ExpressionFunctionBody node) {
+    if (_isBodyToCreateElementsFor(node)) {
+      _walker.consumeLocalElements();
+      node.accept(_walker.elementBuilder);
+      return null;
+    } else {
+      return super.visitExpressionFunctionBody(node);
+    }
+  }
+
+  @override
   Object visitFieldDeclaration(FieldDeclaration node) {
     super.visitFieldDeclaration(node);
     _resolveMetadata(node, node.metadata, node.fields.variables[0].element);
@@ -189,6 +211,7 @@
       }
     }
     node.functionExpression.element = element;
+    _walker._elementHolder?.addFunction(element);
     _walk(new ElementWalker.forExecutable(element, _enclosingUnit), () {
       super.visitFunctionDeclaration(node);
     });
@@ -202,6 +225,7 @@
       FunctionElement element = _walker.getFunction();
       _matchOffset(element, node.offset);
       node.element = element;
+      _walker._elementHolder.addFunction(element);
       _walk(new ElementWalker.forExecutable(element, _enclosingUnit), () {
         super.visitFunctionExpression(node);
       });
@@ -461,6 +485,14 @@
     walker.validate();
     _walker = outerWalker;
   }
+
+  static bool _isBodyToCreateElementsFor(FunctionBody node) {
+    AstNode parent = node.parent;
+    return parent is ConstructorDeclaration ||
+        parent is MethodDeclaration ||
+        parent.parent is FunctionDeclaration &&
+            parent.parent.parent is CompilationUnit;
+  }
 }
 
 /**
@@ -569,6 +601,10 @@
         _parameters = element.parameters,
         _typeParameters = element.typeParameters;
 
+  void consumeLocalElements() {
+    _functionIndex = _functions.length;
+  }
+
   /**
    * Returns the next non-synthetic child of [element] which is an accessor;
    * throws an [IndexError] if there are no more.
@@ -649,6 +685,7 @@
     check(_variables, _variableIndex);
     Element element = this.element;
     if (element is ExecutableElementImpl) {
+      element.functions = _elementHolder.functions;
       element.labels = _elementHolder.labels;
       element.localVariables = _elementHolder.localVariables;
     }
diff --git a/pkg/analyzer/lib/src/generated/element_resolver.dart b/pkg/analyzer/lib/src/generated/element_resolver.dart
index d3fdd99..5c44f86 100644
--- a/pkg/analyzer/lib/src/generated/element_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/element_resolver.dart
@@ -1577,11 +1577,17 @@
 
       NodeList<TypeName> arguments = typeArguments?.arguments;
       if (arguments != null && arguments.length != parameters.length) {
-        _resolver.errorReporter.reportErrorForNode(
-            StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS,
-            node,
-            [invokeType, parameters.length, arguments?.length ?? 0]);
-
+        if (_resolver.strongMode) {
+          _resolver.errorReporter.reportErrorForNode(
+              StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD,
+              node,
+              [invokeType, parameters.length, arguments?.length ?? 0]);
+        } else {
+          _resolver.errorReporter.reportErrorForNode(
+              HintCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD,
+              node,
+              [invokeType, parameters.length, arguments?.length ?? 0]);
+        }
         // Wrong number of type arguments. Ignore them.
         arguments = null;
       }
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index fedd2e4..a33beba 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -1055,6 +1055,11 @@
  */
 abstract class AnalysisOptions {
   /**
+   * The length of the list returned by [encodeCrossContextOptions].
+   */
+  static const int crossContextOptionsLength = 2;
+
+  /**
    * Function that returns `true` if analysis is to parse and analyze function
    * bodies for a given source.
    */
@@ -1191,6 +1196,12 @@
   bool get lint;
 
   /**
+   * Return the "platform" bit mask which should be used to apply patch files,
+   * or `0` if no patch files should be applied.
+   */
+  int get patchPlatform;
+
+  /**
    * Return `true` if analysis is to parse comments.
    */
   bool get preserveComments;
@@ -1209,17 +1220,37 @@
   bool get trackCacheDependencies;
 
   /**
-   * Return an integer encoding of the values of the options that need to be the
-   * same across all of the contexts associated with partitions that are to be
-   * shared by a single analysis context.
+   * Return a list of integers encoding of the values of the options that need
+   * to be the same across all of the contexts associated with partitions that
+   * are to be shared by a single analysis context.
+   *
+   * The length of the list is guaranteed to equal [crossContextOptionsLength].
    */
-  int encodeCrossContextOptions();
+  List<int> encodeCrossContextOptions();
 
   /**
    * Set the values of the cross-context options to match those in the given set
    * of [options].
    */
   void setCrossContextOptionsFrom(AnalysisOptions options);
+
+  /**
+   * Determine whether two lists returned by [encodeCrossContextOptions] are
+   * equal.
+   */
+  static bool crossContextOptionsEqual(List<int> a, List<int> b) {
+    assert(a.length == crossContextOptionsLength);
+    assert(b.length == crossContextOptionsLength);
+    if (a.length != b.length) {
+      return false;
+    }
+    for (int i = 0; i < a.length; i++) {
+      if (a[i] != b[i]) {
+        return false;
+      }
+    }
+    return true;
+  }
 }
 
 /**
@@ -1308,6 +1339,9 @@
   bool lint = false;
 
   @override
+  int patchPlatform = 0;
+
+  @override
   bool preserveComments = true;
 
   @override
@@ -1395,6 +1429,7 @@
     trackCacheDependencies = options.trackCacheDependencies;
     disableCacheFlushing = options.disableCacheFlushing;
     finerGrainedInvalidation = options.finerGrainedInvalidation;
+    patchPlatform = options.patchPlatform;
   }
 
   bool get analyzeFunctionBodies {
@@ -1443,14 +1478,16 @@
   void set enableConditionalDirectives(_) {}
 
   @override
-  int encodeCrossContextOptions() =>
-      (enableAssertMessage ? ENABLE_ASSERT_FLAG : 0) |
-      (enableGenericMethods ? ENABLE_GENERIC_METHODS_FLAG : 0) |
-      (enableLazyAssignmentOperators ? ENABLE_LAZY_ASSIGNMENT_OPERATORS : 0) |
-      (enableStrictCallChecks ? ENABLE_STRICT_CALL_CHECKS_FLAG : 0) |
-      (enableSuperMixins ? ENABLE_SUPER_MIXINS_FLAG : 0) |
-      (strongMode ? ENABLE_STRONG_MODE_FLAG : 0) |
-      (strongModeHints ? ENABLE_STRONG_MODE_HINTS_FLAG : 0);
+  List<int> encodeCrossContextOptions() {
+    int flags = (enableAssertMessage ? ENABLE_ASSERT_FLAG : 0) |
+        (enableGenericMethods ? ENABLE_GENERIC_METHODS_FLAG : 0) |
+        (enableLazyAssignmentOperators ? ENABLE_LAZY_ASSIGNMENT_OPERATORS : 0) |
+        (enableStrictCallChecks ? ENABLE_STRICT_CALL_CHECKS_FLAG : 0) |
+        (enableSuperMixins ? ENABLE_SUPER_MIXINS_FLAG : 0) |
+        (strongMode ? ENABLE_STRONG_MODE_FLAG : 0) |
+        (strongModeHints ? ENABLE_STRONG_MODE_HINTS_FLAG : 0);
+    return <int>[flags, patchPlatform];
+  }
 
   @override
   void setCrossContextOptionsFrom(AnalysisOptions options) {
@@ -1463,6 +1500,7 @@
     if (options is AnalysisOptionsImpl) {
       strongModeHints = options.strongModeHints;
     }
+    patchPlatform = options.patchPlatform;
   }
 
   /**
@@ -1470,42 +1508,39 @@
    * encoded in the given [encoding], presumably from invoking the method
    * [encodeCrossContextOptions].
    */
-  static String decodeCrossContextOptions(int encoding) {
-    if (encoding == 0) {
+  static String decodeCrossContextOptions(List<int> encoding) {
+    List<String> parts = [];
+    int flags = encoding[0];
+    if (flags & ENABLE_ASSERT_FLAG > 0) {
+      parts.add('assert');
+    }
+    if (flags & ENABLE_GENERIC_METHODS_FLAG > 0) {
+      parts.add('genericMethods');
+    }
+    if (flags & ENABLE_LAZY_ASSIGNMENT_OPERATORS > 0) {
+      parts.add('lazyAssignmentOperators');
+    }
+    if (flags & ENABLE_STRICT_CALL_CHECKS_FLAG > 0) {
+      parts.add('strictCallChecks');
+    }
+    if (flags & ENABLE_SUPER_MIXINS_FLAG > 0) {
+      parts.add('superMixins');
+    }
+    if (flags & ENABLE_STRONG_MODE_FLAG > 0) {
+      parts.add('strongMode');
+    }
+    if (flags & ENABLE_STRONG_MODE_HINTS_FLAG > 0) {
+      parts.add('strongModeHints');
+    }
+    int patchPlatform = encoding[1];
+    if (patchPlatform != 0) {
+      parts.add('patchPlatform=$patchPlatform');
+    }
+    if (parts.isEmpty) {
       return 'none';
+    } else {
+      return parts.join(', ');
     }
-    StringBuffer buffer = new StringBuffer();
-    bool needsSeparator = false;
-    void add(String optionName) {
-      if (needsSeparator) {
-        buffer.write(', ');
-      }
-      buffer.write(optionName);
-      needsSeparator = true;
-    }
-
-    if (encoding & ENABLE_ASSERT_FLAG > 0) {
-      add('assert');
-    }
-    if (encoding & ENABLE_GENERIC_METHODS_FLAG > 0) {
-      add('genericMethods');
-    }
-    if (encoding & ENABLE_LAZY_ASSIGNMENT_OPERATORS > 0) {
-      add('lazyAssignmentOperators');
-    }
-    if (encoding & ENABLE_STRICT_CALL_CHECKS_FLAG > 0) {
-      add('strictCallChecks');
-    }
-    if (encoding & ENABLE_SUPER_MIXINS_FLAG > 0) {
-      add('superMixins');
-    }
-    if (encoding & ENABLE_STRONG_MODE_FLAG > 0) {
-      add('strongMode');
-    }
-    if (encoding & ENABLE_STRONG_MODE_HINTS_FLAG > 0) {
-      add('strongModeHints');
-    }
-    return buffer.toString();
   }
 
   /**
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index a74fd36..30a50cc 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -347,6 +347,13 @@
   }
 
   @override
+  Object visitAssertInitializer(AssertInitializer node) {
+    _checkForNonBoolExpression(node);
+    _checkAssertMessage(node);
+    return super.visitAssertInitializer(node);
+  }
+
+  @override
   Object visitAssertStatement(AssertStatement node) {
     _checkForNonBoolExpression(node);
     _checkAssertMessage(node);
@@ -924,6 +931,7 @@
   @override
   Object visitIsExpression(IsExpression node) {
     _checkForTypeAnnotationDeferredClass(node.type);
+    _checkForTypeAnnotationGenericFunctionParameter(node.type);
     return super.visitIsExpression(node);
   }
 
@@ -1294,11 +1302,11 @@
   }
 
   /**
-   * If the given assert [statement] specifies a message, verify that support
+   * If the given [assertion] specifies a message, verify that support
    * for assertions with messages is enabled.
    */
-  void _checkAssertMessage(AssertStatement statement) {
-    Expression expression = statement.message;
+  void _checkAssertMessage(Assertion assertion) {
+    Expression expression = assertion.message;
     if (expression != null && !enableAssertMessage) {
       _errorReporter.reportErrorForNode(
           CompileTimeErrorCode.EXTRA_ARGUMENT_TO_ASSERT, expression);
@@ -1754,7 +1762,7 @@
         int count = params1.length;
         if (params2.length != count) {
           _errorReporter.reportErrorForNode(
-              StaticWarningCode.INVALID_METHOD_OVERRIDE_TYPE_PARAMETERS,
+              HintCode.INVALID_METHOD_OVERRIDE_TYPE_PARAMETERS,
               errorNameTarget, [
             count,
             params2.length,
@@ -1788,7 +1796,7 @@
           pFresh.bound = bound2;
           if (!_typeSystem.isSubtypeOf(bound2, bound1)) {
             _errorReporter.reportErrorForNode(
-                StaticWarningCode.INVALID_METHOD_OVERRIDE_TYPE_PARAMETER_BOUND,
+                HintCode.INVALID_METHOD_OVERRIDE_TYPE_PARAMETER_BOUND,
                 errorNameTarget, [
               p1.displayName,
               p1.bound,
@@ -2610,8 +2618,7 @@
       // terminated with 'throw' expression
       if (statement is ExpressionStatement) {
         Expression expression = statement.expression;
-        if (expression is ThrowExpression ||
-            expression is RethrowExpression) {
+        if (expression is ThrowExpression || expression is RethrowExpression) {
           return;
         }
       }
@@ -5163,13 +5170,13 @@
   }
 
   /**
-   * Verify that the given assert [statement] has either a 'bool' or
-   * '() -> bool' input.
+   * Verify that the given [assertion] has either a 'bool' or '() -> bool'
+   * condition.
    *
    * See [StaticTypeWarningCode.NON_BOOL_EXPRESSION].
    */
-  void _checkForNonBoolExpression(AssertStatement statement) {
-    Expression expression = statement.condition;
+  void _checkForNonBoolExpression(Assertion assertion) {
+    Expression expression = assertion.condition;
     DartType type = getStaticType(expression);
     if (type is InterfaceType) {
       if (!_typeSystem.isAssignableTo(type, _boolType)) {
@@ -5690,6 +5697,29 @@
   }
 
   /**
+   * Verify that the given type [name] is not a type parameter in a generic
+   * method.
+   *
+   * See [StaticWarningCode.TYPE_ANNOTATION_GENERIC_FUNCTION_PARAMETER].
+   */
+  void _checkForTypeAnnotationGenericFunctionParameter(TypeName typeName) {
+    if (typeName == null) {
+      return;
+    }
+    Identifier name = typeName.name;
+    if (name is SimpleIdentifier) {
+      Element element = name.staticElement;
+      if (element is TypeParameterElement &&
+          element.enclosingElement is ExecutableElement) {
+        _errorReporter.reportErrorForNode(
+            StaticWarningCode.TYPE_ANNOTATION_GENERIC_FUNCTION_PARAMETER,
+            name,
+            [name.name]);
+      }
+    }
+  }
+
+  /**
    * Verify that the type arguments in the given [typeName] are all within
    * their bounds.
    *
diff --git a/pkg/analyzer/lib/src/generated/interner.dart b/pkg/analyzer/lib/src/generated/interner.dart
index 9741f28..7bb6e5b 100644
--- a/pkg/analyzer/lib/src/generated/interner.dart
+++ b/pkg/analyzer/lib/src/generated/interner.dart
@@ -6,17 +6,10 @@
 
 import 'dart:collection';
 
-/**
- * The interface `Interner` defines the behavior of objects that can intern
- * strings.
- */
-abstract class Interner {
-  /**
-   * Return a string that is identical to all of the other strings that have
-   * been interned that are equal to the given [string].
-   */
-  String intern(String string);
-}
+import 'package:front_end/src/scanner/interner.dart';
+
+export 'package:front_end/src/scanner/interner.dart'
+    show Interner, NullInterner;
 
 /**
  * The class `MappedInterner` implements an interner that uses a map to manage
@@ -38,12 +31,3 @@
     return original;
   }
 }
-
-/**
- * The class `NullInterner` implements an interner that does nothing (does not
- * actually intern any strings).
- */
-class NullInterner implements Interner {
-  @override
-  String intern(String string) => string;
-}
diff --git a/pkg/analyzer/lib/src/generated/package.dart b/pkg/analyzer/lib/src/generated/package.dart
index b715e3b..dddce5a 100644
--- a/pkg/analyzer/lib/src/generated/package.dart
+++ b/pkg/analyzer/lib/src/generated/package.dart
@@ -157,7 +157,10 @@
 
   @override
   int get hashCode {
-    int hashCode = options.encodeCrossContextOptions();
+    int hashCode = 0;
+    for (int value in options.encodeCrossContextOptions()) {
+      hashCode = JenkinsSmiHash.combine(hashCode, value);
+    }
     hashCode = JenkinsSmiHash.combine(hashCode, id.hashCode);
     hashCode = JenkinsSmiHash.combine(hashCode, sdk.hashCode);
     return JenkinsSmiHash.finish(hashCode);
@@ -167,8 +170,9 @@
   bool operator ==(Object other) {
     return other is PackageDescription &&
         other.sdk == sdk &&
-        other.options.encodeCrossContextOptions() ==
-            options.encodeCrossContextOptions() &&
+        AnalysisOptions.crossContextOptionsEqual(
+            other.options.encodeCrossContextOptions(),
+            options.encodeCrossContextOptions()) &&
         other.id == id;
   }
 }
diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart
index e325da2..a608bad 100644
--- a/pkg/analyzer/lib/src/generated/parser.dart
+++ b/pkg/analyzer/lib/src/generated/parser.dart
@@ -5981,9 +5981,7 @@
    *     assertInitializer ::=
    *         'assert' '(' expression [',' expression] ')'
    */
-  void _parseAssertInitializer() {
-    // TODO(brianwilkerson) Capture the syntax in the AST using a new class,
-    // such as AssertInitializer
+  AssertInitializer _parseAssertInitializer() {
     Token keyword = getAndAdvance();
     Token leftParen = _expect(TokenType.OPEN_PAREN);
     Expression expression = parseExpression2();
@@ -5994,8 +5992,8 @@
       message = parseExpression2();
     }
     Token rightParen = _expect(TokenType.CLOSE_PAREN);
-//    return new AssertInitializer(
-//        keyword, leftParen, expression, comma, message, rightParen);
+    return new AssertInitializer(
+        keyword, leftParen, expression, comma, message, rightParen);
   }
 
   /**
@@ -6230,7 +6228,7 @@
           _reportErrorForCurrentToken(ParserErrorCode.MISSING_INITIALIZER);
         } else if (_enableAssertInitializer &&
             _matchesKeyword(Keyword.ASSERT)) {
-          _parseAssertInitializer();
+          initializers.add(_parseAssertInitializer());
         } else {
           initializers.add(parseConstructorFieldInitializer(false));
         }
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 9941049..7a36d85 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -136,6 +136,12 @@
   }
 
   @override
+  Object visitAssertInitializer(AssertInitializer node) {
+    _checkForPossibleNullCondition(node.condition);
+    return super.visitAssertInitializer(node);
+  }
+
+  @override
   Object visitAssertStatement(AssertStatement node) {
     _checkForPossibleNullCondition(node.condition);
     return super.visitAssertStatement(node);
@@ -1637,25 +1643,28 @@
   }
 
   /**
-   * Validates that the expressions of the given initializers (of a constant constructor) are all
-   * compile time constants.
-   *
-   * @param constructor the constant constructor declaration to validate
+   * Validates that the expressions of the initializers of the given constant
+   * [constructor] are all compile time constants.
    */
   void _validateConstructorInitializers(ConstructorDeclaration constructor) {
     List<ParameterElement> parameterElements =
         constructor.parameters.parameterElements;
     NodeList<ConstructorInitializer> initializers = constructor.initializers;
     for (ConstructorInitializer initializer in initializers) {
-      if (initializer is ConstructorFieldInitializer) {
+      if (initializer is AssertInitializer) {
+        _validateInitializerExpression(
+            parameterElements, initializer.condition);
+        Expression message = initializer.message;
+        if (message != null) {
+          _validateInitializerExpression(parameterElements, message);
+        }
+      } else if (initializer is ConstructorFieldInitializer) {
         _validateInitializerExpression(
             parameterElements, initializer.expression);
-      }
-      if (initializer is RedirectingConstructorInvocation) {
+      } else if (initializer is RedirectingConstructorInvocation) {
         _validateInitializerInvocationArguments(
             parameterElements, initializer.argumentList);
-      }
-      if (initializer is SuperConstructorInvocation) {
+      } else if (initializer is SuperConstructorInvocation) {
         _validateInitializerInvocationArguments(
             parameterElements, initializer.argumentList);
       }
@@ -2711,15 +2720,15 @@
     InterfaceType intType = _typeProvider.intType;
     String indexFieldName = "index";
     FieldElementImpl indexField = new FieldElementImpl(indexFieldName, -1);
-    indexField.final2 = true;
-    indexField.synthetic = true;
+    indexField.isFinal = true;
+    indexField.isSynthetic = true;
     indexField.type = intType;
     fields.add(indexField);
     getters.add(_createGetter(indexField));
     ConstFieldElementImpl valuesField = new ConstFieldElementImpl("values", -1);
-    valuesField.static = true;
-    valuesField.const3 = true;
-    valuesField.synthetic = true;
+    valuesField.isStatic = true;
+    valuesField.isConst = true;
+    valuesField.isSynthetic = true;
     valuesField.type = _typeProvider.listType.instantiate(<DartType>[enumType]);
     fields.add(valuesField);
     getters.add(_createGetter(valuesField));
@@ -2799,6 +2808,9 @@
   bool visitAsExpression(AsExpression node) => _nodeExits(node.expression);
 
   @override
+  bool visitAssertInitializer(AssertInitializer node) => false;
+
+  @override
   bool visitAssertStatement(AssertStatement node) => false;
 
   @override
@@ -5784,8 +5796,7 @@
     }
     // Clone the ASTs for default formal parameters, so that we can use them
     // during constant evaluation.
-    if (!LibraryElementImpl.hasResolutionCapability(
-        definingLibrary, LibraryResolutionCapability.constantExpressions)) {
+    if (!_hasSerializedConstantInitializer(element)) {
       (element as ConstVariableElement).constantInitializer =
           new ConstantAstCloner().cloneNode(node.defaultValue);
     }
@@ -6643,6 +6654,25 @@
     return null;
   }
 
+  /**
+   * Return `true` if the given [parameter] element of the AST being resolved
+   * is resynthesized and is an API-level, not local, so has its initializer
+   * serialized.
+   */
+  bool _hasSerializedConstantInitializer(ParameterElement parameter) {
+    if (LibraryElementImpl.hasResolutionCapability(
+        definingLibrary, LibraryResolutionCapability.constantExpressions)) {
+      Element executable = parameter.enclosingElement;
+      if (executable is MethodElement) {
+        return true;
+      }
+      if (executable is FunctionElement) {
+        return executable.enclosingElement is CompilationUnitElement;
+      }
+    }
+    return false;
+  }
+
   void _inferArgumentTypesFromContext(InvocationExpression node) {
     if (!strongMode) {
       // Use propagated type inference for lambdas if not in strong mode.
@@ -9761,6 +9791,14 @@
       AnalysisEngine.instance.logger.logError(buffer.toString(),
           new CaughtException(new AnalysisException(), null));
     }
+
+    // When the library is resynthesized, types of all of its elements are
+    // already set - statically or inferred. We don't want to overwrite them.
+    if (LibraryElementImpl.hasResolutionCapability(
+        definingLibrary, LibraryResolutionCapability.resolvedTypeNames)) {
+      return null;
+    }
+
     element.declaredReturnType = _computeReturnType(node.returnType);
     element.type = new FunctionTypeImpl(element);
     _inferSetterReturnType(element);
@@ -9777,6 +9815,7 @@
         }
       }
     }
+
     return null;
   }
 
@@ -9947,7 +9986,6 @@
     var variableList = node.parent as VariableDeclarationList;
     // When the library is resynthesized, the types of field elements are
     // already set - statically or inferred. We don't want to overwrite them.
-    // See also dartbug.com/27482 for separating static and inferred types.
     if (variableList.parent is FieldDeclaration &&
         LibraryElementImpl.hasResolutionCapability(
             definingLibrary, LibraryResolutionCapability.resolvedTypeNames)) {
@@ -10183,7 +10221,7 @@
       TypeName returnType, FormalParameterList parameterList) {
     List<ParameterElement> parameters = _getElements(parameterList);
     FunctionElementImpl functionElement = new FunctionElementImpl.forNode(null);
-    functionElement.synthetic = true;
+    functionElement.isSynthetic = true;
     functionElement.shareParameters(parameters);
     functionElement.declaredReturnType = _computeReturnType(returnType);
     functionElement.enclosingElement = element;
diff --git a/pkg/analyzer/lib/src/generated/sdk.dart b/pkg/analyzer/lib/src/generated/sdk.dart
index c3e8e65..a03afbe 100644
--- a/pkg/analyzer/lib/src/generated/sdk.dart
+++ b/pkg/analyzer/lib/src/generated/sdk.dart
@@ -212,7 +212,10 @@
 
   @override
   int get hashCode {
-    int hashCode = options.encodeCrossContextOptions();
+    int hashCode = 0;
+    for (int value in options.encodeCrossContextOptions()) {
+      hashCode = JenkinsSmiHash.combine(hashCode, value);
+    }
     for (String path in paths) {
       hashCode = JenkinsSmiHash.combine(hashCode, path.hashCode);
     }
@@ -222,8 +225,9 @@
   @override
   bool operator ==(Object other) {
     if (other is SdkDescription) {
-      if (options.encodeCrossContextOptions() !=
-          other.options.encodeCrossContextOptions()) {
+      if (!AnalysisOptions.crossContextOptionsEqual(
+          options.encodeCrossContextOptions(),
+          other.options.encodeCrossContextOptions())) {
         return false;
       }
       int length = paths.length;
diff --git a/pkg/analyzer/lib/src/generated/static_type_analyzer.dart b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
index 47e5599..53745d2 100644
--- a/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
+++ b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
@@ -1630,7 +1630,7 @@
     type = type.substitute2(freshTypeVars, typeVars);
 
     var function = new FunctionElementImpl("", -1);
-    function.synthetic = true;
+    function.isSynthetic = true;
     function.returnType = type.returnType;
     function.typeParameters = freshVarElements;
     function.shareParameters(type.parameters);
@@ -2002,7 +2002,7 @@
 
             // Adjust the expected parameter type to have this return type.
             var function = new FunctionElementImpl(firstParamType.name, -1)
-              ..synthetic = true
+              ..isSynthetic = true
               ..shareParameters(firstParamType.parameters)
               ..returnType = paramReturnType;
             function.type = new FunctionTypeImpl(function);
diff --git a/pkg/analyzer/lib/src/generated/testing/element_factory.dart b/pkg/analyzer/lib/src/generated/testing/element_factory.dart
index 2075999..4147e5a 100644
--- a/pkg/analyzer/lib/src/generated/testing/element_factory.dart
+++ b/pkg/analyzer/lib/src/generated/testing/element_factory.dart
@@ -98,8 +98,8 @@
         constructor.nameEnd = definingClass.name.length + name.length + 1;
       }
     }
-    constructor.synthetic = name == null;
-    constructor.const2 = isConst;
+    constructor.isSynthetic = name == null;
+    constructor.isConst = isConst;
     if (argumentTypes != null) {
       int count = argumentTypes.length;
       List<ParameterElement> parameters = new List<ParameterElement>(count);
@@ -140,17 +140,17 @@
     InterfaceType stringType = typeProvider.stringType;
     String indexFieldName = "index";
     FieldElementImpl indexField = new FieldElementImpl(indexFieldName, -1);
-    indexField.final2 = true;
+    indexField.isFinal = true;
     indexField.type = intType;
     fields.add(indexField);
     String nameFieldName = "_name";
     FieldElementImpl nameField = new FieldElementImpl(nameFieldName, -1);
-    nameField.final2 = true;
+    nameField.isFinal = true;
     nameField.type = stringType;
     fields.add(nameField);
     FieldElementImpl valuesField = new FieldElementImpl("values", -1);
-    valuesField.static = true;
-    valuesField.const3 = true;
+    valuesField.isStatic = true;
+    valuesField.isConst = true;
     valuesField.type = typeProvider.listType.instantiate(<DartType>[enumType]);
     fields.add(valuesField);
     //
@@ -162,8 +162,8 @@
         String constantName = constantNames[i];
         FieldElementImpl constantElement =
             new ConstFieldElementImpl(constantName, -1);
-        constantElement.static = true;
-        constantElement.const3 = true;
+        constantElement.isStatic = true;
+        constantElement.isConst = true;
         constantElement.type = enumType;
         HashMap<String, DartObjectImpl> fieldMap =
             new HashMap<String, DartObjectImpl>();
@@ -199,9 +199,9 @@
     FieldElementImpl field = isConst
         ? new ConstFieldElementImpl(name, 0)
         : new FieldElementImpl(name, 0);
-    field.const3 = isConst;
-    field.final2 = isFinal;
-    field.static = isStatic;
+    field.isConst = isConst;
+    field.isFinal = isFinal;
+    field.isStatic = isStatic;
     field.type = type;
     if (isConst) {
       (field as ConstFieldElementImpl).constantInitializer = initializer;
@@ -391,17 +391,17 @@
   static PropertyAccessorElementImpl getterElement(
       String name, bool isStatic, DartType type) {
     FieldElementImpl field = new FieldElementImpl(name, -1);
-    field.static = isStatic;
-    field.synthetic = true;
+    field.isStatic = isStatic;
+    field.isSynthetic = true;
     field.type = type;
-    field.final2 = true;
+    field.isFinal = true;
     PropertyAccessorElementImpl getter =
         new PropertyAccessorElementImpl(name, 0);
-    getter.synthetic = false;
+    getter.isSynthetic = false;
     getter.getter = true;
     getter.variable = field;
     getter.returnType = type;
-    getter.static = isStatic;
+    getter.isStatic = isStatic;
     field.getter = getter;
     FunctionTypeImpl getterType = new FunctionTypeImpl(getter);
     getter.type = getterType;
@@ -526,8 +526,8 @@
   static PropertyAccessorElementImpl setterElement(
       String name, bool isStatic, DartType type) {
     FieldElementImpl field = new FieldElementImpl(name, -1);
-    field.static = isStatic;
-    field.synthetic = true;
+    field.isStatic = isStatic;
+    field.isSynthetic = true;
     field.type = type;
     PropertyAccessorElementImpl getter =
         new PropertyAccessorElementImpl(name, -1);
@@ -541,7 +541,7 @@
     PropertyAccessorElementImpl setter =
         new PropertyAccessorElementImpl(name, -1);
     setter.setter = true;
-    setter.synthetic = true;
+    setter.isSynthetic = true;
     setter.variable = field;
     setter.parameters = <ParameterElement>[parameter];
     setter.returnType = VoidTypeImpl.instance;
@@ -576,9 +576,9 @@
     } else {
       variable = new TopLevelVariableElementImpl(name, -1);
     }
-    variable.const3 = isConst;
-    variable.final2 = isFinal;
-    variable.synthetic = false;
+    variable.isConst = isConst;
+    variable.isFinal = isFinal;
+    variable.isSynthetic = false;
     variable.type = type;
     new PropertyAccessorElementImpl_ImplicitGetter(variable);
     if (!isConst && !isFinal) {
diff --git a/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart b/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart
index 6a36a8b..5e4e43d 100644
--- a/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart
+++ b/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart
@@ -516,7 +516,7 @@
       ClassElementImpl typeClass = ElementFactory.classElement2("Type");
       typeClass.constructors = <ConstructorElement>[
         ElementFactory.constructorElement(typeClass, null, false)
-          ..synthetic = true
+          ..isSynthetic = true
       ];
       _typeType = typeClass.type;
     }
@@ -611,12 +611,12 @@
     fromEnvironment.isCycleFree = true;
     numElement.constructors = <ConstructorElement>[
       ElementFactory.constructorElement(numElement, null, false)
-        ..synthetic = true
+        ..isSynthetic = true
     ];
     intElement.constructors = <ConstructorElement>[fromEnvironment];
     doubleElement.constructors = <ConstructorElement>[
       ElementFactory.constructorElement(doubleElement, null, false)
-        ..synthetic = true
+        ..isSynthetic = true
     ];
     ConstFieldElementImpl varINFINITY = ElementFactory.fieldElement(
         "INFINITY", true, false, true, _doubleType,
diff --git a/pkg/analyzer/lib/src/generated/type_system.dart b/pkg/analyzer/lib/src/generated/type_system.dart
index 5d08b0a..2f42296 100644
--- a/pkg/analyzer/lib/src/generated/type_system.dart
+++ b/pkg/analyzer/lib/src/generated/type_system.dart
@@ -219,7 +219,7 @@
 
     List<ParameterElement> parameters = t.parameters.map(shave).toList();
     FunctionElementImpl function = new FunctionElementImpl("", -1);
-    function.synthetic = true;
+    function.isSynthetic = true;
     function.returnType = t.returnType;
     function.shareTypeParameters(t.typeFormals);
     function.shareParameters(parameters);
diff --git a/pkg/analyzer/lib/src/summary/link.dart b/pkg/analyzer/lib/src/summary/link.dart
index ea25920..87828c3 100644
--- a/pkg/analyzer/lib/src/summary/link.dart
+++ b/pkg/analyzer/lib/src/summary/link.dart
@@ -3104,8 +3104,10 @@
    * Store the results of type inference for this function in [compilationUnit].
    */
   void link(CompilationUnitElementInBuildUnit compilationUnit) {
-    compilationUnit._storeLinkedType(
-        _unlinkedExecutable.inferredReturnTypeSlot, inferredReturnType, this);
+    if (_unlinkedExecutable.returnType == null) {
+      compilationUnit._storeLinkedType(
+          _unlinkedExecutable.inferredReturnTypeSlot, inferredReturnType, this);
+    }
     for (FunctionElementForLink_Local_NonSynthetic function in functions) {
       function.link(compilationUnit);
     }
diff --git a/pkg/analyzer/lib/src/summary/package_bundle_reader.dart b/pkg/analyzer/lib/src/summary/package_bundle_reader.dart
index c60f8ba..23645da 100644
--- a/pkg/analyzer/lib/src/summary/package_bundle_reader.dart
+++ b/pkg/analyzer/lib/src/summary/package_bundle_reader.dart
@@ -174,6 +174,23 @@
       return true;
     }
     AnalysisTarget target = entry.target;
+
+    // LINE_INFO can be provided using just the UnlinkedUnit.
+    if (target is Source && result == LINE_INFO) {
+      String uriString = target.uri.toString();
+      UnlinkedUnit unlinkedUnit = _dataStore.unlinkedMap[uriString];
+      if (unlinkedUnit != null) {
+        List<int> lineStarts = unlinkedUnit.lineStarts;
+        if (lineStarts.isNotEmpty) {
+          LineInfo lineInfo = new LineInfo(lineStarts);
+          entry.setValue(result as ResultDescriptor<LineInfo>, lineInfo,
+              TargetedResult.EMPTY_LIST);
+          return true;
+        }
+      }
+      return false;
+    }
+
     // Check whether there are results for the source.
     if (!hasResultsForSource(target.librarySource ?? target.source)) {
       return false;
@@ -239,16 +256,6 @@
           return true;
         }
         return false;
-      } else if (result == LINE_INFO) {
-        UnlinkedUnit unlinkedUnit = _dataStore.unlinkedMap[uriString];
-        List<int> lineStarts = unlinkedUnit.lineStarts;
-        if (lineStarts.isNotEmpty) {
-          LineInfo lineInfo = new LineInfo(lineStarts);
-          entry.setValue(result as ResultDescriptor<LineInfo>, lineInfo,
-              TargetedResult.EMPTY_LIST);
-          return true;
-        }
-        return false;
       }
     } else if (target is LibrarySpecificUnit) {
       if (result == CREATED_RESOLVED_UNIT1 ||
diff --git a/pkg/analyzer/lib/src/summary/resynthesize.dart b/pkg/analyzer/lib/src/summary/resynthesize.dart
index d8f0ce2..0baf656 100644
--- a/pkg/analyzer/lib/src/summary/resynthesize.dart
+++ b/pkg/analyzer/lib/src/summary/resynthesize.dart
@@ -19,10 +19,8 @@
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/generated/testing/ast_factory.dart';
 import 'package:analyzer/src/generated/testing/token_factory.dart';
-import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:analyzer/src/summary/format.dart';
 import 'package:analyzer/src/summary/idl.dart';
-import 'package:analyzer/src/util/fast_uri.dart';
 
 /**
  * Implementation of [ElementResynthesizer] used when resynthesizing an element
@@ -213,13 +211,13 @@
       if (serializedLibrary == null) {
         LibraryElementImpl libraryElement =
             new LibraryElementImpl(context, '', -1, 0);
-        libraryElement.synthetic = true;
+        libraryElement.isSynthetic = true;
         CompilationUnitElementImpl unitElement =
             new CompilationUnitElementImpl(librarySource.shortName);
         libraryElement.definingCompilationUnit = unitElement;
         unitElement.source = librarySource;
         unitElement.librarySource = librarySource;
-        return libraryElement..synthetic = true;
+        return libraryElement..isSynthetic = true;
       }
       UnlinkedUnit unlinkedSummary = _getUnlinkedSummaryOrNull(uri);
       if (unlinkedSummary == null) {
@@ -1162,9 +1160,12 @@
   }
 
   LibraryElementHandle _getLibraryByRelativeUri(String depUri) {
-    String absoluteUri = resolveRelativeUri(
-            resynthesizer.librarySource.uri, FastUri.parse(depUri))
-        .toString();
+    Source source = resynthesizer.summaryResynthesizer.sourceFactory
+        .resolveUri(resynthesizer.librarySource, depUri);
+    if (source == null) {
+      return null;
+    }
+    String absoluteUri = source.uri.toString();
     return new LibraryElementHandle(resynthesizer.summaryResynthesizer,
         new ElementLocationImpl.con3(<String>[absoluteUri]));
   }
@@ -1644,10 +1645,10 @@
           variable.enclosingElement = unit;
           implicitVariables[name] = variable;
           accessorsData.implicitVariables.add(variable);
-          variable.synthetic = true;
-          variable.final2 = kind == UnlinkedExecutableKind.getter;
+          variable.isSynthetic = true;
+          variable.isFinal = kind == UnlinkedExecutableKind.getter;
         } else {
-          variable.final2 = false;
+          variable.isFinal = false;
         }
         accessor.variable = variable;
         // link
diff --git a/pkg/analyzer/lib/src/summary/summarize_ast.dart b/pkg/analyzer/lib/src/summary/summarize_ast.dart
index 646eed8..b81fe88 100644
--- a/pkg/analyzer/lib/src/summary/summarize_ast.dart
+++ b/pkg/analyzer/lib/src/summary/summarize_ast.dart
@@ -624,7 +624,8 @@
       NodeList<Annotation> annotations,
       TypeParameterList typeParameters,
       bool isExternal,
-      bool serializeBodyExpr) {
+      bool serializeBodyExpr,
+      bool serializeBody) {
     int oldScopesLength = scopes.length;
     _TypeParameterScope typeParameterScope = new _TypeParameterScope();
     scopes.add(typeParameterScope);
@@ -682,7 +683,7 @@
       _parameterNames.addAll(formalParameters.parameters
           .map((FormalParameter p) => p.identifier.name));
     }
-    serializeFunctionBody(b, null, body, serializeBodyExpr);
+    serializeFunctionBody(b, null, body, serializeBodyExpr, serializeBody);
     _parameterNames = oldParameterNames;
     scopes.removeLast();
     assert(scopes.length == oldScopesLength);
@@ -709,7 +710,8 @@
       UnlinkedExecutableBuilder b,
       List<ConstructorInitializer> initializers,
       AstNode body,
-      bool serializeBodyExpr) {
+      bool serializeBodyExpr,
+      bool serializeBody) {
     if (body is BlockFunctionBody || body is ExpressionFunctionBody) {
       for (UnlinkedParamBuilder parameter in b.parameters) {
         parameter.visibleOffset = body.offset;
@@ -731,7 +733,9 @@
         initializer.accept(this);
       }
     }
-    body.accept(this);
+    if (serializeBody) {
+      body.accept(this);
+    }
     if (serializeBodyExpr) {
       if (body is Expression) {
         b.bodyExpr =
@@ -787,7 +791,8 @@
     }
     UnlinkedExecutableBuilder initializer =
         new UnlinkedExecutableBuilder(nameOffset: expression.offset);
-    serializeFunctionBody(initializer, null, expression, serializeBodyExpr);
+    serializeFunctionBody(
+        initializer, null, expression, serializeBodyExpr, true);
     initializer.inferredReturnTypeSlot = assignSlot();
     return initializer;
   }
@@ -1096,7 +1101,7 @@
     b.annotations = serializeAnnotations(node.metadata);
     b.codeRange = serializeCodeRange(node);
     Map<int, int> localClosureIndexMap = serializeFunctionBody(
-        b, node.initializers, node.body, node.constKeyword != null);
+        b, node.initializers, node.body, node.constKeyword != null, false);
     if (node.constKeyword != null) {
       Set<String> constructorParameterNames =
           node.parameters.parameters.map((p) => p.identifier.name).toSet();
@@ -1214,7 +1219,8 @@
         node.metadata,
         node.functionExpression.typeParameters,
         node.externalKeyword != null,
-        false));
+        false,
+        node.parent is FunctionDeclarationStatement));
   }
 
   @override
@@ -1238,7 +1244,8 @@
           null,
           node.typeParameters,
           false,
-          _serializeClosureBodyExprs));
+          _serializeClosureBodyExprs,
+          true));
     }
   }
 
@@ -1339,6 +1346,7 @@
         node.metadata,
         node.typeParameters,
         node.externalKeyword != null,
+        false,
         false));
   }
 
diff --git a/pkg/analyzer/lib/src/summary/summary_sdk.dart b/pkg/analyzer/lib/src/summary/summary_sdk.dart
index 5857d8b..3142b29 100644
--- a/pkg/analyzer/lib/src/summary/summary_sdk.dart
+++ b/pkg/analyzer/lib/src/summary/summary_sdk.dart
@@ -48,7 +48,7 @@
 
   @override
   bool hasResultsForSource(Source source) {
-    return source.source != null && source.isInSystemLibrary;
+    return source != null && source.isInSystemLibrary;
   }
 
   void _buildAsyncLibrary() {
diff --git a/pkg/analyzer/lib/src/task/dart.dart b/pkg/analyzer/lib/src/task/dart.dart
index 56595c4..dbbd1a6 100644
--- a/pkg/analyzer/lib/src/task/dart.dart
+++ b/pkg/analyzer/lib/src/task/dart.dart
@@ -23,6 +23,7 @@
 import 'package:analyzer/src/dart/resolver/inheritance_manager.dart';
 import 'package:analyzer/src/dart/scanner/reader.dart';
 import 'package:analyzer/src/dart/scanner/scanner.dart';
+import 'package:analyzer/src/dart/sdk/patch.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/error/pending_error.dart';
 import 'package:analyzer/src/generated/constant.dart';
@@ -1626,7 +1627,7 @@
     if (libraryElement == null) {
       libraryElement =
           new LibraryElementImpl.forNode(owningContext, libraryNameNode);
-      libraryElement.synthetic = modificationTime < 0;
+      libraryElement.isSynthetic = modificationTime < 0;
       libraryElement.definingCompilationUnit = definingCompilationUnitElement;
       libraryElement.entryPoint = entryPoint;
       libraryElement.parts = sourcedCompilationUnits;
@@ -4024,6 +4025,11 @@
     CompilationUnit unit = parser.parseCompilationUnit(tokenStream);
     unit.lineInfo = lineInfo;
 
+    if (options.patchPlatform != 0 && _source.uri.scheme == 'dart') {
+      new SdkPatcher().patch(context.sourceFactory.dartSdk,
+          options.patchPlatform, errorListener, _source, unit);
+    }
+
     bool hasNonPartOfDirective = false;
     bool hasPartOfDirective = false;
     HashSet<Source> explicitlyImportedSourceSet = new HashSet<Source>();
diff --git a/pkg/analyzer/lib/src/task/incremental_element_builder.dart b/pkg/analyzer/lib/src/task/incremental_element_builder.dart
index 6ae19ff..bbb460e 100644
--- a/pkg/analyzer/lib/src/task/incremental_element_builder.dart
+++ b/pkg/analyzer/lib/src/task/incremental_element_builder.dart
@@ -382,7 +382,7 @@
     if (classElement.constructors.isEmpty) {
       ConstructorElementImpl constructor =
           new ConstructorElementImpl.forNode(null);
-      constructor.synthetic = true;
+      constructor.isSynthetic = true;
       classElement.constructors = <ConstructorElement>[constructor];
       classDelta.addedConstructors.add(constructor);
     }
diff --git a/pkg/analyzer/lib/src/task/options.dart b/pkg/analyzer/lib/src/task/options.dart
index 4047b3b..60a6dbc 100644
--- a/pkg/analyzer/lib/src/task/options.dart
+++ b/pkg/analyzer/lib/src/task/options.dart
@@ -173,7 +173,7 @@
     if (_errorCodes == null) {
       _errorCodes = new HashSet<String>();
       // Engine codes.
-      _errorCodes.addAll(ErrorCode.values.map((ErrorCode code) => code.name));
+      _errorCodes.addAll(errorCodeValues.map((ErrorCode code) => code.name));
     }
     return _errorCodes;
   }
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index 0c265d5..eebe9df 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -9,6 +9,7 @@
   args: '>=0.12.1 <0.14.0'
   charcode: ^1.1.0
   crypto: '>=1.1.1 <3.0.0'
+  front_end: 0.1.0-alpha.0
   glob: ^1.0.3
   html: '>=0.12.0 <1.14.0'
   isolate: ^0.2.2
diff --git a/pkg/analyzer/test/file_system/memory_file_system_test.dart b/pkg/analyzer/test/file_system/memory_file_system_test.dart
index abc373f..cb39b49 100644
--- a/pkg/analyzer/test/file_system/memory_file_system_test.dart
+++ b/pkg/analyzer/test/file_system/memory_file_system_test.dart
@@ -111,6 +111,20 @@
     expect(file.isOrContains(provider.convertPath('/foo/bar')), isFalse);
   }
 
+  void test_lengthSync_doesNotExist() {
+    File file = provider.getResource(provider.convertPath('/test.txt'));
+    expect(() {
+      file.lengthSync;
+    }, throwsA(_isFileSystemException));
+  }
+
+  void test_lengthSync_exists() {
+    List<int> bytes = <int>[1, 2, 3, 4, 5];
+    File file =
+        provider.newFileWithBytes(provider.convertPath('/file.bin'), bytes);
+    expect(file.lengthSync, bytes.length);
+  }
+
   void test_modificationStamp_doesNotExist() {
     String path = provider.convertPath('/foo/bar/file.txt');
     File file = provider.newFile(path, 'qwerty');
diff --git a/pkg/analyzer/test/file_system/physical_resource_provider_test.dart b/pkg/analyzer/test/file_system/physical_resource_provider_test.dart
index 39ac5dc..62b4bba 100644
--- a/pkg/analyzer/test/file_system/physical_resource_provider_test.dart
+++ b/pkg/analyzer/test/file_system/physical_resource_provider_test.dart
@@ -97,6 +97,19 @@
     expect(file.isOrContains('foo'), isFalse);
   }
 
+  void test_lengthSync_doesNotExist() {
+    File file = PhysicalResourceProvider.INSTANCE.getResource(path);
+    expect(() {
+      file.lengthSync;
+    }, throwsA(_isFileSystemException));
+  }
+
+  void test_lengthSync_exists() {
+    List<int> bytes = <int>[1, 2, 3, 4, 5];
+    new io.File(path).writeAsBytesSync(bytes);
+    expect(file.lengthSync, bytes.length);
+  }
+
   void test_modificationStamp_doesNotExist() {
     File file = PhysicalResourceProvider.INSTANCE.getResource(path);
     expect(() {
diff --git a/pkg/analyzer/test/generated/analysis_context_factory.dart b/pkg/analyzer/test/generated/analysis_context_factory.dart
index b2c1975..fe3c66a 100644
--- a/pkg/analyzer/test/generated/analysis_context_factory.dart
+++ b/pkg/analyzer/test/generated/analysis_context_factory.dart
@@ -209,7 +209,7 @@
     }
     FunctionElementImpl thenOnValue = ElementFactory.functionElement3('onValue',
         DynamicElementImpl.instance, [futureElement.typeParameters[0]], null);
-    thenOnValue.synthetic = true;
+    thenOnValue.isSynthetic = true;
 
     DartType futureRType = futureElement.type.instantiate([futureThenR.type]);
     MethodElementImpl thenMethod = ElementFactory
@@ -248,7 +248,7 @@
         VoidTypeImpl.instance.element,
         <TypeDefiningElement>[streamElement.typeParameters[0]],
         null);
-    listenOnData.synthetic = true;
+    listenOnData.isSynthetic = true;
     List<DartType> parameterTypes = <DartType>[
       listenOnData.type,
     ];
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 35dea2a..4b4bf3d 100644
--- a/pkg/analyzer/test/generated/compile_time_error_code_test.dart
+++ b/pkg/analyzer/test/generated/compile_time_error_code_test.dart
@@ -4596,6 +4596,32 @@
     ]);
   }
 
+  void test_nonConstValueInInitializer_assert_condition() {
+    resetWithOptions(new AnalysisOptionsImpl()..enableAssertInitializer = true);
+    Source source = addSource(r'''
+class A {
+  const A(int i) : assert(i.isNegative);
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER]);
+    verify([source]);
+  }
+
+  void test_nonConstValueInInitializer_assert_message() {
+    resetWithOptions(new AnalysisOptionsImpl()
+      ..enableAssertInitializer = true
+      ..enableAssertMessage = true);
+    Source source = addSource(r'''
+class A {
+  const A(int i) : assert(i < 0, 'isNegative = ${i.isNegative}');
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER]);
+    verify([source]);
+  }
+
   void test_nonConstValueInInitializer_binary_notBool_left() {
     Source source = addSource(r'''
 class A {
diff --git a/pkg/analyzer/test/generated/declaration_resolver_test.dart b/pkg/analyzer/test/generated/declaration_resolver_test.dart
index 32927b0..869d7e0 100644
--- a/pkg/analyzer/test/generated/declaration_resolver_test.dart
+++ b/pkg/analyzer/test/generated/declaration_resolver_test.dart
@@ -382,9 +382,11 @@
 
   void test_invalid_functionDeclaration_getter_inFunction() {
     String code = r'''
-main() {
-  int get zzz => 42;
-}
+var v = (() {
+  main() {
+    int get zzz => 42;
+  }
+});
 ''';
     CompilationUnit unit = resolveSource(code);
     FunctionElement getterElement =
@@ -397,9 +399,11 @@
 
   void test_invalid_functionDeclaration_setter_inFunction() {
     String code = r'''
-main() {
-  set zzz(x) {}
-}
+var v = (() {
+  main() {
+    set zzz(x) {}
+  }
+});
 ''';
     CompilationUnit unit = resolveSource(code);
     FunctionElement setterElement =
diff --git a/pkg/analyzer/test/generated/inheritance_manager_test.dart b/pkg/analyzer/test/generated/inheritance_manager_test.dart
index 5b3ba8e..1216101 100644
--- a/pkg/analyzer/test/generated/inheritance_manager_test.dart
+++ b/pkg/analyzer/test/generated/inheritance_manager_test.dart
@@ -968,7 +968,7 @@
     String methodName = "m";
     MethodElement methodM =
         ElementFactory.methodElement(methodName, _typeProvider.intType);
-    (methodM as MethodElementImpl).static = true;
+    (methodM as MethodElementImpl).isStatic = true;
     classA.methods = <MethodElement>[methodM];
     ClassElementImpl classB = ElementFactory.classElement2("B");
     classB.interfaces = <InterfaceType>[classA.type];
@@ -1064,7 +1064,7 @@
     String methodName = "m";
     MethodElement methodM =
         ElementFactory.methodElement(methodName, _typeProvider.intType);
-    (methodM as MethodElementImpl).static = true;
+    (methodM as MethodElementImpl).isStatic = true;
     classA.methods = <MethodElement>[methodM];
     ClassElementImpl classB = ElementFactory.classElement2("B");
     classB.mixins = <InterfaceType>[classA.type];
@@ -1140,7 +1140,7 @@
     String methodName = "m";
     MethodElement methodM =
         ElementFactory.methodElement(methodName, _typeProvider.intType);
-    (methodM as MethodElementImpl).static = true;
+    (methodM as MethodElementImpl).isStatic = true;
     classA.methods = <MethodElement>[methodM];
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
     expect(_inheritanceManager.lookupInheritance(classB, methodName), isNull);
@@ -1183,7 +1183,7 @@
     String methodName = "m";
     MethodElement methodM =
         ElementFactory.methodElement(methodName, _typeProvider.intType);
-    (methodM as MethodElementImpl).static = true;
+    (methodM as MethodElementImpl).isStatic = true;
     classA.methods = <MethodElement>[methodM];
     expect(_inheritanceManager.lookupMember(classA, methodName), isNull);
     _assertNoErrors(classA);
@@ -1286,7 +1286,7 @@
   }
 
   void _assertErrors(ClassElement classElt,
-      [List<ErrorCode> expectedErrorCodes = ErrorCode.EMPTY_LIST]) {
+      [List<ErrorCode> expectedErrorCodes = const <ErrorCode>[]]) {
     GatheringErrorListener errorListener = new GatheringErrorListener();
     HashSet<AnalysisError> actualErrors =
         _inheritanceManager.getErrors(classElt);
diff --git a/pkg/analyzer/test/generated/non_hint_code_test.dart b/pkg/analyzer/test/generated/non_hint_code_test.dart
index 2890551..eda3e13 100644
--- a/pkg/analyzer/test/generated/non_hint_code_test.dart
+++ b/pkg/analyzer/test/generated/non_hint_code_test.dart
@@ -392,7 +392,7 @@
 library root;
 import 'lib1.dart' deferred as lib1;
 main() { lib1.f(); }'''
-    ], ErrorCode.EMPTY_LIST);
+    ], const <ErrorCode>[]);
   }
 
   void test_issue20904BuggyTypePromotionAtIfJoin_1() {
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index a7638b8..550b854 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -2937,7 +2937,7 @@
    * match those that are expected, or if the result would have been `null`.
    */
   CompilationUnit parseCompilationUnitWithOptions(String source,
-      [List<ErrorCode> errorCodes = ErrorCode.EMPTY_LIST]) {
+      [List<ErrorCode> errorCodes = const <ErrorCode>[]]) {
     createParser(source);
     CompilationUnit unit = parser.parseCompilationUnit2();
     expect(unit, isNotNull);
@@ -2955,7 +2955,7 @@
    *           not match those that are expected, or if the result would have been `null`
    */
   Expression parseExpression(String source,
-      [List<ErrorCode> errorCodes = ErrorCode.EMPTY_LIST]) {
+      [List<ErrorCode> errorCodes = const <ErrorCode>[]]) {
     createParser(source);
     Expression expression = parser.parseExpression2();
     expectNotNullIfNoErrors(expression);
@@ -2979,7 +2979,7 @@
    *           not match those that are expected, or if the result would have been `null`
    */
   static CompilationUnit parseCompilationUnit(String source,
-      [List<ErrorCode> errorCodes = ErrorCode.EMPTY_LIST]) {
+      [List<ErrorCode> errorCodes = const <ErrorCode>[]]) {
     GatheringErrorListener listener = new GatheringErrorListener();
     Scanner scanner =
         new Scanner(null, new CharSequenceReader(source), listener);
@@ -3014,7 +3014,7 @@
    * should be enabled.
    */
   static Statement parseStatement(String source,
-      [List<ErrorCode> errorCodes = ErrorCode.EMPTY_LIST,
+      [List<ErrorCode> errorCodes = const <ErrorCode>[],
       bool enableLazyAssignmentOperators]) {
     GatheringErrorListener listener = new GatheringErrorListener();
     Scanner scanner =
@@ -3041,7 +3041,7 @@
    *           are expected, or if the result would have been `null`
    */
   static List<Statement> parseStatements(String source, int expectedCount,
-      [List<ErrorCode> errorCodes = ErrorCode.EMPTY_LIST]) {
+      [List<ErrorCode> errorCodes = const <ErrorCode>[]]) {
     GatheringErrorListener listener = new GatheringErrorListener();
     Scanner scanner =
         new Scanner(null, new CharSequenceReader(source), listener);
@@ -7846,7 +7846,12 @@
     expect(member, new isInstanceOf<ConstructorDeclaration>());
     ConstructorDeclaration constructor = member as ConstructorDeclaration;
     NodeList<ConstructorInitializer> initializers = constructor.initializers;
-    expect(initializers, hasLength(2));
+    expect(initializers, hasLength(3));
+    ConstructorInitializer initializer = initializers[1];
+    expect(initializer, new isInstanceOf<AssertInitializer>());
+    AssertInitializer assertInitializer = initializer;
+    expect(assertInitializer.condition, isNotNull);
+    expect(assertInitializer.message, isNull);
   }
 
   void test_parseConstructor_with_pseudo_function_literal() {
@@ -13472,7 +13477,7 @@
    *           not match those that are expected, or if the result would have been `null`
    */
   CompilationUnit _parseDirectives(String source,
-      [List<ErrorCode> errorCodes = ErrorCode.EMPTY_LIST]) {
+      [List<ErrorCode> errorCodes = const <ErrorCode>[]]) {
     createParser(source);
     CompilationUnit unit = parser.parseDirectives2();
     expect(unit, isNotNull);
diff --git a/pkg/analyzer/test/generated/resolver_test_case.dart b/pkg/analyzer/test/generated/resolver_test_case.dart
index 1997423..32b42e9 100644
--- a/pkg/analyzer/test/generated/resolver_test_case.dart
+++ b/pkg/analyzer/test/generated/resolver_test_case.dart
@@ -369,7 +369,7 @@
    *           expected
    */
   void assertErrors(Source source,
-      [List<ErrorCode> expectedErrorCodes = ErrorCode.EMPTY_LIST]) {
+      [List<ErrorCode> expectedErrorCodes = const <ErrorCode>[]]) {
     GatheringErrorListener errorListener = new GatheringErrorListener();
     for (AnalysisError error in analysisContext2.computeErrors(source)) {
       expect(error.source, source);
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 45dbadc..82b972c 100644
--- a/pkg/analyzer/test/generated/static_type_warning_code_test.dart
+++ b/pkg/analyzer/test/generated/static_type_warning_code_test.dart
@@ -2431,7 +2431,7 @@
 ''');
     computeLibrarySourceErrors(source);
     assertErrors(
-        source, [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
+        source, [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD]);
     for (AnalysisError error in analysisContext2.computeErrors(source)) {
       if (error.errorCode ==
           StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS) {
diff --git a/pkg/analyzer/test/generated/static_warning_code_test.dart b/pkg/analyzer/test/generated/static_warning_code_test.dart
index 0a7087d..ae8bdca 100644
--- a/pkg/analyzer/test/generated/static_warning_code_test.dart
+++ b/pkg/analyzer/test/generated/static_warning_code_test.dart
@@ -3373,6 +3373,48 @@
     ]);
   }
 
+  void test_typeAnnotationGenericFunctionParameter_localFunction() {
+    resetWithOptions(new AnalysisOptionsImpl()..enableGenericMethods = true);
+    Source source = addSource(r'''
+class A {
+  void method() {
+    T local<T>(Object t) {
+      return (t is T) ? t : null;
+    }
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticWarningCode.TYPE_ANNOTATION_GENERIC_FUNCTION_PARAMETER]);
+    verify([source]);
+  }
+
+  void test_typeAnnotationGenericFunctionParameter_method() {
+    resetWithOptions(new AnalysisOptionsImpl()..enableGenericMethods = true);
+    Source source = addSource(r'''
+class A {
+  T method<T>(Object t) {
+    return (t is T) ? t : null;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticWarningCode.TYPE_ANNOTATION_GENERIC_FUNCTION_PARAMETER]);
+    verify([source]);
+  }
+
+  void test_typeAnnotationGenericFunctionParameter_topLevelFunction() {
+    resetWithOptions(new AnalysisOptionsImpl()..enableGenericMethods = true);
+    Source source = addSource(r'''
+T function<T>(Object t) {
+  return (t is T) ? t : null;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticWarningCode.TYPE_ANNOTATION_GENERIC_FUNCTION_PARAMETER]);
+    verify([source]);
+  }
+
   void test_typeParameterReferencedByStatic_field() {
     Source source = addSource(r'''
 class A<K> {
diff --git a/pkg/analyzer/test/generated/test_support.dart b/pkg/analyzer/test/generated/test_support.dart
index 6ec7c36..ce0b3f0 100644
--- a/pkg/analyzer/test/generated/test_support.dart
+++ b/pkg/analyzer/test/generated/test_support.dart
@@ -242,7 +242,7 @@
    *           expected
    */
   void assertErrorsWithCodes(
-      [List<ErrorCode> expectedErrorCodes = ErrorCode.EMPTY_LIST]) {
+      [List<ErrorCode> expectedErrorCodes = const <ErrorCode>[]]) {
     StringBuffer buffer = new StringBuffer();
     //
     // Verify that the expected error codes have a non-empty message.
diff --git a/pkg/analyzer/test/src/context/context_test.dart b/pkg/analyzer/test/src/context/context_test.dart
index 54f5619..13a5526 100644
--- a/pkg/analyzer/test/src/context/context_test.dart
+++ b/pkg/analyzer/test/src/context/context_test.dart
@@ -5395,8 +5395,7 @@
   @override
   void visitElement(Element element) {
     Element previousElement = previousElements[element];
-    bool expectIdentical = element is! LocalVariableElement;
-    bool ok = expectIdentical
+    bool ok = _expectedIdentical(element)
         ? identical(previousElement, element)
         : previousElement == element;
     if (!ok) {
@@ -5414,6 +5413,23 @@
     }
     super.visitElement(element);
   }
+
+  /**
+   * Return `true` if the given [element] should be the same as the previous
+   * element at the same position in the element model.
+   */
+  static bool _expectedIdentical(Element element) {
+    while (element != null) {
+      if (element is ConstructorElement ||
+          element is MethodElement ||
+          element is FunctionElement &&
+              element.enclosingElement is CompilationUnitElement) {
+        return false;
+      }
+      element = element.enclosingElement;
+    }
+    return true;
+  }
 }
 
 /**
diff --git a/pkg/analyzer/test/src/dart/analysis/byte_store_test.dart b/pkg/analyzer/test/src/dart/analysis/byte_store_test.dart
new file mode 100644
index 0000000..2099863
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/analysis/byte_store_test.dart
@@ -0,0 +1,79 @@
+// Copyright (c) 2016, 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:analyzer/src/dart/analysis/byte_store.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+import 'package:typed_mock/typed_mock.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(MemoryCachingByteStoreTest);
+  });
+}
+
+@reflectiveTest
+class MemoryCachingByteStoreTest {
+  test_get_put_evict() {
+    var store = new _TestByteStore();
+    var cachingStore = new MemoryCachingByteStore(store, 100);
+
+    // Keys: [1, 2].
+    cachingStore.put('1', _b(40));
+    cachingStore.put('2', _b(50));
+
+    // Request '1', so now it is the most recently used.
+    // Keys: [2, 1].
+    cachingStore.get('1');
+
+    // 40 + 50 + 30 > 100
+    // So, '2' is evicted.
+    cachingStore.put('3', _b(30));
+    expect(cachingStore.get('1'), hasLength(40));
+    expect(cachingStore.get('2'), isNull);
+    expect(cachingStore.get('3'), hasLength(30));
+  }
+
+  test_put_evict_first() {
+    var store = new _TestByteStore();
+    var cachingStore = new MemoryCachingByteStore(store, 100);
+
+    // 40 + 50 < 100
+    cachingStore.put('1', _b(40));
+    cachingStore.put('2', _b(50));
+    expect(cachingStore.get('1'), hasLength(40));
+    expect(cachingStore.get('2'), hasLength(50));
+
+    // 40 + 50 + 30 > 100
+    // So, '1' is evicted.
+    cachingStore.put('3', _b(30));
+    expect(cachingStore.get('1'), isNull);
+    expect(cachingStore.get('2'), hasLength(50));
+    expect(cachingStore.get('3'), hasLength(30));
+  }
+
+  test_put_evict_firstAndSecond() {
+    var store = new _TestByteStore();
+    var cachingStore = new MemoryCachingByteStore(store, 100);
+
+    // 10 + 80 < 100
+    cachingStore.put('1', _b(10));
+    cachingStore.put('2', _b(80));
+    expect(cachingStore.get('1'), hasLength(10));
+    expect(cachingStore.get('2'), hasLength(80));
+
+    // 10 + 80 + 30 > 100
+    // So, '1' and '2' are evicted.
+    cachingStore.put('3', _b(30));
+    expect(cachingStore.get('1'), isNull);
+    expect(cachingStore.get('2'), isNull);
+    expect(cachingStore.get('3'), hasLength(30));
+  }
+
+  static List<int> _b(int length) {
+    return new List<int>(length);
+  }
+}
+
+class _TestByteStore extends TypedMock implements ByteStore {}
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index 7ce9f31..3b7d74d 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -16,6 +16,7 @@
 import 'package:analyzer/src/dart/analysis/byte_store.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
+import 'package:analyzer/src/dart/analysis/status.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/engine.dart' show AnalysisOptionsImpl;
 import 'package:analyzer/src/generated/source.dart';
@@ -28,7 +29,8 @@
 
 main() {
   defineReflectiveSuite(() {
-    defineReflectiveTests(DriverTest);
+    defineReflectiveTests(AnalysisDriverTest);
+    defineReflectiveTests(AnalysisDriverSchedulerTest);
   });
 }
 
@@ -47,14 +49,184 @@
 }
 
 @reflectiveTest
-class DriverTest {
+class AnalysisDriverSchedulerTest {
   static final MockSdk sdk = new MockSdk();
 
   final MemoryResourceProvider provider = new MemoryResourceProvider();
-  final ByteStore byteStore = new _TestByteStore();
+  final ByteStore byteStore = new MemoryByteStore();
   final FileContentOverlay contentOverlay = new FileContentOverlay();
-  final StringBuffer logBuffer = new StringBuffer();
 
+  final StringBuffer logBuffer = new StringBuffer();
+  PerformanceLog logger;
+
+  AnalysisDriverScheduler scheduler;
+
+  List<AnalysisResult> allResults = [];
+
+  AnalysisDriver newDriver() {
+    AnalysisDriver driver = new AnalysisDriver(
+        scheduler,
+        logger,
+        provider,
+        byteStore,
+        contentOverlay,
+        new SourceFactory(
+            [new DartUriResolver(sdk), new ResourceUriResolver(provider)],
+            null,
+            provider),
+        new AnalysisOptionsImpl()..strongMode = true);
+    driver.results.forEach(allResults.add);
+    return driver;
+  }
+
+  void setUp() {
+    logger = new PerformanceLog(logBuffer);
+    scheduler = new AnalysisDriverScheduler(logger);
+    scheduler.start();
+  }
+
+  test_priorities_getResult_beforePriority() async {
+    AnalysisDriver driver1 = newDriver();
+    AnalysisDriver driver2 = newDriver();
+
+    String a = _p('/a.dart');
+    String b = _p('/b.dart');
+    String c = _p('/c.dart');
+    provider.newFile(a, 'class A {}');
+    provider.newFile(b, 'class B {}');
+    provider.newFile(c, 'class C {}');
+    driver1.addFile(a);
+    driver2.addFile(b);
+    driver2.addFile(c);
+    driver1.priorityFiles = [a];
+    driver2.priorityFiles = [a];
+
+    AnalysisResult result = await driver2.getResult(b);
+    expect(result.path, b);
+
+    await driver1.status.firstWhere((status) => status.isIdle);
+    await driver2.status.firstWhere((status) => status.isIdle);
+
+    expect(allResults, hasLength(3));
+    expect(allResults[0].path, b);
+    expect(allResults[1].path, a);
+    expect(allResults[2].path, c);
+  }
+
+  test_priorities_priorityBeforeGeneral1() async {
+    AnalysisDriver driver1 = newDriver();
+    AnalysisDriver driver2 = newDriver();
+
+    String a = _p('/a.dart');
+    String b = _p('/b.dart');
+    provider.newFile(a, 'class A {}');
+    provider.newFile(b, 'class B {}');
+    driver1.addFile(a);
+    driver2.addFile(b);
+    driver1.priorityFiles = [a];
+    driver2.priorityFiles = [a];
+
+    await driver1.status.firstWhere((status) => status.isIdle);
+    await driver2.status.firstWhere((status) => status.isIdle);
+
+    expect(allResults, hasLength(2));
+    expect(allResults[0].path, a);
+    expect(allResults[1].path, b);
+  }
+
+  test_priorities_priorityBeforeGeneral2() async {
+    AnalysisDriver driver1 = newDriver();
+    AnalysisDriver driver2 = newDriver();
+
+    String a = _p('/a.dart');
+    String b = _p('/b.dart');
+    provider.newFile(a, 'class A {}');
+    provider.newFile(b, 'class B {}');
+    driver1.addFile(a);
+    driver2.addFile(b);
+    driver1.priorityFiles = [b];
+    driver2.priorityFiles = [b];
+
+    await driver1.status.firstWhere((status) => status.isIdle);
+    await driver2.status.firstWhere((status) => status.isIdle);
+
+    expect(allResults, hasLength(2));
+    expect(allResults[0].path, b);
+    expect(allResults[1].path, a);
+  }
+
+  test_priorities_priorityBeforeGeneral3() async {
+    AnalysisDriver driver1 = newDriver();
+    AnalysisDriver driver2 = newDriver();
+
+    String a = _p('/a.dart');
+    String b = _p('/b.dart');
+    String c = _p('/c.dart');
+    provider.newFile(a, 'class A {}');
+    provider.newFile(b, 'class B {}');
+    provider.newFile(c, 'class C {}');
+    driver1.addFile(a);
+    driver1.addFile(b);
+    driver2.addFile(c);
+    driver1.priorityFiles = [a, c];
+    driver2.priorityFiles = [a, c];
+
+    await driver1.status.firstWhere((status) => status.isIdle);
+    await driver2.status.firstWhere((status) => status.isIdle);
+
+    expect(allResults, hasLength(3));
+    expect(allResults[0].path, a);
+    expect(allResults[1].path, c);
+    expect(allResults[2].path, b);
+  }
+
+  test_status() async {
+    AnalysisDriver driver1 = newDriver();
+    AnalysisDriver driver2 = newDriver();
+
+    String a = _p('/a.dart');
+    String b = _p('/b.dart');
+    String c = _p('/c.dart');
+    provider.newFile(a, 'class A {}');
+    provider.newFile(b, 'class B {}');
+    provider.newFile(c, 'class C {}');
+    driver1.addFile(a);
+    driver2.addFile(b);
+    driver2.addFile(c);
+
+    Monitor idleStatusMonitor = new Monitor();
+    List<AnalysisStatus> allStatuses = [];
+    scheduler.status.forEach((status) {
+      allStatuses.add(status);
+      if (status.isIdle) {
+        idleStatusMonitor.notify();
+      }
+    });
+
+    await idleStatusMonitor.signal;
+
+    expect(allStatuses, hasLength(2));
+    expect(allStatuses[0].isAnalyzing, isTrue);
+    expect(allStatuses[1].isAnalyzing, isFalse);
+
+    expect(allResults, hasLength(3));
+  }
+
+  String _p(String path) => provider.convertPath(path);
+}
+
+@reflectiveTest
+class AnalysisDriverTest {
+  static final MockSdk sdk = new MockSdk();
+
+  final MemoryResourceProvider provider = new MemoryResourceProvider();
+  final ByteStore byteStore = new MemoryByteStore();
+  final FileContentOverlay contentOverlay = new FileContentOverlay();
+
+  final StringBuffer logBuffer = new StringBuffer();
+  PerformanceLog logger;
+
+  AnalysisDriverScheduler scheduler;
   AnalysisDriver driver;
   final _Monitor idleStatusMonitor = new _Monitor();
   final List<AnalysisStatus> allStatuses = <AnalysisStatus>[];
@@ -67,8 +239,11 @@
     new MockSdk();
     testProject = _p('/test/lib');
     testFile = _p('/test/lib/test.dart');
+    logger = new PerformanceLog(logBuffer);
+    scheduler = new AnalysisDriverScheduler(logger);
     driver = new AnalysisDriver(
-        new PerformanceLog(logBuffer),
+        scheduler,
+        logger,
         provider,
         byteStore,
         contentOverlay,
@@ -80,6 +255,7 @@
           new ResourceUriResolver(provider)
         ], null, provider),
         new AnalysisOptionsImpl()..strongMode = true);
+    scheduler.start();
     driver.status.lastWhere((status) {
       allStatuses.add(status);
       if (status.isIdle) {
@@ -89,6 +265,19 @@
     driver.results.listen(allResults.add);
   }
 
+  test_addedFiles() async {
+    var a = _p('/test/lib/a.dart');
+    var b = _p('/test/lib/b.dart');
+
+    driver.addFile(a);
+    expect(driver.addedFiles, contains(a));
+    expect(driver.addedFiles, isNot(contains(b)));
+
+    driver.removeFile(a);
+    expect(driver.addedFiles, isNot(contains(a)));
+    expect(driver.addedFiles, isNot(contains(b)));
+  }
+
   test_addFile_thenRemove() async {
     var a = _p('/test/lib/a.dart');
     var b = _p('/test/lib/b.dart');
@@ -258,6 +447,27 @@
     expect(allResults, [result]);
   }
 
+  test_getResult_constants_defaultParameterValue_localFunction() async {
+    var a = _p('/test/bin/a.dart');
+    var b = _p('/test/bin/b.dart');
+    provider.newFile(a, 'const C = 42;');
+    provider.newFile(
+        b,
+        r'''
+import 'a.dart';
+main() {
+  foo({int p: C}) {}
+  foo();
+}
+''');
+    driver.addFile(a);
+    driver.addFile(b);
+    await _waitForIdle();
+
+    AnalysisResult result = await driver.getResult(b);
+    expect(result.errors, isEmpty);
+  }
+
   test_getResult_errors() async {
     String content = 'main() { int vv; }';
     _addTestFile(content, priority: true);
@@ -289,41 +499,56 @@
     expect(_getClassFieldType(result.unit, 'C', 'f'), 'int');
   }
 
-  test_getResult_sameFile_twoUris() async {
-    var a = _p('/test/lib/a.dart');
-    var b = _p('/test/lib/b.dart');
-    var c = _p('/test/test/c.dart');
-    provider.newFile(a, 'class A<T> {}');
-    provider.newFile(
-        b,
+  test_getResult_inferTypes_instanceMethod() async {
+    _addTestFile(
         r'''
-import 'a.dart';
-var VB = new A<int>();
-''');
-    provider.newFile(
-        c,
-        r'''
-import '../lib/a.dart';
-var VC = new A<double>();
-''');
-
-    driver.addFile(a);
-    driver.addFile(b);
+class A {
+  int m(double p) => 1;
+}
+class B extends A {
+  m(double p) => 2;
+}
+''',
+        priority: true);
     await _waitForIdle();
 
-    {
-      AnalysisResult result = await driver.getResult(b);
-      expect(_getImportSource(result.unit, 0).uri.toString(),
-          'package:test/a.dart');
-      expect(_getTopLevelVarType(result.unit, 'VB'), 'A<int>');
-    }
+    AnalysisResult result = await driver.getResult(testFile);
+    expect(_getClassMethodReturnType(result.unit, 'A', 'm'), 'int');
+    expect(_getClassMethodReturnType(result.unit, 'B', 'm'), 'int');
+  }
 
-    {
-      AnalysisResult result = await driver.getResult(c);
-      expect(_getImportSource(result.unit, 0).uri,
-          provider.pathContext.toUri(_p('/test/lib/a.dart')));
-      expect(_getTopLevelVarType(result.unit, 'VC'), 'A<double>');
-    }
+  test_getResult_invalidUri_exports_dart() async {
+    String content = r'''
+export 'dart:async';
+export 'dart:noSuchLib';
+export 'dart:math';
+''';
+    _addTestFile(content, priority: true);
+
+    AnalysisResult result = await driver.getResult(testFile);
+    expect(result.path, testFile);
+    // Has only exports for valid URIs.
+    List<ExportElement> imports = result.unit.element.library.exports;
+    expect(
+        imports.map((import) => import.exportedLibrary.source.uri.toString()),
+        unorderedEquals(['dart:async', 'dart:math']));
+  }
+
+  test_getResult_invalidUri_imports_dart() async {
+    String content = r'''
+import 'dart:async';
+import 'dart:noSuchLib';
+import 'dart:math';
+''';
+    _addTestFile(content, priority: true);
+
+    AnalysisResult result = await driver.getResult(testFile);
+    expect(result.path, testFile);
+    // Has only imports for valid URIs.
+    List<ImportElement> imports = result.unit.element.library.imports;
+    expect(
+        imports.map((import) => import.importedLibrary.source.uri.toString()),
+        unorderedEquals(['dart:async', 'dart:math', 'dart:core']));
   }
 
   test_getResult_mix_fileAndPackageUris() async {
@@ -377,6 +602,43 @@
     }
   }
 
+  test_getResult_sameFile_twoUris() async {
+    var a = _p('/test/lib/a.dart');
+    var b = _p('/test/lib/b.dart');
+    var c = _p('/test/test/c.dart');
+    provider.newFile(a, 'class A<T> {}');
+    provider.newFile(
+        b,
+        r'''
+import 'a.dart';
+var VB = new A<int>();
+''');
+    provider.newFile(
+        c,
+        r'''
+import '../lib/a.dart';
+var VC = new A<double>();
+''');
+
+    driver.addFile(a);
+    driver.addFile(b);
+    await _waitForIdle();
+
+    {
+      AnalysisResult result = await driver.getResult(b);
+      expect(_getImportSource(result.unit, 0).uri.toString(),
+          'package:test/a.dart');
+      expect(_getTopLevelVarType(result.unit, 'VB'), 'A<int>');
+    }
+
+    {
+      AnalysisResult result = await driver.getResult(c);
+      expect(_getImportSource(result.unit, 0).uri,
+          provider.pathContext.toUri(_p('/test/lib/a.dart')));
+      expect(_getTopLevelVarType(result.unit, 'VC'), 'A<double>');
+    }
+  }
+
   test_getResult_selfConsistent() async {
     var a = _p('/test/lib/a.dart');
     var b = _p('/test/lib/b.dart');
@@ -404,7 +666,7 @@
       expect(_getTopLevelVarType(result.unit, 'A2'), 'int');
     }
 
-    // Update "a" that that "A1" is now "double".
+    // Update "a" so that "A1" is now "double".
     // Get result for "a".
     //
     // Even though we have not notified the driver about the change,
@@ -455,17 +717,278 @@
     expect(result1.unit, isNotNull);
   }
 
-  test_isAddedFile() async {
+  test_knownFiles() async {
     var a = _p('/test/lib/a.dart');
     var b = _p('/test/lib/b.dart');
 
+    provider.newFile(
+        a,
+        r'''
+import 'b.dart';
+''');
+
     driver.addFile(a);
-    expect(driver.isAddedFile(a), isTrue);
-    expect(driver.isAddedFile(b), isFalse);
+    await _waitForIdle();
+
+    expect(driver.knownFiles, contains(a));
+    expect(driver.knownFiles, contains(b));
 
     driver.removeFile(a);
-    expect(driver.isAddedFile(a), isFalse);
-    expect(driver.isAddedFile(b), isFalse);
+
+    // a.dart was removed, but we don't clean up the file state state yet.
+    expect(driver.knownFiles, contains(a));
+    expect(driver.knownFiles, contains(b));
+  }
+
+  test_part_getResult_afterLibrary() async {
+    var a = _p('/test/lib/a.dart');
+    var b = _p('/test/lib/b.dart');
+    var c = _p('/test/lib/c.dart');
+    provider.newFile(
+        a,
+        r'''
+library a;
+import 'b.dart';
+part 'c.dart';
+class A {}
+var c = new C();
+''');
+    provider.newFile(b, 'class B {}');
+    provider.newFile(
+        c,
+        r'''
+part of a;
+class C {}
+var a = new A();
+var b = new B();
+''');
+
+    driver.addFile(a);
+    driver.addFile(b);
+    driver.addFile(c);
+
+    // Process a.dart so that we know that it's a library for c.dart later.
+    {
+      AnalysisResult result = await driver.getResult(a);
+      expect(result.errors, isEmpty);
+      expect(_getTopLevelVarType(result.unit, 'c'), 'C');
+    }
+
+    // Now c.dart can be resolved without errors in the context of a.dart
+    {
+      AnalysisResult result = await driver.getResult(c);
+      expect(result.errors, isEmpty);
+      expect(_getTopLevelVarType(result.unit, 'a'), 'A');
+      expect(_getTopLevelVarType(result.unit, 'b'), 'B');
+    }
+  }
+
+  test_part_getResult_beforeLibrary() async {
+    var a = _p('/test/lib/a.dart');
+    var b = _p('/test/lib/b.dart');
+    var c = _p('/test/lib/c.dart');
+    provider.newFile(
+        a,
+        r'''
+library a;
+import 'b.dart';
+part 'c.dart';
+class A {}
+var c = new C();
+''');
+    provider.newFile(b, 'class B {}');
+    provider.newFile(
+        c,
+        r'''
+part of a;
+class C {}
+var a = new A();
+var b = new B();
+''');
+
+    driver.addFile(a);
+    driver.addFile(b);
+    driver.addFile(c);
+
+    // b.dart will be analyzed after a.dart is analyzed.
+    // So, A and B references are resolved.
+    AnalysisResult result = await driver.getResult(c);
+    expect(result.errors, isEmpty);
+    expect(_getTopLevelVarType(result.unit, 'a'), 'A');
+    expect(_getTopLevelVarType(result.unit, 'b'), 'B');
+  }
+
+  test_part_getResult_noLibrary() async {
+    var c = _p('/test/lib/c.dart');
+    provider.newFile(
+        c,
+        r'''
+part of a;
+class C {}
+var a = new A();
+var b = new B();
+''');
+
+    driver.addFile(c);
+
+    // There is no library which c.dart is a part of, so it has unresolved
+    // A and B references.
+    AnalysisResult result = await driver.getResult(c);
+    expect(result.errors, isNotEmpty);
+    expect(result.unit, isNotNull);
+  }
+
+  test_part_results_afterLibrary() async {
+    var a = _p('/test/lib/a.dart');
+    var b = _p('/test/lib/b.dart');
+    var c = _p('/test/lib/c.dart');
+    provider.newFile(
+        a,
+        r'''
+library a;
+import 'b.dart';
+part 'c.dart';
+class A {}
+var c = new C();
+''');
+    provider.newFile(b, 'class B {}');
+    provider.newFile(
+        c,
+        r'''
+part of a;
+class C {}
+var a = new A();
+var b = new B();
+''');
+
+    // The order is important for creating the test case.
+    driver.addFile(a);
+    driver.addFile(b);
+    driver.addFile(c);
+
+    {
+      await _waitForIdle();
+
+      // c.dart was added after a.dart, so it is analyzed after a.dart,
+      // so we know that a.dart is the library of c.dart, so no errors.
+      AnalysisResult result = allResults.lastWhere((r) => r.path == c);
+      expect(result.errors, isEmpty);
+      expect(result.unit, isNull);
+    }
+
+    // Update a.dart so that c.dart is not a part.
+    {
+      provider.updateFile(a, '// does not use c.dart anymore');
+      driver.changeFile(a);
+      await _waitForIdle();
+
+      // Now c.dart does not have a library context, so A and B cannot be
+      // resolved, so there are errors.
+      AnalysisResult result = allResults.lastWhere((r) => r.path == c);
+      expect(result.errors, isNotEmpty);
+      expect(result.unit, isNull);
+    }
+  }
+
+  test_part_results_beforeLibrary() async {
+    var a = _p('/test/lib/a.dart');
+    var b = _p('/test/lib/b.dart');
+    var c = _p('/test/lib/c.dart');
+    provider.newFile(
+        a,
+        r'''
+library a;
+import 'b.dart';
+part 'c.dart';
+class A {}
+var c = new C();
+''');
+    provider.newFile(b, 'class B {}');
+    provider.newFile(
+        c,
+        r'''
+part of a;
+class C {}
+var a = new A();
+var b = new B();
+''');
+
+    // The order is important for creating the test case.
+    driver.addFile(c);
+    driver.addFile(a);
+    driver.addFile(b);
+
+    await _waitForIdle();
+
+    // c.dart was added before a.dart, so we attempt to analyze it before
+    // a.dart, but we cannot find the library for it, so we delay analysis
+    // until all other files are analyzed, including a.dart, after which we
+    // analyze the delayed parts.
+    AnalysisResult result = allResults.lastWhere((r) => r.path == c);
+    expect(result.errors, isEmpty);
+    expect(result.unit, isNull);
+  }
+
+  test_part_results_noLibrary() async {
+    var c = _p('/test/lib/c.dart');
+    provider.newFile(
+        c,
+        r'''
+part of a;
+class C {}
+var a = new A();
+var b = new B();
+''');
+
+    driver.addFile(c);
+
+    await _waitForIdle();
+
+    // There is no library which c.dart is a part of, so it has unresolved
+    // A and B references.
+    AnalysisResult result = allResults.lastWhere((r) => r.path == c);
+    expect(result.errors, isNotEmpty);
+    expect(result.unit, isNull);
+  }
+
+  test_part_results_priority_beforeLibrary() async {
+    var a = _p('/test/lib/a.dart');
+    var b = _p('/test/lib/b.dart');
+    var c = _p('/test/lib/c.dart');
+    provider.newFile(
+        a,
+        r'''
+library a;
+import 'b.dart';
+part 'c.dart';
+class A {}
+var c = new C();
+''');
+    provider.newFile(b, 'class B {}');
+    provider.newFile(
+        c,
+        r'''
+part of a;
+class C {}
+var a = new A();
+var b = new B();
+''');
+
+    // The order is important for creating the test case.
+    driver.priorityFiles = [c];
+    driver.addFile(c);
+    driver.addFile(a);
+    driver.addFile(b);
+
+    await _waitForIdle();
+
+    // c.dart was added before a.dart, so we attempt to analyze it before
+    // a.dart, but we cannot find the library for it, so we delay analysis
+    // until all other files are analyzed, including a.dart, after which we
+    // analyze the delayed parts.
+    AnalysisResult result = allResults.lastWhere((r) => r.path == c);
+    expect(result.errors, isEmpty);
+    expect(result.unit, isNotNull);
   }
 
   test_removeFile_changeFile_implicitlyAnalyzed() async {
@@ -639,6 +1162,29 @@
     return _getClassField(unit, className, fieldName).element.type.toString();
   }
 
+  MethodDeclaration _getClassMethod(
+      CompilationUnit unit, String className, String methodName) {
+    ClassDeclaration classDeclaration = _getClass(unit, className);
+    for (ClassMember declaration in classDeclaration.members) {
+      if (declaration is MethodDeclaration &&
+          declaration.name.name == methodName) {
+        return declaration;
+      }
+    }
+    fail('Cannot find the method $methodName in the class $className in\n'
+        '$unit');
+    return null;
+  }
+
+  String _getClassMethodReturnType(
+      CompilationUnit unit, String className, String fieldName) {
+    return _getClassMethod(unit, className, fieldName)
+        .element
+        .type
+        .returnType
+        .toString();
+  }
+
   ImportElement _getImportElement(CompilationUnit unit, int directiveIndex) {
     var import = unit.directives[directiveIndex] as ImportDirective;
     return import.element as ImportElement;
@@ -694,17 +1240,3 @@
     }
   }
 }
-
-class _TestByteStore implements ByteStore {
-  final map = <String, List<int>>{};
-
-  @override
-  List<int> get(String key) {
-    return map[key];
-  }
-
-  @override
-  void put(String key, List<int> bytes) {
-    map[key] = bytes;
-  }
-}
diff --git a/pkg/analyzer/test/src/dart/analysis/test_all.dart b/pkg/analyzer/test/src/dart/analysis/test_all.dart
index fa508e7..346ac5a 100644
--- a/pkg/analyzer/test/src/dart/analysis/test_all.dart
+++ b/pkg/analyzer/test/src/dart/analysis/test_all.dart
@@ -6,11 +6,13 @@
 
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import 'byte_store_test.dart' as byte_store;
 import 'driver_test.dart' as driver;
 
 /// Utility for manually running all tests.
 main() {
   defineReflectiveSuite(() {
+    byte_store.main();
     driver.main();
   }, name: 'analysis');
 }
diff --git a/pkg/analyzer/test/src/dart/constant/evaluation_test.dart b/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
index 39ded27..47ed912 100644
--- a/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
+++ b/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
@@ -1196,7 +1196,7 @@
   }
 
   void _assertProperDependencies(String sourceText,
-      [List<ErrorCode> expectedErrorCodes = ErrorCode.EMPTY_LIST]) {
+      [List<ErrorCode> expectedErrorCodes = const <ErrorCode>[]]) {
     Source source = addSource(sourceText);
     LibraryElement element = resolve2(source);
     CompilationUnit unit =
diff --git a/pkg/analyzer/test/src/dart/constant/utilities_test.dart b/pkg/analyzer/test/src/dart/constant/utilities_test.dart
index 6da39c1..b2e83e5 100644
--- a/pkg/analyzer/test/src/dart/constant/utilities_test.dart
+++ b/pkg/analyzer/test/src/dart/constant/utilities_test.dart
@@ -344,7 +344,7 @@
     ConstLocalVariableElementImpl variableElement =
         ElementFactory.constLocalVariableElement(name);
     _tail = variableElement;
-    variableElement.const3 = isConst;
+    variableElement.isConst = isConst;
     AstFactory.variableDeclarationList2(
         isConst ? Keyword.CONST : Keyword.VAR, [variableDeclaration]);
     SimpleIdentifier identifier = AstFactory.identifier3(name);
diff --git a/pkg/analyzer/test/src/dart/element/element_test.dart b/pkg/analyzer/test/src/dart/element/element_test.dart
index 394fcd5..f659b07 100644
--- a/pkg/analyzer/test/src/dart/element/element_test.dart
+++ b/pkg/analyzer/test/src/dart/element/element_test.dart
@@ -282,7 +282,7 @@
         ElementFactory.getterElement("foo", false, null);
     classA.accessors = <PropertyAccessorElement>[getter];
     // "foo" is static
-    getter.static = true;
+    getter.isStatic = true;
     expect(classA.hasStaticMember, isTrue);
   }
 
@@ -291,7 +291,7 @@
     MethodElementImpl method = ElementFactory.methodElement("foo", null);
     classA.methods = <MethodElement>[method];
     // "foo" is static
-    method.static = true;
+    method.isStatic = true;
     expect(classA.hasStaticMember, isTrue);
   }
 
@@ -301,7 +301,7 @@
         ElementFactory.setterElement("foo", false, null);
     classA.accessors = <PropertyAccessorElement>[setter];
     // "foo" is static
-    setter.static = true;
+    setter.isStatic = true;
     expect(classA.hasStaticMember, isTrue);
   }
 
@@ -1942,7 +1942,7 @@
     // the user (and hence can't participate in circularities).
     FunctionTypeAliasElementImpl f =
         ElementFactory.functionTypeAliasElement('f');
-    f.synthetic = true;
+    f.isSynthetic = true;
     FunctionTypeImpl type = f.type;
     expect(type.newPrune, isNull);
   }
diff --git a/pkg/analyzer/test/src/summary/summary_common.dart b/pkg/analyzer/test/src/summary/summary_common.dart
index c86f547..8b90c3c 100644
--- a/pkg/analyzer/test/src/summary/summary_common.dart
+++ b/pkg/analyzer/test/src/summary/summary_common.dart
@@ -849,6 +849,109 @@
     expect(signature3, isNot(signature1));
   }
 
+  test_apiSignature_excludeBody_constructor() {
+    List<int> signature1;
+    List<int> signature2;
+    List<int> signature3;
+    {
+      serializeLibraryText(r'''
+class A {
+  A() {
+  }
+}
+''');
+      signature1 = unlinkedUnits[0].apiSignature;
+    }
+    {
+      serializeLibraryText(r'''
+class A {
+  A() {
+    int v1;
+    f() {
+      double v2;
+    }
+  }
+}
+''');
+      signature2 = unlinkedUnits[0].apiSignature;
+    }
+    {
+      serializeLibraryText(r'''
+class A {
+  A(int p) {
+  }
+}
+''');
+    }
+    expect(signature2, signature1);
+    expect(signature3, isNot(signature1));
+  }
+
+  test_apiSignature_excludeBody_method() {
+    List<int> signature1;
+    List<int> signature2;
+    List<int> signature3;
+    {
+      serializeLibraryText(r'''
+class A {
+  m() {
+  }
+}
+''');
+      signature1 = unlinkedUnits[0].apiSignature;
+    }
+    {
+      serializeLibraryText(r'''
+class A {
+  m() {
+    int v1;
+    f() {
+      double v2;
+    }
+  }
+}
+''');
+      signature2 = unlinkedUnits[0].apiSignature;
+    }
+    {
+      serializeLibraryText(r'''
+class A {
+  m(p) {
+  }
+}
+''');
+    }
+    expect(signature2, signature1);
+    expect(signature3, isNot(signature1));
+  }
+
+  test_apiSignature_excludeBody_topLevelFunction() {
+    List<int> signature1;
+    List<int> signature2;
+    List<int> signature3;
+    {
+      serializeLibraryText('main() {}');
+      signature1 = unlinkedUnits[0].apiSignature;
+    }
+    {
+      serializeLibraryText(r'''
+main() {
+  int v1 = 1;
+  f() {
+    int v2 = 2;
+  }
+}
+''');
+      signature2 = unlinkedUnits[0].apiSignature;
+    }
+    {
+      serializeLibraryText('main(p) {}');
+      signature3 = unlinkedUnits[0].apiSignature;
+    }
+    expect(signature2, signature1);
+    expect(signature3, isNot(signature1));
+  }
+
   test_bottom_reference_shared() {
     if (skipFullyLinkedData) {
       return;
@@ -1353,21 +1456,22 @@
   }
 
   test_closure_executable_with_bottom_return_type() {
-    UnlinkedExecutable executable =
-        serializeExecutableText('f() { print((() => null)()); }');
-    expect(executable.localFunctions, hasLength(1));
-    expect(executable.localFunctions[0].returnType, isNull);
+    UnlinkedVariable variable = serializeVariableText('var v = (() => null);');
+    UnlinkedExecutable closure;
+    {
+      UnlinkedExecutable executable = variable.initializer;
+      expect(executable.localFunctions, hasLength(1));
+      expect(executable.localFunctions[0].returnType, isNull);
+      closure = executable.localFunctions[0];
+    }
     if (strongMode) {
       // Strong mode infers a type for the closure of `() => dynamic`, so the
       // inferred return type slot should be empty.
-      expect(
-          getTypeRefForSlot(
-              executable.localFunctions[0].inferredReturnTypeSlot),
-          isNull);
+      expect(getTypeRefForSlot(closure.inferredReturnTypeSlot), isNull);
     } else {
       // Spec mode infers a type for the closure of `() => Bottom`.
-      checkInferredTypeSlot(executable.localFunctions[0].inferredReturnTypeSlot,
-          null, null, '*bottom*',
+      checkInferredTypeSlot(
+          closure.inferredReturnTypeSlot, null, null, '*bottom*',
           onlyInStrongMode: false);
     }
   }
@@ -1376,8 +1480,12 @@
     addNamedSource('/a.dart', 'class C { D d; } class D {}');
     // The closure has type `() => D`; `D` is defined in a library that is
     // imported.
-    UnlinkedExecutable executable = serializeExecutableText(
-        'import "a.dart"; f() { print((() => new C().d)()); }');
+    UnlinkedExecutable executable = serializeVariableText(r'''
+import "a.dart";
+var v = (() {
+  print((() => new C().d)());
+});
+''').initializer.localFunctions[0];
     expect(executable.localFunctions, hasLength(1));
     expect(executable.localFunctions[0].returnType, isNull);
     checkInferredTypeSlot(executable.localFunctions[0].inferredReturnTypeSlot,
@@ -1420,8 +1528,12 @@
     addNamedSource('/b.dart', 'class D {}');
     // The closure has type `() => D`; `D` is defined in a library that is not
     // imported.
-    UnlinkedExecutable executable = serializeExecutableText(
-        'import "a.dart"; f() { print((() => new C().d)()); }');
+    UnlinkedExecutable executable = serializeVariableText(r'''
+import "a.dart";
+var v = (() {
+  print((() => new C().d)());
+});
+''').initializer.localFunctions[0];
     expect(executable.localFunctions, hasLength(1));
     expect(executable.localFunctions[0].returnType, isNull);
     checkInferredTypeSlot(executable.localFunctions[0].inferredReturnTypeSlot,
@@ -5046,24 +5158,16 @@
 
   test_executable_localFunctions() {
     String code = r'''
-f() { // 1
+f() {
   f1() {}
-  { // 2
+  {
     f2() {}
-  } // 3
-} // 4
+  }
+}
 ''';
     UnlinkedExecutable executable = serializeExecutableText(code);
     List<UnlinkedExecutable> functions = executable.localFunctions;
-    expect(functions, hasLength(2));
-    {
-      UnlinkedExecutable f1 = functions.singleWhere((v) => v.name == 'f1');
-      _assertExecutableVisible(code, f1, '{ // 1', '} // 4');
-    }
-    {
-      UnlinkedExecutable f2 = functions.singleWhere((v) => v.name == 'f2');
-      _assertExecutableVisible(code, f2, '{ // 2', '} // 3');
-    }
+    expect(functions, isEmpty);
   }
 
   test_executable_localLabels_inMethod() {
@@ -5078,19 +5182,7 @@
     UnlinkedExecutable executable =
         findExecutable('m', executables: serializeClassText(code).executables);
     List<UnlinkedLabel> labels = executable.localLabels;
-    expect(labels, hasLength(2));
-    {
-      UnlinkedLabel aaa = labels.singleWhere((l) => l.name == 'aaa');
-      expect(aaa, isNotNull);
-      expect(aaa.isOnSwitchMember, isFalse);
-      expect(aaa.isOnSwitchStatement, isFalse);
-    }
-    {
-      UnlinkedLabel bbb = labels.singleWhere((l) => l.name == 'bbb');
-      expect(bbb, isNotNull);
-      expect(bbb.isOnSwitchMember, isFalse);
-      expect(bbb.isOnSwitchStatement, isFalse);
-    }
+    expect(labels, isEmpty);
   }
 
   test_executable_localLabels_inTopLevelFunction() {
@@ -5107,31 +5199,7 @@
 ''';
     UnlinkedExecutable executable = serializeExecutableText(code);
     List<UnlinkedLabel> labels = executable.localLabels;
-    expect(labels, hasLength(4));
-    {
-      UnlinkedLabel aaa = labels.singleWhere((l) => l.name == 'aaa');
-      expect(aaa, isNotNull);
-      expect(aaa.isOnSwitchMember, isFalse);
-      expect(aaa.isOnSwitchStatement, isFalse);
-    }
-    {
-      UnlinkedLabel bbb = labels.singleWhere((l) => l.name == 'bbb');
-      expect(bbb, isNotNull);
-      expect(bbb.isOnSwitchMember, isFalse);
-      expect(bbb.isOnSwitchStatement, isTrue);
-    }
-    {
-      UnlinkedLabel ccc = labels.singleWhere((l) => l.name == 'ccc');
-      expect(ccc, isNotNull);
-      expect(ccc.isOnSwitchMember, isTrue);
-      expect(ccc.isOnSwitchStatement, isFalse);
-    }
-    {
-      UnlinkedLabel ccc = labels.singleWhere((l) => l.name == 'ddd');
-      expect(ccc, isNotNull);
-      expect(ccc.isOnSwitchMember, isTrue);
-      expect(ccc.isOnSwitchStatement, isFalse);
-    }
+    expect(labels, isEmpty);
   }
 
   test_executable_localLabels_inTopLevelGetter() {
@@ -5144,19 +5212,7 @@
     UnlinkedExecutable executable =
         serializeExecutableText(code, executableName: 'g');
     List<UnlinkedLabel> labels = executable.localLabels;
-    expect(labels, hasLength(2));
-    {
-      UnlinkedLabel aaa = labels.singleWhere((l) => l.name == 'aaa');
-      expect(aaa, isNotNull);
-      expect(aaa.isOnSwitchMember, isFalse);
-      expect(aaa.isOnSwitchStatement, isFalse);
-    }
-    {
-      UnlinkedLabel bbb = labels.singleWhere((l) => l.name == 'bbb');
-      expect(bbb, isNotNull);
-      expect(bbb.isOnSwitchMember, isFalse);
-      expect(bbb.isOnSwitchStatement, isFalse);
-    }
+    expect(labels, isEmpty);
   }
 
   test_executable_localLabels_namedExpressionLabel() {
@@ -5173,16 +5229,19 @@
 
   test_executable_localVariables_catch() {
     String code = r'''
-f() { // 1
-  try {
-    throw 42;
-  } on int catch (e, st) { // 2
-    print(e);
-    print(st);
-  } // 3
-} // 4
+var v = (
+  () { // 1
+    try {
+      throw 42;
+    } on int catch (e, st) { // 2
+      print(e);
+      print(st);
+    } // 3
+  } // 4
+);
 ''';
-    UnlinkedExecutable executable = serializeExecutableText(code);
+    UnlinkedExecutable executable =
+        serializeVariableText(code).initializer.localFunctions[0];
     List<UnlinkedVariable> variables = executable.localVariables;
     expect(variables, hasLength(2));
     {
@@ -5219,13 +5278,18 @@
 
   test_executable_localVariables_forEachLoop() {
     String code = r'''
-f() { // 1
-  for (int i in <int>[]) { // 2
-    print(i);
-  } // 3
-} // 4
+var v = (() {
+  f() { // 1
+    for (int i in <int>[]) { // 2
+      print(i);
+    } // 3
+  } // 4
+});
 ''';
-    UnlinkedExecutable executable = serializeExecutableText(code);
+    UnlinkedExecutable executable = serializeVariableText(code)
+        .initializer
+        .localFunctions[0]
+        .localFunctions[0];
     List<UnlinkedVariable> variables = executable.localVariables;
     expect(variables, hasLength(1));
     {
@@ -5237,14 +5301,19 @@
 
   test_executable_localVariables_forEachLoop_outside() {
     String code = r'''
-f() { // 1
-  int i;
-  for (i in <int>[]) {
-    print(i);
-  }
-} // 4
+var v = (() {
+  f() { // 1
+    int i;
+    for (i in <int>[]) {
+      print(i);
+    }
+  } // 4
+});
 ''';
-    UnlinkedExecutable executable = serializeExecutableText(code);
+    UnlinkedExecutable executable = serializeVariableText(code)
+        .initializer
+        .localFunctions[0]
+        .localFunctions[0];
     List<UnlinkedVariable> variables = executable.localVariables;
     expect(variables, hasLength(1));
     {
@@ -5256,13 +5325,18 @@
 
   test_executable_localVariables_forLoop() {
     String code = r'''
-f() { // 1
-  for (int i = 0, j = 0; i < 10; i++, j++) { // 2
-    print(i);
-  } // 3
-} // 4
+var v = (() {
+  f() { // 1
+    for (int i = 0, j = 0; i < 10; i++, j++) { // 2
+      print(i);
+    } // 3
+  } // 4
+});
 ''';
-    UnlinkedExecutable executable = serializeExecutableText(code);
+    UnlinkedExecutable executable = serializeVariableText(code)
+        .initializer
+        .localFunctions[0]
+        .localFunctions[0];
     List<UnlinkedVariable> variables = executable.localVariables;
     expect(variables, hasLength(2));
     {
@@ -5279,11 +5353,16 @@
 
   test_executable_localVariables_forLoop_noVariables() {
     String code = r'''
-f() {
-  for (; true;) {}
-}
+var v = (() {
+  f() {
+    for (; true;) {}
+  }
+});
 ''';
-    UnlinkedExecutable executable = serializeExecutableText(code);
+    UnlinkedExecutable executable = serializeVariableText(code)
+        .initializer
+        .localFunctions[0]
+        .localFunctions[0];
     List<UnlinkedVariable> variables = executable.localVariables;
     expect(variables, isEmpty);
   }
@@ -5291,37 +5370,37 @@
   test_executable_localVariables_inConstructor() {
     String code = r'''
 class C {
-  C() { // 1
+  C() {
     int v;
-  } // 2
+  }
 }
 ''';
     UnlinkedExecutable executable =
         findExecutable('', executables: serializeClassText(code).executables);
     List<UnlinkedVariable> variables = executable.localVariables;
-    expect(variables, hasLength(1));
-    {
-      UnlinkedVariable v = variables.singleWhere((v) => v.name == 'v');
-      _assertVariableVisible(code, v, '{ // 1', '} // 2');
-      checkTypeRef(v.type, 'dart:core', 'dart:core', 'int');
-    }
+    expect(variables, isEmpty);
   }
 
   test_executable_localVariables_inLocalFunctions() {
     String code = r'''
-f() {
-  f1() { // 1
-    int v1 = 1;
-  } // 2
-  f2() { // 3
-    int v1 = 1;
-    f3() { // 4
-      int v2 = 1;
-    } // 5
-  } // 6
-} // 7
+var v = (() {
+  f() {
+    f1() { // 1
+      int v1 = 1;
+    } // 2
+    f2() { // 3
+      int v1 = 1;
+      f3() { // 4
+        int v2 = 1;
+      } // 5
+    } // 6
+  } // 7
+});
 ''';
-    UnlinkedExecutable executable = serializeExecutableText(code);
+    UnlinkedExecutable executable = serializeVariableText(code)
+        .initializer
+        .localFunctions[0]
+        .localFunctions[0];
     List<UnlinkedExecutable> functions = executable.localFunctions;
     expect(functions, hasLength(2));
     // f - f1
@@ -5362,57 +5441,31 @@
   test_executable_localVariables_inMethod() {
     String code = r'''
 class C {
-  m() { // 1
+  m() {
     int v;
     f() {}
-  } // 2
+  }
 }
 ''';
     UnlinkedExecutable executable =
         findExecutable('m', executables: serializeClassText(code).executables);
-    {
-      List<UnlinkedExecutable> functions = executable.localFunctions;
-      expect(functions, hasLength(1));
-      UnlinkedExecutable f = functions.singleWhere((v) => v.name == 'f');
-      _assertExecutableVisible(code, f, '{ // 1', '} // 2');
-    }
-    {
-      List<UnlinkedVariable> variables = executable.localVariables;
-      expect(variables, hasLength(1));
-      UnlinkedVariable v = variables.singleWhere((v) => v.name == 'v');
-      _assertVariableVisible(code, v, '{ // 1', '} // 2');
-      checkTypeRef(v.type, 'dart:core', 'dart:core', 'int');
-    }
+    expect(executable.localFunctions, isEmpty);
+    expect(executable.localVariables, isEmpty);
   }
 
   test_executable_localVariables_inTopLevelFunction() {
     String code = r'''
-f() { // 1
+f() {
   int v1 = 1;
-  { // 2
+  {
     int v2 = 2;
-  } // 3
+  }
   var v3 = 3;
-} // 4
+}
 ''';
     UnlinkedExecutable executable = serializeExecutableText(code);
     List<UnlinkedVariable> variables = executable.localVariables;
-    expect(variables, hasLength(3));
-    {
-      UnlinkedVariable v1 = variables.singleWhere((v) => v.name == 'v1');
-      _assertVariableVisible(code, v1, '{ // 1', '} // 4');
-      checkTypeRef(v1.type, 'dart:core', 'dart:core', 'int');
-    }
-    {
-      UnlinkedVariable v2 = variables.singleWhere((v) => v.name == 'v2');
-      _assertVariableVisible(code, v2, '{ // 2', '} // 3');
-      checkTypeRef(v2.type, 'dart:core', 'dart:core', 'int');
-    }
-    {
-      UnlinkedVariable v3 = variables.singleWhere((v) => v.name == 'v3');
-      _assertVariableVisible(code, v3, '{ // 1', '} // 4');
-      expect(v3.type, isNull);
-    }
+    expect(variables, isEmpty);
   }
 
   test_executable_localVariables_inTopLevelGetter() {
@@ -5424,19 +5477,8 @@
 ''';
     UnlinkedExecutable executable =
         serializeExecutableText(code, executableName: 'g');
-    {
-      List<UnlinkedExecutable> functions = executable.localFunctions;
-      expect(functions, hasLength(1));
-      UnlinkedExecutable f = functions.singleWhere((v) => v.name == 'f');
-      _assertExecutableVisible(code, f, '{ // 1', '} // 2');
-    }
-    {
-      List<UnlinkedVariable> variables = executable.localVariables;
-      expect(variables, hasLength(1));
-      UnlinkedVariable v = variables.singleWhere((v) => v.name == 'v');
-      _assertVariableVisible(code, v, '{ // 1', '} // 2');
-      checkTypeRef(v.type, 'dart:core', 'dart:core', 'int');
-    }
+    expect(executable.localFunctions, isEmpty);
+    expect(executable.localVariables, isEmpty);
   }
 
   test_executable_member_function() {
@@ -5825,14 +5867,6 @@
     expect(executable.parameters[0].inheritsCovariantSlot, 0);
   }
 
-  test_executable_param_of_local_function_no_covariance() {
-    UnlinkedExecutable executable =
-        serializeClassText('class C { m() { f(x) {} } }')
-            .executables[0]
-            .localFunctions[0];
-    expect(executable.parameters[0].inheritsCovariantSlot, 0);
-  }
-
   test_executable_param_of_method_covariance() {
     UnlinkedExecutable executable =
         serializeClassText('class C { m(x) {} }').executables[0];
@@ -7773,25 +7807,6 @@
     expect(f.inferredReturnTypeSlot, 0);
   }
 
-  test_generic_gClass_gMethodStatic() {
-    UnlinkedClass cls = serializeClassText('''
-class C<T, U> {
-  static void m<V, W>(V v, W w) {
-    void f<X, Y>(V v, W w, X x, Y y) {
-    }
-  }
-}
-''');
-    UnlinkedExecutable m = cls.executables[0];
-    UnlinkedExecutable f = m.localFunctions[0];
-    checkParamTypeRef(m.parameters[0].type, 2);
-    checkParamTypeRef(m.parameters[1].type, 1);
-    checkParamTypeRef(f.parameters[0].type, 4);
-    checkParamTypeRef(f.parameters[1].type, 3);
-    checkParamTypeRef(f.parameters[2].type, 2);
-    checkParamTypeRef(f.parameters[3].type, 1);
-  }
-
   test_generic_method_in_generic_class() {
     UnlinkedClass cls = serializeClassText(
         'class C<T, U> { void m<V, W>(T t, U u, V v, W w) {} }');
@@ -9153,20 +9168,22 @@
   }
 
   test_nested_generic_functions() {
-    UnlinkedExecutable executable = serializeExecutableText('''
-void f<T, U>() {
-  void g<V, W>() {
-    void h<X, Y>() {
-      T t;
-      U u;
-      V v;
-      W w;
-      X x;
-      Y y;
+    UnlinkedExecutable executable = serializeVariableText('''
+var v = (() {
+  void f<T, U>() {
+    void g<V, W>() {
+      void h<X, Y>() {
+        T t;
+        U u;
+        V v;
+        W w;
+        X x;
+        Y y;
+      }
     }
   }
-}
-''');
+});
+''').initializer.localFunctions[0].localFunctions[0];
     expect(executable.typeParameters, hasLength(2));
     expect(executable.localFunctions[0].typeParameters, hasLength(2));
     expect(executable.localFunctions[0].localFunctions[0].typeParameters,
@@ -9181,34 +9198,6 @@
     checkParamTypeRef(findVariable('y', variables: localVariables).type, 1);
   }
 
-  test_nested_generic_functions_in_generic_class() {
-    UnlinkedClass cls = serializeClassText('''
-class C<T, U> {
-  void g<V, W>() {
-    void h<X, Y>() {
-      T t;
-      U u;
-      V v;
-      W w;
-      X x;
-      Y y;
-    }
-  }
-}
-''');
-    expect(cls.typeParameters, hasLength(2));
-    expect(cls.executables[0].typeParameters, hasLength(2));
-    expect(cls.executables[0].localFunctions[0].typeParameters, hasLength(2));
-    List<UnlinkedVariable> localVariables =
-        cls.executables[0].localFunctions[0].localVariables;
-    checkParamTypeRef(findVariable('t', variables: localVariables).type, 6);
-    checkParamTypeRef(findVariable('u', variables: localVariables).type, 5);
-    checkParamTypeRef(findVariable('v', variables: localVariables).type, 4);
-    checkParamTypeRef(findVariable('w', variables: localVariables).type, 3);
-    checkParamTypeRef(findVariable('x', variables: localVariables).type, 2);
-    checkParamTypeRef(findVariable('y', variables: localVariables).type, 1);
-  }
-
   test_parameter_visibleRange_abstractMethod() {
     UnlinkedExecutable m = findExecutable('m',
         executables:
@@ -9219,12 +9208,15 @@
 
   test_parameter_visibleRange_function_blockBody() {
     String text = r'''
-f(x) { // 1
-  f2(y) { // 2
-  } // 3
-} // 4
+var v = (() {
+  f(x) { // 1
+    f2(y) { // 2
+    } // 3
+  } // 4
+});
 ''';
-    UnlinkedExecutable f = serializeExecutableText(text);
+    var closure = serializeVariableText(text).initializer.localFunctions[0];
+    UnlinkedExecutable f = closure.localFunctions[0];
     UnlinkedExecutable f2 = f.localFunctions[0];
     _assertParameterVisible(text, f.parameters[0], '{ // 1', '} // 4');
     _assertParameterVisible(text, f2.parameters[0], '{ // 2', '} // 3');
@@ -9270,6 +9262,13 @@
     expect(unlinkedUnits[0].parts[0].uriEnd, text.indexOf('; // <-part'));
   }
 
+  test_part_isPartOf() {
+    addNamedSource('/a.dart', 'part of foo; class C {}');
+    serializeLibraryText('library foo; part "a.dart";');
+    expect(unlinkedUnits[0].isPartOf, isFalse);
+    expect(unlinkedUnits[1].isPartOf, isTrue);
+  }
+
   test_parts_defining_compilation_unit() {
     serializeLibraryText('');
     expect(linked.units, hasLength(1));
@@ -9294,13 +9293,6 @@
     expect(unlinkedUnits[1].publicNamespace.names[0].name, 'C');
   }
 
-  test_part_isPartOf() {
-    addNamedSource('/a.dart', 'part of foo; class C {}');
-    serializeLibraryText('library foo; part "a.dart";');
-    expect(unlinkedUnits[0].isPartOf, isFalse);
-    expect(unlinkedUnits[1].isPartOf, isTrue);
-  }
-
   test_reference_zero() {
     // Element zero of the references table should be populated in a standard
     // way.
diff --git a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
index dc4fe36..f38f362 100644
--- a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
+++ b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
@@ -1883,7 +1883,7 @@
 /*error:INVALID_METHOD_OVERRIDE*/m(x) => x;
 }
 main() {
-  int y = /*info:DYNAMIC_CAST*/new D()./*error:WRONG_NUMBER_OF_TYPE_ARGUMENTS*/m/*<int>*/(42);
+  int y = /*info:DYNAMIC_CAST*/new D()./*error:WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD*/m/*<int>*/(42);
   print(y);
 }
 ''');
diff --git a/pkg/compiler/lib/src/closure.dart b/pkg/compiler/lib/src/closure.dart
index e0c6826..f9885ba 100644
--- a/pkg/compiler/lib/src/closure.dart
+++ b/pkg/compiler/lib/src/closure.dart
@@ -19,7 +19,6 @@
 import 'resolution/tree_elements.dart' show TreeElements;
 import 'tokens/token.dart' show Token;
 import 'tree/tree.dart';
-import 'universe/world_builder.dart' show CodegenWorldBuilder;
 import 'util/util.dart';
 
 class ClosureTask extends CompilerTask {
@@ -122,7 +121,7 @@
       throw new SpannableAssertionFailure(
           closure, 'Not a closure: $closure (${closure.runtimeType}).');
     }
-    compiler.enqueuer.codegen.forgetElement(cls);
+    compiler.enqueuer.codegen.forgetElement(cls, compiler);
   }
 }
 
diff --git a/pkg/compiler/lib/src/common/backend_api.dart b/pkg/compiler/lib/src/common/backend_api.dart
index b8944a1..f58ef31 100644
--- a/pkg/compiler/lib/src/common/backend_api.dart
+++ b/pkg/compiler/lib/src/common/backend_api.dart
@@ -83,20 +83,20 @@
 
   void initializeHelperClasses() {}
 
-  void enqueueHelpers(ResolutionEnqueuer world, Registry registry);
+  void enqueueHelpers(ResolutionEnqueuer world);
 
   /// Creates an [Enqueuer] for code generation specific to this backend.
-  Enqueuer createCodegenEnqueuer(Compiler compiler);
+  Enqueuer createCodegenEnqueuer(CompilerTask task, Compiler compiler);
 
   WorldImpact codegen(CodegenWorkItem work);
 
   // The backend determines the native resolution enqueuer, with a no-op
   // default, so tools like dart2dart can ignore the native classes.
-  native.NativeEnqueuer nativeResolutionEnqueuer(world) {
+  native.NativeEnqueuer nativeResolutionEnqueuer() {
     return new native.NativeEnqueuer();
   }
 
-  native.NativeEnqueuer nativeCodegenEnqueuer(world) {
+  native.NativeEnqueuer nativeCodegenEnqueuer() {
     return new native.NativeEnqueuer();
   }
 
@@ -117,7 +117,8 @@
 
   /// Enable deferred loading. Returns `true` if the backend supports deferred
   /// loading.
-  bool enableDeferredLoadingIfSupported(Spannable node, Registry registry);
+  bool enableDeferredLoadingIfSupported(
+      ResolutionEnqueuer enqueuer, Spannable node);
 
   /// Called during codegen when [constant] has been used.
   void computeImpactForCompileTimeConstant(ConstantValue constant,
@@ -126,22 +127,15 @@
   /// Called to notify to the backend that a class is being instantiated.
   // TODO(johnniwinther): Remove this. It's only called once for each [cls] and
   // only with [Compiler.globalDependencies] as [registry].
-  void registerInstantiatedClass(
-      ClassElement cls, Enqueuer enqueuer, Registry registry) {}
+  void registerInstantiatedClass(ClassElement cls, Enqueuer enqueuer) {}
 
   /// Called to notify to the backend that a class is implemented by an
   /// instantiated class.
-  void registerImplementedClass(
-      ClassElement cls, Enqueuer enqueuer, Registry registry) {}
+  void registerImplementedClass(ClassElement cls, Enqueuer enqueuer) {}
 
   /// Called to instruct to the backend register [type] as instantiated on
   /// [enqueuer].
-  void registerInstantiatedType(
-      InterfaceType type, Enqueuer enqueuer, Registry registry,
-      {bool mirrorUsage: false}) {
-    registry.registerDependency(type.element);
-    enqueuer.registerInstantiatedType(type, mirrorUsage: mirrorUsage);
-  }
+  void registerInstantiatedType(InterfaceType type) {}
 
   /// Register a runtime type variable bound tests between [typeArgument] and
   /// [bound].
@@ -153,12 +147,12 @@
    * method.
    */
   void registerCallMethodWithFreeTypeVariables(
-      Element callMethod, Enqueuer enqueuer, Registry registry) {}
+      Element callMethod, Enqueuer enqueuer) {}
 
   /// Called to instruct the backend to register that a closure exists for a
   /// function on an instantiated generic class.
   void registerClosureWithFreeTypeVariables(
-      Element closure, Enqueuer enqueuer, Registry registry) {}
+      Element closure, Enqueuer enqueuer) {}
 
   /// Call this to register that a member has been closurized.
   void registerBoundClosure(Enqueuer enqueuer) {}
@@ -169,7 +163,7 @@
   /**
    * Call this to register that the [:runtimeType:] property has been accessed.
    */
-  void registerRuntimeType(Enqueuer enqueuer, Registry registry) {}
+  void registerRuntimeType(Enqueuer enqueuer) {}
 
   /// Call this to register a `noSuchMethod` implementation.
   void registerNoSuchMethod(FunctionElement noSuchMethodElement) {}
@@ -213,7 +207,7 @@
     return false;
   }
 
-  void registerStaticUse(Element element, {bool forResolution}) {}
+  void registerStaticUse(Enqueuer enqueuer, Element element) {}
 
   /// This method is called immediately after the [LibraryElement] [library] has
   /// been created.
@@ -368,7 +362,8 @@
 class ImpactTransformer {
   /// Transform the [ResolutionImpact] into a [WorldImpact] adding the
   /// backend dependencies for features used in [worldImpact].
-  WorldImpact transformResolutionImpact(ResolutionImpact worldImpact) {
+  WorldImpact transformResolutionImpact(
+      ResolutionEnqueuer enqueuer, ResolutionImpact worldImpact) {
     return worldImpact;
   }
 
diff --git a/pkg/compiler/lib/src/common/resolution.dart b/pkg/compiler/lib/src/common/resolution.dart
index 538692a..aeec588 100644
--- a/pkg/compiler/lib/src/common/resolution.dart
+++ b/pkg/compiler/lib/src/common/resolution.dart
@@ -158,6 +158,9 @@
   /// Resolve [element] if it has not already been resolved.
   void ensureResolved(Element element);
 
+  /// Ensure the resolution of all members of [element].
+  void ensureClassMembers(ClassElement element);
+
   /// Registers that [element] has a compile time error.
   ///
   /// The error itself is given in [message].
diff --git a/pkg/compiler/lib/src/compiler.dart b/pkg/compiler/lib/src/compiler.dart
index 536a279..c2f91fe 100644
--- a/pkg/compiler/lib/src/compiler.dart
+++ b/pkg/compiler/lib/src/compiler.dart
@@ -76,7 +76,12 @@
 import 'universe/world_builder.dart'
     show ResolutionWorldBuilder, CodegenWorldBuilder;
 import 'universe/use.dart' show StaticUse;
-import 'universe/world_impact.dart' show ImpactStrategy, WorldImpact;
+import 'universe/world_impact.dart'
+    show
+        ImpactStrategy,
+        WorldImpact,
+        WorldImpactBuilder,
+        WorldImpactBuilderImpl;
 import 'util/util.dart' show Link, Setlet;
 import 'world.dart' show ClosedWorld, ClosedWorldRefiner, OpenWorld, WorldImpl;
 
@@ -89,7 +94,7 @@
   Measurer get measurer;
 
   final IdGenerator idGenerator = new IdGenerator();
-  WorldImpl _world;
+  WorldImpl get _world => resolverWorld.openWorld;
   Types types;
   _CompilerCoreTypes _coreTypes;
   CompilerDiagnosticReporter _reporter;
@@ -114,16 +119,6 @@
    */
   GlobalDependencyRegistry globalDependencies;
 
-  /**
-   * Dependencies that are only included due to mirrors.
-   *
-   * We should get rid of this and ensure that all dependencies are
-   * associated with a particular element.
-   */
-  // TODO(johnniwinther): This should not be a [ResolutionRegistry].
-  final Registry mirrorDependencies =
-      new ResolutionRegistry(null, new TreeElementMapping(null));
-
   /// Options provided from command-line arguments.
   final CompilerOptions options;
 
@@ -149,7 +144,6 @@
   CommonElements get commonElements => _coreTypes;
   CoreClasses get coreClasses => _coreTypes;
   CoreTypes get coreTypes => _coreTypes;
-  CommonMasks get commonMasks => globalInference.masks;
   Resolution get resolution => _resolution;
   ParsingContext get parsingContext => _parsingContext;
 
@@ -194,10 +188,8 @@
   /// A customizable filter that is applied to enqueued work items.
   QueueFilter enqueuerFilter = new QueueFilter();
 
-  bool enabledRuntimeType = false;
-  bool enabledFunctionApply = false;
-  bool enabledInvokeOn = false;
-  bool hasIsolateSupport = false;
+  bool get hasFunctionApplySupport => resolverWorld.hasFunctionApplySupport;
+  bool get hasIsolateSupport => resolverWorld.hasIsolateSupport;
 
   bool get hasCrashed => _reporter.hasCrashed;
 
@@ -226,7 +218,6 @@
         this.userOutputProvider = outputProvider == null
             ? const NullCompilerOutput()
             : outputProvider {
-    _world = new WorldImpl(this);
     if (makeReporter != null) {
       _reporter = makeReporter(this, options);
     } else {
@@ -258,6 +249,7 @@
           useKernel: options.useKernel);
       backend = jsBackend;
     }
+    enqueuer = backend.makeEnqueuer();
 
     if (options.dumpInfo && options.useStartupEmitter) {
       throw new ArgumentError(
@@ -289,7 +281,9 @@
       constants = backend.constantCompilerTask,
       deferredLoadTask = new DeferredLoadTask(this),
       mirrorUsageAnalyzerTask = new MirrorUsageAnalyzerTask(this),
-      enqueuer = backend.makeEnqueuer(),
+      // [enqueuer] is created earlier because it contains the resolution world
+      // objects needed by other tasks.
+      enqueuer,
       dumpInfoTask = new DumpInfoTask(this),
       selfTask = new GenericTask('self', measurer),
     ];
@@ -656,7 +650,7 @@
         // something to the resolution queue.  So we cannot wait with
         // this until after the resolution queue is processed.
         deferredLoadTask.beforeResolution(this);
-        impactStrategy = backend.createImpactStrategy(
+        ImpactStrategy impactStrategy = backend.createImpactStrategy(
             supportDeferredLoad: deferredLoadTask.isProgramSplit,
             supportDumpInfo: options.dumpInfo,
             supportSerialization: serialization.supportSerialization);
@@ -687,7 +681,7 @@
         }
         // Elements required by enqueueHelpers are global dependencies
         // that are not pulled in by a particular element.
-        backend.enqueueHelpers(enqueuer.resolution, globalDependencies);
+        backend.enqueueHelpers(enqueuer.resolution);
         resolveLibraryMetadata();
         reporter.log('Resolving...');
         processQueue(enqueuer.resolution, mainFunction);
@@ -737,7 +731,6 @@
         reporter.log('Compiling...');
         phase = PHASE_COMPILING;
         backend.onCodegenStart();
-        // TODO(johnniwinther): Move these to [CodegenEnqueuer].
         if (hasIsolateSupport) {
           backend.enableIsolateSupport(enqueuer.codegen);
         }
@@ -765,7 +758,7 @@
   void closeResolution() {
     phase = PHASE_DONE_RESOLVING;
 
-    openWorld.closeWorld();
+    openWorld.closeWorld(reporter);
     // Compute whole-program-knowledge that the backend needs. (This might
     // require the information computed in [world.closeWorld].)
     backend.onResolutionComplete();
@@ -817,7 +810,7 @@
       ClassElement cls = element;
       cls.ensureResolved(resolution);
       cls.forEachLocalMember(enqueuer.resolution.addToWorkList);
-      backend.registerInstantiatedType(cls.rawType, world, globalDependencies);
+      world.registerInstantiatedType(cls.rawType);
     } else {
       world.addToWorkList(element);
     }
@@ -837,59 +830,60 @@
   }
 
   /**
-   * Empty the [world] queue.
+   * Empty the [enqueuer] queue.
    */
-  void emptyQueue(Enqueuer world) =>
-      selfTask.measureSubtask("Compiler.emptyQueue", () {
-        world.forEach((WorkItem work) {
-          reporter.withCurrentElement(
-              work.element,
-              () => selfTask.measureSubtask("world.applyImpact", () {
-                    world.applyImpact(
-                        selfTask.measureSubtask(
-                            "work.run", () => work.run(this, world)),
-                        impactSource: work.element);
-                  }));
-        });
+  void emptyQueue(Enqueuer enqueuer) {
+    selfTask.measureSubtask("Compiler.emptyQueue", () {
+      enqueuer.forEach((WorkItem work) {
+        reporter.withCurrentElement(
+            work.element,
+            () => selfTask.measureSubtask("world.applyImpact", () {
+                  enqueuer.applyImpact(
+                      impactStrategy,
+                      selfTask.measureSubtask(
+                          "work.run", () => work.run(this, enqueuer)),
+                      impactSource: work.element);
+                }));
       });
+    });
+  }
 
-  void processQueue(Enqueuer world, Element main) =>
-      selfTask.measureSubtask("Compiler.processQueue", () {
-        world.nativeEnqueuer.processNativeClasses(libraryLoader.libraries);
-        if (main != null && !main.isMalformed) {
-          FunctionElement mainMethod = main;
-          mainMethod.computeType(resolution);
-          if (mainMethod.functionSignature.parameterCount != 0) {
-            // The first argument could be a list of strings.
-            backend.backendClasses.listImplementation
-                .ensureResolved(resolution);
-            backend.registerInstantiatedType(
-                backend.backendClasses.listImplementation.rawType,
-                world,
-                globalDependencies);
-            backend.backendClasses.stringImplementation
-                .ensureResolved(resolution);
-            backend.registerInstantiatedType(
-                backend.backendClasses.stringImplementation.rawType,
-                world,
-                globalDependencies);
+  void processQueue(Enqueuer enqueuer, Element main) {
+    selfTask.measureSubtask("Compiler.processQueue", () {
+      WorldImpactBuilderImpl nativeImpact = new WorldImpactBuilderImpl();
+      enqueuer.nativeEnqueuer
+          .processNativeClasses(nativeImpact, libraryLoader.libraries);
+      enqueuer.applyImpact(impactStrategy, nativeImpact);
+      if (main != null && !main.isMalformed) {
+        FunctionElement mainMethod = main;
+        mainMethod.computeType(resolution);
+        if (mainMethod.functionSignature.parameterCount != 0) {
+          // The first argument could be a list of strings.
+          backend.backendClasses.listImplementation.ensureResolved(resolution);
+          enqueuer.registerInstantiatedType(
+              backend.backendClasses.listImplementation.rawType);
+          backend.backendClasses.stringImplementation
+              .ensureResolved(resolution);
+          enqueuer.registerInstantiatedType(
+              backend.backendClasses.stringImplementation.rawType);
 
-            backend.registerMainHasArguments(world);
-          }
-          world.addToWorkList(main);
+          backend.registerMainHasArguments(enqueuer);
         }
-        if (options.verbose) {
-          progress.reset();
-        }
-        emptyQueue(world);
-        world.queueIsClosed = true;
-        // Notify the impact strategy impacts are no longer needed for this
-        // enqueuer.
-        impactStrategy.onImpactUsed(world.impactUse);
-        backend.onQueueClosed();
-        assert(
-            compilationFailed || world.checkNoEnqueuedInvokedInstanceMethods());
-      });
+        enqueuer.addToWorkList(main);
+      }
+      if (options.verbose) {
+        progress.reset();
+      }
+      emptyQueue(enqueuer);
+      enqueuer.queueIsClosed = true;
+      // Notify the impact strategy impacts are no longer needed for this
+      // enqueuer.
+      impactStrategy.onImpactUsed(enqueuer.impactUse);
+      backend.onQueueClosed();
+      assert(compilationFailed ||
+          enqueuer.checkNoEnqueuedInvokedInstanceMethods());
+    });
+  }
 
   /**
    * Perform various checks of the queues. This includes checking that
@@ -2050,6 +2044,13 @@
   }
 
   @override
+  void ensureClassMembers(ClassElement element) {
+    if (!compiler.serialization.isDeserialized(element)) {
+      compiler.resolver.checkClass(element);
+    }
+  }
+
+  @override
   void registerCompileTimeError(Element element, DiagnosticMessage message) =>
       compiler.registerCompileTimeError(element, message);
 
@@ -2150,7 +2151,8 @@
   WorldImpact transformResolutionImpact(
       Element element, ResolutionImpact resolutionImpact) {
     WorldImpact worldImpact = compiler.backend.impactTransformer
-        .transformResolutionImpact(resolutionImpact);
+        .transformResolutionImpact(
+            compiler.enqueuer.resolution, resolutionImpact);
     _worldImpactCache[element] = worldImpact;
     return worldImpact;
   }
diff --git a/pkg/compiler/lib/src/deferred_load.dart b/pkg/compiler/lib/src/deferred_load.dart
index 6c93804..b29dae6 100644
--- a/pkg/compiler/lib/src/deferred_load.dart
+++ b/pkg/compiler/lib/src/deferred_load.dart
@@ -346,6 +346,8 @@
                   }
                   break;
                 case TypeUseKind.INSTANTIATION:
+                case TypeUseKind.MIRROR_INSTANTIATION:
+                case TypeUseKind.NATIVE_INSTANTIATION:
                 case TypeUseKind.IS_CHECK:
                 case TypeUseKind.AS_CAST:
                 case TypeUseKind.CATCH_TYPE:
@@ -842,7 +844,7 @@
     }
     if (isProgramSplit) {
       isProgramSplit = compiler.backend.enableDeferredLoadingIfSupported(
-          lastDeferred, compiler.globalDependencies);
+          compiler.enqueuer.resolution, lastDeferred);
     }
   }
 
diff --git a/pkg/compiler/lib/src/dump_info.dart b/pkg/compiler/lib/src/dump_info.dart
index 4b5d1a7..db6a13a 100644
--- a/pkg/compiler/lib/src/dump_info.dart
+++ b/pkg/compiler/lib/src/dump_info.dart
@@ -115,8 +115,10 @@
     return info;
   }
 
+  _resultOf(e) => compiler.globalInference.results.resultOf(e);
+
   FieldInfo visitFieldElement(FieldElement element, _) {
-    TypeMask inferredType = compiler.globalInference.results.typeOf(element);
+    TypeMask inferredType = _resultOf(element).type;
     // If a field has an empty inferred type it is never used.
     if (inferredType == null || inferredType.isEmpty) return null;
 
@@ -249,10 +251,8 @@
     if (element.hasFunctionSignature) {
       FunctionSignature signature = element.functionSignature;
       signature.forEachParameter((parameter) {
-        parameters.add(new ParameterInfo(
-            parameter.name,
-            '${compiler.globalInference.results.typeOf(parameter)}',
-            '${parameter.node.type}'));
+        parameters.add(new ParameterInfo(parameter.name,
+            '${_resultOf(parameter).type}', '${parameter.node.type}'));
       });
     }
 
@@ -263,8 +263,7 @@
         compiler.closedWorld.allFunctions.contains(element)) {
       returnType = '${element.type.returnType}';
     }
-    String inferredReturnType =
-        '${compiler.globalInference.results.returnTypeOf(element)}';
+    String inferredReturnType = '${_resultOf(element).returnType}';
     String sideEffects =
         '${compiler.closedWorld.getSideEffectsOfElement(element)}';
 
@@ -421,7 +420,9 @@
 
   final Map<Element, Set<Element>> _dependencies = {};
   void registerDependency(Element source, Element target) {
-    _dependencies.putIfAbsent(source, () => new Set()).add(target);
+    if (compiler.options.dumpInfo) {
+      _dependencies.putIfAbsent(source, () => new Set()).add(target);
+    }
   }
 
   void registerImpact(Element element, WorldImpact impact) {
diff --git a/pkg/compiler/lib/src/enqueue.dart b/pkg/compiler/lib/src/enqueue.dart
index b254e0d..66c3260 100644
--- a/pkg/compiler/lib/src/enqueue.dart
+++ b/pkg/compiler/lib/src/enqueue.dart
@@ -6,29 +6,29 @@
 
 import 'dart:collection' show Queue;
 
+import 'cache_strategy.dart';
+import 'common/backend_api.dart' show Backend;
 import 'common/names.dart' show Identifiers;
-import 'common/resolution.dart' show Resolution;
-import 'common/resolution.dart' show ResolutionWorkItem;
+import 'common/resolution.dart' show Resolution, ResolutionWorkItem;
+import 'common/registry.dart' show Registry;
 import 'common/tasks.dart' show CompilerTask;
 import 'common/work.dart' show WorkItem;
 import 'common.dart';
-import 'compiler.dart' show Compiler;
+import 'compiler.dart' show Compiler, GlobalDependencyRegistry;
+import 'core_types.dart' show CommonElements;
+import 'options.dart';
 import 'dart_types.dart' show DartType, InterfaceType;
 import 'elements/elements.dart'
     show
         AnalyzableElement,
         AstElement,
         ClassElement,
-        ConstructorElement,
         Element,
-        Elements,
         Entity,
         FunctionElement,
         LibraryElement,
-        Member,
-        Name,
-        TypedElement,
-        TypedefElement;
+        LocalFunctionElement,
+        TypedElement;
 import 'native/native.dart' as native;
 import 'types/types.dart' show TypeMaskStrategy;
 import 'universe/selector.dart' show Selector;
@@ -36,44 +36,49 @@
 import 'universe/use.dart'
     show DynamicUse, StaticUse, StaticUseKind, TypeUse, TypeUseKind;
 import 'universe/world_impact.dart'
-    show ImpactUseCase, WorldImpact, WorldImpactVisitor;
+    show ImpactStrategy, ImpactUseCase, WorldImpact, WorldImpactVisitor;
 import 'util/util.dart' show Setlet;
+import 'world.dart' show OpenWorld;
 
 class EnqueueTask extends CompilerTask {
-  final ResolutionEnqueuer resolution;
-  final Enqueuer codegen;
+  ResolutionEnqueuer _resolution;
+  Enqueuer _codegen;
   final Compiler compiler;
 
   String get name => 'Enqueue';
 
   EnqueueTask(Compiler compiler)
-      : compiler = compiler,
-        resolution = new ResolutionEnqueuer(
-            compiler,
-            compiler.options.analyzeOnly && compiler.options.analyzeMain
-                ? const EnqueuerStrategy()
-                : const TreeShakingEnqueuerStrategy()),
-        codegen = compiler.backend.createCodegenEnqueuer(compiler),
+      : this.compiler = compiler,
         super(compiler.measurer) {
-    codegen.task = this;
-    resolution.task = this;
-
-    codegen.nativeEnqueuer = compiler.backend.nativeCodegenEnqueuer(codegen);
-    resolution.nativeEnqueuer =
-        compiler.backend.nativeResolutionEnqueuer(resolution);
+    _resolution = new ResolutionEnqueuer(
+        this,
+        compiler.options,
+        compiler.resolution,
+        compiler.enqueuerFilter,
+        compiler.options.analyzeOnly && compiler.options.analyzeMain
+            ? const EnqueuerStrategy()
+            : const TreeShakingEnqueuerStrategy(),
+        compiler.globalDependencies,
+        compiler.backend,
+        compiler.coreClasses,
+        compiler.cacheStrategy);
+    _codegen = compiler.backend.createCodegenEnqueuer(this, compiler);
   }
 
+  ResolutionEnqueuer get resolution => _resolution;
+  Enqueuer get codegen => _codegen;
+
   void forgetElement(Element element) {
-    resolution.forgetElement(element);
-    codegen.forgetElement(element);
+    resolution.forgetElement(element, compiler);
+    codegen.forgetElement(element, compiler);
   }
 }
 
 abstract class Enqueuer {
-  EnqueueTask task;
+  CompilerTask get task;
   WorldBuilder get universe;
-  native.NativeEnqueuer nativeEnqueuer; // Set by EnqueueTask
-  void forgetElement(Element element);
+  native.NativeEnqueuer get nativeEnqueuer;
+  void forgetElement(Element element, Compiler compiler);
   void processInstantiatedClassMembers(ClassElement cls);
   void processInstantiatedClassMember(ClassElement cls, Element member);
   void handleUnseenSelectorInternal(DynamicUse dynamicUse);
@@ -100,21 +105,14 @@
 
   void enableIsolateSupport();
 
-  /// Enqueue the static fields that have been marked as used by reflective
-  /// usage through `MirrorsUsed`.
-  void enqueueReflectiveStaticFields(Iterable<Element> elements);
-
-  /// Enqueue all elements that are matched by the mirrors used
-  /// annotation or, in lack thereof, all elements.
-  void enqueueReflectiveElements(Iterable<ClassElement> recents);
-
-  void registerInstantiatedType(InterfaceType type, {bool mirrorUsage: false});
+  void registerInstantiatedType(InterfaceType type);
   void forEach(void f(WorkItem work));
 
   /// Apply the [worldImpact] to this enqueuer. If the [impactSource] is provided
   /// the impact strategy will remove it from the element impact cache, if it is
   /// no longer needed.
-  void applyImpact(WorldImpact worldImpact, {Element impactSource});
+  void applyImpact(ImpactStrategy impactStrategy, WorldImpact worldImpact,
+      {Element impactSource});
   bool checkNoEnqueuedInvokedInstanceMethods();
   void logSummary(log(message));
 
@@ -122,12 +120,22 @@
   bool isProcessed(Element member);
 
   Iterable<Entity> get processedEntities;
+
+  Iterable<ClassElement> get processedClasses;
 }
 
 /// [Enqueuer] which is specific to resolution.
 class ResolutionEnqueuer extends Enqueuer {
+  final CompilerTask task;
   final String name;
-  final Compiler compiler; // TODO(ahe): Remove this dependency.
+  final Resolution resolution;
+  final QueueFilter filter;
+  final CompilerOptions options;
+  final Backend backend;
+  final GlobalDependencyRegistry globalDependencies;
+  final CommonElements commonElements;
+  final native.NativeEnqueuer nativeEnqueuer;
+
   final EnqueuerStrategy strategy;
   final Map<String, Set<Element>> instanceMembersByName =
       new Map<String, Set<Element>>();
@@ -135,37 +143,43 @@
       new Map<String, Set<Element>>();
   final Set<ClassElement> _processedClasses = new Set<ClassElement>();
   Set<ClassElement> recentClasses = new Setlet<ClassElement>();
-  final ResolutionWorldBuilderImpl _universe =
-      new ResolutionWorldBuilderImpl(const TypeMaskStrategy());
-
-  static final TRACE_MIRROR_ENQUEUING =
-      const bool.fromEnvironment("TRACE_MIRROR_ENQUEUING");
+  final ResolutionWorldBuilderImpl _universe;
 
   bool queueIsClosed = false;
 
-  bool hasEnqueuedReflectiveElements = false;
-  bool hasEnqueuedReflectiveStaticFields = false;
-
   WorldImpactVisitor impactVisitor;
 
-  ResolutionEnqueuer(Compiler compiler, this.strategy)
+  ImpactStrategy impactStrategy;
+
+  ResolutionEnqueuer(
+      this.task,
+      this.options,
+      this.resolution,
+      this.filter,
+      this.strategy,
+      this.globalDependencies,
+      Backend backend,
+      CommonElements commonElements,
+      CacheStrategy cacheStrategy)
       : this.name = 'resolution enqueuer',
-        this.compiler = compiler,
+        this.backend = backend,
+        this.commonElements = commonElements,
+        this.nativeEnqueuer = backend.nativeResolutionEnqueuer(),
         processedElements = new Set<AstElement>(),
         queue = new Queue<ResolutionWorkItem>(),
-        deferredQueue = new Queue<_DeferredAction>() {
+        deferredQueue = new Queue<_DeferredAction>(),
+        _universe = new ResolutionWorldBuilderImpl(
+            backend, commonElements, cacheStrategy, const TypeMaskStrategy()) {
     impactVisitor = new _EnqueuerImpactVisitor(this);
   }
 
-  Resolution get resolution => compiler.resolution;
-
   ResolutionWorldBuilder get universe => _universe;
 
+  OpenWorld get openWorld => universe.openWorld;
+
   bool get queueIsEmpty => queue.isEmpty;
 
-  QueueFilter get filter => compiler.enqueuerFilter;
-
-  DiagnosticReporter get reporter => compiler.reporter;
+  DiagnosticReporter get reporter => resolution.reporter;
 
   bool isClassProcessed(ClassElement cls) => _processedClasses.contains(cls);
 
@@ -178,30 +192,39 @@
    */
   void addToWorkList(Element element) {
     assert(invariant(element, element.isDeclaration));
-    if (internalAddToWorkList(element) && compiler.options.dumpInfo) {
-      // TODO(sigmund): add other missing dependencies (internals, selectors
-      // enqueued after allocations), also enable only for the codegen enqueuer.
-      compiler.dumpInfoTask
-          .registerDependency(compiler.currentElement, element);
-    }
+    internalAddToWorkList(element);
   }
 
-  void applyImpact(WorldImpact worldImpact, {Element impactSource}) {
-    compiler.impactStrategy
-        .visitImpact(impactSource, worldImpact, impactVisitor, impactUse);
+  void applyImpact(ImpactStrategy impactStrategy, WorldImpact worldImpact,
+      {Element impactSource}) {
+    impactStrategy.visitImpact(
+        impactSource, worldImpact, impactVisitor, impactUse);
   }
 
-  void registerInstantiatedType(InterfaceType type, {bool mirrorUsage: false}) {
+  void registerInstantiatedType(InterfaceType type) {
+    _registerInstantiatedType(type, globalDependency: true);
+  }
+
+  void _registerInstantiatedType(InterfaceType type,
+      {bool mirrorUsage: false,
+      bool nativeUsage: false,
+      bool globalDependency: false}) {
     task.measure(() {
       ClassElement cls = type.element;
       cls.ensureResolved(resolution);
-      bool isNative = compiler.backend.isNative(cls);
+      bool isNative = backend.isNative(cls);
       _universe.registerTypeInstantiation(type,
           isNative: isNative,
           byMirrors: mirrorUsage, onImplemented: (ClassElement cls) {
-        compiler.backend
-            .registerImplementedClass(cls, this, compiler.globalDependencies);
+        backend.registerImplementedClass(cls, this);
       });
+      if (globalDependency && !mirrorUsage) {
+        globalDependencies.registerDependency(type.element);
+      }
+      if (nativeUsage) {
+        nativeEnqueuer.onInstantiatedType(type);
+      }
+      backend.registerInstantiatedType(type);
       // TODO(johnniwinther): Share this reasoning with [Universe].
       if (!cls.isAbstract || isNative || mirrorUsage) {
         processInstantiatedClass(cls);
@@ -231,14 +254,14 @@
       // its metadata parsed and analyzed.
       // Note: this assumes that there are no non-native fields on native
       // classes, which may not be the case when a native class is subclassed.
-      if (compiler.backend.isNative(cls)) {
-        compiler.openWorld.registerUsedElement(member);
-        if (_universe.hasInvokedGetter(member, compiler.openWorld) ||
-            _universe.hasInvocation(member, compiler.openWorld)) {
+      if (backend.isNative(cls)) {
+        openWorld.registerUsedElement(member);
+        if (_universe.hasInvokedGetter(member, openWorld) ||
+            _universe.hasInvocation(member, openWorld)) {
           addToWorkList(member);
           return;
         }
-        if (_universe.hasInvokedSetter(member, compiler.openWorld)) {
+        if (_universe.hasInvokedSetter(member, openWorld)) {
           addToWorkList(member);
           return;
         }
@@ -262,7 +285,7 @@
       }
       // If there is a property access with the same name as a method we
       // need to emit the method.
-      if (_universe.hasInvokedGetter(function, compiler.openWorld)) {
+      if (_universe.hasInvokedGetter(function, openWorld)) {
         registerClosurizedMember(function);
         addToWorkList(function);
         return;
@@ -272,27 +295,27 @@
       instanceFunctionsByName
           .putIfAbsent(memberName, () => new Set<Element>())
           .add(member);
-      if (_universe.hasInvocation(function, compiler.openWorld)) {
+      if (_universe.hasInvocation(function, openWorld)) {
         addToWorkList(function);
         return;
       }
     } else if (member.isGetter) {
       FunctionElement getter = member;
       getter.computeType(resolution);
-      if (_universe.hasInvokedGetter(getter, compiler.openWorld)) {
+      if (_universe.hasInvokedGetter(getter, openWorld)) {
         addToWorkList(getter);
         return;
       }
       // We don't know what selectors the returned closure accepts. If
       // the set contains any selector we have to assume that it matches.
-      if (_universe.hasInvocation(getter, compiler.openWorld)) {
+      if (_universe.hasInvocation(getter, openWorld)) {
         addToWorkList(getter);
         return;
       }
     } else if (member.isSetter) {
       FunctionElement setter = member;
       setter.computeType(resolution);
-      if (_universe.hasInvokedSetter(setter, compiler.openWorld)) {
+      if (_universe.hasInvokedSetter(setter, openWorld)) {
         addToWorkList(setter);
         return;
       }
@@ -319,14 +342,11 @@
         recentClasses.add(superclass);
         superclass.ensureResolved(resolution);
         superclass.implementation.forEachMember(processInstantiatedClassMember);
-        if (!compiler.serialization.isDeserialized(superclass)) {
-          compiler.resolver.checkClass(superclass);
-        }
+        resolution.ensureClassMembers(superclass);
         // We only tell the backend once that [superclass] was instantiated, so
         // any additional dependencies must be treated as global
         // dependencies.
-        compiler.backend.registerInstantiatedClass(
-            superclass, this, compiler.globalDependencies);
+        backend.registerInstantiatedClass(superclass, this);
       }
 
       ClassElement superclass = cls;
@@ -345,172 +365,6 @@
     });
   }
 
-  void logEnqueueReflectiveAction(action, [msg = ""]) {
-    if (TRACE_MIRROR_ENQUEUING) {
-      print("MIRROR_ENQUEUE (R): $action $msg");
-    }
-  }
-
-  /// Enqeue the constructor [ctor] if it is required for reflection.
-  ///
-  /// [enclosingWasIncluded] provides a hint whether the enclosing element was
-  /// needed for reflection.
-  void enqueueReflectiveConstructor(
-      ConstructorElement ctor, bool enclosingWasIncluded) {
-    if (shouldIncludeElementDueToMirrors(ctor,
-        includedEnclosing: enclosingWasIncluded)) {
-      logEnqueueReflectiveAction(ctor);
-      ClassElement cls = ctor.declaration.enclosingClass;
-      compiler.backend.registerInstantiatedType(
-          cls.rawType, this, compiler.mirrorDependencies,
-          mirrorUsage: true);
-      registerStaticUse(new StaticUse.foreignUse(ctor.declaration));
-    }
-  }
-
-  /// Enqeue the member [element] if it is required for reflection.
-  ///
-  /// [enclosingWasIncluded] provides a hint whether the enclosing element was
-  /// needed for reflection.
-  void enqueueReflectiveMember(Element element, bool enclosingWasIncluded) {
-    if (shouldIncludeElementDueToMirrors(element,
-        includedEnclosing: enclosingWasIncluded)) {
-      logEnqueueReflectiveAction(element);
-      if (element.isTypedef) {
-        TypedefElement typedef = element;
-        typedef.ensureResolved(resolution);
-      } else if (Elements.isStaticOrTopLevel(element)) {
-        registerStaticUse(new StaticUse.foreignUse(element.declaration));
-      } else if (element.isInstanceMember) {
-        // We need to enqueue all members matching this one in subclasses, as
-        // well.
-        // TODO(herhut): Use TypedSelector.subtype for enqueueing
-        DynamicUse dynamicUse =
-            new DynamicUse(new Selector.fromElement(element), null);
-        registerDynamicUse(dynamicUse);
-        if (element.isField) {
-          DynamicUse dynamicUse = new DynamicUse(
-              new Selector.setter(
-                  new Name(element.name, element.library, isSetter: true)),
-              null);
-          registerDynamicUse(dynamicUse);
-        }
-      }
-    }
-  }
-
-  /// Enqeue the member [element] if it is required for reflection.
-  ///
-  /// [enclosingWasIncluded] provides a hint whether the enclosing element was
-  /// needed for reflection.
-  void enqueueReflectiveElementsInClass(ClassElement cls,
-      Iterable<ClassElement> recents, bool enclosingWasIncluded) {
-    if (cls.library.isInternalLibrary || cls.isInjected) return;
-    bool includeClass = shouldIncludeElementDueToMirrors(cls,
-        includedEnclosing: enclosingWasIncluded);
-    if (includeClass) {
-      logEnqueueReflectiveAction(cls, "register");
-      ClassElement decl = cls.declaration;
-      decl.ensureResolved(resolution);
-      compiler.backend.registerInstantiatedType(
-          decl.rawType, this, compiler.mirrorDependencies,
-          mirrorUsage: true);
-    }
-    // If the class is never instantiated, we know nothing of it can possibly
-    // be reflected upon.
-    // TODO(herhut): Add a warning if a mirrors annotation cannot hit.
-    if (recents.contains(cls.declaration)) {
-      logEnqueueReflectiveAction(cls, "members");
-      cls.constructors.forEach((Element element) {
-        enqueueReflectiveConstructor(element, includeClass);
-      });
-      cls.forEachClassMember((Member member) {
-        enqueueReflectiveMember(member.element, includeClass);
-      });
-    }
-  }
-
-  /// Enqeue special classes that might not be visible by normal means or that
-  /// would not normally be enqueued:
-  ///
-  /// [Closure] is treated specially as it is the superclass of all closures.
-  /// Although it is in an internal library, we mark it as reflectable. Note
-  /// that none of its methods are reflectable, unless reflectable by
-  /// inheritance.
-  void enqueueReflectiveSpecialClasses() {
-    Iterable<ClassElement> classes =
-        compiler.backend.classesRequiredForReflection;
-    for (ClassElement cls in classes) {
-      if (compiler.backend.referencedFromMirrorSystem(cls)) {
-        logEnqueueReflectiveAction(cls);
-        cls.ensureResolved(resolution);
-        compiler.backend.registerInstantiatedType(
-            cls.rawType, this, compiler.mirrorDependencies,
-            mirrorUsage: true);
-      }
-    }
-  }
-
-  /// Enqeue all local members of the library [lib] if they are required for
-  /// reflection.
-  void enqueueReflectiveElementsInLibrary(
-      LibraryElement lib, Iterable<ClassElement> recents) {
-    bool includeLibrary =
-        shouldIncludeElementDueToMirrors(lib, includedEnclosing: false);
-    lib.forEachLocalMember((Element member) {
-      if (member.isInjected) return;
-      if (member.isClass) {
-        enqueueReflectiveElementsInClass(member, recents, includeLibrary);
-      } else {
-        enqueueReflectiveMember(member, includeLibrary);
-      }
-    });
-  }
-
-  /// Enqueue all elements that are matched by the mirrors used
-  /// annotation or, in lack thereof, all elements.
-  void enqueueReflectiveElements(Iterable<ClassElement> recents) {
-    if (!hasEnqueuedReflectiveElements) {
-      logEnqueueReflectiveAction("!START enqueueAll");
-      // First round of enqueuing, visit everything that is visible to
-      // also pick up static top levels, etc.
-      // Also, during the first round, consider all classes that have been seen
-      // as recently seen, as we do not know how many rounds of resolution might
-      // have run before tree shaking is disabled and thus everything is
-      // enqueued.
-      recents = _processedClasses.toSet();
-      reporter.log('Enqueuing everything');
-      for (LibraryElement lib in compiler.libraryLoader.libraries) {
-        enqueueReflectiveElementsInLibrary(lib, recents);
-      }
-      enqueueReflectiveSpecialClasses();
-      hasEnqueuedReflectiveElements = true;
-      hasEnqueuedReflectiveStaticFields = true;
-      logEnqueueReflectiveAction("!DONE enqueueAll");
-    } else if (recents.isNotEmpty) {
-      // Keep looking at new classes until fixpoint is reached.
-      logEnqueueReflectiveAction("!START enqueueRecents");
-      recents.forEach((ClassElement cls) {
-        enqueueReflectiveElementsInClass(
-            cls,
-            recents,
-            shouldIncludeElementDueToMirrors(cls.library,
-                includedEnclosing: false));
-      });
-      logEnqueueReflectiveAction("!DONE enqueueRecents");
-    }
-  }
-
-  /// Enqueue the static fields that have been marked as used by reflective
-  /// usage through `MirrorsUsed`.
-  void enqueueReflectiveStaticFields(Iterable<Element> elements) {
-    if (hasEnqueuedReflectiveStaticFields) return;
-    hasEnqueuedReflectiveStaticFields = true;
-    for (Element element in elements) {
-      enqueueReflectiveMember(element, true);
-    }
-  }
-
   void processSet(
       Map<String, Set<Element>> map, String memberName, bool f(Element e)) {
     Set<Element> members = map[memberName];
@@ -542,7 +396,7 @@
     Selector selector = dynamicUse.selector;
     String methodName = selector.name;
     processInstanceMembers(methodName, (Element member) {
-      if (dynamicUse.appliesUnnamed(member, compiler.openWorld)) {
+      if (dynamicUse.appliesUnnamed(member, openWorld)) {
         if (member.isFunction && selector.isGetter) {
           registerClosurizedMember(member);
         }
@@ -553,7 +407,7 @@
     });
     if (selector.isGetter) {
       processInstanceFunctions(methodName, (Element member) {
-        if (dynamicUse.appliesUnnamed(member, compiler.openWorld)) {
+        if (dynamicUse.appliesUnnamed(member, openWorld)) {
           registerClosurizedMember(member);
           return true;
         }
@@ -576,11 +430,11 @@
     assert(invariant(element, element.isDeclaration,
         message: "Element ${element} is not the declaration."));
     _universe.registerStaticUse(staticUse);
-    compiler.backend.registerStaticUse(element, forResolution: true);
+    backend.registerStaticUse(this, element);
     bool addElement = true;
     switch (staticUse.kind) {
       case StaticUseKind.STATIC_TEAR_OFF:
-        compiler.backend.registerGetOfStaticFunction(this);
+        backend.registerGetOfStaticFunction(this);
         break;
       case StaticUseKind.FIELD_GET:
       case StaticUseKind.FIELD_SET:
@@ -589,6 +443,10 @@
         // [FIELD_SET] contains [BoxFieldElement]s which we cannot enqueue.
         // Also [CLOSURE] contains [LocalFunctionElement] which we cannot
         // enqueue.
+        LocalFunctionElement closure = staticUse.element;
+        if (closure.type.containsTypeVariables) {
+          universe.closuresWithFreeTypeVariables.add(closure);
+        }
         addElement = false;
         break;
       case StaticUseKind.SUPER_FIELD_SET:
@@ -613,7 +471,15 @@
     DartType type = typeUse.type;
     switch (typeUse.kind) {
       case TypeUseKind.INSTANTIATION:
-        registerInstantiatedType(type);
+        _registerInstantiatedType(type, globalDependency: false);
+        break;
+      case TypeUseKind.MIRROR_INSTANTIATION:
+        _registerInstantiatedType(type,
+            mirrorUsage: true, globalDependency: false);
+        break;
+      case TypeUseKind.NATIVE_INSTANTIATION:
+        _registerInstantiatedType(type,
+            nativeUsage: true, globalDependency: true);
         break;
       case TypeUseKind.IS_CHECK:
       case TypeUseKind.AS_CAST:
@@ -621,7 +487,7 @@
         _registerIsCheck(type);
         break;
       case TypeUseKind.CHECKED_MODE_CHECK:
-        if (compiler.options.enableTypeAssertions) {
+        if (options.enableTypeAssertions) {
           _registerIsCheck(type);
         }
         break;
@@ -631,7 +497,7 @@
   }
 
   void _registerIsCheck(DartType type) {
-    type = _universe.registerIsCheck(type, compiler);
+    type = _universe.registerIsCheck(type, resolution);
     // Even in checked mode, type annotations for return type and argument
     // types do not imply type checks, so there should never be a check
     // against the type variable of a typedef.
@@ -639,19 +505,17 @@
   }
 
   void registerCallMethodWithFreeTypeVariables(Element element) {
-    compiler.backend.registerCallMethodWithFreeTypeVariables(
-        element, this, compiler.globalDependencies);
+    backend.registerCallMethodWithFreeTypeVariables(element, this);
     _universe.callMethodsWithFreeTypeVariables.add(element);
   }
 
   void registerClosurizedMember(TypedElement element) {
     assert(element.isInstanceMember);
     if (element.computeType(resolution).containsTypeVariables) {
-      compiler.backend.registerClosureWithFreeTypeVariables(
-          element, this, compiler.globalDependencies);
+      backend.registerClosureWithFreeTypeVariables(element, this);
       _universe.closuresWithFreeTypeVariables.add(element);
     }
-    compiler.backend.registerBoundClosure(this);
+    backend.registerBoundClosure(this);
     _universe.closurizedMembers.add(element);
   }
 
@@ -702,21 +566,7 @@
   /// Registers [element] as processed by the resolution enqueuer.
   void registerProcessedElement(AstElement element) {
     processedElements.add(element);
-    compiler.backend.onElementResolved(element);
-  }
-
-  /**
-   * Decides whether an element should be included to satisfy requirements
-   * of the mirror system.
-   *
-   * During resolution, we have to resort to matching elements against the
-   * [MirrorsUsed] pattern, as we do not have a complete picture of the world,
-   * yet.
-   */
-  bool shouldIncludeElementDueToMirrors(Element element,
-      {bool includedEnclosing}) {
-    return includedEnclosing ||
-        compiler.backend.requiredByMirrorSystem(element);
+    backend.onElementResolved(element);
   }
 
   /**
@@ -735,16 +585,16 @@
           element, "Resolution work list is closed. Trying to add $element.");
     }
 
-    compiler.openWorld.registerUsedElement(element);
+    openWorld.registerUsedElement(element);
 
-    ResolutionWorkItem workItem = compiler.resolution.createWorkItem(element);
+    ResolutionWorkItem workItem = resolution.createWorkItem(element);
     queue.add(workItem);
 
     // Enable isolate support if we start using something from the isolate
     // library, or timers for the async library.  We exclude constant fields,
     // which are ending here because their initializing expression is compiled.
     LibraryElement library = element.library;
-    if (!compiler.hasIsolateSupport && (!element.isField || !element.isConst)) {
+    if (!universe.hasIsolateSupport && (!element.isField || !element.isConst)) {
       String uri = library.canonicalUri.toString();
       if (uri == 'dart:isolate') {
         enableIsolateSupport();
@@ -763,23 +613,23 @@
       // We have to enable runtime type before hitting the codegen, so
       // that constructors know whether they need to generate code for
       // runtime type.
-      compiler.enabledRuntimeType = true;
+      _universe.hasRuntimeTypeSupport = true;
       // TODO(ahe): Record precise dependency here.
-      compiler.backend.registerRuntimeType(this, compiler.globalDependencies);
-    } else if (compiler.commonElements.isFunctionApplyMethod(element)) {
-      compiler.enabledFunctionApply = true;
+      backend.registerRuntimeType(this);
+    } else if (commonElements.isFunctionApplyMethod(element)) {
+      _universe.hasFunctionApplySupport = true;
     }
 
     return true;
   }
 
   void registerNoSuchMethod(Element element) {
-    compiler.backend.registerNoSuchMethod(element);
+    backend.registerNoSuchMethod(element);
   }
 
   void enableIsolateSupport() {
-    compiler.hasIsolateSupport = true;
-    compiler.backend.enableIsolateSupport(this);
+    _universe.hasIsolateSupport = true;
+    backend.enableIsolateSupport(this);
   }
 
   /**
@@ -809,7 +659,7 @@
   bool onQueueEmpty(Iterable<ClassElement> recentClasses) {
     _emptyDeferredQueue();
 
-    return compiler.backend.onQueueEmpty(this, recentClasses);
+    return backend.onQueueEmpty(this, recentClasses);
   }
 
   void emptyDeferredQueueForTesting() => _emptyDeferredQueue();
@@ -821,7 +671,7 @@
     }
   }
 
-  void forgetElement(Element element) {
+  void forgetElement(Element element, Compiler compiler) {
     _universe.forgetElement(element, compiler);
     _processedClasses.remove(element);
     instanceMembersByName[element.name]?.remove(element);
diff --git a/pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart b/pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart
index f2f8e0b..4e96cd6 100644
--- a/pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart
+++ b/pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart
@@ -18,7 +18,7 @@
 import '../resolution/operators.dart' as op;
 import '../resolution/tree_elements.dart' show TreeElements;
 import '../tree/tree.dart' as ast;
-import '../types/types.dart' show TypeMask;
+import '../types/types.dart' show TypeMask, GlobalTypeInferenceElementData;
 import '../universe/call_structure.dart' show CallStructure;
 import '../universe/selector.dart' show Selector;
 import '../universe/side_effects.dart' show SideEffects;
@@ -39,6 +39,11 @@
   final Map<ast.Node, T> concreteTypes = new Map<ast.Node, T>();
   final Set<Element> generativeConstructorsExposingThis = new Set<Element>();
 
+  /// Data computed internally within elements, like the type-mask of a send a
+  /// list allocation, or a for-in loop.
+  final Map<Element, GlobalTypeInferenceElementData> inTreeData =
+      new Map<Element, GlobalTypeInferenceElementData>();
+
   InferrerEngine(Compiler compiler, this.types)
       : this.compiler = compiler,
         this.closedWorld = compiler.closedWorld;
@@ -181,6 +186,9 @@
     }
   }
 
+  GlobalTypeInferenceElementData _dataOf(AstElement element) => inTreeData
+      .putIfAbsent(element, () => new GlobalTypeInferenceElementData());
+
   /**
    * Update [sideEffects] with the side effects of [callee] being
    * called with [selector].
@@ -261,27 +269,27 @@
   void updateSelectorInTree(
       AstElement owner, Spannable node, Selector selector, TypeMask mask) {
     ast.Node astNode = node;
-    TreeElements elements = owner.resolvedAst.elements;
+    GlobalTypeInferenceElementData data = _dataOf(owner);
     if (astNode.asSendSet() != null) {
       if (selector.isSetter || selector.isIndexSet) {
-        elements.setTypeMask(node, mask);
+        data.setTypeMask(node, mask);
       } else if (selector.isGetter || selector.isIndex) {
-        elements.setGetterTypeMaskInComplexSendSet(node, mask);
+        data.setGetterTypeMaskInComplexSendSet(node, mask);
       } else {
         assert(selector.isOperator);
-        elements.setOperatorTypeMaskInComplexSendSet(node, mask);
+        data.setOperatorTypeMaskInComplexSendSet(node, mask);
       }
     } else if (astNode.asSend() != null) {
-      elements.setTypeMask(node, mask);
+      data.setTypeMask(node, mask);
     } else {
       assert(astNode.asForIn() != null);
       if (selector == Selectors.iterator) {
-        elements.setIteratorTypeMask(node, mask);
+        data.setIteratorTypeMask(node, mask);
       } else if (selector == Selectors.current) {
-        elements.setCurrentTypeMask(node, mask);
+        data.setCurrentTypeMask(node, mask);
       } else {
         assert(selector == Selectors.moveNext);
-        elements.setMoveNextTypeMask(node, mask);
+        data.setMoveNextTypeMask(node, mask);
       }
     }
   }
@@ -324,6 +332,7 @@
   final Element outermostElement;
   final InferrerEngine<T, TypeSystem<T>> inferrer;
   final Setlet<Entity> capturedVariables = new Setlet<Entity>();
+  final GlobalTypeInferenceElementData inTreeData;
 
   SimpleTypeInferrerVisitor.internal(
       AstElement analyzedElement,
@@ -334,7 +343,8 @@
       locals)
       : super(analyzedElement, resolvedAst, inferrer, inferrer.types, compiler,
             locals),
-        this.inferrer = inferrer {
+        this.inferrer = inferrer,
+        this.inTreeData = inferrer._dataOf(analyzedElement) {
     assert(outermostElement != null);
   }
 
@@ -693,10 +703,10 @@
     }
 
     Selector getterSelector = elements.getGetterSelectorInComplexSendSet(node);
-    TypeMask getterMask = elements.getGetterTypeMaskInComplexSendSet(node);
-    TypeMask operatorMask = elements.getOperatorTypeMaskInComplexSendSet(node);
+    TypeMask getterMask = inTreeData.typeOfGetter(node);
+    TypeMask operatorMask = inTreeData.typeOfOperator(node);
     Selector setterSelector = elements.getSelector(node);
-    TypeMask setterMask = elements.getTypeMask(node);
+    TypeMask setterMask = inTreeData.typeOfSend(node);
 
     String op = node.assignmentOperator.source;
     bool isIncrementOrDecrement = op == '++' || op == '--';
@@ -806,12 +816,13 @@
   T handleCompoundIndexSet(
       ast.SendSet node, T receiverType, T indexType, T rhsType) {
     Selector getterSelector = elements.getGetterSelectorInComplexSendSet(node);
-    TypeMask getterMask = elements.getGetterTypeMaskInComplexSendSet(node);
+
+    TypeMask getterMask = inTreeData.typeOfGetter(node);
     Selector operatorSelector =
         elements.getOperatorSelectorInComplexSendSet(node);
-    TypeMask operatorMask = elements.getOperatorTypeMaskInComplexSendSet(node);
+    TypeMask operatorMask = inTreeData.typeOfOperator(node);
     Selector setterSelector = elements.getSelector(node);
-    TypeMask setterMask = elements.getTypeMask(node);
+    TypeMask setterMask = inTreeData.typeOfSend(node);
 
     T getterType = handleDynamicSend(node, getterSelector, getterMask,
         receiverType, new ArgumentsTypes<T>([indexType], null));
@@ -906,9 +917,10 @@
   T _handleSuperCompoundIndexSet(ast.SendSet node, Element getter,
       Element setter, T indexType, T rhsType) {
     Selector getterSelector = elements.getGetterSelectorInComplexSendSet(node);
-    TypeMask getterMask = elements.getGetterTypeMaskInComplexSendSet(node);
+
+    TypeMask getterMask = inTreeData.typeOfGetter(node);
     Selector setterSelector = elements.getSelector(node);
-    TypeMask setterMask = elements.getTypeMask(node);
+    TypeMask setterMask = inTreeData.typeOfSend(node);
 
     T getterType = handleSuperSend(node, getterSelector, getterMask, getter,
         new ArgumentsTypes<T>([indexType], null));
@@ -919,8 +931,7 @@
     } else {
       Selector operatorSelector =
           elements.getOperatorSelectorInComplexSendSet(node);
-      TypeMask operatorMask =
-          elements.getOperatorTypeMaskInComplexSendSet(node);
+      TypeMask operatorMask = inTreeData.typeOfOperator(node);
       returnType = handleDynamicSend(node, operatorSelector, operatorMask,
           getterType, new ArgumentsTypes<T>([rhsType], null));
     }
@@ -1268,9 +1279,9 @@
   T _handleSuperCompound(
       ast.SendSet node, Element getter, Element setter, T rhsType) {
     Selector getterSelector = elements.getGetterSelectorInComplexSendSet(node);
-    TypeMask getterMask = elements.getGetterTypeMaskInComplexSendSet(node);
+    TypeMask getterMask = inTreeData.typeOfGetter(node);
     Selector setterSelector = elements.getSelector(node);
-    TypeMask setterMask = elements.getTypeMask(node);
+    TypeMask setterMask = inTreeData.typeOfSend(node);
 
     T getterType =
         handleSuperSend(node, getterSelector, getterMask, getter, null);
@@ -1281,8 +1292,7 @@
     } else {
       Selector operatorSelector =
           elements.getOperatorSelectorInComplexSendSet(node);
-      TypeMask operatorMask =
-          elements.getOperatorTypeMaskInComplexSendSet(node);
+      TypeMask operatorMask = inTreeData.typeOfOperator(node);
       returnType = handleDynamicSend(node, operatorSelector, operatorMask,
           getterType, new ArgumentsTypes<T>([rhsType], null));
     }
@@ -1295,7 +1305,7 @@
   /// Handle index set, like `foo[0] = 42`.
   T handleIndexSet(ast.SendSet node, T receiverType, T indexType, T rhsType) {
     Selector setterSelector = elements.getSelector(node);
-    TypeMask setterMask = elements.getTypeMask(node);
+    TypeMask setterMask = inTreeData.typeOfSend(node);
     handleDynamicSend(node, setterSelector, setterMask, receiverType,
         new ArgumentsTypes<T>([indexType, rhsType], null));
     return rhsType;
@@ -1316,7 +1326,7 @@
     T indexType = visit(index);
     T rhsType = visit(rhs);
     Selector setterSelector = elements.getSelector(node);
-    TypeMask setterMask = elements.getTypeMask(node);
+    TypeMask setterMask = inTreeData.typeOfSend(node);
     handleStaticSend(node, setterSelector, setterMask, element,
         new ArgumentsTypes<T>([indexType, rhsType], null));
     return rhsType;
@@ -1392,7 +1402,7 @@
     ArgumentsTypes arguments =
         node.isPropertyAccess ? null : analyzeArguments(node.arguments);
     Selector selector = elements.getSelector(node);
-    TypeMask mask = elements.getTypeMask(node);
+    TypeMask mask = inTreeData.typeOfSend(node);
     // TODO(herhut): We could do better here if we knew what we
     // are calling does not expose this.
     // TODO(johnniwinther): Do we still need this when calling directly?
@@ -1419,7 +1429,7 @@
       ast.Send node, Element element, ast.NodeList arguments) {
     ArgumentsTypes argumentTypes = analyzeArguments(arguments.nodes);
     Selector selector = elements.getSelector(node);
-    TypeMask mask = elements.getTypeMask(node);
+    TypeMask mask = inTreeData.typeOfSend(node);
     // TODO(herhut): We could do better here if we knew what we
     // are calling does not expose this.
     isThisExposed = true;
@@ -1441,7 +1451,7 @@
     // are calling does not expose this.
     isThisExposed = true;
     Selector selector = elements.getSelector(node);
-    TypeMask mask = elements.getTypeMask(node);
+    TypeMask mask = inTreeData.typeOfSend(node);
     return handleStaticSend(node, selector, mask, method, arguments);
   }
 
@@ -1451,7 +1461,7 @@
     // are calling does not expose this.
     isThisExposed = true;
     Selector selector = elements.getSelector(node);
-    TypeMask mask = elements.getTypeMask(node);
+    TypeMask mask = inTreeData.typeOfSend(node);
     return handleStaticSend(node, selector, mask, element, null);
   }
 
@@ -1462,7 +1472,7 @@
     // are calling does not expose this.
     isThisExposed = true;
     Selector selector = elements.getSelector(node);
-    TypeMask mask = elements.getTypeMask(node);
+    TypeMask mask = inTreeData.typeOfSend(node);
     return handleStaticSend(
         node, selector, mask, element, new ArgumentsTypes<T>([rhsType], null));
   }
@@ -1674,7 +1684,7 @@
       return handleForeignSend(node, target);
     }
     Selector selector = elements.getSelector(node);
-    TypeMask mask = elements.getTypeMask(node);
+    TypeMask mask = inTreeData.typeOfSend(node);
     // In erroneous code the number of arguments in the selector might not
     // match the function element.
     // TODO(polux): return nonNullEmpty and check it doesn't break anything
@@ -1733,7 +1743,7 @@
   T handleStaticFieldOrGetterInvoke(ast.Send node, Element element) {
     ArgumentsTypes arguments = analyzeArguments(node.arguments);
     Selector selector = elements.getSelector(node);
-    TypeMask mask = elements.getTypeMask(node);
+    TypeMask mask = inTreeData.typeOfSend(node);
     handleStaticSend(node, selector, mask, element, arguments);
     return inferrer.registerCalledClosure(
         node,
@@ -1753,7 +1763,7 @@
     }
     ArgumentsTypes arguments = analyzeArguments(node.arguments);
     Selector selector = elements.getSelector(node);
-    TypeMask mask = elements.getTypeMask(node);
+    TypeMask mask = inTreeData.typeOfSend(node);
     return handleStaticSend(node, selector, mask, function, arguments);
   }
 
@@ -1837,7 +1847,7 @@
   T handleForeignSend(ast.Send node, Element element) {
     ArgumentsTypes arguments = analyzeArguments(node.arguments);
     Selector selector = elements.getSelector(node);
-    TypeMask mask = elements.getTypeMask(node);
+    TypeMask mask = inTreeData.typeOfSend(node);
     String name = element.name;
     handleStaticSend(node, selector, mask, element, arguments);
     if (name == BackendHelpers.JS ||
@@ -1882,21 +1892,21 @@
   /// Read a static or top level field.
   T handleStaticFieldGet(ast.Send node, FieldElement field) {
     Selector selector = elements.getSelector(node);
-    TypeMask mask = elements.getTypeMask(node);
+    TypeMask mask = inTreeData.typeOfSend(node);
     return handleStaticSend(node, selector, mask, field, null);
   }
 
   /// Invoke a static or top level getter.
   T handleStaticGetterGet(ast.Send node, MethodElement getter) {
     Selector selector = elements.getSelector(node);
-    TypeMask mask = elements.getTypeMask(node);
+    TypeMask mask = inTreeData.typeOfSend(node);
     return handleStaticSend(node, selector, mask, getter, null);
   }
 
   /// Closurize a static or top level function.
   T handleStaticFunctionGet(ast.Send node, MethodElement function) {
     Selector selector = elements.getSelector(node);
-    TypeMask mask = elements.getTypeMask(node);
+    TypeMask mask = inTreeData.typeOfSend(node);
     return handleStaticSend(node, selector, mask, function, null);
   }
 
@@ -1980,7 +1990,7 @@
   T handleCallInvoke(ast.Send node, T closure) {
     ArgumentsTypes arguments = analyzeArguments(node.arguments);
     Selector selector = elements.getSelector(node);
-    TypeMask mask = elements.getTypeMask(node);
+    TypeMask mask = inTreeData.typeOfSend(node);
     return inferrer.registerCalledClosure(node, selector, mask, closure,
         outermostElement, arguments, sideEffects, inLoop);
   }
@@ -2014,7 +2024,7 @@
       ast.NodeList arguments, CallStructure callStructure, _) {
     ArgumentsTypes argumentTypes = analyzeArguments(node.arguments);
     Selector selector = elements.getSelector(node);
-    TypeMask mask = elements.getTypeMask(node);
+    TypeMask mask = inTreeData.typeOfSend(node);
     // This only works for function statements. We need a
     // more sophisticated type system with function types to support
     // more.
@@ -2100,7 +2110,7 @@
     }
 
     Selector selector = elements.getSelector(node);
-    TypeMask mask = elements.getTypeMask(node);
+    TypeMask mask = inTreeData.typeOfSend(node);
     if (!isThisExposed && isCallOnThis) {
       checkIfExposesThis(selector, types.newTypedSelector(receiverType, mask));
     }
@@ -2195,7 +2205,7 @@
     ast.Node identifier = node.declaredIdentifier;
     Element element = elements.getForInVariable(node);
     Selector selector = elements.getSelector(identifier);
-    TypeMask mask = elements.getTypeMask(identifier);
+    TypeMask mask = inTreeData.typeOfSend(identifier);
 
     T receiverType;
     if (element != null && element.isInstanceMember) {
@@ -2215,9 +2225,9 @@
     T expressionType = visit(node.expression);
 
     Selector currentSelector = Selectors.current;
-    TypeMask currentMask = elements.getCurrentTypeMask(node);
+    TypeMask currentMask = inTreeData.typeOfIteratorCurrent(node);
     Selector moveNextSelector = Selectors.moveNext;
-    TypeMask moveNextMask = elements.getMoveNextTypeMask(node);
+    TypeMask moveNextMask = inTreeData.typeOfIteratorMoveNext(node);
 
     js.JavaScriptBackend backend = compiler.backend;
     Element ctor = backend.helpers.streamIteratorConstructor;
@@ -2233,11 +2243,11 @@
   T visitSyncForIn(ast.SyncForIn node) {
     T expressionType = visit(node.expression);
     Selector iteratorSelector = Selectors.iterator;
-    TypeMask iteratorMask = elements.getIteratorTypeMask(node);
+    TypeMask iteratorMask = inTreeData.typeOfIterator(node);
     Selector currentSelector = Selectors.current;
-    TypeMask currentMask = elements.getCurrentTypeMask(node);
+    TypeMask currentMask = inTreeData.typeOfIteratorCurrent(node);
     Selector moveNextSelector = Selectors.moveNext;
-    TypeMask moveNextMask = elements.getMoveNextTypeMask(node);
+    TypeMask moveNextMask = inTreeData.typeOfIteratorMoveNext(node);
 
     T iteratorType = handleDynamicSend(node, iteratorSelector, iteratorMask,
         expressionType, new ArgumentsTypes<T>.empty());
diff --git a/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart b/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
index ddca262..7e3bbd6 100644
--- a/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
+++ b/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
@@ -12,6 +12,7 @@
 import '../constants/values.dart';
 import '../dart_types.dart' show DartType, FunctionType, TypeKind;
 import '../elements/elements.dart';
+import '../js_backend/backend.dart';
 import '../tree/dartstring.dart' show DartString;
 import '../tree/tree.dart' as ast show Node, LiteralBool, Send;
 import '../types/masks.dart'
@@ -521,13 +522,13 @@
       return mask;
     }
     if (element.isField) {
-      return _narrowType(compiler, mask, element.type);
+      return _narrowType(compiler.closedWorld, mask, element.type);
     }
     assert(
         element.isFunction || element.isGetter || element.isFactoryConstructor);
 
     FunctionType type = element.type;
-    return _narrowType(compiler, mask, type.returnType);
+    return _narrowType(compiler.closedWorld, mask, type.returnType);
   }
 
   TypeMask computeType(TypeGraphInferrerEngine inferrer) {
@@ -668,7 +669,7 @@
     // ignore type annotations to ensure that the checks are actually inserted
     // into the function body and retained until runtime.
     assert(!compiler.options.enableTypeAssertions);
-    return _narrowType(compiler, mask, element.type);
+    return _narrowType(compiler.closedWorld, mask, element.type);
   }
 
   TypeMask computeType(TypeGraphInferrerEngine inferrer) {
@@ -970,9 +971,10 @@
     inferrer.updateSelectorInTree(caller, call, selector, typeMask);
 
     Compiler compiler = inferrer.compiler;
+    JavaScriptBackend backend = compiler.backend;
     TypeMask maskToUse =
         compiler.closedWorld.extendMaskIfReachesAll(selector, typeMask);
-    bool canReachAll = compiler.enabledInvokeOn && (maskToUse != typeMask);
+    bool canReachAll = backend.hasInvokeOnSupport && (maskToUse != typeMask);
 
     // If this call could potentially reach all methods that satisfy
     // the untyped selector (through noSuchMethod's `Invocation`
@@ -1724,24 +1726,24 @@
   T visitAwaitTypeInformation(AwaitTypeInformation info);
 }
 
-TypeMask _narrowType(Compiler compiler, TypeMask type, DartType annotation,
+TypeMask _narrowType(
+    ClosedWorld closedWorld, TypeMask type, DartType annotation,
     {bool isNullable: true}) {
   if (annotation.treatAsDynamic) return type;
   if (annotation.isObject) return type;
   TypeMask otherType;
   if (annotation.isTypedef || annotation.isFunctionType) {
-    otherType = compiler.commonMasks.functionType;
+    otherType = closedWorld.commonMasks.functionType;
   } else if (annotation.isTypeVariable) {
     // TODO(ngeoffray): Narrow to bound.
     return type;
   } else if (annotation.isVoid) {
-    otherType = compiler.commonMasks.nullType;
+    otherType = closedWorld.commonMasks.nullType;
   } else {
     assert(annotation.isInterfaceType);
-    otherType =
-        new TypeMask.nonNullSubtype(annotation.element, compiler.closedWorld);
+    otherType = new TypeMask.nonNullSubtype(annotation.element, closedWorld);
   }
   if (isNullable) otherType = otherType.nullable();
   if (type == null) return otherType;
-  return type.intersection(otherType, compiler.closedWorld);
+  return type.intersection(otherType, closedWorld);
 }
diff --git a/pkg/compiler/lib/src/js_backend/backend.dart b/pkg/compiler/lib/src/js_backend/backend.dart
index 48f7139..56e8e89 100644
--- a/pkg/compiler/lib/src/js_backend/backend.dart
+++ b/pkg/compiler/lib/src/js_backend/backend.dart
@@ -74,6 +74,7 @@
 import 'js_interop_analysis.dart' show JsInteropAnalysis;
 import '../kernel/task.dart';
 import 'lookup_map_analysis.dart' show LookupMapAnalysis;
+import 'mirrors_analysis.dart';
 import 'namer.dart';
 import 'native_data.dart' show NativeData;
 import 'no_such_method_registry.dart';
@@ -336,18 +337,19 @@
       TRACE_METHOD == 'post' || TRACE_METHOD == 'console';
   MethodElement traceHelper;
 
-  TypeMask get stringType => compiler.commonMasks.stringType;
-  TypeMask get doubleType => compiler.commonMasks.doubleType;
-  TypeMask get intType => compiler.commonMasks.intType;
-  TypeMask get uint32Type => compiler.commonMasks.uint32Type;
-  TypeMask get uint31Type => compiler.commonMasks.uint31Type;
-  TypeMask get positiveIntType => compiler.commonMasks.positiveIntType;
-  TypeMask get numType => compiler.commonMasks.numType;
-  TypeMask get boolType => compiler.commonMasks.boolType;
-  TypeMask get dynamicType => compiler.commonMasks.dynamicType;
-  TypeMask get nullType => compiler.commonMasks.nullType;
+  TypeMask get stringType => compiler.closedWorld.commonMasks.stringType;
+  TypeMask get doubleType => compiler.closedWorld.commonMasks.doubleType;
+  TypeMask get intType => compiler.closedWorld.commonMasks.intType;
+  TypeMask get uint32Type => compiler.closedWorld.commonMasks.uint32Type;
+  TypeMask get uint31Type => compiler.closedWorld.commonMasks.uint31Type;
+  TypeMask get positiveIntType =>
+      compiler.closedWorld.commonMasks.positiveIntType;
+  TypeMask get numType => compiler.closedWorld.commonMasks.numType;
+  TypeMask get boolType => compiler.closedWorld.commonMasks.boolType;
+  TypeMask get dynamicType => compiler.closedWorld.commonMasks.dynamicType;
+  TypeMask get nullType => compiler.closedWorld.commonMasks.nullType;
   TypeMask get emptyType => const TypeMask.nonNullEmpty();
-  TypeMask get nonNullType => compiler.commonMasks.nonNullType;
+  TypeMask get nonNullType => compiler.closedWorld.commonMasks.nonNullType;
 
   TypeMask _indexablePrimitiveTypeCache;
   TypeMask get indexablePrimitiveType {
@@ -518,6 +520,9 @@
   /// True when we enqueue the loadLibrary code.
   bool isLoadLibraryFunctionResolved = false;
 
+  /// `true` if access to [BackendHelpers.invokeOnMethod] is supported.
+  bool hasInvokeOnSupport = false;
+
   /// List of constants from metadata.  If metadata must be preserved,
   /// these constants must be registered.
   final List<Dependency> metadataConstants = <Dependency>[];
@@ -572,6 +577,9 @@
   /// Support for classifying `noSuchMethod` implementations.
   NoSuchMethodRegistry noSuchMethodRegistry;
 
+  /// Resolution and codegen support for computing reflectable elements.
+  MirrorsAnalysis mirrorsAnalysis;
+
   /// Builds kernel representation for the program.
   KernelTask kernelTask;
 
@@ -628,6 +636,7 @@
     customElementsAnalysis = new CustomElementsAnalysis(this);
     lookupMapAnalysis = new LookupMapAnalysis(this, reporter);
     jsInteropAnalysis = new JsInteropAnalysis(this);
+    mirrorsAnalysis = new MirrorsAnalysis(this, compiler.resolution);
 
     noSuchMethodRegistry = new NoSuchMethodRegistry(this);
     kernelTask = new KernelTask(compiler);
@@ -1053,7 +1062,7 @@
     }
   }
 
-  void addInterceptors(ClassElement cls, Enqueuer enqueuer, Registry registry) {
+  void addInterceptors(ClassElement cls, Enqueuer enqueuer) {
     if (enqueuer.isResolutionQueue) {
       _interceptedClasses.add(helpers.jsInterceptorClass);
       _interceptedClasses.add(cls);
@@ -1066,7 +1075,7 @@
         set.add(member);
       }, includeSuperAndInjectedMembers: true);
     }
-    enqueueClass(enqueuer, cls, registry);
+    enqueueClass(enqueuer, cls);
   }
 
   Set<ClassElement> get interceptedClasses {
@@ -1159,20 +1168,17 @@
     }
   }
 
-  void registerInstantiatedClass(
-      ClassElement cls, Enqueuer enqueuer, Registry registry) {
-    _processClass(cls, enqueuer, registry);
+  void registerInstantiatedClass(ClassElement cls, Enqueuer enqueuer) {
+    _processClass(cls, enqueuer);
   }
 
-  void registerImplementedClass(
-      ClassElement cls, Enqueuer enqueuer, Registry registry) {
-    _processClass(cls, enqueuer, registry);
+  void registerImplementedClass(ClassElement cls, Enqueuer enqueuer) {
+    _processClass(cls, enqueuer);
   }
 
-  void _processClass(ClassElement cls, Enqueuer enqueuer, Registry registry) {
+  void _processClass(ClassElement cls, Enqueuer enqueuer) {
     if (!cls.typeVariables.isEmpty) {
-      typeVariableHandler.registerClassWithTypeVariables(
-          cls, enqueuer, registry);
+      typeVariableHandler.registerClassWithTypeVariables(cls, enqueuer);
     }
 
     // Register any helper that will be needed by the backend.
@@ -1182,33 +1188,32 @@
           cls == coreClasses.numClass) {
         // The backend will try to optimize number operations and use the
         // `iae` helper directly.
-        enqueue(enqueuer, helpers.throwIllegalArgumentException, registry);
+        enqueue(enqueuer, helpers.throwIllegalArgumentException);
       } else if (cls == coreClasses.listClass ||
           cls == coreClasses.stringClass) {
         // The backend will try to optimize array and string access and use the
         // `ioore` and `iae` helpers directly.
-        enqueue(enqueuer, helpers.throwIndexOutOfRangeException, registry);
-        enqueue(enqueuer, helpers.throwIllegalArgumentException, registry);
+        enqueue(enqueuer, helpers.throwIndexOutOfRangeException);
+        enqueue(enqueuer, helpers.throwIllegalArgumentException);
       } else if (cls == coreClasses.functionClass) {
-        enqueueClass(enqueuer, helpers.closureClass, registry);
+        enqueueClass(enqueuer, helpers.closureClass);
       } else if (cls == coreClasses.mapClass) {
         // The backend will use a literal list to initialize the entries
         // of the map.
-        enqueueClass(enqueuer, coreClasses.listClass, registry);
-        enqueueClass(enqueuer, helpers.mapLiteralClass, registry);
+        enqueueClass(enqueuer, coreClasses.listClass);
+        enqueueClass(enqueuer, helpers.mapLiteralClass);
         // For map literals, the dependency between the implementation class
         // and [Map] is not visible, so we have to add it manually.
         rti.registerRtiDependency(helpers.mapLiteralClass, cls);
       } else if (cls == helpers.boundClosureClass) {
         // TODO(johnniwinther): Is this a noop?
-        enqueueClass(enqueuer, helpers.boundClosureClass, registry);
+        enqueueClass(enqueuer, helpers.boundClosureClass);
       } else if (isNativeOrExtendsNative(cls)) {
-        enqueue(enqueuer, helpers.getNativeInterceptorMethod, registry);
-        enqueueClass(
-            enqueuer, helpers.jsInterceptorClass, compiler.globalDependencies);
-        enqueueClass(enqueuer, helpers.jsJavaScriptObjectClass, registry);
-        enqueueClass(enqueuer, helpers.jsPlainJavaScriptObjectClass, registry);
-        enqueueClass(enqueuer, helpers.jsJavaScriptFunctionClass, registry);
+        enqueue(enqueuer, helpers.getNativeInterceptorMethod);
+        enqueueClass(enqueuer, helpers.jsInterceptorClass);
+        enqueueClass(enqueuer, helpers.jsJavaScriptObjectClass);
+        enqueueClass(enqueuer, helpers.jsPlainJavaScriptObjectClass);
+        enqueueClass(enqueuer, helpers.jsJavaScriptFunctionClass);
       } else if (cls == helpers.mapLiteralClass) {
         // For map literals, the dependency between the implementation class
         // and [Map] is not visible, so we have to add it manually.
@@ -1245,70 +1250,71 @@
 
         helpers.mapLiteralConstructor = getFactory('_literal', 1);
         helpers.mapLiteralConstructorEmpty = getFactory('_empty', 0);
-        enqueueInResolution(helpers.mapLiteralConstructor, registry);
-        enqueueInResolution(helpers.mapLiteralConstructorEmpty, registry);
+        enqueue(enqueuer, helpers.mapLiteralConstructor);
+        enqueue(enqueuer, helpers.mapLiteralConstructorEmpty);
 
         helpers.mapLiteralUntypedMaker = getMember('_makeLiteral');
         helpers.mapLiteralUntypedEmptyMaker = getMember('_makeEmpty');
-        enqueueInResolution(helpers.mapLiteralUntypedMaker, registry);
-        enqueueInResolution(helpers.mapLiteralUntypedEmptyMaker, registry);
+        enqueue(enqueuer, helpers.mapLiteralUntypedMaker);
+        enqueue(enqueuer, helpers.mapLiteralUntypedEmptyMaker);
       }
     }
     if (cls == helpers.closureClass) {
-      enqueue(enqueuer, helpers.closureFromTearOff, registry);
+      enqueue(enqueuer, helpers.closureFromTearOff);
     }
     if (cls == coreClasses.stringClass || cls == helpers.jsStringClass) {
-      addInterceptors(helpers.jsStringClass, enqueuer, registry);
+      addInterceptors(helpers.jsStringClass, enqueuer);
     } else if (cls == coreClasses.listClass ||
         cls == helpers.jsArrayClass ||
         cls == helpers.jsFixedArrayClass ||
         cls == helpers.jsExtendableArrayClass ||
         cls == helpers.jsUnmodifiableArrayClass) {
-      addInterceptors(helpers.jsArrayClass, enqueuer, registry);
-      addInterceptors(helpers.jsMutableArrayClass, enqueuer, registry);
-      addInterceptors(helpers.jsFixedArrayClass, enqueuer, registry);
-      addInterceptors(helpers.jsExtendableArrayClass, enqueuer, registry);
-      addInterceptors(helpers.jsUnmodifiableArrayClass, enqueuer, registry);
-      // Literal lists can be translated into calls to these functions:
-      enqueueInResolution(helpers.jsArrayTypedConstructor, registry);
-      enqueueInResolution(helpers.setRuntimeTypeInfo, registry);
-      enqueueInResolution(helpers.getTypeArgumentByIndex, registry);
+      addInterceptors(helpers.jsArrayClass, enqueuer);
+      addInterceptors(helpers.jsMutableArrayClass, enqueuer);
+      addInterceptors(helpers.jsFixedArrayClass, enqueuer);
+      addInterceptors(helpers.jsExtendableArrayClass, enqueuer);
+      addInterceptors(helpers.jsUnmodifiableArrayClass, enqueuer);
+      if (enqueuer.isResolutionQueue) {
+        // Literal lists can be translated into calls to these functions:
+        enqueue(enqueuer, helpers.jsArrayTypedConstructor);
+        enqueue(enqueuer, helpers.setRuntimeTypeInfo);
+        enqueue(enqueuer, helpers.getTypeArgumentByIndex);
+      }
     } else if (cls == coreClasses.intClass || cls == helpers.jsIntClass) {
-      addInterceptors(helpers.jsIntClass, enqueuer, registry);
-      addInterceptors(helpers.jsPositiveIntClass, enqueuer, registry);
-      addInterceptors(helpers.jsUInt32Class, enqueuer, registry);
-      addInterceptors(helpers.jsUInt31Class, enqueuer, registry);
-      addInterceptors(helpers.jsNumberClass, enqueuer, registry);
+      addInterceptors(helpers.jsIntClass, enqueuer);
+      addInterceptors(helpers.jsPositiveIntClass, enqueuer);
+      addInterceptors(helpers.jsUInt32Class, enqueuer);
+      addInterceptors(helpers.jsUInt31Class, enqueuer);
+      addInterceptors(helpers.jsNumberClass, enqueuer);
     } else if (cls == coreClasses.doubleClass || cls == helpers.jsDoubleClass) {
-      addInterceptors(helpers.jsDoubleClass, enqueuer, registry);
-      addInterceptors(helpers.jsNumberClass, enqueuer, registry);
+      addInterceptors(helpers.jsDoubleClass, enqueuer);
+      addInterceptors(helpers.jsNumberClass, enqueuer);
     } else if (cls == coreClasses.boolClass || cls == helpers.jsBoolClass) {
-      addInterceptors(helpers.jsBoolClass, enqueuer, registry);
+      addInterceptors(helpers.jsBoolClass, enqueuer);
     } else if (cls == coreClasses.nullClass || cls == helpers.jsNullClass) {
-      addInterceptors(helpers.jsNullClass, enqueuer, registry);
+      addInterceptors(helpers.jsNullClass, enqueuer);
     } else if (cls == coreClasses.numClass || cls == helpers.jsNumberClass) {
-      addInterceptors(helpers.jsIntClass, enqueuer, registry);
-      addInterceptors(helpers.jsPositiveIntClass, enqueuer, registry);
-      addInterceptors(helpers.jsUInt32Class, enqueuer, registry);
-      addInterceptors(helpers.jsUInt31Class, enqueuer, registry);
-      addInterceptors(helpers.jsDoubleClass, enqueuer, registry);
-      addInterceptors(helpers.jsNumberClass, enqueuer, registry);
+      addInterceptors(helpers.jsIntClass, enqueuer);
+      addInterceptors(helpers.jsPositiveIntClass, enqueuer);
+      addInterceptors(helpers.jsUInt32Class, enqueuer);
+      addInterceptors(helpers.jsUInt31Class, enqueuer);
+      addInterceptors(helpers.jsDoubleClass, enqueuer);
+      addInterceptors(helpers.jsNumberClass, enqueuer);
     } else if (cls == helpers.jsJavaScriptObjectClass) {
-      addInterceptors(helpers.jsJavaScriptObjectClass, enqueuer, registry);
+      addInterceptors(helpers.jsJavaScriptObjectClass, enqueuer);
     } else if (cls == helpers.jsPlainJavaScriptObjectClass) {
-      addInterceptors(helpers.jsPlainJavaScriptObjectClass, enqueuer, registry);
+      addInterceptors(helpers.jsPlainJavaScriptObjectClass, enqueuer);
     } else if (cls == helpers.jsUnknownJavaScriptObjectClass) {
-      addInterceptors(
-          helpers.jsUnknownJavaScriptObjectClass, enqueuer, registry);
+      addInterceptors(helpers.jsUnknownJavaScriptObjectClass, enqueuer);
     } else if (cls == helpers.jsJavaScriptFunctionClass) {
-      addInterceptors(helpers.jsJavaScriptFunctionClass, enqueuer, registry);
+      addInterceptors(helpers.jsJavaScriptFunctionClass, enqueuer);
     } else if (isNativeOrExtendsNative(cls)) {
       addInterceptorsForNativeClassMembers(cls, enqueuer);
     } else if (cls == helpers.jsIndexingBehaviorInterface) {
       // These two helpers are used by the emitter and the codegen.
       // Because we cannot enqueue elements at the time of emission,
       // we make sure they are always generated.
-      enqueue(enqueuer, helpers.isJsIndexable, registry);
+      enqueue(enqueuer, helpers.isJsIndexable);
     }
 
     customElementsAnalysis.registerInstantiatedClass(cls,
@@ -1318,27 +1324,23 @@
     }
   }
 
-  void registerInstantiatedType(
-      InterfaceType type, Enqueuer enqueuer, Registry registry,
-      {bool mirrorUsage: false}) {
+  void registerInstantiatedType(InterfaceType type) {
     lookupMapAnalysis.registerInstantiatedType(type);
-    super.registerInstantiatedType(type, enqueuer, registry,
-        mirrorUsage: mirrorUsage);
   }
 
-  void enqueueHelpers(ResolutionEnqueuer world, Registry registry) {
+  void enqueueHelpers(ResolutionEnqueuer enqueuer) {
     assert(helpers.interceptorsLibrary != null);
     // TODO(ngeoffray): Not enqueuing those two classes currently make
     // the compiler potentially crash. However, any reasonable program
     // will instantiate those two classes.
-    addInterceptors(helpers.jsBoolClass, world, registry);
-    addInterceptors(helpers.jsNullClass, world, registry);
+    addInterceptors(helpers.jsBoolClass, enqueuer);
+    addInterceptors(helpers.jsNullClass, enqueuer);
     if (compiler.options.enableTypeAssertions) {
       // Unconditionally register the helper that checks if the
       // expression in an if/while/for is a boolean.
       // TODO(ngeoffray): Should we have the resolver register those instead?
       Element e = helpers.boolConversionCheck;
-      if (e != null) enqueue(world, e, registry);
+      if (e != null) enqueue(enqueuer, e);
     }
 
     if (TRACE_CALLS) {
@@ -1346,10 +1348,10 @@
           ? helpers.consoleTraceHelper
           : helpers.postTraceHelper;
       assert(traceHelper != null);
-      enqueueInResolution(traceHelper, registry);
+      enqueue(enqueuer, traceHelper);
     }
-    enqueueInResolution(helpers.assertUnreachableMethod, registry);
-    registerCheckedModeHelpers(registry);
+    enqueue(enqueuer, helpers.assertUnreachableMethod);
+    registerCheckedModeHelpers(enqueuer);
   }
 
   onResolutionComplete() {
@@ -1364,53 +1366,47 @@
     noSuchMethodRegistry.onTypeInferenceComplete();
   }
 
-  void registerGetRuntimeTypeArgument(Registry registry) {
-    enqueueImpact(
-        compiler.enqueuer.resolution, impacts.getRuntimeTypeArgument, registry);
+  void registerGetRuntimeTypeArgument() {
+    enqueueImpact(compiler.enqueuer.resolution, impacts.getRuntimeTypeArgument);
   }
 
   void registerCallMethodWithFreeTypeVariables(
-      Element callMethod, Enqueuer enqueuer, Registry registry) {
+      Element callMethod, Enqueuer enqueuer) {
     if (enqueuer.isResolutionQueue || methodNeedsRti(callMethod)) {
-      registerComputeSignature(enqueuer, registry);
+      registerComputeSignature(enqueuer);
     }
   }
 
   void registerClosureWithFreeTypeVariables(
-      Element closure, Enqueuer enqueuer, Registry registry) {
+      Element closure, Enqueuer enqueuer) {
     if (enqueuer.isResolutionQueue || methodNeedsRti(closure)) {
-      registerComputeSignature(enqueuer, registry);
+      registerComputeSignature(enqueuer);
     }
   }
 
   void registerBoundClosure(Enqueuer enqueuer) {
     helpers.boundClosureClass.ensureResolved(resolution);
-    registerInstantiatedType(
-        helpers.boundClosureClass.rawType,
-        enqueuer,
-        // Precise dependency is not important here.
-        compiler.globalDependencies);
+    enqueuer.registerInstantiatedType(helpers.boundClosureClass.rawType);
   }
 
   void registerGetOfStaticFunction(Enqueuer enqueuer) {
     helpers.closureClass.ensureResolved(resolution);
-    registerInstantiatedType(
-        helpers.closureClass.rawType, enqueuer, compiler.globalDependencies);
+    enqueuer.registerInstantiatedType(helpers.closureClass.rawType);
   }
 
-  void registerComputeSignature(Enqueuer enqueuer, Registry registry) {
+  void registerComputeSignature(Enqueuer enqueuer) {
     // Calls to [:computeSignature:] are generated by the emitter and we
     // therefore need to enqueue the used elements in the codegen enqueuer as
     // well as in the resolution enqueuer.
-    enqueueImpact(enqueuer, impacts.computeSignature, registry);
+    enqueueImpact(enqueuer, impacts.computeSignature);
   }
 
-  void registerRuntimeType(Enqueuer enqueuer, Registry registry) {
-    registerComputeSignature(enqueuer, registry);
-    enqueueInResolution(helpers.setRuntimeTypeInfo, registry);
-    registerGetRuntimeTypeArgument(registry);
-    enqueueInResolution(helpers.getRuntimeTypeInfo, registry);
-    enqueueClass(enqueuer, coreClasses.listClass, registry);
+  void registerRuntimeType(ResolutionEnqueuer enqueuer) {
+    registerComputeSignature(enqueuer);
+    enqueue(enqueuer, helpers.setRuntimeTypeInfo);
+    registerGetRuntimeTypeArgument();
+    enqueue(enqueuer, helpers.getRuntimeTypeInfo);
+    enqueueClass(enqueuer, coreClasses.listClass);
   }
 
   void registerTypeVariableBoundsSubtypeCheck(
@@ -1418,11 +1414,10 @@
     rti.registerTypeVariableBoundsSubtypeCheck(typeArgument, bound);
   }
 
-  void registerCheckDeferredIsLoaded(Registry registry) {
-    enqueueInResolution(helpers.checkDeferredIsLoaded, registry);
+  void registerCheckDeferredIsLoaded(ResolutionEnqueuer enqueuer) {
+    enqueue(enqueuer, helpers.checkDeferredIsLoaded);
     // Also register the types of the arguments passed to this method.
-    enqueueClass(
-        compiler.enqueuer.resolution, coreClasses.stringClass, registry);
+    enqueueClass(enqueuer, coreClasses.stringClass);
   }
 
   void registerNoSuchMethod(FunctionElement noSuchMethod) {
@@ -1464,7 +1459,7 @@
   }
 
   void enableNoSuchMethod(Enqueuer world) {
-    enqueue(world, helpers.createInvocationMirror, compiler.globalDependencies);
+    enqueue(world, helpers.createInvocationMirror);
     world.registerDynamicUse(new DynamicUse(Selectors.noSuchMethod_, null));
   }
 
@@ -1498,13 +1493,13 @@
   }
 
   bool classNeedsRti(ClassElement cls) {
-    if (compiler.enabledRuntimeType) return true;
+    if (compiler.resolverWorld.hasRuntimeTypeSupport) return true;
     return rti.classesNeedingRti.contains(cls.declaration);
   }
 
   bool classNeedsRtiField(ClassElement cls) {
     if (cls.rawType.typeArguments.isEmpty) return false;
-    if (compiler.enabledRuntimeType) return true;
+    if (compiler.resolverWorld.hasRuntimeTypeSupport) return true;
     return rti.classesNeedingRti.contains(cls.declaration);
   }
 
@@ -1521,32 +1516,23 @@
 
   bool methodNeedsRti(FunctionElement function) {
     return rti.methodsNeedingRti.contains(function) ||
-        compiler.enabledRuntimeType;
+        compiler.resolverWorld.hasRuntimeTypeSupport;
   }
 
   /// Enqueue [e] in [enqueuer].
   ///
   /// This method calls [registerBackendUse].
-  void enqueue(Enqueuer enqueuer, Element e, Registry registry) {
+  void enqueue(Enqueuer enqueuer, Element e) {
     if (e == null) return;
     registerBackendUse(e);
     enqueuer.addToWorkList(e);
-    registry.registerDependency(e);
-  }
-
-  /// Enqueue [e] in the resolution enqueuer.
-  ///
-  /// This method calls [registerBackendUse].
-  void enqueueInResolution(Element e, Registry registry) {
-    if (e == null) return;
-    ResolutionEnqueuer enqueuer = compiler.enqueuer.resolution;
-    enqueue(enqueuer, e, registry);
+    compiler.globalDependencies.registerDependency(e);
   }
 
   /// Register instantiation of [cls] in [enqueuer].
   ///
   /// This method calls [registerBackendUse].
-  void enqueueClass(Enqueuer enqueuer, ClassElement cls, Registry registry) {
+  void enqueueClass(Enqueuer enqueuer, ClassElement cls) {
     if (cls == null) return;
     registerBackendUse(cls);
     helpersUsed.add(cls.declaration);
@@ -1554,13 +1540,13 @@
       helpersUsed.add(cls.implementation);
     }
     cls.ensureResolved(resolution);
-    registerInstantiatedType(cls.rawType, enqueuer, registry);
+    enqueuer.registerInstantiatedType(cls.rawType);
   }
 
   /// Register instantiation of [type] in [enqueuer].
   ///
   /// This method calls [registerBackendUse].
-  void enqueueType(Enqueuer enqueuer, InterfaceType type, Registry registry) {
+  void enqueueType(Enqueuer enqueuer, InterfaceType type) {
     if (type == null) return;
     ClassElement cls = type.element;
     registerBackendUse(cls);
@@ -1569,29 +1555,29 @@
       helpersUsed.add(cls.implementation);
     }
     cls.ensureResolved(resolution);
-    registerInstantiatedType(type, enqueuer, registry);
+    enqueuer.registerInstantiatedType(type);
   }
 
-  void enqueueImpact(
-      Enqueuer enqueuer, BackendImpact impact, Registry registry) {
+  void enqueueImpact(Enqueuer enqueuer, BackendImpact impact) {
     for (Element staticUse in impact.staticUses) {
-      enqueue(enqueuer, staticUse, registry);
+      enqueue(enqueuer, staticUse);
     }
     for (InterfaceType type in impact.instantiatedTypes) {
-      enqueueType(enqueuer, type, registry);
+      enqueueType(enqueuer, type);
     }
     for (ClassElement cls in impact.instantiatedClasses) {
-      enqueueClass(enqueuer, cls, registry);
+      enqueueClass(enqueuer, cls);
     }
     for (BackendImpact otherImpact in impact.otherImpacts) {
-      enqueueImpact(enqueuer, otherImpact, registry);
+      enqueueImpact(enqueuer, otherImpact);
     }
   }
 
   CodegenEnqueuer get codegenEnqueuer => compiler.enqueuer.codegen;
 
-  CodegenEnqueuer createCodegenEnqueuer(Compiler compiler) {
-    return new CodegenEnqueuer(compiler, const TreeShakingEnqueuerStrategy());
+  CodegenEnqueuer createCodegenEnqueuer(CompilerTask task, Compiler compiler) {
+    return new CodegenEnqueuer(
+        task, compiler, const TreeShakingEnqueuerStrategy());
   }
 
   WorldImpact codegen(CodegenWorkItem work) {
@@ -1665,12 +1651,12 @@
     return worldImpact;
   }
 
-  native.NativeEnqueuer nativeResolutionEnqueuer(Enqueuer world) {
-    return new native.NativeResolutionEnqueuer(world, compiler);
+  native.NativeEnqueuer nativeResolutionEnqueuer() {
+    return new native.NativeResolutionEnqueuer(compiler);
   }
 
-  native.NativeEnqueuer nativeCodegenEnqueuer(Enqueuer world) {
-    return new native.NativeCodegenEnqueuer(world, compiler, emitter);
+  native.NativeEnqueuer nativeCodegenEnqueuer() {
+    return new native.NativeCodegenEnqueuer(compiler, emitter);
   }
 
   ClassElement defaultSuperclass(ClassElement element) {
@@ -1870,11 +1856,11 @@
     }
   }
 
-  void registerCheckedModeHelpers(Registry registry) {
+  void registerCheckedModeHelpers(ResolutionEnqueuer enqueuer) {
     // We register all the helpers in the resolution queue.
     // TODO(13155): Find a way to register fewer helpers.
     for (CheckedModeHelper helper in checkedModeHelpers) {
-      enqueueInResolution(helper.getStaticUse(compiler).element, registry);
+      enqueue(enqueuer, helper.getStaticUse(compiler).element);
     }
   }
 
@@ -1906,7 +1892,7 @@
     return compiler.closedWorld.hasOnlySubclasses(classElement);
   }
 
-  void registerStaticUse(Element element, {bool forResolution}) {
+  void registerStaticUse(Enqueuer enqueuer, Element element) {
     if (element == helpers.disableTreeShakingMarker) {
       isTreeShakingDisabled = true;
     } else if (element == helpers.preserveNamesMarker) {
@@ -1923,14 +1909,15 @@
       // TODO(sigurdm): Create a function registerLoadLibraryAccess.
       if (!isLoadLibraryFunctionResolved) {
         isLoadLibraryFunctionResolved = true;
-        enqueueInResolution(
-            helpers.loadLibraryWrapper, compiler.globalDependencies);
+        if (enqueuer.isResolutionQueue) {
+          enqueue(enqueuer, helpers.loadLibraryWrapper);
+        }
       }
     } else if (element == helpers.requiresPreambleMarker) {
       requiresPreamble = true;
     }
     customElementsAnalysis.registerStaticUse(element,
-        forResolution: forResolution);
+        forResolution: enqueuer.isResolutionQueue);
   }
 
   /// Called when [:const Symbol(name):] is seen.
@@ -2360,11 +2347,13 @@
     //
     // Return early if any elements are added to avoid counting the elements as
     // due to mirrors.
-    enqueuer.applyImpact(customElementsAnalysis.flush(
-        forResolution: enqueuer.isResolutionQueue));
     enqueuer.applyImpact(
+        compiler.impactStrategy,
+        customElementsAnalysis.flush(
+            forResolution: enqueuer.isResolutionQueue));
+    enqueuer.applyImpact(compiler.impactStrategy,
         lookupMapAnalysis.flush(forResolution: enqueuer.isResolutionQueue));
-    enqueuer.applyImpact(
+    enqueuer.applyImpact(compiler.impactStrategy,
         typeVariableHandler.flush(forResolution: enqueuer.isResolutionQueue));
 
     if (!enqueuer.queueIsEmpty) return false;
@@ -2395,12 +2384,14 @@
     }
 
     if (isTreeShakingDisabled) {
-      enqueuer.enqueueReflectiveElements(recentClasses);
+      mirrorsAnalysis.enqueueReflectiveElements(
+          enqueuer, recentClasses, compiler.libraryLoader.libraries);
     } else if (!targetsUsed.isEmpty && enqueuer.isResolutionQueue) {
       // Add all static elements (not classes) that have been requested for
       // reflection. If there is no mirror-usage these are probably not
       // necessary, but the backend relies on them being resolved.
-      enqueuer.enqueueReflectiveStaticFields(_findStaticFieldTargets());
+      mirrorsAnalysis.enqueueReflectiveStaticFields(
+          enqueuer, _findStaticFieldTargets());
     }
 
     if (mustPreserveNames) reporter.log('Preserving names.');
@@ -2436,7 +2427,7 @@
         }
         metadataConstants.clear();
       }
-      enqueuer.applyImpact(impactBuilder.flush());
+      enqueuer.applyImpact(compiler.impactStrategy, impactBuilder.flush());
     }
     return true;
   }
@@ -2561,7 +2552,7 @@
           "@NoSideEffects() should always be combined with @NoInline.");
     }
     if (element == helpers.invokeOnMethod) {
-      compiler.enabledInvokeOn = true;
+      hasInvokeOnSupport = true;
     }
   }
 
@@ -2607,8 +2598,9 @@
   }
 
   @override
-  bool enableDeferredLoadingIfSupported(Spannable node, Registry registry) {
-    registerCheckDeferredIsLoaded(registry);
+  bool enableDeferredLoadingIfSupported(
+      ResolutionEnqueuer enqueuer, Spannable node) {
+    registerCheckDeferredIsLoaded(enqueuer);
     return true;
   }
 
@@ -2792,13 +2784,9 @@
 
   BackendImpacts get impacts => backend.impacts;
 
-  // TODO(johnniwinther): Avoid this dependency.
-  ResolutionEnqueuer get resolutionEnqueuer {
-    return backend.compiler.enqueuer.resolution;
-  }
-
   @override
-  WorldImpact transformResolutionImpact(ResolutionImpact worldImpact) {
+  WorldImpact transformResolutionImpact(
+      ResolutionEnqueuer enqueuer, ResolutionImpact worldImpact) {
     TransformedWorldImpact transformed =
         new TransformedWorldImpact(worldImpact);
     for (Feature feature in worldImpact.features) {
@@ -2885,6 +2873,8 @@
       DartType type = typeUse.type;
       switch (typeUse.kind) {
         case TypeUseKind.INSTANTIATION:
+        case TypeUseKind.MIRROR_INSTANTIATION:
+        case TypeUseKind.NATIVE_INSTANTIATION:
           registerRequiredType(type);
           break;
         case TypeUseKind.IS_CHECK:
@@ -2965,8 +2955,6 @@
           registerBackendImpact(transformed, impacts.closure);
           LocalFunctionElement closure = staticUse.element;
           if (closure.type.containsTypeVariables) {
-            resolutionEnqueuer.universe.closuresWithFreeTypeVariables
-                .add(closure);
             registerBackendImpact(transformed, impacts.computeSignature);
           }
           break;
@@ -3002,8 +2990,8 @@
     }
 
     for (native.NativeBehavior behavior in worldImpact.nativeData) {
-      resolutionEnqueuer.nativeEnqueuer
-          .registerNativeBehavior(behavior, worldImpact);
+      enqueuer.nativeEnqueuer
+          .registerNativeBehavior(transformed, behavior, worldImpact);
     }
 
     return transformed;
@@ -3103,8 +3091,8 @@
     // need to register checked mode helpers.
     if (inCheckedMode) {
       // All helpers are added to resolution queue in enqueueHelpers. These
-      // calls to enqueueInResolution serve as assertions that the helper was
-      // in fact added.
+      // calls to [enqueue] with the resolution enqueuer serve as assertions
+      // that the helper was in fact added.
       // TODO(13155): Find a way to enqueue helpers lazily.
       CheckedModeHelper helper =
           backend.getCheckedModeHelper(type, typeCast: false);
diff --git a/pkg/compiler/lib/src/js_backend/enqueuer.dart b/pkg/compiler/lib/src/js_backend/enqueuer.dart
index a9736b8..c169537 100644
--- a/pkg/compiler/lib/src/js_backend/enqueuer.dart
+++ b/pkg/compiler/lib/src/js_backend/enqueuer.dart
@@ -10,6 +10,7 @@
 import '../common/codegen.dart' show CodegenWorkItem;
 import '../common/registry.dart' show Registry;
 import '../common/names.dart' show Identifiers;
+import '../common/tasks.dart' show CompilerTask;
 import '../common/work.dart' show WorkItem;
 import '../common.dart';
 import '../compiler.dart' show Compiler;
@@ -39,7 +40,7 @@
 import '../universe/use.dart'
     show DynamicUse, StaticUse, StaticUseKind, TypeUse, TypeUseKind;
 import '../universe/world_impact.dart'
-    show ImpactUseCase, WorldImpact, WorldImpactVisitor;
+    show ImpactUseCase, ImpactStrategy, WorldImpact, WorldImpactVisitor;
 import '../util/util.dart' show Setlet;
 import '../world.dart';
 
@@ -58,22 +59,17 @@
   final CodegenWorldBuilderImpl _universe =
       new CodegenWorldBuilderImpl(const TypeMaskStrategy());
 
-  static final TRACE_MIRROR_ENQUEUING =
-      const bool.fromEnvironment("TRACE_MIRROR_ENQUEUING");
-
   bool queueIsClosed = false;
-  EnqueueTask task;
-  native.NativeEnqueuer nativeEnqueuer; // Set by EnqueueTask
-
-  bool hasEnqueuedReflectiveElements = false;
-  bool hasEnqueuedReflectiveStaticFields = false;
+  final CompilerTask task;
+  final native.NativeEnqueuer nativeEnqueuer;
 
   WorldImpactVisitor impactVisitor;
 
-  CodegenEnqueuer(Compiler compiler, this.strategy)
+  CodegenEnqueuer(this.task, Compiler compiler, this.strategy)
       : queue = new Queue<CodegenWorkItem>(),
         newlyEnqueuedElements = compiler.cacheStrategy.newSet(),
         newlySeenSelectors = compiler.cacheStrategy.newSet(),
+        nativeEnqueuer = compiler.backend.nativeCodegenEnqueuer(),
         this.name = 'codegen enqueuer',
         this._compiler = compiler {
     impactVisitor = new _EnqueuerImpactVisitor(this);
@@ -85,10 +81,6 @@
 
   CompilerOptions get options => _compiler.options;
 
-  Registry get globalDependencies => _compiler.globalDependencies;
-
-  Registry get mirrorDependencies => _compiler.mirrorDependencies;
-
   ClosedWorld get _world => _compiler.closedWorld;
 
   bool get queueIsEmpty => queue.isEmpty;
@@ -127,28 +119,36 @@
           element, "Codegen work list is closed. Trying to add $element");
     }
     queue.add(new CodegenWorkItem(_compiler, element));
-    if (options.dumpInfo) {
-      // TODO(sigmund): add other missing dependencies (internals, selectors
-      // enqueued after allocations), also enable only for the codegen enqueuer.
-      _compiler.dumpInfoTask
-          .registerDependency(_compiler.currentElement, element);
-    }
+    // TODO(sigmund): add other missing dependencies (internals, selectors
+    // enqueued after allocations).
+    _compiler.dumpInfoTask
+        .registerDependency(_compiler.currentElement, element);
   }
 
-  void applyImpact(WorldImpact worldImpact, {Element impactSource}) {
-    _compiler.impactStrategy
-        .visitImpact(impactSource, worldImpact, impactVisitor, impactUse);
+  void applyImpact(ImpactStrategy impactStrategy, WorldImpact worldImpact,
+      {Element impactSource}) {
+    impactStrategy.visitImpact(
+        impactSource, worldImpact, impactVisitor, impactUse);
   }
 
-  void registerInstantiatedType(InterfaceType type, {bool mirrorUsage: false}) {
+  void registerInstantiatedType(InterfaceType type) {
+    _registerInstantiatedType(type);
+  }
+
+  void _registerInstantiatedType(InterfaceType type,
+      {bool mirrorUsage: false, bool nativeUsage: false}) {
     task.measure(() {
       ClassElement cls = type.element;
       bool isNative = backend.isNative(cls);
       _universe.registerTypeInstantiation(type,
           isNative: isNative,
           byMirrors: mirrorUsage, onImplemented: (ClassElement cls) {
-        backend.registerImplementedClass(cls, this, globalDependencies);
+        backend.registerImplementedClass(cls, this);
       });
+      if (nativeUsage) {
+        nativeEnqueuer.onInstantiatedType(type);
+      }
+      backend.registerInstantiatedType(type);
       // TODO(johnniwinther): Share this reasoning with [Universe].
       if (!cls.isAbstract || isNative || mirrorUsage) {
         processInstantiatedClass(cls);
@@ -274,7 +274,7 @@
         // We only tell the backend once that [superclass] was instantiated, so
         // any additional dependencies must be treated as global
         // dependencies.
-        backend.registerInstantiatedClass(superclass, this, globalDependencies);
+        backend.registerInstantiatedClass(superclass, this);
       }
 
       ClassElement superclass = cls;
@@ -293,165 +293,6 @@
     });
   }
 
-  void logEnqueueReflectiveAction(action, [msg = ""]) {
-    if (TRACE_MIRROR_ENQUEUING) {
-      print("MIRROR_ENQUEUE (C): $action $msg");
-    }
-  }
-
-  /// Enqeue the constructor [ctor] if it is required for reflection.
-  ///
-  /// [enclosingWasIncluded] provides a hint whether the enclosing element was
-  /// needed for reflection.
-  void enqueueReflectiveConstructor(
-      ConstructorElement ctor, bool enclosingWasIncluded) {
-    if (shouldIncludeElementDueToMirrors(ctor,
-        includedEnclosing: enclosingWasIncluded)) {
-      logEnqueueReflectiveAction(ctor);
-      ClassElement cls = ctor.declaration.enclosingClass;
-      backend.registerInstantiatedType(cls.rawType, this, mirrorDependencies,
-          mirrorUsage: true);
-      registerStaticUse(new StaticUse.foreignUse(ctor.declaration));
-    }
-  }
-
-  /// Enqeue the member [element] if it is required for reflection.
-  ///
-  /// [enclosingWasIncluded] provides a hint whether the enclosing element was
-  /// needed for reflection.
-  void enqueueReflectiveMember(Element element, bool enclosingWasIncluded) {
-    if (shouldIncludeElementDueToMirrors(element,
-        includedEnclosing: enclosingWasIncluded)) {
-      logEnqueueReflectiveAction(element);
-      if (element.isTypedef) {
-        // Do nothing.
-      } else if (Elements.isStaticOrTopLevel(element)) {
-        registerStaticUse(new StaticUse.foreignUse(element.declaration));
-      } else if (element.isInstanceMember) {
-        // We need to enqueue all members matching this one in subclasses, as
-        // well.
-        // TODO(herhut): Use TypedSelector.subtype for enqueueing
-        DynamicUse dynamicUse =
-            new DynamicUse(new Selector.fromElement(element), null);
-        registerDynamicUse(dynamicUse);
-        if (element.isField) {
-          DynamicUse dynamicUse = new DynamicUse(
-              new Selector.setter(
-                  new Name(element.name, element.library, isSetter: true)),
-              null);
-          registerDynamicUse(dynamicUse);
-        }
-      }
-    }
-  }
-
-  /// Enqeue the member [element] if it is required for reflection.
-  ///
-  /// [enclosingWasIncluded] provides a hint whether the enclosing element was
-  /// needed for reflection.
-  void enqueueReflectiveElementsInClass(ClassElement cls,
-      Iterable<ClassElement> recents, bool enclosingWasIncluded) {
-    if (cls.library.isInternalLibrary || cls.isInjected) return;
-    bool includeClass = shouldIncludeElementDueToMirrors(cls,
-        includedEnclosing: enclosingWasIncluded);
-    if (includeClass) {
-      logEnqueueReflectiveAction(cls, "register");
-      ClassElement decl = cls.declaration;
-      backend.registerInstantiatedType(decl.rawType, this, mirrorDependencies,
-          mirrorUsage: true);
-    }
-    // If the class is never instantiated, we know nothing of it can possibly
-    // be reflected upon.
-    // TODO(herhut): Add a warning if a mirrors annotation cannot hit.
-    if (recents.contains(cls.declaration)) {
-      logEnqueueReflectiveAction(cls, "members");
-      cls.constructors.forEach((Element element) {
-        enqueueReflectiveConstructor(element, includeClass);
-      });
-      cls.forEachClassMember((Member member) {
-        enqueueReflectiveMember(member.element, includeClass);
-      });
-    }
-  }
-
-  /// Enqeue special classes that might not be visible by normal means or that
-  /// would not normally be enqueued:
-  ///
-  /// [Closure] is treated specially as it is the superclass of all closures.
-  /// Although it is in an internal library, we mark it as reflectable. Note
-  /// that none of its methods are reflectable, unless reflectable by
-  /// inheritance.
-  void enqueueReflectiveSpecialClasses() {
-    Iterable<ClassElement> classes = backend.classesRequiredForReflection;
-    for (ClassElement cls in classes) {
-      if (backend.referencedFromMirrorSystem(cls)) {
-        logEnqueueReflectiveAction(cls);
-        backend.registerInstantiatedType(cls.rawType, this, mirrorDependencies,
-            mirrorUsage: true);
-      }
-    }
-  }
-
-  /// Enqeue all local members of the library [lib] if they are required for
-  /// reflection.
-  void enqueueReflectiveElementsInLibrary(
-      LibraryElement lib, Iterable<ClassElement> recents) {
-    bool includeLibrary =
-        shouldIncludeElementDueToMirrors(lib, includedEnclosing: false);
-    lib.forEachLocalMember((Element member) {
-      if (member.isInjected) return;
-      if (member.isClass) {
-        enqueueReflectiveElementsInClass(member, recents, includeLibrary);
-      } else {
-        enqueueReflectiveMember(member, includeLibrary);
-      }
-    });
-  }
-
-  /// Enqueue all elements that are matched by the mirrors used
-  /// annotation or, in lack thereof, all elements.
-  void enqueueReflectiveElements(Iterable<ClassElement> recents) {
-    if (!hasEnqueuedReflectiveElements) {
-      logEnqueueReflectiveAction("!START enqueueAll");
-      // First round of enqueuing, visit everything that is visible to
-      // also pick up static top levels, etc.
-      // Also, during the first round, consider all classes that have been seen
-      // as recently seen, as we do not know how many rounds of resolution might
-      // have run before tree shaking is disabled and thus everything is
-      // enqueued.
-      recents = _processedClasses.toSet();
-      reporter.log('Enqueuing everything');
-      for (LibraryElement lib in _compiler.libraryLoader.libraries) {
-        enqueueReflectiveElementsInLibrary(lib, recents);
-      }
-      enqueueReflectiveSpecialClasses();
-      hasEnqueuedReflectiveElements = true;
-      hasEnqueuedReflectiveStaticFields = true;
-      logEnqueueReflectiveAction("!DONE enqueueAll");
-    } else if (recents.isNotEmpty) {
-      // Keep looking at new classes until fixpoint is reached.
-      logEnqueueReflectiveAction("!START enqueueRecents");
-      recents.forEach((ClassElement cls) {
-        enqueueReflectiveElementsInClass(
-            cls,
-            recents,
-            shouldIncludeElementDueToMirrors(cls.library,
-                includedEnclosing: false));
-      });
-      logEnqueueReflectiveAction("!DONE enqueueRecents");
-    }
-  }
-
-  /// Enqueue the static fields that have been marked as used by reflective
-  /// usage through `MirrorsUsed`.
-  void enqueueReflectiveStaticFields(Iterable<Element> elements) {
-    if (hasEnqueuedReflectiveStaticFields) return;
-    hasEnqueuedReflectiveStaticFields = true;
-    for (Element element in elements) {
-      enqueueReflectiveMember(element, true);
-    }
-  }
-
   void processSet(
       Map<String, Set<Element>> map, String memberName, bool f(Element e)) {
     Set<Element> members = map[memberName];
@@ -517,7 +358,7 @@
     assert(invariant(element, element.isDeclaration,
         message: "Element ${element} is not the declaration."));
     _universe.registerStaticUse(staticUse);
-    backend.registerStaticUse(element, forResolution: false);
+    backend.registerStaticUse(this, element);
     bool addElement = true;
     switch (staticUse.kind) {
       case StaticUseKind.STATIC_TEAR_OFF:
@@ -553,7 +394,13 @@
     DartType type = typeUse.type;
     switch (typeUse.kind) {
       case TypeUseKind.INSTANTIATION:
-        registerInstantiatedType(type);
+        _registerInstantiatedType(type);
+        break;
+      case TypeUseKind.MIRROR_INSTANTIATION:
+        _registerInstantiatedType(type, mirrorUsage: true);
+        break;
+      case TypeUseKind.NATIVE_INSTANTIATION:
+        _registerInstantiatedType(type, nativeUsage: true);
         break;
       case TypeUseKind.IS_CHECK:
       case TypeUseKind.AS_CAST:
@@ -571,7 +418,7 @@
   }
 
   void _registerIsCheck(DartType type) {
-    type = _universe.registerIsCheck(type, _compiler);
+    type = _universe.registerIsCheck(type, _compiler.resolution);
     // Even in checked mode, type annotations for return type and argument
     // types do not imply type checks, so there should never be a check
     // against the type variable of a typedef.
@@ -579,15 +426,13 @@
   }
 
   void registerCallMethodWithFreeTypeVariables(Element element) {
-    backend.registerCallMethodWithFreeTypeVariables(
-        element, this, globalDependencies);
+    backend.registerCallMethodWithFreeTypeVariables(element, this);
   }
 
   void registerClosurizedMember(TypedElement element) {
     assert(element.isInstanceMember);
     if (element.type.containsTypeVariables) {
-      backend.registerClosureWithFreeTypeVariables(
-          element, this, globalDependencies);
+      backend.registerClosureWithFreeTypeVariables(element, this);
     }
     backend.registerBoundClosure(this);
   }
@@ -645,18 +490,6 @@
   bool isProcessed(Element member) =>
       member.isAbstract || generatedCode.containsKey(member);
 
-  /**
-   * Decides whether an element should be included to satisfy requirements
-   * of the mirror system.
-   *
-   * For code generation, we rely on the precomputed set of elements that takes
-   * subtyping constraints into account.
-   */
-  bool shouldIncludeElementDueToMirrors(Element element,
-      {bool includedEnclosing}) {
-    return backend.isAccessibleByReflection(element);
-  }
-
   void registerNoSuchMethod(Element element) {
     if (!enabledNoSuchMethod && backend.enabledNoSuchMethod) {
       backend.enableNoSuchMethod(this);
@@ -668,7 +501,7 @@
     log('Compiled ${generatedCode.length} methods.');
   }
 
-  void forgetElement(Element element) {
+  void forgetElement(Element element, Compiler compiler) {
     _forgetElement(element);
     generatedCode.remove(element);
     if (element is MemberElement) {
@@ -689,6 +522,9 @@
 
   @override
   Iterable<Entity> get processedEntities => generatedCode.keys;
+
+  @override
+  Iterable<ClassElement> get processedClasses => _processedClasses;
 }
 
 void removeFromSet(Map<String, Set<Element>> map, Element element) {
diff --git a/pkg/compiler/lib/src/js_backend/mirrors_analysis.dart b/pkg/compiler/lib/src/js_backend/mirrors_analysis.dart
new file mode 100644
index 0000000..930dba3
--- /dev/null
+++ b/pkg/compiler/lib/src/js_backend/mirrors_analysis.dart
@@ -0,0 +1,243 @@
+// Copyright (c) 2016, 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 dart2js.mirrors_handler;
+
+import '../common/resolution.dart';
+import '../diagnostics/diagnostic_listener.dart';
+import '../elements/elements.dart';
+import '../enqueue.dart';
+import '../universe/selector.dart';
+import '../universe/use.dart';
+import 'backend.dart';
+
+class MirrorsAnalysis {
+  final MirrorsHandler resolutionHandler;
+  final MirrorsHandler codegenHandler;
+
+  MirrorsAnalysis(JavaScriptBackend backend, Resolution resolution)
+      : resolutionHandler = new MirrorsHandler(backend, resolution),
+        codegenHandler = new MirrorsHandler(backend, resolution);
+
+  /// Enqueue all elements that are matched by the mirrors used
+  /// annotation or, in lack thereof, all elements.
+  // TODO(johnniwinther): Compute [WorldImpact] instead of enqueuing directly.
+  void enqueueReflectiveElements(
+      Enqueuer enqueuer,
+      Iterable<ClassElement> recents,
+      Iterable<LibraryElement> loadedLibraries) {
+    MirrorsHandler handler =
+        enqueuer.isResolutionQueue ? resolutionHandler : codegenHandler;
+    handler.enqueueReflectiveElements(enqueuer, recents, loadedLibraries);
+  }
+
+  /// Enqueue the static fields that have been marked as used by reflective
+  /// usage through `MirrorsUsed`.
+  // TODO(johnniwinther): Compute [WorldImpact] instead of enqueuing directly.
+  void enqueueReflectiveStaticFields(
+      Enqueuer enqueuer, Iterable<Element> elements) {
+    MirrorsHandler handler =
+        enqueuer.isResolutionQueue ? resolutionHandler : codegenHandler;
+    handler.enqueueReflectiveStaticFields(enqueuer, elements);
+  }
+}
+
+class MirrorsHandler {
+  static final TRACE_MIRROR_ENQUEUING =
+      const bool.fromEnvironment("TRACE_MIRROR_ENQUEUING");
+
+  final JavaScriptBackend _backend;
+  final Resolution _resolution;
+
+  bool hasEnqueuedReflectiveElements = false;
+  bool hasEnqueuedReflectiveStaticFields = false;
+
+  MirrorsHandler(this._backend, this._resolution);
+
+  DiagnosticReporter get _reporter => _resolution.reporter;
+
+  void _logEnqueueReflectiveAction(action, [msg = ""]) {
+    if (TRACE_MIRROR_ENQUEUING) {
+      print("MIRROR_ENQUEUE (R): $action $msg");
+    }
+  }
+
+  /**
+   * Decides whether an element should be included to satisfy requirements
+   * of the mirror system.
+   *
+   * During resolution, we have to resort to matching elements against the
+   * [MirrorsUsed] pattern, as we do not have a complete picture of the world,
+   * yet.
+   */
+  bool _shouldIncludeElementDueToMirrors(Element element,
+      {bool includedEnclosing}) {
+    return includedEnclosing || _backend.requiredByMirrorSystem(element);
+  }
+
+  /// Enqeue the constructor [ctor] if it is required for reflection.
+  ///
+  /// [enclosingWasIncluded] provides a hint whether the enclosing element was
+  /// needed for reflection.
+  void _enqueueReflectiveConstructor(
+      Enqueuer enqueuer, ConstructorElement constructor,
+      {bool enclosingWasIncluded}) {
+    if (_shouldIncludeElementDueToMirrors(constructor,
+        includedEnclosing: enclosingWasIncluded)) {
+      _logEnqueueReflectiveAction(constructor);
+      ClassElement cls = constructor.declaration.enclosingClass;
+      enqueuer.registerTypeUse(new TypeUse.mirrorInstantiation(cls.rawType));
+      enqueuer
+          .registerStaticUse(new StaticUse.foreignUse(constructor.declaration));
+    }
+  }
+
+  /// Enqeue the member [element] if it is required for reflection.
+  ///
+  /// [enclosingWasIncluded] provides a hint whether the enclosing element was
+  /// needed for reflection.
+  void _enqueueReflectiveMember(
+      Enqueuer enqueuer, Element element, bool enclosingWasIncluded) {
+    if (_shouldIncludeElementDueToMirrors(element,
+        includedEnclosing: enclosingWasIncluded)) {
+      _logEnqueueReflectiveAction(element);
+      if (element.isTypedef) {
+        TypedefElement typedef = element;
+        typedef.ensureResolved(_resolution);
+      } else if (Elements.isStaticOrTopLevel(element)) {
+        enqueuer
+            .registerStaticUse(new StaticUse.foreignUse(element.declaration));
+      } else if (element.isInstanceMember) {
+        // We need to enqueue all members matching this one in subclasses, as
+        // well.
+        // TODO(herhut): Use TypedSelector.subtype for enqueueing
+        DynamicUse dynamicUse =
+            new DynamicUse(new Selector.fromElement(element), null);
+        enqueuer.registerDynamicUse(dynamicUse);
+        if (element.isField) {
+          DynamicUse dynamicUse = new DynamicUse(
+              new Selector.setter(
+                  new Name(element.name, element.library, isSetter: true)),
+              null);
+          enqueuer.registerDynamicUse(dynamicUse);
+        }
+      }
+    }
+  }
+
+  /// Enqeue the member [element] if it is required for reflection.
+  ///
+  /// [enclosingWasIncluded] provides a hint whether the enclosing element was
+  /// needed for reflection.
+  void _enqueueReflectiveElementsInClass(
+      Enqueuer enqueuer, ClassElement cls, Iterable<ClassElement> recents,
+      {bool enclosingWasIncluded}) {
+    if (cls.library.isInternalLibrary || cls.isInjected) return;
+    bool includeClass = _shouldIncludeElementDueToMirrors(cls,
+        includedEnclosing: enclosingWasIncluded);
+    if (includeClass) {
+      _logEnqueueReflectiveAction(cls, "register");
+      ClassElement declaration = cls.declaration;
+      declaration.ensureResolved(_resolution);
+      enqueuer.registerTypeUse(
+          new TypeUse.mirrorInstantiation(declaration.rawType));
+    }
+    // If the class is never instantiated, we know nothing of it can possibly
+    // be reflected upon.
+    // TODO(herhut): Add a warning if a mirrors annotation cannot hit.
+    if (recents.contains(cls.declaration)) {
+      _logEnqueueReflectiveAction(cls, "members");
+      cls.constructors.forEach((Element element) {
+        _enqueueReflectiveConstructor(enqueuer, element,
+            enclosingWasIncluded: includeClass);
+      });
+      cls.forEachClassMember((Member member) {
+        _enqueueReflectiveMember(enqueuer, member.element, includeClass);
+      });
+    }
+  }
+
+  /// Enqeue special classes that might not be visible by normal means or that
+  /// would not normally be enqueued:
+  ///
+  /// [Closure] is treated specially as it is the superclass of all closures.
+  /// Although it is in an internal library, we mark it as reflectable. Note
+  /// that none of its methods are reflectable, unless reflectable by
+  /// inheritance.
+  void _enqueueReflectiveSpecialClasses(Enqueuer enqueuer) {
+    Iterable<ClassElement> classes = _backend.classesRequiredForReflection;
+    for (ClassElement cls in classes) {
+      if (_backend.referencedFromMirrorSystem(cls)) {
+        _logEnqueueReflectiveAction(cls);
+        cls.ensureResolved(_resolution);
+        enqueuer.registerTypeUse(new TypeUse.mirrorInstantiation(cls.rawType));
+      }
+    }
+  }
+
+  /// Enqeue all local members of the library [lib] if they are required for
+  /// reflection.
+  void _enqueueReflectiveElementsInLibrary(
+      Enqueuer enqueuer, LibraryElement lib, Iterable<ClassElement> recents) {
+    bool includeLibrary =
+        _shouldIncludeElementDueToMirrors(lib, includedEnclosing: false);
+    lib.forEachLocalMember((Element member) {
+      if (member.isInjected) return;
+      if (member.isClass) {
+        _enqueueReflectiveElementsInClass(enqueuer, member, recents,
+            enclosingWasIncluded: includeLibrary);
+      } else {
+        _enqueueReflectiveMember(enqueuer, member, includeLibrary);
+      }
+    });
+  }
+
+  /// Enqueue all elements that are matched by the mirrors used
+  /// annotation or, in lack thereof, all elements.
+  // TODO(johnniwinther): Compute [WorldImpact] instead of enqueuing directly.
+  void enqueueReflectiveElements(
+      Enqueuer enqueuer,
+      Iterable<ClassElement> recents,
+      Iterable<LibraryElement> loadedLibraries) {
+    if (!hasEnqueuedReflectiveElements) {
+      _logEnqueueReflectiveAction("!START enqueueAll");
+      // First round of enqueuing, visit everything that is visible to
+      // also pick up static top levels, etc.
+      // Also, during the first round, consider all classes that have been seen
+      // as recently seen, as we do not know how many rounds of resolution might
+      // have run before tree shaking is disabled and thus everything is
+      // enqueued.
+      recents = enqueuer.processedClasses.toSet();
+      _reporter.log('Enqueuing everything');
+      for (LibraryElement lib in loadedLibraries) {
+        _enqueueReflectiveElementsInLibrary(enqueuer, lib, recents);
+      }
+      _enqueueReflectiveSpecialClasses(enqueuer);
+      hasEnqueuedReflectiveElements = true;
+      hasEnqueuedReflectiveStaticFields = true;
+      _logEnqueueReflectiveAction("!DONE enqueueAll");
+    } else if (recents.isNotEmpty) {
+      // Keep looking at new classes until fixpoint is reached.
+      _logEnqueueReflectiveAction("!START enqueueRecents");
+      recents.forEach((ClassElement cls) {
+        _enqueueReflectiveElementsInClass(enqueuer, cls, recents,
+            enclosingWasIncluded: _shouldIncludeElementDueToMirrors(cls.library,
+                includedEnclosing: false));
+      });
+      _logEnqueueReflectiveAction("!DONE enqueueRecents");
+    }
+  }
+
+  /// Enqueue the static fields that have been marked as used by reflective
+  /// usage through `MirrorsUsed`.
+  // TODO(johnniwinther): Compute [WorldImpact] instead of enqueuing directly.
+  void enqueueReflectiveStaticFields(
+      Enqueuer enqueuer, Iterable<Element> elements) {
+    if (hasEnqueuedReflectiveStaticFields) return;
+    hasEnqueuedReflectiveStaticFields = true;
+    for (Element element in elements) {
+      _enqueueReflectiveMember(enqueuer, element, true);
+    }
+  }
+}
diff --git a/pkg/compiler/lib/src/js_backend/no_such_method_registry.dart b/pkg/compiler/lib/src/js_backend/no_such_method_registry.dart
index 1b88780..9956a18 100644
--- a/pkg/compiler/lib/src/js_backend/no_such_method_registry.dart
+++ b/pkg/compiler/lib/src/js_backend/no_such_method_registry.dart
@@ -124,7 +124,7 @@
   }
 
   _subcategorizeOther(FunctionElement element) {
-    if (_compiler.globalInference.results.throwsAlways(element)) {
+    if (_compiler.globalInference.results.resultOf(element).throwsAlways) {
       complexNoReturnImpls.add(element);
     } else {
       complexReturningImpls.add(element);
diff --git a/pkg/compiler/lib/src/js_backend/runtime_types.dart b/pkg/compiler/lib/src/js_backend/runtime_types.dart
index d3adc4b..23740b3 100644
--- a/pkg/compiler/lib/src/js_backend/runtime_types.dart
+++ b/pkg/compiler/lib/src/js_backend/runtime_types.dart
@@ -181,7 +181,7 @@
         InterfaceType interface = type;
         do {
           for (DartType argument in interface.typeArguments) {
-            universe.registerIsCheck(argument, compiler);
+            universe.registerIsCheck(argument, compiler.resolution);
           }
           interface = interface.element.supertype;
         } while (interface != null && !instantiatedTypes.contains(interface));
@@ -204,7 +204,7 @@
             InterfaceType instance = current.asInstanceOf(cls);
             if (instance == null) break;
             for (DartType argument in instance.typeArguments) {
-              universe.registerIsCheck(argument, compiler);
+              universe.registerIsCheck(argument, compiler.resolution);
             }
             current = current.element.supertype;
           } while (current != null && !instantiatedTypes.contains(current));
diff --git a/pkg/compiler/lib/src/js_backend/type_variable_handler.dart b/pkg/compiler/lib/src/js_backend/type_variable_handler.dart
index 595da95..97c6011 100644
--- a/pkg/compiler/lib/src/js_backend/type_variable_handler.dart
+++ b/pkg/compiler/lib/src/js_backend/type_variable_handler.dart
@@ -64,13 +64,12 @@
     return impactBuilder.flush();
   }
 
-  void registerClassWithTypeVariables(
-      ClassElement cls, Enqueuer enqueuer, Registry registry) {
+  void registerClassWithTypeVariables(ClassElement cls, Enqueuer enqueuer) {
     if (enqueuer.isResolutionQueue) {
       // On first encounter, we have to ensure that the support classes get
       // resolved.
       if (!_seenClassesWithTypeVariables) {
-        _backend.enqueueClass(enqueuer, _typeVariableClass, registry);
+        _backend.enqueueClass(enqueuer, _typeVariableClass);
         _typeVariableClass.ensureResolved(_compiler.resolution);
         Link constructors = _typeVariableClass.constructors;
         if (constructors.isEmpty && constructors.tail.isEmpty) {
@@ -78,9 +77,8 @@
               "Class '$_typeVariableClass' should only have one constructor");
         }
         _typeVariableConstructor = _typeVariableClass.constructors.head;
-        _backend.enqueueInResolution(_typeVariableConstructor, registry);
-        _backend.registerInstantiatedType(
-            _typeVariableClass.rawType, enqueuer, registry);
+        _backend.enqueue(enqueuer, _typeVariableConstructor);
+        enqueuer.registerInstantiatedType(_typeVariableClass.rawType);
         enqueuer.registerStaticUse(new StaticUse.staticInvoke(
             _backend.registerBackendUse(_backend.helpers.createRuntimeType),
             CallStructure.ONE_ARG));
diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
index 06f8203..a5e7b4c 100644
--- a/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
@@ -1152,7 +1152,7 @@
         .add(new jsAst.FunctionDeclaration(constructorName, constructorAst));
 
     String fieldNamesProperty = FIELD_NAMES_PROPERTY_NAME;
-    bool hasIsolateSupport = compiler.hasIsolateSupport;
+    bool hasIsolateSupport = compiler.resolverWorld.hasIsolateSupport;
     jsAst.Node fieldNamesArray;
     if (hasIsolateSupport) {
       fieldNamesArray =
diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/interceptor_emitter.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/interceptor_emitter.dart
index 51f06f8..0da9ca3 100644
--- a/pkg/compiler/lib/src/js_emitter/full_emitter/interceptor_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/full_emitter/interceptor_emitter.dart
@@ -76,7 +76,7 @@
     // We could also generate the list of intercepted names at
     // runtime, by running through the subclasses of Interceptor
     // (which can easily be identified).
-    if (!compiler.enabledInvokeOn) return null;
+    if (!backend.hasInvokeOnSupport) return null;
 
     Iterable<jsAst.Name> invocationNames = interceptorInvocationNames.toList()
       ..sort();
diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/setup_program_builder.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/setup_program_builder.dart
index 56b1e29..feaee8e 100644
--- a/pkg/compiler/lib/src/js_emitter/full_emitter/setup_program_builder.dart
+++ b/pkg/compiler/lib/src/js_emitter/full_emitter/setup_program_builder.dart
@@ -103,7 +103,7 @@
     'staticsPropertyNameString': js.quoteName(namer.staticsPropertyName),
     'typeInformation': typeInformationAccess,
     'globalFunctions': globalFunctionsAccess,
-    'enabledInvokeOn': compiler.enabledInvokeOn,
+    'enabledInvokeOn': backend.hasInvokeOnSupport,
     'interceptedNames': interceptedNamesAccess,
     'interceptedNamesSet': emitter.generateInterceptedNamesSet(),
     'notInCspMode': !compiler.options.useContentSecurityPolicy,
@@ -138,7 +138,7 @@
         js.quoteName(namer.runtimeTypeName(compiler.coreClasses.objectClass)),
     'needsStructuredMemberInfo': emitter.needsStructuredMemberInfo,
     'usesMangledNames': compiler.commonElements.mirrorsLibrary != null ||
-        compiler.enabledFunctionApply,
+        compiler.hasFunctionApplySupport,
     'tearOffCode': buildTearOffCode(backend),
     'nativeInfoHandler': nativeInfoHandler,
     'operatorIsPrefix': js.string(namer.operatorIsPrefix),
diff --git a/pkg/compiler/lib/src/js_emitter/main_call_stub_generator.dart b/pkg/compiler/lib/src/js_emitter/main_call_stub_generator.dart
index b38e403..55824e8 100644
--- a/pkg/compiler/lib/src/js_emitter/main_call_stub_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/main_call_stub_generator.dart
@@ -28,7 +28,7 @@
   jsAst.Statement generateInvokeMain() {
     Element main = compiler.mainFunction;
     jsAst.Expression mainCallClosure = null;
-    if (compiler.hasIsolateSupport) {
+    if (compiler.resolverWorld.hasIsolateSupport) {
       Element isolateMain =
           helpers.isolateHelperLibrary.find(BackendHelpers.START_ROOT_ISOLATE);
       mainCallClosure = _buildIsolateSetupClosure(main, isolateMain);
diff --git a/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart b/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
index 9c2971b..3fac271 100644
--- a/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
+++ b/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
@@ -675,7 +675,7 @@
   }
 
   bool _methodCanBeApplied(FunctionElement method) {
-    return _compiler.enabledFunctionApply &&
+    return _compiler.hasFunctionApplySupport &&
         _compiler.closedWorld.getMightBePassedToApply(method);
   }
 
diff --git a/pkg/compiler/lib/src/kernel/kernel.dart b/pkg/compiler/lib/src/kernel/kernel.dart
index 53ca782..a4da817 100644
--- a/pkg/compiler/lib/src/kernel/kernel.dart
+++ b/pkg/compiler/lib/src/kernel/kernel.dart
@@ -207,9 +207,13 @@
           if (member.enclosingClass.declaration != cls) {
             // TODO(het): figure out why impact_test triggers this
             //internalError(cls, "`$member` isn't mine.");
-          } else if (member.isFunction ||
-              member.isAccessor ||
-              member.isConstructor) {
+          } else if (member.isConstructor) {
+            ConstructorElement constructor = member;
+            ir.Member memberNode = functionToIr(member);
+            if (!constructor.isRedirectingFactory) {
+              classNode.addMember(memberNode);
+            }
+          } else if (member.isFunction || member.isAccessor) {
             classNode.addMember(functionToIr(member));
           } else if (member.isField) {
             classNode.addMember(fieldToIr(member));
@@ -220,7 +224,9 @@
         classNode.typeParameters.addAll(typeVariablesToIr(cls.typeVariables));
         for (ir.InterfaceType interface
             in typesToIr(cls.interfaces.reverse().toList())) {
-          classNode.implementedTypes.add(interface);
+          if (interface != classNode.mixedInType) {
+            classNode.implementedTypes.add(interface);
+          }
         }
         addWork(cls, () {
           addDefaultInstanceFieldInitializers(classNode);
diff --git a/pkg/compiler/lib/src/kernel/kernel_debug.dart b/pkg/compiler/lib/src/kernel/kernel_debug.dart
index d723354..261aa09 100644
--- a/pkg/compiler/lib/src/kernel/kernel_debug.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_debug.dart
@@ -6,7 +6,7 @@
 
 library kernel.debug;
 
-import 'package:kernel/kernel.dart';
+import 'package:kernel/ast.dart';
 import 'package:kernel/visitor.dart';
 
 import '../util/util.dart' show Indentation, Tagging;
diff --git a/pkg/compiler/lib/src/kernel/kernel_visitor.dart b/pkg/compiler/lib/src/kernel/kernel_visitor.dart
index e6ed1e4..39a1a8d 100644
--- a/pkg/compiler/lib/src/kernel/kernel_visitor.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_visitor.dart
@@ -1158,13 +1158,8 @@
 
   ir.Expression buildConstructorInvoke(NewExpression node, {bool isConst}) {
     ConstructorElement constructor = elements[node.send];
-    ConstructorTarget target;
-    if (isConst) {
-      target =
-          kernel.computeEffectiveTarget(constructor, elements.getType(node));
-    } else {
-      target = new ConstructorTarget(constructor, elements.getType(node));
-    }
+    ConstructorTarget target =
+        kernel.computeEffectiveTarget(constructor, elements.getType(node));
     NodeList arguments = node.send.argumentsNode;
     if (kernel.isSyntheticError(target.element)) {
       return new ir.MethodInvocation(new ir.InvalidExpression(),
diff --git a/pkg/compiler/lib/src/native/enqueue.dart b/pkg/compiler/lib/src/native/enqueue.dart
index 7c3f125..44d3be3 100644
--- a/pkg/compiler/lib/src/native/enqueue.dart
+++ b/pkg/compiler/lib/src/native/enqueue.dart
@@ -21,18 +21,25 @@
 import '../tokens/token.dart' show BeginGroupToken, Token;
 import '../tokens/token_constants.dart' as Tokens show EOF_TOKEN;
 import '../tree/tree.dart';
+import '../universe/use.dart' show StaticUse, TypeUse;
+import '../universe/world_impact.dart' show WorldImpactBuilder;
 import 'behavior.dart';
 
 /**
  * This could be an abstract class but we use it as a stub for the dart_backend.
  */
 class NativeEnqueuer {
+  /// Called when a [type] has been instantiated natively.
+  void onInstantiatedType(InterfaceType type) {}
+
   /// Initial entry point to native enqueuer.
-  void processNativeClasses(Iterable<LibraryElement> libraries) {}
+  void processNativeClasses(
+      WorldImpactBuilder impactBuilder, Iterable<LibraryElement> libraries) {}
 
   /// Registers the [nativeBehavior]. Adds the liveness of its instantiated
   /// types to the world.
-  void registerNativeBehavior(NativeBehavior nativeBehavior, cause) {}
+  void registerNativeBehavior(
+      WorldImpactBuilder impactBuilder, NativeBehavior nativeBehavior, cause) {}
 
   // TODO(johnniwinther): Move [handleFieldAnnotations] and
   // [handleMethodAnnotations] to [JavaScriptBackend] or [NativeData].
@@ -86,12 +93,6 @@
    */
   final Set matchedTypeConstraints = new Set();
 
-  /// Pending actions.  Classes in [pendingClasses] have action thunks in
-  /// [queue] to register the class.
-  final queue = new Queue();
-  bool flushing = false;
-
-  final Enqueuer world;
   final Compiler compiler;
   final bool enableLiveTypeAnalysis;
 
@@ -100,7 +101,7 @@
   ClassElement _annotationJsNameClass;
 
   /// Subclasses of [NativeEnqueuerBase] are constructed by the backend.
-  NativeEnqueuerBase(this.world, Compiler compiler, this.enableLiveTypeAnalysis)
+  NativeEnqueuerBase(Compiler compiler, this.enableLiveTypeAnalysis)
       : this.compiler = compiler,
         processedLibraries = compiler.cacheStrategy.newSet();
 
@@ -111,7 +112,14 @@
   DiagnosticReporter get reporter => compiler.reporter;
   CoreTypes get coreTypes => compiler.coreTypes;
 
-  void processNativeClasses(Iterable<LibraryElement> libraries) {
+  void onInstantiatedType(InterfaceType type) {
+    if (unusedClasses.remove(type.element)) {
+      registeredClasses.add(type.element);
+    }
+  }
+
+  void processNativeClasses(
+      WorldImpactBuilder impactBuilder, Iterable<LibraryElement> libraries) {
     if (compiler.options.hasIncrementalSupport) {
       // Since [Set.add] returns bool if an element was added, this restricts
       // [libraries] to ones that haven't already been processed. This saves
@@ -124,8 +132,7 @@
     }
     processSubclassesOfNativeClasses(libraries);
     if (!enableLiveTypeAnalysis) {
-      nativeClasses.forEach((c) => enqueueClass(c, 'forced'));
-      flushQueue();
+      _registerTypeUses(impactBuilder, nativeClasses, 'forced');
     }
   }
 
@@ -333,40 +340,19 @@
     return name;
   }
 
-  enqueueClass(ClassElement classElement, cause) {
-    assert(unusedClasses.contains(classElement));
-    unusedClasses.remove(classElement);
-    pendingClasses.add(classElement);
-    queue.add(() {
-      processClass(classElement, cause);
-    });
-  }
-
-  void flushQueue() {
-    if (flushing) return;
-    flushing = true;
-    while (!queue.isEmpty) {
-      (queue.removeFirst())();
-    }
-    flushing = false;
-  }
-
-  processClass(ClassElement classElement, cause) {
-    // TODO(ahe): Fix this assertion to work in incremental compilation.
-    assert(compiler.options.hasIncrementalSupport ||
-        !registeredClasses.contains(classElement));
-
-    bool firstTime = registeredClasses.isEmpty;
-    pendingClasses.remove(classElement);
-    registeredClasses.add(classElement);
-
-    // TODO(ahe): Is this really a global dependency?
-    classElement.ensureResolved(resolution);
-    compiler.backend.registerInstantiatedType(
-        classElement.rawType, world, compiler.globalDependencies);
-
-    if (firstTime) {
-      queue.add(onFirstNativeClass);
+  /// Register [classes] as natively instantiated in [impactBuilder].
+  void _registerTypeUses(
+      WorldImpactBuilder impactBuilder, Set<ClassElement> classes, cause) {
+    for (ClassElement cls in classes) {
+      if (!unusedClasses.contains(cls)) {
+        // No need to add [classElement] to [impactBuilder]: it has already been
+        // instantiated and we don't track origins of native instantiations
+        // precisely.
+        continue;
+      }
+      cls.ensureResolved(resolution);
+      impactBuilder
+          .registerTypeUse(new TypeUse.nativeInstantiation(cls.rawType));
     }
   }
 
@@ -449,43 +435,45 @@
     });
   }
 
-  void registerNativeBehavior(NativeBehavior nativeBehavior, cause) {
-    processNativeBehavior(nativeBehavior, cause);
-    flushQueue();
+  void registerNativeBehavior(
+      WorldImpactBuilder impactBuilder, NativeBehavior nativeBehavior, cause) {
+    _processNativeBehavior(impactBuilder, nativeBehavior, cause);
   }
 
-  processNativeBehavior(NativeBehavior behavior, cause) {
-    // TODO(ahe): Is this really a global dependency?
-    Registry registry = compiler.globalDependencies;
-    bool allUsedBefore = unusedClasses.isEmpty;
+  void _processNativeBehavior(
+      WorldImpactBuilder impactBuilder, NativeBehavior behavior, cause) {
+    void registerInstantiation(InterfaceType type) {
+      impactBuilder.registerTypeUse(new TypeUse.nativeInstantiation(type));
+    }
+
+    int unusedBefore = unusedClasses.length;
+    Set<ClassElement> matchingClasses = new Set<ClassElement>();
     for (var type in behavior.typesInstantiated) {
       if (matchedTypeConstraints.contains(type)) continue;
       matchedTypeConstraints.add(type);
       if (type is SpecialType) {
         if (type == SpecialType.JsObject) {
-          backend.registerInstantiatedType(
-              compiler.coreTypes.objectType, world, registry);
+          registerInstantiation(compiler.coreTypes.objectType);
         }
         continue;
       }
       if (type is InterfaceType) {
         if (type == coreTypes.intType) {
-          backend.registerInstantiatedType(type, world, registry);
+          registerInstantiation(type);
         } else if (type == coreTypes.doubleType) {
-          backend.registerInstantiatedType(type, world, registry);
+          registerInstantiation(type);
         } else if (type == coreTypes.numType) {
-          backend.registerInstantiatedType(
-              coreTypes.doubleType, world, registry);
-          backend.registerInstantiatedType(coreTypes.intType, world, registry);
+          registerInstantiation(coreTypes.doubleType);
+          registerInstantiation(coreTypes.intType);
         } else if (type == coreTypes.stringType) {
-          backend.registerInstantiatedType(type, world, registry);
+          registerInstantiation(type);
         } else if (type == coreTypes.nullType) {
-          backend.registerInstantiatedType(type, world, registry);
+          registerInstantiation(type);
         } else if (type == coreTypes.boolType) {
-          backend.registerInstantiatedType(type, world, registry);
+          registerInstantiation(type);
         } else if (compiler.types.isSubtype(
             type, backend.backendClasses.listImplementation.rawType)) {
-          backend.registerInstantiatedType(type, world, registry);
+          registerInstantiation(type);
         }
         // TODO(johnniwinther): Improve spec string precision to handle type
         // arguments and implements relations that preserve generics. Currently
@@ -494,60 +482,66 @@
         // any native subclasses of generic classes.
         // TODO(johnniwinther,sra): Find and replace uses of `List` with the
         // actual implementation classes such as `JSArray` et al.
-        enqueueUnusedClassesMatching((ClassElement nativeClass) {
+        matchingClasses
+            .addAll(_findUnusedClassesMatching((ClassElement nativeClass) {
           InterfaceType nativeType = nativeClass.thisType;
           InterfaceType specType = type.element.thisType;
           return compiler.types.isSubtype(nativeType, specType);
-        }, cause, 'subtypeof($type)');
+        }));
       } else if (type.isDynamic) {
-        enqueueUnusedClassesMatching((_) => true, cause, 'subtypeof($type)');
+        matchingClasses.addAll(unusedClasses);
       } else {
         assert(type is VoidType);
       }
     }
+    if (matchingClasses.isNotEmpty && registeredClasses.isEmpty) {
+      matchingClasses.addAll(_onFirstNativeClass(impactBuilder));
+    }
+    _registerTypeUses(impactBuilder, matchingClasses, cause);
 
     // Give an info so that library developers can compile with -v to find why
     // all the native classes are included.
-    if (unusedClasses.isEmpty && !allUsedBefore) {
+    if (unusedBefore == matchingClasses.length) {
       reporter.log('All native types marked as used due to $cause.');
     }
   }
 
-  enqueueUnusedClassesMatching(bool predicate(classElement), cause,
-      [String reason]) {
-    Iterable matches = unusedClasses.where(predicate);
-    matches.toList().forEach((c) => enqueueClass(c, cause));
+  Iterable<ClassElement> _findUnusedClassesMatching(
+      bool predicate(classElement)) {
+    return unusedClasses.where(predicate);
   }
 
-  onFirstNativeClass() {
-    staticUse(name) {
-      backend.enqueue(
-          world, helpers.findHelper(name), compiler.globalDependencies);
+  Iterable<ClassElement> _onFirstNativeClass(WorldImpactBuilder impactBuilder) {
+    void staticUse(name) {
+      Element element = helpers.findHelper(name);
+      impactBuilder.registerStaticUse(new StaticUse.foreignUse(element));
+      backend.registerBackendUse(element);
+      compiler.globalDependencies.registerDependency(element);
     }
 
     staticUse('defineProperty');
     staticUse('toStringForNativeObject');
     staticUse('hashCodeForNativeObject');
     staticUse('convertDartClosureToJS');
-    addNativeExceptions();
+    return _findNativeExceptions();
   }
 
-  addNativeExceptions() {
-    enqueueUnusedClassesMatching((classElement) {
+  Iterable<ClassElement> _findNativeExceptions() {
+    return _findUnusedClassesMatching((classElement) {
       // TODO(sra): Annotate exception classes in dart:html.
       String name = classElement.name;
       if (name.contains('Exception')) return true;
       if (name.contains('Error')) return true;
       return false;
-    }, 'native exception');
+    });
   }
 }
 
 class NativeResolutionEnqueuer extends NativeEnqueuerBase {
   Map<String, ClassElement> tagOwner = new Map<String, ClassElement>();
 
-  NativeResolutionEnqueuer(Enqueuer world, Compiler compiler)
-      : super(world, compiler, compiler.options.enableNativeLiveTypeAnalysis);
+  NativeResolutionEnqueuer(Compiler compiler)
+      : super(compiler, compiler.options.enableNativeLiveTypeAnalysis);
 
   void processNativeClass(ClassElement classElement) {
     super.processNativeClass(classElement);
@@ -623,37 +617,46 @@
 
   final Set<ClassElement> doneAddSubtypes = new Set<ClassElement>();
 
-  NativeCodegenEnqueuer(Enqueuer world, Compiler compiler, this.emitter)
-      : super(world, compiler, compiler.options.enableNativeLiveTypeAnalysis);
+  NativeCodegenEnqueuer(Compiler compiler, this.emitter)
+      : super(compiler, compiler.options.enableNativeLiveTypeAnalysis);
 
-  void processNativeClasses(Iterable<LibraryElement> libraries) {
-    super.processNativeClasses(libraries);
+  void processNativeClasses(
+      WorldImpactBuilder impactBuilder, Iterable<LibraryElement> libraries) {
+    super.processNativeClasses(impactBuilder, libraries);
 
     // HACK HACK - add all the resolved classes.
     NativeEnqueuerBase enqueuer = compiler.enqueuer.resolution.nativeEnqueuer;
+    Set<ClassElement> matchingClasses = new Set<ClassElement>();
     for (final classElement in enqueuer.registeredClasses) {
       if (unusedClasses.contains(classElement)) {
-        enqueueClass(classElement, 'was resolved');
+        matchingClasses.add(classElement);
       }
     }
-    flushQueue();
+    if (matchingClasses.isNotEmpty && registeredClasses.isEmpty) {
+      matchingClasses.addAll(_onFirstNativeClass(impactBuilder));
+    }
+    _registerTypeUses(impactBuilder, matchingClasses, 'was resolved');
   }
 
-  processClass(ClassElement classElement, cause) {
-    super.processClass(classElement, cause);
-    // Add the information that this class is a subtype of its supertypes.  The
-    // code emitter and the ssa builder use that information.
-    addSubtypes(classElement, emitter.nativeEmitter);
+  void _registerTypeUses(
+      WorldImpactBuilder impactBuilder, Set<ClassElement> classes, cause) {
+    super._registerTypeUses(impactBuilder, classes, cause);
+
+    for (ClassElement classElement in classes) {
+      // Add the information that this class is a subtype of its supertypes. The
+      // code emitter and the ssa builder use that information.
+      _addSubtypes(classElement, emitter.nativeEmitter);
+    }
   }
 
-  void addSubtypes(ClassElement cls, NativeEmitter emitter) {
+  void _addSubtypes(ClassElement cls, NativeEmitter emitter) {
     if (!backend.isNative(cls)) return;
     if (doneAddSubtypes.contains(cls)) return;
     doneAddSubtypes.add(cls);
 
     // Walk the superclass chain since classes on the superclass chain might not
     // be instantiated (abstract or simply unused).
-    addSubtypes(cls.superclass, emitter);
+    _addSubtypes(cls.superclass, emitter);
 
     for (DartType type in cls.allSupertypes) {
       List<Element> subtypes =
diff --git a/pkg/compiler/lib/src/resolution/tree_elements.dart b/pkg/compiler/lib/src/resolution/tree_elements.dart
index bae0857..fd0080f 100644
--- a/pkg/compiler/lib/src/resolution/tree_elements.dart
+++ b/pkg/compiler/lib/src/resolution/tree_elements.dart
@@ -10,7 +10,6 @@
 import '../diagnostics/source_span.dart';
 import '../elements/elements.dart';
 import '../tree/tree.dart';
-import '../types/types.dart' show TypeMask;
 import '../universe/selector.dart' show Selector;
 import '../util/util.dart';
 import 'secret_tree_element.dart' show getTreeElement, setTreeElement;
@@ -36,21 +35,9 @@
   Selector getGetterSelectorInComplexSendSet(SendSet node);
   Selector getOperatorSelectorInComplexSendSet(SendSet node);
   DartType getType(Node node);
-  TypeMask getTypeMask(Node node);
-  TypeMask getGetterTypeMaskInComplexSendSet(SendSet node);
-  TypeMask getOperatorTypeMaskInComplexSendSet(SendSet node);
-  void setTypeMask(Node node, TypeMask mask);
-  void setGetterTypeMaskInComplexSendSet(SendSet node, TypeMask mask);
-  void setOperatorTypeMaskInComplexSendSet(SendSet node, TypeMask mask);
 
   /// Returns the for-in loop variable for [node].
   Element getForInVariable(ForIn node);
-  TypeMask getIteratorTypeMask(ForIn node);
-  TypeMask getMoveNextTypeMask(ForIn node);
-  TypeMask getCurrentTypeMask(ForIn node);
-  void setIteratorTypeMask(ForIn node, TypeMask mask);
-  void setMoveNextTypeMask(ForIn node, TypeMask mask);
-  void setCurrentTypeMask(ForIn node, TypeMask mask);
   void setConstant(Node node, ConstantExpression constant);
   ConstantExpression getConstant(Node node);
 
@@ -107,7 +94,6 @@
 class TreeElementMapping extends TreeElements {
   final AnalyzableElement analyzedElement;
   Map<Spannable, Selector> _selectors;
-  Map<Spannable, TypeMask> _typeMasks;
   Map<Node, DartType> _types;
 
   Map<Node, DartType> _typesCache;
@@ -442,79 +428,6 @@
     return _targetLabels != null ? _targetLabels[node] : null;
   }
 
-  TypeMask _getTypeMask(Spannable node) {
-    return _typeMasks != null ? _typeMasks[node] : null;
-  }
-
-  void _setTypeMask(Spannable node, TypeMask mask) {
-    if (_typeMasks == null) {
-      _typeMasks = new Maplet<Spannable, TypeMask>();
-    }
-    _typeMasks[node] = mask;
-  }
-
-  @override
-  void setTypeMask(Node node, TypeMask mask) {
-    _setTypeMask(node, mask);
-  }
-
-  @override
-  TypeMask getTypeMask(Node node) => _getTypeMask(node);
-
-  @override
-  void setGetterTypeMaskInComplexSendSet(SendSet node, TypeMask mask) {
-    _setTypeMask(node.selector, mask);
-  }
-
-  @override
-  TypeMask getGetterTypeMaskInComplexSendSet(SendSet node) {
-    return _getTypeMask(node.selector);
-  }
-
-  @override
-  void setOperatorTypeMaskInComplexSendSet(SendSet node, TypeMask mask) {
-    _setTypeMask(node.assignmentOperator, mask);
-  }
-
-  @override
-  TypeMask getOperatorTypeMaskInComplexSendSet(SendSet node) {
-    return _getTypeMask(node.assignmentOperator);
-  }
-
-  // The following methods set selectors on the "for in" node. Since
-  // we're using three selectors, we need to use children of the node,
-  // and we arbitrarily choose which ones.
-
-  @override
-  void setIteratorTypeMask(ForIn node, TypeMask mask) {
-    _setTypeMask(node, mask);
-  }
-
-  @override
-  TypeMask getIteratorTypeMask(ForIn node) {
-    return _getTypeMask(node);
-  }
-
-  @override
-  void setMoveNextTypeMask(ForIn node, TypeMask mask) {
-    _setTypeMask(node.forToken, mask);
-  }
-
-  @override
-  TypeMask getMoveNextTypeMask(ForIn node) {
-    return _getTypeMask(node.forToken);
-  }
-
-  @override
-  void setCurrentTypeMask(ForIn node, TypeMask mask) {
-    _setTypeMask(node.inToken, mask);
-  }
-
-  @override
-  TypeMask getCurrentTypeMask(ForIn node) {
-    return _getTypeMask(node.inToken);
-  }
-
   void registerNativeData(Node node, dynamic nativeData) {
     if (_nativeData == null) {
       _nativeData = <Node, dynamic>{};
diff --git a/pkg/compiler/lib/src/ssa/builder.dart b/pkg/compiler/lib/src/ssa/builder.dart
index f2def5c..abf9afa 100644
--- a/pkg/compiler/lib/src/ssa/builder.dart
+++ b/pkg/compiler/lib/src/ssa/builder.dart
@@ -142,7 +142,16 @@
   // used only for codegen, but currently we want to experiment using it for
   // code-analysis too.
   final CodegenRegistry registry;
+
+  /// All results from the global type-inference analysis.
   final GlobalTypeInferenceResults inferenceResults;
+
+  /// Results from the global type-inference analysis corresponding to the
+  /// current element being visited.
+  ///
+  /// Invariant: this property is updated together with [resolvedAst].
+  GlobalTypeInferenceElementResult elementInferenceResults;
+
   final JavaScriptBackend backend;
   final ConstantSystem constantSystem;
   final RuntimeTypes rti;
@@ -194,6 +203,8 @@
         this.inferenceResults = backend.compiler.globalInference.results {
     assert(target.isImplementation);
     compiler = backend.compiler;
+    elementInferenceResults = _resultOf(target);
+    assert(elementInferenceResults != null);
     graph.element = target;
     sourceElementStack.add(target);
     sourceInformationBuilder =
@@ -235,6 +246,17 @@
   // implementation/declaration distinction.
   Element get sourceElement => sourceElementStack.last;
 
+  /// Helper to retrieve global inference results for [element] with special
+  /// care for `ConstructorBodyElement`s which don't exist at the time the
+  /// global analysis run.
+  ///
+  /// Note: this helper is used selectively. When we know that we are in a
+  /// context were we don't expect to see a constructor body element, we
+  /// directly fetch the data from the global inference results.
+  GlobalTypeInferenceElementResult _resultOf(AstElement element) =>
+      inferenceResults.resultOf(
+          element is ConstructorBodyElementX ? element.constructor : element);
+
   bool get _checkOrTrustTypes =>
       compiler.options.enableTypeAssertions ||
       compiler.options.trustTypeAnnotations;
@@ -378,7 +400,7 @@
     // TODO(johnniwinther): Register this on the [registry]. Currently the
     // [CodegenRegistry] calls the enqueuer, but [element] should _not_ be
     // enqueued.
-    backend.registerStaticUse(element, forResolution: false);
+    backend.registerStaticUse(compiler.enqueuer.codegen, element);
 
     if (backend.isJsInterop(element) && !element.isFactoryConstructor) {
       // We only inline factory JavaScript interop constructors.
@@ -437,7 +459,7 @@
       // A generative constructor body is not seen by global analysis,
       // so we should not query for its type.
       if (!element.isGenerativeConstructorBody) {
-        if (inferenceResults.throwsAlways(element)) {
+        if (inferenceResults.resultOf(element).throwsAlways) {
           isReachable = false;
           return false;
         }
@@ -569,12 +591,10 @@
     return inliningStack.isEmpty || inliningStack.last.allFunctionsCalledOnce;
   }
 
-  bool isFunctionCalledOnce(Element element) {
-    if (element is ConstructorBodyElement) {
-      // ConstructorBodyElements are not in the type inference graph.
-      return false;
-    }
-    return inferenceResults.isCalledOnce(element);
+  bool isFunctionCalledOnce(element) {
+    // ConstructorBodyElements are not in the type inference graph.
+    if (element is ConstructorBodyElement) return false;
+    return inferenceResults.resultOf(element).isCalledOnce;
   }
 
   bool isCalledOnce(Element element) {
@@ -869,6 +889,7 @@
     returnLocal = state.oldReturnLocal;
     inTryStatement = state.inTryStatement;
     resolvedAst = state.oldResolvedAst;
+    elementInferenceResults = state.oldElementInferenceResults;
     returnType = state.oldReturnType;
     assert(stack.isEmpty);
     stack = state.oldStack;
@@ -1001,6 +1022,8 @@
       // Build the initializers in the context of the new constructor.
       ResolvedAst oldResolvedAst = resolvedAst;
       resolvedAst = callee.resolvedAst;
+      final oldElementInferenceResults = elementInferenceResults;
+      elementInferenceResults = inferenceResults.resultOf(callee);
       ClosureClassMap oldClosureData = localsHandler.closureData;
       ClosureClassMap newClosureData =
           compiler.closureToClassMapper.getClosureToClassMapping(resolvedAst);
@@ -1011,6 +1034,7 @@
       buildInitializers(callee, constructorResolvedAsts, fieldValues);
       localsHandler.closureData = oldClosureData;
       resolvedAst = oldResolvedAst;
+      elementInferenceResults = oldElementInferenceResults;
     });
   }
 
@@ -1173,11 +1197,14 @@
           ast.Node right = initializer;
           ResolvedAst savedResolvedAst = resolvedAst;
           resolvedAst = fieldResolvedAst;
+          final oldElementInferenceResults = elementInferenceResults;
+          elementInferenceResults = inferenceResults.resultOf(member);
           // In case the field initializer uses closures, run the
           // closure to class mapper.
           compiler.closureToClassMapper.getClosureToClassMapping(resolvedAst);
           inlinedFrom(fieldResolvedAst, () => right.accept(this));
           resolvedAst = savedResolvedAst;
+          elementInferenceResults = oldElementInferenceResults;
           fieldValues[member] = pop();
         }
       });
@@ -2070,7 +2097,7 @@
     }
 
     pushInvokeDynamic(node, elements.getSelector(node),
-        inferenceResults.typeOfSend(node, elements), [operand],
+        elementInferenceResults.typeOfSend(node), [operand],
         sourceInformation: sourceInformationBuilder.buildGeneric(node));
   }
 
@@ -2101,7 +2128,7 @@
         visitAndPop(left),
         visitAndPop(right),
         elements.getSelector(node),
-        inferenceResults.typeOfSend(node, elements),
+        elementInferenceResults.typeOfSend(node),
         node,
         sourceInformation:
             sourceInformationBuilder.buildGeneric(node.selector));
@@ -2264,7 +2291,7 @@
   void generateDynamicGet(ast.Send node) {
     HInstruction receiver = generateInstanceSendReceiver(node);
     generateInstanceGetterWithCompiledReceiver(node, elements.getSelector(node),
-        inferenceResults.typeOfSend(node, elements), receiver);
+        elementInferenceResults.typeOfSend(node), receiver);
   }
 
   /// Generate a closurization of the static or top level [method].
@@ -2314,7 +2341,7 @@
           generateInstanceGetterWithCompiledReceiver(
               node,
               elements.getSelector(node),
-              inferenceResults.typeOfSend(node, elements),
+              elementInferenceResults.typeOfSend(node),
               expression);
         });
   }
@@ -2379,7 +2406,7 @@
     if (selector == null) {
       assert(send != null);
       selector = elements.getSelector(send);
-      mask ??= inferenceResults.typeOfSend(send, elements);
+      mask ??= elementInferenceResults.typeOfSend(send);
     }
     if (location == null) {
       assert(send != null);
@@ -2650,7 +2677,7 @@
 
   void _generateDynamicSend(ast.Send node, HInstruction receiver) {
     Selector selector = elements.getSelector(node);
-    TypeMask mask = inferenceResults.typeOfSend(node, elements);
+    TypeMask mask = elementInferenceResults.typeOfSend(node);
     SourceInformation sourceInformation =
         sourceInformationBuilder.buildCall(node, node.selector);
 
@@ -3134,7 +3161,7 @@
     if (!Selectors.noSuchMethod_.signatureApplies(element)) {
       element = coreClasses.objectClass.lookupMember(Identifiers.noSuchMethod_);
     }
-    if (compiler.enabledInvokeOn && !element.enclosingClass.isObject) {
+    if (backend.hasInvokeOnSupport && !element.enclosingClass.isObject) {
       // Register the call as dynamic if [noSuchMethod] on the super
       // class is _not_ the default implementation from [Object], in
       // case the [noSuchMethod] implementation calls
@@ -4430,7 +4457,7 @@
         receiver,
         rhs,
         elements.getOperatorSelectorInComplexSendSet(node),
-        inferenceResults.typeOfOperator(node, elements),
+        elementInferenceResults.typeOfOperator(node),
         node,
         sourceInformation:
             sourceInformationBuilder.buildGeneric(node.assignmentOperator));
@@ -4793,7 +4820,7 @@
       }
 
       pushInvokeDynamic(node, elements.getGetterSelectorInComplexSendSet(node),
-          inferenceResults.typeOfGetter(node, elements), [receiver, index]);
+          elementInferenceResults.typeOfGetter(node), [receiver, index]);
       HInstruction getterInstruction = pop();
       if (node.isIfNullAssignment) {
         // Compile x[i] ??= e as:
@@ -4808,7 +4835,7 @@
           pushInvokeDynamic(
               node,
               elements.getSelector(node),
-              inferenceResults.typeOfSend(node, elements),
+              elementInferenceResults.typeOfSend(node),
               [receiver, index, value]);
           pop();
           stack.add(value);
@@ -4816,11 +4843,8 @@
       } else {
         handleComplexOperatorSend(node, getterInstruction, arguments);
         HInstruction value = pop();
-        pushInvokeDynamic(
-            node,
-            elements.getSelector(node),
-            inferenceResults.typeOfSend(node, elements),
-            [receiver, index, value]);
+        pushInvokeDynamic(node, elements.getSelector(node),
+            elementInferenceResults.typeOfSend(node), [receiver, index, value]);
         pop();
         if (node.isPostfix) {
           stack.add(getterInstruction);
@@ -5024,7 +5048,7 @@
         generateInstanceGetterWithCompiledReceiver(
             node,
             elements.getGetterSelectorInComplexSendSet(node),
-            inferenceResults.typeOfGetter(node, elements),
+            elementInferenceResults.typeOfGetter(node),
             receiver);
         HInstruction getterInstruction = pop();
         if (node.isIfNullAssignment) {
@@ -5487,8 +5511,8 @@
   }
 
   _inferredTypeOfNewList(ast.Node node) =>
-      inferenceResults.typeOfNewList(sourceElement, node) ??
-      compiler.commonMasks.dynamicType;
+      _resultOf(sourceElement).typeOfNewList(node) ??
+      compiler.closedWorld.commonMasks.dynamicType;
 
   visitConditional(ast.Conditional node) {
     SsaBranchBuilder brancher = new SsaBranchBuilder(this, compiler, node);
@@ -5583,7 +5607,7 @@
 
     HInstruction buildCondition() {
       Selector selector = Selectors.moveNext;
-      TypeMask mask = inferenceResults.typeOfIteratorMoveNext(node, elements);
+      TypeMask mask = elementInferenceResults.typeOfIteratorMoveNext(node);
       pushInvokeDynamic(node, selector, mask, [streamIterator]);
       HInstruction future = pop();
       push(new HAwait(
@@ -5595,8 +5619,7 @@
 
     void buildBody() {
       Selector call = Selectors.current;
-      TypeMask callMask =
-          inferenceResults.typeOfIteratorCurrent(node, elements);
+      TypeMask callMask = elementInferenceResults.typeOfIteratorCurrent(node);
       pushInvokeDynamic(node, call, callMask, [streamIterator]);
 
       ast.Node identifier = node.declaredIdentifier;
@@ -5605,7 +5628,7 @@
       HInstruction value = pop();
       if (identifier.asSend() != null &&
           Elements.isInstanceSend(identifier, elements)) {
-        TypeMask mask = inferenceResults.typeOfSend(identifier, elements);
+        TypeMask mask = elementInferenceResults.typeOfSend(identifier);
         HInstruction receiver = generateInstanceSendReceiver(identifier);
         assert(receiver != null);
         generateInstanceSetterWithCompiledReceiver(null, receiver, value,
@@ -5644,7 +5667,7 @@
     // method is inlined.  We would require full scalar replacement in that
     // case.
 
-    TypeMask mask = inferenceResults.typeOfIterator(node, elements);
+    TypeMask mask = elementInferenceResults.typeOfIterator(node);
 
     ClosedWorld closedWorld = compiler.closedWorld;
     if (mask != null &&
@@ -5669,7 +5692,7 @@
 
     void buildInitializer() {
       Selector selector = Selectors.iterator;
-      TypeMask mask = inferenceResults.typeOfIterator(node, elements);
+      TypeMask mask = elementInferenceResults.typeOfIterator(node);
       visit(node.expression);
       HInstruction receiver = pop();
       pushInvokeDynamic(node, selector, mask, [receiver]);
@@ -5678,14 +5701,14 @@
 
     HInstruction buildCondition() {
       Selector selector = Selectors.moveNext;
-      TypeMask mask = inferenceResults.typeOfIteratorMoveNext(node, elements);
+      TypeMask mask = elementInferenceResults.typeOfIteratorMoveNext(node);
       pushInvokeDynamic(node, selector, mask, [iterator]);
       return popBoolified();
     }
 
     void buildBody() {
       Selector call = Selectors.current;
-      TypeMask mask = inferenceResults.typeOfIteratorCurrent(node, elements);
+      TypeMask mask = elementInferenceResults.typeOfIteratorCurrent(node);
       pushInvokeDynamic(node, call, mask, [iterator]);
       buildAssignLoopVariable(node, pop());
       visit(node.body);
@@ -5702,7 +5725,7 @@
 
     if (identifier.asSend() != null &&
         Elements.isInstanceSend(identifier, elements)) {
-      TypeMask mask = inferenceResults.typeOfSend(identifier, elements);
+      TypeMask mask = elementInferenceResults.typeOfSend(identifier);
       HInstruction receiver = generateInstanceSendReceiver(identifier);
       assert(receiver != null);
       generateInstanceSetterWithCompiledReceiver(null, receiver, value,
@@ -6641,8 +6664,10 @@
         stack,
         localsHandler,
         inTryStatement,
-        allInlinedFunctionsCalledOnce && isFunctionCalledOnce(function));
+        isCalledOnce(function),
+        elementInferenceResults);
     resolvedAst = functionResolvedAst;
+    elementInferenceResults = _resultOf(function);
     inliningStack.add(state);
 
     // Setting up the state of the (AST) builder is performed even when the
@@ -6963,6 +6988,7 @@
   final LocalsHandler oldLocalsHandler;
   final bool inTryStatement;
   final bool allFunctionsCalledOnce;
+  final GlobalTypeInferenceElementResult oldElementInferenceResults;
 
   AstInliningState(
       FunctionElement function,
@@ -6972,7 +6998,8 @@
       this.oldStack,
       this.oldLocalsHandler,
       this.inTryStatement,
-      this.allFunctionsCalledOnce)
+      this.allFunctionsCalledOnce,
+      this.oldElementInferenceResults)
       : super(function);
 }
 
diff --git a/pkg/compiler/lib/src/ssa/codegen.dart b/pkg/compiler/lib/src/ssa/codegen.dart
index 968f9e0..5248f91 100644
--- a/pkg/compiler/lib/src/ssa/codegen.dart
+++ b/pkg/compiler/lib/src/ssa/codegen.dart
@@ -1933,7 +1933,8 @@
   void registerForeignTypes(HForeign node) {
     native.NativeBehavior nativeBehavior = node.nativeBehavior;
     if (nativeBehavior == null) return;
-    nativeEnqueuer.registerNativeBehavior(nativeBehavior, node);
+    nativeEnqueuer.registerNativeBehavior(
+        registry.worldImpact, nativeBehavior, node);
   }
 
   visitForeignCode(HForeignCode node) {
diff --git a/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart b/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart
index ae86379..1ba818c 100644
--- a/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart
+++ b/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart
@@ -63,9 +63,11 @@
 
   Compiler get _compiler => _backend.compiler;
   TreeElements get elements => _resolvedAst.elements;
-  GlobalTypeInferenceResults get _inferenceResults =>
-      _compiler.globalInference.results;
   DiagnosticReporter get reporter => _compiler.reporter;
+  Element get _target => _resolvedAst.element;
+
+  GlobalTypeInferenceElementResult _resultOf(Element e) =>
+      _compiler.globalInference.results.resultOf(e);
 
   ConstantValue getConstantForSymbol(ir.SymbolLiteral node) {
     ast.Node astNode = getNode(node);
@@ -163,35 +165,33 @@
   }
 
   TypeMask typeOfInvocation(ir.Expression send) {
-    return _inferenceResults.typeOfSend(getNode(send), elements);
+    return _resultOf(_target).typeOfSend(getNode(send));
   }
 
   TypeMask typeOfGet(ir.PropertyGet getter) {
-    return _inferenceResults.typeOfSend(getNode(getter), elements);
+    return _resultOf(_target).typeOfSend(getNode(getter));
   }
 
   TypeMask typeOfSend(ir.Expression send) {
     assert(send is ir.InvocationExpression || send is ir.PropertyGet);
-    return _inferenceResults.typeOfSend(getNode(send), elements);
+    return _resultOf(_target).typeOfSend(getNode(send));
   }
 
   TypeMask typeOfNewList(Element owner, ir.ListLiteral listLiteral) {
-    return _inferenceResults.typeOfNewList(owner, getNode(listLiteral)) ??
-        _compiler.commonMasks.dynamicType;
+    return _resultOf(owner).typeOfNewList(getNode(listLiteral)) ??
+        _compiler.closedWorld.commonMasks.dynamicType;
   }
 
   TypeMask typeOfIterator(ir.ForInStatement forInStatement) {
-    return _inferenceResults.typeOfIterator(getNode(forInStatement), elements);
+    return _resultOf(_target).typeOfIterator(getNode(forInStatement));
   }
 
   TypeMask typeOfIteratorCurrent(ir.ForInStatement forInStatement) {
-    return _inferenceResults.typeOfIteratorCurrent(
-        getNode(forInStatement), elements);
+    return _resultOf(_target).typeOfIteratorCurrent(getNode(forInStatement));
   }
 
   TypeMask typeOfIteratorMoveNext(ir.ForInStatement forInStatement) {
-    return _inferenceResults.typeOfIteratorMoveNext(
-        getNode(forInStatement), elements);
+    return _resultOf(_target).typeOfIteratorMoveNext(getNode(forInStatement));
   }
 
   bool isJsIndexableIterator(ir.ForInStatement forInStatement) {
diff --git a/pkg/compiler/lib/src/ssa/types.dart b/pkg/compiler/lib/src/ssa/types.dart
index 18ed76c..f145aff 100644
--- a/pkg/compiler/lib/src/ssa/types.dart
+++ b/pkg/compiler/lib/src/ssa/types.dart
@@ -14,46 +14,46 @@
 class TypeMaskFactory {
   static TypeMask inferredReturnTypeForElement(
       Element element, Compiler compiler) {
-    return compiler.globalInference.results.returnTypeOf(element) ??
-        compiler.commonMasks.dynamicType;
+    return compiler.globalInference.results.resultOf(element).returnType ??
+        compiler.closedWorld.commonMasks.dynamicType;
   }
 
   static TypeMask inferredTypeForElement(Element element, Compiler compiler) {
-    return compiler.globalInference.results.typeOf(element) ??
-        compiler.commonMasks.dynamicType;
+    return compiler.globalInference.results.resultOf(element).type ??
+        compiler.closedWorld.commonMasks.dynamicType;
   }
 
   static TypeMask inferredTypeForSelector(
       Selector selector, TypeMask mask, Compiler compiler) {
     return compiler.globalInference.results.typeOfSelector(selector, mask) ??
-        compiler.commonMasks.dynamicType;
+        compiler.closedWorld.commonMasks.dynamicType;
   }
 
   static TypeMask fromNativeBehavior(
       native.NativeBehavior nativeBehavior, Compiler compiler) {
+    ClosedWorld closedWorld = compiler.closedWorld;
+    CommonMasks commonMasks = closedWorld.commonMasks;
     var typesReturned = nativeBehavior.typesReturned;
-    if (typesReturned.isEmpty) return compiler.commonMasks.dynamicType;
+    if (typesReturned.isEmpty) return commonMasks.dynamicType;
 
-    ClosedWorld world = compiler.closedWorld;
-    CommonMasks commonMasks = compiler.commonMasks;
-    CoreClasses coreClasses = compiler.coreClasses;
+    CoreClasses coreClasses = closedWorld.coreClasses;
 
     // [type] is either an instance of [DartType] or special objects
     // like [native.SpecialType.JsObject].
     TypeMask fromNativeType(dynamic type) {
       if (type == native.SpecialType.JsObject) {
-        return new TypeMask.nonNullExact(coreClasses.objectClass, world);
+        return new TypeMask.nonNullExact(coreClasses.objectClass, closedWorld);
       }
 
       if (type.isVoid) return commonMasks.nullType;
       if (type.element == coreClasses.nullClass) return commonMasks.nullType;
       if (type.treatAsDynamic) return commonMasks.dynamicType;
-      return new TypeMask.nonNullSubtype(type.element, world);
+      return new TypeMask.nonNullSubtype(type.element, closedWorld);
     }
 
     TypeMask result = typesReturned
         .map(fromNativeType)
-        .reduce((t1, t2) => t1.union(t2, compiler.closedWorld));
+        .reduce((t1, t2) => t1.union(t2, closedWorld));
     assert(!result.isEmpty);
     return result;
   }
diff --git a/pkg/compiler/lib/src/types/constants.dart b/pkg/compiler/lib/src/types/constants.dart
index 8c3f6b7..60dbd90 100644
--- a/pkg/compiler/lib/src/types/constants.dart
+++ b/pkg/compiler/lib/src/types/constants.dart
@@ -22,7 +22,7 @@
   TypeMask visitConstructed(
       ConstructedConstantValue constant, Compiler compiler) {
     if (compiler.backend.isInterceptorClass(constant.type.element)) {
-      return compiler.commonMasks.nonNullType;
+      return compiler.closedWorld.commonMasks.nonNullType;
     }
     return new TypeMask.nonNullExact(
         constant.type.element, compiler.closedWorld);
@@ -38,13 +38,13 @@
     // We have to recognize double constants that are 'is int'.
     if (compiler.backend.constantSystem.isInt(constant)) {
       if (constant.isMinusZero) {
-        return compiler.commonMasks.uint31Type;
+        return compiler.closedWorld.commonMasks.uint31Type;
       } else {
         assert(constant.isPositiveInfinity || constant.isNegativeInfinity);
-        return compiler.commonMasks.intType;
+        return compiler.closedWorld.commonMasks.intType;
       }
     }
-    return compiler.commonMasks.doubleType;
+    return compiler.closedWorld.commonMasks.doubleType;
   }
 
   @override
@@ -55,9 +55,9 @@
       case SyntheticConstantKind.EMPTY_VALUE:
         return constant.payload;
       case SyntheticConstantKind.TYPEVARIABLE_REFERENCE:
-        return compiler.commonMasks.intType;
+        return compiler.closedWorld.commonMasks.intType;
       case SyntheticConstantKind.NAME:
-        return compiler.commonMasks.stringType;
+        return compiler.closedWorld.commonMasks.stringType;
       default:
         DiagnosticReporter reporter = compiler.reporter;
         reporter.internalError(
@@ -68,55 +68,56 @@
 
   @override
   TypeMask visitBool(BoolConstantValue constant, Compiler compiler) {
-    return compiler.commonMasks.boolType;
+    return compiler.closedWorld.commonMasks.boolType;
   }
 
   @override
   TypeMask visitFunction(FunctionConstantValue constant, Compiler compiler) {
-    return compiler.commonMasks.functionType;
+    return compiler.closedWorld.commonMasks.functionType;
   }
 
   @override
   TypeMask visitInt(IntConstantValue constant, Compiler compiler) {
-    if (constant.isUInt31()) return compiler.commonMasks.uint31Type;
-    if (constant.isUInt32()) return compiler.commonMasks.uint32Type;
-    if (constant.isPositive()) return compiler.commonMasks.positiveIntType;
-    return compiler.commonMasks.intType;
+    if (constant.isUInt31()) return compiler.closedWorld.commonMasks.uint31Type;
+    if (constant.isUInt32()) return compiler.closedWorld.commonMasks.uint32Type;
+    if (constant.isPositive())
+      return compiler.closedWorld.commonMasks.positiveIntType;
+    return compiler.closedWorld.commonMasks.intType;
   }
 
   @override
   TypeMask visitInterceptor(
       InterceptorConstantValue constant, Compiler compiler) {
-    return compiler.commonMasks.nonNullType;
+    return compiler.closedWorld.commonMasks.nonNullType;
   }
 
   @override
   TypeMask visitList(ListConstantValue constant, Compiler compiler) {
-    return compiler.commonMasks.constListType;
+    return compiler.closedWorld.commonMasks.constListType;
   }
 
   @override
   TypeMask visitMap(MapConstantValue constant, Compiler compiler) {
-    return compiler.commonMasks.constMapType;
+    return compiler.closedWorld.commonMasks.constMapType;
   }
 
   @override
   TypeMask visitNull(NullConstantValue constant, Compiler compiler) {
-    return compiler.commonMasks.nullType;
+    return compiler.closedWorld.commonMasks.nullType;
   }
 
   @override
   TypeMask visitNonConstant(NonConstantValue constant, Compiler compiler) {
-    return compiler.commonMasks.nullType;
+    return compiler.closedWorld.commonMasks.nullType;
   }
 
   @override
   TypeMask visitString(StringConstantValue constant, Compiler compiler) {
-    return compiler.commonMasks.stringType;
+    return compiler.closedWorld.commonMasks.stringType;
   }
 
   @override
   TypeMask visitType(TypeConstantValue constant, Compiler compiler) {
-    return compiler.commonMasks.typeType;
+    return compiler.closedWorld.commonMasks.typeType;
   }
 }
diff --git a/pkg/compiler/lib/src/types/flat_type_mask.dart b/pkg/compiler/lib/src/types/flat_type_mask.dart
index ce6cd55..b93b1e6 100644
--- a/pkg/compiler/lib/src/types/flat_type_mask.dart
+++ b/pkg/compiler/lib/src/types/flat_type_mask.dart
@@ -573,10 +573,9 @@
             : (isSubclass ? ClassQuery.SUBCLASS : ClassQuery.SUBTYPE));
   }
 
-  Element locateSingleElement(Selector selector, Compiler compiler) {
+  Element locateSingleElement(Selector selector, ClosedWorld closedWorld) {
     if (isEmptyOrNull) return null;
-    Iterable<Element> targets =
-        compiler.closedWorld.allFunctions.filter(selector, this);
+    Iterable<Element> targets = closedWorld.allFunctions.filter(selector, this);
     if (targets.length != 1) return null;
     Element result = targets.first;
     ClassElement enclosing = result.enclosingClass.declaration;
@@ -584,7 +583,6 @@
     // all classes in the receiver type [this]. It could be found only in a
     // subclass or in an inheritance-wise unrelated class in case of subtype
     // selectors.
-    ClosedWorld closedWorld = compiler.closedWorld;
     if (isSubtype) {
       // if (closedWorld.isUsedAsMixin(enclosing)) {
       if (closedWorld.everySubtypeIsSubclassOfOrMixinUseOf(base, enclosing)) {
diff --git a/pkg/compiler/lib/src/types/forwarding_type_mask.dart b/pkg/compiler/lib/src/types/forwarding_type_mask.dart
index f285a59..775fee0 100644
--- a/pkg/compiler/lib/src/types/forwarding_type_mask.dart
+++ b/pkg/compiler/lib/src/types/forwarding_type_mask.dart
@@ -101,8 +101,8 @@
     return forwardTo.canHit(element, selector, closedWorld);
   }
 
-  Element locateSingleElement(Selector selector, Compiler compiler) {
-    return forwardTo.locateSingleElement(selector, compiler);
+  Element locateSingleElement(Selector selector, ClosedWorld closedWorld) {
+    return forwardTo.locateSingleElement(selector, closedWorld);
   }
 
   bool equalsDisregardNull(other) {
diff --git a/pkg/compiler/lib/src/types/masks.dart b/pkg/compiler/lib/src/types/masks.dart
index 8577558..5cbc4c0 100644
--- a/pkg/compiler/lib/src/types/masks.dart
+++ b/pkg/compiler/lib/src/types/masks.dart
@@ -33,11 +33,9 @@
 class CommonMasks {
   // TODO(sigmund): once we split out the backend common elements, depend
   // directly on those instead.
-  final Compiler compiler;
+  final ClosedWorld closedWorld;
 
-  CommonMasks(this.compiler);
-
-  ClosedWorld get closedWorld => compiler.closedWorld;
+  CommonMasks(this.closedWorld);
 
   BackendClasses get backendClasses => closedWorld.backendClasses;
 
diff --git a/pkg/compiler/lib/src/types/type_mask.dart b/pkg/compiler/lib/src/types/type_mask.dart
index a3ba10d..c91fac6 100644
--- a/pkg/compiler/lib/src/types/type_mask.dart
+++ b/pkg/compiler/lib/src/types/type_mask.dart
@@ -356,5 +356,5 @@
    * on this mask. Returns null if there is none.
    */
   // TODO(johnniwinther): Move this method to [World].
-  Element locateSingleElement(Selector selector, Compiler compiler);
+  Element locateSingleElement(Selector selector, ClosedWorld closedWorld);
 }
diff --git a/pkg/compiler/lib/src/types/types.dart b/pkg/compiler/lib/src/types/types.dart
index ad890dc..c078298 100644
--- a/pkg/compiler/lib/src/types/types.dart
+++ b/pkg/compiler/lib/src/types/types.dart
@@ -4,17 +4,165 @@
 
 library types;
 
+import '../closure.dart' show SynthesizedCallMethodElementX;
+import '../common.dart' show invariant;
 import '../common/tasks.dart' show CompilerTask;
 import '../compiler.dart' show Compiler;
 import '../elements/elements.dart';
-import '../inferrer/type_graph_inferrer.dart' show TypeGraphInferrer;
+import '../inferrer/type_graph_inferrer.dart'
+    show TypeGraphInferrer, TypeInformationSystem;
 import '../tree/tree.dart';
-import '../resolution/tree_elements.dart';
 import '../universe/selector.dart' show Selector;
+import '../util/util.dart' show Maplet;
 
 import 'masks.dart';
 export 'masks.dart';
 
+/// Results about a single element (e.g. a method, parameter, or field)
+/// produced by the global type-inference algorithm.
+///
+/// All queries in this class may contain results that assume whole-program
+/// closed-world semantics. Any [TypeMask] for an element or node that we return
+/// was inferred to be a "guaranteed type", that means, it is a type that we
+/// can prove to be correct for all executions of the program.  A trivial
+/// implementation would return false on all boolean properties (giving no
+/// guarantees) and the `subclass of Object or null` type mask for the type
+/// based queries (the runtime value could be anything).
+abstract class GlobalTypeInferenceElementResult {
+  /// Whether the method element associated with this result always throws.
+  bool get throwsAlways;
+
+  /// Whether the element associated with this result is only called once in one
+  /// location in the entire program.
+  bool get isCalledOnce;
+
+  /// The inferred type when this result belongs to a parameter or field
+  /// element, null otherwise.
+  TypeMask get type;
+
+  /// The inferred return type when this result belongs to a function element.
+  TypeMask get returnType;
+
+  /// Returns the type of a list allocation [node] (which can be a list
+  /// literal or a list new expression).
+  TypeMask typeOfNewList(Node node);
+
+  /// Returns the type of a send [node].
+  TypeMask typeOfSend(Node node);
+
+  /// Returns the type of the operator of a complex send-set [node], for
+  /// example, the type of `+` in `a += b`.
+  TypeMask typeOfGetter(SendSet node);
+
+  /// Returns the type of the getter in a complex send-set [node], for example,
+  /// the type of the `a.f` getter in `a.f += b`.
+  TypeMask typeOfOperator(SendSet node);
+
+  /// Returns the type of the iterator in a [loop].
+  TypeMask typeOfIterator(ForIn node);
+
+  /// Returns the type of the `moveNext` call of an iterator in a [loop].
+  TypeMask typeOfIteratorMoveNext(ForIn node);
+
+  /// Returns the type of the `current` getter of an iterator in a [loop].
+  TypeMask typeOfIteratorCurrent(ForIn node);
+}
+
+class GlobalTypeInferenceElementResultImpl
+    implements GlobalTypeInferenceElementResult {
+  // TODO(sigmund): delete, store data directly here.
+  final Element _owner;
+
+  // TODO(sigmund): split - stop using _data after inference is done.
+  final GlobalTypeInferenceElementData _data;
+
+  // TODO(sigmund): store relevant data & drop reference to inference engine.
+  final TypesInferrer _inferrer;
+  final bool _isJsInterop;
+  final TypeMask _dynamic;
+
+  GlobalTypeInferenceElementResultImpl(this._owner, this._data, this._inferrer,
+      this._isJsInterop, this._dynamic);
+
+  bool get isCalledOnce => _inferrer.isCalledOnce(_owner);
+
+  TypeMask get returnType =>
+      _isJsInterop ? _dynamic : _inferrer.getReturnTypeOfElement(_owner);
+
+  TypeMask get type =>
+      _isJsInterop ? _dynamic : _inferrer.getTypeOfElement(_owner);
+
+  bool get throwsAlways {
+    TypeMask mask = this.returnType;
+    // Always throws if the return type was inferred to be non-null empty.
+    return mask != null && mask.isEmpty;
+  }
+
+  TypeMask typeOfNewList(Node node) =>
+      _inferrer.getTypeForNewList(_owner, node);
+
+  TypeMask typeOfSend(Node node) => _data?.typeOfSend(node);
+  TypeMask typeOfGetter(SendSet node) => _data?.typeOfGetter(node);
+  TypeMask typeOfOperator(SendSet node) => _data?.typeOfOperator(node);
+  TypeMask typeOfIterator(ForIn node) => _data?.typeOfIterator(node);
+  TypeMask typeOfIteratorMoveNext(ForIn node) =>
+      _data?.typeOfIteratorMoveNext(node);
+  TypeMask typeOfIteratorCurrent(ForIn node) =>
+      _data?.typeOfIteratorCurrent(node);
+}
+
+/// Internal data used during type-inference to store intermediate results about
+/// a single element.
+class GlobalTypeInferenceElementData {
+  Map<Object, TypeMask> _typeMasks;
+
+  TypeMask _get(Object node) => _typeMasks != null ? _typeMasks[node] : null;
+  void _set(Object node, TypeMask mask) {
+    _typeMasks ??= new Maplet<Object, TypeMask>();
+    _typeMasks[node] = mask;
+  }
+
+  TypeMask typeOfSend(Node node) => _get(node);
+  TypeMask typeOfGetter(SendSet node) => _get(node.selector);
+  TypeMask typeOfOperator(SendSet node) => _get(node.assignmentOperator);
+
+  void setTypeMask(Node node, TypeMask mask) {
+    _set(node, mask);
+  }
+
+  void setGetterTypeMaskInComplexSendSet(SendSet node, TypeMask mask) {
+    _set(node.selector, mask);
+  }
+
+  void setOperatorTypeMaskInComplexSendSet(SendSet node, TypeMask mask) {
+    _set(node.assignmentOperator, mask);
+  }
+
+  // TODO(sigmund): clean up. We store data about 3 selectors for "for in"
+  // nodes: the iterator, move-next, and current element. Because our map keys
+  // are nodes, we need to fabricate different keys to keep these selectors
+  // separate. The current implementation does this by using
+  // children of the for-in node (these children were picked arbitrarily).
+
+  TypeMask typeOfIterator(ForIn node) => _get(node);
+
+  TypeMask typeOfIteratorMoveNext(ForIn node) => _get(node.forToken);
+
+  TypeMask typeOfIteratorCurrent(ForIn node) => _get(node.inToken);
+
+  void setIteratorTypeMask(ForIn node, TypeMask mask) {
+    _set(node, mask);
+  }
+
+  void setMoveNextTypeMask(ForIn node, TypeMask mask) {
+    _set(node.forToken, mask);
+  }
+
+  void setCurrentTypeMask(ForIn node, TypeMask mask) {
+    _set(node.inToken, mask);
+  }
+}
+
 /// API to interact with the global type-inference engine.
 abstract class TypesInferrer {
   void analyzeMain(Element element);
@@ -35,91 +183,48 @@
 /// can prove to be correct for all executions of the program.
 class GlobalTypeInferenceResults {
   // TODO(sigmund): store relevant data & drop reference to inference engine.
-  final TypesInferrer _inferrer;
+  final TypeGraphInferrer _inferrer;
   final Compiler compiler;
   final TypeMask dynamicType;
+  final Map<Element, GlobalTypeInferenceElementResult> _elementResults = {};
 
-  GlobalTypeInferenceResults(this._inferrer, this.compiler, CommonMasks masks)
+  // TODO(sigmund,johnniwinther): compute result objects eagerly and make it an
+  // error to query for results that don't exist.
+  GlobalTypeInferenceElementResult resultOf(AstElement element) {
+    assert(invariant(element, !element.isGenerativeConstructorBody,
+        message: "unexpected input: ConstructorBodyElements are created"
+            " after global type inference, no data is avaiable for them."));
+
+    // TODO(sigmund): store closure data directly in the closure element and
+    // not in the context of the enclosing method?
+    var key = (element is SynthesizedCallMethodElementX)
+        ? element.memberContext
+        : element;
+    return _elementResults.putIfAbsent(
+        element,
+        () => new GlobalTypeInferenceElementResultImpl(
+            element,
+            _inferrer.inferrer.inTreeData[key],
+            _inferrer,
+            compiler.backend.isJsInterop(element),
+            dynamicType));
+  }
+
+  GlobalTypeInferenceResults(this._inferrer, this.compiler, CommonMasks masks,
+      TypeInformationSystem types)
       : dynamicType = masks.dynamicType;
 
-  /// Returns the type of a parameter or field [element], if any.
-  TypeMask typeOf(Element element) {
-    // TODO(24489): trust some JsInterop types.
-    if (compiler.backend.isJsInterop(element)) return dynamicType;
-    return _inferrer.getTypeOfElement(element);
-  }
-
-  /// Returns the return type of a method or function [element].
-  TypeMask returnTypeOf(Element element) {
-    // TODO(24489): trust some JsInterop types.
-    if (compiler.backend.isJsInterop(element)) return dynamicType;
-    return _inferrer.getReturnTypeOfElement(element);
-  }
-
   /// Returns the type of a [selector] when applied to a receiver with the given
   /// type [mask].
   TypeMask typeOfSelector(Selector selector, TypeMask mask) =>
       _inferrer.getTypeOfSelector(selector, mask);
 
-  /// Returns whether the method [element] always throws.
-  bool throwsAlways(Element element) {
-    // We know the element always throws if the return type was inferred to be
-    // non-null empty.
-    TypeMask returnType = returnTypeOf(element);
-    return returnType != null && returnType.isEmpty;
-  }
-
-  /// Returns whether [element] is only called once in the entire program.
-  bool isCalledOnce(Element element) => _inferrer.isCalledOnce(element);
-
-  // TODO(sigmund): introduce a new class [ElementInferenceResult] that can be
-  // used to collect any information that is specific about the body within a
-  // single element (basically everything below this line). We could consider
-  // moving some of the functions above too, for example:
-  //    results.throwsAlways(element)
-  // could become:
-  //    results[element].alwaysThrows;
-  //
-
-  /// Returns the type of a list allocation [node] occuring within [owner].
-  ///
-  /// [node] can be a list literal or a list new expression.
-  TypeMask typeOfNewList(Element owner, Node node) =>
-      _inferrer.getTypeForNewList(owner, node);
-
   /// Returns whether a fixed-length constructor call goes through a growable
   /// check.
+  // TODO(sigmund): move into the result of the element containing such
+  // constructor call.
   bool isFixedArrayCheckedForGrowable(Node ctorCall) =>
       _inferrer.isFixedArrayCheckedForGrowable(ctorCall);
-
-  /// Returns the type of a send [node].
-  TypeMask typeOfSend(
-          Node node,
-          // TODO(sigmund): move inference data out of TreeElements
-          TreeElements elements) =>
-      elements.getTypeMask(node);
-
-  /// Returns the type of the operator of a complex send-set [node], for
-  /// example, the type of `+` in `a += b`.
-  TypeMask typeOfOperator(Send node, TreeElements elements) =>
-      elements.getOperatorTypeMaskInComplexSendSet(node);
-
-  /// Returns the type of the getter in a complex send-set [node], for example,
-  /// the type of the `a.f` getter in `a.f += b`.
-  TypeMask typeOfGetter(node, elements) =>
-      elements.getGetterTypeMaskInComplexSendSet(node);
-
-  /// Returns the type of the iterator in a [loop].
-  TypeMask typeOfIterator(ForIn loop, elements) =>
-      elements.getIteratorTypeMask(loop);
-
-  /// Returns the type of the `moveNext` call of an iterator in a [loop].
-  TypeMask typeOfIteratorMoveNext(ForIn loop, elements) =>
-      elements.getMoveNextTypeMask(loop);
-
-  /// Returns the type of the `current` getter of an iterator in a [loop].
-  TypeMask typeOfIteratorCurrent(ForIn node, elements) =>
-      elements.getCurrentTypeMask(node);
 }
 
 /// Global analysis that infers concrete types.
@@ -128,23 +233,26 @@
   final String name = 'Type inference';
 
   final Compiler compiler;
-  TypesInferrer typesInferrer;
-  CommonMasks masks;
+
+  /// The [TypeGraphInferrer] used by the global type inference. This should by
+  /// accessed from outside this class for testing only.
+  TypeGraphInferrer typesInferrerInternal;
+
   GlobalTypeInferenceResults results;
 
   GlobalTypeInferenceTask(Compiler compiler)
-      : masks = new CommonMasks(compiler),
-        compiler = compiler,
-        super(compiler.measurer) {
-    typesInferrer = new TypeGraphInferrer(compiler, masks);
-  }
+      : compiler = compiler,
+        super(compiler.measurer);
 
   /// Runs the global type-inference algorithm once.
   void runGlobalTypeInference(Element mainElement) {
     measure(() {
-      typesInferrer.analyzeMain(mainElement);
-      typesInferrer.clear();
-      results = new GlobalTypeInferenceResults(typesInferrer, compiler, masks);
+      CommonMasks masks = compiler.closedWorld.commonMasks;
+      typesInferrerInternal ??= new TypeGraphInferrer(compiler, masks);
+      typesInferrerInternal.analyzeMain(mainElement);
+      typesInferrerInternal.clear();
+      results = new GlobalTypeInferenceResults(
+          typesInferrerInternal, compiler, masks, typesInferrerInternal.inferrer.types);
     });
   }
 }
diff --git a/pkg/compiler/lib/src/types/union_type_mask.dart b/pkg/compiler/lib/src/types/union_type_mask.dart
index 49f9b44..eada935 100644
--- a/pkg/compiler/lib/src/types/union_type_mask.dart
+++ b/pkg/compiler/lib/src/types/union_type_mask.dart
@@ -334,10 +334,10 @@
     return disjointMasks.any((e) => e.canHit(element, selector, closedWorld));
   }
 
-  Element locateSingleElement(Selector selector, Compiler compiler) {
+  Element locateSingleElement(Selector selector, ClosedWorld closedWorld) {
     Element candidate;
     for (FlatTypeMask mask in disjointMasks) {
-      Element current = mask.locateSingleElement(selector, compiler);
+      Element current = mask.locateSingleElement(selector, closedWorld);
       if (current == null) {
         return null;
       } else if (candidate == null) {
diff --git a/pkg/compiler/lib/src/universe/function_set.dart b/pkg/compiler/lib/src/universe/function_set.dart
index 677ffc5..0fb0018 100644
--- a/pkg/compiler/lib/src/universe/function_set.dart
+++ b/pkg/compiler/lib/src/universe/function_set.dart
@@ -17,11 +17,9 @@
 // too and stricly they aren't functions. Maybe this needs a better
 // name -- something like ElementSet seems a bit too generic.
 class FunctionSet {
-  final Compiler compiler;
+  final ClosedWorld closedWorld;
   final Map<String, FunctionSetNode> nodes = new Map<String, FunctionSetNode>();
-  FunctionSet(this.compiler);
-
-  ClosedWorld get closedWorld => compiler.closedWorld;
+  FunctionSet(this.closedWorld);
 
   FunctionSetNode newNode(String name) => new FunctionSetNode(name);
 
diff --git a/pkg/compiler/lib/src/universe/use.dart b/pkg/compiler/lib/src/universe/use.dart
index 7cb642e..5876a18 100644
--- a/pkg/compiler/lib/src/universe/use.dart
+++ b/pkg/compiler/lib/src/universe/use.dart
@@ -323,6 +323,8 @@
   CATCH_TYPE,
   TYPE_LITERAL,
   INSTANTIATION,
+  MIRROR_INSTANTIATION,
+  NATIVE_INSTANTIATION,
 }
 
 /// Use of a [DartType].
@@ -366,6 +368,16 @@
     return new TypeUse.internal(type, TypeUseKind.INSTANTIATION);
   }
 
+  /// [type] used in an instantiation through mirrors.
+  factory TypeUse.mirrorInstantiation(InterfaceType type) {
+    return new TypeUse.internal(type, TypeUseKind.MIRROR_INSTANTIATION);
+  }
+
+  /// [type] used in a native instantiation.
+  factory TypeUse.nativeInstantiation(InterfaceType type) {
+    return new TypeUse.internal(type, TypeUseKind.NATIVE_INSTANTIATION);
+  }
+
   bool operator ==(other) {
     if (identical(this, other)) return true;
     if (other is! TypeUse) return false;
diff --git a/pkg/compiler/lib/src/universe/world_builder.dart b/pkg/compiler/lib/src/universe/world_builder.dart
index 470adf3..fa4108a 100644
--- a/pkg/compiler/lib/src/universe/world_builder.dart
+++ b/pkg/compiler/lib/src/universe/world_builder.dart
@@ -6,14 +6,19 @@
 
 import 'dart:collection';
 
+import '../cache_strategy.dart';
 import '../common.dart';
+import '../common/backend_api.dart' show Backend;
+import '../common/resolution.dart' show Resolution;
 import '../compiler.dart' show Compiler;
+import '../core_types.dart' show CoreClasses;
 import '../dart_types.dart';
 import '../elements/elements.dart';
+import '../types/masks.dart' show CommonMasks;
 import '../universe/class_set.dart' show Instantiation;
 import '../util/enumset.dart';
 import '../util/util.dart';
-import '../world.dart' show World, ClosedWorld, OpenWorld;
+import '../world.dart' show World, ClosedWorld, OpenWorld, WorldImpl;
 import 'selector.dart' show Selector;
 import 'use.dart' show DynamicUse, DynamicUseKind, StaticUse, StaticUseKind;
 
@@ -120,7 +125,7 @@
 
   /// Registers that [type] is checked in this universe. The unaliased type is
   /// returned.
-  DartType registerIsCheck(DartType type, Compiler compiler);
+  DartType registerIsCheck(DartType type, Resolution resolution);
 
   /// All directly instantiated types, that is, the types of the directly
   /// instantiated classes.
@@ -162,6 +167,19 @@
   /// Call [f] for all directly or abstractly instantiated classes.
   void forEachInstantiatedClass(
       f(ClassElement cls, EnumSet<Instantiation> instantiations));
+
+  /// `true` of `Object.runtimeType` is supported.
+  bool get hasRuntimeTypeSupport;
+
+  /// `true` of use of the `dart:isolate` library is supported.
+  bool get hasIsolateSupport;
+
+  /// `true` of `Function.apply` is supported.
+  bool get hasFunctionApplySupport;
+
+  /// The [OpenWorld] being created by this world builder.
+  // TODO(johnniwinther): Merge this with [ResolutionWorldBuilder].
+  OpenWorld get openWorld;
 }
 
 class ResolutionWorldBuilderImpl implements ResolutionWorldBuilder {
@@ -236,7 +254,18 @@
 
   final SelectorConstraintsStrategy selectorConstraintsStrategy;
 
-  ResolutionWorldBuilderImpl(this.selectorConstraintsStrategy);
+  bool hasRuntimeTypeSupport = false;
+  bool hasIsolateSupport = false;
+  bool hasFunctionApplySupport = false;
+
+  OpenWorld _openWorld;
+
+  ResolutionWorldBuilderImpl(Backend backend, CoreClasses coreClasses,
+      CacheStrategy cacheStrategy, this.selectorConstraintsStrategy) {
+    _openWorld = new WorldImpl(this, backend, coreClasses, cacheStrategy);
+  }
+
+  OpenWorld get openWorld => _openWorld;
 
   /// All directly instantiated classes, that is, classes with a generative
   /// constructor that has been called directly and not only through a
@@ -365,8 +394,8 @@
     return constraints.addReceiverConstraint(mask);
   }
 
-  DartType registerIsCheck(DartType type, Compiler compiler) {
-    type.computeUnaliased(compiler.resolution);
+  DartType registerIsCheck(DartType type, Resolution resolution) {
+    type.computeUnaliased(resolution);
     type = type.unaliased;
     // Even in checked mode, type annotations for return type and argument
     // types do not imply type checks, so there should never be a check
@@ -644,8 +673,7 @@
     _invokedSetters.forEach(f);
   }
 
-  DartType registerIsCheck(DartType type, Compiler compiler) {
-    type.computeUnaliased(compiler.resolution);
+  DartType registerIsCheck(DartType type, Resolution resolution) {
     type = type.unaliased;
     // Even in checked mode, type annotations for return type and argument
     // types do not imply type checks, so there should never be a check
diff --git a/pkg/compiler/lib/src/world.dart b/pkg/compiler/lib/src/world.dart
index 014b16e..dd786a4 100644
--- a/pkg/compiler/lib/src/world.dart
+++ b/pkg/compiler/lib/src/world.dart
@@ -4,10 +4,10 @@
 
 library dart2js.world;
 
+import 'cache_strategy.dart';
 import 'closure.dart' show SynthesizedCallMethodElementX;
 import 'common/backend_api.dart' show BackendClasses;
 import 'common.dart';
-import 'compiler.dart' show Compiler;
 import 'core_types.dart' show CoreClasses;
 import 'dart_types.dart';
 import 'elements/elements.dart'
@@ -25,6 +25,7 @@
 import 'universe/function_set.dart' show FunctionSet;
 import 'universe/selector.dart' show Selector;
 import 'universe/side_effects.dart' show SideEffects;
+import 'universe/world_builder.dart' show ResolutionWorldBuilder;
 import 'util/enumset.dart';
 import 'util/util.dart' show Link;
 
@@ -46,6 +47,8 @@
   /// Access to core classes used in the Dart language.
   CoreClasses get coreClasses;
 
+  CommonMasks get commonMasks;
+
   /// Returns `true` if [cls] is either directly or indirectly instantiated.
   bool isInstantiated(ClassElement cls);
 
@@ -334,7 +337,7 @@
   void registerUsedElement(Element element);
   void registerTypedef(TypedefElement typedef);
 
-  ClosedWorld closeWorld();
+  ClosedWorld closeWorld(DiagnosticReporter reporter);
 
   /// Returns an iterable over all mixin applications that mixin [cls].
   Iterable<MixinApplicationElement> allMixinUsesOf(ClassElement cls);
@@ -437,7 +440,7 @@
   /// Returns `true` if [cls] is implemented by an instantiated class.
   bool isImplemented(ClassElement cls) {
     assert(isClosed);
-    return _compiler.resolverWorld.isImplemented(cls);
+    return resolverWorld.isImplemented(cls);
   }
 
   /// Returns an iterable over the directly instantiated classes that extend
@@ -836,11 +839,9 @@
     }
   }
 
-  final Compiler _compiler;
+  final JavaScriptBackend _backend;
   BackendClasses get backendClasses => _backend.backendClasses;
-  JavaScriptBackend get _backend => _compiler.backend;
-  CommonMasks get commonMasks => _compiler.commonMasks;
-  final FunctionSet allFunctions;
+  FunctionSet _allFunctions;
   final Set<Element> functionsCalledInLoop = new Set<Element>();
   final Map<Element, SideEffects> sideEffects = new Map<Element, SideEffects>();
 
@@ -871,20 +872,33 @@
 
   final Set<Element> alreadyPopulated;
 
+  CommonMasks _commonMasks;
+
+  final CoreClasses coreClasses;
+
+  final CacheStrategy cacheStrategy;
+
+  final ResolutionWorldBuilder resolverWorld;
+
   bool get isClosed => _closed;
 
   Set<ClassElement> typesImplementedBySubclassesOf(ClassElement cls) {
     return _typesImplementedBySubclasses[cls.declaration];
   }
 
-  WorldImpl(Compiler compiler)
-      : allFunctions = new FunctionSet(compiler),
-        this._compiler = compiler,
-        alreadyPopulated = compiler.cacheStrategy.newSet();
+  WorldImpl(this.resolverWorld, this._backend, this.coreClasses,
+      CacheStrategy cacheStrategy)
+      : this.cacheStrategy = cacheStrategy,
+        alreadyPopulated = cacheStrategy.newSet() {
+    _allFunctions = new FunctionSet(this);
+  }
 
-  CoreClasses get coreClasses => _compiler.coreClasses;
+  FunctionSet get allFunctions => _allFunctions;
 
-  DiagnosticReporter get reporter => _compiler.reporter;
+  CommonMasks get commonMasks {
+    assert(isClosed);
+    return _commonMasks;
+  }
 
   /// Called to add [cls] to the set of known classes.
   ///
@@ -979,7 +993,7 @@
 
   void _updateClassHierarchyNodeForClass(ClassElement cls,
       {bool directlyInstantiated: false, bool abstractlyInstantiated: false}) {
-    ClassHierarchyNode node = getClassHierarchyNode(cls);
+    ClassHierarchyNode node = _ensureClassHierarchyNode(cls);
     _updateSuperClassHierarchyNodeForClass(node);
     if (directlyInstantiated) {
       node.isDirectlyInstantiated = true;
@@ -989,13 +1003,12 @@
     }
   }
 
-  ClosedWorld closeWorld() {
+  ClosedWorld closeWorld(DiagnosticReporter reporter) {
     /// Updates the `isDirectlyInstantiated` and `isIndirectlyInstantiated`
     /// properties of the [ClassHierarchyNode] for [cls].
 
     void addSubtypes(ClassElement cls, EnumSet<Instantiation> instantiations) {
-      if (_compiler.options.hasIncrementalSupport &&
-          !alreadyPopulated.add(cls)) {
+      if (cacheStrategy.hasIncrementalSupport && !alreadyPopulated.add(cls)) {
         return;
       }
       assert(cls.isDeclaration);
@@ -1027,9 +1040,10 @@
     // classes: if the superclass of these classes require RTI, then
     // they also need RTI, so that a constructor passes the type
     // variables to the super constructor.
-    _compiler.resolverWorld.forEachInstantiatedClass(addSubtypes);
+    resolverWorld.forEachInstantiatedClass(addSubtypes);
 
     _closed = true;
+    _commonMasks = new CommonMasks(this);
     return this;
   }
 
@@ -1072,14 +1086,16 @@
   }
 
   Element locateSingleElement(Selector selector, TypeMask mask) {
+    assert(isClosed);
     mask ??= commonMasks.dynamicType;
-    return mask.locateSingleElement(selector, _compiler);
+    return mask.locateSingleElement(selector, this);
   }
 
   TypeMask extendMaskIfReachesAll(Selector selector, TypeMask mask) {
+    assert(isClosed);
     bool canReachAll = true;
     if (mask != null) {
-      canReachAll = _compiler.enabledInvokeOn &&
+      canReachAll = _backend.hasInvokeOnSupport &&
           mask.needsNoSuchMethodHandling(selector, this);
     }
     return canReachAll ? commonMasks.dynamicType : mask;
@@ -1107,8 +1123,8 @@
       return true;
     }
     if (element.isInstanceMember) {
-      return !_compiler.resolverWorld.hasInvokedSetter(element, this) &&
-          !_compiler.resolverWorld.fieldSetters.contains(element);
+      return !resolverWorld.hasInvokedSetter(element, this) &&
+          !resolverWorld.fieldSetters.contains(element);
     }
     return false;
   }
diff --git a/pkg/compiler/tool/perf.dart b/pkg/compiler/tool/perf.dart
index 2cd9d0c3..348570d 100644
--- a/pkg/compiler/tool/perf.dart
+++ b/pkg/compiler/tool/perf.dart
@@ -382,7 +382,7 @@
           fullyEnqueueLibrary(library, enqueuer.resolution);
         });
 
-        backend.enqueueHelpers(enqueuer.resolution, globalDependencies);
+        backend.enqueueHelpers(enqueuer.resolution);
         resolveLibraryMetadata();
         reporter.log('Resolving...');
         processQueue(enqueuer.resolution, mainFunction);
diff --git a/pkg/dart2js_incremental/lib/caching_compiler.dart b/pkg/dart2js_incremental/lib/caching_compiler.dart
index 5582bab..34f67c64 100644
--- a/pkg/dart2js_incremental/lib/caching_compiler.dart
+++ b/pkg/dart2js_incremental/lib/caching_compiler.dart
@@ -35,17 +35,19 @@
     environment = {};
   }
   CompilerImpl compiler = cachedCompiler;
+  JavaScriptBackend backend = compiler?.backend;
   if (compiler == null ||
       compiler.libraryRoot != libraryRoot ||
       !compiler.options.hasIncrementalSupport ||
       compiler.hasCrashed ||
-      compiler.enqueuer.resolution.hasEnqueuedReflectiveElements ||
+      backend.mirrorsAnalysis.resolutionHandler.hasEnqueuedReflectiveElements ||
       compiler.deferredLoadTask.isProgramSplit) {
     if (compiler != null && compiler.options.hasIncrementalSupport) {
       print('***FLUSH***');
       if (compiler.hasCrashed) {
         print('Unable to reuse compiler due to crash.');
-      } else if (compiler.enqueuer.resolution.hasEnqueuedReflectiveElements) {
+      } else if (backend.mirrorsAnalysis.resolutionHandler
+                     .hasEnqueuedReflectiveElements) {
         print('Unable to reuse compiler due to dart:mirrors.');
       } else if (compiler.deferredLoadTask.isProgramSplit) {
         print('Unable to reuse compiler due to deferred loading.');
@@ -64,7 +66,7 @@
             packageConfig: packageConfig,
             options: options,
             environment: environment));
-    JavaScriptBackend backend = compiler.backend;
+    backend = compiler.backend;
 
     full.Emitter emitter = backend.emitter.emitter;
 
@@ -82,9 +84,8 @@
       return compiler.libraryLoader.loadLibrary(core).then((_) {
         // Likewise, always be prepared for runtimeType support.
         // TODO(johnniwinther): Add global switch to force RTI.
-        compiler.enabledRuntimeType = true;
-        backend.registerRuntimeType(
-            compiler.enqueuer.resolution, compiler.globalDependencies);
+        compiler.resolverWorld.hasRuntimeTypeSupport = true;
+        backend.registerRuntimeType(compiler.enqueuer.resolution);
         return compiler;
       });
     });
diff --git a/pkg/dev_compiler/lib/js/amd/dart_sdk.js b/pkg/dev_compiler/lib/js/amd/dart_sdk.js
index 2049dda..8d7c71e 100644
--- a/pkg/dev_compiler/lib/js/amd/dart_sdk.js
+++ b/pkg/dev_compiler/lib/js/amd/dart_sdk.js
@@ -1074,6 +1074,15 @@
     ctor.prototype = clazz.prototype;
     dart.defineProperty(clazz, name, {value: ctor, configurable: true});
   };
+  dart.defineEnumValues = function(enumClass, names) {
+    let values = [];
+    for (var i = 0; i < names.length; i++) {
+      let value = dart.const(new enumClass(i));
+      values.push(value);
+      Object.defineProperty(enumClass, names[i], {value: value, configurable: true});
+    }
+    enumClass.values = dart.constList(values, enumClass);
+  };
   dart.fn = function(closure, t) {
     if (t == null) {
       t = dart.definiteFunctionType(dart.dynamic, Array(closure.length).fill(dart.dynamic), void 0);
diff --git a/pkg/dev_compiler/lib/js/common/dart_sdk.js b/pkg/dev_compiler/lib/js/common/dart_sdk.js
index 6f93ee1..f5370bd 100644
--- a/pkg/dev_compiler/lib/js/common/dart_sdk.js
+++ b/pkg/dev_compiler/lib/js/common/dart_sdk.js
@@ -1074,6 +1074,15 @@
     ctor.prototype = clazz.prototype;
     dart.defineProperty(clazz, name, {value: ctor, configurable: true});
   };
+  dart.defineEnumValues = function(enumClass, names) {
+    let values = [];
+    for (var i = 0; i < names.length; i++) {
+      let value = dart.const(new enumClass(i));
+      values.push(value);
+      Object.defineProperty(enumClass, names[i], {value: value, configurable: true});
+    }
+    enumClass.values = dart.constList(values, enumClass);
+  };
   dart.fn = function(closure, t) {
     if (t == null) {
       t = dart.definiteFunctionType(dart.dynamic, Array(closure.length).fill(dart.dynamic), void 0);
diff --git a/pkg/dev_compiler/lib/js/es6/dart_sdk.js b/pkg/dev_compiler/lib/js/es6/dart_sdk.js
index 8bb83db..44083b7 100644
--- a/pkg/dev_compiler/lib/js/es6/dart_sdk.js
+++ b/pkg/dev_compiler/lib/js/es6/dart_sdk.js
@@ -1072,6 +1072,15 @@
   ctor.prototype = clazz.prototype;
   dart.defineProperty(clazz, name, {value: ctor, configurable: true});
 };
+dart.defineEnumValues = function(enumClass, names) {
+  let values = [];
+  for (var i = 0; i < names.length; i++) {
+    let value = dart.const(new enumClass(i));
+    values.push(value);
+    Object.defineProperty(enumClass, names[i], {value: value, configurable: true});
+  }
+  enumClass.values = dart.constList(values, enumClass);
+};
 dart.fn = function(closure, t) {
   if (t == null) {
     t = dart.definiteFunctionType(dart.dynamic, Array(closure.length).fill(dart.dynamic), void 0);
diff --git a/pkg/dev_compiler/lib/js/legacy/dart_sdk.js b/pkg/dev_compiler/lib/js/legacy/dart_sdk.js
index c1fe1c2..4f8489f 100644
--- a/pkg/dev_compiler/lib/js/legacy/dart_sdk.js
+++ b/pkg/dev_compiler/lib/js/legacy/dart_sdk.js
@@ -1075,6 +1075,15 @@
     ctor.prototype = clazz.prototype;
     dart.defineProperty(clazz, name, {value: ctor, configurable: true});
   };
+  dart.defineEnumValues = function(enumClass, names) {
+    let values = [];
+    for (var i = 0; i < names.length; i++) {
+      let value = dart.const(new enumClass(i));
+      values.push(value);
+      Object.defineProperty(enumClass, names[i], {value: value, configurable: true});
+    }
+    enumClass.values = dart.constList(values, enumClass);
+  };
   dart.fn = function(closure, t) {
     if (t == null) {
       t = dart.definiteFunctionType(dart.dynamic, Array(closure.length).fill(dart.dynamic), void 0);
diff --git a/pkg/dev_compiler/lib/sdk/ddc_sdk.sum b/pkg/dev_compiler/lib/sdk/ddc_sdk.sum
index 9e1cea1..80408b8 100644
--- a/pkg/dev_compiler/lib/sdk/ddc_sdk.sum
+++ b/pkg/dev_compiler/lib/sdk/ddc_sdk.sum
Binary files differ
diff --git a/pkg/dev_compiler/lib/src/compiler/code_generator.dart b/pkg/dev_compiler/lib/src/compiler/code_generator.dart
index 19e46d4..98afa9f 100644
--- a/pkg/dev_compiler/lib/src/compiler/code_generator.dart
+++ b/pkg/dev_compiler/lib/src/compiler/code_generator.dart
@@ -1096,12 +1096,12 @@
         element.fields.where((f) => f.type == type));
 
     // Create toString() method
-    var properties = new List<JS.Property>();
+    var nameProperties = new List<JS.Property>(fields.length);
     for (var i = 0; i < fields.length; ++i) {
-      properties.add(new JS.Property(
-          js.number(i), js.string('${type.name}.${fields[i].name}')));
+      nameProperties[i] = new JS.Property(
+          js.number(i), js.string('${type.name}.${fields[i].name}'));
     }
-    var nameMap = new JS.ObjectInitializer(properties, multiline: true);
+    var nameMap = new JS.ObjectInitializer(nameProperties, multiline: true);
     var toStringF = new JS.Method(js.string('toString'),
         js.call('function() { return #[this.index]; }', nameMap) as JS.Fun);
 
@@ -1113,21 +1113,16 @@
       js.statement('# = #', [id, classExpr])
     ];
 
-    // Create static fields for each enum value
-    for (var i = 0; i < fields.length; ++i) {
-      result.add(js.statement('#.# = #.const(new #(#));',
-          [id, fields[i].name, _runtimeModule, id, js.number(i)]));
-    }
-
-    // Create static values list
-    var values = new JS.ArrayInitializer(new List<JS.Expression>.from(
-        fields.map((f) => js.call('#.#', [id, f.name]))));
-
-    // dart.constList helper internally depends on _interceptors.JSArray.
+    // defineEnumValues internally depends on dart.constList which uses
+    // _interceptors.JSArray.
     _declareBeforeUse(_jsArray);
 
-    result.add(js.statement('#.values = #.constList(#, #);',
-        [id, _runtimeModule, values, _emitType(type)]));
+    // Create static fields for each enum value, and the "values" getter
+    result.add(_callHelperStatement('defineEnumValues(#, #);', [
+      id,
+      new JS.ArrayInitializer(fields.map((f) => _propertyName(f.name)).toList(),
+          multiline: true)
+    ]));
 
     return _statement(result);
   }
@@ -2486,7 +2481,7 @@
       JS.Block block = body;
       if (block.statements.length == 1) {
         JS.Statement s = block.statements[0];
-        if (s is JS.Return) body = s.value;
+        if (s is JS.Return && s.value != null) body = s.value;
       }
     }
 
@@ -3077,9 +3072,9 @@
             l,
             l,
             _runtimeModule,
-            name,
             _extensionSymbolsModule,
             name,
+            name,
             _visit(rhs)
           ])
         ]);
@@ -3376,9 +3371,9 @@
             l,
             l,
             _runtimeModule,
-            memberName,
             _extensionSymbolsModule,
             memberName,
+            memberName,
             l
           ])
         ]);
@@ -4755,9 +4750,9 @@
             l,
             l,
             _runtimeModule,
-            memberName,
             _extensionSymbolsModule,
             memberName,
+            memberName,
             l,
             _visitList(args)
           ])
diff --git a/pkg/dev_compiler/lib/src/compiler/command.dart b/pkg/dev_compiler/lib/src/compiler/command.dart
index 87b2a57..7d5e212 100644
--- a/pkg/dev_compiler/lib/src/compiler/command.dart
+++ b/pkg/dev_compiler/lib/src/compiler/command.dart
@@ -170,6 +170,7 @@
       var file = new File(summaryPath);
       if (!file.existsSync() ||
           _changed(file.readAsBytesSync(), module.summaryBytes)) {
+        if (!file.parent.existsSync()) file.parent.createSync(recursive: true);
         file.writeAsBytesSync(module.summaryBytes);
       }
     }
diff --git a/pkg/dev_compiler/lib/src/compiler/compiler.dart b/pkg/dev_compiler/lib/src/compiler/compiler.dart
index d2eeca4..92cfc59 100644
--- a/pkg/dev_compiler/lib/src/compiler/compiler.dart
+++ b/pkg/dev_compiler/lib/src/compiler/compiler.dart
@@ -502,13 +502,19 @@
       c += '\n//# sourceURL=${name.replaceAll("/", ".")}.js\n';
       c = 'eval(${JSON.encode(c)});\n';
     }
-    new File(jsPath).writeAsStringSync(c);
+
+    var file = new File(jsPath);
+    if (!file.parent.existsSync()) file.parent.createSync(recursive: true);
+    file.writeAsStringSync(c);
+
     // TODO(jacobr): it is a bit strange we are writing the source map to a file
     // even when options.inlineSourceMap is true. To be consistent perhaps we
     // should also write a copy of the source file without a sourcemap even when
     // inlineSourceMap is true.
     if (code.sourceMap != null) {
-      new File(mapPath).writeAsStringSync(JSON.encode(code.sourceMap));
+      file = new File(mapPath);
+      if (!file.parent.existsSync()) file.parent.createSync(recursive: true);
+      file.writeAsStringSync(JSON.encode(code.sourceMap));
     }
   }
 }
diff --git a/pkg/dev_compiler/test/codegen/closure.dart b/pkg/dev_compiler/test/codegen/closure.dart
index 2754282..ad2e3ab 100644
--- a/pkg/dev_compiler/test/codegen/closure.dart
+++ b/pkg/dev_compiler/test/codegen/closure.dart
@@ -61,6 +61,8 @@
 
 void main(args) {}
 
+var closure = () { return; };
+
 const String some_top_level_constant = "abc";
 final String some_top_level_final = "abc";
 String some_top_level_var = "abc";
diff --git a/pkg/dev_compiler/test/codegen/language/enum_value_name_test.dart b/pkg/dev_compiler/test/codegen/language/enum_value_name_test.dart
new file mode 100644
index 0000000..2b73f17
--- /dev/null
+++ b/pkg/dev_compiler/test/codegen/language/enum_value_name_test.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2016, 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.
+
+// SharedOptions=--enable-enum
+
+import 'package:expect/expect.dart';
+
+enum ErrorContext { general, name, description, targets }
+
+void main() {
+  Expect.equals(ErrorContext.name, ErrorContext.name);
+}
diff --git a/pkg/dev_compiler/test/codegen_expected/closure.js b/pkg/dev_compiler/test/codegen_expected/closure.js
index ebfd865..698b90f 100644
--- a/pkg/dev_compiler/test/codegen_expected/closure.js
+++ b/pkg/dev_compiler/test/codegen_expected/closure.js
@@ -10,6 +10,7 @@
 let Foo = () => (Foo = dart.constFn(closure.Foo$()))();
 let ListOfTAndTToListOfT = () => (ListOfTAndTToListOfT = dart.constFn(dart.definiteFunctionType(T => [core.List$(T), [core.List$(T), T]])))();
 let dynamicTovoid = () => (dynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic])))();
+let VoidTodynamic = () => (VoidTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [])))();
 closure.generic_function = function(T) {
   return (items: core.List<T>, seed: T): core.List<T> => {
     let strings = items[dartx.map](core.String)(dart.fn((i: T): string => dart.str`${i}`, dart.definiteFunctionType(core.String, [T])))[dartx.toList]();
@@ -116,6 +117,14 @@
 closure.main = function(args): void {
 };
 dart.fn(closure.main, dynamicTovoid());
+dart.defineLazy(closure, {
+  get closure() {
+    return dart.fn(() => {
+      return;
+    }, VoidTodynamic());
+  },
+  set closure(_) {}
+});
 /** @final {string} */
 closure.some_top_level_constant = "abc";
 /** @final {string} */
diff --git a/pkg/dev_compiler/test/worker/worker_test.dart b/pkg/dev_compiler/test/worker/worker_test.dart
index 6ad4c05..daa1841 100644
--- a/pkg/dev_compiler/test/worker/worker_test.dart
+++ b/pkg/dev_compiler/test/worker/worker_test.dart
@@ -16,7 +16,7 @@
   group('Hello World', () {
     final argsFile = new File('test/worker/hello_world.args').absolute;
     final inputDartFile = new File('test/worker/hello_world.dart').absolute;
-    final outputJsFile = new File('test/worker/hello_world.js').absolute;
+    final outputJsFile = new File('test/worker/out/hello_world.js').absolute;
     final dartSdkSummary = new File('lib/sdk/ddc_sdk.sum').absolute;
     final executableArgs = ['bin/dartdevc.dart'];
     final compilerArgs = [
@@ -36,7 +36,9 @@
 
     tearDown(() {
       if (inputDartFile.existsSync()) inputDartFile.deleteSync();
-      if (outputJsFile.existsSync()) outputJsFile.deleteSync();
+      if (outputJsFile.parent.existsSync()) {
+        outputJsFile.parent.deleteSync(recursive: true);
+      }
       if (argsFile.existsSync()) argsFile.deleteSync();
     });
 
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/classes.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/classes.dart
index 87ed08b..1c77871 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/classes.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/classes.dart
@@ -540,3 +540,16 @@
   // like `caller` and `arguments`.
   $defineProperty($clazz, $name, { value: ctor, configurable: true });
 })()''');
+
+defineEnumValues(enumClass, names) => JS(
+    '',
+    '''(() => {
+  let values = [];
+  for (var i = 0; i < $names.length; i++) {
+    let value = $const_(new $enumClass(i));
+    values.push(value);
+    Object.defineProperty($enumClass, $names[i],
+        { value: value, configurable: true });
+  }
+  $enumClass.values = $constList(values, $enumClass);
+})()''');
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart
index c4a1d776..392abf0 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart
@@ -706,8 +706,7 @@
 ///
 /// Canonicalize a constant list
 ///
-@JSExportName('constList')
-constList_(elements, elementType) => JS(
+constList(elements, elementType) => JS(
     '',
     '''(() => {
   function lookupNonTerminal(map, key) {
diff --git a/pkg/front_end/.analysis_options b/pkg/front_end/.analysis_options
new file mode 100644
index 0000000..a10d4c5
--- /dev/null
+++ b/pkg/front_end/.analysis_options
@@ -0,0 +1,2 @@
+analyzer:
+  strong-mode: true
diff --git a/pkg/front_end/BUILD.gn b/pkg/front_end/BUILD.gn
new file mode 100644
index 0000000..2ad4e93
--- /dev/null
+++ b/pkg/front_end/BUILD.gn
@@ -0,0 +1,16 @@
+# Copyright (c) 2016, 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("//build/dart/dart_package.gni")
+
+dart_package("front_end") {
+  package_name = "front_end"
+
+  source_dir = "lib"
+
+  deps = [
+    "//third_party/dart-pkg/pub/path",
+    "//third_party/dart-pkg/pub/source_span",
+  ]
+}
diff --git a/pkg/front_end/lib/src/scanner/errors.dart b/pkg/front_end/lib/src/scanner/errors.dart
new file mode 100644
index 0000000..e5f66de
--- /dev/null
+++ b/pkg/front_end/lib/src/scanner/errors.dart
@@ -0,0 +1,336 @@
+// Copyright (c) 2016, 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.
+
+/**
+ * An error code associated with an [AnalysisError].
+ *
+ * Generally, we want to provide messages that consist of three sentences. From
+ * the user's perspective these sentences should explain:
+ *
+ * 1. what is wrong,
+ * 2. why is it wrong, and
+ * 3. how do I fix it.
+ *
+ * However, we combine the first two in the [message] and the last in the
+ * [correction].
+ *
+ * When composing messages (including correction messages) keep the following
+ * guidelines in mind.
+ *
+ * 1. The message should be a complete sentence starting with an uppercase
+ * letter, and ending with a period.
+ *
+ * 2. Reserved words and embedded identifiers should be in single quotes, so
+ * prefer double quotes for the complete message. For example,
+ * ```
+ * "The class '{0}' can't use 'super'."
+ * ```
+ * Notice that the word 'class' in the preceding message is not quoted as it
+ * refers to the concept 'class', not the reserved word. On the other hand,
+ * 'super' refers to the reserved word. Do not quote 'null' and numeric literals.
+ *
+ * 3. Do not try to compose messages, as it can make translating them hard.
+ *
+ * 4. Try to keep the error messages short, but informative.
+ *
+ * 5. Use simple words and terminology, assume the reader of the message doesn't
+ * have an advanced degree in math, and that English is not the reader's native
+ * language. Do not assume any formal computer science training. For example, do
+ * not use Latin abbreviations (prefer "that is" over "i.e.", and "for example"
+ * over "e.g."). Also avoid phrases such as "if and only if" and "iff"; that
+ * level of precision is unnecessary.
+ *
+ * 6. Prefer contractions when they are in common use, for example, prefer
+ * "can't" over "cannot". Using "cannot", "must not", "shall not", etc. is
+ * off-putting to people new to programming.
+ *
+ * 7. Use common terminology, preferably from the Dart Language Specification.
+ * This increases the user's chance of finding a good explanation on the web.
+ *
+ * 8. Do not try to be cute or funny. It is extremely frustrating to work on a
+ * product that crashes with a "tongue-in-cheek" message, especially if you did
+ * not want to use this product to begin with.
+ *
+ * 9. Do not lie, that is, do not write error messages containing phrases like
+ * "can't happen".  If the user ever saw this message, it would be a lie. Prefer
+ * messages like: "Internal error: This function should not be called when 'x'
+ * is null.".
+ *
+ * 10. Prefer to not use the imperative tone. That is, the message should not
+ * sound accusing or like it is ordering the user around. The computer should
+ * describe the problem, not criticize the user for violating the specification.
+ */
+abstract class ErrorCode {
+  /**
+   * The name of the error code.
+   */
+  final String name;
+
+  /**
+   * The template used to create the message to be displayed for this error. The
+   * message should indicate what is wrong and why it is wrong.
+   */
+  final String message;
+
+  /**
+   * The template used to create the correction to be displayed for this error,
+   * or `null` if there is no correction information for this error. The
+   * correction should indicate how the user can fix the error.
+   */
+  final String correction;
+
+  /**
+   * Initialize a newly created error code to have the given [name]. The message
+   * associated with the error will be created from the given [message]
+   * template. The correction associated with the error will be created from the
+   * given [correction] template.
+   */
+  const ErrorCode(this.name, this.message, [this.correction]);
+
+  /**
+   * The severity of the error.
+   */
+  ErrorSeverity get errorSeverity;
+
+  /**
+   * The type of the error.
+   */
+  ErrorType get type;
+
+  /**
+   * The unique name of this error code.
+   */
+  String get uniqueName => "$runtimeType.$name";
+
+  @override
+  String toString() => uniqueName;
+}
+
+/**
+ * The severity of an [ErrorCode].
+ */
+class ErrorSeverity implements Comparable<ErrorSeverity> {
+  /**
+   * The severity representing a non-error. This is never used for any error
+   * code, but is useful for clients.
+   */
+  static const ErrorSeverity NONE = const ErrorSeverity('NONE', 0, " ", "none");
+
+  /**
+   * The severity representing an informational level analysis issue.
+   */
+  static const ErrorSeverity INFO = const ErrorSeverity('INFO', 1, "I", "info");
+
+  /**
+   * The severity representing a warning. Warnings can become errors if the `-Werror` command
+   * line flag is specified.
+   */
+  static const ErrorSeverity WARNING =
+      const ErrorSeverity('WARNING', 2, "W", "warning");
+
+  /**
+   * The severity representing an error.
+   */
+  static const ErrorSeverity ERROR =
+      const ErrorSeverity('ERROR', 3, "E", "error");
+
+  static const List<ErrorSeverity> values = const [NONE, INFO, WARNING, ERROR];
+
+  /**
+   * The name of this error code.
+   */
+  final String name;
+
+  /**
+   * The ordinal value of the error code.
+   */
+  final int ordinal;
+
+  /**
+   * The name of the severity used when producing machine output.
+   */
+  final String machineCode;
+
+  /**
+   * The name of the severity used when producing readable output.
+   */
+  final String displayName;
+
+  /**
+   * Initialize a newly created severity with the given names.
+   */
+  const ErrorSeverity(
+      this.name, this.ordinal, this.machineCode, this.displayName);
+
+  @override
+  int get hashCode => ordinal;
+
+  @override
+  int compareTo(ErrorSeverity other) => ordinal - other.ordinal;
+
+  /**
+   * Return the severity constant that represents the greatest severity.
+   */
+  ErrorSeverity max(ErrorSeverity severity) =>
+      this.ordinal >= severity.ordinal ? this : severity;
+
+  @override
+  String toString() => name;
+}
+
+/**
+ * The type of an [ErrorCode].
+ */
+class ErrorType implements Comparable<ErrorType> {
+  /**
+   * Task (todo) comments in user code.
+   */
+  static const ErrorType TODO = const ErrorType('TODO', 0, ErrorSeverity.INFO);
+
+  /**
+   * Extra analysis run over the code to follow best practices, which are not in
+   * the Dart Language Specification.
+   */
+  static const ErrorType HINT = const ErrorType('HINT', 1, ErrorSeverity.INFO);
+
+  /**
+   * Compile-time errors are errors that preclude execution. A compile time
+   * error must be reported by a Dart compiler before the erroneous code is
+   * executed.
+   */
+  static const ErrorType COMPILE_TIME_ERROR =
+      const ErrorType('COMPILE_TIME_ERROR', 2, ErrorSeverity.ERROR);
+
+  /**
+   * Checked mode compile-time errors are errors that preclude execution in
+   * checked mode.
+   */
+  static const ErrorType CHECKED_MODE_COMPILE_TIME_ERROR = const ErrorType(
+      'CHECKED_MODE_COMPILE_TIME_ERROR', 3, ErrorSeverity.ERROR);
+
+  /**
+   * Static warnings are those warnings reported by the static checker. They
+   * have no effect on execution. Static warnings must be provided by Dart
+   * compilers used during development.
+   */
+  static const ErrorType STATIC_WARNING =
+      const ErrorType('STATIC_WARNING', 4, ErrorSeverity.WARNING);
+
+  /**
+   * Many, but not all, static warnings relate to types, in which case they are
+   * known as static type warnings.
+   */
+  static const ErrorType STATIC_TYPE_WARNING =
+      const ErrorType('STATIC_TYPE_WARNING', 5, ErrorSeverity.WARNING);
+
+  /**
+   * Syntactic errors are errors produced as a result of input that does not
+   * conform to the grammar.
+   */
+  static const ErrorType SYNTACTIC_ERROR =
+      const ErrorType('SYNTACTIC_ERROR', 6, ErrorSeverity.ERROR);
+
+  /**
+   * Lint warnings describe style and best practice recommendations that can be
+   * used to formalize a project's style guidelines.
+   */
+  static const ErrorType LINT = const ErrorType('LINT', 7, ErrorSeverity.INFO);
+
+  static const List<ErrorType> values = const [
+    TODO,
+    HINT,
+    COMPILE_TIME_ERROR,
+    CHECKED_MODE_COMPILE_TIME_ERROR,
+    STATIC_WARNING,
+    STATIC_TYPE_WARNING,
+    SYNTACTIC_ERROR,
+    LINT
+  ];
+
+  /**
+   * The name of this error type.
+   */
+  final String name;
+
+  /**
+   * The ordinal value of the error type.
+   */
+  final int ordinal;
+
+  /**
+   * The severity of this type of error.
+   */
+  final ErrorSeverity severity;
+
+  /**
+   * Initialize a newly created error type to have the given [name] and
+   * [severity].
+   */
+  const ErrorType(this.name, this.ordinal, this.severity);
+
+  String get displayName => name.toLowerCase().replaceAll('_', ' ');
+
+  @override
+  int get hashCode => ordinal;
+
+  @override
+  int compareTo(ErrorType other) => ordinal - other.ordinal;
+
+  @override
+  String toString() => name;
+}
+
+/**
+ * The error codes used for errors detected by the scanner.
+ */
+class ScannerErrorCode extends ErrorCode {
+  /**
+   * Parameters:
+   * 0: the illegal character
+   */
+  static const ScannerErrorCode ILLEGAL_CHARACTER =
+      const ScannerErrorCode('ILLEGAL_CHARACTER', "Illegal character '{0}'.");
+
+  static const ScannerErrorCode MISSING_DIGIT =
+      const ScannerErrorCode('MISSING_DIGIT', "Decimal digit expected.");
+
+  static const ScannerErrorCode MISSING_HEX_DIGIT = const ScannerErrorCode(
+      'MISSING_HEX_DIGIT', "Hexidecimal digit expected.");
+
+  static const ScannerErrorCode MISSING_QUOTE =
+      const ScannerErrorCode('MISSING_QUOTE', "Expected quote (' or \").");
+
+  /**
+   * Parameters:
+   * 0: the path of the file that cannot be read
+   */
+  static const ScannerErrorCode UNABLE_GET_CONTENT = const ScannerErrorCode(
+      'UNABLE_GET_CONTENT', "Unable to get content of '{0}'.");
+
+  static const ScannerErrorCode UNTERMINATED_MULTI_LINE_COMMENT =
+      const ScannerErrorCode(
+          'UNTERMINATED_MULTI_LINE_COMMENT',
+          "Unterminated multi-line comment.",
+          "Try terminating the comment with '*/', or "
+          "removing any unbalanced occurances of '/*' (because comments nest in Dart).");
+
+  static const ScannerErrorCode UNTERMINATED_STRING_LITERAL =
+      const ScannerErrorCode(
+          'UNTERMINATED_STRING_LITERAL', "Unterminated string literal.");
+
+  /**
+   * Initialize a newly created error code to have the given [name]. The message
+   * associated with the error will be created from the given [message]
+   * template. The correction associated with the error will be created from the
+   * given [correction] template.
+   */
+  const ScannerErrorCode(String name, String message, [String correction])
+      : super(name, message, correction);
+
+  @override
+  ErrorSeverity get errorSeverity => ErrorSeverity.ERROR;
+
+  @override
+  ErrorType get type => ErrorType.SYNTACTIC_ERROR;
+}
diff --git a/pkg/front_end/lib/src/scanner/interner.dart b/pkg/front_end/lib/src/scanner/interner.dart
new file mode 100644
index 0000000..9f248c9
--- /dev/null
+++ b/pkg/front_end/lib/src/scanner/interner.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2016, 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.
+
+/**
+ * The interface `Interner` defines the behavior of objects that can intern
+ * strings.
+ */
+abstract class Interner {
+  /**
+   * Return a string that is identical to all of the other strings that have
+   * been interned that are equal to the given [string].
+   */
+  String intern(String string);
+}
+
+/**
+ * The class `NullInterner` implements an interner that does nothing (does not
+ * actually intern any strings).
+ */
+class NullInterner implements Interner {
+  @override
+  String intern(String string) => string;
+}
diff --git a/pkg/front_end/lib/src/scanner/reader.dart b/pkg/front_end/lib/src/scanner/reader.dart
new file mode 100644
index 0000000..ee9d6c0
--- /dev/null
+++ b/pkg/front_end/lib/src/scanner/reader.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2016, 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.
+
+/**
+ * An object used by the scanner to read the characters to be scanned.
+ */
+abstract class CharacterReader {
+  /**
+   * The current offset relative to the beginning of the source. Return the
+   * initial offset if the scanner has not yet scanned the source code, and one
+   * (1) past the end of the source code if the entire source code has been
+   * scanned.
+   */
+  int get offset;
+
+  /**
+   * Set the current offset relative to the beginning of the source to the given
+   * [offset]. The new offset must be between the initial offset and one (1)
+   * past the end of the source code.
+   */
+  void set offset(int offset);
+
+  /**
+   * Advance the current position and return the character at the new current
+   * position.
+   */
+  int advance();
+
+  /**
+   * Return the substring of the source code between the [start] offset and the
+   * modified current position. The current position is modified by adding the
+   * [endDelta], which is the number of characters after the current location to
+   * be included in the string, or the number of characters before the current
+   * location to be excluded if the offset is negative.
+   */
+  String getString(int start, int endDelta);
+
+  /**
+   * Return the character at the current position without changing the current
+   * position.
+   */
+  int peek();
+}
diff --git a/pkg/front_end/lib/src/scanner/scanner.dart b/pkg/front_end/lib/src/scanner/scanner.dart
new file mode 100644
index 0000000..be259fc
--- /dev/null
+++ b/pkg/front_end/lib/src/scanner/scanner.dart
@@ -0,0 +1,1341 @@
+// Copyright (c) 2016, 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:charcode/ascii.dart';
+import 'package:front_end/src/scanner/errors.dart';
+import 'package:front_end/src/scanner/reader.dart';
+import 'package:front_end/src/scanner/string_utilities.dart';
+import 'package:front_end/src/scanner/token.dart';
+
+/**
+ * A state in a state machine used to scan keywords.
+ */
+class KeywordState {
+  /**
+   * An empty transition table used by leaf states.
+   */
+  static List<KeywordState> _EMPTY_TABLE = new List<KeywordState>(26);
+
+  /**
+   * The initial state in the state machine.
+   */
+  static final KeywordState KEYWORD_STATE = _createKeywordStateTable();
+
+  /**
+   * A table mapping characters to the states to which those characters will
+   * transition. (The index into the array is the offset from the character
+   * `'a'` to the transitioning character.)
+   */
+  final List<KeywordState> _table;
+
+  /**
+   * The keyword that is recognized by this state, or `null` if this state is
+   * not a terminal state.
+   */
+  Keyword _keyword;
+
+  /**
+   * Initialize a newly created state to have the given transitions and to
+   * recognize the keyword with the given [syntax].
+   */
+  KeywordState(this._table, String syntax) {
+    this._keyword = (syntax == null) ? null : Keyword.keywords[syntax];
+  }
+
+  /**
+   * Return the keyword that was recognized by this state, or `null` if this
+   * state does not recognized a keyword.
+   */
+  Keyword keyword() => _keyword;
+
+  /**
+   * Return the state that follows this state on a transition of the given
+   * [character], or `null` if there is no valid state reachable from this state
+   * with such a transition.
+   */
+  KeywordState next(int character) => _table[character - $a];
+
+  /**
+   * Create the next state in the state machine where we have already recognized
+   * the subset of strings in the given array of [strings] starting at the given
+   * [offset] and having the given [length]. All of these strings have a common
+   * prefix and the next character is at the given [start] index.
+   */
+  static KeywordState _computeKeywordStateTable(
+      int start, List<String> strings, int offset, int length) {
+    List<KeywordState> result = new List<KeywordState>(26);
+    assert(length != 0);
+    int chunk = $nul;
+    int chunkStart = -1;
+    bool isLeaf = false;
+    for (int i = offset; i < offset + length; i++) {
+      if (strings[i].length == start) {
+        isLeaf = true;
+      }
+      if (strings[i].length > start) {
+        int c = strings[i].codeUnitAt(start);
+        if (chunk != c) {
+          if (chunkStart != -1) {
+            result[chunk - $a] = _computeKeywordStateTable(
+                start + 1, strings, chunkStart, i - chunkStart);
+          }
+          chunkStart = i;
+          chunk = c;
+        }
+      }
+    }
+    if (chunkStart != -1) {
+      assert(result[chunk - $a] == null);
+      result[chunk - $a] = _computeKeywordStateTable(
+          start + 1, strings, chunkStart, offset + length - chunkStart);
+    } else {
+      assert(length == 1);
+      return new KeywordState(_EMPTY_TABLE, strings[offset]);
+    }
+    if (isLeaf) {
+      return new KeywordState(result, strings[offset]);
+    } else {
+      return new KeywordState(result, null);
+    }
+  }
+
+  /**
+   * Create and return the initial state in the state machine.
+   */
+  static KeywordState _createKeywordStateTable() {
+    List<Keyword> values = Keyword.values;
+    List<String> strings = new List<String>(values.length);
+    for (int i = 0; i < values.length; i++) {
+      strings[i] = values[i].syntax;
+    }
+    strings.sort();
+    return _computeKeywordStateTable(0, strings, 0, strings.length);
+  }
+}
+
+/**
+ * The class `Scanner` implements a scanner for Dart code.
+ *
+ * The lexical structure of Dart is ambiguous without knowledge of the context
+ * in which a token is being scanned. For example, without context we cannot
+ * determine whether source of the form "<<" should be scanned as a single
+ * left-shift operator or as two left angle brackets. This scanner does not have
+ * any context, so it always resolves such conflicts by scanning the longest
+ * possible token.
+ */
+abstract class Scanner {
+  /**
+   * The reader used to access the characters in the source.
+   */
+  final CharacterReader _reader;
+
+  /**
+   * The flag specifying whether documentation comments should be parsed.
+   */
+  bool _preserveComments = true;
+
+  /**
+   * The token pointing to the head of the linked list of tokens.
+   */
+  Token _tokens;
+
+  /**
+   * The last token that was scanned.
+   */
+  Token _tail;
+
+  /**
+   * The first token in the list of comment tokens found since the last
+   * non-comment token.
+   */
+  Token _firstComment;
+
+  /**
+   * The last token in the list of comment tokens found since the last
+   * non-comment token.
+   */
+  Token _lastComment;
+
+  /**
+   * The index of the first character of the current token.
+   */
+  int _tokenStart = 0;
+
+  /**
+   * A list containing the offsets of the first character of each line in the
+   * source code.
+   */
+  List<int> _lineStarts = new List<int>();
+
+  /**
+   * A list, treated something like a stack, of tokens representing the
+   * beginning of a matched pair. It is used to pair the end tokens with the
+   * begin tokens.
+   */
+  List<BeginToken> _groupingStack = new List<BeginToken>();
+
+  /**
+   * The index of the last item in the [_groupingStack], or `-1` if the stack is
+   * empty.
+   */
+  int _stackEnd = -1;
+
+  /**
+   * A flag indicating whether any unmatched groups were found during the parse.
+   */
+  bool _hasUnmatchedGroups = false;
+
+  /**
+   * A flag indicating whether to parse generic method comments, of the form
+   * `/*=T*/` and `/*<T>*/`.
+   */
+  bool scanGenericMethodComments = false;
+
+  /**
+   * A flag indicating whether the lazy compound assignment operators '&&=' and
+   * '||=' are enabled.
+   */
+  bool scanLazyAssignmentOperators = false;
+
+  /**
+   * Initialize a newly created scanner to scan characters from the given
+   * character [_reader].
+   */
+  Scanner(this._reader) {
+    _tokens = new Token(TokenType.EOF, -1);
+    _tokens.setNext(_tokens);
+    _tail = _tokens;
+    _tokenStart = -1;
+    _lineStarts.add(0);
+  }
+
+  /**
+   * Return the first token in the token stream that was scanned.
+   */
+  Token get firstToken => _tokens.next;
+
+  /**
+   * Return `true` if any unmatched groups were found during the parse.
+   */
+  bool get hasUnmatchedGroups => _hasUnmatchedGroups;
+
+  /**
+   * Return an array containing the offsets of the first character of each line
+   * in the source code.
+   */
+  List<int> get lineStarts => _lineStarts;
+
+  /**
+   * Set whether documentation tokens should be preserved.
+   */
+  void set preserveComments(bool preserveComments) {
+    this._preserveComments = preserveComments;
+  }
+
+  /**
+   * Return the last token that was scanned.
+   */
+  Token get tail => _tail;
+
+  /**
+   * Append the given [token] to the end of the token stream being scanned. This
+   * method is intended to be used by subclasses that copy existing tokens and
+   * should not normally be used because it will fail to correctly associate any
+   * comments with the token being passed in.
+   */
+  void appendToken(Token token) {
+    _tail = _tail.setNext(token);
+  }
+
+  int bigSwitch(int next) {
+    _beginToken();
+    if (next == $cr) {
+      // '\r'
+      next = _reader.advance();
+      if (next == $lf) {
+        // '\n'
+        next = _reader.advance();
+      }
+      recordStartOfLine();
+      return next;
+    } else if (next == $lf) {
+      // '\n'
+      next = _reader.advance();
+      recordStartOfLine();
+      return next;
+    } else if (next == $tab || next == $space) {
+      // '\t' || ' '
+      return _reader.advance();
+    }
+    if (next == $r) {
+      // 'r'
+      int peek = _reader.peek();
+      if (peek == $double_quote || peek == $single_quote) {
+        // '"' || "'"
+        int start = _reader.offset;
+        return _tokenizeString(_reader.advance(), start, true);
+      }
+    }
+    if ($a <= next && next <= $z) {
+      // 'a'-'z'
+      return _tokenizeKeywordOrIdentifier(next, true);
+    }
+    if (($A <= next && next <= $Z) || next == $_ || next == $$) {
+      // 'A'-'Z' || '_' || '$'
+      return _tokenizeIdentifier(next, _reader.offset, true);
+    }
+    if (next == $lt) {
+      // '<'
+      return _tokenizeLessThan(next);
+    }
+    if (next == $gt) {
+      // '>'
+      return _tokenizeGreaterThan(next);
+    }
+    if (next == $equal) {
+      // '='
+      return _tokenizeEquals(next);
+    }
+    if (next == $exclamation) {
+      // '!'
+      return _tokenizeExclamation(next);
+    }
+    if (next == $plus) {
+      // '+'
+      return _tokenizePlus(next);
+    }
+    if (next == $minus) {
+      // '-'
+      return _tokenizeMinus(next);
+    }
+    if (next == $asterisk) {
+      // '*'
+      return _tokenizeMultiply(next);
+    }
+    if (next == $percent) {
+      // '%'
+      return _tokenizePercent(next);
+    }
+    if (next == $ampersand) {
+      // '&'
+      return _tokenizeAmpersand(next);
+    }
+    if (next == $bar) {
+      // '|'
+      return _tokenizeBar(next);
+    }
+    if (next == $caret) {
+      // '^'
+      return _tokenizeCaret(next);
+    }
+    if (next == $open_bracket) {
+      // '['
+      return _tokenizeOpenSquareBracket(next);
+    }
+    if (next == $tilde) {
+      // '~'
+      return _tokenizeTilde(next);
+    }
+    if (next == $backslash) {
+      // '\\'
+      _appendTokenOfType(TokenType.BACKSLASH);
+      return _reader.advance();
+    }
+    if (next == $hash) {
+      // '#'
+      return _tokenizeTag(next);
+    }
+    if (next == $open_paren) {
+      // '('
+      _appendBeginToken(TokenType.OPEN_PAREN);
+      return _reader.advance();
+    }
+    if (next == $close_paren) {
+      // ')'
+      _appendEndToken(TokenType.CLOSE_PAREN, TokenType.OPEN_PAREN);
+      return _reader.advance();
+    }
+    if (next == $comma) {
+      // ','
+      _appendTokenOfType(TokenType.COMMA);
+      return _reader.advance();
+    }
+    if (next == $colon) {
+      // ':'
+      _appendTokenOfType(TokenType.COLON);
+      return _reader.advance();
+    }
+    if (next == $semicolon) {
+      // ';'
+      _appendTokenOfType(TokenType.SEMICOLON);
+      return _reader.advance();
+    }
+    if (next == $question) {
+      // '?'
+      return _tokenizeQuestion();
+    }
+    if (next == $close_bracket) {
+      // ']'
+      _appendEndToken(
+          TokenType.CLOSE_SQUARE_BRACKET, TokenType.OPEN_SQUARE_BRACKET);
+      return _reader.advance();
+    }
+    if (next == $backquote) {
+      // '`'
+      _appendTokenOfType(TokenType.BACKPING);
+      return _reader.advance();
+    }
+    if (next == $lbrace) {
+      // '{'
+      _appendBeginToken(TokenType.OPEN_CURLY_BRACKET);
+      return _reader.advance();
+    }
+    if (next == $rbrace) {
+      // '}'
+      _appendEndToken(
+          TokenType.CLOSE_CURLY_BRACKET, TokenType.OPEN_CURLY_BRACKET);
+      return _reader.advance();
+    }
+    if (next == $slash) {
+      // '/'
+      return _tokenizeSlashOrComment(next);
+    }
+    if (next == $at) {
+      // '@'
+      _appendTokenOfType(TokenType.AT);
+      return _reader.advance();
+    }
+    if (next == $double_quote || next == $single_quote) {
+      // '"' || "'"
+      return _tokenizeString(next, _reader.offset, false);
+    }
+    if (next == $dot) {
+      // '.'
+      return _tokenizeDotOrNumber(next);
+    }
+    if (next == $0) {
+      // '0'
+      return _tokenizeHexOrNumber(next);
+    }
+    if ($1 <= next && next <= $9) {
+      // '1'-'9'
+      return _tokenizeNumber(next);
+    }
+    if (next == -1) {
+      // EOF
+      return -1;
+    }
+    _reportError(ScannerErrorCode.ILLEGAL_CHARACTER, [next]);
+    return _reader.advance();
+  }
+
+  /**
+   * Record the fact that we are at the beginning of a new line in the source.
+   */
+  void recordStartOfLine() {
+    _lineStarts.add(_reader.offset);
+  }
+
+  /**
+   * Report an error at the given offset. The [errorCode] is the error code
+   * indicating the nature of the error. The [arguments] are any arguments
+   * needed to complete the error message
+   */
+  void reportError(
+      ScannerErrorCode errorCode, int offset, List<Object> arguments);
+
+  /**
+   * Record that the source begins on the given [line] and [column] at the
+   * current offset as given by the reader. Both the line and the column are
+   * one-based indexes. The line starts for lines before the given line will not
+   * be correct.
+   *
+   * This method must be invoked at most one time and must be invoked before
+   * scanning begins. The values provided must be sensible. The results are
+   * undefined if these conditions are violated.
+   */
+  void setSourceStart(int line, int column) {
+    int offset = _reader.offset;
+    if (line < 1 || column < 1 || offset < 0 || (line + column - 2) >= offset) {
+      return;
+    }
+    for (int i = 2; i < line; i++) {
+      _lineStarts.add(1);
+    }
+    _lineStarts.add(offset - column + 1);
+  }
+
+  /**
+   * Scan the source code to produce a list of tokens representing the source,
+   * and return the first token in the list of tokens that were produced.
+   */
+  Token tokenize() {
+    int next = _reader.advance();
+    while (next != -1) {
+      next = bigSwitch(next);
+    }
+    _appendEofToken();
+    return firstToken;
+  }
+
+  void _appendBeginToken(TokenType type) {
+    BeginToken token;
+    if (_firstComment == null) {
+      token = new BeginToken(type, _tokenStart);
+    } else {
+      token = new BeginTokenWithComment(type, _tokenStart, _firstComment);
+      _firstComment = null;
+      _lastComment = null;
+    }
+    _tail = _tail.setNext(token);
+    _groupingStack.add(token);
+    _stackEnd++;
+  }
+
+  void _appendCommentToken(TokenType type, String value) {
+    CommentToken token = null;
+    TokenType genericComment = _matchGenericMethodCommentType(value);
+    if (genericComment != null) {
+      token = new CommentToken(genericComment, value, _tokenStart);
+    } else if (!_preserveComments) {
+      // Ignore comment tokens if client specified that it doesn't need them.
+      return;
+    } else {
+      // OK, remember comment tokens.
+      if (_isDocumentationComment(value)) {
+        token = new DocumentationCommentToken(type, value, _tokenStart);
+      } else {
+        token = new CommentToken(type, value, _tokenStart);
+      }
+    }
+    if (_firstComment == null) {
+      _firstComment = token;
+      _lastComment = _firstComment;
+    } else {
+      _lastComment = _lastComment.setNext(token);
+    }
+  }
+
+  void _appendEndToken(TokenType type, TokenType beginType) {
+    Token token;
+    if (_firstComment == null) {
+      token = new Token(type, _tokenStart);
+    } else {
+      token = new TokenWithComment(type, _tokenStart, _firstComment);
+      _firstComment = null;
+      _lastComment = null;
+    }
+    _tail = _tail.setNext(token);
+    if (_stackEnd >= 0) {
+      BeginToken begin = _groupingStack[_stackEnd];
+      if (begin.type == beginType) {
+        begin.endToken = token;
+        _groupingStack.removeAt(_stackEnd--);
+      }
+    }
+  }
+
+  void _appendEofToken() {
+    Token eofToken;
+    if (_firstComment == null) {
+      eofToken = new Token(TokenType.EOF, _reader.offset + 1);
+    } else {
+      eofToken = new TokenWithComment(
+          TokenType.EOF, _reader.offset + 1, _firstComment);
+      _firstComment = null;
+      _lastComment = null;
+    }
+    // The EOF token points to itself so that there is always infinite
+    // look-ahead.
+    eofToken.setNext(eofToken);
+    _tail = _tail.setNext(eofToken);
+    if (_stackEnd >= 0) {
+      _hasUnmatchedGroups = true;
+      // TODO(brianwilkerson) Fix the ungrouped tokens?
+    }
+  }
+
+  void _appendKeywordToken(Keyword keyword) {
+    if (_firstComment == null) {
+      _tail = _tail.setNext(new KeywordToken(keyword, _tokenStart));
+    } else {
+      _tail = _tail.setNext(
+          new KeywordTokenWithComment(keyword, _tokenStart, _firstComment));
+      _firstComment = null;
+      _lastComment = null;
+    }
+  }
+
+  void _appendStringToken(TokenType type, String value) {
+    if (_firstComment == null) {
+      _tail = _tail.setNext(new StringToken(type, value, _tokenStart));
+    } else {
+      _tail = _tail.setNext(
+          new StringTokenWithComment(type, value, _tokenStart, _firstComment));
+      _firstComment = null;
+      _lastComment = null;
+    }
+  }
+
+  void _appendStringTokenWithOffset(TokenType type, String value, int offset) {
+    if (_firstComment == null) {
+      _tail = _tail.setNext(new StringToken(type, value, _tokenStart + offset));
+    } else {
+      _tail = _tail.setNext(new StringTokenWithComment(
+          type, value, _tokenStart + offset, _firstComment));
+      _firstComment = null;
+      _lastComment = null;
+    }
+  }
+
+  void _appendTokenOfType(TokenType type) {
+    if (_firstComment == null) {
+      _tail = _tail.setNext(new Token(type, _tokenStart));
+    } else {
+      _tail =
+          _tail.setNext(new TokenWithComment(type, _tokenStart, _firstComment));
+      _firstComment = null;
+      _lastComment = null;
+    }
+  }
+
+  void _appendTokenOfTypeWithOffset(TokenType type, int offset) {
+    if (_firstComment == null) {
+      _tail = _tail.setNext(new Token(type, offset));
+    } else {
+      _tail = _tail.setNext(new TokenWithComment(type, offset, _firstComment));
+      _firstComment = null;
+      _lastComment = null;
+    }
+  }
+
+  void _beginToken() {
+    _tokenStart = _reader.offset;
+  }
+
+  /**
+   * Return the beginning token corresponding to a closing brace that was found
+   * while scanning inside a string interpolation expression. Tokens that cannot
+   * be matched with the closing brace will be dropped from the stack.
+   */
+  BeginToken _findTokenMatchingClosingBraceInInterpolationExpression() {
+    while (_stackEnd >= 0) {
+      BeginToken begin = _groupingStack[_stackEnd];
+      if (begin.type == TokenType.OPEN_CURLY_BRACKET ||
+          begin.type == TokenType.STRING_INTERPOLATION_EXPRESSION) {
+        return begin;
+      }
+      _hasUnmatchedGroups = true;
+      _groupingStack.removeAt(_stackEnd--);
+    }
+    //
+    // We should never get to this point because we wouldn't be inside a string
+    // interpolation expression unless we had previously found the start of the
+    // expression.
+    //
+    return null;
+  }
+
+  /**
+   * Checks if [value] is the start of a generic method type annotation comment.
+   *
+   * This can either be of the form `/*<T>*/` or `/*=T*/`. The token type is
+   * returned, or null if it was not a generic method comment.
+   */
+  TokenType _matchGenericMethodCommentType(String value) {
+    if (scanGenericMethodComments) {
+      // Match /*< and >*/
+      if (StringUtilities.startsWith3(value, 0, $slash, $asterisk, $lt) &&
+          StringUtilities.endsWith3(value, $gt, $asterisk, $slash)) {
+        return TokenType.GENERIC_METHOD_TYPE_LIST;
+      }
+      // Match /*=
+      if (StringUtilities.startsWith3(value, 0, $slash, $asterisk, $equal)) {
+        return TokenType.GENERIC_METHOD_TYPE_ASSIGN;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Report an error at the current offset. The [errorCode] is the error code
+   * indicating the nature of the error. The [arguments] are any arguments
+   * needed to complete the error message
+   */
+  void _reportError(ScannerErrorCode errorCode, [List<Object> arguments]) {
+    reportError(errorCode, _reader.offset, arguments);
+  }
+
+  int _select(int choice, TokenType yesType, TokenType noType) {
+    int next = _reader.advance();
+    if (next == choice) {
+      _appendTokenOfType(yesType);
+      return _reader.advance();
+    } else {
+      _appendTokenOfType(noType);
+      return next;
+    }
+  }
+
+  int _selectWithOffset(
+      int choice, TokenType yesType, TokenType noType, int offset) {
+    int next = _reader.advance();
+    if (next == choice) {
+      _appendTokenOfTypeWithOffset(yesType, offset);
+      return _reader.advance();
+    } else {
+      _appendTokenOfTypeWithOffset(noType, offset);
+      return next;
+    }
+  }
+
+  int _tokenizeAmpersand(int next) {
+    // &&= && &= &
+    next = _reader.advance();
+    if (next == $ampersand) {
+      next = _reader.advance();
+      if (scanLazyAssignmentOperators && next == $equal) {
+        _appendTokenOfType(TokenType.AMPERSAND_AMPERSAND_EQ);
+        return _reader.advance();
+      }
+      _appendTokenOfType(TokenType.AMPERSAND_AMPERSAND);
+      return next;
+    } else if (next == $equal) {
+      _appendTokenOfType(TokenType.AMPERSAND_EQ);
+      return _reader.advance();
+    } else {
+      _appendTokenOfType(TokenType.AMPERSAND);
+      return next;
+    }
+  }
+
+  int _tokenizeBar(int next) {
+    // ||= || |= |
+    next = _reader.advance();
+    if (next == $bar) {
+      next = _reader.advance();
+      if (scanLazyAssignmentOperators && next == $equal) {
+        _appendTokenOfType(TokenType.BAR_BAR_EQ);
+        return _reader.advance();
+      }
+      _appendTokenOfType(TokenType.BAR_BAR);
+      return next;
+    } else if (next == $equal) {
+      _appendTokenOfType(TokenType.BAR_EQ);
+      return _reader.advance();
+    } else {
+      _appendTokenOfType(TokenType.BAR);
+      return next;
+    }
+  }
+
+  int _tokenizeCaret(int next) =>
+      _select($equal, TokenType.CARET_EQ, TokenType.CARET);
+
+  int _tokenizeDotOrNumber(int next) {
+    int start = _reader.offset;
+    next = _reader.advance();
+    if ($0 <= next && next <= $9) {
+      return _tokenizeFractionPart(next, start);
+    } else if ($dot == next) {
+      return _select(
+          $dot, TokenType.PERIOD_PERIOD_PERIOD, TokenType.PERIOD_PERIOD);
+    } else {
+      _appendTokenOfType(TokenType.PERIOD);
+      return next;
+    }
+  }
+
+  int _tokenizeEquals(int next) {
+    // = == =>
+    next = _reader.advance();
+    if (next == $equal) {
+      _appendTokenOfType(TokenType.EQ_EQ);
+      return _reader.advance();
+    } else if (next == $gt) {
+      _appendTokenOfType(TokenType.FUNCTION);
+      return _reader.advance();
+    }
+    _appendTokenOfType(TokenType.EQ);
+    return next;
+  }
+
+  int _tokenizeExclamation(int next) {
+    // ! !=
+    next = _reader.advance();
+    if (next == $equal) {
+      _appendTokenOfType(TokenType.BANG_EQ);
+      return _reader.advance();
+    }
+    _appendTokenOfType(TokenType.BANG);
+    return next;
+  }
+
+  int _tokenizeExponent(int next) {
+    if (next == $plus || next == $minus) {
+      next = _reader.advance();
+    }
+    bool hasDigits = false;
+    while (true) {
+      if ($0 <= next && next <= $9) {
+        hasDigits = true;
+      } else {
+        if (!hasDigits) {
+          _reportError(ScannerErrorCode.MISSING_DIGIT);
+        }
+        return next;
+      }
+      next = _reader.advance();
+    }
+  }
+
+  int _tokenizeFractionPart(int next, int start) {
+    bool done = false;
+    bool hasDigit = false;
+    LOOP:
+    while (!done) {
+      if ($0 <= next && next <= $9) {
+        hasDigit = true;
+      } else if ($e == next || $E == next) {
+        hasDigit = true;
+        next = _tokenizeExponent(_reader.advance());
+        done = true;
+        continue LOOP;
+      } else {
+        done = true;
+        continue LOOP;
+      }
+      next = _reader.advance();
+    }
+    if (!hasDigit) {
+      _appendStringToken(TokenType.INT, _reader.getString(start, -2));
+      if ($dot == next) {
+        return _selectWithOffset($dot, TokenType.PERIOD_PERIOD_PERIOD,
+            TokenType.PERIOD_PERIOD, _reader.offset - 1);
+      }
+      _appendTokenOfTypeWithOffset(TokenType.PERIOD, _reader.offset - 1);
+      return bigSwitch(next);
+    }
+    _appendStringToken(
+        TokenType.DOUBLE, _reader.getString(start, next < 0 ? 0 : -1));
+    return next;
+  }
+
+  int _tokenizeGreaterThan(int next) {
+    // > >= >> >>=
+    next = _reader.advance();
+    if ($equal == next) {
+      _appendTokenOfType(TokenType.GT_EQ);
+      return _reader.advance();
+    } else if ($gt == next) {
+      next = _reader.advance();
+      if ($equal == next) {
+        _appendTokenOfType(TokenType.GT_GT_EQ);
+        return _reader.advance();
+      } else {
+        _appendTokenOfType(TokenType.GT_GT);
+        return next;
+      }
+    } else {
+      _appendTokenOfType(TokenType.GT);
+      return next;
+    }
+  }
+
+  int _tokenizeHex(int next) {
+    int start = _reader.offset - 1;
+    bool hasDigits = false;
+    while (true) {
+      next = _reader.advance();
+      if (($0 <= next && next <= $9) ||
+          ($A <= next && next <= $F) ||
+          ($a <= next && next <= $f)) {
+        hasDigits = true;
+      } else {
+        if (!hasDigits) {
+          _reportError(ScannerErrorCode.MISSING_HEX_DIGIT);
+        }
+        _appendStringToken(
+            TokenType.HEXADECIMAL, _reader.getString(start, next < 0 ? 0 : -1));
+        return next;
+      }
+    }
+  }
+
+  int _tokenizeHexOrNumber(int next) {
+    int x = _reader.peek();
+    if (x == $x || x == $X) {
+      _reader.advance();
+      return _tokenizeHex(x);
+    }
+    return _tokenizeNumber(next);
+  }
+
+  int _tokenizeIdentifier(int next, int start, bool allowDollar) {
+    while (($a <= next && next <= $z) ||
+        ($A <= next && next <= $Z) ||
+        ($0 <= next && next <= $9) ||
+        next == $_ ||
+        (next == $$ && allowDollar)) {
+      next = _reader.advance();
+    }
+    _appendStringToken(
+        TokenType.IDENTIFIER, _reader.getString(start, next < 0 ? 0 : -1));
+    return next;
+  }
+
+  int _tokenizeInterpolatedExpression(int next, int start) {
+    _appendBeginToken(TokenType.STRING_INTERPOLATION_EXPRESSION);
+    next = _reader.advance();
+    while (next != -1) {
+      if (next == $rbrace) {
+        BeginToken begin =
+            _findTokenMatchingClosingBraceInInterpolationExpression();
+        if (begin == null) {
+          _beginToken();
+          _appendTokenOfType(TokenType.CLOSE_CURLY_BRACKET);
+          next = _reader.advance();
+          _beginToken();
+          return next;
+        } else if (begin.type == TokenType.OPEN_CURLY_BRACKET) {
+          _beginToken();
+          _appendEndToken(
+              TokenType.CLOSE_CURLY_BRACKET, TokenType.OPEN_CURLY_BRACKET);
+          next = _reader.advance();
+          _beginToken();
+        } else if (begin.type == TokenType.STRING_INTERPOLATION_EXPRESSION) {
+          _beginToken();
+          _appendEndToken(TokenType.CLOSE_CURLY_BRACKET,
+              TokenType.STRING_INTERPOLATION_EXPRESSION);
+          next = _reader.advance();
+          _beginToken();
+          return next;
+        }
+      } else {
+        next = bigSwitch(next);
+      }
+    }
+    return next;
+  }
+
+  int _tokenizeInterpolatedIdentifier(int next, int start) {
+    _appendStringTokenWithOffset(
+        TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 0);
+    if (($A <= next && next <= $Z) ||
+        ($a <= next && next <= $z) ||
+        next == $_) {
+      _beginToken();
+      next = _tokenizeKeywordOrIdentifier(next, false);
+    }
+    _beginToken();
+    return next;
+  }
+
+  int _tokenizeKeywordOrIdentifier(int next, bool allowDollar) {
+    KeywordState state = KeywordState.KEYWORD_STATE;
+    int start = _reader.offset;
+    while (state != null && $a <= next && next <= $z) {
+      state = state.next(next);
+      next = _reader.advance();
+    }
+    if (state == null || state.keyword() == null) {
+      return _tokenizeIdentifier(next, start, allowDollar);
+    }
+    if (($A <= next && next <= $Z) ||
+        ($0 <= next && next <= $9) ||
+        next == $_ ||
+        next == $$) {
+      return _tokenizeIdentifier(next, start, allowDollar);
+    } else if (next < 128) {
+      _appendKeywordToken(state.keyword());
+      return next;
+    } else {
+      return _tokenizeIdentifier(next, start, allowDollar);
+    }
+  }
+
+  int _tokenizeLessThan(int next) {
+    // < <= << <<=
+    next = _reader.advance();
+    if ($equal == next) {
+      _appendTokenOfType(TokenType.LT_EQ);
+      return _reader.advance();
+    } else if ($lt == next) {
+      return _select($equal, TokenType.LT_LT_EQ, TokenType.LT_LT);
+    } else {
+      _appendTokenOfType(TokenType.LT);
+      return next;
+    }
+  }
+
+  int _tokenizeMinus(int next) {
+    // - -- -=
+    next = _reader.advance();
+    if (next == $minus) {
+      _appendTokenOfType(TokenType.MINUS_MINUS);
+      return _reader.advance();
+    } else if (next == $equal) {
+      _appendTokenOfType(TokenType.MINUS_EQ);
+      return _reader.advance();
+    } else {
+      _appendTokenOfType(TokenType.MINUS);
+      return next;
+    }
+  }
+
+  int _tokenizeMultiLineComment(int next) {
+    int nesting = 1;
+    next = _reader.advance();
+    while (true) {
+      if (-1 == next) {
+        _reportError(ScannerErrorCode.UNTERMINATED_MULTI_LINE_COMMENT);
+        _appendCommentToken(
+            TokenType.MULTI_LINE_COMMENT, _reader.getString(_tokenStart, 0));
+        return next;
+      } else if ($asterisk == next) {
+        next = _reader.advance();
+        if ($slash == next) {
+          --nesting;
+          if (0 == nesting) {
+            _appendCommentToken(TokenType.MULTI_LINE_COMMENT,
+                _reader.getString(_tokenStart, 0));
+            return _reader.advance();
+          } else {
+            next = _reader.advance();
+          }
+        }
+      } else if ($slash == next) {
+        next = _reader.advance();
+        if ($asterisk == next) {
+          next = _reader.advance();
+          ++nesting;
+        }
+      } else if (next == $cr) {
+        next = _reader.advance();
+        if (next == $lf) {
+          next = _reader.advance();
+        }
+        recordStartOfLine();
+      } else if (next == $lf) {
+        next = _reader.advance();
+        recordStartOfLine();
+      } else {
+        next = _reader.advance();
+      }
+    }
+  }
+
+  int _tokenizeMultiLineRawString(int quoteChar, int start) {
+    int next = _reader.advance();
+    outer:
+    while (next != -1) {
+      while (next != quoteChar) {
+        if (next == -1) {
+          break outer;
+        } else if (next == $cr) {
+          next = _reader.advance();
+          if (next == $lf) {
+            next = _reader.advance();
+          }
+          recordStartOfLine();
+        } else if (next == $lf) {
+          next = _reader.advance();
+          recordStartOfLine();
+        } else {
+          next = _reader.advance();
+        }
+      }
+      next = _reader.advance();
+      if (next == quoteChar) {
+        next = _reader.advance();
+        if (next == quoteChar) {
+          _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
+          return _reader.advance();
+        }
+      }
+    }
+    _reportError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL);
+    _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
+    return _reader.advance();
+  }
+
+  int _tokenizeMultiLineString(int quoteChar, int start, bool raw) {
+    if (raw) {
+      return _tokenizeMultiLineRawString(quoteChar, start);
+    }
+    int next = _reader.advance();
+    while (next != -1) {
+      if (next == $$) {
+        _appendStringToken(TokenType.STRING, _reader.getString(start, -1));
+        next = _tokenizeStringInterpolation(start);
+        _beginToken();
+        start = _reader.offset;
+        continue;
+      }
+      if (next == quoteChar) {
+        next = _reader.advance();
+        if (next == quoteChar) {
+          next = _reader.advance();
+          if (next == quoteChar) {
+            _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
+            return _reader.advance();
+          }
+        }
+        continue;
+      }
+      if (next == $backslash) {
+        next = _reader.advance();
+        if (next == -1) {
+          break;
+        }
+        if (next == $cr) {
+          next = _reader.advance();
+          if (next == $lf) {
+            next = _reader.advance();
+          }
+          recordStartOfLine();
+        } else if (next == $lf) {
+          recordStartOfLine();
+          next = _reader.advance();
+        } else {
+          next = _reader.advance();
+        }
+      } else if (next == $cr) {
+        next = _reader.advance();
+        if (next == $lf) {
+          next = _reader.advance();
+        }
+        recordStartOfLine();
+      } else if (next == $lf) {
+        recordStartOfLine();
+        next = _reader.advance();
+      } else {
+        next = _reader.advance();
+      }
+    }
+    _reportError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL);
+    if (start == _reader.offset) {
+      _appendStringTokenWithOffset(TokenType.STRING, "", 1);
+    } else {
+      _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
+    }
+    return _reader.advance();
+  }
+
+  int _tokenizeMultiply(int next) =>
+      _select($equal, TokenType.STAR_EQ, TokenType.STAR);
+
+  int _tokenizeNumber(int next) {
+    int start = _reader.offset;
+    while (true) {
+      next = _reader.advance();
+      if ($0 <= next && next <= $9) {
+        continue;
+      } else if (next == $dot) {
+        return _tokenizeFractionPart(_reader.advance(), start);
+      } else if (next == $e || next == $E) {
+        return _tokenizeFractionPart(next, start);
+      } else {
+        _appendStringToken(
+            TokenType.INT, _reader.getString(start, next < 0 ? 0 : -1));
+        return next;
+      }
+    }
+  }
+
+  int _tokenizeOpenSquareBracket(int next) {
+    // [ []  []=
+    next = _reader.advance();
+    if (next == $close_bracket) {
+      return _select($equal, TokenType.INDEX_EQ, TokenType.INDEX);
+    } else {
+      _appendBeginToken(TokenType.OPEN_SQUARE_BRACKET);
+      return next;
+    }
+  }
+
+  int _tokenizePercent(int next) =>
+      _select($equal, TokenType.PERCENT_EQ, TokenType.PERCENT);
+
+  int _tokenizePlus(int next) {
+    // + ++ +=
+    next = _reader.advance();
+    if ($plus == next) {
+      _appendTokenOfType(TokenType.PLUS_PLUS);
+      return _reader.advance();
+    } else if ($equal == next) {
+      _appendTokenOfType(TokenType.PLUS_EQ);
+      return _reader.advance();
+    } else {
+      _appendTokenOfType(TokenType.PLUS);
+      return next;
+    }
+  }
+
+  int _tokenizeQuestion() {
+    // ? ?. ?? ??=
+    int next = _reader.advance();
+    if (next == $dot) {
+      // '.'
+      _appendTokenOfType(TokenType.QUESTION_PERIOD);
+      return _reader.advance();
+    } else if (next == $question) {
+      // '?'
+      next = _reader.advance();
+      if (next == $equal) {
+        // '='
+        _appendTokenOfType(TokenType.QUESTION_QUESTION_EQ);
+        return _reader.advance();
+      } else {
+        _appendTokenOfType(TokenType.QUESTION_QUESTION);
+        return next;
+      }
+    } else {
+      _appendTokenOfType(TokenType.QUESTION);
+      return next;
+    }
+  }
+
+  int _tokenizeSingleLineComment(int next) {
+    while (true) {
+      next = _reader.advance();
+      if (-1 == next) {
+        _appendCommentToken(
+            TokenType.SINGLE_LINE_COMMENT, _reader.getString(_tokenStart, 0));
+        return next;
+      } else if ($lf == next || $cr == next) {
+        _appendCommentToken(
+            TokenType.SINGLE_LINE_COMMENT, _reader.getString(_tokenStart, -1));
+        return next;
+      }
+    }
+  }
+
+  int _tokenizeSingleLineRawString(int next, int quoteChar, int start) {
+    next = _reader.advance();
+    while (next != -1) {
+      if (next == quoteChar) {
+        _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
+        return _reader.advance();
+      } else if (next == $cr || next == $lf) {
+        _reportError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL);
+        _appendStringToken(TokenType.STRING, _reader.getString(start, -1));
+        return _reader.advance();
+      }
+      next = _reader.advance();
+    }
+    _reportError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL);
+    _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
+    return _reader.advance();
+  }
+
+  int _tokenizeSingleLineString(int next, int quoteChar, int start) {
+    while (next != quoteChar) {
+      if (next == $backslash) {
+        next = _reader.advance();
+      } else if (next == $$) {
+        _appendStringToken(TokenType.STRING, _reader.getString(start, -1));
+        next = _tokenizeStringInterpolation(start);
+        _beginToken();
+        start = _reader.offset;
+        continue;
+      }
+      if (next <= $cr && (next == $lf || next == $cr || next == -1)) {
+        _reportError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL);
+        if (start == _reader.offset) {
+          _appendStringTokenWithOffset(TokenType.STRING, "", 1);
+        } else if (next == -1) {
+          _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
+        } else {
+          _appendStringToken(TokenType.STRING, _reader.getString(start, -1));
+        }
+        return _reader.advance();
+      }
+      next = _reader.advance();
+    }
+    _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
+    return _reader.advance();
+  }
+
+  int _tokenizeSlashOrComment(int next) {
+    next = _reader.advance();
+    if ($asterisk == next) {
+      return _tokenizeMultiLineComment(next);
+    } else if ($slash == next) {
+      return _tokenizeSingleLineComment(next);
+    } else if ($equal == next) {
+      _appendTokenOfType(TokenType.SLASH_EQ);
+      return _reader.advance();
+    } else {
+      _appendTokenOfType(TokenType.SLASH);
+      return next;
+    }
+  }
+
+  int _tokenizeString(int next, int start, bool raw) {
+    int quoteChar = next;
+    next = _reader.advance();
+    if (quoteChar == next) {
+      next = _reader.advance();
+      if (quoteChar == next) {
+        // Multiline string.
+        return _tokenizeMultiLineString(quoteChar, start, raw);
+      } else {
+        // Empty string.
+        _appendStringToken(TokenType.STRING, _reader.getString(start, -1));
+        return next;
+      }
+    }
+    if (raw) {
+      return _tokenizeSingleLineRawString(next, quoteChar, start);
+    } else {
+      return _tokenizeSingleLineString(next, quoteChar, start);
+    }
+  }
+
+  int _tokenizeStringInterpolation(int start) {
+    _beginToken();
+    int next = _reader.advance();
+    if (next == $lbrace) {
+      return _tokenizeInterpolatedExpression(next, start);
+    } else {
+      return _tokenizeInterpolatedIdentifier(next, start);
+    }
+  }
+
+  int _tokenizeTag(int next) {
+    // # or #!.*[\n\r]
+    if (_reader.offset == 0) {
+      if (_reader.peek() == $exclamation) {
+        do {
+          next = _reader.advance();
+        } while (next != $lf && next != $cr && next > 0);
+        _appendStringToken(
+            TokenType.SCRIPT_TAG, _reader.getString(_tokenStart, 0));
+        return next;
+      }
+    }
+    _appendTokenOfType(TokenType.HASH);
+    return _reader.advance();
+  }
+
+  int _tokenizeTilde(int next) {
+    // ~ ~/ ~/=
+    next = _reader.advance();
+    if (next == $slash) {
+      return _select($equal, TokenType.TILDE_SLASH_EQ, TokenType.TILDE_SLASH);
+    } else {
+      _appendTokenOfType(TokenType.TILDE);
+      return next;
+    }
+  }
+
+  /**
+   * Checks if [value] is a single-line or multi-line comment.
+   */
+  static bool _isDocumentationComment(String value) {
+    return StringUtilities.startsWith3(value, 0, $slash, $slash, $slash) ||
+        StringUtilities.startsWith3(value, 0, $slash, $asterisk, $asterisk);
+  }
+}
diff --git a/pkg/front_end/lib/src/scanner/string_utilities.dart b/pkg/front_end/lib/src/scanner/string_utilities.dart
new file mode 100644
index 0000000..8387923
--- /dev/null
+++ b/pkg/front_end/lib/src/scanner/string_utilities.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2016, 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:front_end/src/scanner/interner.dart';
+
+class StringUtilities {
+  static Interner INTERNER = new NullInterner();
+
+  static bool endsWith3(String str, int c1, int c2, int c3) {
+    var length = str.length;
+    return length >= 3 &&
+        str.codeUnitAt(length - 3) == c1 &&
+        str.codeUnitAt(length - 2) == c2 &&
+        str.codeUnitAt(length - 1) == c3;
+  }
+
+  static String intern(String string) => INTERNER.intern(string);
+
+  static bool startsWith3(String str, int start, int c1, int c2, int c3) {
+    return str.length - start >= 3 &&
+        str.codeUnitAt(start) == c1 &&
+        str.codeUnitAt(start + 1) == c2 &&
+        str.codeUnitAt(start + 2) == c3;
+  }
+}
diff --git a/pkg/front_end/lib/src/scanner/syntactic_entity.dart b/pkg/front_end/lib/src/scanner/syntactic_entity.dart
new file mode 100644
index 0000000..b21a503
--- /dev/null
+++ b/pkg/front_end/lib/src/scanner/syntactic_entity.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2016, 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.
+
+/**
+ * Interface representing a syntactic entity (either a token or an AST node)
+ * which has a location and extent in the source file.
+ */
+abstract class SyntacticEntity {
+  /**
+   * Return the offset from the beginning of the file to the character after the
+   * last character of the syntactic entity.
+   */
+  int get end;
+
+  /**
+   * Return the number of characters in the syntactic entity's source range.
+   */
+  int get length;
+
+  /**
+   * Return the offset from the beginning of the file to the first character in
+   * the syntactic entity.
+   */
+  int get offset;
+}
diff --git a/pkg/front_end/lib/src/scanner/token.dart b/pkg/front_end/lib/src/scanner/token.dart
new file mode 100644
index 0000000..10d4924
--- /dev/null
+++ b/pkg/front_end/lib/src/scanner/token.dart
@@ -0,0 +1,1294 @@
+// Copyright (c) 2016, 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.
+
+/**
+ * Defines the tokens that are produced by the scanner, used by the parser, and
+ * referenced from the [AST structure](ast.dart).
+ */
+
+import 'dart:collection';
+
+import 'package:front_end/src/scanner/string_utilities.dart';
+import 'package:front_end/src/scanner/syntactic_entity.dart';
+
+/**
+ * The opening half of a grouping pair of tokens. This is used for curly
+ * brackets ('{'), parentheses ('('), and square brackets ('[').
+ */
+class BeginToken extends SimpleToken {
+  /**
+   * The token that corresponds to this token.
+   */
+  Token endToken;
+
+  /**
+   * Initialize a newly created token to have the given [type] at the given
+   * [offset].
+   */
+  BeginToken(TokenType type, int offset) : super(type, offset) {
+    assert(type == TokenType.OPEN_CURLY_BRACKET ||
+        type == TokenType.OPEN_PAREN ||
+        type == TokenType.OPEN_SQUARE_BRACKET ||
+        type == TokenType.STRING_INTERPOLATION_EXPRESSION);
+  }
+
+  @override
+  Token copy() => new BeginToken(type, offset);
+}
+
+/**
+ * A begin token that is preceded by comments.
+ */
+class BeginTokenWithComment extends BeginToken implements TokenWithComment {
+  /**
+   * The first comment in the list of comments that precede this token.
+   */
+  @override
+  CommentToken _precedingComment;
+
+  /**
+   * Initialize a newly created token to have the given [type] at the given
+   * [offset] and to be preceded by the comments reachable from the given
+   * [_precedingComment].
+   */
+  BeginTokenWithComment(TokenType type, int offset, this._precedingComment)
+      : super(type, offset) {
+    _setCommentParent(_precedingComment);
+  }
+
+  @override
+  CommentToken get precedingComments => _precedingComment;
+
+  @override
+  void set precedingComments(CommentToken comment) {
+    _precedingComment = comment;
+    _setCommentParent(_precedingComment);
+  }
+
+  @override
+  void applyDelta(int delta) {
+    super.applyDelta(delta);
+    Token token = precedingComments;
+    while (token != null) {
+      token.applyDelta(delta);
+      token = token.next;
+    }
+  }
+
+  @override
+  Token copy() =>
+      new BeginTokenWithComment(type, offset, copyComments(precedingComments));
+}
+
+/**
+ * A token representing a comment.
+ */
+class CommentToken extends StringToken {
+  /**
+   * The token that contains this comment.
+   */
+  TokenWithComment parent;
+
+  /**
+   * Initialize a newly created token to represent a token of the given [type]
+   * with the given [value] at the given [offset].
+   */
+  CommentToken(TokenType type, String value, int offset)
+      : super(type, value, offset);
+
+  @override
+  CommentToken copy() => new CommentToken(type, _value, offset);
+
+  /**
+   * Remove this comment token from the list.
+   *
+   * This is used when we decide to interpret the comment as syntax.
+   */
+  void remove() {
+    if (previous != null) {
+      previous.setNextWithoutSettingPrevious(next);
+      next?.previous = previous;
+    } else {
+      assert(parent.precedingComments == this);
+      parent.precedingComments = next;
+    }
+  }
+}
+
+/**
+ * A documentation comment token.
+ */
+class DocumentationCommentToken extends CommentToken {
+  /**
+   * The references embedded within the documentation comment.
+   * This list will be empty unless this is a documentation comment that has
+   * references embedded within it.
+   */
+  final List<Token> references = <Token>[];
+
+  /**
+   * Initialize a newly created token to represent a token of the given [type]
+   * with the given [value] at the given [offset].
+   */
+  DocumentationCommentToken(TokenType type, String value, int offset)
+      : super(type, value, offset);
+
+  @override
+  CommentToken copy() {
+    DocumentationCommentToken copy =
+        new DocumentationCommentToken(type, _value, offset);
+    references.forEach((ref) => copy.references.add(ref.copy()));
+    return copy;
+  }
+}
+
+/**
+ * The keywords in the Dart programming language.
+ *
+ * Clients may not extend, implement or mix-in this class.
+ */
+class Keyword {
+  static const Keyword ABSTRACT = const Keyword._('ABSTRACT', "abstract", true);
+
+  static const Keyword AS = const Keyword._('AS', "as", true);
+
+  static const Keyword ASSERT = const Keyword._('ASSERT', "assert");
+
+  static const Keyword BREAK = const Keyword._('BREAK', "break");
+
+  static const Keyword CASE = const Keyword._('CASE', "case");
+
+  static const Keyword CATCH = const Keyword._('CATCH', "catch");
+
+  static const Keyword CLASS = const Keyword._('CLASS', "class");
+
+  static const Keyword CONST = const Keyword._('CONST', "const");
+
+  static const Keyword CONTINUE = const Keyword._('CONTINUE', "continue");
+
+  static const Keyword DEFAULT = const Keyword._('DEFAULT', "default");
+
+  static const Keyword DEFERRED = const Keyword._('DEFERRED', "deferred", true);
+
+  static const Keyword DO = const Keyword._('DO', "do");
+
+  static const Keyword DYNAMIC = const Keyword._('DYNAMIC', "dynamic", true);
+
+  static const Keyword ELSE = const Keyword._('ELSE', "else");
+
+  static const Keyword ENUM = const Keyword._('ENUM', "enum");
+
+  static const Keyword EXPORT = const Keyword._('EXPORT', "export", true);
+
+  static const Keyword EXTENDS = const Keyword._('EXTENDS', "extends");
+
+  static const Keyword EXTERNAL = const Keyword._('EXTERNAL', "external", true);
+
+  static const Keyword FACTORY = const Keyword._('FACTORY', "factory", true);
+
+  static const Keyword FALSE = const Keyword._('FALSE', "false");
+
+  static const Keyword FINAL = const Keyword._('FINAL', "final");
+
+  static const Keyword FINALLY = const Keyword._('FINALLY', "finally");
+
+  static const Keyword FOR = const Keyword._('FOR', "for");
+
+  static const Keyword GET = const Keyword._('GET', "get", true);
+
+  static const Keyword IF = const Keyword._('IF', "if");
+
+  static const Keyword IMPLEMENTS =
+      const Keyword._('IMPLEMENTS', "implements", true);
+
+  static const Keyword IMPORT = const Keyword._('IMPORT', "import", true);
+
+  static const Keyword IN = const Keyword._('IN', "in");
+
+  static const Keyword IS = const Keyword._('IS', "is");
+
+  static const Keyword LIBRARY = const Keyword._('LIBRARY', "library", true);
+
+  static const Keyword NEW = const Keyword._('NEW', "new");
+
+  static const Keyword NULL = const Keyword._('NULL', "null");
+
+  static const Keyword OPERATOR = const Keyword._('OPERATOR', "operator", true);
+
+  static const Keyword PART = const Keyword._('PART', "part", true);
+
+  static const Keyword RETHROW = const Keyword._('RETHROW', "rethrow");
+
+  static const Keyword RETURN = const Keyword._('RETURN', "return");
+
+  static const Keyword SET = const Keyword._('SET', "set", true);
+
+  static const Keyword STATIC = const Keyword._('STATIC', "static", true);
+
+  static const Keyword SUPER = const Keyword._('SUPER', "super");
+
+  static const Keyword SWITCH = const Keyword._('SWITCH', "switch");
+
+  static const Keyword THIS = const Keyword._('THIS', "this");
+
+  static const Keyword THROW = const Keyword._('THROW', "throw");
+
+  static const Keyword TRUE = const Keyword._('TRUE', "true");
+
+  static const Keyword TRY = const Keyword._('TRY', "try");
+
+  static const Keyword TYPEDEF = const Keyword._('TYPEDEF', "typedef", true);
+
+  static const Keyword VAR = const Keyword._('VAR', "var");
+
+  static const Keyword VOID = const Keyword._('VOID', "void");
+
+  static const Keyword WHILE = const Keyword._('WHILE', "while");
+
+  static const Keyword WITH = const Keyword._('WITH', "with");
+
+  static const List<Keyword> values = const <Keyword>[
+    ABSTRACT,
+    AS,
+    ASSERT,
+    BREAK,
+    CASE,
+    CATCH,
+    CLASS,
+    CONST,
+    CONTINUE,
+    DEFAULT,
+    DEFERRED,
+    DO,
+    DYNAMIC,
+    ELSE,
+    ENUM,
+    EXPORT,
+    EXTENDS,
+    EXTERNAL,
+    FACTORY,
+    FALSE,
+    FINAL,
+    FINALLY,
+    FOR,
+    GET,
+    IF,
+    IMPLEMENTS,
+    IMPORT,
+    IN,
+    IS,
+    LIBRARY,
+    NEW,
+    NULL,
+    OPERATOR,
+    PART,
+    RETHROW,
+    RETURN,
+    SET,
+    STATIC,
+    SUPER,
+    SWITCH,
+    THIS,
+    THROW,
+    TRUE,
+    TRY,
+    TYPEDEF,
+    VAR,
+    VOID,
+    WHILE,
+    WITH,
+  ];
+
+  /**
+   * A table mapping the lexemes of keywords to the corresponding keyword.
+   */
+  static final Map<String, Keyword> keywords = _createKeywordMap();
+
+  /**
+   * The name of the keyword type.
+   */
+  final String name;
+
+  /**
+   * The lexeme for the keyword.
+   */
+  final String syntax;
+
+  /**
+   * A flag indicating whether the keyword is a pseudo-keyword. Pseudo keywords
+   * can be used as identifiers.
+   */
+  final bool isPseudoKeyword;
+
+  /**
+   * Initialize a newly created keyword to have the given [name] and [syntax].
+   * The keyword is a pseudo-keyword if the [isPseudoKeyword] flag is `true`.
+   */
+  const Keyword._(this.name, this.syntax, [this.isPseudoKeyword = false]);
+
+  @override
+  String toString() => name;
+
+  /**
+   * Create a table mapping the lexemes of keywords to the corresponding keyword
+   * and return the table that was created.
+   */
+  static Map<String, Keyword> _createKeywordMap() {
+    LinkedHashMap<String, Keyword> result =
+        new LinkedHashMap<String, Keyword>();
+    for (Keyword keyword in values) {
+      result[keyword.syntax] = keyword;
+    }
+    return result;
+  }
+}
+
+/**
+ * A token representing a keyword in the language.
+ */
+class KeywordToken extends SimpleToken {
+  @override
+  final Keyword keyword;
+
+  /**
+   * Initialize a newly created token to represent the given [keyword] at the
+   * given [offset].
+   */
+  KeywordToken(this.keyword, int offset) : super(TokenType.KEYWORD, offset);
+
+  @override
+  String get lexeme => keyword.syntax;
+
+  @override
+  Token copy() => new KeywordToken(keyword, offset);
+
+  @override
+  Keyword value() => keyword;
+}
+
+/**
+ * A keyword token that is preceded by comments.
+ */
+class KeywordTokenWithComment extends KeywordToken implements TokenWithComment {
+  /**
+   * The first comment in the list of comments that precede this token.
+   */
+  @override
+  CommentToken _precedingComment;
+
+  /**
+   * Initialize a newly created token to to represent the given [keyword] at the
+   * given [offset] and to be preceded by the comments reachable from the given
+   * [_precedingComment].
+   */
+  KeywordTokenWithComment(Keyword keyword, int offset, this._precedingComment)
+      : super(keyword, offset) {
+    _setCommentParent(_precedingComment);
+  }
+
+  @override
+  CommentToken get precedingComments => _precedingComment;
+
+  void set precedingComments(CommentToken comment) {
+    _precedingComment = comment;
+    _setCommentParent(_precedingComment);
+  }
+
+  @override
+  void applyDelta(int delta) {
+    super.applyDelta(delta);
+    Token token = precedingComments;
+    while (token != null) {
+      token.applyDelta(delta);
+      token = token.next;
+    }
+  }
+
+  @override
+  Token copy() => new KeywordTokenWithComment(
+      keyword, offset, copyComments(precedingComments));
+}
+
+/**
+ * A token that was scanned from the input. Each token knows which tokens
+ * precede and follow it, acting as a link in a doubly linked list of tokens.
+ */
+class SimpleToken implements Token {
+  /**
+   * The type of the token.
+   */
+  @override
+  final TokenType type;
+
+  /**
+   * The offset from the beginning of the file to the first character in the
+   * token.
+   */
+  @override
+  int offset = 0;
+
+  /**
+   * The previous token in the token stream.
+   */
+  @override
+  Token previous;
+
+  /**
+   * The next token in the token stream.
+   */
+  Token _next;
+
+  /**
+   * Initialize a newly created token to have the given [type] and [offset].
+   */
+  SimpleToken(this.type, this.offset);
+
+  @override
+  int get end => offset + length;
+
+  @override
+  bool get isOperator => type.isOperator;
+
+  @override
+  bool get isSynthetic => length == 0;
+
+  @override
+  bool get isUserDefinableOperator => type.isUserDefinableOperator;
+
+  @override
+  Keyword get keyword => null;
+
+  @override
+  int get length => lexeme.length;
+
+  @override
+  String get lexeme => type.lexeme;
+
+  @override
+  Token get next => _next;
+
+  @override
+  CommentToken get precedingComments => null;
+
+  @override
+  void applyDelta(int delta) {
+    offset += delta;
+  }
+
+  @override
+  Token copy() => new Token(type, offset);
+
+  @override
+  Token copyComments(Token token) {
+    if (token == null) {
+      return null;
+    }
+    Token head = token.copy();
+    Token tail = head;
+    token = token.next;
+    while (token != null) {
+      tail = tail.setNext(token.copy());
+      token = token.next;
+    }
+    return head;
+  }
+
+  @override
+  bool matchesAny(List<TokenType> types) {
+    for (TokenType type in types) {
+      if (this.type == type) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  @override
+  Token setNext(Token token) {
+    _next = token;
+    token.previous = this;
+    return token;
+  }
+
+  @override
+  Token setNextWithoutSettingPrevious(Token token) {
+    _next = token;
+    return token;
+  }
+
+  @override
+  String toString() => lexeme;
+
+  @override
+  Object value() => type.lexeme;
+
+  /**
+   * Sets the `parent` property to `this` for the given [comment] and all the
+   * next tokens.
+   */
+  void _setCommentParent(CommentToken comment) {
+    while (comment != null) {
+      comment.parent = this;
+      comment = comment.next;
+    }
+  }
+}
+
+/**
+ * A token whose value is independent of it's type.
+ */
+class StringToken extends SimpleToken {
+  /**
+   * The lexeme represented by this token.
+   */
+  String _value;
+
+  /**
+   * Initialize a newly created token to represent a token of the given [type]
+   * with the given [value] at the given [offset].
+   */
+  StringToken(TokenType type, String value, int offset) : super(type, offset) {
+    this._value = StringUtilities.intern(value);
+  }
+
+  @override
+  String get lexeme => _value;
+
+  @override
+  Token copy() => new StringToken(type, _value, offset);
+
+  @override
+  String value() => _value;
+}
+
+/**
+ * A string token that is preceded by comments.
+ */
+class StringTokenWithComment extends StringToken implements TokenWithComment {
+  /**
+   * The first comment in the list of comments that precede this token.
+   */
+  CommentToken _precedingComment;
+
+  /**
+   * Initialize a newly created token to have the given [type] at the given
+   * [offset] and to be preceded by the comments reachable from the given
+   * [comment].
+   */
+  StringTokenWithComment(
+      TokenType type, String value, int offset, this._precedingComment)
+      : super(type, value, offset) {
+    _setCommentParent(_precedingComment);
+  }
+
+  @override
+  CommentToken get precedingComments => _precedingComment;
+
+  void set precedingComments(CommentToken comment) {
+    _precedingComment = comment;
+    _setCommentParent(_precedingComment);
+  }
+
+  @override
+  void applyDelta(int delta) {
+    super.applyDelta(delta);
+    Token token = precedingComments;
+    while (token != null) {
+      token.applyDelta(delta);
+      token = token.next;
+    }
+  }
+
+  @override
+  Token copy() => new StringTokenWithComment(
+      type, lexeme, offset, copyComments(precedingComments));
+}
+
+/**
+ * A token that was scanned from the input. Each token knows which tokens
+ * precede and follow it, acting as a link in a doubly linked list of tokens.
+ *
+ * Clients may not extend, implement or mix-in this class.
+ */
+abstract class Token implements SyntacticEntity {
+  /**
+   * Initialize a newly created token to have the given [type] and [offset].
+   */
+  factory Token(TokenType type, int offset) = SimpleToken;
+
+  @override
+  int get end;
+
+  /**
+   * Return `true` if this token represents an operator.
+   */
+  bool get isOperator;
+
+  /**
+   * Return `true` if this token is a synthetic token. A synthetic token is a
+   * token that was introduced by the parser in order to recover from an error
+   * in the code.
+   */
+  bool get isSynthetic;
+
+  /**
+   * Return `true` if this token represents an operator that can be defined by
+   * users.
+   */
+  bool get isUserDefinableOperator;
+
+  /**
+   * Return the keyword, if a keyword token, or `null` otherwise.
+   */
+  Keyword get keyword;
+
+  @override
+  int get length;
+
+  /**
+   * Return the lexeme that represents this token.
+   */
+  String get lexeme;
+
+  /**
+   * Return the next token in the token stream.
+   */
+  Token get next;
+
+  @override
+  int get offset;
+
+  /**
+   * Set the offset from the beginning of the file to the first character in
+   * the token to the given [offset].
+   */
+  void set offset(int offset);
+
+  /**
+   * Return the first comment in the list of comments that precede this token,
+   * or `null` if there are no comments preceding this token. Additional
+   * comments can be reached by following the token stream using [next] until
+   * `null` is returned.
+   *
+   * For example, if the original contents were `/* one */ /* two */ id`, then
+   * the first preceding comment token will have a lexeme of `/* one */` and
+   * the next comment token will have a lexeme of `/* two */`.
+   */
+  Token get precedingComments;
+
+  /**
+   * Return the previous token in the token stream.
+   */
+  Token get previous;
+
+  /**
+   * Set the previous token in the token stream to the given [token].
+   */
+  void set previous(Token token);
+
+  /**
+   * Return the type of the token.
+   */
+  TokenType get type;
+
+  /**
+   * Apply (add) the given [delta] to this token's offset.
+   */
+  void applyDelta(int delta);
+
+  /**
+   * Return a newly created token that is a copy of this token but that is not a
+   * part of any token stream.
+   */
+  Token copy();
+
+  /**
+   * Copy a linked list of comment tokens identical to the given comment tokens.
+   */
+  Token copyComments(Token token);
+
+  /**
+   * Return `true` if this token has any one of the given [types].
+   */
+  bool matchesAny(List<TokenType> types);
+
+  /**
+   * Set the next token in the token stream to the given [token]. This has the
+   * side-effect of setting this token to be the previous token for the given
+   * token. Return the token that was passed in.
+   */
+  Token setNext(Token token);
+
+  /**
+   * Set the next token in the token stream to the given token without changing
+   * which token is the previous token for the given token. Return the token
+   * that was passed in.
+   */
+  Token setNextWithoutSettingPrevious(Token token);
+
+  /**
+   * Return the value of this token. For keyword tokens, this is the keyword
+   * associated with the token, for other tokens it is the lexeme associated
+   * with the token.
+   */
+  Object value();
+
+  /**
+   * Compare the given [tokens] to find the token that appears first in the
+   * source being parsed. That is, return the left-most of all of the tokens.
+   * The list must be non-`null`, but the elements of the list are allowed to be
+   * `null`. Return the token with the smallest offset, or `null` if the list is
+   * empty or if all of the elements of the list are `null`.
+   */
+  static Token lexicallyFirst(List<Token> tokens) {
+    Token first = null;
+    int offset = -1;
+    int length = tokens.length;
+    for (int i = 0; i < length; i++) {
+      Token token = tokens[i];
+      if (token != null && (offset < 0 || token.offset < offset)) {
+        first = token;
+        offset = token.offset;
+      }
+    }
+    return first;
+  }
+}
+
+/**
+ * The classes (or groups) of tokens with a similar use.
+ */
+class TokenClass {
+  /**
+   * A value used to indicate that the token type is not part of any specific
+   * class of token.
+   */
+  static const TokenClass NO_CLASS = const TokenClass('NO_CLASS');
+
+  /**
+   * A value used to indicate that the token type is an additive operator.
+   */
+  static const TokenClass ADDITIVE_OPERATOR =
+      const TokenClass('ADDITIVE_OPERATOR', 13);
+
+  /**
+   * A value used to indicate that the token type is an assignment operator.
+   */
+  static const TokenClass ASSIGNMENT_OPERATOR =
+      const TokenClass('ASSIGNMENT_OPERATOR', 1);
+
+  /**
+   * A value used to indicate that the token type is a bitwise-and operator.
+   */
+  static const TokenClass BITWISE_AND_OPERATOR =
+      const TokenClass('BITWISE_AND_OPERATOR', 11);
+
+  /**
+   * A value used to indicate that the token type is a bitwise-or operator.
+   */
+  static const TokenClass BITWISE_OR_OPERATOR =
+      const TokenClass('BITWISE_OR_OPERATOR', 9);
+
+  /**
+   * A value used to indicate that the token type is a bitwise-xor operator.
+   */
+  static const TokenClass BITWISE_XOR_OPERATOR =
+      const TokenClass('BITWISE_XOR_OPERATOR', 10);
+
+  /**
+   * A value used to indicate that the token type is a cascade operator.
+   */
+  static const TokenClass CASCADE_OPERATOR =
+      const TokenClass('CASCADE_OPERATOR', 2);
+
+  /**
+   * A value used to indicate that the token type is a conditional operator.
+   */
+  static const TokenClass CONDITIONAL_OPERATOR =
+      const TokenClass('CONDITIONAL_OPERATOR', 3);
+
+  /**
+   * A value used to indicate that the token type is an equality operator.
+   */
+  static const TokenClass EQUALITY_OPERATOR =
+      const TokenClass('EQUALITY_OPERATOR', 7);
+
+  /**
+   * A value used to indicate that the token type is an if-null operator.
+   */
+  static const TokenClass IF_NULL_OPERATOR =
+      const TokenClass('IF_NULL_OPERATOR', 4);
+
+  /**
+   * A value used to indicate that the token type is a logical-and operator.
+   */
+  static const TokenClass LOGICAL_AND_OPERATOR =
+      const TokenClass('LOGICAL_AND_OPERATOR', 6);
+
+  /**
+   * A value used to indicate that the token type is a logical-or operator.
+   */
+  static const TokenClass LOGICAL_OR_OPERATOR =
+      const TokenClass('LOGICAL_OR_OPERATOR', 5);
+
+  /**
+   * A value used to indicate that the token type is a multiplicative operator.
+   */
+  static const TokenClass MULTIPLICATIVE_OPERATOR =
+      const TokenClass('MULTIPLICATIVE_OPERATOR', 14);
+
+  /**
+   * A value used to indicate that the token type is a relational operator.
+   */
+  static const TokenClass RELATIONAL_OPERATOR =
+      const TokenClass('RELATIONAL_OPERATOR', 8);
+
+  /**
+   * A value used to indicate that the token type is a shift operator.
+   */
+  static const TokenClass SHIFT_OPERATOR =
+      const TokenClass('SHIFT_OPERATOR', 12);
+
+  /**
+   * A value used to indicate that the token type is a unary operator.
+   */
+  static const TokenClass UNARY_POSTFIX_OPERATOR =
+      const TokenClass('UNARY_POSTFIX_OPERATOR', 16);
+
+  /**
+   * A value used to indicate that the token type is a unary operator.
+   */
+  static const TokenClass UNARY_PREFIX_OPERATOR =
+      const TokenClass('UNARY_PREFIX_OPERATOR', 15);
+
+  /**
+   * The name of the token class.
+   */
+  final String name;
+
+  /**
+   * The precedence of tokens of this class, or `0` if the such tokens do not
+   * represent an operator.
+   */
+  final int precedence;
+
+  /**
+   * Initialize a newly created class of tokens to have the given [name] and
+   * [precedence].
+   */
+  const TokenClass(this.name, [this.precedence = 0]);
+
+  @override
+  String toString() => name;
+}
+
+/**
+ * The types of tokens that can be returned by the scanner.
+ *
+ * Clients may not extend, implement or mix-in this class.
+ */
+class TokenType {
+  /**
+   * The type of the token that marks the start or end of the input.
+   */
+  static const TokenType EOF = const _EndOfFileTokenType();
+
+  static const TokenType DOUBLE = const TokenType._('DOUBLE');
+
+  static const TokenType HEXADECIMAL = const TokenType._('HEXADECIMAL');
+
+  static const TokenType IDENTIFIER = const TokenType._('IDENTIFIER');
+
+  static const TokenType INT = const TokenType._('INT');
+
+  static const TokenType KEYWORD = const TokenType._('KEYWORD');
+
+  static const TokenType MULTI_LINE_COMMENT =
+      const TokenType._('MULTI_LINE_COMMENT');
+
+  static const TokenType SCRIPT_TAG = const TokenType._('SCRIPT_TAG');
+
+  static const TokenType SINGLE_LINE_COMMENT =
+      const TokenType._('SINGLE_LINE_COMMENT');
+
+  static const TokenType STRING = const TokenType._('STRING');
+
+  static const TokenType AMPERSAND =
+      const TokenType._('AMPERSAND', TokenClass.BITWISE_AND_OPERATOR, '&');
+
+  static const TokenType AMPERSAND_AMPERSAND = const TokenType._(
+      'AMPERSAND_AMPERSAND', TokenClass.LOGICAL_AND_OPERATOR, '&&');
+
+  static const TokenType AMPERSAND_AMPERSAND_EQ = const TokenType._(
+      'AMPERSAND_AMPERSAND_EQ', TokenClass.ASSIGNMENT_OPERATOR, '&&=');
+
+  static const TokenType AMPERSAND_EQ =
+      const TokenType._('AMPERSAND_EQ', TokenClass.ASSIGNMENT_OPERATOR, '&=');
+
+  static const TokenType AT = const TokenType._('AT', TokenClass.NO_CLASS, '@');
+
+  static const TokenType BANG =
+      const TokenType._('BANG', TokenClass.UNARY_PREFIX_OPERATOR, '!');
+
+  static const TokenType BANG_EQ =
+      const TokenType._('BANG_EQ', TokenClass.EQUALITY_OPERATOR, '!=');
+
+  static const TokenType BAR =
+      const TokenType._('BAR', TokenClass.BITWISE_OR_OPERATOR, '|');
+
+  static const TokenType BAR_BAR =
+      const TokenType._('BAR_BAR', TokenClass.LOGICAL_OR_OPERATOR, '||');
+
+  static const TokenType BAR_BAR_EQ =
+      const TokenType._('BAR_BAR_EQ', TokenClass.ASSIGNMENT_OPERATOR, '||=');
+
+  static const TokenType BAR_EQ =
+      const TokenType._('BAR_EQ', TokenClass.ASSIGNMENT_OPERATOR, '|=');
+
+  static const TokenType COLON =
+      const TokenType._('COLON', TokenClass.NO_CLASS, ':');
+
+  static const TokenType COMMA =
+      const TokenType._('COMMA', TokenClass.NO_CLASS, ',');
+
+  static const TokenType CARET =
+      const TokenType._('CARET', TokenClass.BITWISE_XOR_OPERATOR, '^');
+
+  static const TokenType CARET_EQ =
+      const TokenType._('CARET_EQ', TokenClass.ASSIGNMENT_OPERATOR, '^=');
+
+  static const TokenType CLOSE_CURLY_BRACKET =
+      const TokenType._('CLOSE_CURLY_BRACKET', TokenClass.NO_CLASS, '}');
+
+  static const TokenType CLOSE_PAREN =
+      const TokenType._('CLOSE_PAREN', TokenClass.NO_CLASS, ')');
+
+  static const TokenType CLOSE_SQUARE_BRACKET =
+      const TokenType._('CLOSE_SQUARE_BRACKET', TokenClass.NO_CLASS, ']');
+
+  static const TokenType EQ =
+      const TokenType._('EQ', TokenClass.ASSIGNMENT_OPERATOR, '=');
+
+  static const TokenType EQ_EQ =
+      const TokenType._('EQ_EQ', TokenClass.EQUALITY_OPERATOR, '==');
+
+  static const TokenType FUNCTION =
+      const TokenType._('FUNCTION', TokenClass.NO_CLASS, '=>');
+
+  static const TokenType GT =
+      const TokenType._('GT', TokenClass.RELATIONAL_OPERATOR, '>');
+
+  static const TokenType GT_EQ =
+      const TokenType._('GT_EQ', TokenClass.RELATIONAL_OPERATOR, '>=');
+
+  static const TokenType GT_GT =
+      const TokenType._('GT_GT', TokenClass.SHIFT_OPERATOR, '>>');
+
+  static const TokenType GT_GT_EQ =
+      const TokenType._('GT_GT_EQ', TokenClass.ASSIGNMENT_OPERATOR, '>>=');
+
+  static const TokenType HASH =
+      const TokenType._('HASH', TokenClass.NO_CLASS, '#');
+
+  static const TokenType INDEX =
+      const TokenType._('INDEX', TokenClass.UNARY_POSTFIX_OPERATOR, '[]');
+
+  static const TokenType INDEX_EQ =
+      const TokenType._('INDEX_EQ', TokenClass.UNARY_POSTFIX_OPERATOR, '[]=');
+
+  static const TokenType IS =
+      const TokenType._('IS', TokenClass.RELATIONAL_OPERATOR, 'is');
+
+  static const TokenType LT =
+      const TokenType._('LT', TokenClass.RELATIONAL_OPERATOR, '<');
+
+  static const TokenType LT_EQ =
+      const TokenType._('LT_EQ', TokenClass.RELATIONAL_OPERATOR, '<=');
+
+  static const TokenType LT_LT =
+      const TokenType._('LT_LT', TokenClass.SHIFT_OPERATOR, '<<');
+
+  static const TokenType LT_LT_EQ =
+      const TokenType._('LT_LT_EQ', TokenClass.ASSIGNMENT_OPERATOR, '<<=');
+
+  static const TokenType MINUS =
+      const TokenType._('MINUS', TokenClass.ADDITIVE_OPERATOR, '-');
+
+  static const TokenType MINUS_EQ =
+      const TokenType._('MINUS_EQ', TokenClass.ASSIGNMENT_OPERATOR, '-=');
+
+  static const TokenType MINUS_MINUS =
+      const TokenType._('MINUS_MINUS', TokenClass.UNARY_PREFIX_OPERATOR, '--');
+
+  static const TokenType OPEN_CURLY_BRACKET =
+      const TokenType._('OPEN_CURLY_BRACKET', TokenClass.NO_CLASS, '{');
+
+  static const TokenType OPEN_PAREN =
+      const TokenType._('OPEN_PAREN', TokenClass.UNARY_POSTFIX_OPERATOR, '(');
+
+  static const TokenType OPEN_SQUARE_BRACKET = const TokenType._(
+      'OPEN_SQUARE_BRACKET', TokenClass.UNARY_POSTFIX_OPERATOR, '[');
+
+  static const TokenType PERCENT =
+      const TokenType._('PERCENT', TokenClass.MULTIPLICATIVE_OPERATOR, '%');
+
+  static const TokenType PERCENT_EQ =
+      const TokenType._('PERCENT_EQ', TokenClass.ASSIGNMENT_OPERATOR, '%=');
+
+  static const TokenType PERIOD =
+      const TokenType._('PERIOD', TokenClass.UNARY_POSTFIX_OPERATOR, '.');
+
+  static const TokenType PERIOD_PERIOD =
+      const TokenType._('PERIOD_PERIOD', TokenClass.CASCADE_OPERATOR, '..');
+
+  static const TokenType PLUS =
+      const TokenType._('PLUS', TokenClass.ADDITIVE_OPERATOR, '+');
+
+  static const TokenType PLUS_EQ =
+      const TokenType._('PLUS_EQ', TokenClass.ASSIGNMENT_OPERATOR, '+=');
+
+  static const TokenType PLUS_PLUS =
+      const TokenType._('PLUS_PLUS', TokenClass.UNARY_PREFIX_OPERATOR, '++');
+
+  static const TokenType QUESTION =
+      const TokenType._('QUESTION', TokenClass.CONDITIONAL_OPERATOR, '?');
+
+  static const TokenType QUESTION_PERIOD = const TokenType._(
+      'QUESTION_PERIOD', TokenClass.UNARY_POSTFIX_OPERATOR, '?.');
+
+  static const TokenType QUESTION_QUESTION =
+      const TokenType._('QUESTION_QUESTION', TokenClass.IF_NULL_OPERATOR, '??');
+
+  static const TokenType QUESTION_QUESTION_EQ = const TokenType._(
+      'QUESTION_QUESTION_EQ', TokenClass.ASSIGNMENT_OPERATOR, '??=');
+
+  static const TokenType SEMICOLON =
+      const TokenType._('SEMICOLON', TokenClass.NO_CLASS, ';');
+
+  static const TokenType SLASH =
+      const TokenType._('SLASH', TokenClass.MULTIPLICATIVE_OPERATOR, '/');
+
+  static const TokenType SLASH_EQ =
+      const TokenType._('SLASH_EQ', TokenClass.ASSIGNMENT_OPERATOR, '/=');
+
+  static const TokenType STAR =
+      const TokenType._('STAR', TokenClass.MULTIPLICATIVE_OPERATOR, '*');
+
+  static const TokenType STAR_EQ =
+      const TokenType._('STAR_EQ', TokenClass.ASSIGNMENT_OPERATOR, "*=");
+
+  static const TokenType STRING_INTERPOLATION_EXPRESSION = const TokenType._(
+      'STRING_INTERPOLATION_EXPRESSION', TokenClass.NO_CLASS, '\${');
+
+  static const TokenType STRING_INTERPOLATION_IDENTIFIER = const TokenType._(
+      'STRING_INTERPOLATION_IDENTIFIER', TokenClass.NO_CLASS, '\$');
+
+  static const TokenType TILDE =
+      const TokenType._('TILDE', TokenClass.UNARY_PREFIX_OPERATOR, '~');
+
+  static const TokenType TILDE_SLASH = const TokenType._(
+      'TILDE_SLASH', TokenClass.MULTIPLICATIVE_OPERATOR, '~/');
+
+  static const TokenType TILDE_SLASH_EQ = const TokenType._(
+      'TILDE_SLASH_EQ', TokenClass.ASSIGNMENT_OPERATOR, '~/=');
+
+  static const TokenType BACKPING =
+      const TokenType._('BACKPING', TokenClass.NO_CLASS, '`');
+
+  static const TokenType BACKSLASH =
+      const TokenType._('BACKSLASH', TokenClass.NO_CLASS, '\\');
+
+  static const TokenType PERIOD_PERIOD_PERIOD =
+      const TokenType._('PERIOD_PERIOD_PERIOD', TokenClass.NO_CLASS, '...');
+
+  static const TokenType GENERIC_METHOD_TYPE_LIST =
+      const TokenType._('GENERIC_METHOD_TYPE_LIST');
+
+  static const TokenType GENERIC_METHOD_TYPE_ASSIGN =
+      const TokenType._('GENERIC_METHOD_TYPE_ASSIGN');
+
+  /**
+   * The class of the token.
+   */
+  final TokenClass _tokenClass;
+
+  /**
+   * The name of the token type.
+   */
+  final String name;
+
+  /**
+   * The lexeme that defines this type of token, or `null` if there is more than
+   * one possible lexeme for this type of token.
+   */
+  final String lexeme;
+
+  /**
+   * Initialize a newly created token type to have the given [name],
+   * [_tokenClass] and [lexeme].
+   */
+  const TokenType._(this.name,
+      [this._tokenClass = TokenClass.NO_CLASS, this.lexeme = null]);
+
+  /**
+   * Return `true` if this type of token represents an additive operator.
+   */
+  bool get isAdditiveOperator => _tokenClass == TokenClass.ADDITIVE_OPERATOR;
+
+  /**
+   * Return `true` if this type of token represents an assignment operator.
+   */
+  bool get isAssignmentOperator =>
+      _tokenClass == TokenClass.ASSIGNMENT_OPERATOR;
+
+  /**
+   * Return `true` if this type of token represents an associative operator. An
+   * associative operator is an operator for which the following equality is
+   * true: `(a * b) * c == a * (b * c)`. In other words, if the result of
+   * applying the operator to multiple operands does not depend on the order in
+   * which those applications occur.
+   *
+   * Note: This method considers the logical-and and logical-or operators to be
+   * associative, even though the order in which the application of those
+   * operators can have an effect because evaluation of the right-hand operand
+   * is conditional.
+   */
+  bool get isAssociativeOperator =>
+      this == AMPERSAND ||
+      this == AMPERSAND_AMPERSAND ||
+      this == BAR ||
+      this == BAR_BAR ||
+      this == CARET ||
+      this == PLUS ||
+      this == STAR;
+
+  /**
+   * Return `true` if this type of token represents an equality operator.
+   */
+  bool get isEqualityOperator => _tokenClass == TokenClass.EQUALITY_OPERATOR;
+
+  /**
+   * Return `true` if this type of token represents an increment operator.
+   */
+  bool get isIncrementOperator =>
+      identical(lexeme, '++') || identical(lexeme, '--');
+
+  /**
+   * Return `true` if this type of token represents a multiplicative operator.
+   */
+  bool get isMultiplicativeOperator =>
+      _tokenClass == TokenClass.MULTIPLICATIVE_OPERATOR;
+
+  /**
+   * Return `true` if this token type represents an operator.
+   */
+  bool get isOperator =>
+      _tokenClass != TokenClass.NO_CLASS &&
+      this != OPEN_PAREN &&
+      this != OPEN_SQUARE_BRACKET &&
+      this != PERIOD;
+
+  /**
+   * Return `true` if this type of token represents a relational operator.
+   */
+  bool get isRelationalOperator =>
+      _tokenClass == TokenClass.RELATIONAL_OPERATOR;
+
+  /**
+   * Return `true` if this type of token represents a shift operator.
+   */
+  bool get isShiftOperator => _tokenClass == TokenClass.SHIFT_OPERATOR;
+
+  /**
+   * Return `true` if this type of token represents a unary postfix operator.
+   */
+  bool get isUnaryPostfixOperator =>
+      _tokenClass == TokenClass.UNARY_POSTFIX_OPERATOR;
+
+  /**
+   * Return `true` if this type of token represents a unary prefix operator.
+   */
+  bool get isUnaryPrefixOperator =>
+      _tokenClass == TokenClass.UNARY_PREFIX_OPERATOR;
+
+  /**
+   * Return `true` if this token type represents an operator that can be defined
+   * by users.
+   */
+  bool get isUserDefinableOperator =>
+      identical(lexeme, '==') ||
+      identical(lexeme, '~') ||
+      identical(lexeme, '[]') ||
+      identical(lexeme, '[]=') ||
+      identical(lexeme, '*') ||
+      identical(lexeme, '/') ||
+      identical(lexeme, '%') ||
+      identical(lexeme, '~/') ||
+      identical(lexeme, '+') ||
+      identical(lexeme, '-') ||
+      identical(lexeme, '<<') ||
+      identical(lexeme, '>>') ||
+      identical(lexeme, '>=') ||
+      identical(lexeme, '>') ||
+      identical(lexeme, '<=') ||
+      identical(lexeme, '<') ||
+      identical(lexeme, '&') ||
+      identical(lexeme, '^') ||
+      identical(lexeme, '|');
+
+  /**
+   * Return the precedence of the token, or `0` if the token does not represent
+   * an operator.
+   */
+  int get precedence => _tokenClass.precedence;
+
+  @override
+  String toString() => name;
+}
+
+/**
+ * A normal token that is preceded by comments.
+ */
+class TokenWithComment extends SimpleToken {
+  /**
+   * The first comment in the list of comments that precede this token.
+   */
+  CommentToken _precedingComment;
+
+  /**
+   * Initialize a newly created token to have the given [type] at the given
+   * [offset] and to be preceded by the comments reachable from the given
+   * [comment].
+   */
+  TokenWithComment(TokenType type, int offset, this._precedingComment)
+      : super(type, offset) {
+    _setCommentParent(_precedingComment);
+  }
+
+  @override
+  CommentToken get precedingComments => _precedingComment;
+
+  void set precedingComments(CommentToken comment) {
+    _precedingComment = comment;
+    _setCommentParent(_precedingComment);
+  }
+
+  @override
+  Token copy() =>
+      new TokenWithComment(type, offset, copyComments(precedingComments));
+}
+
+/**
+ * A token representing the end (either the head or the tail) of a stream of
+ * tokens.
+ */
+class _EndOfFileTokenType extends TokenType {
+  /**
+   * Initialize a newly created token.
+   */
+  const _EndOfFileTokenType() : super._('EOF', TokenClass.NO_CLASS, '');
+
+  @override
+  String toString() => '-eof-';
+}
diff --git a/pkg/front_end/pubspec.yaml b/pkg/front_end/pubspec.yaml
index 58c4bb1..8b75e23 100644
--- a/pkg/front_end/pubspec.yaml
+++ b/pkg/front_end/pubspec.yaml
@@ -1,5 +1,5 @@
 name: front_end
-version: 0.1.0
+version: 0.1.0-alpha.0
 author: Dart Team <misc@dartlang.org>
 description: Front end for compilation of Dart code.
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/front_end
@@ -16,6 +16,3 @@
   package_config: '^1.0.0'
   test: ^0.12.0
   test_reflective_loader: ^0.1.0
-# TODO(sigmund): remove once kernel is moved into the sdk repo.
-dependency_overrides:
-  analyzer: '^0.29.0'
diff --git a/pkg/front_end/test/physical_file_system_test.dart b/pkg/front_end/test/physical_file_system_test.dart
index 5c07a8c..859e998 100644
--- a/pkg/front_end/test/physical_file_system_test.dart
+++ b/pkg/front_end/test/physical_file_system_test.dart
@@ -5,6 +5,7 @@
 
 library front_end.test.physical_file_system_test;
 
+import 'dart:async';
 import 'dart:convert';
 import 'dart:io' as io;
 
@@ -206,7 +207,15 @@
     tempPath = tempDirectory.absolute.path;
   }
 
-  tearDown() {
-    tempDirectory.deleteSync(recursive: true);
+  tearDown() async {
+    try {
+      tempDirectory.deleteSync(recursive: true);
+    } on io.FileSystemException {
+      // Sometimes on Windows the delete fails with errno 32
+      // (ERROR_SHARING_VIOLATION: The process cannot access the file because it
+      // is being used by another process).  Wait 1 second and try again.
+      await new Future.delayed(new Duration(seconds: 1));
+      tempDirectory.deleteSync(recursive: true);
+    }
   }
 }
diff --git a/pkg/front_end/tool/perf.dart b/pkg/front_end/tool/perf.dart
index e8d50a8..ec306ca 100644
--- a/pkg/front_end/tool/perf.dart
+++ b/pkg/front_end/tool/perf.dart
@@ -74,7 +74,7 @@
   if (handler == null) {
     // TODO(sigmund): implement the remaining benchmarks.
     print('unsupported bench-id: $bench. Please specify one of the following: '
-        '${handler.keys.join(", ")}');
+        '${handlers.keys.join(", ")}');
     exit(1);
   }
   await handler();
diff --git a/pkg/meta/lib/meta.dart b/pkg/meta/lib/meta.dart
index 7fa20e1..44f71b8 100644
--- a/pkg/meta/lib/meta.dart
+++ b/pkg/meta/lib/meta.dart
@@ -117,9 +117,21 @@
 ///   corresponding to a named parameter that has this annotation.
 const Required required = const Required();
 
-/// Used to annotate a field is allowed to be overridden in Strong Mode.
+/// Used to annotate a field that is allowed to be overridden in Strong Mode.
 const _Virtual virtual = const _Virtual();
 
+/// Used to annotate an instance member that was made public so that it could be
+/// overridden but that is not intended to be referenced from outside the
+/// defining library.
+///
+/// Tools, such as the analyzer, can provide feedback if
+///
+/// * the annotation is associated with a declaration other than a public
+///   instance member in a class, or
+/// * the member is referenced outside of the defining library.
+const _VisibleForOverriding visibleForOverriding =
+    const _VisibleForOverriding();
+
 /// Used to annotate a declaration was made public, so that it is more visible
 /// than otherwise necessary, to make code testable.
 ///
@@ -190,6 +202,10 @@
   const _Virtual();
 }
 
+class _VisibleForOverriding {
+  const _VisibleForOverriding();
+}
+
 class _VisibleForTesting {
   const _VisibleForTesting();
 }
diff --git a/runtime/CPPLINT.cfg b/runtime/CPPLINT.cfg
index 64aa482..c9f2821 100644
--- a/runtime/CPPLINT.cfg
+++ b/runtime/CPPLINT.cfg
@@ -4,4 +4,7 @@
 
 # Do not limit function size. For example parts of
 # the simulator are really large.
-filter=-readability/fn_size
+#
+# Do not complain about whitespace. That is handled
+# by the clang format presubmit check.
+filter=-readability/fn_size,-whitespace/indent
diff --git a/runtime/PRESUBMIT.py b/runtime/PRESUBMIT.py
index 946f54f..0170f2f9 100644
--- a/runtime/PRESUBMIT.py
+++ b/runtime/PRESUBMIT.py
@@ -48,11 +48,17 @@
   return input_api.canned_checks.CheckGNFormatted(input_api, output_api)
 
 
+def CheckFormatted(input_api, output_api):
+  return input_api.canned_checks.CheckPatchFormatted(input_api, output_api)
+
+
 def CheckChangeOnUpload(input_api, output_api):
   return (RunLint(input_api, output_api) +
-          CheckGn(input_api, output_api))
+          CheckGn(input_api, output_api) +
+          CheckFormatted(input_api, output_api))
 
 
 def CheckChangeOnCommit(input_api, output_api):
   return (RunLint(input_api, output_api) +
-          CheckGn(input_api, output_api))
+          CheckGn(input_api, output_api) +
+          CheckFormatted(input_api, output_api))
diff --git a/runtime/bin/BUILD.gn b/runtime/bin/BUILD.gn
index 2a2d17b..56bb53a 100644
--- a/runtime/bin/BUILD.gn
+++ b/runtime/bin/BUILD.gn
@@ -2,6 +2,8 @@
 # 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("gypi_contents.gni")
+
 declare_args() {
   # Whether to fall back to built-in root certificates when they cannot be
   # verified at the operating system level.
@@ -18,12 +20,6 @@
   dart_use_tcmalloc = false
 }
 
-resources_sources_gypi =
-    exec_script("../../tools/gypi_to_gn.py",
-                [ rebase_path("vmservice/vmservice_sources.gypi") ],
-                "scope",
-                [ "vmservice/vmservice_sources.gypi" ])
-
 # Generate a resources.cc file for the service isolate without Observatory.
 action("gen_resources_cc") {
   visibility = [ ":*" ]  # Only targets in this file can see this.
@@ -34,7 +30,7 @@
 
   # The path below is hard coded for the Mojo and Flutter trees. When moving
   # the Dart runtime to gn, this path might need to be updated.
-  sources = rebase_path(resources_sources_gypi.sources, "", "../bin/vmservice/")
+  sources = rebase_path(resources_sources_gypi, "", "../bin/vmservice/")
   outputs = [
     "$target_gen_dir/resources_gen.cc",
   ]
@@ -86,15 +82,10 @@
   }
 }
 
-builtin_sources_gypi = exec_script("../../tools/gypi_to_gn.py",
-                                   [ rebase_path("builtin_sources.gypi") ],
-                                   "scope",
-                                   [ "builtin_sources.gypi" ])
-
 gen_library_src_path("generate_builtin_cc_file") {
   name = "_builtin"
   kind = "source"
-  sources = builtin_sources_gypi.sources
+  sources = builtin_sources_gypi
   output = "$target_gen_dir/builtin_gen.cc"
 }
 
@@ -113,15 +104,10 @@
   output = "$target_gen_dir/io_gen.cc"
 }
 
-io_sources_gypi = exec_script("../../tools/gypi_to_gn.py",
-                              [ rebase_path("io_sources.gypi") ],
-                              "scope",
-                              [ "io_sources.gypi" ])
-
 gen_library_src_path("generate_io_patch_cc_file") {
   name = "io"
   kind = "patch"
-  sources = io_sources_gypi.sources
+  sources = io_sources_gypi
   output = "$target_gen_dir/io_patch_gen.cc"
 }
 
@@ -253,12 +239,6 @@
   }
 }
 
-builtin_impl_sources_gypi =
-    exec_script("../../tools/gypi_to_gn.py",
-                [ rebase_path("builtin_impl_sources.gypi") ],
-                "scope",
-                [ "builtin_impl_sources.gypi" ])
-
 static_library("libdart_builtin") {
   configs += [
     "..:dart_config",
@@ -293,14 +273,9 @@
               "log_linux.cc",
               "log_macos.cc",
               "log_win.cc",
-            ] + builtin_impl_sources_gypi.sources
+            ] + builtin_impl_sources_gypi
 }
 
-io_impl_sources_gypi = exec_script("../../tools/gypi_to_gn.py",
-                                   [ rebase_path("io_impl_sources.gypi") ],
-                                   "scope",
-                                   [ "io_impl_sources.gypi" ])
-
 executable("gen_snapshot") {
   configs += [
     "..:dart_config",
@@ -386,7 +361,7 @@
 
   defines = [ "DART_IO_SECURE_SOCKET_DISABLED" ]
 
-  sources = io_impl_sources_gypi.sources + builtin_impl_sources_gypi.sources
+  sources = io_impl_sources_gypi + builtin_impl_sources_gypi
   sources += [
     "io_natives.cc",
     "io_natives.h",
@@ -452,7 +427,7 @@
       ]
     }
 
-    sources = io_impl_sources_gypi.sources + builtin_impl_sources_gypi.sources
+    sources = io_impl_sources_gypi + builtin_impl_sources_gypi
     sources += [
                  "builtin_natives.cc",
                  "io_natives.cc",
@@ -810,30 +785,12 @@
 
   # The VM sources are already included in libdart, so we just want to add in
   # the tests here.
-  vm_tests_list = exec_script("../../tools/gypi_to_gn.py",
-                              [
-                                rebase_path("../vm/vm_sources.gypi"),
-                                "--keep_only=_test.cc",
-                                "--keep_only=_test.h",
-                              ],
-                              "scope",
-                              [ "../vm/vm_sources.gypi" ])
-  vm_tests = rebase_path(vm_tests_list.sources, ".", "../vm")
-
-  builtin_impl_tests_list =
-      exec_script("../../tools/gypi_to_gn.py",
-                  [
-                    rebase_path("builtin_impl_sources.gypi"),
-                    "--keep_only=_test.cc",
-                    "--keep_only=_test.h",
-                  ],
-                  "scope",
-                  [ "builtin_impl_sources.gypi" ])
+  vm_tests = rebase_path(vm_tests_list, ".", "../vm")
 
   sources = [
               "builtin_nolib.cc",
               "run_vm_tests.cc",
-            ] + builtin_impl_tests_list.sources + vm_tests
+            ] + builtin_impl_tests_list + vm_tests
 
   if (!is_win) {
     ldflags = [ "-rdynamic" ]
diff --git a/runtime/bin/eventhandler_android.cc b/runtime/bin/eventhandler_android.cc
index c3f6836..c9c4b0d 100644
--- a/runtime/bin/eventhandler_android.cc
+++ b/runtime/bin/eventhandler_android.cc
@@ -86,18 +86,26 @@
   if (result != 0) {
     FATAL("Pipe creation failed");
   }
-  FDUtils::SetNonBlocking(interrupt_fds_[0]);
-  FDUtils::SetCloseOnExec(interrupt_fds_[0]);
-  FDUtils::SetCloseOnExec(interrupt_fds_[1]);
+  if (!FDUtils::SetNonBlocking(interrupt_fds_[0])) {
+    FATAL("Failed to set pipe fd non blocking\n");
+  }
+  if (!FDUtils::SetCloseOnExec(interrupt_fds_[0])) {
+    FATAL("Failed to set pipe fd close on exec\n");
+  }
+  if (!FDUtils::SetCloseOnExec(interrupt_fds_[1])) {
+    FATAL("Failed to set pipe fd close on exec\n");
+  }
   shutdown_ = false;
-  // The initial size passed to epoll_create is ignore on newer (>=
-  // 2.6.8) Linux versions
+  // The initial size passed to epoll_create is ignored on newer (>= 2.6.8)
+  // Linux versions
   static const int kEpollInitialSize = 64;
   epoll_fd_ = NO_RETRY_EXPECTED(epoll_create(kEpollInitialSize));
   if (epoll_fd_ == -1) {
     FATAL1("Failed creating epoll file descriptor: %i", errno);
   }
-  FDUtils::SetCloseOnExec(epoll_fd_);
+  if (!FDUtils::SetCloseOnExec(epoll_fd_)) {
+    FATAL("Failed to set epoll fd close on exec\n");
+  }
   // Register the interrupt_fd with the epoll instance.
   struct epoll_event event;
   event.events = EPOLLIN;
diff --git a/runtime/bin/eventhandler_linux.cc b/runtime/bin/eventhandler_linux.cc
index fd410fe..8b35818 100644
--- a/runtime/bin/eventhandler_linux.cc
+++ b/runtime/bin/eventhandler_linux.cc
@@ -80,9 +80,15 @@
   if (result != 0) {
     FATAL("Pipe creation failed");
   }
-  FDUtils::SetNonBlocking(interrupt_fds_[0]);
-  FDUtils::SetCloseOnExec(interrupt_fds_[0]);
-  FDUtils::SetCloseOnExec(interrupt_fds_[1]);
+  if (!FDUtils::SetNonBlocking(interrupt_fds_[0])) {
+    FATAL("Failed to set pipe fd non blocking\n");
+  }
+  if (!FDUtils::SetCloseOnExec(interrupt_fds_[0])) {
+    FATAL("Failed to set pipe fd close on exec\n");
+  }
+  if (!FDUtils::SetCloseOnExec(interrupt_fds_[1])) {
+    FATAL("Failed to set pipe fd close on exec\n");
+  }
   shutdown_ = false;
   // The initial size passed to epoll_create is ignore on newer (>=
   // 2.6.8) Linux versions
@@ -91,7 +97,9 @@
   if (epoll_fd_ == -1) {
     FATAL1("Failed creating epoll file descriptor: %i", errno);
   }
-  FDUtils::SetCloseOnExec(epoll_fd_);
+  if (!FDUtils::SetCloseOnExec(epoll_fd_)) {
+    FATAL("Failed to set epoll fd close on exec\n");
+  }
   // Register the interrupt_fd with the epoll instance.
   struct epoll_event event;
   event.events = EPOLLIN;
diff --git a/runtime/bin/eventhandler_macos.cc b/runtime/bin/eventhandler_macos.cc
index 1e0fa94..640f05a 100644
--- a/runtime/bin/eventhandler_macos.cc
+++ b/runtime/bin/eventhandler_macos.cc
@@ -105,16 +105,24 @@
   if (result != 0) {
     FATAL("Pipe creation failed");
   }
-  FDUtils::SetNonBlocking(interrupt_fds_[0]);
-  FDUtils::SetCloseOnExec(interrupt_fds_[0]);
-  FDUtils::SetCloseOnExec(interrupt_fds_[1]);
+  if (!FDUtils::SetNonBlocking(interrupt_fds_[0])) {
+    FATAL("Failed to set pipe fd non-blocking\n");
+  }
+  if (!FDUtils::SetCloseOnExec(interrupt_fds_[0])) {
+    FATAL("Failed to set pipe fd close on exec\n");
+  }
+  if (!FDUtils::SetCloseOnExec(interrupt_fds_[1])) {
+    FATAL("Failed to set pipe fd close on exec\n");
+  }
   shutdown_ = false;
 
   kqueue_fd_ = NO_RETRY_EXPECTED(kqueue());
   if (kqueue_fd_ == -1) {
     FATAL("Failed creating kqueue");
   }
-  FDUtils::SetCloseOnExec(kqueue_fd_);
+  if (!FDUtils::SetCloseOnExec(kqueue_fd_)) {
+    FATAL("Failed to set kqueue fd close on exec\n");
+  }
   // Register the interrupt_fd with the kqueue.
   struct kevent event;
   EV_SET(&event, interrupt_fds_[0], EVFILT_READ, EV_ADD, 0, 0, NULL);
diff --git a/runtime/bin/fdutils_android.cc b/runtime/bin/fdutils_android.cc
index e61a2e1..5d8a8e0 100644
--- a/runtime/bin/fdutils_android.cc
+++ b/runtime/bin/fdutils_android.cc
@@ -21,10 +21,12 @@
   intptr_t status;
   status = NO_RETRY_EXPECTED(fcntl(fd, F_GETFD));
   if (status < 0) {
+    perror("fcntl(F_GETFD) failed");
     return false;
   }
   status |= FD_CLOEXEC;
   if (NO_RETRY_EXPECTED(fcntl(fd, F_SETFD, status)) < 0) {
+    perror("fcntl(F_SETFD, FD_CLOEXEC) failed");
     return false;
   }
   return true;
@@ -35,10 +37,12 @@
   intptr_t status;
   status = NO_RETRY_EXPECTED(fcntl(fd, F_GETFL));
   if (status < 0) {
+    perror("fcntl(F_GETFL) failed");
     return false;
   }
   status = blocking ? (status & ~O_NONBLOCK) : (status | O_NONBLOCK);
   if (NO_RETRY_EXPECTED(fcntl(fd, F_SETFL, status)) < 0) {
+    perror("fcntl(F_SETFL, O_NONBLOCK) failed");
     return false;
   }
   return true;
diff --git a/runtime/bin/fdutils_linux.cc b/runtime/bin/fdutils_linux.cc
index a76fcdb..5a174ee 100644
--- a/runtime/bin/fdutils_linux.cc
+++ b/runtime/bin/fdutils_linux.cc
@@ -21,10 +21,12 @@
   intptr_t status;
   status = NO_RETRY_EXPECTED(fcntl(fd, F_GETFD));
   if (status < 0) {
+    perror("fcntl(F_GETFD) failed");
     return false;
   }
   status |= FD_CLOEXEC;
   if (NO_RETRY_EXPECTED(fcntl(fd, F_SETFD, status)) < 0) {
+    perror("fcntl(F_SETFD, FD_CLOEXEC) failed");
     return false;
   }
   return true;
@@ -35,10 +37,12 @@
   intptr_t status;
   status = NO_RETRY_EXPECTED(fcntl(fd, F_GETFL));
   if (status < 0) {
+    perror("fcntl(F_GETFL) failed");
     return false;
   }
   status = blocking ? (status & ~O_NONBLOCK) : (status | O_NONBLOCK);
   if (NO_RETRY_EXPECTED(fcntl(fd, F_SETFL, status)) < 0) {
+    perror("fcntl(F_SETFL, O_NONBLOCK) failed");
     return false;
   }
   return true;
diff --git a/runtime/bin/fdutils_macos.cc b/runtime/bin/fdutils_macos.cc
index 25495da..ab1a603 100644
--- a/runtime/bin/fdutils_macos.cc
+++ b/runtime/bin/fdutils_macos.cc
@@ -21,10 +21,12 @@
   intptr_t status;
   status = NO_RETRY_EXPECTED(fcntl(fd, F_GETFD));
   if (status < 0) {
+    perror("fcntl(F_GETFD) failed");
     return false;
   }
   status |= FD_CLOEXEC;
   if (NO_RETRY_EXPECTED(fcntl(fd, F_SETFD, status)) < 0) {
+    perror("fcntl(F_SETFD, FD_CLOEXEC) failed");
     return false;
   }
   return true;
@@ -35,10 +37,12 @@
   intptr_t status;
   status = NO_RETRY_EXPECTED(fcntl(fd, F_GETFL));
   if (status < 0) {
+    perror("fcntl(F_GETFL) failed");
     return false;
   }
   status = blocking ? (status & ~O_NONBLOCK) : (status | O_NONBLOCK);
   if (NO_RETRY_EXPECTED(fcntl(fd, F_SETFL, status)) < 0) {
+    perror("fcntl(F_SETFL, O_NONBLOCK) failed");
     return false;
   }
   return true;
diff --git a/runtime/bin/gypi_contents.gni b/runtime/bin/gypi_contents.gni
new file mode 100644
index 0000000..34fc269
--- /dev/null
+++ b/runtime/bin/gypi_contents.gni
@@ -0,0 +1,43 @@
+# Copyright (c) 2016, 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.
+
+_gypi_files = [
+  "builtin_sources.gypi",
+  "builtin_impl_sources.gypi",
+  "vmservice/vmservice_sources.gypi",
+  "io_sources.gypi",
+  "io_impl_sources.gypi",
+]
+
+_gypi_contents = exec_script("../../tools/gypi_to_gn.py",
+                             rebase_path(_gypi_files) + [ "--prefix" ],
+                             "scope",
+                             _gypi_files)
+
+resources_sources_gypi = _gypi_contents.vmservice_sources_sources
+
+builtin_sources_gypi = _gypi_contents.builtin_sources_sources
+builtin_impl_sources_gypi = _gypi_contents.builtin_impl_sources_sources
+
+io_sources_gypi = _gypi_contents.io_sources_sources
+io_impl_sources_gypi = _gypi_contents.io_impl_sources_sources
+
+_test_gypi_files = [
+  "../vm/vm_sources.gypi",
+  "builtin_impl_sources.gypi",
+]
+
+_test_only_gypi_contents = exec_script("../../tools/gypi_to_gn.py",
+                                       rebase_path(_test_gypi_files) + [
+                                             "--keep_only=_test.cc",
+                                             "--keep_only=_test.h",
+                                             "--prefix",
+                                           ],
+                                       "scope",
+                                       _test_gypi_files)
+
+# The VM sources are already included in libdart, so we just want to add in
+# the tests here.
+vm_tests_list = _test_only_gypi_contents.vm_sources_sources
+builtin_impl_tests_list = _test_only_gypi_contents.builtin_impl_sources_sources
diff --git a/runtime/bin/loader.cc b/runtime/bin/loader.cc
index c94a21f..fdeae6c 100644
--- a/runtime/bin/loader.cc
+++ b/runtime/bin/loader.cc
@@ -449,7 +449,7 @@
 }
 
 
-#define RETURN_ERROR(result) \
+#define RETURN_ERROR(result)                                                   \
   if (Dart_IsError(result)) return result;
 
 Dart_Handle Loader::ReloadNativeExtensions() {
diff --git a/runtime/bin/platform.cc b/runtime/bin/platform.cc
index 15bfe3d..e8b7849 100644
--- a/runtime/bin/platform.cc
+++ b/runtime/bin/platform.cc
@@ -40,16 +40,6 @@
 
 
 void FUNCTION_NAME(Platform_ExecutableName)(Dart_NativeArguments args) {
-  if (Dart_IsPrecompiledRuntime()) {
-    // This is a work-around to be able to use most of the existing test suite
-    // for precompilation. Many tests do something like Process.run(
-    // Platform.executable, some_other_script.dart). But with precompilation
-    // the script is already fixed, so the spawned process runs the same script
-    // again and we have a fork-bomb.
-    Dart_ThrowException(Dart_NewStringFromCString(
-        "Platform.executable not supported under precompilation"));
-    UNREACHABLE();
-  }
   if (Platform::GetExecutableName() != NULL) {
     Dart_SetReturnValue(
         args, Dart_NewStringFromCString(Platform::GetExecutableName()));
@@ -60,12 +50,6 @@
 
 
 void FUNCTION_NAME(Platform_ResolvedExecutableName)(Dart_NativeArguments args) {
-  if (Dart_IsPrecompiledRuntime()) {
-    Dart_ThrowException(Dart_NewStringFromCString(
-        "Platform.resolvedExecutable not supported under precompilation"));
-    UNREACHABLE();
-  }
-
   if (Platform::GetResolvedExecutableName() != NULL) {
     Dart_SetReturnValue(
         args, Dart_NewStringFromCString(Platform::GetResolvedExecutableName()));
diff --git a/runtime/bin/socket_android.cc b/runtime/bin/socket_android.cc
index ae83b47..07e6894 100644
--- a/runtime/bin/socket_android.cc
+++ b/runtime/bin/socket_android.cc
@@ -25,6 +25,13 @@
 namespace dart {
 namespace bin {
 
+static void SaveErrorAndClose(intptr_t fd) {
+  int err = errno;
+  VOID_TEMP_FAILURE_RETRY(close(fd));
+  errno = err;
+}
+
+
 SocketAddress::SocketAddress(struct sockaddr* sa) {
   ASSERT(INET6_ADDRSTRLEN >= INET_ADDRSTRLEN);
   if (!Socket::FormatNumericAddress(*reinterpret_cast<RawAddr*>(sa), as_string_,
@@ -55,7 +62,10 @@
   if (fd < 0) {
     return -1;
   }
-  FDUtils::SetCloseOnExec(fd);
+  if (!FDUtils::SetCloseOnExec(fd)) {
+    SaveErrorAndClose(fd);
+    return -1;
+  }
   return fd;
 }
 
@@ -66,7 +76,7 @@
   if ((result == 0) || (errno == EINPROGRESS)) {
     return fd;
   }
-  VOID_TEMP_FAILURE_RETRY(close(fd));
+  SaveErrorAndClose(fd);
   return -1;
 }
 
@@ -77,8 +87,10 @@
     return fd;
   }
 
-  FDUtils::SetNonBlocking(fd);
-
+  if (!FDUtils::SetNonBlocking(fd)) {
+    SaveErrorAndClose(fd);
+    return -1;
+  }
   return Connect(fd, addr);
 }
 
@@ -93,7 +105,7 @@
   intptr_t result = TEMP_FAILURE_RETRY(
       bind(fd, &source_addr.addr, SocketAddress::GetAddrLength(source_addr)));
   if ((result != 0) && (errno != EINPROGRESS)) {
-    VOID_TEMP_FAILURE_RETRY(close(fd));
+    SaveErrorAndClose(fd);
     return -1;
   }
 
@@ -310,7 +322,10 @@
     return -1;
   }
 
-  FDUtils::SetCloseOnExec(fd);
+  if (!FDUtils::SetCloseOnExec(fd)) {
+    SaveErrorAndClose(fd);
+    return -1;
+  }
 
   if (reuseAddress) {
     int optval = 1;
@@ -320,11 +335,14 @@
 
   if (NO_RETRY_EXPECTED(
           bind(fd, &addr.addr, SocketAddress::GetAddrLength(addr))) < 0) {
-    VOID_TEMP_FAILURE_RETRY(close(fd));
+    SaveErrorAndClose(fd);
     return -1;
   }
 
-  FDUtils::SetNonBlocking(fd);
+  if (!FDUtils::SetNonBlocking(fd)) {
+    SaveErrorAndClose(fd);
+    return -1;
+  }
   return fd;
 }
 
@@ -358,7 +376,10 @@
     return -1;
   }
 
-  FDUtils::SetCloseOnExec(fd);
+  if (!FDUtils::SetCloseOnExec(fd)) {
+    SaveErrorAndClose(fd);
+    return -1;
+  }
 
   int optval = 1;
   VOID_NO_RETRY_EXPECTED(
@@ -372,7 +393,7 @@
 
   if (NO_RETRY_EXPECTED(
           bind(fd, &addr.addr, SocketAddress::GetAddrLength(addr))) < 0) {
-    VOID_TEMP_FAILURE_RETRY(close(fd));
+    SaveErrorAndClose(fd);
     return -1;
   }
 
@@ -382,18 +403,19 @@
     // Don't close the socket until we have created a new socket, ensuring
     // that we do not get the bad port number again.
     intptr_t new_fd = CreateBindListen(addr, backlog, v6_only);
-    int err = errno;
-    VOID_TEMP_FAILURE_RETRY(close(fd));
-    errno = err;
+    SaveErrorAndClose(fd);
     return new_fd;
   }
 
   if (NO_RETRY_EXPECTED(listen(fd, backlog > 0 ? backlog : SOMAXCONN)) != 0) {
-    VOID_TEMP_FAILURE_RETRY(close(fd));
+    SaveErrorAndClose(fd);
     return -1;
   }
 
-  FDUtils::SetNonBlocking(fd);
+  if (!FDUtils::SetNonBlocking(fd)) {
+    SaveErrorAndClose(fd);
+    return -1;
+  }
   return fd;
 }
 
@@ -428,8 +450,14 @@
       socket = kTemporaryFailure;
     }
   } else {
-    FDUtils::SetCloseOnExec(socket);
-    FDUtils::SetNonBlocking(socket);
+    if (!FDUtils::SetCloseOnExec(socket)) {
+      SaveErrorAndClose(socket);
+      return -1;
+    }
+    if (!FDUtils::SetNonBlocking(socket)) {
+      SaveErrorAndClose(socket);
+      return -1;
+    }
   }
   return socket;
 }
diff --git a/runtime/bin/socket_linux.cc b/runtime/bin/socket_linux.cc
index 2950728..e3d3103 100644
--- a/runtime/bin/socket_linux.cc
+++ b/runtime/bin/socket_linux.cc
@@ -28,6 +28,13 @@
 namespace dart {
 namespace bin {
 
+static void SaveErrorAndClose(intptr_t fd) {
+  int err = errno;
+  VOID_TEMP_FAILURE_RETRY(close(fd));
+  errno = err;
+}
+
+
 SocketAddress::SocketAddress(struct sockaddr* sa) {
   ASSERT(INET6_ADDRSTRLEN >= INET_ADDRSTRLEN);
   if (!Socket::FormatNumericAddress(*reinterpret_cast<RawAddr*>(sa), as_string_,
@@ -69,7 +76,7 @@
   if ((result == 0) || (errno == EINPROGRESS)) {
     return fd;
   }
-  VOID_TEMP_FAILURE_RETRY(close(fd));
+  SaveErrorAndClose(fd);
   return -1;
 }
 
@@ -93,7 +100,7 @@
   intptr_t result = TEMP_FAILURE_RETRY(
       bind(fd, &source_addr.addr, SocketAddress::GetAddrLength(source_addr)));
   if ((result != 0) && (errno != EINPROGRESS)) {
-    VOID_TEMP_FAILURE_RETRY(close(fd));
+    SaveErrorAndClose(fd);
     return -1;
   }
 
@@ -322,7 +329,7 @@
 
   if (NO_RETRY_EXPECTED(
           bind(fd, &addr.addr, SocketAddress::GetAddrLength(addr))) < 0) {
-    VOID_TEMP_FAILURE_RETRY(close(fd));
+    SaveErrorAndClose(fd);
     return -1;
   }
   return fd;
@@ -408,7 +415,7 @@
 
   if (NO_RETRY_EXPECTED(
           bind(fd, &addr.addr, SocketAddress::GetAddrLength(addr))) < 0) {
-    VOID_TEMP_FAILURE_RETRY(close(fd));
+    SaveErrorAndClose(fd);
     return -1;
   }
 
@@ -418,14 +425,12 @@
     // Don't close the socket until we have created a new socket, ensuring
     // that we do not get the bad port number again.
     intptr_t new_fd = CreateBindListen(addr, backlog, v6_only);
-    int err = errno;
-    VOID_TEMP_FAILURE_RETRY(close(fd));
-    errno = err;
+    SaveErrorAndClose(fd);
     return new_fd;
   }
 
   if (NO_RETRY_EXPECTED(listen(fd, backlog > 0 ? backlog : SOMAXCONN)) != 0) {
-    VOID_TEMP_FAILURE_RETRY(close(fd));
+    SaveErrorAndClose(fd);
     return -1;
   }
 
@@ -463,8 +468,14 @@
       socket = kTemporaryFailure;
     }
   } else {
-    FDUtils::SetCloseOnExec(socket);
-    FDUtils::SetNonBlocking(socket);
+    if (!FDUtils::SetCloseOnExec(socket)) {
+      SaveErrorAndClose(socket);
+      return -1;
+    }
+    if (!FDUtils::SetNonBlocking(socket)) {
+      SaveErrorAndClose(socket);
+      return -1;
+    }
   }
   return socket;
 }
diff --git a/runtime/bin/socket_macos.cc b/runtime/bin/socket_macos.cc
index 3e082eb..4d0f53d 100644
--- a/runtime/bin/socket_macos.cc
+++ b/runtime/bin/socket_macos.cc
@@ -27,6 +27,13 @@
 namespace dart {
 namespace bin {
 
+static void SaveErrorAndClose(intptr_t fd) {
+  int err = errno;
+  VOID_TEMP_FAILURE_RETRY(close(fd));
+  errno = err;
+}
+
+
 SocketAddress::SocketAddress(struct sockaddr* sa) {
   ASSERT(INET6_ADDRSTRLEN >= INET_ADDRSTRLEN);
   if (!Socket::FormatNumericAddress(*reinterpret_cast<RawAddr*>(sa), as_string_,
@@ -57,8 +64,14 @@
   if (fd < 0) {
     return -1;
   }
-  FDUtils::SetCloseOnExec(fd);
-  FDUtils::SetNonBlocking(fd);
+  if (!FDUtils::SetCloseOnExec(fd)) {
+    SaveErrorAndClose(fd);
+    return -1;
+  }
+  if (!FDUtils::SetNonBlocking(fd)) {
+    SaveErrorAndClose(fd);
+    return -1;
+  }
   return fd;
 }
 
@@ -69,7 +82,7 @@
   if ((result == 0) || (errno == EINPROGRESS)) {
     return fd;
   }
-  VOID_TEMP_FAILURE_RETRY(close(fd));
+  SaveErrorAndClose(fd);
   return -1;
 }
 
@@ -94,7 +107,7 @@
   intptr_t result = TEMP_FAILURE_RETRY(
       bind(fd, &source_addr.addr, SocketAddress::GetAddrLength(source_addr)));
   if ((result != 0) && (errno != EINPROGRESS)) {
-    VOID_TEMP_FAILURE_RETRY(close(fd));
+    SaveErrorAndClose(fd);
     return -1;
   }
 
@@ -304,7 +317,10 @@
     return -1;
   }
 
-  FDUtils::SetCloseOnExec(fd);
+  if (!FDUtils::SetCloseOnExec(fd)) {
+    SaveErrorAndClose(fd);
+    return -1;
+  }
 
   if (reuseAddress) {
     int optval = 1;
@@ -314,11 +330,14 @@
 
   if (NO_RETRY_EXPECTED(
           bind(fd, &addr.addr, SocketAddress::GetAddrLength(addr))) < 0) {
-    VOID_TEMP_FAILURE_RETRY(close(fd));
+    SaveErrorAndClose(fd);
     return -1;
   }
 
-  FDUtils::SetNonBlocking(fd);
+  if (!FDUtils::SetNonBlocking(fd)) {
+    SaveErrorAndClose(fd);
+    return -1;
+  }
   return fd;
 }
 
@@ -357,7 +376,9 @@
 
   intptr_t count = 0;
   for (struct ifaddrs* ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
-    if (ShouldIncludeIfaAddrs(ifa, lookup_family)) count++;
+    if (ShouldIncludeIfaAddrs(ifa, lookup_family)) {
+      count++;
+    }
   }
 
   AddressList<InterfaceSocketAddress>* addresses =
@@ -387,7 +408,10 @@
     return -1;
   }
 
-  FDUtils::SetCloseOnExec(fd);
+  if (!FDUtils::SetCloseOnExec(fd)) {
+    SaveErrorAndClose(fd);
+    return -1;
+  }
 
   int optval = 1;
   VOID_NO_RETRY_EXPECTED(
@@ -401,7 +425,7 @@
 
   if (NO_RETRY_EXPECTED(
           bind(fd, &addr.addr, SocketAddress::GetAddrLength(addr))) < 0) {
-    VOID_TEMP_FAILURE_RETRY(close(fd));
+    SaveErrorAndClose(fd);
     return -1;
   }
 
@@ -411,18 +435,19 @@
     // Don't close the socket until we have created a new socket, ensuring
     // that we do not get the bad port number again.
     intptr_t new_fd = CreateBindListen(addr, backlog, v6_only);
-    int err = errno;
-    VOID_TEMP_FAILURE_RETRY(close(fd));
-    errno = err;
+    SaveErrorAndClose(fd);
     return new_fd;
   }
 
   if (NO_RETRY_EXPECTED(listen(fd, backlog > 0 ? backlog : SOMAXCONN)) != 0) {
-    VOID_TEMP_FAILURE_RETRY(close(fd));
+    SaveErrorAndClose(fd);
     return -1;
   }
 
-  FDUtils::SetNonBlocking(fd);
+  if (!FDUtils::SetNonBlocking(fd)) {
+    SaveErrorAndClose(fd);
+    return -1;
+  }
   return fd;
 }
 
@@ -447,8 +472,14 @@
       socket = kTemporaryFailure;
     }
   } else {
-    FDUtils::SetCloseOnExec(socket);
-    FDUtils::SetNonBlocking(socket);
+    if (!FDUtils::SetCloseOnExec(socket)) {
+      SaveErrorAndClose(socket);
+      return -1;
+    }
+    if (!FDUtils::SetNonBlocking(socket)) {
+      SaveErrorAndClose(socket);
+      return -1;
+    }
   }
   return socket;
 }
diff --git a/runtime/bin/vmservice/server.dart b/runtime/bin/vmservice/server.dart
index 69f0728..8262053 100644
--- a/runtime/bin/vmservice/server.dart
+++ b/runtime/bin/vmservice/server.dart
@@ -338,7 +338,7 @@
     }
 
     // Shutdown HTTP server and subscription.
-    String oldServerAddress = serverAddress;
+    Uri oldServerAddress = serverAddress;
     return cleanup(forced).then((_) {
       print('Observatory no longer listening on $oldServerAddress');
       _server = null;
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
old mode 100755
new mode 100644
index bc60b3b..652c7913
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -54,8 +54,8 @@
 #include <stdbool.h>
 #if __GNUC__ >= 4
 #if defined(DART_SHARED_LIB)
-#define DART_EXPORT DART_EXTERN_C __attribute__ ((visibility("default"))) \
-    __attribute((used))
+#define DART_EXPORT                                                            \
+  DART_EXTERN_C __attribute__((visibility("default"))) __attribute((used))
 #else
 #define DART_EXPORT DART_EXTERN_C
 #endif
@@ -418,10 +418,10 @@
   {                                                                            \
     Dart_Handle __handle = handle;                                             \
     if (Dart_IsError((__handle))) {                                            \
-      _Dart_ReportErrorHandle(__FILE__, __LINE__,                              \
-                              #handle, Dart_GetError(__handle));               \
+      _Dart_ReportErrorHandle(__FILE__, __LINE__, #handle,                     \
+                              Dart_GetError(__handle));                        \
     }                                                                          \
-  }                                                                            \
+  }
 
 /**
  * Converts an object to a string.
@@ -467,8 +467,8 @@
 /**
  * Allocates a handle in the current scope from a weak persistent handle.
  */
-DART_EXPORT Dart_Handle Dart_HandleFromWeakPersistent(
-    Dart_WeakPersistentHandle object);
+DART_EXPORT Dart_Handle
+Dart_HandleFromWeakPersistent(Dart_WeakPersistentHandle object);
 
 /**
  * Allocates a persistent handle for an object.
@@ -532,11 +532,11 @@
  * \return The weak persistent handle or NULL. NULL is returned in case of bad
  *   parameters.
  */
-DART_EXPORT Dart_WeakPersistentHandle Dart_NewWeakPersistentHandle(
-    Dart_Handle object,
-    void* peer,
-    intptr_t external_allocation_size,
-    Dart_WeakPersistentHandleFinalizer callback);
+DART_EXPORT Dart_WeakPersistentHandle
+Dart_NewWeakPersistentHandle(Dart_Handle object,
+                             void* peer,
+                             intptr_t external_allocation_size,
+                             Dart_WeakPersistentHandleFinalizer callback);
 
 DART_EXPORT void Dart_DeleteWeakPersistentHandle(
     Dart_Isolate isolate,
@@ -582,9 +582,9 @@
  * \return Success if the callbacks were added.  Otherwise, returns an
  *   error handle.
  */
-DART_EXPORT Dart_Handle Dart_SetGcCallbacks(
-    Dart_GcPrologueCallback prologue_callback,
-    Dart_GcEpilogueCallback epilogue_callback);
+DART_EXPORT Dart_Handle
+Dart_SetGcCallbacks(Dart_GcPrologueCallback prologue_callback,
+                    Dart_GcEpilogueCallback epilogue_callback);
 
 
 /*
@@ -793,19 +793,19 @@
  *    See Dart_GetVMServiceAssetsArchive.
  */
 typedef struct {
-    int32_t version;
-    const uint8_t* vm_isolate_snapshot;
-    const uint8_t* instructions_snapshot;
-    const uint8_t* data_snapshot;
-    Dart_IsolateCreateCallback create;
-    Dart_IsolateShutdownCallback shutdown;
-    Dart_ThreadExitCallback thread_exit;
-    Dart_FileOpenCallback file_open;
-    Dart_FileReadCallback file_read;
-    Dart_FileWriteCallback file_write;
-    Dart_FileCloseCallback file_close;
-    Dart_EntropySource entropy_source;
-    Dart_GetVMServiceAssetsArchive get_service_assets;
+  int32_t version;
+  const uint8_t* vm_isolate_snapshot;
+  const uint8_t* instructions_snapshot;
+  const uint8_t* data_snapshot;
+  Dart_IsolateCreateCallback create;
+  Dart_IsolateShutdownCallback shutdown;
+  Dart_ThreadExitCallback thread_exit;
+  Dart_FileOpenCallback file_open;
+  Dart_FileReadCallback file_read;
+  Dart_FileWriteCallback file_write;
+  Dart_FileCloseCallback file_close;
+  Dart_EntropySource entropy_source;
+  Dart_GetVMServiceAssetsArchive get_service_assets;
 } Dart_InitializeParams;
 
 /**
@@ -854,7 +854,9 @@
  *
  * A snapshot can be used to restore the VM quickly to a saved state
  * and is useful for fast startup. If snapshot data is provided, the
- * isolate will be started using that snapshot data.
+ * isolate will be started using that snapshot data. Requires a core snapshot or
+ * an app snapshot created by Dart_CreateSnapshot or
+ * Dart_CreatePrecompiledSnapshot* from a VM with the same version.
  *
  * Requires there to be no current isolate.
  *
@@ -977,11 +979,11 @@
  *
  * \return A valid handle if no error occurs during the operation.
  */
-DART_EXPORT Dart_Handle Dart_CreateSnapshot(
-    uint8_t** vm_isolate_snapshot_buffer,
-    intptr_t* vm_isolate_snapshot_size,
-    uint8_t** isolate_snapshot_buffer,
-    intptr_t* isolate_snapshot_size);
+DART_EXPORT Dart_Handle
+Dart_CreateSnapshot(uint8_t** vm_isolate_snapshot_buffer,
+                    intptr_t* vm_isolate_snapshot_size,
+                    uint8_t** isolate_snapshot_buffer,
+                    intptr_t* isolate_snapshot_size);
 
 /**
  * Creates a snapshot of the application script loaded in the isolate.
@@ -1062,7 +1064,7 @@
  * ILLEGAL_PORT is a port number guaranteed never to be associated with a valid
  * port.
  */
-#define ILLEGAL_PORT ((Dart_Port) 0)
+#define ILLEGAL_PORT ((Dart_Port)0)
 
 /**
  * A message notification callback.
@@ -1432,7 +1434,7 @@
 DART_EXPORT bool Dart_IsDouble(Dart_Handle object);
 DART_EXPORT bool Dart_IsBoolean(Dart_Handle object);
 DART_EXPORT bool Dart_IsString(Dart_Handle object);
-DART_EXPORT bool Dart_IsStringLatin1(Dart_Handle object);  /* (ISO-8859-1) */
+DART_EXPORT bool Dart_IsStringLatin1(Dart_Handle object); /* (ISO-8859-1) */
 DART_EXPORT bool Dart_IsExternalString(Dart_Handle object);
 DART_EXPORT bool Dart_IsList(Dart_Handle object);
 DART_EXPORT bool Dart_IsMap(Dart_Handle object);
@@ -1716,11 +1718,11 @@
  * \return The String object if no error occurs. Otherwise returns
  *   an error handle.
  */
-DART_EXPORT Dart_Handle Dart_NewExternalLatin1String(
-    const uint8_t* latin1_array,
-    intptr_t length,
-    void* peer,
-    Dart_PeerFinalizer cback);
+DART_EXPORT Dart_Handle
+Dart_NewExternalLatin1String(const uint8_t* latin1_array,
+                             intptr_t length,
+                             void* peer,
+                             Dart_PeerFinalizer cback);
 
 /**
  * Returns a String which references an external array of UTF-16 encoded
@@ -1838,12 +1840,12 @@
  *  result = Dart_MakeExternalString(str, data, size, NULL, NULL);
  *
  */
-DART_EXPORT Dart_Handle Dart_MakeExternalString(
-    Dart_Handle str,
-    void* array,
-    intptr_t external_allocation_size,
-    void* peer,
-    Dart_PeerFinalizer cback);
+DART_EXPORT Dart_Handle
+Dart_MakeExternalString(Dart_Handle str,
+                        void* array,
+                        intptr_t external_allocation_size,
+                        void* peer,
+                        Dart_PeerFinalizer cback);
 
 /**
  * Retrieves some properties associated with a String.
@@ -1905,8 +1907,7 @@
  * \return The Object in the List at the specified index if no error
  *   occurs. Otherwise returns an error handle.
  */
-DART_EXPORT Dart_Handle Dart_ListGetAt(Dart_Handle list,
-                                       intptr_t index);
+DART_EXPORT Dart_Handle Dart_ListGetAt(Dart_Handle list, intptr_t index);
 
 /**
 * Gets a range of Objects from a List.
@@ -2042,8 +2043,8 @@
  * \return kInvalid if the object is not an external TypedData object or
  *   the appropriate Dart_TypedData_Type.
  */
-DART_EXPORT Dart_TypedData_Type Dart_GetTypeOfExternalTypedData(
-    Dart_Handle object);
+DART_EXPORT Dart_TypedData_Type
+Dart_GetTypeOfExternalTypedData(Dart_Handle object);
 
 /**
  * Returns a TypedData object of the desired length and type.
@@ -2181,10 +2182,10 @@
  * \return The new object. If an error occurs during execution, then an
  *   error handle is returned.
  */
-DART_EXPORT Dart_Handle Dart_AllocateWithNativeFields(
-    Dart_Handle type,
-    intptr_t num_native_fields,
-    const intptr_t* native_fields);
+DART_EXPORT Dart_Handle
+Dart_AllocateWithNativeFields(Dart_Handle type,
+                              intptr_t num_native_fields,
+                              const intptr_t* native_fields);
 
 /**
  * Invokes a method or function.
@@ -2273,8 +2274,7 @@
  * \return If no error occurs, then the value of the field is
  *   returned. Otherwise an error handle is returned.
  */
-DART_EXPORT Dart_Handle Dart_GetField(Dart_Handle container,
-                                      Dart_Handle name);
+DART_EXPORT Dart_Handle Dart_GetField(Dart_Handle container, Dart_Handle name);
 
 /**
  * Sets the value of a field.
@@ -2446,7 +2446,7 @@
 #define BITMASK(size) ((1 << size) - 1)
 #define DART_NATIVE_ARG_DESCRIPTOR(type, position)                             \
   (((type & BITMASK(kNativeArgTypeSize)) << kNativeArgTypePos) |               \
-    (position & BITMASK(kNativeArgNumberSize)))
+   (position & BITMASK(kNativeArgNumberSize)))
 
 /**
  * Gets the native arguments based on the types passed in and populates
@@ -2469,11 +2469,11 @@
  *   returns an error handle if there were any errors while extracting the
  *   arguments (mismatched number of arguments, incorrect types, etc.).
  */
-DART_EXPORT Dart_Handle Dart_GetNativeArguments(
-    Dart_NativeArguments args,
-    int num_arguments,
-    const Dart_NativeArgument_Descriptor* arg_descriptors,
-    Dart_NativeArgument_Value* arg_values);
+DART_EXPORT Dart_Handle
+Dart_GetNativeArguments(Dart_NativeArguments args,
+                        int num_arguments,
+                        const Dart_NativeArgument_Descriptor* arg_descriptors,
+                        Dart_NativeArgument_Value* arg_values);
 
 
 /**
@@ -2500,11 +2500,11 @@
  *   null object then 0 is copied as the native field values into the
  *   'field_values' array.
  */
-DART_EXPORT Dart_Handle Dart_GetNativeFieldsOfArgument(
-    Dart_NativeArguments args,
-    int arg_index,
-    int num_fields,
-    intptr_t* field_values);
+DART_EXPORT Dart_Handle
+Dart_GetNativeFieldsOfArgument(Dart_NativeArguments args,
+                               int arg_index,
+                               int num_fields,
+                               intptr_t* field_values);
 
 /**
  * Gets the native field of the receiver.
@@ -2657,8 +2657,8 @@
  * the const constructors bool.fromEnvironment, int.fromEnvironment
  * and String.fromEnvironment.
  */
-DART_EXPORT Dart_Handle Dart_SetEnvironmentCallback(
-    Dart_EnvironmentCallback callback);
+DART_EXPORT Dart_Handle
+Dart_SetEnvironmentCallback(Dart_EnvironmentCallback callback);
 
 /**
  * Sets the callback used to resolve native functions for a library.
@@ -2668,10 +2668,10 @@
  *
  * \return A valid handle if the native resolver was set successfully.
  */
-DART_EXPORT Dart_Handle Dart_SetNativeResolver(
-    Dart_Handle library,
-    Dart_NativeEntryResolver resolver,
-    Dart_NativeEntrySymbol symbol);
+DART_EXPORT Dart_Handle
+Dart_SetNativeResolver(Dart_Handle library,
+                       Dart_NativeEntryResolver resolver,
+                       Dart_NativeEntrySymbol symbol);
 /* TODO(turnidge): Rename to Dart_LibrarySetNativeResolver? */
 
 
@@ -2742,8 +2742,8 @@
  *
  * TODO(turnidge): Document.
  */
-DART_EXPORT Dart_Handle Dart_SetLibraryTagHandler(
-    Dart_LibraryTagHandler handler);
+DART_EXPORT Dart_Handle
+Dart_SetLibraryTagHandler(Dart_LibraryTagHandler handler);
 
 /**
  * Canonicalizes a url with respect to some library.
@@ -2795,7 +2795,9 @@
                                         intptr_t col_offset);
 
 /**
- * Loads the root script for current isolate from a snapshot.
+ * Loads the root script for current isolate from a script snapshot. The
+ * snapshot must have been created by Dart_CreateScriptSnapshot from a VM with
+ * the same version.
  *
  * \param buffer A buffer which contains a snapshot of the script.
  * \param buffer_len Length of the passed in buffer.
@@ -3115,9 +3117,8 @@
  * \return An error handle if a compilation error or runtime error running const
  * constructors was encountered.
  */
-DART_EXPORT Dart_Handle Dart_Precompile(
-    Dart_QualifiedFunctionName entry_points[],
-    bool reset_fields);
+DART_EXPORT Dart_Handle
+Dart_Precompile(Dart_QualifiedFunctionName entry_points[], bool reset_fields);
 
 
 /**
@@ -3139,9 +3140,9 @@
  *
  * \return A valid handle if no error occurs during the operation.
  */
-DART_EXPORT Dart_Handle Dart_CreatePrecompiledSnapshotAssembly(
-    uint8_t** assembly_buffer,
-    intptr_t* assembly_size);
+DART_EXPORT Dart_Handle
+Dart_CreatePrecompiledSnapshotAssembly(uint8_t** assembly_buffer,
+                                       intptr_t* assembly_size);
 
 
 /**
@@ -3150,15 +3151,15 @@
  *  load with mmap. The instructions piece must be loaded with read and
  *  execute permissions; the rodata piece may be loaded as read-only.
  */
-DART_EXPORT Dart_Handle Dart_CreatePrecompiledSnapshotBlob(
-    uint8_t** vm_isolate_snapshot_buffer,
-    intptr_t* vm_isolate_snapshot_size,
-    uint8_t** isolate_snapshot_buffer,
-    intptr_t* isolate_snapshot_size,
-    uint8_t** instructions_blob_buffer,
-    intptr_t* instructions_blob_size,
-    uint8_t** rodata_blob_buffer,
-    intptr_t* rodata_blob_size);
+DART_EXPORT Dart_Handle
+Dart_CreatePrecompiledSnapshotBlob(uint8_t** vm_isolate_snapshot_buffer,
+                                   intptr_t* vm_isolate_snapshot_size,
+                                   uint8_t** isolate_snapshot_buffer,
+                                   intptr_t* isolate_snapshot_size,
+                                   uint8_t** instructions_blob_buffer,
+                                   intptr_t* instructions_blob_size,
+                                   uint8_t** rodata_blob_buffer,
+                                   intptr_t* rodata_blob_size);
 
 
 DART_EXPORT Dart_Handle Dart_PrecompileJIT();
@@ -3187,15 +3188,15 @@
  *
  * \return A valid handle if no error occurs during the operation.
  */
-DART_EXPORT Dart_Handle Dart_CreateAppJITSnapshot(
-    uint8_t** vm_isolate_snapshot_buffer,
-    intptr_t* vm_isolate_snapshot_size,
-    uint8_t** isolate_snapshot_buffer,
-    intptr_t* isolate_snapshot_size,
-    uint8_t** instructions_blob_buffer,
-    intptr_t* instructions_blob_size,
-    uint8_t** rodata_blob_buffer,
-    intptr_t* rodata_blob_size);
+DART_EXPORT Dart_Handle
+Dart_CreateAppJITSnapshot(uint8_t** vm_isolate_snapshot_buffer,
+                          intptr_t* vm_isolate_snapshot_size,
+                          uint8_t** isolate_snapshot_buffer,
+                          intptr_t* isolate_snapshot_size,
+                          uint8_t** instructions_blob_buffer,
+                          intptr_t* instructions_blob_size,
+                          uint8_t** rodata_blob_buffer,
+                          intptr_t* rodata_blob_size);
 
 
 /**
@@ -3205,4 +3206,4 @@
  */
 DART_EXPORT bool Dart_IsPrecompiledRuntime();
 
-#endif  /* INCLUDE_DART_API_H_ */  /* NOLINT */
+#endif /* INCLUDE_DART_API_H_ */ /* NOLINT */
diff --git a/runtime/include/dart_mirrors_api.h b/runtime/include/dart_mirrors_api.h
index e0f57e0..517adb9 100644
--- a/runtime/include/dart_mirrors_api.h
+++ b/runtime/include/dart_mirrors_api.h
@@ -139,4 +139,4 @@
 DART_EXPORT Dart_Handle Dart_ClosureFunction(Dart_Handle closure);
 
 
-#endif  /* INCLUDE_DART_MIRRORS_API_H_ */  /* NOLINT */
+#endif /* INCLUDE_DART_MIRRORS_API_H_ */ /* NOLINT */
diff --git a/runtime/include/dart_native_api.h b/runtime/include/dart_native_api.h
index f1e0ca1..fd0e0fb 100644
--- a/runtime/include/dart_native_api.h
+++ b/runtime/include/dart_native_api.h
@@ -176,4 +176,4 @@
  */
 DART_EXPORT Dart_Handle Dart_ParseAll();
 
-#endif  /* INCLUDE_DART_NATIVE_API_H_ */  /* NOLINT */
+#endif /* INCLUDE_DART_NATIVE_API_H_ */ /* NOLINT */
diff --git a/runtime/include/dart_tools_api.h b/runtime/include/dart_tools_api.h
index 73c923e..bfd8f89 100644
--- a/runtime/include/dart_tools_api.h
+++ b/runtime/include/dart_tools_api.h
@@ -18,7 +18,7 @@
  */
 
 
- /*
+/*
   * ========
   * Debugger
   * ========
@@ -155,9 +155,8 @@
  * \return A handle to string containing the source text if no error
  * occurs.
  */
-DART_EXPORT Dart_Handle Dart_ScriptGetSource(
-                            intptr_t library_id,
-                            Dart_Handle script_url_in);
+DART_EXPORT Dart_Handle Dart_ScriptGetSource(intptr_t library_id,
+                                             Dart_Handle script_url_in);
 
 
 /**
@@ -177,9 +176,8 @@
  *
  * \return A handle to an array or an error object.
  */
-DART_EXPORT Dart_Handle Dart_ScriptGetTokenInfo(
-                            intptr_t library_id,
-                            Dart_Handle script_url_in);
+DART_EXPORT Dart_Handle Dart_ScriptGetTokenInfo(intptr_t library_id,
+                                                Dart_Handle script_url_in);
 
 
 /**
@@ -205,9 +203,8 @@
  * \return A handle containing the breakpoint id, which is an integer
  * value, or an error object if a breakpoint could not be set.
  */
-DART_EXPORT Dart_Handle Dart_SetBreakpoint(
-                            Dart_Handle script_url,
-                            intptr_t line_number);
+DART_EXPORT Dart_Handle Dart_SetBreakpoint(Dart_Handle script_url,
+                                           intptr_t line_number);
 
 /**
  * Deletes the breakpoint with the given id \pb_id.
@@ -251,10 +248,9 @@
  * \return A handle containing the breakpoint id, which is an integer
  * value, or an error object if a breakpoint could not be set.
  */
-DART_EXPORT Dart_Handle Dart_SetBreakpointAtEntry(
-                            Dart_Handle library,
-                            Dart_Handle class_name,
-                            Dart_Handle function_name);
+DART_EXPORT Dart_Handle Dart_SetBreakpointAtEntry(Dart_Handle library,
+                                                  Dart_Handle class_name,
+                                                  Dart_Handle function_name);
 
 
 /**
@@ -266,10 +262,9 @@
  *
  * \return A handle to the True object if no error occurs.
  */
-DART_EXPORT Dart_Handle Dart_OneTimeBreakAtEntry(
-                            Dart_Handle library,
-                            Dart_Handle class_name,
-                            Dart_Handle function_name);
+DART_EXPORT Dart_Handle Dart_OneTimeBreakAtEntry(Dart_Handle library,
+                                                 Dart_Handle class_name,
+                                                 Dart_Handle function_name);
 
 
 /**
@@ -305,8 +300,7 @@
  *
  * Requires there to be a current isolate.
  */
-DART_EXPORT void Dart_SetPausedEventHandler(
-                            Dart_PausedEventHandler handler);
+DART_EXPORT void Dart_SetPausedEventHandler(Dart_PausedEventHandler handler);
 
 
 /**
@@ -316,7 +310,7 @@
  * Requires there to be a current isolate.
  */
 DART_EXPORT void Dart_SetBreakpointResolvedHandler(
-                            Dart_BreakpointResolvedHandler handler);
+    Dart_BreakpointResolvedHandler handler);
 
 /**
  * Installs a callback function that gets called by the VM when
@@ -325,7 +319,7 @@
  * Requires there to be a current isolate.
  */
 DART_EXPORT void Dart_SetExceptionThrownHandler(
-                            Dart_ExceptionThrownHandler handler);
+    Dart_ExceptionThrownHandler handler);
 
 /**
  * Installs a callback function that gets called by the VM when
@@ -349,8 +343,8 @@
  *
  * Requires there to be a current isolate.
  */
-DART_EXPORT Dart_Handle Dart_SetExceptionPauseInfo(
-                            Dart_ExceptionPauseInfo pause_info);
+DART_EXPORT Dart_Handle
+Dart_SetExceptionPauseInfo(Dart_ExceptionPauseInfo pause_info);
 
 
 /**
@@ -390,9 +384,8 @@
  *
  * \return A handle to the True object if no error occurs.
  */
-DART_EXPORT Dart_Handle Dart_StackTraceLength(
-                            Dart_StackTrace trace,
-                            intptr_t* length);
+DART_EXPORT Dart_Handle Dart_StackTraceLength(Dart_StackTrace trace,
+                                              intptr_t* length);
 
 
 /**
@@ -403,10 +396,9 @@
  *
  * \return A handle to the True object if no error occurs.
  */
-DART_EXPORT Dart_Handle Dart_GetActivationFrame(
-                            Dart_StackTrace trace,
-                            int frame_index,
-                            Dart_ActivationFrame* frame);
+DART_EXPORT Dart_Handle Dart_GetActivationFrame(Dart_StackTrace trace,
+                                                int frame_index,
+                                                Dart_ActivationFrame* frame);
 
 
 /**
@@ -425,12 +417,12 @@
  *
  * \return A valid handle if no error occurs during the operation.
  */
-DART_EXPORT Dart_Handle Dart_ActivationFrameInfo(
-                            Dart_ActivationFrame activation_frame,
-                            Dart_Handle* function_name,
-                            Dart_Handle* script_url,
-                            intptr_t* line_number,
-                            intptr_t* column_number);
+DART_EXPORT Dart_Handle
+Dart_ActivationFrameInfo(Dart_ActivationFrame activation_frame,
+                         Dart_Handle* function_name,
+                         Dart_Handle* script_url,
+                         intptr_t* line_number,
+                         intptr_t* column_number);
 
 
 /**
@@ -456,11 +448,11 @@
  *         A handle to the False object if there is no text
  *         position for the frame.
  */
-DART_EXPORT Dart_Handle Dart_ActivationFrameGetLocation(
-                            Dart_ActivationFrame activation_frame,
-                            Dart_Handle* function_name,
-                            Dart_Handle* function,
-                            Dart_CodeLocation* location);
+DART_EXPORT Dart_Handle
+Dart_ActivationFrameGetLocation(Dart_ActivationFrame activation_frame,
+                                Dart_Handle* function_name,
+                                Dart_Handle* function,
+                                Dart_CodeLocation* location);
 
 /**
  * Returns frame pointer of the given activation frame.
@@ -471,9 +463,9 @@
  *
  * \return A handle to the True object if no error occurs.
  */
-DART_EXPORT Dart_Handle Dart_ActivationFrameGetFramePointer(
-                            Dart_ActivationFrame activation_frame,
-                            uintptr_t* frame_pointer);
+DART_EXPORT Dart_Handle
+Dart_ActivationFrameGetFramePointer(Dart_ActivationFrame activation_frame,
+                                    uintptr_t* frame_pointer);
 
 /**
  * Returns an array containing all the local variable names and values of
@@ -486,8 +478,8 @@
  * no variables. If non-empty, variable names are at array offsets 2*n,
  * values at offset 2*n+1.
  */
-DART_EXPORT Dart_Handle Dart_GetLocalVariables(
-                            Dart_ActivationFrame activation_frame);
+DART_EXPORT Dart_Handle
+Dart_GetLocalVariables(Dart_ActivationFrame activation_frame);
 
 
 /**
@@ -519,9 +511,9 @@
  * Execute the expression given in string \expr in the context
  * of stack frame \activation_frame.
  */
-DART_EXPORT Dart_Handle Dart_ActivationFrameEvaluate(
-                            Dart_ActivationFrame activation_frame,
-                            Dart_Handle expr_in);
+DART_EXPORT Dart_Handle
+Dart_ActivationFrameEvaluate(Dart_ActivationFrame activation_frame,
+                             Dart_Handle expr_in);
 
 
 /**
@@ -542,8 +534,7 @@
  * the compilation of the expression fails, or if the evaluation throws
  * an error.
  */
-DART_EXPORT Dart_Handle Dart_EvaluateExpr(Dart_Handle target,
-                                          Dart_Handle expr);
+DART_EXPORT Dart_Handle Dart_EvaluateExpr(Dart_Handle target, Dart_Handle expr);
 
 
 /**
@@ -783,13 +774,12 @@
  * \return True if the result is a regular JSON-RPC response, false if the
  *   result is a JSON-RPC error.
  */
-typedef bool (*Dart_ServiceRequestCallback)(
-    const char* method,
-    const char** param_keys,
-    const char** param_values,
-    intptr_t num_params,
-    void* user_data,
-    const char** json_object);
+typedef bool (*Dart_ServiceRequestCallback)(const char* method,
+                                            const char** param_keys,
+                                            const char** param_values,
+                                            intptr_t num_params,
+                                            void* user_data,
+                                            const char** json_object);
 
 
 /**
@@ -913,8 +903,8 @@
  */
 typedef bool (*Dart_FileModifiedCallback)(const char* url, int64_t since);
 
-DART_EXPORT Dart_Handle Dart_SetFileModifiedCallback(
-    Dart_FileModifiedCallback file_modified_callback);
+DART_EXPORT Dart_Handle
+Dart_SetFileModifiedCallback(Dart_FileModifiedCallback file_modified_callback);
 
 /*
  * ========
@@ -948,14 +938,11 @@
 #define DART_TIMELINE_STREAM_VM (1 << 7)
 
 /** All timeline streams */
-#define DART_TIMELINE_STREAM_ALL (DART_TIMELINE_STREAM_API |                   \
-                                  DART_TIMELINE_STREAM_COMPILER |              \
-                                  DART_TIMELINE_STREAM_DART |                  \
-                                  DART_TIMELINE_STREAM_DEBUGGER |              \
-                                  DART_TIMELINE_STREAM_EMBEDDER |              \
-                                  DART_TIMELINE_STREAM_GC |                    \
-                                  DART_TIMELINE_STREAM_ISOLATE |               \
-                                  DART_TIMELINE_STREAM_VM)
+#define DART_TIMELINE_STREAM_ALL                                               \
+  (DART_TIMELINE_STREAM_API | DART_TIMELINE_STREAM_COMPILER |                  \
+   DART_TIMELINE_STREAM_DART | DART_TIMELINE_STREAM_DEBUGGER |                 \
+   DART_TIMELINE_STREAM_EMBEDDER | DART_TIMELINE_STREAM_GC |                   \
+   DART_TIMELINE_STREAM_ISOLATE | DART_TIMELINE_STREAM_VM)
 
 /** Disable all timeline stream recording */
 #define DART_TIMELINE_STREAM_DISABLE 0
@@ -1001,12 +988,11 @@
  * At the end of each stream state will be DART_STREAM_CONSUMER_STATE_FINISH
  * and buffer will be NULL.
  */
-typedef void (*Dart_StreamConsumer)(
-    Dart_StreamConsumer_State state,
-    const char* stream_name,
-    const uint8_t* buffer,
-    intptr_t buffer_length,
-    void* stream_callback_data);
+typedef void (*Dart_StreamConsumer)(Dart_StreamConsumer_State state,
+                                    const char* stream_name,
+                                    const uint8_t* buffer,
+                                    intptr_t buffer_length,
+                                    void* stream_callback_data);
 
 /**
  * Get the timeline for entire VM (including all isolates).
diff --git a/runtime/lib/double.dart b/runtime/lib/double.dart
index 2fd2e97..6a532ef 100644
--- a/runtime/lib/double.dart
+++ b/runtime/lib/double.dart
@@ -275,11 +275,4 @@
       return LESS;
     }
   }
-
-  static const int _FRACTIONAL_BITS = // Bits to keep after the decimal point.
-      const int.fromEnvironment("doubleFractionalBits", defaultValue: 20);
-  static const double _BIAS = 1.5 * (1 << (52 - _FRACTIONAL_BITS));
-
-  // Returns this with only _FRACTIONAL_BITS bits after the decimal point.
-  double get p => this + _BIAS - _BIAS;
 }
diff --git a/runtime/observatory/BUILD.gn b/runtime/observatory/BUILD.gn
index 4978c1a..d4c736c 100644
--- a/runtime/observatory/BUILD.gn
+++ b/runtime/observatory/BUILD.gn
@@ -2,7 +2,8 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import("../../utils/invoke_dart.gni")
+import("../../build/executable_suffix.gni")
+import("../../build/prebuilt_dart_sdk.gni")
 
 # Currently paths here are hard coded for convenience in building Mojo/Flutter.
 declare_args() {
@@ -29,19 +30,20 @@
     "--pub-executable",
     dart_host_pub_exe,
   ]
-} else {
+} else if (!prebuilt_dart_exe_works) {
   pub_build_deps += [ "../bin:dart_bootstrap($host_toolchain)" ]
 
   dart_out_dir =
       get_label_info("../bin:dart_bootstrap($host_toolchain)", "root_out_dir")
-  dart_bootstrap =
-      rebase_path("$dart_out_dir/dart_bootstrap$dart_executable_suffix")
+  dart_bootstrap = rebase_path("$dart_out_dir/dart_bootstrap$executable_suffix")
 
   pub_build_args = [
     "--sdk=True",
     "--dart-executable",
     dart_bootstrap,
   ]
+} else {
+  pub_build_args = [ "--sdk=True" ]
 }
 
 current_dir = rebase_path(".", "//")
diff --git a/runtime/observatory/tests/service/auth_token1_test.dart b/runtime/observatory/tests/service/auth_token1_test.dart
new file mode 100644
index 0000000..5afb263
--- /dev/null
+++ b/runtime/observatory/tests/service/auth_token1_test.dart
@@ -0,0 +1,49 @@
+// Copyright (c) 2016, 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=--error_on_bad_type --error_on_bad_override
+
+import 'dart:async';
+import 'dart:developer';
+import 'dart:io' as io;
+import 'package:observatory/service_io.dart';
+import 'package:unittest/unittest.dart';
+import 'test_helper.dart';
+
+Future<Null> testeeBefore() async {
+  print('testee before');
+  print(await Service.getInfo());
+  // Start the web server.
+  ServiceProtocolInfo info = await Service.controlWebServer(enable: true);
+  expect(info.serverUri, isNotNull);
+  // Ensure that we have no auth token in the path segments.
+  expect(info.serverUri.pathSegments.length, equals(0));
+
+  // Try connecting to the server without the auth token, it should succeed.
+  var port = info.serverUri.port;
+  var url = Uri.parse('http://127.0.0.1:$port');
+  var httpClient = new io.HttpClient();
+  try {
+    var request = await httpClient.getUrl(url);
+    expect(true, true);
+  } catch (e) {
+    expect(true, false);
+  }
+}
+
+var tests = [
+(Isolate isolate) async {
+  await isolate.reload();
+  // Just getting here means that the testee enabled the service protocol
+  // web server.
+  expect(true, true);
+}
+];
+
+main(args) => runIsolateTests(args,
+                              tests,
+                              testeeBefore: testeeBefore,
+                              // the testee is responsible for starting the
+                              // web server.
+                              testeeControlsServer: true,
+                              useAuthToken: false);
diff --git a/runtime/observatory/tests/service/auth_token_test.dart b/runtime/observatory/tests/service/auth_token_test.dart
index ce75e4f..6d38fca 100644
--- a/runtime/observatory/tests/service/auth_token_test.dart
+++ b/runtime/observatory/tests/service/auth_token_test.dart
@@ -1,10 +1,11 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, 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=--error_on_bad_type --error_on_bad_override
 
 import 'dart:async';
 import 'dart:developer';
+import 'dart:io' as io;
 import 'package:observatory/service_io.dart';
 import 'package:unittest/unittest.dart';
 import 'test_helper.dart';
@@ -19,6 +20,26 @@
   expect(info.serverUri.pathSegments.length, greaterThan(1));
   // Sanity check the length of the auth token.
   expect(info.serverUri.pathSegments[0].length, greaterThan(8));
+
+  // Try connecting to the server without the auth token, it should throw
+  // an exception.
+  var port = info.serverUri.port;
+  var url = Uri.parse('http://127.0.0.1:$port');
+  var httpClient = new io.HttpClient();
+  try {
+    var request = await httpClient.getUrl(url);
+    expect(true, false);
+  } catch (e) {
+    expect(true, true);
+  }
+
+  // Try connecting to the server with the auth token, it should succeed.
+  try {
+    var request = await httpClient.getUrl(info.serverUri);
+    expect(true, true);
+  } catch (e) {
+    expect(true, false);
+  }
 }
 
 var tests = [
diff --git a/runtime/observatory/tests/service/developer_server_control_test.dart b/runtime/observatory/tests/service/developer_server_control_test.dart
index fc1e940..400796b 100644
--- a/runtime/observatory/tests/service/developer_server_control_test.dart
+++ b/runtime/observatory/tests/service/developer_server_control_test.dart
@@ -9,12 +9,63 @@
 import 'package:unittest/unittest.dart';
 import 'test_helper.dart';
 
+int majorVersion;
+int minorVersion;
+Uri serverUri;
+
 Future<Null> testeeBefore() async {
   print('testee before');
-  print(await Service.getInfo());
-  // Start the web server.
-  ServiceProtocolInfo info = await Service.controlWebServer(enable: true);
-  print(info);
+  // First grab the URL where the observatory is listening on and the
+  // service protocol version numbers. We expect the URL to be null as
+  // the server has not been started yet.
+  ServiceProtocolInfo info = await Service.getInfo();
+  majorVersion = info.majorVersion;
+  minorVersion = info.minorVersion;
+  serverUri = info.serverUri;
+  expect(info.serverUri, isNull);
+  {
+    // Now, start the web server and store the URI which is expected to be
+    // non NULL in the top level variable.
+    ServiceProtocolInfo info = await Service.controlWebServer(enable: true);
+    expect(info.majorVersion, equals(majorVersion));
+    expect(info.minorVersion, equals(minorVersion));
+    expect(info.serverUri, isNotNull);
+    serverUri = info.serverUri;
+  }
+  {
+    // Now try starting the web server again, this should just return the
+    // existing state without any change (port number does not change).
+    ServiceProtocolInfo info = await Service.controlWebServer(enable: true);
+    expect(info.majorVersion, equals(majorVersion));
+    expect(info.minorVersion, equals(minorVersion));
+    expect(info.serverUri, equals(serverUri));
+  }
+  {
+    // Try turning off the web server, this should turn off the server and
+    // the Uri returned should be null.
+    ServiceProtocolInfo info = await Service.controlWebServer(enable: false);
+    expect(info.majorVersion, equals(majorVersion));
+    expect(info.minorVersion, equals(minorVersion));
+    expect(info.serverUri, isNull);
+  }
+  {
+    // Try turning off the web server again, this should be a nop
+    // and the Uri returned should be null.
+    ServiceProtocolInfo info = await Service.controlWebServer(enable: false);
+    expect(info.majorVersion, equals(majorVersion));
+    expect(info.minorVersion, equals(minorVersion));
+    expect(info.serverUri, isNull);
+  }
+  {
+    // Start the web server again for the test below.
+    ServiceProtocolInfo info = await Service.controlWebServer(enable: true);
+    majorVersion = info.majorVersion;
+    minorVersion = info.minorVersion;
+    serverUri = info.serverUri;
+    expect(info.majorVersion, equals(majorVersion));
+    expect(info.minorVersion, equals(minorVersion));
+    expect(info.serverUri, equals(serverUri));
+  }
 }
 
 var tests = [
diff --git a/runtime/observatory/tests/service/service.status b/runtime/observatory/tests/service/service.status
index 6810137..8cdaef3 100644
--- a/runtime/observatory/tests/service/service.status
+++ b/runtime/observatory/tests/service/service.status
@@ -41,7 +41,6 @@
 *: Skip # Issue 24651
 
 [ $runtime == vm ]
-coverage_test: Pass, Slow
 developer_extension_test: Pass, Fail # Issue 27225
 
 # Service protocol is not supported in product mode.
diff --git a/runtime/platform/globals.h b/runtime/platform/globals.h
index cd74901..231464c 100644
--- a/runtime/platform/globals.h
+++ b/runtime/platform/globals.h
@@ -128,15 +128,15 @@
 
 #if defined(PRODUCT)
 #define NOT_IN_PRODUCT(code)
-#define DEBUG_ONLY(code)
 #else  // defined(PRODUCT)
 #define NOT_IN_PRODUCT(code) code
+#endif  // defined(PRODUCT)
+
 #if defined(DEBUG)
 #define DEBUG_ONLY(code) code
 #else  // defined(DEBUG)
 #define DEBUG_ONLY(code)
 #endif  // defined(DEBUG)
-#endif  // defined(PRODUCT)
 
 #if defined(DART_PRECOMPILED_RUNTIME) && defined(DART_PRECOMPILER)
 #error DART_PRECOMPILED_RUNTIME and DART_PRECOMPILER are mutually exclusive
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index d58bdef..7ff1030 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -8,6 +8,7 @@
 cc/IsolateReload_PendingConstructorCall_ConcreteToAbstract: Fail, Crash
 cc/IsolateReload_PendingStaticCall_DefinedToNSM: Fail, Crash
 cc/IsolateReload_PendingStaticCall_NSMToDefined: Fail, Crash
+cc/IsolateReload_EnumDelete: Skip # Issue 27802
 
 # These tests are expected to crash on all platforms.
 cc/ArrayNew_Overflow_Crash: Crash, Timeout
@@ -160,9 +161,6 @@
 # This test is meaningless for DBC as allocation stubs are not used.
 cc/RegenerateAllocStubs: Skip
 
-[ ($arch == simdbc || $arch == simdbc64) && $checked ]
-dart/optimized_stacktrace_test: RuntimeError # Issue 27732
-
 [ $hot_reload || $hot_reload_rollback ]
 dart/spawn_shutdown_test: Skip # We can shutdown an isolate before it reloads.
 dart/spawn_infinite_loop_test: Skip # We can shutdown an isolate before it reloads.
diff --git a/runtime/vm/BUILD.gn b/runtime/vm/BUILD.gn
index 7922cf0..e0eab68 100644
--- a/runtime/vm/BUILD.gn
+++ b/runtime/vm/BUILD.gn
@@ -2,7 +2,9 @@
 # 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("../../utils/invoke_dart.gni")
+import("../../build/executable_suffix.gni")
+import("../../build/prebuilt_dart_sdk.gni")
+import("gypi_contents.gni")
 
 config("libdart_vm_config") {
   if (defined(is_fuchsia) && is_fuchsia) {
@@ -31,30 +33,12 @@
   ]
   public_configs = [ ":libdart_vm_config" ]
 
-  platform_headers_gypi =
-      exec_script("../../tools/gypi_to_gn.py",
-                  [ rebase_path("../platform/platform_headers.gypi") ],
-                  "scope",
-                  [ "../platform/platform_headers.gypi" ])
-  platform_headers =
-      rebase_path(platform_headers_gypi.sources, ".", "../platform")
+  sources = rebase_path(processed_gypis.platform_sources, ".", "../platform")
 
-  platform_sources_gypi =
-      exec_script("../../tools/gypi_to_gn.py",
-                  [ rebase_path("../platform/platform_sources.gypi") ],
-                  "scope",
-                  [ "../platform/platform_sources.gypi" ])
-  platform_sources =
-      rebase_path(platform_sources_gypi.sources, ".", "../platform")
-
-  sources = platform_headers + platform_sources
   include_dirs = [ ".." ]
 }
 
-vm_sources_list = exec_script("../../tools/gypi_to_gn.py",
-                              [ rebase_path("vm_sources.gypi") ],
-                              "scope",
-                              [ "vm_sources.gypi" ])
+vm_sources_list = processed_gypis.vm_sources
 
 static_library("libdart_vm") {
   configs += [
@@ -67,7 +51,7 @@
                                   "*_test.cc",
                                   "*_test.h",
                                 ])
-  sources = vm_sources_list.sources
+  sources = vm_sources_list
   include_dirs = [ ".." ]
 }
 
@@ -83,7 +67,7 @@
                                   "*_test.cc",
                                   "*_test.h",
                                 ])
-  sources = vm_sources_list.sources
+  sources = vm_sources_list
   include_dirs = [ ".." ]
 }
 
@@ -98,7 +82,7 @@
                                   "*_test.cc",
                                   "*_test.h",
                                 ])
-  sources = vm_sources_list.sources
+  sources = vm_sources_list
   include_dirs = [ ".." ]
 }
 
@@ -114,7 +98,7 @@
                                   "*_test.cc",
                                   "*_test.h",
                                 ])
-  sources = vm_sources_list.sources
+  sources = vm_sources_list
   include_dirs = [ ".." ]
 }
 
@@ -130,7 +114,7 @@
                                   "*_test.cc",
                                   "*_test.h",
                                 ])
-  sources = vm_sources_list.sources
+  sources = vm_sources_list
   include_dirs = [ ".." ]
 }
 
@@ -146,53 +130,41 @@
                                   "*_test.cc",
                                   "*_test.h",
                                 ])
-  sources = vm_sources_list.sources
+  sources = vm_sources_list
   include_dirs = [ ".." ]
 }
 
 template("process_library_source") {
-  assert(defined(invoker.filename), "Need filename in $target_name")
+  assert(defined(invoker.libsources), "Need libsources in $target_name")
   assert(defined(invoker.output), "Need output in $target_name")
-  assert(defined(invoker.path), "Need path in $target_name")
   action(target_name) {
     visibility = [ ":*" ]  # Only targets in this file can see this.
-    filename = invoker.filename
-    path = invoker.path
-
-    lib_sources_gypi =
-        exec_script("../../tools/gypi_to_gn.py",
-                    [ rebase_path("${path}/${filename}_sources.gypi") ],
-                    "scope",
-                    [ "${path}/${filename}_sources.gypi" ])
-    lib_sources = rebase_path(lib_sources_gypi.sources, ".", path)
+    libsources = invoker.libsources
 
     script = invoker.script
-    inputs = invoker.inputs + [ script ]
-    inputs += lib_sources
+    inputs = invoker.inputs + libsources
     outputs = [
       invoker.output,
     ]
-    args = invoker.args + rebase_path(lib_sources, root_build_dir)
+    args = invoker.args + rebase_path(libsources, root_build_dir)
   }
 }
 
 template("generate_library_source") {
   assert(defined(invoker.libname), "Need libname in $target_name")
-  assert(defined(invoker.filename), "Need a filename in $target_name")
+  assert(defined(invoker.libsources), "Need libsources in $target_name")
   assert(defined(invoker.kind), "Need kind in $target_name")
   assert(defined(invoker.output), "Need output in $target_name")
-  assert(defined(invoker.path), "Need path in $target_name")
 
   process_library_source(target_name) {
     libname = invoker.libname
-    filename = invoker.filename
+    libsources = invoker.libsources
     kind = invoker.kind
-    output = invoker.output
-    path = invoker.path
     script = "../tools/gen_library_src_paths.py"
     inputs = [
       "../lib/libgen_in.cc",
     ]
+    output = invoker.output
     args = [
       "--output",
       rebase_path(invoker.output, root_build_dir),
@@ -208,51 +180,45 @@
   }
 }
 
-# This templates expects invoker.sources to be a list of pairs of strings.
-# The pairs of strings mean the following.
-# library name, file name
-# e.g. for the "internal" library named "dart:_internal",
-# with sources listed at sdk/lib/internal/internal_sources.gypi and
-# lib/internal_sources.gypi, we have: ["_internal", "internal"]
+# This templates expects invoker.sources to be a list of lists.
+# The lists contain the following information about each library:
+#   library name (string)
+#   library sources (list of strings)
+#   library source base path (string)
+#   filename (string)
+#   do_patch (boolean)
+#
+# If do_patch is true, the lists additionally contains
+#   patch sources (list of strings)
+#   patch source base path (string)
 #
 # The template iterates over the list, and generates generate_library_source
 # actions for each. After that, it generates targets to compile the generated
-# sources to make libdart_lib_nosnapshot and libdart_lib.
+# sources to make libdart_lib_*.
 template("generate_core_libraries") {
   assert(defined(invoker.sources), "Need sources in $target_name")
+  assert(defined(invoker.allsources), "Need allsources in $target_name")
   liboutputs = []
-  libsources = []
   libdeps = []
   foreach(lib, invoker.sources) {
     libname = lib[0]
-    filename = lib[1]
-    do_patch = lib[2]
-    source_path = lib[3]
+    filename = lib[3]
+    do_patch = lib[4]
     generate_library_source("generate_${filename}_cc_file") {
       libname = libname
-      filename = filename
+      libsources = rebase_path(lib[1], ".", lib[2])
       kind = "source"
-      path = source_path
       output = "$target_gen_dir/${filename}_gen.cc"
     }
     if (do_patch) {
-      patch_path = lib[4]
       generate_library_source("generate_${filename}_patch_cc_file") {
         libname = libname
-        filename = filename
+        libsources = rebase_path(lib[5], ".", lib[6])
         kind = "patch"
-        path = patch_path
         output = "$target_gen_dir/${filename}_patch_gen.cc"
       }
     }
-    lib_sources_gypi = {
-    }
-    lib_sources_gypi =
-        exec_script("../../tools/gypi_to_gn.py",
-                    [ rebase_path("../lib/${filename}_sources.gypi") ],
-                    "scope",
-                    [ "../lib/${filename}_sources.gypi" ])
-    libsources += rebase_path(lib_sources_gypi.sources, ".", "../lib")
+
     liboutputs += [ "$target_gen_dir/${filename}_gen.cc" ]
     libdeps += [ ":generate_${filename}_cc_file" ]
     if (do_patch) {
@@ -261,6 +227,8 @@
     }
   }
 
+  all_libsources = rebase_path(invoker.allsources, ".", "../lib")
+
   static_library("libdart_lib_nosnapshot") {
     configs += [
       "..:dart_config",
@@ -268,7 +236,7 @@
       "..:dart_maybe_precompiled_runtime_config",
     ]
     deps = libdeps
-    sources = libsources + [ "bootstrap.cc" ] + liboutputs
+    sources = all_libsources + [ "bootstrap.cc" ] + liboutputs
     include_dirs = [ ".." ]
   }
   static_library("libdart_lib_nosnapshot_precompiled_runtime") {
@@ -278,7 +246,7 @@
       "..:dart_precompiled_runtime_config",
     ]
     deps = libdeps
-    sources = libsources + [ "bootstrap.cc" ] + liboutputs
+    sources = all_libsources + [ "bootstrap.cc" ] + liboutputs
     include_dirs = [ ".." ]
   }
   static_library("libdart_lib_nosnapshot_with_precompiler") {
@@ -288,7 +256,7 @@
       "..:dart_precompiler_config",
     ]
     deps = libdeps
-    sources = libsources + [ "bootstrap.cc" ] + liboutputs
+    sources = all_libsources + [ "bootstrap.cc" ] + liboutputs
     include_dirs = [ ".." ]
   }
   static_library("libdart_lib") {
@@ -297,7 +265,7 @@
       "..:dart_maybe_product_config",
       "..:dart_maybe_precompiled_runtime_config",
     ]
-    sources = libsources + [ "bootstrap_nocore.cc" ]
+    sources = all_libsources + [ "bootstrap_nocore.cc" ]
     include_dirs = [ ".." ]
   }
   static_library("libdart_lib_precompiled_runtime") {
@@ -306,7 +274,7 @@
       "..:dart_maybe_product_config",
       "..:dart_precompiled_runtime_config",
     ]
-    sources = libsources + [ "bootstrap_nocore.cc" ]
+    sources = all_libsources + [ "bootstrap_nocore.cc" ]
     include_dirs = [ ".." ]
   }
 }
@@ -315,104 +283,125 @@
   sources = [
     [
       "async",
+      processed_gypis.async_sdk_sources,
+      "../../sdk/lib/async",
       "async",
       true,
-      "../../sdk/lib/async",
+      processed_gypis.async_runtime_sources,
       "../lib",
     ],
     [
       "core",
-      "core",
-      true,
+      processed_gypis.core_sdk_sources,
       "../../sdk/lib/core",
+      "core",
+      true,
+      processed_gypis.core_runtime_sources,
       "../lib",
     ],
     [
       "collection",
-      "collection",
-      true,
+      processed_gypis.collection_sdk_sources,
       "../../sdk/lib/collection",
+      "collection",
+      true,
+      processed_gypis.collection_runtime_sources,
       "../lib",
     ],
     [
       "convert",
-      "convert",
-      true,
+      processed_gypis.convert_sdk_sources,
       "../../sdk/lib/convert",
+      "convert",
+      true,
+      processed_gypis.convert_runtime_sources,
       "../lib",
     ],
     [
       "developer",
+      processed_gypis.developer_sdk_sources,
+      "../../sdk/lib/developer",
       "developer",
       true,
-      "../../sdk/lib/developer",
+      processed_gypis.developer_runtime_sources,
       "../lib",
     ],
     [
       "_internal",
+      processed_gypis.internal_sdk_sources,
+      "../../sdk/lib/internal",
       "internal",
       true,
-      "../../sdk/lib/internal",
+      processed_gypis.internal_runtime_sources,
       "../lib",
     ],
     [
       "isolate",
-      "isolate",
-      true,
+      processed_gypis.isolate_sdk_sources,
       "../../sdk/lib/isolate",
+      "isolate",
+      true,
+      processed_gypis.isolate_runtime_sources,
       "../lib",
     ],
     [
       "math",
-      "math",
-      true,
+      processed_gypis.math_sdk_sources,
       "../../sdk/lib/math",
+      "math",
+      true,
+      processed_gypis.math_runtime_sources,
       "../lib",
     ],
     [
       "mirrors",
+      processed_gypis.mirrors_sdk_sources,
+      "../../sdk/lib/mirrors",
       "mirrors",
       true,
-      "../../sdk/lib/mirrors",
+      processed_gypis.mirrors_runtime_sources,
       "../lib",
     ],
     [
       "profiler",
-      "profiler",
-      false,
+      processed_gypis.profiler_sdk_sources,
       "../../sdk/lib/profiler",
+      "profiler",
+      false,
     ],
     [
       "typed_data",
+      processed_gypis.typed_data_runtime_sources,
+      "../lib",
       "typed_data",
       false,
-      "../lib",
     ],
     [
       "_vmservice",
+      processed_gypis.vmservice_sdk_sources,
+      "../../sdk/lib/vmservice",
       "vmservice",
       true,
-      "../../sdk/lib/vmservice",
+      processed_gypis.vmservice_runtime_sources,
       "../lib",
     ],
   ]
+  allsources = processed_gypis.allsources
 }
 
 template("concatenate_patch") {
-  assert(defined(invoker.libname), "Need a name in $target_name")
-  assert(defined(invoker.dir), "Need a dir in $target_name")
+  assert(defined(invoker.libsources), "Need a sources in $target_name")
   assert(defined(invoker.output), "Need an output in $target_name")
 
   process_library_source(target_name) {
+    libsources = invoker.libsources
+    inputs = []
     output = invoker.output
-    path = "../${invoker.dir}"
-    filename = invoker.libname
     script = "../tools/concatenate_patches.py"
     args = [
       "--output",
       rebase_path(output, root_build_dir),
     ]
-    inputs = []
   }
 }
 
@@ -425,12 +414,11 @@
 
     # Concatenate vm library patches.
     foreach(library, invoker.libraries) {
-      name = library[1]
+      name = library[0]
 
       target_output = "$target_gen_dir/patches/${name}_patch.dart"
       concatenate_patch("concatenate_${name}_patch") {
-        libname = name
-        dir = library[0]
+        libsources = rebase_path(library[1], ".", library[2])
         output = target_output
       }
       concatenation_target_names += [ ":concatenate_${name}_patch" ]
@@ -440,8 +428,10 @@
     # Build the patched sdk out of the concatenated patches and the special
     # libraries.
     action(target_name) {
-      deps = [ "../bin:dart_bootstrap($host_toolchain)" ] +
-             concatenation_target_names
+      deps = concatenation_target_names
+      if (!prebuilt_dart_exe_works) {
+        deps += [ "../bin:dart_bootstrap($host_toolchain)" ]
+      }
 
       patches_dir = "$target_gen_dir/patches"
       patched_sdk_dir = "$root_out_dir/patched_sdk"
@@ -481,14 +471,18 @@
         "${patched_sdk_dir}/lib/core/core.dart",
       ]
 
-      dart_out_dir = get_label_info("../bin:dart_bootstrap($host_toolchain)",
-                                    "root_out_dir")
-      dart_bootstrap =
-          rebase_path("$dart_out_dir/dart_bootstrap$dart_executable_suffix")
-
-      args = [
-        "--dart-executable",
-        dart_bootstrap,
+      args = []
+      if (!prebuilt_dart_exe_works) {
+        dart_out_dir = get_label_info("../bin:dart_bootstrap($host_toolchain)",
+                                      "root_out_dir")
+        dart_bootstrap =
+            rebase_path("$dart_out_dir/dart_bootstrap$executable_suffix")
+        args += [
+          "--dart-executable",
+          dart_bootstrap,
+        ]
+      }
+      args += [
         "vm",
         rebase_path("../../sdk"),
         rebase_path(patches_dir, root_build_dir),
@@ -500,52 +494,64 @@
   generate_patched_sdk("patched_sdk") {
     libraries = [
       [
-        "lib",
         "async",
+        processed_gypis.async_runtime_sources,
+        "../lib",
       ],
       [
-        "lib",
         "collection",
+        processed_gypis.collection_runtime_sources,
+        "../lib",
       ],
       [
-        "lib",
         "convert",
+        processed_gypis.convert_runtime_sources,
+        "../lib",
       ],
       [
-        "lib",
         "core",
+        processed_gypis.core_runtime_sources,
+        "../lib",
       ],
       [
-        "lib",
         "developer",
+        processed_gypis.developer_runtime_sources,
+        "../lib",
       ],
       [
-        "lib",
         "internal",
+        processed_gypis.internal_runtime_sources,
+        "../lib",
       ],
       [
-        "lib",
         "isolate",
+        processed_gypis.isolate_runtime_sources,
+        "../lib",
       ],
       [
-        "lib",
         "math",
+        processed_gypis.math_runtime_sources,
+        "../lib",
       ],
       [
-        "lib",
         "mirrors",
+        processed_gypis.mirrors_runtime_sources,
+        "../lib",
       ],
       [
-        "lib",
         "profiler",
+        processed_gypis.profiler_runtime_sources,
+        "../lib",
       ],
       [
-        "lib",
         "vmservice",
+        processed_gypis.vmservice_runtime_sources,
+        "../lib",
       ],
       [
-        "bin",
         "io",
+        processed_gypis.bin_io_sources,
+        "../bin",
       ],
     ]
   }
diff --git a/runtime/vm/allocation.h b/runtime/vm/allocation.h
index 448176d..16c7075 100644
--- a/runtime/vm/allocation.h
+++ b/runtime/vm/allocation.h
@@ -21,8 +21,8 @@
 // program control flow.
 class ValueObject {
  public:
-  ValueObject() { }
-  ~ValueObject() { }
+  ValueObject() {}
+  ~ValueObject() {}
 
  private:
   DISALLOW_ALLOCATION();
@@ -79,7 +79,7 @@
 // goes out of scope to reclaim memory.
 class ZoneAllocated {
  public:
-  ZoneAllocated() { }
+  ZoneAllocated() {}
 
   // Implicitly allocate the object in the current zone.
   void* operator new(uword size);
@@ -102,7 +102,6 @@
 };
 
 
-
 // Within a NoSafepointScope, the thread must not reach any safepoint. Used
 // around code that manipulates raw object pointers directly without handles.
 #if defined(DEBUG)
@@ -110,13 +109,15 @@
  public:
   NoSafepointScope();
   ~NoSafepointScope();
+
  private:
   DISALLOW_COPY_AND_ASSIGN(NoSafepointScope);
 };
-#else  // defined(DEBUG)
+#else   // defined(DEBUG)
 class NoSafepointScope : public ValueObject {
  public:
   NoSafepointScope() {}
+
  private:
   DISALLOW_COPY_AND_ASSIGN(NoSafepointScope);
 };
diff --git a/runtime/vm/allocation_test.cc b/runtime/vm/allocation_test.cc
index 63b91f6..146f7f6 100644
--- a/runtime/vm/allocation_test.cc
+++ b/runtime/vm/allocation_test.cc
@@ -88,9 +88,8 @@
   TestValueObject stacked(ptr);
   EXPECT_EQ(2, *ptr);
   *ptr = 3;
-  const Error& error =
-      Error::Handle(LanguageError::New(
-          String::Handle(String::New("StackAllocatedLongJump"))));
+  const Error& error = Error::Handle(LanguageError::New(
+      String::Handle(String::New("StackAllocatedLongJump"))));
   jump->Jump(1, error);
   UNREACHABLE();
 }
@@ -135,9 +134,8 @@
   TestStackedStackResource stacked(ptr);
   EXPECT_EQ(4, *ptr);
   *ptr = 5;
-  const Error& error =
-      Error::Handle(LanguageError::New(
-          String::Handle(String::New("StackedStackResourceLongJump"))));
+  const Error& error = Error::Handle(LanguageError::New(
+      String::Handle(String::New("StackedStackResourceLongJump"))));
   jump->Jump(1, error);
   UNREACHABLE();
 }
diff --git a/runtime/vm/aot_optimizer.cc b/runtime/vm/aot_optimizer.cc
index c1d1b8f..168471c 100644
--- a/runtime/vm/aot_optimizer.cc
+++ b/runtime/vm/aot_optimizer.cc
@@ -29,7 +29,9 @@
 
 namespace dart {
 
-DEFINE_FLAG(int, max_exhaustive_polymorphic_checks, 5,
+DEFINE_FLAG(int,
+            max_exhaustive_polymorphic_checks,
+            5,
             "If a call receiver is known to be of at most this many classes, "
             "generate exhaustive class tests instead of a megamorphic call");
 
@@ -68,7 +70,7 @@
   ASSERT(fname.IsSymbol());
   *function = functions_set.GetOrNull(fname);
   ASSERT(functions_set.Release().raw() ==
-      isolate->object_store()->unique_dynamic_targets());
+         isolate->object_store()->unique_dynamic_targets());
 }
 
 
@@ -85,8 +87,8 @@
   ASSERT(!use_speculative_inlining || (inlining_black_list != NULL));
   Function& target_function = Function::Handle();
   if (isolate()->object_store()->unique_dynamic_targets() != Array::null()) {
-    GetUniqueDynamicTarget(
-        isolate(), Symbols::NoSuchMethod(), &target_function);
+    GetUniqueDynamicTarget(isolate(), Symbols::NoSuchMethod(),
+                           &target_function);
     has_unique_no_such_method_ = !target_function.IsNull();
   }
 }
@@ -101,22 +103,20 @@
 void AotOptimizer::PopulateWithICData() {
   ASSERT(current_iterator_ == NULL);
   for (BlockIterator block_it = flow_graph_->reverse_postorder_iterator();
-       !block_it.Done();
-       block_it.Advance()) {
+       !block_it.Done(); block_it.Advance()) {
     ForwardInstructionIterator it(block_it.Current());
     for (; !it.Done(); it.Advance()) {
       Instruction* instr = it.Current();
       if (instr->IsInstanceCall()) {
         InstanceCallInstr* call = instr->AsInstanceCall();
         if (!call->HasICData()) {
-          const Array& arguments_descriptor =
-              Array::Handle(zone(),
-                  ArgumentsDescriptor::New(call->ArgumentCount(),
-                                           call->argument_names()));
-          const ICData& ic_data = ICData::ZoneHandle(zone(), ICData::New(
-              function(), call->function_name(),
-              arguments_descriptor, call->deopt_id(),
-              call->checked_argument_count(), false));
+          const Array& arguments_descriptor = Array::Handle(
+              zone(), ArgumentsDescriptor::New(call->ArgumentCount(),
+                                               call->argument_names()));
+          const ICData& ic_data = ICData::ZoneHandle(
+              zone(), ICData::New(function(), call->function_name(),
+                                  arguments_descriptor, call->deopt_id(),
+                                  call->checked_argument_count(), false));
           call->set_ic_data(&ic_data);
         }
       }
@@ -138,29 +138,23 @@
   // There is only a single function Object.get:runtimeType that can be invoked
   // by this call. Convert dynamic invocation to a static one.
   const Class& cls = Class::Handle(Z, I->object_store()->object_class());
-  const Array& args_desc_array = Array::Handle(Z,
-      ArgumentsDescriptor::New(call->ArgumentCount(),
-                               call->argument_names()));
+  const Array& args_desc_array = Array::Handle(
+      Z,
+      ArgumentsDescriptor::New(call->ArgumentCount(), call->argument_names()));
   ArgumentsDescriptor args_desc(args_desc_array);
-  const Function& function = Function::Handle(Z,
-      Resolver::ResolveDynamicForReceiverClass(
-          cls,
-          call->function_name(),
-          args_desc));
+  const Function& function =
+      Function::Handle(Z, Resolver::ResolveDynamicForReceiverClass(
+                              cls, call->function_name(), args_desc));
   ASSERT(!function.IsNull());
 
   ZoneGrowableArray<PushArgumentInstr*>* args =
-      new (Z) ZoneGrowableArray<PushArgumentInstr*>(
-          call->ArgumentCount());
+      new (Z) ZoneGrowableArray<PushArgumentInstr*>(call->ArgumentCount());
   for (intptr_t i = 0; i < call->ArgumentCount(); i++) {
     args->Add(call->PushArgumentAt(i));
   }
   StaticCallInstr* static_call = new (Z) StaticCallInstr(
-      call->token_pos(),
-      Function::ZoneHandle(Z, function.raw()),
-      call->argument_names(),
-      args,
-      call->deopt_id());
+      call->token_pos(), Function::ZoneHandle(Z, function.raw()),
+      call->argument_names(), args, call->deopt_id());
   static_call->set_result_cid(kTypeCid);
   call->ReplaceWith(static_call, current_iterator());
   return true;
@@ -176,8 +170,7 @@
 void AotOptimizer::ApplyClassIds() {
   ASSERT(current_iterator_ == NULL);
   for (BlockIterator block_it = flow_graph_->reverse_postorder_iterator();
-       !block_it.Done();
-       block_it.Advance()) {
+       !block_it.Done(); block_it.Advance()) {
     ForwardInstructionIterator it(block_it.Current());
     current_iterator_ = &it;
     for (; !it.Done(); it.Advance()) {
@@ -216,12 +209,16 @@
   }
 
   const Token::Kind op_kind = call->token_kind();
-  if (Token::IsRelationalOperator(op_kind) ||
-      Token::IsEqualityOperator(op_kind) ||
-      Token::IsBinaryOperator(op_kind)) {
-    // Guess cid: if one of the inputs is a number assume that the other
-    // is a number of same type.
-    if (FLAG_guess_icdata_cid) {
+  if (FLAG_guess_icdata_cid) {
+    if (Token::IsBinaryBitwiseOperator(op_kind)) {
+      class_ids[0] = kSmiCid;
+      class_ids[1] = kSmiCid;
+    }
+    if (Token::IsRelationalOperator(op_kind) ||
+        Token::IsEqualityOperator(op_kind) ||
+        Token::IsBinaryOperator(op_kind)) {
+      // Guess cid: if one of the inputs is a number assume that the other
+      // is a number of same type.
       const intptr_t cid_0 = class_ids[0];
       const intptr_t cid_1 = class_ids[1];
       if ((cid_0 == kDynamicCid) && (IsNumberCid(cid_1))) {
@@ -242,23 +239,21 @@
   }
 
   if (all_cids_known) {
-    const Class& receiver_class = Class::Handle(Z,
-        isolate()->class_table()->At(class_ids[0]));
+    const Class& receiver_class =
+        Class::Handle(Z, isolate()->class_table()->At(class_ids[0]));
     if (!receiver_class.is_finalized()) {
       // Do not eagerly finalize classes. ResolveDynamicForReceiverClass can
       // cause class finalization, since callee's receiver class may not be
       // finalized yet.
       return false;
     }
-    const Array& args_desc_array = Array::Handle(Z,
-        ArgumentsDescriptor::New(call->ArgumentCount(),
-                                 call->argument_names()));
+    const Array& args_desc_array =
+        Array::Handle(Z, ArgumentsDescriptor::New(call->ArgumentCount(),
+                                                  call->argument_names()));
     ArgumentsDescriptor args_desc(args_desc_array);
-    const Function& function = Function::Handle(Z,
-        Resolver::ResolveDynamicForReceiverClass(
-            receiver_class,
-            call->function_name(),
-            args_desc));
+    const Function& function = Function::Handle(
+        Z, Resolver::ResolveDynamicForReceiverClass(
+               receiver_class, call->function_name(), args_desc));
     if (function.IsNull()) {
       return false;
     }
@@ -267,8 +262,8 @@
     // since it is attached to the assembly instruction itself.
     // TODO(srdjan): Prevent modification of ICData object that is
     // referenced in assembly code.
-    const ICData& ic_data = ICData::ZoneHandle(Z,
-        ICData::NewFrom(*call->ic_data(), class_ids.length()));
+    const ICData& ic_data = ICData::ZoneHandle(
+        Z, ICData::NewFrom(*call->ic_data(), class_ids.length()));
     if (class_ids.length() > 1) {
       ic_data.AddCheck(class_ids, function);
     } else {
@@ -290,8 +285,8 @@
                                                /* error_message = */ NULL)) {
       const Class& cls = Class::Handle(Z, target_function.Owner());
       if (!CHA::IsImplemented(cls) && !CHA::HasSubclasses(cls)) {
-        const ICData& ic_data = ICData::ZoneHandle(Z,
-            ICData::NewFrom(*call->ic_data(), 1));
+        const ICData& ic_data =
+            ICData::ZoneHandle(Z, ICData::NewFrom(*call->ic_data(), 1));
         ic_data.AddReceiverCheck(cls.id(), target_function);
         call->set_ic_data(&ic_data);
         if (has_unique_no_such_method_) {
@@ -319,12 +314,11 @@
   // TODO(fschneider): Try looking up the function on the class if it is
   // not found in the ICData.
   if (!function.IsNull()) {
-    const ICData& new_ic_data = ICData::ZoneHandle(Z, ICData::New(
-        Function::Handle(Z, ic_data.Owner()),
-        String::Handle(Z, ic_data.target_name()),
-        Object::empty_array(),  // Dummy argument descriptor.
-        ic_data.deopt_id(),
-        ic_data.NumArgsTested(), false));
+    const ICData& new_ic_data = ICData::ZoneHandle(
+        Z, ICData::New(Function::Handle(Z, ic_data.Owner()),
+                       String::Handle(Z, ic_data.target_name()),
+                       Object::empty_array(),  // Dummy argument descriptor.
+                       ic_data.deopt_id(), ic_data.NumArgsTested(), false));
     new_ic_data.SetDeoptReasons(ic_data.DeoptReasons());
     new_ic_data.AddReceiverCheck(cid, function);
     return new_ic_data;
@@ -394,19 +388,19 @@
 
 
 static bool HasOnlyOneSmi(const ICData& ic_data) {
-  return (ic_data.NumberOfUsedChecks() == 1)
-      && ic_data.HasReceiverClassId(kSmiCid);
+  return (ic_data.NumberOfUsedChecks() == 1) &&
+         ic_data.HasReceiverClassId(kSmiCid);
 }
 
 
 static bool HasOnlySmiOrMint(const ICData& ic_data) {
   if (ic_data.NumberOfUsedChecks() == 1) {
-    return ic_data.HasReceiverClassId(kSmiCid)
-        || ic_data.HasReceiverClassId(kMintCid);
+    return ic_data.HasReceiverClassId(kSmiCid) ||
+           ic_data.HasReceiverClassId(kMintCid);
   }
-  return (ic_data.NumberOfUsedChecks() == 2)
-      && ic_data.HasReceiverClassId(kSmiCid)
-      && ic_data.HasReceiverClassId(kMintCid);
+  return (ic_data.NumberOfUsedChecks() == 2) &&
+         ic_data.HasReceiverClassId(kSmiCid) &&
+         ic_data.HasReceiverClassId(kMintCid);
 }
 
 
@@ -449,8 +443,8 @@
 
 
 static bool HasOnlyOneDouble(const ICData& ic_data) {
-  return (ic_data.NumberOfUsedChecks() == 1)
-      && ic_data.HasReceiverClassId(kDoubleCid);
+  return (ic_data.NumberOfUsedChecks() == 1) &&
+         ic_data.HasReceiverClassId(kDoubleCid);
 }
 
 
@@ -470,8 +464,7 @@
 }
 
 
-void AotOptimizer::ReplaceCall(Definition* call,
-                               Definition* replacement) {
+void AotOptimizer::ReplaceCall(Definition* call, Definition* replacement) {
   // Remove the original push arguments.
   for (intptr_t i = 0; i < call->ArgumentCount(); ++i) {
     PushArgumentInstr* push = call->PushArgumentAt(i);
@@ -488,11 +481,9 @@
                                Instruction* insert_before) {
   if (to_check->Type()->ToCid() != kSmiCid) {
     InsertBefore(insert_before,
-                 new(Z) CheckSmiInstr(new(Z) Value(to_check),
-                                      deopt_id,
-                                      insert_before->token_pos()),
-                 deopt_environment,
-                 FlowGraph::kEffect);
+                 new (Z) CheckSmiInstr(new (Z) Value(to_check), deopt_id,
+                                       insert_before->token_pos()),
+                 deopt_environment, FlowGraph::kEffect);
   }
 }
 
@@ -503,12 +494,10 @@
                                          TokenPosition token_pos) {
   if ((unary_checks.NumberOfUsedChecks() == 1) &&
       unary_checks.HasReceiverClassId(kSmiCid)) {
-    return new(Z) CheckSmiInstr(new(Z) Value(to_check),
-                                deopt_id,
-                                token_pos);
+    return new (Z) CheckSmiInstr(new (Z) Value(to_check), deopt_id, token_pos);
   }
-  return new(Z) CheckClassInstr(
-      new(Z) Value(to_check), deopt_id, unary_checks, token_pos);
+  return new (Z) CheckClassInstr(new (Z) Value(to_check), deopt_id,
+                                 unary_checks, token_pos);
 }
 
 
@@ -518,8 +507,8 @@
                                  Environment* deopt_environment,
                                  Instruction* insert_before) {
   // Type propagation has not run yet, we cannot eliminate the check.
-  Instruction* check = GetCheckClass(
-      to_check, unary_checks, deopt_id, insert_before->token_pos());
+  Instruction* check = GetCheckClass(to_check, unary_checks, deopt_id,
+                                     insert_before->token_pos());
   InsertBefore(insert_before, check, deopt_environment, FlowGraph::kEffect);
 }
 
@@ -527,9 +516,7 @@
 void AotOptimizer::AddReceiverCheck(InstanceCallInstr* call) {
   AddCheckClass(call->ArgumentAt(0),
                 ICData::ZoneHandle(Z, call->ic_data()->AsUnaryClassChecks()),
-                call->deopt_id(),
-                call->env(),
-                call);
+                call->deopt_id(), call->env(), call);
 }
 
 
@@ -607,12 +594,12 @@
       ASSERT(str.Length() == 1);
       ConstantInstr* char_code_left = flow_graph()->GetConstant(
           Smi::ZoneHandle(Z, Smi::New(static_cast<intptr_t>(str.CharAt(0)))));
-      left_val = new(Z) Value(char_code_left);
+      left_val = new (Z) Value(char_code_left);
     } else if (left->IsOneByteStringFromCharCode()) {
       // Use input of string-from-charcode as left value.
       OneByteStringFromCharCodeInstr* instr =
           left->AsOneByteStringFromCharCode();
-      left_val = new(Z) Value(instr->char_code()->definition());
+      left_val = new (Z) Value(instr->char_code()->definition());
       to_remove_left = instr;
     } else {
       // IsLengthOneString(left) should have been false.
@@ -625,32 +612,24 @@
       // Skip string-from-char-code, and use its input as right value.
       OneByteStringFromCharCodeInstr* right_instr =
           right->AsOneByteStringFromCharCode();
-      right_val = new(Z) Value(right_instr->char_code()->definition());
+      right_val = new (Z) Value(right_instr->char_code()->definition());
       to_remove_right = right_instr;
     } else {
       const ICData& unary_checks_1 =
           ICData::ZoneHandle(Z, call->ic_data()->AsUnaryClassChecksForArgNr(1));
-      AddCheckClass(right,
-                    unary_checks_1,
-                    call->deopt_id(),
-                    call->env(),
-                    call);
+      AddCheckClass(right, unary_checks_1, call->deopt_id(), call->env(), call);
       // String-to-char-code instructions returns -1 (illegal charcode) if
       // string is not of length one.
-      StringToCharCodeInstr* char_code_right =
-          new(Z) StringToCharCodeInstr(new(Z) Value(right), kOneByteStringCid);
+      StringToCharCodeInstr* char_code_right = new (Z)
+          StringToCharCodeInstr(new (Z) Value(right), kOneByteStringCid);
       InsertBefore(call, char_code_right, call->env(), FlowGraph::kValue);
-      right_val = new(Z) Value(char_code_right);
+      right_val = new (Z) Value(char_code_right);
     }
 
     // Comparing char-codes instead of strings.
     EqualityCompareInstr* comp =
-        new(Z) EqualityCompareInstr(call->token_pos(),
-                                    op_kind,
-                                    left_val,
-                                    right_val,
-                                    kSmiCid,
-                                    call->deopt_id());
+        new (Z) EqualityCompareInstr(call->token_pos(), op_kind, left_val,
+                                     right_val, kSmiCid, call->deopt_id());
     ReplaceCall(call, comp);
 
     // Remove dead instructions.
@@ -670,14 +649,15 @@
 }
 
 
-static bool SmiFitsInDouble() { return kSmiBits < 53; }
+static bool SmiFitsInDouble() {
+  return kSmiBits < 53;
+}
 
 
 static bool IsGetRuntimeType(Definition* defn) {
   StaticCallInstr* call = defn->AsStaticCall();
-  return (call != NULL) &&
-      (call->function().recognized_kind() ==
-          MethodRecognizer::kObjectRuntimeType);
+  return (call != NULL) && (call->function().recognized_kind() ==
+                            MethodRecognizer::kObjectRuntimeType);
 }
 
 
@@ -695,26 +675,24 @@
   if (IsGetRuntimeType(left) && left->input_use_list()->IsSingleUse() &&
       IsGetRuntimeType(right) && right->input_use_list()->IsSingleUse()) {
     const Class& cls = Class::Handle(Z, I->object_store()->object_class());
-    const Function& have_same_runtime_type = Function::ZoneHandle(Z,
+    const Function& have_same_runtime_type = Function::ZoneHandle(
+        Z,
         cls.LookupStaticFunctionAllowPrivate(Symbols::HaveSameRuntimeType()));
     ASSERT(!have_same_runtime_type.IsNull());
 
     ZoneGrowableArray<PushArgumentInstr*>* args =
         new (Z) ZoneGrowableArray<PushArgumentInstr*>(2);
-    PushArgumentInstr* arg = new (Z) PushArgumentInstr(
-        new (Z) Value(left->ArgumentAt(0)));
+    PushArgumentInstr* arg =
+        new (Z) PushArgumentInstr(new (Z) Value(left->ArgumentAt(0)));
     InsertBefore(call, arg, NULL, FlowGraph::kEffect);
     args->Add(arg);
-    arg = new (Z) PushArgumentInstr(
-         new (Z) Value(right->ArgumentAt(0)));
+    arg = new (Z) PushArgumentInstr(new (Z) Value(right->ArgumentAt(0)));
     InsertBefore(call, arg, NULL, FlowGraph::kEffect);
     args->Add(arg);
-    StaticCallInstr* static_call = new (Z) StaticCallInstr(
-        call->token_pos(),
-        have_same_runtime_type,
-        Object::null_array(),  // argument_names
-        args,
-        call->deopt_id());
+    StaticCallInstr* static_call =
+        new (Z) StaticCallInstr(call->token_pos(), have_same_runtime_type,
+                                Object::null_array(),  // argument_names
+                                args, call->deopt_id());
     static_call->set_result_cid(kBoolCid);
     ReplaceCall(call, static_call);
     return true;
@@ -738,17 +716,13 @@
     return TryStringLengthOneEquality(call, op_kind);
   } else if (HasOnlyTwoOf(ic_data, kSmiCid)) {
     InsertBefore(call,
-                 new(Z) CheckSmiInstr(new(Z) Value(left),
-                                      call->deopt_id(),
-                                      call->token_pos()),
-                 call->env(),
-                 FlowGraph::kEffect);
+                 new (Z) CheckSmiInstr(new (Z) Value(left), call->deopt_id(),
+                                       call->token_pos()),
+                 call->env(), FlowGraph::kEffect);
     InsertBefore(call,
-                 new(Z) CheckSmiInstr(new(Z) Value(right),
-                                      call->deopt_id(),
-                                      call->token_pos()),
-                 call->env(),
-                 FlowGraph::kEffect);
+                 new (Z) CheckSmiInstr(new (Z) Value(right), call->deopt_id(),
+                                       call->token_pos()),
+                 call->env(), FlowGraph::kEffect);
     cid = kSmiCid;
   } else if (HasTwoMintOrSmi(ic_data) &&
              FlowGraphCompiler::SupportsUnboxedMints()) {
@@ -763,13 +737,10 @@
         // call.
         return false;
       } else {
-        InsertBefore(call,
-                     new(Z) CheckEitherNonSmiInstr(
-                         new(Z) Value(left),
-                         new(Z) Value(right),
-                         call->deopt_id()),
-                     call->env(),
-                     FlowGraph::kEffect);
+        InsertBefore(call, new (Z) CheckEitherNonSmiInstr(new (Z) Value(left),
+                                                          new (Z) Value(right),
+                                                          call->deopt_id()),
+                     call->env(), FlowGraph::kEffect);
         cid = kDoubleCid;
       }
     }
@@ -780,24 +751,15 @@
     GrowableArray<intptr_t> smi_or_null(2);
     smi_or_null.Add(kSmiCid);
     smi_or_null.Add(kNullCid);
-    if (ICDataHasOnlyReceiverArgumentClassIds(ic_data,
-                                              smi_or_null,
+    if (ICDataHasOnlyReceiverArgumentClassIds(ic_data, smi_or_null,
                                               smi_or_null)) {
       const ICData& unary_checks_0 =
           ICData::ZoneHandle(Z, call->ic_data()->AsUnaryClassChecks());
-      AddCheckClass(left,
-                    unary_checks_0,
-                    call->deopt_id(),
-                    call->env(),
-                    call);
+      AddCheckClass(left, unary_checks_0, call->deopt_id(), call->env(), call);
 
       const ICData& unary_checks_1 =
           ICData::ZoneHandle(Z, call->ic_data()->AsUnaryClassChecksForArgNr(1));
-      AddCheckClass(right,
-                    unary_checks_1,
-                    call->deopt_id(),
-                    call->env(),
-                    call);
+      AddCheckClass(right, unary_checks_1, call->deopt_id(), call->env(), call);
       cid = kSmiCid;
     } else {
       // Shortcut for equality with null.
@@ -807,12 +769,10 @@
       ConstantInstr* left_const = left->AsConstant();
       if ((right_const != NULL && right_const->value().IsNull()) ||
           (left_const != NULL && left_const->value().IsNull())) {
-        StrictCompareInstr* comp =
-            new(Z) StrictCompareInstr(call->token_pos(),
-                                      Token::kEQ_STRICT,
-                                      new(Z) Value(left),
-                                      new(Z) Value(right),
-                                      false);  // No number check.
+        StrictCompareInstr* comp = new (Z)
+            StrictCompareInstr(call->token_pos(), Token::kEQ_STRICT,
+                               new (Z) Value(left), new (Z) Value(right),
+                               false);  // No number check.
         ReplaceCall(call, comp);
         return true;
       }
@@ -820,12 +780,9 @@
     }
   }
   ASSERT(cid != kIllegalCid);
-  EqualityCompareInstr* comp = new(Z) EqualityCompareInstr(call->token_pos(),
-                                                           op_kind,
-                                                           new(Z) Value(left),
-                                                           new(Z) Value(right),
-                                                           cid,
-                                                           call->deopt_id());
+  EqualityCompareInstr* comp = new (Z)
+      EqualityCompareInstr(call->token_pos(), op_kind, new (Z) Value(left),
+                           new (Z) Value(right), cid, call->deopt_id());
   ReplaceCall(call, comp);
   return true;
 }
@@ -843,17 +800,13 @@
   intptr_t cid = kIllegalCid;
   if (HasOnlyTwoOf(ic_data, kSmiCid)) {
     InsertBefore(call,
-                 new(Z) CheckSmiInstr(new(Z) Value(left),
-                                      call->deopt_id(),
-                                      call->token_pos()),
-                 call->env(),
-                 FlowGraph::kEffect);
+                 new (Z) CheckSmiInstr(new (Z) Value(left), call->deopt_id(),
+                                       call->token_pos()),
+                 call->env(), FlowGraph::kEffect);
     InsertBefore(call,
-                 new(Z) CheckSmiInstr(new(Z) Value(right),
-                                      call->deopt_id(),
-                                      call->token_pos()),
-                 call->env(),
-                 FlowGraph::kEffect);
+                 new (Z) CheckSmiInstr(new (Z) Value(right), call->deopt_id(),
+                                       call->token_pos()),
+                 call->env(), FlowGraph::kEffect);
     cid = kSmiCid;
   } else if (HasTwoMintOrSmi(ic_data) &&
              FlowGraphCompiler::SupportsUnboxedMints()) {
@@ -868,13 +821,10 @@
         // call.
         return false;
       } else {
-        InsertBefore(call,
-                     new(Z) CheckEitherNonSmiInstr(
-                         new(Z) Value(left),
-                         new(Z) Value(right),
-                         call->deopt_id()),
-                     call->env(),
-                     FlowGraph::kEffect);
+        InsertBefore(call, new (Z) CheckEitherNonSmiInstr(new (Z) Value(left),
+                                                          new (Z) Value(right),
+                                                          call->deopt_id()),
+                     call->env(), FlowGraph::kEffect);
         cid = kDoubleCid;
       }
     }
@@ -882,12 +832,9 @@
     return false;
   }
   ASSERT(cid != kIllegalCid);
-  RelationalOpInstr* comp = new(Z) RelationalOpInstr(call->token_pos(),
-                                                     op_kind,
-                                                     new(Z) Value(left),
-                                                     new(Z) Value(right),
-                                                     cid,
-                                                     call->deopt_id());
+  RelationalOpInstr* comp =
+      new (Z) RelationalOpInstr(call->token_pos(), op_kind, new (Z) Value(left),
+                                new (Z) Value(right), cid, call->deopt_id());
   ReplaceCall(call, comp);
   return true;
 }
@@ -906,8 +853,8 @@
         // Don't generate smi code if the IC data is marked because
         // of an overflow.
         operands_type = ic_data.HasDeoptReason(ICData::kDeoptBinarySmiOp)
-            ? kMintCid
-            : kSmiCid;
+                            ? kMintCid
+                            : kSmiCid;
       } else if (HasTwoMintOrSmi(ic_data) &&
                  FlowGraphCompiler::SupportsUnboxedMints()) {
         // Don't generate mint code if the IC data is marked because of an
@@ -963,11 +910,11 @@
           return false;
         }
         operands_type = ic_data.HasDeoptReason(ICData::kDeoptBinarySmiOp)
-            ? kMintCid
-            : kSmiCid;
+                            ? kMintCid
+                            : kSmiCid;
       } else if (HasTwoMintOrSmi(ic_data) &&
-                 HasOnlyOneSmi(ICData::Handle(Z,
-                     ic_data.AsUnaryClassChecksForArgNr(1)))) {
+                 HasOnlyOneSmi(ICData::Handle(
+                     Z, ic_data.AsUnaryClassChecksForArgNr(1)))) {
         // Don't generate mint code if the IC data is marked because of an
         // overflow.
         if (ic_data.HasDeoptReason(ICData::kDeoptBinaryMintOp)) {
@@ -1006,34 +953,25 @@
     // binary operation with two smis is a smi not a double, except '/' which
     // returns a double for two smis.
     if (op_kind != Token::kDIV) {
-      InsertBefore(call,
-                   new(Z) CheckEitherNonSmiInstr(
-                       new(Z) Value(left),
-                       new(Z) Value(right),
-                       call->deopt_id()),
-                   call->env(),
-                   FlowGraph::kEffect);
+      InsertBefore(call, new (Z) CheckEitherNonSmiInstr(new (Z) Value(left),
+                                                        new (Z) Value(right),
+                                                        call->deopt_id()),
+                   call->env(), FlowGraph::kEffect);
     }
 
-    BinaryDoubleOpInstr* double_bin_op =
-        new(Z) BinaryDoubleOpInstr(op_kind,
-                                   new(Z) Value(left),
-                                   new(Z) Value(right),
-                                   call->deopt_id(), call->token_pos());
+    BinaryDoubleOpInstr* double_bin_op = new (Z)
+        BinaryDoubleOpInstr(op_kind, new (Z) Value(left), new (Z) Value(right),
+                            call->deopt_id(), call->token_pos());
     ReplaceCall(call, double_bin_op);
   } else if (operands_type == kMintCid) {
     if (!FlowGraphCompiler::SupportsUnboxedMints()) return false;
     if ((op_kind == Token::kSHR) || (op_kind == Token::kSHL)) {
-      ShiftMintOpInstr* shift_op =
-          new(Z) ShiftMintOpInstr(
-              op_kind, new(Z) Value(left), new(Z) Value(right),
-              call->deopt_id());
+      ShiftMintOpInstr* shift_op = new (Z) ShiftMintOpInstr(
+          op_kind, new (Z) Value(left), new (Z) Value(right), call->deopt_id());
       ReplaceCall(call, shift_op);
     } else {
-      BinaryMintOpInstr* bin_op =
-          new(Z) BinaryMintOpInstr(
-              op_kind, new(Z) Value(left), new(Z) Value(right),
-              call->deopt_id());
+      BinaryMintOpInstr* bin_op = new (Z) BinaryMintOpInstr(
+          op_kind, new (Z) Value(left), new (Z) Value(right), call->deopt_id());
       ReplaceCall(call, bin_op);
     }
   } else if (operands_type == kFloat32x4Cid) {
@@ -1050,19 +988,14 @@
         // Insert smi check and attach a copy of the original environment
         // because the smi operation can still deoptimize.
         InsertBefore(call,
-                     new(Z) CheckSmiInstr(new(Z) Value(left),
-                                          call->deopt_id(),
-                                          call->token_pos()),
-                     call->env(),
-                     FlowGraph::kEffect);
-        ConstantInstr* constant =
-            flow_graph()->GetConstant(Smi::Handle(Z,
-                Smi::New(Smi::Cast(obj).Value() - 1)));
+                     new (Z) CheckSmiInstr(new (Z) Value(left),
+                                           call->deopt_id(), call->token_pos()),
+                     call->env(), FlowGraph::kEffect);
+        ConstantInstr* constant = flow_graph()->GetConstant(
+            Smi::Handle(Z, Smi::New(Smi::Cast(obj).Value() - 1)));
         BinarySmiOpInstr* bin_op =
-            new(Z) BinarySmiOpInstr(Token::kBIT_AND,
-                                    new(Z) Value(left),
-                                    new(Z) Value(constant),
-                                    call->deopt_id());
+            new (Z) BinarySmiOpInstr(Token::kBIT_AND, new (Z) Value(left),
+                                     new (Z) Value(constant), call->deopt_id());
         ReplaceCall(call, bin_op);
         return true;
       }
@@ -1071,11 +1004,8 @@
     // environment because the smi operation can still deoptimize.
     AddCheckSmi(left, call->deopt_id(), call->env(), call);
     AddCheckSmi(right, call->deopt_id(), call->env(), call);
-    BinarySmiOpInstr* bin_op =
-        new(Z) BinarySmiOpInstr(op_kind,
-                                new(Z) Value(left),
-                                new(Z) Value(right),
-                                call->deopt_id());
+    BinarySmiOpInstr* bin_op = new (Z) BinarySmiOpInstr(
+        op_kind, new (Z) Value(left), new (Z) Value(right), call->deopt_id());
     ReplaceCall(call, bin_op);
   } else {
     ASSERT(operands_type == kSmiCid);
@@ -1090,12 +1020,8 @@
       left = right;
       right = temp;
     }
-    BinarySmiOpInstr* bin_op =
-        new(Z) BinarySmiOpInstr(
-            op_kind,
-            new(Z) Value(left),
-            new(Z) Value(right),
-            call->deopt_id());
+    BinarySmiOpInstr* bin_op = new (Z) BinarySmiOpInstr(
+        op_kind, new (Z) Value(left), new (Z) Value(right), call->deopt_id());
     ReplaceCall(call, bin_op);
   }
   return true;
@@ -1109,24 +1035,21 @@
   Definition* unary_op = NULL;
   if (HasOnlyOneSmi(*call->ic_data())) {
     InsertBefore(call,
-                 new(Z) CheckSmiInstr(new(Z) Value(input),
-                                      call->deopt_id(),
-                                      call->token_pos()),
-                 call->env(),
-                 FlowGraph::kEffect);
-    unary_op = new(Z) UnarySmiOpInstr(
-        op_kind, new(Z) Value(input), call->deopt_id());
+                 new (Z) CheckSmiInstr(new (Z) Value(input), call->deopt_id(),
+                                       call->token_pos()),
+                 call->env(), FlowGraph::kEffect);
+    unary_op = new (Z)
+        UnarySmiOpInstr(op_kind, new (Z) Value(input), call->deopt_id());
   } else if ((op_kind == Token::kBIT_NOT) &&
              HasOnlySmiOrMint(*call->ic_data()) &&
              FlowGraphCompiler::SupportsUnboxedMints()) {
-    unary_op = new(Z) UnaryMintOpInstr(
-        op_kind, new(Z) Value(input), call->deopt_id());
+    unary_op = new (Z)
+        UnaryMintOpInstr(op_kind, new (Z) Value(input), call->deopt_id());
   } else if (HasOnlyOneDouble(*call->ic_data()) &&
-             (op_kind == Token::kNEGATE) &&
-             CanUnboxDouble()) {
+             (op_kind == Token::kNEGATE) && CanUnboxDouble()) {
     AddReceiverCheck(call);
-    unary_op = new(Z) UnaryDoubleOpInstr(
-        Token::kNEGATE, new(Z) Value(input), call->deopt_id());
+    unary_op = new (Z) UnaryDoubleOpInstr(Token::kNEGATE, new (Z) Value(input),
+                                          call->deopt_id());
   } else {
     return false;
   }
@@ -1137,8 +1060,7 @@
 
 
 // Using field class
-RawField* AotOptimizer::GetField(intptr_t class_id,
-                                 const String& field_name) {
+RawField* AotOptimizer::GetField(intptr_t class_id, const String& field_name) {
   Class& cls = Class::Handle(Z, isolate()->class_table()->At(class_id));
   Field& field = Field::Handle(Z);
   while (!cls.IsNull()) {
@@ -1162,19 +1084,16 @@
   // Inline implicit instance getter.
   const String& field_name =
       String::Handle(Z, Field::NameFromGetter(call->function_name()));
-  const Field& field =
-      Field::ZoneHandle(Z, GetField(class_ids[0], field_name));
+  const Field& field = Field::ZoneHandle(Z, GetField(class_ids[0], field_name));
   ASSERT(!field.IsNull());
 
-  if (flow_graph()->InstanceCallNeedsClassCheck(
-          call, RawFunction::kImplicitGetter)) {
+  if (flow_graph()->InstanceCallNeedsClassCheck(call,
+                                                RawFunction::kImplicitGetter)) {
     return false;
   }
-  LoadFieldInstr* load = new(Z) LoadFieldInstr(
-      new(Z) Value(call->ArgumentAt(0)),
-      &field,
-      AbstractType::ZoneHandle(Z, field.type()),
-      call->token_pos());
+  LoadFieldInstr* load = new (Z) LoadFieldInstr(
+      new (Z) Value(call->ArgumentAt(0)), &field,
+      AbstractType::ZoneHandle(Z, field.type()), call->token_pos());
   load->set_is_immutable(field.is_final());
 
   // Discard the environment from the original instruction because the load
@@ -1184,9 +1103,7 @@
 
   if (load->result_cid() != kDynamicCid) {
     // Reset value types if guarded_cid was used.
-    for (Value::Iterator it(load->input_use_list());
-         !it.Done();
-         it.Advance()) {
+    for (Value::Iterator it(load->input_use_list()); !it.Done(); it.Advance()) {
       it.Current()->SetReachingType(NULL);
     }
   }
@@ -1203,24 +1120,16 @@
   Definition* left = call->ArgumentAt(0);
   Definition* right = call->ArgumentAt(1);
   // Type check left.
-  AddCheckClass(left,
-                ICData::ZoneHandle(
-                    Z, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
-                call->deopt_id(),
-                call->env(),
-                call);
+  AddCheckClass(left, ICData::ZoneHandle(
+                          Z, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                call->deopt_id(), call->env(), call);
   // Type check right.
-  AddCheckClass(right,
-                ICData::ZoneHandle(
-                    Z, call->ic_data()->AsUnaryClassChecksForArgNr(1)),
-                call->deopt_id(),
-                call->env(),
-                call);
+  AddCheckClass(right, ICData::ZoneHandle(
+                           Z, call->ic_data()->AsUnaryClassChecksForArgNr(1)),
+                call->deopt_id(), call->env(), call);
   // Replace call.
-  BinaryFloat32x4OpInstr* float32x4_bin_op =
-      new(Z) BinaryFloat32x4OpInstr(
-          op_kind, new(Z) Value(left), new(Z) Value(right),
-          call->deopt_id());
+  BinaryFloat32x4OpInstr* float32x4_bin_op = new (Z) BinaryFloat32x4OpInstr(
+      op_kind, new (Z) Value(left), new (Z) Value(right), call->deopt_id());
   ReplaceCall(call, float32x4_bin_op);
 
   return true;
@@ -1236,24 +1145,16 @@
   Definition* left = call->ArgumentAt(0);
   Definition* right = call->ArgumentAt(1);
   // Type check left.
-  AddCheckClass(left,
-                ICData::ZoneHandle(
-                    Z, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
-                call->deopt_id(),
-                call->env(),
-                call);
+  AddCheckClass(left, ICData::ZoneHandle(
+                          Z, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                call->deopt_id(), call->env(), call);
   // Type check right.
-  AddCheckClass(right,
-                ICData::ZoneHandle(Z,
-                    call->ic_data()->AsUnaryClassChecksForArgNr(1)),
-                call->deopt_id(),
-                call->env(),
-                call);
+  AddCheckClass(right, ICData::ZoneHandle(
+                           Z, call->ic_data()->AsUnaryClassChecksForArgNr(1)),
+                call->deopt_id(), call->env(), call);
   // Replace call.
-  BinaryInt32x4OpInstr* int32x4_bin_op =
-      new(Z) BinaryInt32x4OpInstr(
-          op_kind, new(Z) Value(left), new(Z) Value(right),
-          call->deopt_id());
+  BinaryInt32x4OpInstr* int32x4_bin_op = new (Z) BinaryInt32x4OpInstr(
+      op_kind, new (Z) Value(left), new (Z) Value(right), call->deopt_id());
   ReplaceCall(call, int32x4_bin_op);
   return true;
 }
@@ -1268,24 +1169,16 @@
   Definition* left = call->ArgumentAt(0);
   Definition* right = call->ArgumentAt(1);
   // Type check left.
-  AddCheckClass(left,
-                ICData::ZoneHandle(
-                    call->ic_data()->AsUnaryClassChecksForArgNr(0)),
-                call->deopt_id(),
-                call->env(),
-                call);
+  AddCheckClass(
+      left, ICData::ZoneHandle(call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+      call->deopt_id(), call->env(), call);
   // Type check right.
-  AddCheckClass(right,
-                ICData::ZoneHandle(
-                    call->ic_data()->AsUnaryClassChecksForArgNr(1)),
-                call->deopt_id(),
-                call->env(),
-                call);
+  AddCheckClass(
+      right, ICData::ZoneHandle(call->ic_data()->AsUnaryClassChecksForArgNr(1)),
+      call->deopt_id(), call->env(), call);
   // Replace call.
-  BinaryFloat64x2OpInstr* float64x2_bin_op =
-      new(Z) BinaryFloat64x2OpInstr(
-          op_kind, new(Z) Value(left), new(Z) Value(right),
-          call->deopt_id());
+  BinaryFloat64x2OpInstr* float64x2_bin_op = new (Z) BinaryFloat64x2OpInstr(
+      op_kind, new (Z) Value(left), new (Z) Value(right), call->deopt_id());
   ReplaceCall(call, float64x2_bin_op);
   return true;
 }
@@ -1321,15 +1214,12 @@
     MethodRecognizer::Kind recognized_kind) {
   AddReceiverCheck(call);
   ZoneGrowableArray<Value*>* args =
-      new(Z) ZoneGrowableArray<Value*>(call->ArgumentCount());
+      new (Z) ZoneGrowableArray<Value*>(call->ArgumentCount());
   for (intptr_t i = 0; i < call->ArgumentCount(); i++) {
-    args->Add(new(Z) Value(call->ArgumentAt(i)));
+    args->Add(new (Z) Value(call->ArgumentAt(i)));
   }
-  InvokeMathCFunctionInstr* invoke =
-      new(Z) InvokeMathCFunctionInstr(args,
-                                      call->deopt_id(),
-                                      recognized_kind,
-                                      call->token_pos());
+  InvokeMathCFunctionInstr* invoke = new (Z) InvokeMathCFunctionInstr(
+      args, call->deopt_id(), recognized_kind, call->token_pos());
   ReplaceCall(call, invoke);
 }
 
@@ -1354,15 +1244,14 @@
     if (class_ids[0] == kSmiCid) {
       AddReceiverCheck(call);
       ReplaceCall(call,
-                  new(Z) SmiToDoubleInstr(
-                      new(Z) Value(call->ArgumentAt(0)),
-                      call->token_pos()));
+                  new (Z) SmiToDoubleInstr(new (Z) Value(call->ArgumentAt(0)),
+                                           call->token_pos()));
       return true;
     } else if ((class_ids[0] == kMintCid) && CanConvertUnboxedMintToDouble()) {
       AddReceiverCheck(call);
       ReplaceCall(call,
-                  new(Z) MintToDoubleInstr(new(Z) Value(call->ArgumentAt(0)),
-                                           call->deopt_id()));
+                  new (Z) MintToDoubleInstr(new (Z) Value(call->ArgumentAt(0)),
+                                            call->deopt_id()));
       return true;
     }
   }
@@ -1380,12 +1269,11 @@
         Definition* d2i_instr = NULL;
         if (ic_data.HasDeoptReason(ICData::kDeoptDoubleToSmi)) {
           // Do not repeatedly deoptimize because result didn't fit into Smi.
-          d2i_instr =  new(Z) DoubleToIntegerInstr(
-              new(Z) Value(input), call);
+          d2i_instr = new (Z) DoubleToIntegerInstr(new (Z) Value(input), call);
         } else {
           // Optimistically assume result fits into Smi.
-          d2i_instr = new(Z) DoubleToSmiInstr(
-              new(Z) Value(input), call->deopt_id());
+          d2i_instr =
+              new (Z) DoubleToSmiInstr(new (Z) Value(input), call->deopt_id());
         }
         ReplaceCall(call, d2i_instr);
         return true;
@@ -1402,8 +1290,8 @@
         } else {
           AddReceiverCheck(call);
           DoubleToDoubleInstr* d2d_instr =
-              new(Z) DoubleToDoubleInstr(new(Z) Value(call->ArgumentAt(0)),
-                                         recognized_kind, call->deopt_id());
+              new (Z) DoubleToDoubleInstr(new (Z) Value(call->ArgumentAt(0)),
+                                          recognized_kind, call->deopt_id());
           ReplaceCall(call, d2d_instr);
         }
         return true;
@@ -1444,7 +1332,7 @@
     const TypeArguments& type_arguments =
         TypeArguments::Handle(Z, type.arguments());
     const bool is_raw_type = type_arguments.IsNull() ||
-        type_arguments.IsRaw(from_index, num_type_params);
+                             type_arguments.IsRaw(from_index, num_type_params);
     if (!is_raw_type) {
       // Unknown result.
       return Bool::null();
@@ -1461,13 +1349,9 @@
     if (cls.NumTypeArguments() > 0) {
       return Bool::null();
     }
-    const bool is_subtype = cls.IsSubtypeOf(
-        TypeArguments::Handle(Z),
-        type_class,
-        TypeArguments::Handle(Z),
-        NULL,
-        NULL,
-        Heap::kOld);
+    const bool is_subtype =
+        cls.IsSubtypeOf(TypeArguments::Handle(Z), type_class,
+                        TypeArguments::Handle(Z), NULL, NULL, Heap::kOld);
     results->Add(cls.id());
     results->Add(is_subtype);
     if (prev.IsNull()) {
@@ -1478,7 +1362,7 @@
       }
     }
   }
-  return results_differ ?  Bool::null() : prev.raw();
+  return results_differ ? Bool::null() : prev.raw();
 }
 
 
@@ -1501,7 +1385,8 @@
   if (!type_class.IsPrivate()) {
     if (isolate()->all_classes_finalized()) {
       if (FLAG_trace_cha) {
-        THR_Print("  **(CHA) Typecheck as class equality since no "
+        THR_Print(
+            "  **(CHA) Typecheck as class equality since no "
             "subclasses: %s\n",
             type_class.ToCString());
       }
@@ -1519,7 +1404,7 @@
     const TypeArguments& type_arguments =
         TypeArguments::Handle(type.arguments());
     const bool is_raw_type = type_arguments.IsNull() ||
-        type_arguments.IsRaw(from_index, num_type_params);
+                             type_arguments.IsRaw(from_index, num_type_params);
     return is_raw_type;
   }
   return true;
@@ -1555,12 +1440,9 @@
   if ((*results)[0] != kSmiCid) {
     const Class& cls = Class::Handle(class_table.At(kSmiCid));
     const Class& type_class = Class::Handle(type.type_class());
-    const bool smi_is_subtype = cls.IsSubtypeOf(TypeArguments::Handle(),
-                                                type_class,
-                                                TypeArguments::Handle(),
-                                                NULL,
-                                                NULL,
-                                                Heap::kOld);
+    const bool smi_is_subtype =
+        cls.IsSubtypeOf(TypeArguments::Handle(), type_class,
+                        TypeArguments::Handle(), NULL, NULL, Heap::kOld);
     results->Add((*results)[results->length() - 2]);
     results->Add((*results)[results->length() - 2]);
     for (intptr_t i = results->length() - 3; i > 1; --i) {
@@ -1627,30 +1509,31 @@
       } else {
         UNIMPLEMENTED();
       }
-      negate = Bool::Cast(call->ArgumentAt(1)->OriginalDefinition()
-                          ->AsConstant()->value()).value();
+      negate =
+          Bool::Cast(
+              call->ArgumentAt(1)->OriginalDefinition()->AsConstant()->value())
+              .value();
     }
   } else {
     type_args = call->ArgumentAt(1);
     type = AbstractType::Cast(call->ArgumentAt(2)->AsConstant()->value()).raw();
-    negate = Bool::Cast(call->ArgumentAt(3)->OriginalDefinition()
-        ->AsConstant()->value()).value();
+    negate =
+        Bool::Cast(
+            call->ArgumentAt(3)->OriginalDefinition()->AsConstant()->value())
+            .value();
   }
 
   if (TypeCheckAsClassEquality(type)) {
-    LoadClassIdInstr* left_cid = new(Z) LoadClassIdInstr(new(Z) Value(left));
+    LoadClassIdInstr* left_cid = new (Z) LoadClassIdInstr(new (Z) Value(left));
     InsertBefore(call, left_cid, NULL, FlowGraph::kValue);
     const intptr_t type_cid = Class::Handle(Z, type.type_class()).id();
     ConstantInstr* cid =
         flow_graph()->GetConstant(Smi::Handle(Z, Smi::New(type_cid)));
 
-    StrictCompareInstr* check_cid =
-        new(Z) StrictCompareInstr(
-            call->token_pos(),
-            negate ? Token::kNE_STRICT : Token::kEQ_STRICT,
-            new(Z) Value(left_cid),
-            new(Z) Value(cid),
-            false);  // No number check.
+    StrictCompareInstr* check_cid = new (Z) StrictCompareInstr(
+        call->token_pos(), negate ? Token::kNE_STRICT : Token::kEQ_STRICT,
+        new (Z) Value(left_cid), new (Z) Value(cid),
+        false);  // No number check.
     ReplaceCall(call, check_cid);
     return;
   }
@@ -1662,7 +1545,7 @@
     // left.instanceof(type) =>
     //     _classRangeCheck(left.cid, lower_limit, upper_limit)
 
-    LoadClassIdInstr* left_cid = new(Z) LoadClassIdInstr(new(Z) Value(left));
+    LoadClassIdInstr* left_cid = new (Z) LoadClassIdInstr(new (Z) Value(left));
     InsertBefore(call, left_cid, NULL, FlowGraph::kValue);
     ConstantInstr* lower_cid =
         flow_graph()->GetConstant(Smi::Handle(Z, Smi::New(lower_limit)));
@@ -1670,7 +1553,7 @@
         flow_graph()->GetConstant(Smi::Handle(Z, Smi::New(upper_limit)));
 
     ZoneGrowableArray<PushArgumentInstr*>* args =
-        new(Z) ZoneGrowableArray<PushArgumentInstr*>(3);
+        new (Z) ZoneGrowableArray<PushArgumentInstr*>(3);
     PushArgumentInstr* arg = new (Z) PushArgumentInstr(new (Z) Value(left_cid));
     InsertBefore(call, arg, NULL, FlowGraph::kEffect);
     args->Add(arg);
@@ -1685,17 +1568,15 @@
         Library::Handle(Z, Library::InternalLibrary());
     const String& target_name = negate ? Symbols::_classRangeCheckNegative()
                                        : Symbols::_classRangeCheck();
-    const Function& target = Function::ZoneHandle(Z,
-        dart_internal.LookupFunctionAllowPrivate(target_name));
+    const Function& target = Function::ZoneHandle(
+        Z, dart_internal.LookupFunctionAllowPrivate(target_name));
     ASSERT(!target.IsNull());
     ASSERT(target.IsRecognized() && target.always_inline());
 
-    StaticCallInstr* new_call = new (Z) StaticCallInstr(
-        call->token_pos(),
-        target,
-        Object::null_array(),  // argument_names
-        args,
-        call->deopt_id());
+    StaticCallInstr* new_call =
+        new (Z) StaticCallInstr(call->token_pos(), target,
+                                Object::null_array(),  // argument_names
+                                args, call->deopt_id());
     ReplaceCall(call, new_call);
     return;
   }
@@ -1705,7 +1586,7 @@
   if ((unary_checks.NumberOfChecks() > 0) &&
       (unary_checks.NumberOfChecks() <= FLAG_max_polymorphic_checks)) {
     ZoneGrowableArray<intptr_t>* results =
-        new(Z) ZoneGrowableArray<intptr_t>(unary_checks.NumberOfChecks() * 2);
+        new (Z) ZoneGrowableArray<intptr_t>(unary_checks.NumberOfChecks() * 2);
     InstanceOfAsBool(unary_checks, type, results);
     if (results->length() == unary_checks.NumberOfChecks() * 2) {
       const bool can_deopt = TryExpandTestCidsResult(results, type);
@@ -1713,25 +1594,19 @@
         // Guard against repeated speculative inlining.
         return;
       }
-      TestCidsInstr* test_cids = new(Z) TestCidsInstr(
-          call->token_pos(),
-          negate ? Token::kISNOT : Token::kIS,
-          new(Z) Value(left),
-          *results,
-          can_deopt ? call->deopt_id() : Thread::kNoDeoptId);
+      TestCidsInstr* test_cids = new (Z)
+          TestCidsInstr(call->token_pos(), negate ? Token::kISNOT : Token::kIS,
+                        new (Z) Value(left), *results,
+                        can_deopt ? call->deopt_id() : Thread::kNoDeoptId);
       // Remove type.
       ReplaceCall(call, test_cids);
       return;
     }
   }
 
-  InstanceOfInstr* instance_of =
-      new(Z) InstanceOfInstr(call->token_pos(),
-                             new(Z) Value(left),
-                             new(Z) Value(type_args),
-                             type,
-                             negate,
-                             call->deopt_id());
+  InstanceOfInstr* instance_of = new (Z)
+      InstanceOfInstr(call->token_pos(), new (Z) Value(left),
+                      new (Z) Value(type_args), type, negate, call->deopt_id());
   ReplaceCall(call, instance_of);
 }
 
@@ -1749,9 +1624,9 @@
   if ((unary_checks.NumberOfChecks() > 0) &&
       (unary_checks.NumberOfChecks() <= FLAG_max_polymorphic_checks)) {
     ZoneGrowableArray<intptr_t>* results =
-        new(Z) ZoneGrowableArray<intptr_t>(unary_checks.NumberOfChecks() * 2);
-    const Bool& as_bool = Bool::ZoneHandle(Z,
-        InstanceOfAsBool(unary_checks, type, results));
+        new (Z) ZoneGrowableArray<intptr_t>(unary_checks.NumberOfChecks() * 2);
+    const Bool& as_bool =
+        Bool::ZoneHandle(Z, InstanceOfAsBool(unary_checks, type, results));
     if (as_bool.raw() == Bool::True().raw()) {
       // Guard against repeated speculative inlining.
       if (!IsAllowedForInlining(call->deopt_id())) {
@@ -1771,13 +1646,9 @@
       return;
     }
   }
-  AssertAssignableInstr* assert_as =
-      new(Z) AssertAssignableInstr(call->token_pos(),
-                                   new(Z) Value(left),
-                                   new(Z) Value(type_args),
-                                   type,
-                                   Symbols::InTypeCast(),
-                                   call->deopt_id());
+  AssertAssignableInstr* assert_as = new (Z) AssertAssignableInstr(
+      call->token_pos(), new (Z) Value(left), new (Z) Value(type_args), type,
+      Symbols::InTypeCast(), call->deopt_id());
   ReplaceCall(call, assert_as);
 }
 
@@ -1818,8 +1689,7 @@
 
   const ICData& unary_checks =
       ICData::Handle(Z, call->ic_data()->AsUnaryClassChecks());
-  if ((unary_checks.NumberOfChecks() > 0) &&
-      (op_kind == Token::kSET) &&
+  if ((unary_checks.NumberOfChecks() > 0) && (op_kind == Token::kSET) &&
       TryInlineInstanceSetter(call, unary_checks)) {
     return true;
   }
@@ -1896,8 +1766,7 @@
   if (has_one_target) {
     // Check if the single target is a polymorphic target, if it is,
     // we don't have one target.
-    const Function& target =
-        Function::Handle(Z, unary_checks.GetTargetAt(0));
+    const Function& target = Function::Handle(Z, unary_checks.GetTargetAt(0));
     const bool polymorphic_target = MethodRecognizer::PolymorphicTarget(target);
     has_one_target = !polymorphic_target;
   }
@@ -1905,12 +1774,11 @@
   if (has_one_target) {
     RawFunction::Kind function_kind =
         Function::Handle(Z, unary_checks.GetTargetAt(0)).kind();
-    if (!flow_graph()->InstanceCallNeedsClassCheck(
-            instr, function_kind)) {
+    if (!flow_graph()->InstanceCallNeedsClassCheck(instr, function_kind)) {
       PolymorphicInstanceCallInstr* call =
-          new(Z) PolymorphicInstanceCallInstr(instr, unary_checks,
-                                              /* with_checks = */ false,
-                                              /* complete = */ true);
+          new (Z) PolymorphicInstanceCallInstr(instr, unary_checks,
+                                               /* with_checks = */ false,
+                                               /* complete = */ true);
       instr->ReplaceWith(call, current_iterator());
       return;
     }
@@ -1925,16 +1793,16 @@
           HasLikelySmiOperand(instr)) {
         Definition* left = instr->ArgumentAt(0);
         Definition* right = instr->ArgumentAt(1);
-        CheckedSmiComparisonInstr* smi_op =
-            new(Z) CheckedSmiComparisonInstr(instr->token_kind(),
-                                             new(Z) Value(left),
-                                             new(Z) Value(right),
-                                             instr);
+        CheckedSmiComparisonInstr* smi_op = new (Z)
+            CheckedSmiComparisonInstr(instr->token_kind(), new (Z) Value(left),
+                                      new (Z) Value(right), instr);
         ReplaceCall(instr, smi_op);
         return;
       }
       break;
     }
+    case Token::kSHL:
+    case Token::kSHR:
     case Token::kBIT_OR:
     case Token::kBIT_XOR:
     case Token::kBIT_AND:
@@ -1946,10 +1814,8 @@
         Definition* left = instr->ArgumentAt(0);
         Definition* right = instr->ArgumentAt(1);
         CheckedSmiOpInstr* smi_op =
-            new(Z) CheckedSmiOpInstr(instr->token_kind(),
-                                     new(Z) Value(left),
-                                     new(Z) Value(right),
-                                     instr);
+            new (Z) CheckedSmiOpInstr(instr->token_kind(), new (Z) Value(left),
+                                      new (Z) Value(right), instr);
 
         ReplaceCall(instr, smi_op);
         return;
@@ -1964,31 +1830,26 @@
   const intptr_t receiver_cid =
       instr->PushArgumentAt(0)->value()->Type()->ToCid();
   if (receiver_cid != kDynamicCid) {
-    const Class& receiver_class = Class::Handle(Z,
-        isolate()->class_table()->At(receiver_cid));
+    const Class& receiver_class =
+        Class::Handle(Z, isolate()->class_table()->At(receiver_cid));
 
-    const Array& args_desc_array = Array::Handle(Z,
-        ArgumentsDescriptor::New(instr->ArgumentCount(),
-                                 instr->argument_names()));
+    const Array& args_desc_array =
+        Array::Handle(Z, ArgumentsDescriptor::New(instr->ArgumentCount(),
+                                                  instr->argument_names()));
     ArgumentsDescriptor args_desc(args_desc_array);
-    const Function& function = Function::Handle(Z,
-        Resolver::ResolveDynamicForReceiverClass(
-            receiver_class,
-            instr->function_name(),
-            args_desc));
+    const Function& function = Function::Handle(
+        Z, Resolver::ResolveDynamicForReceiverClass(
+               receiver_class, instr->function_name(), args_desc));
     if (!function.IsNull()) {
       const ICData& ic_data = ICData::Handle(
-          ICData::New(flow_graph_->function(),
-                      instr->function_name(),
-                      args_desc_array,
-                      Thread::kNoDeoptId,
-                      /* args_tested = */ 1,
-                      false));
+          ICData::New(flow_graph_->function(), instr->function_name(),
+                      args_desc_array, Thread::kNoDeoptId,
+                      /* args_tested = */ 1, false));
       ic_data.AddReceiverCheck(receiver_class.id(), function);
       PolymorphicInstanceCallInstr* call =
-          new(Z) PolymorphicInstanceCallInstr(instr, ic_data,
-                                              /* with_checks = */ false,
-                                              /* complete = */ true);
+          new (Z) PolymorphicInstanceCallInstr(instr, ic_data,
+                                               /* with_checks = */ false,
+                                               /* complete = */ true);
       instr->ReplaceWith(call, current_iterator());
       return;
     }
@@ -2011,9 +1872,9 @@
       Function& single_target = Function::Handle(Z);
       ICData& ic_data = ICData::Handle(Z);
 
-      const Array& args_desc_array = Array::Handle(Z,
-          ArgumentsDescriptor::New(instr->ArgumentCount(),
-                                   instr->argument_names()));
+      const Array& args_desc_array =
+          Array::Handle(Z, ArgumentsDescriptor::New(instr->ArgumentCount(),
+                                                    instr->argument_names()));
       ArgumentsDescriptor args_desc(args_desc_array);
 
       Function& target = Function::Handle(Z);
@@ -2022,9 +1883,7 @@
         const intptr_t cid = class_ids[i];
         cls = isolate()->class_table()->At(cid);
         target = Resolver::ResolveDynamicForReceiverClass(
-            cls,
-            instr->function_name(),
-            args_desc);
+            cls, instr->function_name(), args_desc);
 
         if (target.IsNull()) {
           // Can't resolve the target. It might be a noSuchMethod,
@@ -2051,10 +1910,8 @@
 
           // Create an ICData and map all previously seen classes (< i) to
           // the computed single_target.
-          ic_data = ICData::New(function,
-                                instr->function_name(),
-                                args_desc_array,
-                                Thread::kNoDeoptId,
+          ic_data = ICData::New(function, instr->function_name(),
+                                args_desc_array, Thread::kNoDeoptId,
                                 /* args_tested = */ 1, false);
           for (intptr_t j = 0; j < i; j++) {
             ic_data.AddReceiverCheck(class_ids[j], single_target);
@@ -2074,12 +1931,9 @@
         if ((op_kind == Token::kGET) || (op_kind == Token::kSET)) {
           // Create fake IC data with the resolved target.
           const ICData& ic_data = ICData::Handle(
-              ICData::New(flow_graph_->function(),
-                          instr->function_name(),
-                          args_desc_array,
-                          Thread::kNoDeoptId,
-                          /* args_tested = */ 1,
-                          false));
+              ICData::New(flow_graph_->function(), instr->function_name(),
+                          args_desc_array, Thread::kNoDeoptId,
+                          /* args_tested = */ 1, false));
           cls = single_target.Owner();
           ic_data.AddReceiverCheck(cls.id(), single_target);
           instr->set_ic_data(&ic_data);
@@ -2091,26 +1945,22 @@
 
         // We have computed that there is only a single target for this call
         // within the whole hierarchy. Replace InstanceCall with StaticCall.
-        ZoneGrowableArray<PushArgumentInstr*>* args =
-            new (Z) ZoneGrowableArray<PushArgumentInstr*>(
-                instr->ArgumentCount());
+        ZoneGrowableArray<PushArgumentInstr*>* args = new (Z)
+            ZoneGrowableArray<PushArgumentInstr*>(instr->ArgumentCount());
         for (intptr_t i = 0; i < instr->ArgumentCount(); i++) {
           args->Add(instr->PushArgumentAt(i));
         }
         StaticCallInstr* call = new (Z) StaticCallInstr(
-            instr->token_pos(),
-            Function::ZoneHandle(Z, single_target.raw()),
-            instr->argument_names(),
-            args,
-            instr->deopt_id());
+            instr->token_pos(), Function::ZoneHandle(Z, single_target.raw()),
+            instr->argument_names(), args, instr->deopt_id());
         instr->ReplaceWith(call, current_iterator());
         return;
       } else if ((ic_data.raw() != ICData::null()) &&
                  (ic_data.NumberOfChecks() > 0)) {
         PolymorphicInstanceCallInstr* call =
-            new(Z) PolymorphicInstanceCallInstr(instr, ic_data,
-                                                /* with_checks = */ true,
-                                                /* complete = */ true);
+            new (Z) PolymorphicInstanceCallInstr(instr, ic_data,
+                                                 /* with_checks = */ true,
+                                                 /* complete = */ true);
         instr->ReplaceWith(call, current_iterator());
         return;
       }
@@ -2124,9 +1974,9 @@
     // OK to use checks with PolymorphicInstanceCallInstr since no
     // deoptimization is allowed.
     PolymorphicInstanceCallInstr* call =
-        new(Z) PolymorphicInstanceCallInstr(instr, unary_checks,
-                                            /* with_checks = */ true,
-                                            /* complete = */ false);
+        new (Z) PolymorphicInstanceCallInstr(instr, unary_checks,
+                                             /* with_checks = */ true,
+                                             /* complete = */ false);
     instr->ReplaceWith(call, current_iterator());
     return;
   }
@@ -2139,18 +1989,17 @@
     const intptr_t receiver_cid =
         call->PushArgumentAt(0)->value()->Type()->ToCid();
     if (receiver_cid != kDynamicCid) {
-      const Class& receiver_class = Class::Handle(Z,
-          isolate()->class_table()->At(receiver_cid));
+      const Class& receiver_class =
+          Class::Handle(Z, isolate()->class_table()->At(receiver_cid));
 
-      const Array& args_desc_array = Array::Handle(Z,
-          ArgumentsDescriptor::New(call->ArgumentCount(),
-                                   call->instance_call()->argument_names()));
+      const Array& args_desc_array = Array::Handle(
+          Z, ArgumentsDescriptor::New(call->ArgumentCount(),
+                                      call->instance_call()->argument_names()));
       ArgumentsDescriptor args_desc(args_desc_array);
-      const Function& function = Function::Handle(Z,
-          Resolver::ResolveDynamicForReceiverClass(
-              receiver_class,
-              call->instance_call()->function_name(),
-              args_desc));
+      const Function& function = Function::Handle(
+          Z, Resolver::ResolveDynamicForReceiverClass(
+                 receiver_class, call->instance_call()->function_name(),
+                 args_desc));
       if (!function.IsNull()) {
         call->set_with_checks(false);
       }
@@ -2195,37 +2044,27 @@
     case MethodRecognizer::kMathMax: {
       // We can handle only monomorphic min/max call sites with both arguments
       // being either doubles or smis.
-      if (CanUnboxDouble() &&
-          call->HasICData() &&
+      if (CanUnboxDouble() && call->HasICData() &&
           (call->ic_data()->NumberOfChecks() == 1)) {
         const ICData& ic_data = *call->ic_data();
         intptr_t result_cid = kIllegalCid;
-        if (ICDataHasReceiverArgumentClassIds(ic_data,
-                                              kDoubleCid, kDoubleCid)) {
+        if (ICDataHasReceiverArgumentClassIds(ic_data, kDoubleCid,
+                                              kDoubleCid)) {
           result_cid = kDoubleCid;
-        } else if (ICDataHasReceiverArgumentClassIds(ic_data,
-                                                     kSmiCid, kSmiCid)) {
+        } else if (ICDataHasReceiverArgumentClassIds(ic_data, kSmiCid,
+                                                     kSmiCid)) {
           result_cid = kSmiCid;
         }
         if (result_cid != kIllegalCid) {
-          MathMinMaxInstr* min_max = new(Z) MathMinMaxInstr(
-              recognized_kind,
-              new(Z) Value(call->ArgumentAt(0)),
-              new(Z) Value(call->ArgumentAt(1)),
-              call->deopt_id(),
-              result_cid);
+          MathMinMaxInstr* min_max = new (Z) MathMinMaxInstr(
+              recognized_kind, new (Z) Value(call->ArgumentAt(0)),
+              new (Z) Value(call->ArgumentAt(1)), call->deopt_id(), result_cid);
           const ICData& unary_checks =
               ICData::ZoneHandle(Z, ic_data.AsUnaryClassChecks());
-          AddCheckClass(min_max->left()->definition(),
-                        unary_checks,
-                        call->deopt_id(),
-                        call->env(),
-                        call);
-          AddCheckClass(min_max->right()->definition(),
-                        unary_checks,
-                        call->deopt_id(),
-                        call->env(),
-                        call);
+          AddCheckClass(min_max->left()->definition(), unary_checks,
+                        call->deopt_id(), call->env(), call);
+          AddCheckClass(min_max->right()->definition(), unary_checks,
+                        call->deopt_id(), call->env(), call);
           ReplaceCall(call, min_max);
         }
       }
@@ -2238,15 +2077,13 @@
           if (ArgIsAlways(kSmiCid, ic_data, 1)) {
             Definition* arg = call->ArgumentAt(1);
             AddCheckSmi(arg, call->deopt_id(), call->env(), call);
-            ReplaceCall(call,
-                        new(Z) SmiToDoubleInstr(new(Z) Value(arg),
-                                                call->token_pos()));
+            ReplaceCall(call, new (Z) SmiToDoubleInstr(new (Z) Value(arg),
+                                                       call->token_pos()));
           } else if (ArgIsAlways(kMintCid, ic_data, 1) &&
                      CanConvertUnboxedMintToDouble()) {
             Definition* arg = call->ArgumentAt(1);
-            ReplaceCall(call,
-                        new(Z) MintToDoubleInstr(new(Z) Value(arg),
-                                                 call->deopt_id()));
+            ReplaceCall(call, new (Z) MintToDoubleInstr(new (Z) Value(arg),
+                                                        call->deopt_id()));
           }
         }
       }
@@ -2259,10 +2096,9 @@
 
 
 void AotOptimizer::VisitLoadCodeUnits(LoadCodeUnitsInstr* instr) {
-  // TODO(zerny): Use kUnboxedUint32 once it is fully supported/optimized.
+// TODO(zerny): Use kUnboxedUint32 once it is fully supported/optimized.
 #if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_ARM)
-  if (!instr->can_pack_into_smi())
-    instr->set_representation(kUnboxedMint);
+  if (!instr->can_pack_into_smi()) instr->set_representation(kUnboxedMint);
 #endif
 }
 
@@ -2270,7 +2106,7 @@
 bool AotOptimizer::TryInlineInstanceSetter(InstanceCallInstr* instr,
                                            const ICData& unary_ic_data) {
   ASSERT((unary_ic_data.NumberOfChecks() > 0) &&
-      (unary_ic_data.NumArgsTested() == 1));
+         (unary_ic_data.NumArgsTested() == 1));
   if (I->type_checks()) {
     // Checked mode setters are inlined like normal methods by conventional
     // inlining.
@@ -2297,22 +2133,19 @@
   // Inline implicit instance setter.
   const String& field_name =
       String::Handle(Z, Field::NameFromSetter(instr->function_name()));
-  const Field& field =
-      Field::ZoneHandle(Z, GetField(class_id, field_name));
+  const Field& field = Field::ZoneHandle(Z, GetField(class_id, field_name));
   ASSERT(!field.IsNull());
 
-  if (flow_graph()->InstanceCallNeedsClassCheck(
-          instr, RawFunction::kImplicitSetter)) {
+  if (flow_graph()->InstanceCallNeedsClassCheck(instr,
+                                                RawFunction::kImplicitSetter)) {
     return false;
   }
 
   // Field guard was detached.
-  StoreInstanceFieldInstr* store = new(Z) StoreInstanceFieldInstr(
-      field,
-      new(Z) Value(instr->ArgumentAt(0)),
-      new(Z) Value(instr->ArgumentAt(1)),
-      kEmitStoreBarrier,
-      instr->token_pos());
+  StoreInstanceFieldInstr* store = new (Z)
+      StoreInstanceFieldInstr(field, new (Z) Value(instr->ArgumentAt(0)),
+                              new (Z) Value(instr->ArgumentAt(1)),
+                              kEmitStoreBarrier, instr->token_pos());
 
   // No unboxed stores in precompiled code.
   ASSERT(!store->IsUnboxedStore());
@@ -2327,19 +2160,17 @@
 
 void AotOptimizer::ReplaceArrayBoundChecks() {
   for (BlockIterator block_it = flow_graph_->reverse_postorder_iterator();
-       !block_it.Done();
-       block_it.Advance()) {
+       !block_it.Done(); block_it.Advance()) {
     ForwardInstructionIterator it(block_it.Current());
     current_iterator_ = &it;
     for (; !it.Done(); it.Advance()) {
       CheckArrayBoundInstr* check = it.Current()->AsCheckArrayBound();
       if (check != NULL) {
-        GenericCheckBoundInstr* new_check = new(Z) GenericCheckBoundInstr(
-            new(Z) Value(check->length()->definition()),
-            new(Z) Value(check->index()->definition()),
-            check->deopt_id());
-        flow_graph_->InsertBefore(check, new_check,
-                                  check->env(), FlowGraph::kEffect);
+        GenericCheckBoundInstr* new_check = new (Z) GenericCheckBoundInstr(
+            new (Z) Value(check->length()->definition()),
+            new (Z) Value(check->index()->definition()), check->deopt_id());
+        flow_graph_->InsertBefore(check, new_check, check->env(),
+                                  FlowGraph::kEffect);
         current_iterator()->RemoveCurrentFromGraph();
       }
     }
diff --git a/runtime/vm/aot_optimizer.h b/runtime/vm/aot_optimizer.h
index 01a81ca2..16e879e 100644
--- a/runtime/vm/aot_optimizer.h
+++ b/runtime/vm/aot_optimizer.h
@@ -11,7 +11,8 @@
 namespace dart {
 
 class CSEInstructionMap;
-template <typename T> class GrowableArray;
+template <typename T>
+class GrowableArray;
 class ParsedFunction;
 class Precompiler;
 class RawBool;
@@ -110,12 +111,9 @@
   bool InstanceCallNeedsClassCheck(InstanceCallInstr* call,
                                    RawFunction::Kind kind) const;
 
-  bool InlineFloat32x4BinaryOp(InstanceCallInstr* call,
-                               Token::Kind op_kind);
-  bool InlineInt32x4BinaryOp(InstanceCallInstr* call,
-                              Token::Kind op_kind);
-  bool InlineFloat64x2BinaryOp(InstanceCallInstr* call,
-                               Token::Kind op_kind);
+  bool InlineFloat32x4BinaryOp(InstanceCallInstr* call, Token::Kind op_kind);
+  bool InlineInt32x4BinaryOp(InstanceCallInstr* call, Token::Kind op_kind);
+  bool InlineFloat64x2BinaryOp(InstanceCallInstr* call, Token::Kind op_kind);
   bool InlineImplicitInstanceGetter(InstanceCallInstr* call);
 
   RawBool* InstanceOfAsBool(const ICData& ic_data,
diff --git a/runtime/vm/assembler.cc b/runtime/vm/assembler.cc
index 8bb29ca..4edcedd 100644
--- a/runtime/vm/assembler.cc
+++ b/runtime/vm/assembler.cc
@@ -13,13 +13,19 @@
 
 namespace dart {
 
-DEFINE_FLAG(bool, check_code_pointer, false,
+DEFINE_FLAG(bool,
+            check_code_pointer,
+            false,
             "Verify instructions offset in code object."
             "NOTE: This breaks the profiler.");
-DEFINE_FLAG(bool, code_comments, false,
+DEFINE_FLAG(bool,
+            code_comments,
+            false,
             "Include comments into code and disassembly");
 #if defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_MIPS)
-DEFINE_FLAG(bool, use_far_branches, false,
+DEFINE_FLAG(bool,
+            use_far_branches,
+            false,
             "Enable far branches for ARM and MIPS");
 #endif
 
@@ -82,8 +88,7 @@
 }
 
 
-AssemblerBuffer::~AssemblerBuffer() {
-}
+AssemblerBuffer::~AssemblerBuffer() {}
 
 
 void AssemblerBuffer::ProcessFixups(const MemoryRegion& region) {
@@ -120,8 +125,7 @@
   // Allocate the new data area and copy contents of the old one to it.
   uword new_contents = NewContents(new_capacity);
   memmove(reinterpret_cast<void*>(new_contents),
-          reinterpret_cast<void*>(contents_),
-          old_size);
+          reinterpret_cast<void*>(contents_), old_size);
 
   // Compute the relocation delta and switch to the new contents area.
   intptr_t delta = new_contents - contents_;
@@ -141,8 +145,7 @@
  public:
   PatchCodeWithHandle(ZoneGrowableArray<intptr_t>* pointer_offsets,
                       const Object& object)
-      : pointer_offsets_(pointer_offsets), object_(object) {
-  }
+      : pointer_offsets_(pointer_offsets), object_(object) {}
 
   void Process(const MemoryRegion& region, intptr_t position) {
     // Patch the handle into the code. Once the instructions are installed into
@@ -218,9 +221,9 @@
     OS::VSNPrint(buffer, sizeof(buffer), format, args);
     va_end(args);
 
-    comments_.Add(new CodeComment(buffer_.GetPosition(),
-                                  String::ZoneHandle(String::New(buffer,
-                                                                 Heap::kOld))));
+    comments_.Add(
+        new CodeComment(buffer_.GetPosition(),
+                        String::ZoneHandle(String::New(buffer, Heap::kOld))));
   }
 }
 
@@ -304,9 +307,9 @@
 
 intptr_t ObjectPoolWrapper::FindNativeEntry(const ExternalLabel* label,
                                             Patchability patchable) {
-  return FindObject(ObjectPoolWrapperEntry(label->address(),
-                                           ObjectPool::kNativeEntry),
-                    patchable);
+  return FindObject(
+      ObjectPoolWrapperEntry(label->address(), ObjectPool::kNativeEntry),
+      patchable);
 }
 
 
diff --git a/runtime/vm/assembler.h b/runtime/vm/assembler.h
index f722d09..87d3a1e 100644
--- a/runtime/vm/assembler.h
+++ b/runtime/vm/assembler.h
@@ -14,8 +14,7 @@
 
 namespace dart {
 
-#if defined(TARGET_ARCH_ARM) ||                                                \
-    defined(TARGET_ARCH_ARM64) ||                                              \
+#if defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_ARM64) ||                  \
     defined(TARGET_ARCH_MIPS)
 DECLARE_FLAG(bool, use_far_branches);
 #endif
@@ -78,29 +77,31 @@
   ~AssemblerBuffer();
 
   // Basic support for emitting, loading, and storing.
-  template<typename T> void Emit(T value) {
+  template <typename T>
+  void Emit(T value) {
     ASSERT(HasEnsuredCapacity());
     *reinterpret_cast<T*>(cursor_) = value;
     cursor_ += sizeof(T);
   }
 
-  template<typename T> void Remit() {
+  template <typename T>
+  void Remit() {
     ASSERT(Size() >= static_cast<intptr_t>(sizeof(T)));
     cursor_ -= sizeof(T);
   }
 
   // Return address to code at |position| bytes.
-  uword Address(intptr_t position) {
-    return contents_ + position;
-  }
+  uword Address(intptr_t position) { return contents_ + position; }
 
-  template<typename T> T Load(intptr_t position) {
+  template <typename T>
+  T Load(intptr_t position) {
     ASSERT(position >= 0 &&
            position <= (Size() - static_cast<intptr_t>(sizeof(T))));
     return *reinterpret_cast<T*>(contents_ + position);
   }
 
-  template<typename T> void Store(intptr_t position, T value) {
+  template <typename T>
+  void Store(intptr_t position, T value) {
     ASSERT(position >= 0 &&
            position <= (Size() - static_cast<intptr_t>(sizeof(T))));
     *reinterpret_cast<T*>(contents_ + position) = value;
@@ -135,13 +136,13 @@
   // and apply all fixups.
   void FinalizeInstructions(const MemoryRegion& region);
 
-  // To emit an instruction to the assembler buffer, the EnsureCapacity helper
-  // must be used to guarantee that the underlying data area is big enough to
-  // hold the emitted instruction. Usage:
-  //
-  //     AssemblerBuffer buffer;
-  //     AssemblerBuffer::EnsureCapacity ensured(&buffer);
-  //     ... emit bytes for single instruction ...
+// To emit an instruction to the assembler buffer, the EnsureCapacity helper
+// must be used to guarantee that the underlying data area is big enough to
+// hold the emitted instruction. Usage:
+//
+//     AssemblerBuffer buffer;
+//     AssemblerBuffer::EnsureCapacity ensured(&buffer);
+//     ... emit bytes for single instruction ...
 
 #if defined(DEBUG)
   class EnsureCapacity : public ValueObject {
@@ -215,14 +216,13 @@
 
 
 struct ObjectPoolWrapperEntry {
-  ObjectPoolWrapperEntry()
-    : raw_value_(), type_(), equivalence_() { }
+  ObjectPoolWrapperEntry() : raw_value_(), type_(), equivalence_() {}
   explicit ObjectPoolWrapperEntry(const Object* obj)
-    : obj_(obj), type_(ObjectPool::kTaggedObject), equivalence_(obj) { }
+      : obj_(obj), type_(ObjectPool::kTaggedObject), equivalence_(obj) {}
   explicit ObjectPoolWrapperEntry(const Object* obj, const Object* eqv)
-    : obj_(obj), type_(ObjectPool::kTaggedObject), equivalence_(eqv) { }
+      : obj_(obj), type_(ObjectPool::kTaggedObject), equivalence_(eqv) {}
   ObjectPoolWrapperEntry(uword value, ObjectPool::EntryType info)
-    : raw_value_(value), type_(info), equivalence_() { }
+      : raw_value_(value), type_(info), equivalence_() {}
 
   union {
     const Object* obj_;
@@ -243,8 +243,9 @@
 
   static const intptr_t kNoIndex = -1;
 
-  ObjIndexPair() : key_(static_cast<uword>(NULL), ObjectPool::kTaggedObject),
-                   value_(kNoIndex) { }
+  ObjIndexPair()
+      : key_(static_cast<uword>(NULL), ObjectPool::kTaggedObject),
+        value_(kNoIndex) {}
 
   ObjIndexPair(Key key, Value value) : value_(value) {
     key_.type_ = key.type_;
@@ -298,17 +299,14 @@
 
 class ObjectPoolWrapper : public ValueObject {
  public:
-  intptr_t AddObject(const Object& obj,
-                     Patchability patchable = kNotPatchable);
+  intptr_t AddObject(const Object& obj, Patchability patchable = kNotPatchable);
   intptr_t AddImmediate(uword imm);
 
   intptr_t FindObject(const Object& obj,
                       Patchability patchable = kNotPatchable);
-  intptr_t FindObject(const Object& obj,
-                      const Object& equivalence);
+  intptr_t FindObject(const Object& obj, const Object& equivalence);
   intptr_t FindImmediate(uword imm);
-  intptr_t FindNativeEntry(const ExternalLabel* label,
-                           Patchability patchable);
+  intptr_t FindNativeEntry(const ExternalLabel* label, Patchability patchable);
 
   RawObjectPool* MakeObjectPool();
 
@@ -324,10 +322,7 @@
 };
 
 
-enum RestorePP {
-  kRestoreCallerPP,
-  kKeepCalleePP
-};
+enum RestorePP { kRestoreCallerPP, kKeepCalleePP };
 
 }  // namespace dart
 
diff --git a/runtime/vm/assembler_arm.cc b/runtime/vm/assembler_arm.cc
index 89977e4..3618bce 100644
--- a/runtime/vm/assembler_arm.cc
+++ b/runtime/vm/assembler_arm.cc
@@ -14,7 +14,7 @@
 #include "vm/stub_code.h"
 
 // An extra check since we are assuming the existence of /proc/cpuinfo below.
-#if !defined(USING_SIMULATOR) && !defined(__linux__) && !defined(ANDROID) && \
+#if !defined(USING_SIMULATOR) && !defined(__linux__) && !defined(ANDROID) &&   \
     !TARGET_OS_IOS
 #error ARM cross-compile only supported on Linux
 #endif
@@ -28,8 +28,8 @@
   if (kind_ == Immediate) {
     uint32_t offset = encoding_ & kOffset12Mask;
     ASSERT(offset < 256);
-    return (encoding_ & ~kOffset12Mask) | B22 |
-           ((offset & 0xf0) << 4) | (offset & 0xf);
+    return (encoding_ & ~kOffset12Mask) | B22 | ((offset & 0xf0) << 4) |
+           (offset & 0xf);
   }
   ASSERT(kind_ == IndexRegister);
   return encoding_;
@@ -39,9 +39,9 @@
 uint32_t Address::vencoding() const {
   ASSERT(kind_ == Immediate);
   uint32_t offset = encoding_ & kOffset12Mask;
-  ASSERT(offset < (1 << 10));  // In the range 0 to +1020.
+  ASSERT(offset < (1 << 10));           // In the range 0 to +1020.
   ASSERT(Utils::IsAligned(offset, 4));  // Multiple of 4.
-  int mode = encoding_ & ((8|4|1) << 21);
+  int mode = encoding_ & ((8 | 4 | 1) << 21);
   ASSERT((mode == Offset) || (mode == NegOffset));
   uint32_t vencoding = (encoding_ & (0xf << kRnShift)) | (offset >> 2);
   if (mode == Offset) {
@@ -80,10 +80,8 @@
   int32_t encoding = static_cast<int32_t>(cond) << kConditionShift |
                      type << kTypeShift |
                      static_cast<int32_t>(opcode) << kOpcodeShift |
-                     set_cc << kSShift |
-                     static_cast<int32_t>(rn) << kRnShift |
-                     static_cast<int32_t>(rd) << kRdShift |
-                     o.encoding();
+                     set_cc << kSShift | static_cast<int32_t>(rn) << kRnShift |
+                     static_cast<int32_t>(rd) << kRdShift | o.encoding();
   Emit(encoding);
 }
 
@@ -91,8 +89,7 @@
 void Assembler::EmitType5(Condition cond, int32_t offset, bool link) {
   ASSERT(cond != kNoCondition);
   int32_t encoding = static_cast<int32_t>(cond) << kConditionShift |
-                     5 << kTypeShift |
-                     (link ? 1 : 0) << kLinkShift;
+                     5 << kTypeShift | (link ? 1 : 0) << kLinkShift;
   Emit(Assembler::EncodeBranchOffset(offset, encoding));
 }
 
@@ -106,12 +103,10 @@
   ASSERT(cond != kNoCondition);
   ASSERT(!ad.has_writeback() || (ad.rn() != rd));  // Unpredictable.
 
-  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) |
-                     B26 | (ad.kind() == Address::Immediate ? 0 : B25) |
-                     (load ? L : 0) |
-                     (byte ? B : 0) |
-                     (static_cast<int32_t>(rd) << kRdShift) |
-                     ad.encoding();
+  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) | B26 |
+                     (ad.kind() == Address::Immediate ? 0 : B25) |
+                     (load ? L : 0) | (byte ? B : 0) |
+                     (static_cast<int32_t>(rd) << kRdShift) | ad.encoding();
   Emit(encoding);
 }
 
@@ -122,10 +117,8 @@
                                       Address ad) {
   ASSERT(rd != kNoRegister);
   ASSERT(cond != kNoCondition);
-  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) |
-                     mode |
-                     (static_cast<int32_t>(rd) << kRdShift) |
-                     ad.encoding3();
+  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) | mode |
+                     (static_cast<int32_t>(rd) << kRdShift) | ad.encoding3();
   Emit(encoding);
 }
 
@@ -137,12 +130,9 @@
                                RegList regs) {
   ASSERT(base != kNoRegister);
   ASSERT(cond != kNoCondition);
-  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) |
-                     B27 |
-                     am |
-                     (load ? L : 0) |
-                     (static_cast<int32_t>(base) << kRnShift) |
-                     regs;
+  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) | B27 |
+                     am | (load ? L : 0) |
+                     (static_cast<int32_t>(base) << kRnShift) | regs;
   Emit(encoding);
 }
 
@@ -154,12 +144,11 @@
                                    Operand o) {
   ASSERT(cond != kNoCondition);
   ASSERT(o.type() == 1);
-  int32_t encoding = static_cast<int32_t>(cond) << kConditionShift |
-                     static_cast<int32_t>(MOV) << kOpcodeShift |
-                     static_cast<int32_t>(rd) << kRdShift |
-                     o.encoding() << kShiftImmShift |
-                     static_cast<int32_t>(opcode) << kShiftShift |
-                     static_cast<int32_t>(rm);
+  int32_t encoding =
+      static_cast<int32_t>(cond) << kConditionShift |
+      static_cast<int32_t>(MOV) << kOpcodeShift |
+      static_cast<int32_t>(rd) << kRdShift | o.encoding() << kShiftImmShift |
+      static_cast<int32_t>(opcode) << kShiftShift | static_cast<int32_t>(rm);
   Emit(encoding);
 }
 
@@ -175,8 +164,7 @@
                      static_cast<int32_t>(MOV) << kOpcodeShift |
                      static_cast<int32_t>(rd) << kRdShift |
                      o.encoding() << kShiftRegisterShift |
-                     static_cast<int32_t>(opcode) << kShiftShift |
-                     B4 |
+                     static_cast<int32_t>(opcode) << kShiftShift | B4 |
                      static_cast<int32_t>(rm);
   Emit(encoding);
 }
@@ -311,18 +299,18 @@
   ASSERT(cond != kNoCondition);
   ASSERT(rd != PC);
   ASSERT(rm != PC);
-  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) |
-                     B24 | B22 | B21 | (0xf << 16) |
-                     (static_cast<int32_t>(rd) << kRdShift) |
-                     (0xf << 8) | B4 | static_cast<int32_t>(rm);
+  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) | B24 |
+                     B22 | B21 | (0xf << 16) |
+                     (static_cast<int32_t>(rd) << kRdShift) | (0xf << 8) | B4 |
+                     static_cast<int32_t>(rm);
   Emit(encoding);
 }
 
 
 void Assembler::movw(Register rd, uint16_t imm16, Condition cond) {
   ASSERT(cond != kNoCondition);
-  int32_t encoding = static_cast<int32_t>(cond) << kConditionShift |
-                     B25 | B24 | ((imm16 >> 12) << 16) |
+  int32_t encoding = static_cast<int32_t>(cond) << kConditionShift | B25 | B24 |
+                     ((imm16 >> 12) << 16) |
                      static_cast<int32_t>(rd) << kRdShift | (imm16 & 0xfff);
   Emit(encoding);
 }
@@ -330,28 +318,29 @@
 
 void Assembler::movt(Register rd, uint16_t imm16, Condition cond) {
   ASSERT(cond != kNoCondition);
-  int32_t encoding = static_cast<int32_t>(cond) << kConditionShift |
-                     B25 | B24 | B22 | ((imm16 >> 12) << 16) |
+  int32_t encoding = static_cast<int32_t>(cond) << kConditionShift | B25 | B24 |
+                     B22 | ((imm16 >> 12) << 16) |
                      static_cast<int32_t>(rd) << kRdShift | (imm16 & 0xfff);
   Emit(encoding);
 }
 
 
-void Assembler::EmitMulOp(Condition cond, int32_t opcode,
-                          Register rd, Register rn,
-                          Register rm, Register rs) {
+void Assembler::EmitMulOp(Condition cond,
+                          int32_t opcode,
+                          Register rd,
+                          Register rn,
+                          Register rm,
+                          Register rs) {
   ASSERT(rd != kNoRegister);
   ASSERT(rn != kNoRegister);
   ASSERT(rm != kNoRegister);
   ASSERT(rs != kNoRegister);
   ASSERT(cond != kNoCondition);
-  int32_t encoding = opcode |
-      (static_cast<int32_t>(cond) << kConditionShift) |
-      (static_cast<int32_t>(rn) << kRnShift) |
-      (static_cast<int32_t>(rd) << kRdShift) |
-      (static_cast<int32_t>(rs) << kRsShift) |
-      B7 | B4 |
-      (static_cast<int32_t>(rm) << kRmShift);
+  int32_t encoding = opcode | (static_cast<int32_t>(cond) << kConditionShift) |
+                     (static_cast<int32_t>(rn) << kRnShift) |
+                     (static_cast<int32_t>(rd) << kRdShift) |
+                     (static_cast<int32_t>(rs) << kRsShift) | B7 | B4 |
+                     (static_cast<int32_t>(rm) << kRmShift);
   Emit(encoding);
 }
 
@@ -368,16 +357,22 @@
 }
 
 
-void Assembler::mla(Register rd, Register rn,
-                    Register rm, Register ra, Condition cond) {
+void Assembler::mla(Register rd,
+                    Register rn,
+                    Register rm,
+                    Register ra,
+                    Condition cond) {
   // rd <- ra + rn * rm.
   // Assembler registers rd, rn, rm, ra are encoded as rn, rm, rs, rd.
   EmitMulOp(cond, B21, ra, rd, rn, rm);
 }
 
 
-void Assembler::mls(Register rd, Register rn,
-                    Register rm, Register ra, Condition cond) {
+void Assembler::mls(Register rd,
+                    Register rn,
+                    Register rm,
+                    Register ra,
+                    Condition cond) {
   // rd <- ra - rn * rm.
   if (TargetCPUFeatures::arm_version() == ARMv7) {
     // Assembler registers rd, rn, rm, ra are encoded as rn, rm, rs, rd.
@@ -389,29 +384,40 @@
 }
 
 
-void Assembler::smull(Register rd_lo, Register rd_hi,
-                      Register rn, Register rm, Condition cond) {
+void Assembler::smull(Register rd_lo,
+                      Register rd_hi,
+                      Register rn,
+                      Register rm,
+                      Condition cond) {
   // Assembler registers rd_lo, rd_hi, rn, rm are encoded as rd, rn, rm, rs.
   EmitMulOp(cond, B23 | B22, rd_lo, rd_hi, rn, rm);
 }
 
 
-void Assembler::umull(Register rd_lo, Register rd_hi,
-                      Register rn, Register rm, Condition cond) {
+void Assembler::umull(Register rd_lo,
+                      Register rd_hi,
+                      Register rn,
+                      Register rm,
+                      Condition cond) {
   // Assembler registers rd_lo, rd_hi, rn, rm are encoded as rd, rn, rm, rs.
   EmitMulOp(cond, B23, rd_lo, rd_hi, rn, rm);
 }
 
 
-void Assembler::umlal(Register rd_lo, Register rd_hi,
-                      Register rn, Register rm, Condition cond) {
+void Assembler::umlal(Register rd_lo,
+                      Register rd_hi,
+                      Register rn,
+                      Register rm,
+                      Condition cond) {
   // Assembler registers rd_lo, rd_hi, rn, rm are encoded as rd, rn, rm, rs.
   EmitMulOp(cond, B23 | B21, rd_lo, rd_hi, rn, rm);
 }
 
 
-void Assembler::umaal(Register rd_lo, Register rd_hi,
-                      Register rn, Register rm) {
+void Assembler::umaal(Register rd_lo,
+                      Register rd_hi,
+                      Register rn,
+                      Register rm) {
   ASSERT(rd_lo != IP);
   ASSERT(rd_hi != IP);
   ASSERT(rn != IP);
@@ -428,19 +434,20 @@
 }
 
 
-void Assembler::EmitDivOp(Condition cond, int32_t opcode,
-                          Register rd, Register rn, Register rm) {
+void Assembler::EmitDivOp(Condition cond,
+                          int32_t opcode,
+                          Register rd,
+                          Register rn,
+                          Register rm) {
   ASSERT(TargetCPUFeatures::integer_division_supported());
   ASSERT(rd != kNoRegister);
   ASSERT(rn != kNoRegister);
   ASSERT(rm != kNoRegister);
   ASSERT(cond != kNoCondition);
-  int32_t encoding = opcode |
-    (static_cast<int32_t>(cond) << kConditionShift) |
-    (static_cast<int32_t>(rn) << kDivRnShift) |
-    (static_cast<int32_t>(rd) << kDivRdShift) |
-    B26 | B25 | B24 | B20 | B4 |
-    (static_cast<int32_t>(rm) << kDivRmShift);
+  int32_t encoding = opcode | (static_cast<int32_t>(cond) << kConditionShift) |
+                     (static_cast<int32_t>(rn) << kDivRnShift) |
+                     (static_cast<int32_t>(rd) << kDivRdShift) | B26 | B25 |
+                     B24 | B20 | B4 | (static_cast<int32_t>(rm) << kDivRmShift);
   Emit(encoding);
 }
 
@@ -451,7 +458,7 @@
 
 
 void Assembler::udiv(Register rd, Register rn, Register rm, Condition cond) {
-  EmitDivOp(cond, B21 , rd, rn, rm);
+  EmitDivOp(cond, B21, rd, rn, rm);
 }
 
 
@@ -495,7 +502,10 @@
 }
 
 
-void Assembler::ldrd(Register rd, Register rd2, Register rn, int32_t offset,
+void Assembler::ldrd(Register rd,
+                     Register rd2,
+                     Register rn,
+                     int32_t offset,
                      Condition cond) {
   ASSERT((rd % 2) == 0);
   ASSERT(rd2 == rd + 1);
@@ -508,7 +518,10 @@
 }
 
 
-void Assembler::strd(Register rd, Register rd2, Register rn, int32_t offset,
+void Assembler::strd(Register rd,
+                     Register rd2,
+                     Register rn,
+                     int32_t offset,
                      Condition cond) {
   ASSERT((rd % 2) == 0);
   ASSERT(rd2 == rd + 1);
@@ -521,14 +534,18 @@
 }
 
 
-void Assembler::ldm(BlockAddressMode am, Register base, RegList regs,
+void Assembler::ldm(BlockAddressMode am,
+                    Register base,
+                    RegList regs,
                     Condition cond) {
   ASSERT(regs != 0);
   EmitMultiMemOp(cond, am, true, base, regs);
 }
 
 
-void Assembler::stm(BlockAddressMode am, Register base, RegList regs,
+void Assembler::stm(BlockAddressMode am,
+                    Register base,
+                    RegList regs,
                     Condition cond) {
   ASSERT(regs != 0);
   EmitMultiMemOp(cond, am, false, base, regs);
@@ -540,13 +557,10 @@
   ASSERT(rn != kNoRegister);
   ASSERT(rt != kNoRegister);
   ASSERT(cond != kNoCondition);
-  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) |
-                     B24 |
-                     B23 |
-                     L   |
-                     (static_cast<int32_t>(rn) << kLdExRnShift) |
-                     (static_cast<int32_t>(rt) << kLdExRtShift) |
-                     B11 | B10 | B9 | B8 | B7 | B4 | B3 | B2 | B1 | B0;
+  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) | B24 |
+                     B23 | L | (static_cast<int32_t>(rn) << kLdExRnShift) |
+                     (static_cast<int32_t>(rt) << kLdExRtShift) | B11 | B10 |
+                     B9 | B8 | B7 | B4 | B3 | B2 | B1 | B0;
   Emit(encoding);
 }
 
@@ -557,12 +571,10 @@
   ASSERT(rd != kNoRegister);
   ASSERT(rt != kNoRegister);
   ASSERT(cond != kNoCondition);
-  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) |
-                     B24 |
-                     B23 |
-                     (static_cast<int32_t>(rn) << kStrExRnShift) |
-                     (static_cast<int32_t>(rd) << kStrExRdShift) |
-                     B11 | B10 | B9 | B8 | B7 | B4 |
+  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) | B24 |
+                     B23 | (static_cast<int32_t>(rn) << kStrExRnShift) |
+                     (static_cast<int32_t>(rd) << kStrExRdShift) | B11 | B10 |
+                     B9 | B8 | B7 | B4 |
                      (static_cast<int32_t>(rt) << kStrExRtShift);
   Emit(encoding);
 }
@@ -570,16 +582,16 @@
 
 void Assembler::clrex() {
   ASSERT(TargetCPUFeatures::arm_version() != ARMv5TE);
-  int32_t encoding = (kSpecialCondition << kConditionShift) |
-                     B26 | B24 | B22 | B21 | B20 | (0xff << 12) | B4 | 0xf;
+  int32_t encoding = (kSpecialCondition << kConditionShift) | B26 | B24 | B22 |
+                     B21 | B20 | (0xff << 12) | B4 | 0xf;
   Emit(encoding);
 }
 
 
 void Assembler::nop(Condition cond) {
   ASSERT(cond != kNoCondition);
-  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) |
-                     B25 | B24 | B21 | (0xf << 12);
+  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) | B25 |
+                     B24 | B21 | (0xf << 12);
   Emit(encoding);
 }
 
@@ -591,11 +603,10 @@
   ASSERT(rt != SP);
   ASSERT(rt != PC);
   ASSERT(cond != kNoCondition);
-  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) |
-                     B27 | B26 | B25 |
-                     ((static_cast<int32_t>(sn) >> 1)*B16) |
-                     (static_cast<int32_t>(rt)*B12) | B11 | B9 |
-                     ((static_cast<int32_t>(sn) & 1)*B7) | B4;
+  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) | B27 |
+                     B26 | B25 | ((static_cast<int32_t>(sn) >> 1) * B16) |
+                     (static_cast<int32_t>(rt) * B12) | B11 | B9 |
+                     ((static_cast<int32_t>(sn) & 1) * B7) | B4;
   Emit(encoding);
 }
 
@@ -607,16 +618,17 @@
   ASSERT(rt != SP);
   ASSERT(rt != PC);
   ASSERT(cond != kNoCondition);
-  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) |
-                     B27 | B26 | B25 | B20 |
-                     ((static_cast<int32_t>(sn) >> 1)*B16) |
-                     (static_cast<int32_t>(rt)*B12) | B11 | B9 |
-                     ((static_cast<int32_t>(sn) & 1)*B7) | B4;
+  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) | B27 |
+                     B26 | B25 | B20 | ((static_cast<int32_t>(sn) >> 1) * B16) |
+                     (static_cast<int32_t>(rt) * B12) | B11 | B9 |
+                     ((static_cast<int32_t>(sn) & 1) * B7) | B4;
   Emit(encoding);
 }
 
 
-void Assembler::vmovsrr(SRegister sm, Register rt, Register rt2,
+void Assembler::vmovsrr(SRegister sm,
+                        Register rt,
+                        Register rt2,
                         Condition cond) {
   ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(sm != kNoSRegister);
@@ -628,17 +640,18 @@
   ASSERT(rt2 != SP);
   ASSERT(rt2 != PC);
   ASSERT(cond != kNoCondition);
-  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) |
-                     B27 | B26 | B22 |
-                     (static_cast<int32_t>(rt2)*B16) |
-                     (static_cast<int32_t>(rt)*B12) | B11 | B9 |
-                     ((static_cast<int32_t>(sm) & 1)*B5) | B4 |
+  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) | B27 |
+                     B26 | B22 | (static_cast<int32_t>(rt2) * B16) |
+                     (static_cast<int32_t>(rt) * B12) | B11 | B9 |
+                     ((static_cast<int32_t>(sm) & 1) * B5) | B4 |
                      (static_cast<int32_t>(sm) >> 1);
   Emit(encoding);
 }
 
 
-void Assembler::vmovrrs(Register rt, Register rt2, SRegister sm,
+void Assembler::vmovrrs(Register rt,
+                        Register rt2,
+                        SRegister sm,
                         Condition cond) {
   ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(sm != kNoSRegister);
@@ -651,11 +664,10 @@
   ASSERT(rt2 != PC);
   ASSERT(rt != rt2);
   ASSERT(cond != kNoCondition);
-  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) |
-                     B27 | B26 | B22 | B20 |
-                     (static_cast<int32_t>(rt2)*B16) |
-                     (static_cast<int32_t>(rt)*B12) | B11 | B9 |
-                     ((static_cast<int32_t>(sm) & 1)*B5) | B4 |
+  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) | B27 |
+                     B26 | B22 | B20 | (static_cast<int32_t>(rt2) * B16) |
+                     (static_cast<int32_t>(rt) * B12) | B11 | B9 |
+                     ((static_cast<int32_t>(sm) & 1) * B5) | B4 |
                      (static_cast<int32_t>(sm) >> 1);
   Emit(encoding);
 }
@@ -669,17 +681,17 @@
   ASSERT(rt != PC);
   ASSERT(dn != kNoDRegister);
   ASSERT(cond != kNoCondition);
-  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) |
-                     B27 | B26 | B25 |
-                     (i*B21) |
-                     (static_cast<int32_t>(rt)*B12) | B11 | B9 | B8 |
-                     ((static_cast<int32_t>(dn) >> 4)*B7) |
-                     ((static_cast<int32_t>(dn) & 0xf)*B16) | B4;
+  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) | B27 |
+                     B26 | B25 | (i * B21) | (static_cast<int32_t>(rt) * B12) |
+                     B11 | B9 | B8 | ((static_cast<int32_t>(dn) >> 4) * B7) |
+                     ((static_cast<int32_t>(dn) & 0xf) * B16) | B4;
   Emit(encoding);
 }
 
 
-void Assembler::vmovdrr(DRegister dm, Register rt, Register rt2,
+void Assembler::vmovdrr(DRegister dm,
+                        Register rt,
+                        Register rt2,
                         Condition cond) {
   ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(dm != kNoDRegister);
@@ -690,17 +702,18 @@
   ASSERT(rt2 != SP);
   ASSERT(rt2 != PC);
   ASSERT(cond != kNoCondition);
-  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) |
-                     B27 | B26 | B22 |
-                     (static_cast<int32_t>(rt2)*B16) |
-                     (static_cast<int32_t>(rt)*B12) | B11 | B9 | B8 |
-                     ((static_cast<int32_t>(dm) >> 4)*B5) | B4 |
+  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) | B27 |
+                     B26 | B22 | (static_cast<int32_t>(rt2) * B16) |
+                     (static_cast<int32_t>(rt) * B12) | B11 | B9 | B8 |
+                     ((static_cast<int32_t>(dm) >> 4) * B5) | B4 |
                      (static_cast<int32_t>(dm) & 0xf);
   Emit(encoding);
 }
 
 
-void Assembler::vmovrrd(Register rt, Register rt2, DRegister dm,
+void Assembler::vmovrrd(Register rt,
+                        Register rt2,
+                        DRegister dm,
                         Condition cond) {
   ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(dm != kNoDRegister);
@@ -712,11 +725,10 @@
   ASSERT(rt2 != PC);
   ASSERT(rt != rt2);
   ASSERT(cond != kNoCondition);
-  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) |
-                     B27 | B26 | B22 | B20 |
-                     (static_cast<int32_t>(rt2)*B16) |
-                     (static_cast<int32_t>(rt)*B12) | B11 | B9 | B8 |
-                     ((static_cast<int32_t>(dm) >> 4)*B5) | B4 |
+  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) | B27 |
+                     B26 | B22 | B20 | (static_cast<int32_t>(rt2) * B16) |
+                     (static_cast<int32_t>(rt) * B12) | B11 | B9 | B8 |
+                     ((static_cast<int32_t>(dm) >> 4) * B5) | B4 |
                      (static_cast<int32_t>(dm) & 0xf);
   Emit(encoding);
 }
@@ -726,11 +738,10 @@
   ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(sd != kNoSRegister);
   ASSERT(cond != kNoCondition);
-  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) |
-                     B27 | B26 | B24 | B20 |
-                     ((static_cast<int32_t>(sd) & 1)*B22) |
-                     ((static_cast<int32_t>(sd) >> 1)*B12) |
-                     B11 | B9 | ad.vencoding();
+  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) | B27 |
+                     B26 | B24 | B20 | ((static_cast<int32_t>(sd) & 1) * B22) |
+                     ((static_cast<int32_t>(sd) >> 1) * B12) | B11 | B9 |
+                     ad.vencoding();
   Emit(encoding);
 }
 
@@ -740,11 +751,10 @@
   ASSERT(static_cast<Register>(ad.encoding_ & (0xf << kRnShift)) != PC);
   ASSERT(sd != kNoSRegister);
   ASSERT(cond != kNoCondition);
-  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) |
-                     B27 | B26 | B24 |
-                     ((static_cast<int32_t>(sd) & 1)*B22) |
-                     ((static_cast<int32_t>(sd) >> 1)*B12) |
-                     B11 | B9 | ad.vencoding();
+  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) | B27 |
+                     B26 | B24 | ((static_cast<int32_t>(sd) & 1) * B22) |
+                     ((static_cast<int32_t>(sd) >> 1) * B12) | B11 | B9 |
+                     ad.vencoding();
   Emit(encoding);
 }
 
@@ -753,11 +763,10 @@
   ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(dd != kNoDRegister);
   ASSERT(cond != kNoCondition);
-  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) |
-                     B27 | B26 | B24 | B20 |
-                     ((static_cast<int32_t>(dd) >> 4)*B22) |
-                     ((static_cast<int32_t>(dd) & 0xf)*B12) |
-                     B11 | B9 | B8 | ad.vencoding();
+  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) | B27 |
+                     B26 | B24 | B20 | ((static_cast<int32_t>(dd) >> 4) * B22) |
+                     ((static_cast<int32_t>(dd) & 0xf) * B12) | B11 | B9 | B8 |
+                     ad.vencoding();
   Emit(encoding);
 }
 
@@ -767,44 +776,40 @@
   ASSERT(static_cast<Register>(ad.encoding_ & (0xf << kRnShift)) != PC);
   ASSERT(dd != kNoDRegister);
   ASSERT(cond != kNoCondition);
-  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) |
-                     B27 | B26 | B24 |
-                     ((static_cast<int32_t>(dd) >> 4)*B22) |
-                     ((static_cast<int32_t>(dd) & 0xf)*B12) |
-                     B11 | B9 | B8 | ad.vencoding();
+  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) | B27 |
+                     B26 | B24 | ((static_cast<int32_t>(dd) >> 4) * B22) |
+                     ((static_cast<int32_t>(dd) & 0xf) * B12) | B11 | B9 | B8 |
+                     ad.vencoding();
   Emit(encoding);
 }
 
 void Assembler::EmitMultiVSMemOp(Condition cond,
-                                BlockAddressMode am,
-                                bool load,
-                                Register base,
-                                SRegister start,
-                                uint32_t count) {
+                                 BlockAddressMode am,
+                                 bool load,
+                                 Register base,
+                                 SRegister start,
+                                 uint32_t count) {
   ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(base != kNoRegister);
   ASSERT(cond != kNoCondition);
   ASSERT(start != kNoSRegister);
   ASSERT(static_cast<int32_t>(start) + count <= kNumberOfSRegisters);
 
-  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) |
-                     B27 | B26 | B11 | B9 |
-                     am |
-                     (load ? L : 0) |
+  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) | B27 |
+                     B26 | B11 | B9 | am | (load ? L : 0) |
                      (static_cast<int32_t>(base) << kRnShift) |
                      ((static_cast<int32_t>(start) & 0x1) ? D : 0) |
-                     ((static_cast<int32_t>(start) >> 1) << 12) |
-                     count;
+                     ((static_cast<int32_t>(start) >> 1) << 12) | count;
   Emit(encoding);
 }
 
 
 void Assembler::EmitMultiVDMemOp(Condition cond,
-                                BlockAddressMode am,
-                                bool load,
-                                Register base,
-                                DRegister start,
-                                int32_t count) {
+                                 BlockAddressMode am,
+                                 bool load,
+                                 Register base,
+                                 DRegister start,
+                                 int32_t count) {
   ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(base != kNoRegister);
   ASSERT(cond != kNoCondition);
@@ -812,36 +817,42 @@
   ASSERT(static_cast<int32_t>(start) + count <= kNumberOfDRegisters);
   const int armv5te = TargetCPUFeatures::arm_version() == ARMv5TE ? 1 : 0;
 
-  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) |
-                     B27 | B26 | B11 | B9 | B8 |
-                     am |
-                     (load ? L : 0) |
-                     (static_cast<int32_t>(base) << kRnShift) |
-                     ((static_cast<int32_t>(start) & 0x10) ? D : 0) |
-                     ((static_cast<int32_t>(start) & 0xf) << 12) |
-                     (count << 1) | armv5te;
+  int32_t encoding =
+      (static_cast<int32_t>(cond) << kConditionShift) | B27 | B26 | B11 | B9 |
+      B8 | am | (load ? L : 0) | (static_cast<int32_t>(base) << kRnShift) |
+      ((static_cast<int32_t>(start) & 0x10) ? D : 0) |
+      ((static_cast<int32_t>(start) & 0xf) << 12) | (count << 1) | armv5te;
   Emit(encoding);
 }
 
 
-void Assembler::vldms(BlockAddressMode am, Register base,
-                      SRegister first, SRegister last, Condition cond) {
+void Assembler::vldms(BlockAddressMode am,
+                      Register base,
+                      SRegister first,
+                      SRegister last,
+                      Condition cond) {
   ASSERT((am == IA) || (am == IA_W) || (am == DB_W));
   ASSERT(last > first);
   EmitMultiVSMemOp(cond, am, true, base, first, last - first + 1);
 }
 
 
-void Assembler::vstms(BlockAddressMode am, Register base,
-                      SRegister first, SRegister last, Condition cond) {
+void Assembler::vstms(BlockAddressMode am,
+                      Register base,
+                      SRegister first,
+                      SRegister last,
+                      Condition cond) {
   ASSERT((am == IA) || (am == IA_W) || (am == DB_W));
   ASSERT(last > first);
   EmitMultiVSMemOp(cond, am, false, base, first, last - first + 1);
 }
 
 
-void Assembler::vldmd(BlockAddressMode am, Register base,
-                      DRegister first, intptr_t count, Condition cond) {
+void Assembler::vldmd(BlockAddressMode am,
+                      Register base,
+                      DRegister first,
+                      intptr_t count,
+                      Condition cond) {
   ASSERT((am == IA) || (am == IA_W) || (am == DB_W));
   ASSERT(count <= 16);
   ASSERT(first + count <= kNumberOfDRegisters);
@@ -849,8 +860,11 @@
 }
 
 
-void Assembler::vstmd(BlockAddressMode am, Register base,
-                      DRegister first, intptr_t count, Condition cond) {
+void Assembler::vstmd(BlockAddressMode am,
+                      Register base,
+                      DRegister first,
+                      intptr_t count,
+                      Condition cond) {
   ASSERT((am == IA) || (am == IA_W) || (am == DB_W));
   ASSERT(count <= 16);
   ASSERT(first + count <= kNumberOfDRegisters);
@@ -858,40 +872,44 @@
 }
 
 
-void Assembler::EmitVFPsss(Condition cond, int32_t opcode,
-                           SRegister sd, SRegister sn, SRegister sm) {
+void Assembler::EmitVFPsss(Condition cond,
+                           int32_t opcode,
+                           SRegister sd,
+                           SRegister sn,
+                           SRegister sm) {
   ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(sd != kNoSRegister);
   ASSERT(sn != kNoSRegister);
   ASSERT(sm != kNoSRegister);
   ASSERT(cond != kNoCondition);
-  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) |
-                     B27 | B26 | B25 | B11 | B9 | opcode |
-                     ((static_cast<int32_t>(sd) & 1)*B22) |
-                     ((static_cast<int32_t>(sn) >> 1)*B16) |
-                     ((static_cast<int32_t>(sd) >> 1)*B12) |
-                     ((static_cast<int32_t>(sn) & 1)*B7) |
-                     ((static_cast<int32_t>(sm) & 1)*B5) |
-                     (static_cast<int32_t>(sm) >> 1);
+  int32_t encoding =
+      (static_cast<int32_t>(cond) << kConditionShift) | B27 | B26 | B25 | B11 |
+      B9 | opcode | ((static_cast<int32_t>(sd) & 1) * B22) |
+      ((static_cast<int32_t>(sn) >> 1) * B16) |
+      ((static_cast<int32_t>(sd) >> 1) * B12) |
+      ((static_cast<int32_t>(sn) & 1) * B7) |
+      ((static_cast<int32_t>(sm) & 1) * B5) | (static_cast<int32_t>(sm) >> 1);
   Emit(encoding);
 }
 
 
-void Assembler::EmitVFPddd(Condition cond, int32_t opcode,
-                           DRegister dd, DRegister dn, DRegister dm) {
+void Assembler::EmitVFPddd(Condition cond,
+                           int32_t opcode,
+                           DRegister dd,
+                           DRegister dn,
+                           DRegister dm) {
   ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(dd != kNoDRegister);
   ASSERT(dn != kNoDRegister);
   ASSERT(dm != kNoDRegister);
   ASSERT(cond != kNoCondition);
-  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) |
-                     B27 | B26 | B25 | B11 | B9 | B8 | opcode |
-                     ((static_cast<int32_t>(dd) >> 4)*B22) |
-                     ((static_cast<int32_t>(dn) & 0xf)*B16) |
-                     ((static_cast<int32_t>(dd) & 0xf)*B12) |
-                     ((static_cast<int32_t>(dn) >> 4)*B7) |
-                     ((static_cast<int32_t>(dm) >> 4)*B5) |
-                     (static_cast<int32_t>(dm) & 0xf);
+  int32_t encoding =
+      (static_cast<int32_t>(cond) << kConditionShift) | B27 | B26 | B25 | B11 |
+      B9 | B8 | opcode | ((static_cast<int32_t>(dd) >> 4) * B22) |
+      ((static_cast<int32_t>(dn) & 0xf) * B16) |
+      ((static_cast<int32_t>(dd) & 0xf) * B12) |
+      ((static_cast<int32_t>(dn) >> 4) * B7) |
+      ((static_cast<int32_t>(dm) >> 4) * B5) | (static_cast<int32_t>(dm) & 0xf);
   Emit(encoding);
 }
 
@@ -913,11 +931,11 @@
   uint32_t imm32 = bit_cast<uint32_t, float>(s_imm);
   if (((imm32 & ((1 << 19) - 1)) == 0) &&
       ((((imm32 >> 25) & ((1 << 6) - 1)) == (1 << 5)) ||
-       (((imm32 >> 25) & ((1 << 6) - 1)) == ((1 << 5) -1)))) {
+       (((imm32 >> 25) & ((1 << 6) - 1)) == ((1 << 5) - 1)))) {
     uint8_t imm8 = ((imm32 >> 31) << 7) | (((imm32 >> 29) & 1) << 6) |
-        ((imm32 >> 19) & ((1 << 6) -1));
-    EmitVFPsss(cond, B23 | B21 | B20 | ((imm8 >> 4)*B16) | (imm8 & 0xf),
-               sd, S0, S0);
+                   ((imm32 >> 19) & ((1 << 6) - 1));
+    EmitVFPsss(cond, B23 | B21 | B20 | ((imm8 >> 4) * B16) | (imm8 & 0xf), sd,
+               S0, S0);
     return true;
   }
   return false;
@@ -931,10 +949,10 @@
   uint64_t imm64 = bit_cast<uint64_t, double>(d_imm);
   if (((imm64 & ((1LL << 48) - 1)) == 0) &&
       ((((imm64 >> 54) & ((1 << 9) - 1)) == (1 << 8)) ||
-       (((imm64 >> 54) & ((1 << 9) - 1)) == ((1 << 8) -1)))) {
+       (((imm64 >> 54) & ((1 << 9) - 1)) == ((1 << 8) - 1)))) {
     uint8_t imm8 = ((imm64 >> 63) << 7) | (((imm64 >> 61) & 1) << 6) |
-        ((imm64 >> 48) & ((1 << 6) -1));
-    EmitVFPddd(cond, B23 | B21 | B20 | ((imm8 >> 4)*B16) | B8 | (imm8 & 0xf),
+                   ((imm64 >> 48) & ((1 << 6) - 1));
+    EmitVFPddd(cond, B23 | B21 | B20 | ((imm8 >> 4) * B16) | B8 | (imm8 & 0xf),
                dd, D0, D0);
     return true;
   }
@@ -942,73 +960,97 @@
 }
 
 
-void Assembler::vadds(SRegister sd, SRegister sn, SRegister sm,
+void Assembler::vadds(SRegister sd,
+                      SRegister sn,
+                      SRegister sm,
                       Condition cond) {
   EmitVFPsss(cond, B21 | B20, sd, sn, sm);
 }
 
 
-void Assembler::vaddd(DRegister dd, DRegister dn, DRegister dm,
+void Assembler::vaddd(DRegister dd,
+                      DRegister dn,
+                      DRegister dm,
                       Condition cond) {
   EmitVFPddd(cond, B21 | B20, dd, dn, dm);
 }
 
 
-void Assembler::vsubs(SRegister sd, SRegister sn, SRegister sm,
+void Assembler::vsubs(SRegister sd,
+                      SRegister sn,
+                      SRegister sm,
                       Condition cond) {
   EmitVFPsss(cond, B21 | B20 | B6, sd, sn, sm);
 }
 
 
-void Assembler::vsubd(DRegister dd, DRegister dn, DRegister dm,
+void Assembler::vsubd(DRegister dd,
+                      DRegister dn,
+                      DRegister dm,
                       Condition cond) {
   EmitVFPddd(cond, B21 | B20 | B6, dd, dn, dm);
 }
 
 
-void Assembler::vmuls(SRegister sd, SRegister sn, SRegister sm,
+void Assembler::vmuls(SRegister sd,
+                      SRegister sn,
+                      SRegister sm,
                       Condition cond) {
   EmitVFPsss(cond, B21, sd, sn, sm);
 }
 
 
-void Assembler::vmuld(DRegister dd, DRegister dn, DRegister dm,
+void Assembler::vmuld(DRegister dd,
+                      DRegister dn,
+                      DRegister dm,
                       Condition cond) {
   EmitVFPddd(cond, B21, dd, dn, dm);
 }
 
 
-void Assembler::vmlas(SRegister sd, SRegister sn, SRegister sm,
+void Assembler::vmlas(SRegister sd,
+                      SRegister sn,
+                      SRegister sm,
                       Condition cond) {
   EmitVFPsss(cond, 0, sd, sn, sm);
 }
 
 
-void Assembler::vmlad(DRegister dd, DRegister dn, DRegister dm,
+void Assembler::vmlad(DRegister dd,
+                      DRegister dn,
+                      DRegister dm,
                       Condition cond) {
   EmitVFPddd(cond, 0, dd, dn, dm);
 }
 
 
-void Assembler::vmlss(SRegister sd, SRegister sn, SRegister sm,
+void Assembler::vmlss(SRegister sd,
+                      SRegister sn,
+                      SRegister sm,
                       Condition cond) {
   EmitVFPsss(cond, B6, sd, sn, sm);
 }
 
 
-void Assembler::vmlsd(DRegister dd, DRegister dn, DRegister dm,
+void Assembler::vmlsd(DRegister dd,
+                      DRegister dn,
+                      DRegister dm,
                       Condition cond) {
   EmitVFPddd(cond, B6, dd, dn, dm);
 }
 
 
-void Assembler::vdivs(SRegister sd, SRegister sn, SRegister sm,
+void Assembler::vdivs(SRegister sd,
+                      SRegister sn,
+                      SRegister sm,
                       Condition cond) {
   EmitVFPsss(cond, B23, sd, sn, sm);
 }
 
 
-void Assembler::vdivd(DRegister dd, DRegister dn, DRegister dm,
+void Assembler::vdivd(DRegister dd,
+                      DRegister dn,
+                      DRegister dm,
                       Condition cond) {
   EmitVFPddd(cond, B23, dd, dn, dm);
 }
@@ -1043,34 +1085,36 @@
 }
 
 
-void Assembler::EmitVFPsd(Condition cond, int32_t opcode,
-                          SRegister sd, DRegister dm) {
+void Assembler::EmitVFPsd(Condition cond,
+                          int32_t opcode,
+                          SRegister sd,
+                          DRegister dm) {
   ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(sd != kNoSRegister);
   ASSERT(dm != kNoDRegister);
   ASSERT(cond != kNoCondition);
-  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) |
-                     B27 | B26 | B25 | B11 | B9 | opcode |
-                     ((static_cast<int32_t>(sd) & 1)*B22) |
-                     ((static_cast<int32_t>(sd) >> 1)*B12) |
-                     ((static_cast<int32_t>(dm) >> 4)*B5) |
-                     (static_cast<int32_t>(dm) & 0xf);
+  int32_t encoding =
+      (static_cast<int32_t>(cond) << kConditionShift) | B27 | B26 | B25 | B11 |
+      B9 | opcode | ((static_cast<int32_t>(sd) & 1) * B22) |
+      ((static_cast<int32_t>(sd) >> 1) * B12) |
+      ((static_cast<int32_t>(dm) >> 4) * B5) | (static_cast<int32_t>(dm) & 0xf);
   Emit(encoding);
 }
 
 
-void Assembler::EmitVFPds(Condition cond, int32_t opcode,
-                          DRegister dd, SRegister sm) {
+void Assembler::EmitVFPds(Condition cond,
+                          int32_t opcode,
+                          DRegister dd,
+                          SRegister sm) {
   ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(dd != kNoDRegister);
   ASSERT(sm != kNoSRegister);
   ASSERT(cond != kNoCondition);
-  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) |
-                     B27 | B26 | B25 | B11 | B9 | opcode |
-                     ((static_cast<int32_t>(dd) >> 4)*B22) |
-                     ((static_cast<int32_t>(dd) & 0xf)*B12) |
-                     ((static_cast<int32_t>(sm) & 1)*B5) |
-                     (static_cast<int32_t>(sm) >> 1);
+  int32_t encoding =
+      (static_cast<int32_t>(cond) << kConditionShift) | B27 | B26 | B25 | B11 |
+      B9 | opcode | ((static_cast<int32_t>(dd) >> 4) * B22) |
+      ((static_cast<int32_t>(dd) & 0xf) * B12) |
+      ((static_cast<int32_t>(sm) & 1) * B5) | (static_cast<int32_t>(sm) >> 1);
   Emit(encoding);
 }
 
@@ -1148,10 +1192,9 @@
 void Assembler::vmrs(Register rd, Condition cond) {
   ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(cond != kNoCondition);
-  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) |
-                     B27 | B26 | B25 | B23 | B22 | B21 | B20 | B16 |
-                     (static_cast<int32_t>(rd)*B12) |
-                     B11 | B9 | B4;
+  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) | B27 |
+                     B26 | B25 | B23 | B22 | B21 | B20 | B16 |
+                     (static_cast<int32_t>(rd) * B12) | B11 | B9 | B4;
   Emit(encoding);
 }
 
@@ -1187,38 +1230,40 @@
 }
 
 
-void Assembler::EmitSIMDqqq(int32_t opcode, OperandSize size,
-                            QRegister qd, QRegister qn, QRegister qm) {
+void Assembler::EmitSIMDqqq(int32_t opcode,
+                            OperandSize size,
+                            QRegister qd,
+                            QRegister qn,
+                            QRegister qm) {
   ASSERT(TargetCPUFeatures::neon_supported());
   int sz = ShiftOfOperandSize(size);
   int32_t encoding =
-      (static_cast<int32_t>(kSpecialCondition) << kConditionShift) |
-      B25 | B6 |
+      (static_cast<int32_t>(kSpecialCondition) << kConditionShift) | B25 | B6 |
       opcode | ((sz & 0x3) * B20) |
-      ((static_cast<int32_t>(qd * 2) >> 4)*B22) |
-      ((static_cast<int32_t>(qn * 2) & 0xf)*B16) |
-      ((static_cast<int32_t>(qd * 2) & 0xf)*B12) |
-      ((static_cast<int32_t>(qn * 2) >> 4)*B7) |
-      ((static_cast<int32_t>(qm * 2) >> 4)*B5) |
+      ((static_cast<int32_t>(qd * 2) >> 4) * B22) |
+      ((static_cast<int32_t>(qn * 2) & 0xf) * B16) |
+      ((static_cast<int32_t>(qd * 2) & 0xf) * B12) |
+      ((static_cast<int32_t>(qn * 2) >> 4) * B7) |
+      ((static_cast<int32_t>(qm * 2) >> 4) * B5) |
       (static_cast<int32_t>(qm * 2) & 0xf);
   Emit(encoding);
 }
 
 
-void Assembler::EmitSIMDddd(int32_t opcode, OperandSize size,
-                            DRegister dd, DRegister dn, DRegister dm) {
+void Assembler::EmitSIMDddd(int32_t opcode,
+                            OperandSize size,
+                            DRegister dd,
+                            DRegister dn,
+                            DRegister dm) {
   ASSERT(TargetCPUFeatures::neon_supported());
   int sz = ShiftOfOperandSize(size);
   int32_t encoding =
-      (static_cast<int32_t>(kSpecialCondition) << kConditionShift) |
-      B25 |
-      opcode | ((sz & 0x3) * B20) |
-      ((static_cast<int32_t>(dd) >> 4)*B22) |
-      ((static_cast<int32_t>(dn) & 0xf)*B16) |
-      ((static_cast<int32_t>(dd) & 0xf)*B12) |
-      ((static_cast<int32_t>(dn) >> 4)*B7) |
-      ((static_cast<int32_t>(dm) >> 4)*B5) |
-      (static_cast<int32_t>(dm) & 0xf);
+      (static_cast<int32_t>(kSpecialCondition) << kConditionShift) | B25 |
+      opcode | ((sz & 0x3) * B20) | ((static_cast<int32_t>(dd) >> 4) * B22) |
+      ((static_cast<int32_t>(dn) & 0xf) * B16) |
+      ((static_cast<int32_t>(dd) & 0xf) * B12) |
+      ((static_cast<int32_t>(dn) >> 4) * B7) |
+      ((static_cast<int32_t>(dm) >> 4) * B5) | (static_cast<int32_t>(dm) & 0xf);
   Emit(encoding);
 }
 
@@ -1229,7 +1274,9 @@
 
 
 void Assembler::vaddqi(OperandSize sz,
-                       QRegister qd, QRegister qn, QRegister qm) {
+                       QRegister qd,
+                       QRegister qn,
+                       QRegister qm) {
   EmitSIMDqqq(B11, sz, qd, qn, qm);
 }
 
@@ -1240,7 +1287,9 @@
 
 
 void Assembler::vsubqi(OperandSize sz,
-                       QRegister qd, QRegister qn, QRegister qm) {
+                       QRegister qd,
+                       QRegister qn,
+                       QRegister qm) {
   EmitSIMDqqq(B24 | B11, sz, qd, qn, qm);
 }
 
@@ -1251,7 +1300,9 @@
 
 
 void Assembler::vmulqi(OperandSize sz,
-                       QRegister qd, QRegister qn, QRegister qm) {
+                       QRegister qd,
+                       QRegister qn,
+                       QRegister qm) {
   EmitSIMDqqq(B11 | B8 | B4, sz, qd, qn, qm);
 }
 
@@ -1262,13 +1313,17 @@
 
 
 void Assembler::vshlqi(OperandSize sz,
-                       QRegister qd, QRegister qm, QRegister qn) {
+                       QRegister qd,
+                       QRegister qm,
+                       QRegister qn) {
   EmitSIMDqqq(B25 | B10, sz, qd, qn, qm);
 }
 
 
 void Assembler::vshlqu(OperandSize sz,
-                       QRegister qd, QRegister qm, QRegister qn) {
+                       QRegister qd,
+                       QRegister qm,
+                       QRegister qn) {
   EmitSIMDqqq(B25 | B24 | B10, sz, qd, qn, qm);
 }
 
@@ -1309,8 +1364,8 @@
 
 
 void Assembler::vabsqs(QRegister qd, QRegister qm) {
-  EmitSIMDqqq(B24 | B23 | B21 | B20 | B19 | B16 | B10 | B9 | B8, kSWord,
-              qd, Q0, qm);
+  EmitSIMDqqq(B24 | B23 | B21 | B20 | B19 | B16 | B10 | B9 | B8, kSWord, qd, Q0,
+              qm);
 }
 
 
@@ -1321,8 +1376,8 @@
 
 
 void Assembler::vrecpeqs(QRegister qd, QRegister qm) {
-  EmitSIMDqqq(B24 | B23 | B21 | B20 | B19 | B17 | B16 | B10 | B8, kSWord,
-              qd, Q0, qm);
+  EmitSIMDqqq(B24 | B23 | B21 | B20 | B19 | B17 | B16 | B10 | B8, kSWord, qd,
+              Q0, qm);
 }
 
 
@@ -1332,8 +1387,8 @@
 
 
 void Assembler::vrsqrteqs(QRegister qd, QRegister qm) {
-  EmitSIMDqqq(B24 | B23 | B21 | B20 | B19 | B17 | B16 | B10 | B8 | B7,
-              kSWord, qd, Q0, qm);
+  EmitSIMDqqq(B24 | B23 | B21 | B20 | B19 | B17 | B16 | B10 | B8 | B7, kSWord,
+              qd, Q0, qm);
 }
 
 
@@ -1365,15 +1420,12 @@
       code = 4 | (idx << 3);
       break;
     }
-    default: {
-      break;
-    }
+    default: { break; }
   }
 
   EmitSIMDddd(B24 | B23 | B11 | B10 | B6, kWordPair,
               static_cast<DRegister>(qd * 2),
-              static_cast<DRegister>(code & 0xf),
-              dm);
+              static_cast<DRegister>(code & 0xf), dm);
 }
 
 
@@ -1389,7 +1441,9 @@
 
 
 void Assembler::vceqqi(OperandSize sz,
-                      QRegister qd, QRegister qn, QRegister qm) {
+                       QRegister qd,
+                       QRegister qn,
+                       QRegister qm) {
   EmitSIMDqqq(B24 | B11 | B4, sz, qd, qn, qm);
 }
 
@@ -1400,13 +1454,17 @@
 
 
 void Assembler::vcgeqi(OperandSize sz,
-                      QRegister qd, QRegister qn, QRegister qm) {
+                       QRegister qd,
+                       QRegister qn,
+                       QRegister qm) {
   EmitSIMDqqq(B9 | B8 | B4, sz, qd, qn, qm);
 }
 
 
 void Assembler::vcugeqi(OperandSize sz,
-                      QRegister qd, QRegister qn, QRegister qm) {
+                        QRegister qd,
+                        QRegister qn,
+                        QRegister qm) {
   EmitSIMDqqq(B24 | B9 | B8 | B4, sz, qd, qn, qm);
 }
 
@@ -1417,13 +1475,17 @@
 
 
 void Assembler::vcgtqi(OperandSize sz,
-                      QRegister qd, QRegister qn, QRegister qm) {
+                       QRegister qd,
+                       QRegister qn,
+                       QRegister qm) {
   EmitSIMDqqq(B9 | B8, sz, qd, qn, qm);
 }
 
 
 void Assembler::vcugtqi(OperandSize sz,
-                      QRegister qd, QRegister qn, QRegister qm) {
+                        QRegister qd,
+                        QRegister qn,
+                        QRegister qm) {
   EmitSIMDqqq(B24 | B9 | B8, sz, qd, qn, qm);
 }
 
@@ -1451,8 +1513,8 @@
 void Assembler::bx(Register rm, Condition cond) {
   ASSERT(rm != kNoRegister);
   ASSERT(cond != kNoCondition);
-  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) |
-                     B24 | B21 | (0xfff << 8) | B4 |
+  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) | B24 |
+                     B21 | (0xfff << 8) | B4 |
                      (static_cast<int32_t>(rm) << kRmShift);
   Emit(encoding);
 }
@@ -1461,8 +1523,8 @@
 void Assembler::blx(Register rm, Condition cond) {
   ASSERT(rm != kNoRegister);
   ASSERT(cond != kNoCondition);
-  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) |
-                     B24 | B21 | (0xfff << 8) | B5 | B4 |
+  int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) | B24 |
+                     B21 | (0xfff << 8) | B5 | B4 |
                      (static_cast<int32_t>(rm) << kRmShift);
   Emit(encoding);
 }
@@ -1530,7 +1592,7 @@
   Bind(&cid_ok);
 
   const intptr_t offset = CodeSize() + Instr::kPCReadOffset +
-      Instructions::HeaderSize() - kHeapObjectTag;
+                          Instructions::HeaderSize() - kHeapObjectTag;
   mov(R0, Operand(PC));
   AddImmediate(R0, R0, -offset);
   ldr(IP, FieldAddress(CODE_REG, Code::saved_instructions_offset()));
@@ -1595,8 +1657,8 @@
     // Make sure that class CallPattern is able to decode this load from the
     // object pool.
     const int32_t offset = ObjectPool::element_offset(
-       is_unique ? object_pool_wrapper_.AddObject(object)
-                 : object_pool_wrapper_.FindObject(object));
+        is_unique ? object_pool_wrapper_.AddObject(object)
+                  : object_pool_wrapper_.FindObject(object));
     LoadWordFromPoolOffset(rd, offset - kHeapObjectTag, pp, cond);
   } else {
     UNREACHABLE();
@@ -1700,9 +1762,11 @@
 
 Register AllocateRegister(RegList* used) {
   const RegList free = ~*used;
-  return (free == 0) ?
-      kNoRegister :
-      UseRegister(static_cast<Register>(Utils::CountTrailingZeros(free)), used);
+  return (free == 0)
+             ? kNoRegister
+             : UseRegister(
+                   static_cast<Register>(Utils::CountTrailingZeros(free)),
+                   used);
 }
 
 
@@ -1741,8 +1805,8 @@
                                       bool can_value_be_smi) {
   int32_t ignored = 0;
   if (Address::CanHoldStoreOffset(kWord, offset - kHeapObjectTag, &ignored)) {
-    StoreIntoObject(
-        object, FieldAddress(object, offset), value, can_value_be_smi);
+    StoreIntoObject(object, FieldAddress(object, offset), value,
+                    can_value_be_smi);
   } else {
     AddImmediate(IP, object, offset - kHeapObjectTag);
     StoreIntoObject(object, Address(IP), value, can_value_be_smi);
@@ -1845,7 +1909,7 @@
   intptr_t current_offset = begin_offset;
   while (current_offset + kWordSize < end_offset) {
     strd(value_even, value_odd, base, current_offset);
-    current_offset += 2*kWordSize;
+    current_offset += 2 * kWordSize;
   }
   while (current_offset < end_offset) {
     str(value_even, Address(base, current_offset));
@@ -1877,8 +1941,8 @@
 void Assembler::LoadClassId(Register result, Register object, Condition cond) {
   ASSERT(RawObject::kClassIdTagPos == 16);
   ASSERT(RawObject::kClassIdTagSize == 16);
-  const intptr_t class_id_offset = Object::tags_offset() +
-      RawObject::kClassIdTagPos / kBitsPerByte;
+  const intptr_t class_id_offset =
+      Object::tags_offset() + RawObject::kClassIdTagPos / kBitsPerByte;
   ldrh(result, FieldAddress(object, class_id_offset), cond);
 }
 
@@ -1933,8 +1997,7 @@
 
   if (!CanEncodeBranchOffset(offset)) {
     ASSERT(!use_far_branches());
-    Thread::Current()->long_jump_base()->Jump(
-        1, Object::branch_offset_error());
+    Thread::Current()->long_jump_base()->Jump(1, Object::branch_offset_error());
   }
 
   // Properly preserve only the bits supported in the instruction.
@@ -1960,8 +2023,10 @@
 }
 
 
-static int32_t DecodeARMv6LoadImmediate(int32_t mov, int32_t or1,
-                                        int32_t or2, int32_t or3) {
+static int32_t DecodeARMv6LoadImmediate(int32_t mov,
+                                        int32_t or1,
+                                        int32_t or2,
+                                        int32_t or3) {
   int32_t offset = 0;
   offset |= (mov & 0xff) << 24;
   offset |= (or1 & 0xff) << 16;
@@ -1988,10 +2053,10 @@
  private:
   void ProcessARMv6(const MemoryRegion& region, intptr_t position) {
     const int32_t mov = region.Load<int32_t>(position);
-    const int32_t or1 = region.Load<int32_t>(position + 1*Instr::kInstrSize);
-    const int32_t or2 = region.Load<int32_t>(position + 2*Instr::kInstrSize);
-    const int32_t or3 = region.Load<int32_t>(position + 3*Instr::kInstrSize);
-    const int32_t bx = region.Load<int32_t>(position + 4*Instr::kInstrSize);
+    const int32_t or1 = region.Load<int32_t>(position + 1 * Instr::kInstrSize);
+    const int32_t or2 = region.Load<int32_t>(position + 2 * Instr::kInstrSize);
+    const int32_t or3 = region.Load<int32_t>(position + 3 * Instr::kInstrSize);
+    const int32_t bx = region.Load<int32_t>(position + 4 * Instr::kInstrSize);
 
     if (((mov & 0xffffff00) == 0xe3a0c400) &&  // mov IP, (byte3 rot 4)
         ((or1 & 0xffffff00) == 0xe38cc800) &&  // orr IP, IP, (byte2 rot 8)
@@ -2018,10 +2083,8 @@
     // If the offset loading instructions aren't there, we must have replaced
     // the far branch with a near one, and so these instructions
     // should be NOPs.
-    ASSERT((or1 == Instr::kNopInstruction) &&
-           (or2 == Instr::kNopInstruction) &&
-           (or3 == Instr::kNopInstruction) &&
-           (bx == Instr::kNopInstruction));
+    ASSERT((or1 == Instr::kNopInstruction) && (or2 == Instr::kNopInstruction) &&
+           (or3 == Instr::kNopInstruction) && (bx == Instr::kNopInstruction));
   }
 
 
@@ -2031,7 +2094,7 @@
     const int32_t bx = region.Load<int32_t>(position + 2 * Instr::kInstrSize);
 
     if (((movt & 0xfff0f000) == 0xe340c000) &&  // movt IP, high
-        ((movw & 0xfff0f000) == 0xe300c000)) {   // movw IP, low
+        ((movw & 0xfff0f000) == 0xe300c000)) {  // movw IP, low
       const int32_t offset = DecodeARMv7LoadImmediate(movt, movw);
       const int32_t dest = region.start() + offset;
       const uint16_t dest_high = Utils::High16Bits(dest);
@@ -2049,8 +2112,7 @@
     // If the offset loading instructions aren't there, we must have replaced
     // the far branch with a near one, and so these instructions
     // should be NOPs.
-    ASSERT((movt == Instr::kNopInstruction) &&
-           (bx == Instr::kNopInstruction));
+    ASSERT((movt == Instr::kNopInstruction) && (bx == Instr::kNopInstruction));
   }
 
   virtual bool IsPointerOffset() const { return false; }
@@ -2100,8 +2162,7 @@
       // Far branches are enabled and we can't encode the branch offset.
 
       // Grab instructions that load the offset.
-      const int32_t mov =
-          buffer_.Load<int32_t>(position);
+      const int32_t mov = buffer_.Load<int32_t>(position);
       const int32_t or1 =
           buffer_.Load<int32_t>(position + 1 * Instr::kInstrSize);
       const int32_t or2 =
@@ -2129,8 +2190,7 @@
       label->position_ = DecodeARMv6LoadImmediate(mov, or1, or2, or3);
     } else if (use_far_branches() && CanEncodeBranchOffset(dest)) {
       // Grab instructions that load the offset, and the branch.
-      const int32_t mov =
-          buffer_.Load<int32_t>(position);
+      const int32_t mov = buffer_.Load<int32_t>(position);
       const int32_t or1 =
           buffer_.Load<int32_t>(position + 1 * Instr::kInstrSize);
       const int32_t or2 =
@@ -2151,13 +2211,13 @@
       // Write the encoded branch instruction followed by two nops.
       buffer_.Store<int32_t>(position, encoded);
       buffer_.Store<int32_t>(position + 1 * Instr::kInstrSize,
-          Instr::kNopInstruction);
+                             Instr::kNopInstruction);
       buffer_.Store<int32_t>(position + 2 * Instr::kInstrSize,
-          Instr::kNopInstruction);
+                             Instr::kNopInstruction);
       buffer_.Store<int32_t>(position + 3 * Instr::kInstrSize,
-          Instr::kNopInstruction);
+                             Instr::kNopInstruction);
       buffer_.Store<int32_t>(position + 4 * Instr::kInstrSize,
-          Instr::kNopInstruction);
+                             Instr::kNopInstruction);
 
       label->position_ = DecodeARMv6LoadImmediate(mov, or1, or2, or3);
     } else {
@@ -2220,12 +2280,11 @@
       const int32_t encoded = EncodeBranchOffset(dest, new_branch);
 
       // Write the encoded branch instruction followed by two nops.
-      buffer_.Store<int32_t>(position + 0 * Instr::kInstrSize,
-          encoded);
+      buffer_.Store<int32_t>(position + 0 * Instr::kInstrSize, encoded);
       buffer_.Store<int32_t>(position + 1 * Instr::kInstrSize,
-          Instr::kNopInstruction);
+                             Instr::kNopInstruction);
       buffer_.Store<int32_t>(position + 2 * Instr::kInstrSize,
-          Instr::kNopInstruction);
+                             Instr::kNopInstruction);
 
       label->position_ = DecodeARMv7LoadImmediate(movt, movw);
     } else {
@@ -2368,8 +2427,9 @@
 }
 
 
-bool Address::CanHoldImmediateOffset(
-    bool is_load, intptr_t cid, int64_t offset) {
+bool Address::CanHoldImmediateOffset(bool is_load,
+                                     intptr_t cid,
+                                     int64_t offset) {
   int32_t offset_mask = 0;
   if (is_load) {
     return CanHoldLoadOffset(OperandSizeFor(cid), offset, &offset_mask);
@@ -2406,7 +2466,9 @@
 }
 
 
-void Assembler::Lsl(Register rd, Register rm, const Operand& shift_imm,
+void Assembler::Lsl(Register rd,
+                    Register rm,
+                    const Operand& shift_imm,
                     Condition cond) {
   ASSERT(shift_imm.type() == 1);
   ASSERT(shift_imm.encoding() != 0);  // Do not use Lsl if no shift is wanted.
@@ -2419,7 +2481,9 @@
 }
 
 
-void Assembler::Lsr(Register rd, Register rm, const Operand& shift_imm,
+void Assembler::Lsr(Register rd,
+                    Register rm,
+                    const Operand& shift_imm,
                     Condition cond) {
   ASSERT(shift_imm.type() == 1);
   uint32_t shift = shift_imm.encoding();
@@ -2436,7 +2500,9 @@
 }
 
 
-void Assembler::Asr(Register rd, Register rm, const Operand& shift_imm,
+void Assembler::Asr(Register rd,
+                    Register rm,
+                    const Operand& shift_imm,
                     Condition cond) {
   ASSERT(shift_imm.type() == 1);
   uint32_t shift = shift_imm.encoding();
@@ -2448,7 +2514,9 @@
 }
 
 
-void Assembler::Asrs(Register rd, Register rm, const Operand& shift_imm,
+void Assembler::Asrs(Register rd,
+                     Register rm,
+                     const Operand& shift_imm,
                      Condition cond) {
   ASSERT(shift_imm.type() == 1);
   uint32_t shift = shift_imm.encoding();
@@ -2465,7 +2533,9 @@
 }
 
 
-void Assembler::Ror(Register rd, Register rm, const Operand& shift_imm,
+void Assembler::Ror(Register rd,
+                    Register rm,
+                    const Operand& shift_imm,
                     Condition cond) {
   ASSERT(shift_imm.type() == 1);
   ASSERT(shift_imm.encoding() != 0);  // Use Rrx instruction.
@@ -2510,9 +2580,9 @@
   vrsqrteqs(qd, qm);
   // 2 Newton-Raphson steps. xn+1 = xn * (3 - Q1*xn^2) / 2.
   // First step.
-  vmulqs(QTMP, qd, qd);  // QTMP <- xn^2
+  vmulqs(QTMP, qd, qd);       // QTMP <- xn^2
   vrsqrtsqs(QTMP, qm, QTMP);  // QTMP <- (3 - Q1*QTMP) / 2.
-  vmulqs(qd, qd, QTMP);  // xn+1 <- xn * QTMP
+  vmulqs(qd, qd, QTMP);       // xn+1 <- xn * QTMP
   // Second step.
   vmulqs(QTMP, qd, qd);
   vrsqrtsqs(QTMP, qm, QTMP);
@@ -2625,8 +2695,9 @@
 }
 
 
-void Assembler::LoadPatchableImmediate(
-    Register rd, int32_t value, Condition cond) {
+void Assembler::LoadPatchableImmediate(Register rd,
+                                       int32_t value,
+                                       Condition cond) {
   const ARMVersion version = TargetCPUFeatures::arm_version();
   if ((version == ARMv5TE) || (version == ARMv6)) {
     // This sequence is patched in a few places, and should remain fixed.
@@ -2648,8 +2719,9 @@
 }
 
 
-void Assembler::LoadDecodableImmediate(
-    Register rd, int32_t value, Condition cond) {
+void Assembler::LoadDecodableImmediate(Register rd,
+                                       int32_t value,
+                                       Condition cond) {
   const ARMVersion version = TargetCPUFeatures::arm_version();
   if ((version == ARMv5TE) || (version == ARMv6)) {
     if (constant_pool_allowed()) {
@@ -2853,78 +2925,93 @@
 }
 
 
-void Assembler::CopyDoubleField(
-    Register dst, Register src, Register tmp1, Register tmp2, DRegister dtmp) {
+void Assembler::CopyDoubleField(Register dst,
+                                Register src,
+                                Register tmp1,
+                                Register tmp2,
+                                DRegister dtmp) {
   if (TargetCPUFeatures::vfp_supported()) {
     LoadDFromOffset(dtmp, src, Double::value_offset() - kHeapObjectTag);
     StoreDToOffset(dtmp, dst, Double::value_offset() - kHeapObjectTag);
   } else {
-    LoadFromOffset(kWord, tmp1, src,
-        Double::value_offset() - kHeapObjectTag);
+    LoadFromOffset(kWord, tmp1, src, Double::value_offset() - kHeapObjectTag);
     LoadFromOffset(kWord, tmp2, src,
-        Double::value_offset() + kWordSize - kHeapObjectTag);
-    StoreToOffset(kWord, tmp1, dst,
-        Double::value_offset() - kHeapObjectTag);
+                   Double::value_offset() + kWordSize - kHeapObjectTag);
+    StoreToOffset(kWord, tmp1, dst, Double::value_offset() - kHeapObjectTag);
     StoreToOffset(kWord, tmp2, dst,
-        Double::value_offset() + kWordSize - kHeapObjectTag);
+                  Double::value_offset() + kWordSize - kHeapObjectTag);
   }
 }
 
 
-void Assembler::CopyFloat32x4Field(
-    Register dst, Register src, Register tmp1, Register tmp2, DRegister dtmp) {
+void Assembler::CopyFloat32x4Field(Register dst,
+                                   Register src,
+                                   Register tmp1,
+                                   Register tmp2,
+                                   DRegister dtmp) {
   if (TargetCPUFeatures::neon_supported()) {
     LoadMultipleDFromOffset(dtmp, 2, src,
-        Float32x4::value_offset() - kHeapObjectTag);
+                            Float32x4::value_offset() - kHeapObjectTag);
     StoreMultipleDToOffset(dtmp, 2, dst,
-        Float32x4::value_offset() - kHeapObjectTag);
+                           Float32x4::value_offset() - kHeapObjectTag);
   } else {
-    LoadFromOffset(kWord, tmp1, src,
+    LoadFromOffset(
+        kWord, tmp1, src,
         (Float32x4::value_offset() + 0 * kWordSize) - kHeapObjectTag);
-    LoadFromOffset(kWord, tmp2, src,
+    LoadFromOffset(
+        kWord, tmp2, src,
         (Float32x4::value_offset() + 1 * kWordSize) - kHeapObjectTag);
     StoreToOffset(kWord, tmp1, dst,
-        (Float32x4::value_offset() + 0 * kWordSize) - kHeapObjectTag);
+                  (Float32x4::value_offset() + 0 * kWordSize) - kHeapObjectTag);
     StoreToOffset(kWord, tmp2, dst,
-        (Float32x4::value_offset() + 1 * kWordSize) - kHeapObjectTag);
+                  (Float32x4::value_offset() + 1 * kWordSize) - kHeapObjectTag);
 
-    LoadFromOffset(kWord, tmp1, src,
+    LoadFromOffset(
+        kWord, tmp1, src,
         (Float32x4::value_offset() + 2 * kWordSize) - kHeapObjectTag);
-    LoadFromOffset(kWord, tmp2, src,
+    LoadFromOffset(
+        kWord, tmp2, src,
         (Float32x4::value_offset() + 3 * kWordSize) - kHeapObjectTag);
     StoreToOffset(kWord, tmp1, dst,
-        (Float32x4::value_offset() + 2 * kWordSize) - kHeapObjectTag);
+                  (Float32x4::value_offset() + 2 * kWordSize) - kHeapObjectTag);
     StoreToOffset(kWord, tmp2, dst,
-        (Float32x4::value_offset() + 3 * kWordSize) - kHeapObjectTag);
+                  (Float32x4::value_offset() + 3 * kWordSize) - kHeapObjectTag);
   }
 }
 
 
-void Assembler::CopyFloat64x2Field(
-    Register dst, Register src, Register tmp1, Register tmp2, DRegister dtmp) {
+void Assembler::CopyFloat64x2Field(Register dst,
+                                   Register src,
+                                   Register tmp1,
+                                   Register tmp2,
+                                   DRegister dtmp) {
   if (TargetCPUFeatures::neon_supported()) {
     LoadMultipleDFromOffset(dtmp, 2, src,
-        Float64x2::value_offset() - kHeapObjectTag);
+                            Float64x2::value_offset() - kHeapObjectTag);
     StoreMultipleDToOffset(dtmp, 2, dst,
-        Float64x2::value_offset() - kHeapObjectTag);
+                           Float64x2::value_offset() - kHeapObjectTag);
   } else {
-    LoadFromOffset(kWord, tmp1, src,
+    LoadFromOffset(
+        kWord, tmp1, src,
         (Float64x2::value_offset() + 0 * kWordSize) - kHeapObjectTag);
-    LoadFromOffset(kWord, tmp2, src,
+    LoadFromOffset(
+        kWord, tmp2, src,
         (Float64x2::value_offset() + 1 * kWordSize) - kHeapObjectTag);
     StoreToOffset(kWord, tmp1, dst,
-        (Float64x2::value_offset() + 0 * kWordSize) - kHeapObjectTag);
+                  (Float64x2::value_offset() + 0 * kWordSize) - kHeapObjectTag);
     StoreToOffset(kWord, tmp2, dst,
-        (Float64x2::value_offset() + 1 * kWordSize) - kHeapObjectTag);
+                  (Float64x2::value_offset() + 1 * kWordSize) - kHeapObjectTag);
 
-    LoadFromOffset(kWord, tmp1, src,
+    LoadFromOffset(
+        kWord, tmp1, src,
         (Float64x2::value_offset() + 2 * kWordSize) - kHeapObjectTag);
-    LoadFromOffset(kWord, tmp2, src,
+    LoadFromOffset(
+        kWord, tmp2, src,
         (Float64x2::value_offset() + 3 * kWordSize) - kHeapObjectTag);
     StoreToOffset(kWord, tmp1, dst,
-        (Float64x2::value_offset() + 2 * kWordSize) - kHeapObjectTag);
+                  (Float64x2::value_offset() + 2 * kWordSize) - kHeapObjectTag);
     StoreToOffset(kWord, tmp2, dst,
-        (Float64x2::value_offset() + 3 * kWordSize) - kHeapObjectTag);
+                  (Float64x2::value_offset() + 3 * kWordSize) - kHeapObjectTag);
   }
 }
 
@@ -2934,7 +3021,9 @@
 }
 
 
-void Assembler::AddImmediate(Register rd, Register rn, int32_t value,
+void Assembler::AddImmediate(Register rd,
+                             Register rn,
+                             int32_t value,
                              Condition cond) {
   if (value == 0) {
     if (rd != rn) {
@@ -2966,7 +3055,9 @@
 }
 
 
-void Assembler::AddImmediateSetFlags(Register rd, Register rn, int32_t value,
+void Assembler::AddImmediateSetFlags(Register rd,
+                                     Register rn,
+                                     int32_t value,
                                      Condition cond) {
   Operand o;
   if (Operand::CanHold(value, &o)) {
@@ -2992,8 +3083,10 @@
 }
 
 
-void Assembler::SubImmediateSetFlags(Register rd, Register rn, int32_t value,
-                                    Condition cond) {
+void Assembler::SubImmediateSetFlags(Register rd,
+                                     Register rn,
+                                     int32_t value,
+                                     Condition cond) {
   Operand o;
   if (Operand::CanHold(value, &o)) {
     // Handles value == kMinInt32.
@@ -3018,7 +3111,9 @@
 }
 
 
-void Assembler::AndImmediate(Register rd, Register rs, int32_t imm,
+void Assembler::AndImmediate(Register rd,
+                             Register rs,
+                             int32_t imm,
                              Condition cond) {
   Operand o;
   if (Operand::CanHold(imm, &o)) {
@@ -3052,8 +3147,11 @@
   }
 }
 
-void Assembler::IntegerDivide(Register result, Register left, Register right,
-                              DRegister tmpl, DRegister tmpr) {
+void Assembler::IntegerDivide(Register result,
+                              Register left,
+                              Register right,
+                              DRegister tmpl,
+                              DRegister tmpr) {
   ASSERT(tmpl != tmpr);
   if (TargetCPUFeatures::integer_division_supported()) {
     sdiv(result, left, right);
@@ -3151,8 +3249,9 @@
   // and ensure proper alignment of the stack frame.
   // We need to restore it before restoring registers.
   const intptr_t kPushedFpuRegisterSize =
-      TargetCPUFeatures::vfp_supported() ?
-      kDartVolatileFpuRegCount * kFpuRegisterSize : 0;
+      TargetCPUFeatures::vfp_supported()
+          ? kDartVolatileFpuRegCount * kFpuRegisterSize
+          : 0;
 
   COMPILE_ASSERT(PP < FP);
   COMPILE_ASSERT((kDartVolatileCpuRegs & (1 << PP)) == 0);
@@ -3282,8 +3381,7 @@
 }
 
 
-void Assembler::LoadAllocationStatsAddress(Register dest,
-                                           intptr_t cid) {
+void Assembler::LoadAllocationStatsAddress(Register dest, intptr_t cid) {
   ASSERT(dest != kNoRegister);
   ASSERT(dest != TMP);
   ASSERT(cid > 0);
@@ -3302,9 +3400,10 @@
   ASSERT(stats_addr_reg != kNoRegister);
   ASSERT(stats_addr_reg != TMP);
   ASSERT(cid > 0);
-  const uword count_field_offset = (space == Heap::kNew) ?
-    ClassHeapStats::allocated_since_gc_new_space_offset() :
-    ClassHeapStats::allocated_since_gc_old_space_offset();
+  const uword count_field_offset =
+      (space == Heap::kNew)
+          ? ClassHeapStats::allocated_since_gc_new_space_offset()
+          : ClassHeapStats::allocated_since_gc_old_space_offset();
   const Address& count_address = Address(stats_addr_reg, count_field_offset);
   ldr(TMP, count_address);
   AddImmediate(TMP, 1);
@@ -3317,12 +3416,14 @@
                                                  Heap::Space space) {
   ASSERT(stats_addr_reg != kNoRegister);
   ASSERT(stats_addr_reg != TMP);
-  const uword count_field_offset = (space == Heap::kNew) ?
-    ClassHeapStats::allocated_since_gc_new_space_offset() :
-    ClassHeapStats::allocated_since_gc_old_space_offset();
-  const uword size_field_offset = (space == Heap::kNew) ?
-    ClassHeapStats::allocated_size_since_gc_new_space_offset() :
-    ClassHeapStats::allocated_size_since_gc_old_space_offset();
+  const uword count_field_offset =
+      (space == Heap::kNew)
+          ? ClassHeapStats::allocated_since_gc_new_space_offset()
+          : ClassHeapStats::allocated_since_gc_old_space_offset();
+  const uword size_field_offset =
+      (space == Heap::kNew)
+          ? ClassHeapStats::allocated_size_since_gc_new_space_offset()
+          : ClassHeapStats::allocated_size_since_gc_old_space_offset();
   const Address& count_address = Address(stats_addr_reg, count_field_offset);
   const Address& size_address = Address(stats_addr_reg, size_field_offset);
   ldr(TMP, count_address);
@@ -3348,8 +3449,7 @@
     // If this allocation is traced, program will jump to failure path
     // (i.e. the allocation stub) which will allocate the object and trace the
     // allocation call site.
-    NOT_IN_PRODUCT(
-      MaybeTraceAllocation(cls.id(), temp_reg, failure));
+    NOT_IN_PRODUCT(MaybeTraceAllocation(cls.id(), temp_reg, failure));
     Heap::Space space = Heap::kNew;
     ldr(temp_reg, Address(THR, Thread::heap_offset()));
     ldr(instance_reg, Address(temp_reg, Heap::TopOffset(space)));
@@ -3462,8 +3562,8 @@
                                              Register temp) {
   const int64_t offset_base =
       (is_external ? 0 : (Instance::DataOffsetFor(cid) - kHeapObjectTag));
-  const int64_t offset = offset_base +
-      static_cast<int64_t>(index) * index_scale;
+  const int64_t offset =
+      offset_base + static_cast<int64_t>(index) * index_scale;
   ASSERT(Utils::IsInt(32, offset));
 
   if (Address::CanHoldImmediateOffset(is_load, cid, offset)) {
@@ -3485,8 +3585,8 @@
                                               intptr_t index) {
   const int64_t offset_base =
       (is_external ? 0 : (Instance::DataOffsetFor(cid) - kHeapObjectTag));
-  const int64_t offset = offset_base +
-      static_cast<int64_t>(index) * index_scale;
+  const int64_t offset =
+      offset_base + static_cast<int64_t>(index) * index_scale;
   ASSERT(Utils::IsInt(32, offset));
   AddImmediate(address, array, offset);
 }
@@ -3506,8 +3606,8 @@
   ASSERT(array != IP);
   ASSERT(index != IP);
   const Register base = is_load ? IP : index;
-  if ((offset != 0) ||
-      (size == kSWord) || (size == kDWord) || (size == kRegList)) {
+  if ((offset != 0) || (size == kSWord) || (size == kDWord) ||
+      (size == kRegList)) {
     if (shift < 0) {
       ASSERT(shift == -1);
       add(base, array, Operand(index, ASR, 1));
@@ -3523,12 +3623,8 @@
     }
   }
   int32_t offset_mask = 0;
-  if ((is_load && !Address::CanHoldLoadOffset(size,
-                                              offset,
-                                              &offset_mask)) ||
-      (!is_load && !Address::CanHoldStoreOffset(size,
-                                                offset,
-                                                &offset_mask))) {
+  if ((is_load && !Address::CanHoldLoadOffset(size, offset, &offset_mask)) ||
+      (!is_load && !Address::CanHoldStoreOffset(size, offset, &offset_mask))) {
     AddImmediate(base, offset & ~offset_mask);
     offset = offset & offset_mask;
   }
@@ -3612,8 +3708,8 @@
 
 
 static const char* cpu_reg_names[kNumberOfCpuRegisters] = {
-  "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
-  "r8", "ctx", "pp", "fp", "ip", "sp", "lr", "pc",
+    "r0", "r1",  "r2", "r3", "r4", "r5", "r6", "r7",
+    "r8", "ctx", "pp", "fp", "ip", "sp", "lr", "pc",
 };
 
 
@@ -3624,9 +3720,9 @@
 
 
 static const char* fpu_reg_names[kNumberOfFpuRegisters] = {
-  "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
+    "q0", "q1", "q2",  "q3",  "q4",  "q5",  "q6",  "q7",
 #if defined(VFPv3_D32)
-  "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15",
+    "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15",
 #endif
 };
 
diff --git a/runtime/vm/assembler_arm.h b/runtime/vm/assembler_arm.h
index 735a5f7..049d769 100644
--- a/runtime/vm/assembler_arm.h
+++ b/runtime/vm/assembler_arm.h
@@ -26,17 +26,17 @@
 
 // Instruction encoding bits.
 enum {
-  H   = 1 << 5,   // halfword (or byte)
-  L   = 1 << 20,  // load (or store)
-  S   = 1 << 20,  // set condition code (or leave unchanged)
-  W   = 1 << 21,  // writeback base register (or leave unchanged)
-  A   = 1 << 21,  // accumulate in multiply instruction (or not)
-  B   = 1 << 22,  // unsigned byte (or word)
-  D   = 1 << 22,  // high/lo bit of start of s/d register range
-  N   = 1 << 22,  // long (or short)
-  U   = 1 << 23,  // positive (or negative) offset/index
-  P   = 1 << 24,  // offset/pre-indexed addressing (or post-indexed addressing)
-  I   = 1 << 25,  // immediate shifter operand (or not)
+  H = 1 << 5,   // halfword (or byte)
+  L = 1 << 20,  // load (or store)
+  S = 1 << 20,  // set condition code (or leave unchanged)
+  W = 1 << 21,  // writeback base register (or leave unchanged)
+  A = 1 << 21,  // accumulate in multiply instruction (or not)
+  B = 1 << 22,  // unsigned byte (or word)
+  D = 1 << 22,  // high/lo bit of start of s/d register range
+  N = 1 << 22,  // long (or short)
+  U = 1 << 23,  // positive (or negative) offset/index
+  P = 1 << 24,  // offset/pre-indexed addressing (or post-indexed addressing)
+  I = 1 << 25,  // immediate shifter operand (or not)
 
   B0 = 1,
   B1 = 1 << 1,
@@ -68,7 +68,7 @@
 
 class Label : public ValueObject {
  public:
-  Label() : position_(0) { }
+  Label() : position_(0) {}
 
   ~Label() {
     // Assert if label is being destroyed with unresolved branches pending.
@@ -89,9 +89,7 @@
  private:
   intptr_t position_;
 
-  void Reinitialize() {
-    position_ = 0;
-  }
+  void Reinitialize() { position_ = 0; }
 
   void BindTo(intptr_t position) {
     ASSERT(!IsBound());
@@ -114,11 +112,11 @@
 class Operand : public ValueObject {
  public:
   // Data-processing operands - Uninitialized.
-  Operand() : type_(-1), encoding_(-1) { }
+  Operand() : type_(-1), encoding_(-1) {}
 
   // Data-processing operands - Copy constructor.
   Operand(const Operand& other)
-      : ValueObject(), type_(other.type_), encoding_(other.encoding_) { }
+      : ValueObject(), type_(other.type_), encoding_(other.encoding_) {}
 
   // Data-processing operands - Assignment operator.
   Operand& operator=(const Operand& other) {
@@ -173,7 +171,7 @@
     }
     // Note that immediate must be unsigned for the test to work correctly.
     for (int rot = 0; rot < 16; rot++) {
-      uint32_t imm8 = (immediate << 2*rot) | (immediate >> (32 - 2*rot));
+      uint32_t imm8 = (immediate << 2 * rot) | (immediate >> (32 - 2 * rot));
       if (imm8 < (1 << kImmed8Bits)) {
         o->type_ = 1;
         o->encoding_ = (rot << kRotateShift) | (imm8 << kImmed8Shift);
@@ -221,14 +219,14 @@
 // Load/store multiple addressing mode.
 enum BlockAddressMode {
   // bit encoding P U W
-  DA           = (0|0|0) << 21,  // decrement after
-  IA           = (0|4|0) << 21,  // increment after
-  DB           = (8|0|0) << 21,  // decrement before
-  IB           = (8|4|0) << 21,  // increment before
-  DA_W         = (0|0|1) << 21,  // decrement after with writeback to base
-  IA_W         = (0|4|1) << 21,  // increment after with writeback to base
-  DB_W         = (8|0|1) << 21,  // decrement before with writeback to base
-  IB_W         = (8|4|1) << 21   // increment before with writeback to base
+  DA = (0 | 0 | 0) << 21,    // decrement after
+  IA = (0 | 4 | 0) << 21,    // increment after
+  DB = (8 | 0 | 0) << 21,    // decrement before
+  IB = (8 | 4 | 0) << 21,    // increment before
+  DA_W = (0 | 0 | 1) << 21,  // decrement after with writeback to base
+  IA_W = (0 | 4 | 1) << 21,  // increment after with writeback to base
+  DB_W = (8 | 0 | 1) << 21,  // decrement before with writeback to base
+  IB_W = (8 | 4 | 1) << 21   // increment before with writeback to base
 };
 
 
@@ -242,19 +240,18 @@
 
   // Memory operand addressing mode
   enum Mode {
-    kModeMask    = (8|4|1) << 21,
+    kModeMask = (8 | 4 | 1) << 21,
     // bit encoding P U W
-    Offset       = (8|4|0) << 21,  // offset (w/o writeback to base)
-    PreIndex     = (8|4|1) << 21,  // pre-indexed addressing with writeback
-    PostIndex    = (0|4|0) << 21,  // post-indexed addressing with writeback
-    NegOffset    = (8|0|0) << 21,  // negative offset (w/o writeback to base)
-    NegPreIndex  = (8|0|1) << 21,  // negative pre-indexed with writeback
-    NegPostIndex = (0|0|0) << 21   // negative post-indexed with writeback
+    Offset = (8 | 4 | 0) << 21,       // offset (w/o writeback to base)
+    PreIndex = (8 | 4 | 1) << 21,     // pre-indexed addressing with writeback
+    PostIndex = (0 | 4 | 0) << 21,    // post-indexed addressing with writeback
+    NegOffset = (8 | 0 | 0) << 21,    // negative offset (w/o writeback to base)
+    NegPreIndex = (8 | 0 | 1) << 21,  // negative pre-indexed with writeback
+    NegPostIndex = (0 | 0 | 0) << 21  // negative post-indexed with writeback
   };
 
   Address(const Address& other)
-      : ValueObject(), encoding_(other.encoding_), kind_(other.kind_) {
-  }
+      : ValueObject(), encoding_(other.encoding_), kind_(other.kind_) {}
 
   Address& operator=(const Address& other) {
     encoding_ = other.encoding_;
@@ -281,8 +278,11 @@
   // shifted register case below should be used.
   Address(Register rn, Register r, Mode am);
 
-  Address(Register rn, Register rm,
-          Shift shift = LSL, uint32_t shift_imm = 0, Mode am = Offset) {
+  Address(Register rn,
+          Register rm,
+          Shift shift = LSL,
+          uint32_t shift_imm = 0,
+          Mode am = Offset) {
     Operand o(rm, shift, shift_imm);
 
     if ((shift == LSL) && (shift_imm == 0)) {
@@ -314,9 +314,9 @@
   }
 
   Register rm() const {
-    return ((kind() == IndexRegister) || (kind() == ScaledIndexRegister)) ?
-        Instr::At(reinterpret_cast<uword>(&encoding_))->RmField() :
-        kNoRegister;
+    return ((kind() == IndexRegister) || (kind() == ScaledIndexRegister))
+               ? Instr::At(reinterpret_cast<uword>(&encoding_))->RmField()
+               : kNoRegister;
   }
 
   Mode mode() const { return static_cast<Mode>(encoding() & kModeMask); }
@@ -347,12 +347,12 @@
 class FieldAddress : public Address {
  public:
   FieldAddress(Register base, int32_t disp)
-      : Address(base, disp - kHeapObjectTag) { }
+      : Address(base, disp - kHeapObjectTag) {}
 
   // This addressing mode does not exist.
   FieldAddress(Register base, Register r);
 
-  FieldAddress(const FieldAddress& other) : Address(other) { }
+  FieldAddress(const FieldAddress& other) : Address(other) {}
 
   FieldAddress& operator=(const FieldAddress& other) {
     Address::operator=(other);
@@ -369,10 +369,9 @@
         has_single_entry_point_(true),
         use_far_branches_(use_far_branches),
         comments_(),
-        constant_pool_allowed_(false) {
-  }
+        constant_pool_allowed_(false) {}
 
-  ~Assembler() { }
+  ~Assembler() {}
 
   void PopRegister(Register r) { Pop(r); }
 
@@ -406,9 +405,7 @@
 #if defined(TESTING) || defined(DEBUG)
   // Used in unit tests and to ensure predictable verification code size in
   // FlowGraphCompiler::EmitEdgeCounter.
-  void set_use_far_branches(bool b) {
-    use_far_branches_ = b;
-  }
+  void set_use_far_branches(bool b) { use_far_branches_ = b; }
 #endif  // TESTING || DEBUG
 
   void FinalizeInstructions(const MemoryRegion& region) {
@@ -483,17 +480,35 @@
   // Multiply instructions.
   void mul(Register rd, Register rn, Register rm, Condition cond = AL);
   void muls(Register rd, Register rn, Register rm, Condition cond = AL);
-  void mla(Register rd, Register rn, Register rm, Register ra,
+  void mla(Register rd,
+           Register rn,
+           Register rm,
+           Register ra,
            Condition cond = AL);
-  void mls(Register rd, Register rn, Register rm, Register ra,
+  void mls(Register rd,
+           Register rn,
+           Register rm,
+           Register ra,
            Condition cond = AL);
-  void smull(Register rd_lo, Register rd_hi, Register rn, Register rm,
+  void smull(Register rd_lo,
+             Register rd_hi,
+             Register rn,
+             Register rm,
              Condition cond = AL);
-  void umull(Register rd_lo, Register rd_hi, Register rn, Register rm,
+  void umull(Register rd_lo,
+             Register rd_hi,
+             Register rn,
+             Register rm,
              Condition cond = AL);
-  void smlal(Register rd_lo, Register rd_hi, Register rn, Register rm,
+  void smlal(Register rd_lo,
+             Register rd_hi,
+             Register rn,
+             Register rm,
              Condition cond = AL);
-  void umlal(Register rd_lo, Register rd_hi, Register rn, Register rm,
+  void umlal(Register rd_lo,
+             Register rd_hi,
+             Register rn,
+             Register rm,
              Condition cond = AL);
 
   // Emulation of this instruction uses IP and the condition codes. Therefore,
@@ -522,15 +537,25 @@
   // we don't use them, and we need to split them up into two instructions for
   // ARMv5TE, so we only support the base + offset mode.
   // rd must be an even register and rd2 must be rd + 1.
-  void ldrd(Register rd, Register rd2, Register rn, int32_t offset,
+  void ldrd(Register rd,
+            Register rd2,
+            Register rn,
+            int32_t offset,
             Condition cond = AL);
-  void strd(Register rd, Register rd2, Register rn, int32_t offset,
+  void strd(Register rd,
+            Register rd2,
+            Register rn,
+            int32_t offset,
             Condition cond = AL);
 
-  void ldm(BlockAddressMode am, Register base,
-           RegList regs, Condition cond = AL);
-  void stm(BlockAddressMode am, Register base,
-           RegList regs, Condition cond = AL);
+  void ldm(BlockAddressMode am,
+           Register base,
+           RegList regs,
+           Condition cond = AL);
+  void stm(BlockAddressMode am,
+           Register base,
+           RegList regs,
+           Condition cond = AL);
 
   void ldrex(Register rd, Register rn, Condition cond = AL);
   void strex(Register rd, Register rt, Register rn, Condition cond = AL);
@@ -544,13 +569,11 @@
 
   static int32_t BkptEncoding(uint16_t imm16) {
     // bkpt requires that the cond field is AL.
-    return (AL << kConditionShift) | B24 | B21 |
-           ((imm16 >> 4) << 8) | B6 | B5 | B4 | (imm16 & 0xf);
+    return (AL << kConditionShift) | B24 | B21 | ((imm16 >> 4) << 8) | B6 | B5 |
+           B4 | (imm16 & 0xf);
   }
 
-  static uword GetBreakInstructionFiller() {
-    return BkptEncoding(0);
-  }
+  static uword GetBreakInstructionFiller() { return BkptEncoding(0); }
 
   // Floating point instructions (VFPv3-D16 and VFPv3-D32 profiles).
   void vmovsr(SRegister sn, Register rt, Condition cond = AL);
@@ -573,15 +596,27 @@
   void vldrd(DRegister dd, Address ad, Condition cond = AL);
   void vstrd(DRegister dd, Address ad, Condition cond = AL);
 
-  void vldms(BlockAddressMode am, Register base,
-             SRegister first, SRegister last, Condition cond = AL);
-  void vstms(BlockAddressMode am, Register base,
-             SRegister first, SRegister last, Condition cond = AL);
+  void vldms(BlockAddressMode am,
+             Register base,
+             SRegister first,
+             SRegister last,
+             Condition cond = AL);
+  void vstms(BlockAddressMode am,
+             Register base,
+             SRegister first,
+             SRegister last,
+             Condition cond = AL);
 
-  void vldmd(BlockAddressMode am, Register base,
-             DRegister first, intptr_t count, Condition cond = AL);
-  void vstmd(BlockAddressMode am, Register base,
-             DRegister first, intptr_t count, Condition cond = AL);
+  void vldmd(BlockAddressMode am,
+             Register base,
+             DRegister first,
+             intptr_t count,
+             Condition cond = AL);
+  void vstmd(BlockAddressMode am,
+             Register base,
+             DRegister first,
+             intptr_t count,
+             Condition cond = AL);
 
   void vadds(SRegister sd, SRegister sn, SRegister sm, Condition cond = AL);
   void vaddd(DRegister dd, DRegister dn, DRegister dm, Condition cond = AL);
@@ -694,11 +729,17 @@
 
   // Add signed immediate value to rd. May clobber IP.
   void AddImmediate(Register rd, int32_t value, Condition cond = AL);
-  void AddImmediate(Register rd, Register rn, int32_t value,
+  void AddImmediate(Register rd,
+                    Register rn,
+                    int32_t value,
                     Condition cond = AL);
-  void AddImmediateSetFlags(Register rd, Register rn, int32_t value,
+  void AddImmediateSetFlags(Register rd,
+                            Register rn,
+                            int32_t value,
                             Condition cond = AL);
-  void SubImmediateSetFlags(Register rd, Register rn, int32_t value,
+  void SubImmediateSetFlags(Register rd,
+                            Register rn,
+                            int32_t value,
                             Condition cond = AL);
   void AndImmediate(Register rd, Register rs, int32_t imm, Condition cond = AL);
 
@@ -713,8 +754,11 @@
   // division is supported. If not, uses the FPU for division with
   // temporary registers tmpl and tmpr. tmpl and tmpr must be different
   // registers.
-  void IntegerDivide(Register result, Register left, Register right,
-                     DRegister tmpl, DRegister tmpr);
+  void IntegerDivide(Register result,
+                     Register left,
+                     Register right,
+                     DRegister tmpl,
+                     DRegister tmpr);
 
   // Load and Store.
   // These three do not clobber IP.
@@ -723,8 +767,10 @@
   void LoadImmediate(Register rd, int32_t value, Condition cond = AL);
   // These two may clobber IP.
   void LoadSImmediate(SRegister sd, float value, Condition cond = AL);
-  void LoadDImmediate(DRegister dd, double value,
-                      Register scratch, Condition cond = AL);
+  void LoadDImmediate(DRegister dd,
+                      double value,
+                      Register scratch,
+                      Condition cond = AL);
 
   void MarkExceptionHandler(Label* label);
 
@@ -747,9 +793,9 @@
   void PushObject(const Object& object);
   void CompareObject(Register rn, const Object& object);
 
-  void StoreIntoObject(Register object,  // Object we are storing into.
+  void StoreIntoObject(Register object,      // Object we are storing into.
                        const Address& dest,  // Where we are storing into.
-                       Register value,  // Value we are storing.
+                       Register value,       // Value we are storing.
                        bool can_value_be_smi = true);
   void StoreIntoObjectOffset(Register object,
                              int32_t offset,
@@ -842,12 +888,21 @@
                               Register base,
                               int32_t offset);
 
-  void CopyDoubleField(Register dst, Register src,
-                       Register tmp1, Register tmp2, DRegister dtmp);
-  void CopyFloat32x4Field(Register dst, Register src,
-                          Register tmp1, Register tmp2, DRegister dtmp);
-  void CopyFloat64x2Field(Register dst, Register src,
-                          Register tmp1, Register tmp2, DRegister dtmp);
+  void CopyDoubleField(Register dst,
+                       Register src,
+                       Register tmp1,
+                       Register tmp2,
+                       DRegister dtmp);
+  void CopyFloat32x4Field(Register dst,
+                          Register src,
+                          Register tmp1,
+                          Register tmp2,
+                          DRegister dtmp);
+  void CopyFloat64x2Field(Register dst,
+                          Register src,
+                          Register tmp1,
+                          Register tmp2,
+                          DRegister dtmp);
 
   void Push(Register rd, Condition cond = AL);
   void Pop(Register rd, Condition cond = AL);
@@ -859,18 +914,28 @@
 
   // Convenience shift instructions. Use mov instruction with shifter operand
   // for variants setting the status flags.
-  void Lsl(Register rd, Register rm, const Operand& shift_imm,
+  void Lsl(Register rd,
+           Register rm,
+           const Operand& shift_imm,
            Condition cond = AL);
   void Lsl(Register rd, Register rm, Register rs, Condition cond = AL);
-  void Lsr(Register rd, Register rm, const Operand& shift_imm,
+  void Lsr(Register rd,
+           Register rm,
+           const Operand& shift_imm,
            Condition cond = AL);
   void Lsr(Register rd, Register rm, Register rs, Condition cond = AL);
-  void Asr(Register rd, Register rm, const Operand& shift_imm,
+  void Asr(Register rd,
+           Register rm,
+           const Operand& shift_imm,
            Condition cond = AL);
   void Asr(Register rd, Register rm, Register rs, Condition cond = AL);
-  void Asrs(Register rd, Register rm, const Operand& shift_imm,
+  void Asrs(Register rd,
+            Register rm,
+            const Operand& shift_imm,
             Condition cond = AL);
-  void Ror(Register rd, Register rm, const Operand& shift_imm,
+  void Ror(Register rd,
+           Register rm,
+           const Operand& shift_imm,
            Condition cond = AL);
   void Ror(Register rd, Register rm, Register rs, Condition cond = AL);
   void Rrx(Register rd, Register rm, Condition cond = AL);
@@ -954,8 +1019,7 @@
   // IncrementAllocationStats(WithSize) as stats_addr_reg to update the
   // allocation stats. These are separate assembler macros so we can
   // avoid a dependent load too nearby the load of the table address.
-  void LoadAllocationStatsAddress(Register dest,
-                                  intptr_t cid);
+  void LoadAllocationStatsAddress(Register dest, intptr_t cid);
   void IncrementAllocationStats(Register stats_addr,
                                 intptr_t cid,
                                 Heap::Space space);
@@ -1002,9 +1066,7 @@
 
   // If allocation tracing for |cid| is enabled, will jump to |trace| label,
   // which will allocate in the runtime where tracing occurs.
-  void MaybeTraceAllocation(intptr_t cid,
-                            Register temp_reg,
-                            Label* trace);
+  void MaybeTraceAllocation(intptr_t cid, Register temp_reg, Label* trace);
 
   // Inlined allocation of an instance of class 'cls', code has no runtime
   // calls. Jump to 'failure' if the instance cannot be allocated here.
@@ -1031,12 +1093,8 @@
   static bool IsSafe(const Object& object) { return true; }
   static bool IsSafeSmi(const Object& object) { return object.IsSmi(); }
 
-  bool constant_pool_allowed() const {
-    return constant_pool_allowed_;
-  }
-  void set_constant_pool_allowed(bool b) {
-    constant_pool_allowed_ = b;
-  }
+  bool constant_pool_allowed() const { return constant_pool_allowed_; }
+  void set_constant_pool_allowed(bool b) { constant_pool_allowed_ = b; }
 
  private:
   AssemblerBuffer buffer_;  // Contains position independent code.
@@ -1063,7 +1121,7 @@
   class CodeComment : public ZoneAllocated {
    public:
     CodeComment(intptr_t pc_offset, const String& comment)
-        : pc_offset_(pc_offset), comment_(comment) { }
+        : pc_offset_(pc_offset), comment_(comment) {}
 
     intptr_t pc_offset() const { return pc_offset_; }
     const String& comment() const { return comment_; }
@@ -1095,11 +1153,7 @@
 
   void EmitType5(Condition cond, int32_t offset, bool link);
 
-  void EmitMemOp(Condition cond,
-                 bool load,
-                 bool byte,
-                 Register rd,
-                 Address ad);
+  void EmitMemOp(Condition cond, bool load, bool byte, Register rd, Address ad);
 
   void EmitMemOpAddressMode3(Condition cond,
                              int32_t mode,
@@ -1163,21 +1217,21 @@
                   DRegister dn,
                   DRegister dm);
 
-  void EmitVFPsd(Condition cond,
-                 int32_t opcode,
-                 SRegister sd,
-                 DRegister dm);
+  void EmitVFPsd(Condition cond, int32_t opcode, SRegister sd, DRegister dm);
 
-  void EmitVFPds(Condition cond,
-                 int32_t opcode,
-                 DRegister dd,
-                 SRegister sm);
+  void EmitVFPds(Condition cond, int32_t opcode, DRegister dd, SRegister sm);
 
-  void EmitSIMDqqq(int32_t opcode, OperandSize sz,
-                   QRegister qd, QRegister qn, QRegister qm);
+  void EmitSIMDqqq(int32_t opcode,
+                   OperandSize sz,
+                   QRegister qd,
+                   QRegister qn,
+                   QRegister qm);
 
-  void EmitSIMDddd(int32_t opcode, OperandSize sz,
-                   DRegister dd, DRegister dn, DRegister dm);
+  void EmitSIMDddd(int32_t opcode,
+                   OperandSize sz,
+                   DRegister dd,
+                   DRegister dn,
+                   DRegister dm);
 
   void EmitFarBranch(Condition cond, int32_t offset, bool link);
   void EmitBranch(Condition cond, Label* label, bool link);
diff --git a/runtime/vm/assembler_arm64.cc b/runtime/vm/assembler_arm64.cc
index e7cab40..8f3dc14 100644
--- a/runtime/vm/assembler_arm64.cc
+++ b/runtime/vm/assembler_arm64.cc
@@ -27,8 +27,7 @@
       has_single_entry_point_(true),
       use_far_branches_(use_far_branches),
       comments_(),
-      constant_pool_allowed_(false) {
-}
+      constant_pool_allowed_(false) {}
 
 
 void Assembler::InitializeMemoryWithBreakpoints(uword data, intptr_t length) {
@@ -49,10 +48,9 @@
 
 
 static const char* cpu_reg_names[kNumberOfCpuRegisters] = {
-  "r0",  "r1",  "r2",  "r3",  "r4",  "r5",  "r6",  "r7",
-  "r8",  "r9",  "r10", "r11", "r12", "r13", "r14", "r15",
-  "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
-  "r24", "ip0", "ip1", "pp",  "ctx", "fp",  "lr",  "r31",
+    "r0",  "r1",  "r2",  "r3",  "r4",  "r5",  "r6",  "r7",  "r8",  "r9",  "r10",
+    "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
+    "r22", "r23", "r24", "ip0", "ip1", "pp",  "ctx", "fp",  "lr",  "r31",
 };
 
 
@@ -63,10 +61,9 @@
 
 
 static const char* fpu_reg_names[kNumberOfFpuRegisters] = {
-  "v0",  "v1",  "v2",  "v3",  "v4",  "v5",  "v6",  "v7",
-  "v8",  "v9",  "v10", "v11", "v12", "v13", "v14", "v15",
-  "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
-  "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
+    "v0",  "v1",  "v2",  "v3",  "v4",  "v5",  "v6",  "v7",  "v8",  "v9",  "v10",
+    "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
+    "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
 };
 
 
@@ -136,14 +133,14 @@
       int32_t encoded_guard_branch =
           EncodeImm19BranchOffset(dest, guard_branch);
       const Condition c = DecodeImm19BranchCondition(encoded_guard_branch);
-      encoded_guard_branch = EncodeImm19BranchCondition(
-          InvertCondition(c), encoded_guard_branch);
+      encoded_guard_branch =
+          EncodeImm19BranchCondition(InvertCondition(c), encoded_guard_branch);
 
       // Write back the re-encoded instructions. The far branch becomes a nop.
-      buffer_.Store<int32_t>(
-          position + 0 * Instr::kInstrSize, encoded_guard_branch);
-      buffer_.Store<int32_t>(
-          position + 1 * Instr::kInstrSize, Instr::kNopInstruction);
+      buffer_.Store<int32_t>(position + 0 * Instr::kInstrSize,
+                             encoded_guard_branch);
+      buffer_.Store<int32_t>(position + 1 * Instr::kInstrSize,
+                             Instr::kNopInstruction);
       label->position_ = next;
     } else {
       const int32_t next = buffer_.Load<int32_t>(position);
@@ -184,7 +181,7 @@
 
 static int CountOneBits(uint64_t value, int width) {
   // Mask out unused bits to ensure that they are not counted.
-  value &= (0xffffffffffffffffUL >> (64-width));
+  value &= (0xffffffffffffffffUL >> (64 - width));
 
   value = ((value >> 1) & 0x5555555555555555) + (value & 0x5555555555555555);
   value = ((value >> 2) & 0x3333333333333333) + (value & 0x3333333333333333);
@@ -382,8 +379,7 @@
 }
 
 
-void Assembler::LoadNativeEntry(Register dst,
-                                const ExternalLabel* label) {
+void Assembler::LoadNativeEntry(Register dst, const ExternalLabel* label) {
   const int32_t offset = ObjectPool::element_offset(
       object_pool_wrapper_.FindNativeEntry(label, kNotPatchable));
   LoadWordFromPoolOffset(dst, offset);
@@ -741,8 +737,10 @@
 }
 
 
-void Assembler::LoadFromOffset(
-    Register dest, Register base, int32_t offset, OperandSize sz) {
+void Assembler::LoadFromOffset(Register dest,
+                               Register base,
+                               int32_t offset,
+                               OperandSize sz) {
   if (Address::CanHoldOffset(offset, Address::Offset, sz)) {
     ldr(dest, Address(base, offset, Address::Offset, sz), sz);
   } else {
@@ -775,8 +773,10 @@
 }
 
 
-void Assembler::StoreToOffset(
-    Register src, Register base, int32_t offset, OperandSize sz) {
+void Assembler::StoreToOffset(Register src,
+                              Register base,
+                              int32_t offset,
+                              OperandSize sz) {
   ASSERT(base != TMP2);
   if (Address::CanHoldOffset(offset, Address::Offset, sz)) {
     str(src, Address(base, offset, Address::Offset, sz), sz);
@@ -832,9 +832,9 @@
   vrsqrtes(vd, vn);
   // 2 Newton-Raphson steps. xn+1 = xn * (3 - V1*xn^2) / 2.
   // First step.
-  vmuls(VTMP, vd, vd);  // VTMP <- xn^2
+  vmuls(VTMP, vd, vd);       // VTMP <- xn^2
   vrsqrtss(VTMP, vn, VTMP);  // VTMP <- (3 - V1*VTMP) / 2.
-  vmuls(vd, vd, VTMP);  // xn+1 <- xn * VTMP
+  vmuls(vd, vd, VTMP);       // xn+1 <- xn * VTMP
   // Second step.
   vmuls(VTMP, vd, vd);
   vrsqrtss(VTMP, vn, VTMP);
@@ -842,7 +842,6 @@
 }
 
 
-
 // Store into object.
 // Preserves object and value registers.
 void Assembler::StoreIntoObjectFilterNoSmi(Register object,
@@ -880,8 +879,8 @@
                                       Register value,
                                       bool can_value_be_smi) {
   if (Address::CanHoldOffset(offset - kHeapObjectTag)) {
-    StoreIntoObject(
-        object, FieldAddress(object, offset), value, can_value_be_smi);
+    StoreIntoObject(object, FieldAddress(object, offset), value,
+                    can_value_be_smi);
   } else {
     AddImmediate(TMP, object, offset - kHeapObjectTag);
     StoreIntoObject(object, Address(TMP), value, can_value_be_smi);
@@ -976,8 +975,8 @@
 void Assembler::LoadClassId(Register result, Register object) {
   ASSERT(RawObject::kClassIdTagPos == kBitsPerInt32);
   ASSERT(RawObject::kClassIdTagSize == kBitsPerInt32);
-  const intptr_t class_id_offset = Object::tags_offset() +
-      RawObject::kClassIdTagPos / kBitsPerByte;
+  const intptr_t class_id_offset =
+      Object::tags_offset() + RawObject::kClassIdTagPos / kBitsPerByte;
   LoadFromOffset(result, object, class_id_offset - kHeapObjectTag,
                  kUnsignedWord);
 }
@@ -1290,8 +1289,7 @@
 }
 
 
-void Assembler::UpdateAllocationStats(intptr_t cid,
-                                      Heap::Space space) {
+void Assembler::UpdateAllocationStats(intptr_t cid, Heap::Space space) {
   ASSERT(cid > 0);
   intptr_t counter_offset =
       ClassTable::CounterOffsetFor(cid, space == Heap::kNew);
@@ -1311,12 +1309,14 @@
                                               Heap::Space space) {
   ASSERT(cid > 0);
   const uword class_offset = ClassTable::ClassOffsetFor(cid);
-  const uword count_field_offset = (space == Heap::kNew) ?
-    ClassHeapStats::allocated_since_gc_new_space_offset() :
-    ClassHeapStats::allocated_since_gc_old_space_offset();
-  const uword size_field_offset = (space == Heap::kNew) ?
-    ClassHeapStats::allocated_size_since_gc_new_space_offset() :
-    ClassHeapStats::allocated_size_since_gc_old_space_offset();
+  const uword count_field_offset =
+      (space == Heap::kNew)
+          ? ClassHeapStats::allocated_since_gc_new_space_offset()
+          : ClassHeapStats::allocated_since_gc_old_space_offset();
+  const uword size_field_offset =
+      (space == Heap::kNew)
+          ? ClassHeapStats::allocated_size_since_gc_new_space_offset()
+          : ClassHeapStats::allocated_size_since_gc_old_space_offset();
   LoadIsolate(TMP2);
   intptr_t table_offset =
       Isolate::class_table_offset() + ClassTable::TableOffsetFor(cid);
@@ -1360,8 +1360,7 @@
     str(instance_reg, Address(temp_reg, Heap::TopOffset(space)));
 
     ASSERT(instance_size >= kHeapObjectTag);
-    AddImmediate(
-        instance_reg, instance_reg, -instance_size + kHeapObjectTag);
+    AddImmediate(instance_reg, instance_reg, -instance_size + kHeapObjectTag);
     NOT_IN_PRODUCT(UpdateAllocationStats(cls.id(), space));
 
     uword tags = 0;
@@ -1427,7 +1426,8 @@
                                              intptr_t index_scale,
                                              Register array,
                                              intptr_t index) const {
-  const int64_t offset = index * index_scale +
+  const int64_t offset =
+      index * index_scale +
       (is_external ? 0 : (Instance::DataOffsetFor(cid) - kHeapObjectTag));
   ASSERT(Utils::IsInt(32, offset));
   const OperandSize size = Address::OperandSizeFor(cid);
@@ -1442,7 +1442,8 @@
                                               intptr_t index_scale,
                                               Register array,
                                               intptr_t index) {
-  const int64_t offset = index * index_scale +
+  const int64_t offset =
+      index * index_scale +
       (is_external ? 0 : (Instance::DataOffsetFor(cid) - kHeapObjectTag));
   AddImmediate(address, array, offset);
 }
@@ -1500,7 +1501,9 @@
 }
 
 
-void Assembler::LoadUnaligned(Register dst, Register addr, Register tmp,
+void Assembler::LoadUnaligned(Register dst,
+                              Register addr,
+                              Register tmp,
                               OperandSize sz) {
   ASSERT(dst != addr);
   ldr(dst, Address(addr, 0), kUnsignedByte);
@@ -1541,7 +1544,9 @@
 }
 
 
-void Assembler::StoreUnaligned(Register src, Register addr, Register tmp,
+void Assembler::StoreUnaligned(Register src,
+                               Register addr,
+                               Register tmp,
                                OperandSize sz) {
   str(src, Address(addr, 0), kUnsignedByte);
   LsrImmediate(tmp, src, 8);
diff --git a/runtime/vm/assembler_arm64.h b/runtime/vm/assembler_arm64.h
index 4ef4f95..f87f76d 100644
--- a/runtime/vm/assembler_arm64.h
+++ b/runtime/vm/assembler_arm64.h
@@ -25,9 +25,9 @@
 
 class Immediate : public ValueObject {
  public:
-  explicit Immediate(int64_t value) : value_(value) { }
+  explicit Immediate(int64_t value) : value_(value) {}
 
-  Immediate(const Immediate& other) : ValueObject(), value_(other.value_) { }
+  Immediate(const Immediate& other) : ValueObject(), value_(other.value_) {}
   Immediate& operator=(const Immediate& other) {
     value_ = other.value_;
     return *this;
@@ -44,7 +44,7 @@
 
 class Label : public ValueObject {
  public:
-  Label() : position_(0) { }
+  Label() : position_(0) {}
 
   ~Label() {
     // Assert if label is being destroyed with unresolved branches pending.
@@ -65,9 +65,7 @@
  private:
   intptr_t position_;
 
-  void Reinitialize() {
-    position_ = 0;
-  }
+  void Reinitialize() { position_ = 0; }
 
   void BindTo(intptr_t position) {
     ASSERT(!IsBound());
@@ -92,8 +90,7 @@
       : ValueObject(),
         encoding_(other.encoding_),
         type_(other.type_),
-        base_(other.base_) {
-  }
+        base_(other.base_) {}
 
   Address& operator=(const Address& other) {
     encoding_ = other.encoding_;
@@ -118,31 +115,26 @@
   // operand size, and assert that offset is aligned accordingly.
   // For the smaller signed imm9 case, the offset is the number of bytes, but
   // is unscaled.
-  Address(Register rn, int32_t offset = 0, AddressType at = Offset,
+  Address(Register rn,
+          int32_t offset = 0,
+          AddressType at = Offset,
           OperandSize sz = kDoubleWord) {
     ASSERT((rn != kNoRegister) && (rn != R31) && (rn != ZR));
     ASSERT(CanHoldOffset(offset, at, sz));
     const Register crn = ConcreteRegister(rn);
     const int32_t scale = Log2OperandSizeBytes(sz);
-    if ((at == Offset) &&
-         Utils::IsUint(12 + scale, offset) &&
+    if ((at == Offset) && Utils::IsUint(12 + scale, offset) &&
         (offset == ((offset >> scale) << scale))) {
-      encoding_ =
-          B24 |
-          ((offset >> scale) << kImm12Shift) |
-          (static_cast<int32_t>(crn) << kRnShift);
-    } else if ((at == Offset) &&
-               Utils::IsInt(9, offset)) {
-      encoding_ =
-          ((offset & 0x1ff) << kImm9Shift) |
-          (static_cast<int32_t>(crn) << kRnShift);
+      encoding_ = B24 | ((offset >> scale) << kImm12Shift) |
+                  (static_cast<int32_t>(crn) << kRnShift);
+    } else if ((at == Offset) && Utils::IsInt(9, offset)) {
+      encoding_ = ((offset & 0x1ff) << kImm9Shift) |
+                  (static_cast<int32_t>(crn) << kRnShift);
     } else if ((at == PreIndex) || (at == PostIndex)) {
       ASSERT(Utils::IsInt(9, offset));
       int32_t idx = (at == PostIndex) ? B10 : (B11 | B10);
-      encoding_ =
-          idx |
-          ((offset & 0x1ff) << kImm9Shift) |
-          (static_cast<int32_t>(crn) << kRnShift);
+      encoding_ = idx | ((offset & 0x1ff) << kImm9Shift) |
+                  (static_cast<int32_t>(crn) << kRnShift);
     } else {
       ASSERT((at == PairOffset) || (at == PairPreIndex) ||
              (at == PairPostIndex));
@@ -150,25 +142,34 @@
              (offset == ((offset >> scale) << scale)));
       int32_t idx = 0;
       switch (at) {
-        case PairPostIndex: idx = B23; break;
-        case PairPreIndex: idx = B24 | B23; break;
-        case PairOffset: idx = B24; break;
-        default: UNREACHABLE(); break;
+        case PairPostIndex:
+          idx = B23;
+          break;
+        case PairPreIndex:
+          idx = B24 | B23;
+          break;
+        case PairOffset:
+          idx = B24;
+          break;
+        default:
+          UNREACHABLE();
+          break;
       }
-      encoding_ =
-        idx |
-        (((offset >> scale) << kImm7Shift) & kImm7Mask) |
-        (static_cast<int32_t>(crn) << kRnShift);
+      encoding_ = idx | (((offset >> scale) << kImm7Shift) & kImm7Mask) |
+                  (static_cast<int32_t>(crn) << kRnShift);
     }
     type_ = at;
     base_ = crn;
   }
 
   // This addressing mode does not exist.
-  Address(Register rn, Register offset, AddressType at,
+  Address(Register rn,
+          Register offset,
+          AddressType at,
           OperandSize sz = kDoubleWord);
 
-  static bool CanHoldOffset(int32_t offset, AddressType at = Offset,
+  static bool CanHoldOffset(int32_t offset,
+                            AddressType at = Offset,
                             OperandSize sz = kDoubleWord) {
     if (at == Offset) {
       // Offset fits in 12 bit unsigned and has right alignment for sz,
@@ -178,8 +179,7 @@
               (offset == ((offset >> scale) << scale))) ||
              (Utils::IsInt(9, offset));
     } else if (at == PCOffset) {
-      return Utils::IsInt(21, offset) &&
-             (offset == ((offset >> 2) << 2));
+      return Utils::IsInt(21, offset) && (offset == ((offset >> 2) << 2));
     } else if ((at == PreIndex) || (at == PostIndex)) {
       return Utils::IsInt(9, offset);
     } else {
@@ -219,8 +219,10 @@
   // Base register rn with offset rm. rm is sign-extended according to ext.
   // If ext is UXTX, rm may be optionally scaled by the
   // Log2OperandSize (specified by the instruction).
-  Address(Register rn, Register rm,
-          Extend ext = UXTX, Scaling scale = Unscaled) {
+  Address(Register rn,
+          Register rm,
+          Extend ext = UXTX,
+          Scaling scale = Unscaled) {
     ASSERT((rn != R31) && (rn != ZR));
     ASSERT((rm != R31) && (rm != CSP));
     // Can only scale when ext = UXTX.
@@ -229,11 +231,9 @@
     const Register crn = ConcreteRegister(rn);
     const Register crm = ConcreteRegister(rm);
     const int32_t s = (scale == Scaled) ? B12 : 0;
-    encoding_ =
-        B21 | B11 | s |
-        (static_cast<int32_t>(crn) << kRnShift) |
-        (static_cast<int32_t>(crm) << kRmShift) |
-        (static_cast<int32_t>(ext) << kExtendTypeShift);
+    encoding_ = B21 | B11 | s | (static_cast<int32_t>(crn) << kRnShift) |
+                (static_cast<int32_t>(crm) << kRmShift) |
+                (static_cast<int32_t>(ext) << kExtendTypeShift);
     type_ = Reg;
     base_ = crn;
   }
@@ -303,12 +303,12 @@
 class FieldAddress : public Address {
  public:
   FieldAddress(Register base, int32_t disp, OperandSize sz = kDoubleWord)
-      : Address(base, disp - kHeapObjectTag, Offset, sz) { }
+      : Address(base, disp - kHeapObjectTag, Offset, sz) {}
 
   // This addressing mode does not exist.
   FieldAddress(Register base, Register disp, OperandSize sz = kDoubleWord);
 
-  FieldAddress(const FieldAddress& other) : Address(other) { }
+  FieldAddress(const FieldAddress& other) : Address(other) {}
 
   FieldAddress& operator=(const FieldAddress& other) {
     Address::operator=(other);
@@ -328,11 +328,11 @@
   };
 
   // Data-processing operand - Uninitialized.
-  Operand() : encoding_(-1), type_(Unknown) { }
+  Operand() : encoding_(-1), type_(Unknown) {}
 
   // Data-processing operands - Copy constructor.
   Operand(const Operand& other)
-      : ValueObject(), encoding_(other.encoding_), type_(other.type_) { }
+      : ValueObject(), encoding_(other.encoding_), type_(other.type_) {}
 
   Operand& operator=(const Operand& other) {
     type_ = other.type_;
@@ -351,10 +351,8 @@
     ASSERT(Utils::IsUint(6, imm));
     ASSERT((rm != R31) && (rm != CSP));
     const Register crm = ConcreteRegister(rm);
-    encoding_ =
-        (imm << kImm6Shift) |
-        (static_cast<int32_t>(crm) << kRmShift) |
-        (static_cast<int32_t>(shift) << kShiftTypeShift);
+    encoding_ = (imm << kImm6Shift) | (static_cast<int32_t>(crm) << kRmShift) |
+                (static_cast<int32_t>(shift) << kShiftTypeShift);
     type_ = Shifted;
   }
 
@@ -365,11 +363,9 @@
     ASSERT(Utils::IsUint(3, imm));
     ASSERT((rm != R31) && (rm != CSP));
     const Register crm = ConcreteRegister(rm);
-    encoding_ =
-        B21 |
-        (static_cast<int32_t>(crm) << kRmShift) |
-        (static_cast<int32_t>(extend) << kExtendTypeShift) |
-        ((imm & 0x7) << kImm3Shift);
+    encoding_ = B21 | (static_cast<int32_t>(crm) << kRmShift) |
+                (static_cast<int32_t>(extend) << kExtendTypeShift) |
+                ((imm & 0x7) << kImm3Shift);
     type_ = Extended;
   }
 
@@ -395,10 +391,9 @@
     ASSERT((n == 1) || (n == 0));
     ASSERT(Utils::IsUint(6, imm_s) && Utils::IsUint(6, imm_r));
     type_ = BitfieldImm;
-    encoding_ =
-      (static_cast<int32_t>(n) << kNShift) |
-      (static_cast<int32_t>(imm_s) << kImmSShift) |
-      (static_cast<int32_t>(imm_r) << kImmRShift);
+    encoding_ = (static_cast<int32_t>(n) << kNShift) |
+                (static_cast<int32_t>(imm_s) << kImmSShift) |
+                (static_cast<int32_t>(imm_r) << kImmRShift);
   }
 
   // Test if a given value can be encoded in the immediate field of a logical
@@ -434,12 +429,8 @@
   }
 
  private:
-  uint32_t encoding() const {
-    return encoding_;
-  }
-  OperandType type() const {
-    return type_;
-  }
+  uint32_t encoding() const { return encoding_; }
+  OperandType type() const { return type_; }
 
   uint32_t encoding_;
   OperandType type_;
@@ -451,11 +442,9 @@
 class Assembler : public ValueObject {
  public:
   explicit Assembler(bool use_far_branches = false);
-  ~Assembler() { }
+  ~Assembler() {}
 
-  void PopRegister(Register r) {
-    Pop(r);
-  }
+  void PopRegister(Register r) { Pop(r); }
 
   void Drop(intptr_t stack_elements) {
     add(SP, SP, Operand(stack_elements * kWordSize));
@@ -488,9 +477,7 @@
     return FLAG_use_far_branches || use_far_branches_;
   }
 
-  void set_use_far_branches(bool b) {
-    use_far_branches_ = b;
-  }
+  void set_use_far_branches(bool b) { use_far_branches_ = b; }
 
   void FinalizeInstructions(const MemoryRegion& region) {
     buffer_.FinalizeInstructions(region);
@@ -592,9 +579,7 @@
   }
 
   // PC relative immediate add. imm is in bytes.
-  void adr(Register rd, const Immediate& imm) {
-    EmitPCRelOp(ADR, rd, imm);
-  }
+  void adr(Register rd, const Immediate& imm) { EmitPCRelOp(ADR, rd, imm); }
 
   // Logical immediate operations.
   void andi(Register rd, Register rn, const Immediate& imm) {
@@ -800,13 +785,9 @@
   // rn cmp o.
   // For add and sub, to use CSP for rn, o must be of type Operand::Extend.
   // For an unmodified rm in this case, use Operand(rm, UXTX, 0);
-  void cmp(Register rn, Operand o) {
-    subs(ZR, rn, o);
-  }
+  void cmp(Register rn, Operand o) { subs(ZR, rn, o); }
   // rn cmp -o.
-  void cmn(Register rn, Operand o) {
-    adds(ZR, rn, o);
-  }
+  void cmn(Register rn, Operand o) { adds(ZR, rn, o); }
 
   void CompareRegisters(Register rn, Register rm) {
     if (rn == CSP) {
@@ -823,12 +804,8 @@
     EmitConditionalBranch(BCOND, cond, label);
   }
 
-  void b(int32_t offset) {
-    EmitUnconditionalBranchOp(B, offset);
-  }
-  void bl(int32_t offset) {
-    EmitUnconditionalBranchOp(BL, offset);
-  }
+  void b(int32_t offset) { EmitUnconditionalBranchOp(B, offset); }
+  void bl(int32_t offset) { EmitUnconditionalBranchOp(BL, offset); }
 
   void cbz(Label* label, Register rt, OperandSize sz = kDoubleWord) {
     EmitCompareAndBranch(CBZ, rt, label, sz);
@@ -839,20 +816,12 @@
   }
 
   // Branch, link, return.
-  void br(Register rn) {
-    EmitUnconditionalBranchRegOp(BR, rn);
-  }
-  void blr(Register rn) {
-    EmitUnconditionalBranchRegOp(BLR, rn);
-  }
-  void ret(Register rn = R30) {
-    EmitUnconditionalBranchRegOp(RET, rn);
-  }
+  void br(Register rn) { EmitUnconditionalBranchRegOp(BR, rn); }
+  void blr(Register rn) { EmitUnconditionalBranchRegOp(BLR, rn); }
+  void ret(Register rn = R30) { EmitUnconditionalBranchRegOp(RET, rn); }
 
   // Breakpoint.
-  void brk(uint16_t imm) {
-    EmitExceptionGenOp(BRK, imm);
-  }
+  void brk(uint16_t imm) { EmitExceptionGenOp(BRK, imm); }
 
   static uword GetBreakInstructionFiller() {
     const intptr_t encoding = ExceptionGenOpEncoding(BRK, 0);
@@ -904,24 +873,12 @@
     const Register crd = ConcreteRegister(rd);
     EmitFPIntCvtOp(FCVTZDS, crd, static_cast<Register>(vn));
   }
-  void fmovdd(VRegister vd, VRegister vn) {
-    EmitFPOneSourceOp(FMOVDD, vd, vn);
-  }
-  void fabsd(VRegister vd, VRegister vn) {
-    EmitFPOneSourceOp(FABSD, vd, vn);
-  }
-  void fnegd(VRegister vd, VRegister vn) {
-    EmitFPOneSourceOp(FNEGD, vd, vn);
-  }
-  void fsqrtd(VRegister vd, VRegister vn) {
-    EmitFPOneSourceOp(FSQRTD, vd, vn);
-  }
-  void fcvtsd(VRegister vd, VRegister vn) {
-    EmitFPOneSourceOp(FCVTSD, vd, vn);
-  }
-  void fcvtds(VRegister vd, VRegister vn) {
-    EmitFPOneSourceOp(FCVTDS, vd, vn);
-  }
+  void fmovdd(VRegister vd, VRegister vn) { EmitFPOneSourceOp(FMOVDD, vd, vn); }
+  void fabsd(VRegister vd, VRegister vn) { EmitFPOneSourceOp(FABSD, vd, vn); }
+  void fnegd(VRegister vd, VRegister vn) { EmitFPOneSourceOp(FNEGD, vd, vn); }
+  void fsqrtd(VRegister vd, VRegister vn) { EmitFPOneSourceOp(FSQRTD, vd, vn); }
+  void fcvtsd(VRegister vd, VRegister vn) { EmitFPOneSourceOp(FCVTSD, vd, vn); }
+  void fcvtds(VRegister vd, VRegister vn) { EmitFPOneSourceOp(FCVTDS, vd, vn); }
   void fldrq(VRegister vt, Address a) {
     ASSERT(a.type() != Address::PCOffset);
     EmitLoadStoreReg(FLDRQ, static_cast<Register>(vt), a, kByte);
@@ -946,12 +903,8 @@
     ASSERT(a.type() != Address::PCOffset);
     EmitLoadStoreReg(FSTR, static_cast<Register>(vt), a, kSWord);
   }
-  void fcmpd(VRegister vn, VRegister vm) {
-    EmitFPCompareOp(FCMPD, vn, vm);
-  }
-  void fcmpdz(VRegister vn) {
-    EmitFPCompareOp(FCMPZD, vn, V0);
-  }
+  void fcmpd(VRegister vn, VRegister vm) { EmitFPCompareOp(FCMPD, vn, vm); }
+  void fcmpdz(VRegister vn) { EmitFPCompareOp(FCMPZD, vn, V0); }
   void fmuld(VRegister vd, VRegister vn, VRegister vm) {
     EmitFPTwoSourceOp(FMULD, vd, vn, vm);
   }
@@ -1047,27 +1000,13 @@
   void vrsqrtss(VRegister vd, VRegister vn, VRegister vm) {
     EmitSIMDThreeSameOp(VRSQRTSS, vd, vn, vm);
   }
-  void vnot(VRegister vd, VRegister vn) {
-    EmitSIMDTwoRegOp(VNOT, vd, vn);
-  }
-  void vabss(VRegister vd, VRegister vn) {
-    EmitSIMDTwoRegOp(VABSS, vd, vn);
-  }
-  void vabsd(VRegister vd, VRegister vn) {
-    EmitSIMDTwoRegOp(VABSD, vd, vn);
-  }
-  void vnegs(VRegister vd, VRegister vn) {
-    EmitSIMDTwoRegOp(VNEGS, vd, vn);
-  }
-  void vnegd(VRegister vd, VRegister vn) {
-    EmitSIMDTwoRegOp(VNEGD, vd, vn);
-  }
-  void vsqrts(VRegister vd, VRegister vn) {
-    EmitSIMDTwoRegOp(VSQRTS, vd, vn);
-  }
-  void vsqrtd(VRegister vd, VRegister vn) {
-    EmitSIMDTwoRegOp(VSQRTD, vd, vn);
-  }
+  void vnot(VRegister vd, VRegister vn) { EmitSIMDTwoRegOp(VNOT, vd, vn); }
+  void vabss(VRegister vd, VRegister vn) { EmitSIMDTwoRegOp(VABSS, vd, vn); }
+  void vabsd(VRegister vd, VRegister vn) { EmitSIMDTwoRegOp(VABSD, vd, vn); }
+  void vnegs(VRegister vd, VRegister vn) { EmitSIMDTwoRegOp(VNEGS, vd, vn); }
+  void vnegd(VRegister vd, VRegister vn) { EmitSIMDTwoRegOp(VNEGD, vd, vn); }
+  void vsqrts(VRegister vd, VRegister vn) { EmitSIMDTwoRegOp(VSQRTS, vd, vn); }
+  void vsqrtd(VRegister vd, VRegister vn) { EmitSIMDTwoRegOp(VSQRTD, vd, vn); }
   void vrecpes(VRegister vd, VRegister vn) {
     EmitSIMDTwoRegOp(VRECPES, vd, vn);
   }
@@ -1119,21 +1058,11 @@
       orr(rd, ZR, Operand(rn));
     }
   }
-  void vmov(VRegister vd, VRegister vn) {
-    vorr(vd, vn, vn);
-  }
-  void mvn(Register rd, Register rm) {
-    orn(rd, ZR, Operand(rm));
-  }
-  void neg(Register rd, Register rm) {
-    sub(rd, ZR, Operand(rm));
-  }
-  void negs(Register rd, Register rm) {
-    subs(rd, ZR, Operand(rm));
-  }
-  void mul(Register rd, Register rn, Register rm) {
-    madd(rd, rn, rm, ZR);
-  }
+  void vmov(VRegister vd, VRegister vn) { vorr(vd, vn, vn); }
+  void mvn(Register rd, Register rm) { orn(rd, ZR, Operand(rm)); }
+  void neg(Register rd, Register rm) { sub(rd, ZR, Operand(rm)); }
+  void negs(Register rd, Register rm) { subs(rd, ZR, Operand(rm)); }
+  void mul(Register rd, Register rn, Register rm) { madd(rd, rn, rm, ZR); }
   void Push(Register reg) {
     ASSERT(reg != PP);  // Only push PP with TagAndPushPP().
     str(reg, Address(SP, -1 * kWordSize, Address::PreIndex));
@@ -1177,8 +1106,7 @@
     COMPILE_ASSERT(CODE_REG != TMP2);
     // Add the heap object tag back to PP before putting it on the stack.
     add(TMP2, PP, Operand(kHeapObjectTag));
-    stp(TMP2, CODE_REG,
-        Address(SP, -2 * kWordSize, Address::PairPreIndex));
+    stp(TMP2, CODE_REG, Address(SP, -2 * kWordSize, Address::PairPreIndex));
   }
   void PopAndUntagPP() {
     ldr(PP, Address(SP, 1 * kWordSize, Address::PostIndex));
@@ -1186,12 +1114,8 @@
     // The caller of PopAndUntagPP() must explicitly allow use of popped PP.
     set_constant_pool_allowed(false);
   }
-  void tst(Register rn, Operand o) {
-    ands(ZR, rn, o);
-  }
-  void tsti(Register rn, const Immediate& imm) {
-    andis(ZR, rn, imm);
-  }
+  void tst(Register rn, Operand o) { ands(ZR, rn, o); }
+  void tsti(Register rn, const Immediate& imm) { andis(ZR, rn, imm); }
 
   void LslImmediate(Register rd, Register rn, int shift) {
     add(rd, ZR, Operand(rn, LSL, shift));
@@ -1206,15 +1130,11 @@
   void VRecps(VRegister vd, VRegister vn);
   void VRSqrts(VRegister vd, VRegister vn);
 
-  void SmiUntag(Register reg) {
-    AsrImmediate(reg, reg, kSmiTagSize);
-  }
+  void SmiUntag(Register reg) { AsrImmediate(reg, reg, kSmiTagSize); }
   void SmiUntag(Register dst, Register src) {
     AsrImmediate(dst, src, kSmiTagSize);
   }
-  void SmiTag(Register reg) {
-    LslImmediate(reg, reg, kSmiTagSize);
-  }
+  void SmiTag(Register reg) { LslImmediate(reg, reg, kSmiTagSize); }
   void SmiTag(Register dst, Register src) {
     LslImmediate(dst, src, kSmiTagSize);
   }
@@ -1253,9 +1173,13 @@
   void TestImmediate(Register rn, int64_t imm);
   void CompareImmediate(Register rn, int64_t imm);
 
-  void LoadFromOffset(Register dest, Register base, int32_t offset,
+  void LoadFromOffset(Register dest,
+                      Register base,
+                      int32_t offset,
                       OperandSize sz = kDoubleWord);
-  void LoadFieldFromOffset(Register dest, Register base, int32_t offset,
+  void LoadFieldFromOffset(Register dest,
+                           Register base,
+                           int32_t offset,
                            OperandSize sz = kDoubleWord) {
     LoadFromOffset(dest, base, offset - kHeapObjectTag, sz);
   }
@@ -1268,9 +1192,13 @@
     LoadQFromOffset(dest, base, offset - kHeapObjectTag);
   }
 
-  void StoreToOffset(Register src, Register base, int32_t offset,
+  void StoreToOffset(Register src,
+                     Register base,
+                     int32_t offset,
                      OperandSize sz = kDoubleWord);
-  void StoreFieldToOffset(Register src, Register base, int32_t offset,
+  void StoreFieldToOffset(Register src,
+                          Register base,
+                          int32_t offset,
                           OperandSize sz = kDoubleWord) {
     StoreToOffset(src, base, offset - kHeapObjectTag, sz);
   }
@@ -1308,12 +1236,8 @@
   // Object pool, loading from pool, etc.
   void LoadPoolPointer(Register pp = PP);
 
-  bool constant_pool_allowed() const {
-    return constant_pool_allowed_;
-  }
-  void set_constant_pool_allowed(bool b) {
-    constant_pool_allowed_ = b;
-  }
+  bool constant_pool_allowed() const { return constant_pool_allowed_; }
+  void set_constant_pool_allowed(bool b) { constant_pool_allowed_ = b; }
 
   intptr_t FindImmediate(int64_t imm);
   bool CanLoadFromObjectPool(const Object& object) const;
@@ -1366,8 +1290,7 @@
 
   void MonomorphicCheckedEntry();
 
-  void UpdateAllocationStats(intptr_t cid,
-                             Heap::Space space);
+  void UpdateAllocationStats(intptr_t cid, Heap::Space space);
 
   void UpdateAllocationStatsWithSize(intptr_t cid,
                                      Register size_reg,
@@ -1375,9 +1298,7 @@
 
   // If allocation tracing for |cid| is enabled, will jump to |trace| label,
   // which will allocate in the runtime where tracing occurs.
-  void MaybeTraceAllocation(intptr_t cid,
-                            Register temp_reg,
-                            Label* trace);
+  void MaybeTraceAllocation(intptr_t cid, Register temp_reg, Label* trace);
 
   // Inlined allocation of an instance of class 'cls', code has no runtime
   // calls. Jump to 'failure' if the instance cannot be allocated here.
@@ -1421,9 +1342,10 @@
                                      Register array,
                                      Register index);
 
-  void LoadUnaligned(Register dst, Register addr, Register tmp,
-                     OperandSize sz);
-  void StoreUnaligned(Register src, Register addr, Register tmp,
+  void LoadUnaligned(Register dst, Register addr, Register tmp, OperandSize sz);
+  void StoreUnaligned(Register src,
+                      Register addr,
+                      Register tmp,
                       OperandSize sz);
 
  private:
@@ -1436,7 +1358,7 @@
   class CodeComment : public ZoneAllocated {
    public:
     CodeComment(intptr_t pc_offset, const String& comment)
-        : pc_offset_(pc_offset), comment_(comment) { }
+        : pc_offset_(pc_offset), comment_(comment) {}
 
     intptr_t pc_offset() const { return pc_offset_; }
     const String& comment() const { return comment_; }
@@ -1457,8 +1379,12 @@
 
   void LoadObjectHelper(Register dst, const Object& obj, bool is_unique);
 
-  void AddSubHelper(OperandSize os, bool set_flags, bool subtract,
-                    Register rd, Register rn, Operand o) {
+  void AddSubHelper(OperandSize os,
+                    bool set_flags,
+                    bool subtract,
+                    Register rd,
+                    Register rn,
+                    Operand o) {
     ASSERT((rd != R31) && (rn != R31));
     const Register crd = ConcreteRegister(rd);
     const Register crn = ConcreteRegister(rn);
@@ -1475,8 +1401,12 @@
     }
   }
 
-  void AddSubWithCarryHelper(OperandSize sz, bool set_flags, bool subtract,
-                             Register rd, Register rn, Register rm) {
+  void AddSubWithCarryHelper(OperandSize sz,
+                             bool set_flags,
+                             bool subtract,
+                             Register rd,
+                             Register rn,
+                             Register rm) {
     ASSERT((rd != R31) && (rn != R31) && (rm != R31));
     ASSERT((rd != CSP) && (rn != CSP) && (rm != CSP));
     const Register crd = ConcreteRegister(rd);
@@ -1485,48 +1415,53 @@
     const int32_t size = (sz == kDoubleWord) ? B31 : 0;
     const int32_t s = set_flags ? B29 : 0;
     const int32_t op = subtract ? SBC : ADC;
-    const int32_t encoding =
-        op | size | s |
-        (static_cast<int32_t>(crd) << kRdShift) |
-        (static_cast<int32_t>(crn) << kRnShift) |
-        (static_cast<int32_t>(crm) << kRmShift);
+    const int32_t encoding = op | size | s |
+                             (static_cast<int32_t>(crd) << kRdShift) |
+                             (static_cast<int32_t>(crn) << kRnShift) |
+                             (static_cast<int32_t>(crm) << kRmShift);
     Emit(encoding);
   }
 
-  void EmitAddSubImmOp(AddSubImmOp op, Register rd, Register rn,
-                       Operand o, OperandSize sz, bool set_flags) {
+  void EmitAddSubImmOp(AddSubImmOp op,
+                       Register rd,
+                       Register rn,
+                       Operand o,
+                       OperandSize sz,
+                       bool set_flags) {
     ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord));
     const int32_t size = (sz == kDoubleWord) ? B31 : 0;
     const int32_t s = set_flags ? B29 : 0;
     const int32_t encoding =
-        op | size | s |
-        (static_cast<int32_t>(rd) << kRdShift) |
-        (static_cast<int32_t>(rn) << kRnShift) |
-        o.encoding();
+        op | size | s | (static_cast<int32_t>(rd) << kRdShift) |
+        (static_cast<int32_t>(rn) << kRnShift) | o.encoding();
     Emit(encoding);
   }
 
-  void EmitLogicalImmOp(LogicalImmOp op, Register rd, Register rn,
-                        Operand o, OperandSize sz) {
+  void EmitLogicalImmOp(LogicalImmOp op,
+                        Register rd,
+                        Register rn,
+                        Operand o,
+                        OperandSize sz) {
     ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord));
     ASSERT((rd != R31) && (rn != R31));
     ASSERT(rn != CSP);
-    ASSERT((op == ANDIS) || (rd != ZR));  // op != ANDIS => rd != ZR.
+    ASSERT((op == ANDIS) || (rd != ZR));   // op != ANDIS => rd != ZR.
     ASSERT((op != ANDIS) || (rd != CSP));  // op == ANDIS => rd != CSP.
     ASSERT(o.type() == Operand::BitfieldImm);
     const int32_t size = (sz == kDoubleWord) ? B31 : 0;
     const Register crd = ConcreteRegister(rd);
     const Register crn = ConcreteRegister(rn);
     const int32_t encoding =
-        op | size |
-        (static_cast<int32_t>(crd) << kRdShift) |
-        (static_cast<int32_t>(crn) << kRnShift) |
-        o.encoding();
+        op | size | (static_cast<int32_t>(crd) << kRdShift) |
+        (static_cast<int32_t>(crn) << kRnShift) | o.encoding();
     Emit(encoding);
   }
 
   void EmitLogicalShiftOp(LogicalShiftOp op,
-                          Register rd, Register rn, Operand o, OperandSize sz) {
+                          Register rd,
+                          Register rn,
+                          Operand o,
+                          OperandSize sz) {
     ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord));
     ASSERT((rd != R31) && (rn != R31));
     ASSERT((rd != CSP) && (rn != CSP));
@@ -1535,32 +1470,31 @@
     const Register crd = ConcreteRegister(rd);
     const Register crn = ConcreteRegister(rn);
     const int32_t encoding =
-        op | size |
-        (static_cast<int32_t>(crd) << kRdShift) |
-        (static_cast<int32_t>(crn) << kRnShift) |
-        o.encoding();
+        op | size | (static_cast<int32_t>(crd) << kRdShift) |
+        (static_cast<int32_t>(crn) << kRnShift) | o.encoding();
     Emit(encoding);
   }
 
   void EmitAddSubShiftExtOp(AddSubShiftExtOp op,
-                            Register rd, Register rn, Operand o,
-                            OperandSize sz, bool set_flags) {
+                            Register rd,
+                            Register rn,
+                            Operand o,
+                            OperandSize sz,
+                            bool set_flags) {
     ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord));
     const int32_t size = (sz == kDoubleWord) ? B31 : 0;
     const int32_t s = set_flags ? B29 : 0;
     const int32_t encoding =
-        op | size | s |
-        (static_cast<int32_t>(rd) << kRdShift) |
-        (static_cast<int32_t>(rn) << kRnShift) |
-        o.encoding();
+        op | size | s | (static_cast<int32_t>(rd) << kRdShift) |
+        (static_cast<int32_t>(rn) << kRnShift) | o.encoding();
     Emit(encoding);
   }
 
   int32_t EncodeImm19BranchOffset(int64_t imm, int32_t instr) {
     if (!CanEncodeImm19BranchOffset(imm)) {
       ASSERT(!use_far_branches());
-      Thread::Current()->long_jump_base()->Jump(
-          1, Object::branch_offset_error());
+      Thread::Current()->long_jump_base()->Jump(1,
+                                                Object::branch_offset_error());
     }
     const int32_t imm32 = static_cast<int32_t>(imm);
     const int32_t off = (((imm32 >> 2) << kImm19Shift) & kImm19Mask);
@@ -1610,7 +1544,9 @@
     return static_cast<int64_t>(off);
   }
 
-  void EmitCompareAndBranchOp(CompareAndBranchOp op, Register rt, int64_t imm,
+  void EmitCompareAndBranchOp(CompareAndBranchOp op,
+                              Register rt,
+                              int64_t imm,
                               OperandSize sz) {
     ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord));
     ASSERT(Utils::IsInt(21, imm) && ((imm & 0x3) == 0));
@@ -1619,19 +1555,16 @@
     const int32_t size = (sz == kDoubleWord) ? B31 : 0;
     const int32_t encoded_offset = EncodeImm19BranchOffset(imm, 0);
     const int32_t encoding =
-        op | size |
-        (static_cast<int32_t>(crt) << kRtShift) |
-        encoded_offset;
+        op | size | (static_cast<int32_t>(crt) << kRtShift) | encoded_offset;
     Emit(encoding);
   }
 
-  void EmitConditionalBranchOp(ConditionalBranchOp op, Condition cond,
+  void EmitConditionalBranchOp(ConditionalBranchOp op,
+                               Condition cond,
                                int64_t imm) {
     const int32_t off = EncodeImm19BranchOffset(imm, 0);
     const int32_t encoding =
-        op |
-        (static_cast<int32_t>(cond) << kCondShift) |
-        off;
+        op | (static_cast<int32_t>(cond) << kCondShift) | off;
     Emit(encoding);
   }
 
@@ -1640,7 +1573,8 @@
     return Utils::IsInt(21, offset);
   }
 
-  void EmitConditionalBranch(ConditionalBranchOp op, Condition cond,
+  void EmitConditionalBranch(ConditionalBranchOp op,
+                             Condition cond,
                              Label* label) {
     if (label->IsBound()) {
       const int64_t dest = label->Position() - buffer_.Size();
@@ -1650,8 +1584,8 @@
           // no need for a guard branch.
           b(dest);
         } else {
-          EmitConditionalBranchOp(
-              op, InvertCondition(cond), 2 * Instr::kInstrSize);
+          EmitConditionalBranchOp(op, InvertCondition(cond),
+                                  2 * Instr::kInstrSize);
           b(dest);
         }
       } else {
@@ -1663,8 +1597,8 @@
         // When cond is AL, this guard branch will be rewritten as a nop when
         // the label is bound. We don't write it as a nop initially because it
         // makes the decoding code in Bind simpler.
-        EmitConditionalBranchOp(
-            op, InvertCondition(cond), 2 * Instr::kInstrSize);
+        EmitConditionalBranchOp(op, InvertCondition(cond),
+                                2 * Instr::kInstrSize);
         b(label->position_);
       } else {
         EmitConditionalBranchOp(op, cond, label->position_);
@@ -1673,22 +1607,24 @@
     }
   }
 
-  void EmitCompareAndBranch(CompareAndBranchOp op, Register rt,
-                            Label* label, OperandSize sz) {
+  void EmitCompareAndBranch(CompareAndBranchOp op,
+                            Register rt,
+                            Label* label,
+                            OperandSize sz) {
     if (label->IsBound()) {
       const int64_t dest = label->Position() - buffer_.Size();
       if (use_far_branches() && !CanEncodeImm19BranchOffset(dest)) {
-          EmitCompareAndBranchOp(
-              op == CBZ ? CBNZ : CBZ, rt, 2 * Instr::kInstrSize, sz);
-          b(dest);
+        EmitCompareAndBranchOp(op == CBZ ? CBNZ : CBZ, rt,
+                               2 * Instr::kInstrSize, sz);
+        b(dest);
       } else {
         EmitCompareAndBranchOp(op, rt, dest, sz);
       }
     } else {
       const int64_t position = buffer_.Size();
       if (use_far_branches()) {
-        EmitCompareAndBranchOp(
-            op == CBZ ? CBNZ : CBZ, rt, 2 * Instr::kInstrSize, sz);
+        EmitCompareAndBranchOp(op == CBZ ? CBNZ : CBZ, rt,
+                               2 * Instr::kInstrSize, sz);
         b(label->position_);
       } else {
         EmitCompareAndBranchOp(op, rt, label->position_, sz);
@@ -1712,8 +1648,7 @@
   void EmitUnconditionalBranchRegOp(UnconditionalBranchRegOp op, Register rn) {
     ASSERT((rn != CSP) && (rn != R31));
     const Register crn = ConcreteRegister(rn);
-    const int32_t encoding =
-        op | (static_cast<int32_t>(crn) << kRnShift);
+    const int32_t encoding = op | (static_cast<int32_t>(crn) << kRnShift);
     Emit(encoding);
   }
 
@@ -1725,21 +1660,26 @@
     Emit(ExceptionGenOpEncoding(op, imm));
   }
 
-  void EmitMoveWideOp(MoveWideOp op, Register rd, const Immediate& imm,
-                      int hw_idx, OperandSize sz) {
+  void EmitMoveWideOp(MoveWideOp op,
+                      Register rd,
+                      const Immediate& imm,
+                      int hw_idx,
+                      OperandSize sz) {
     ASSERT((hw_idx >= 0) && (hw_idx <= 3));
     ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord));
     const int32_t size = (sz == kDoubleWord) ? B31 : 0;
     const int32_t encoding =
-        op | size |
-        (static_cast<int32_t>(rd) << kRdShift) |
+        op | size | (static_cast<int32_t>(rd) << kRdShift) |
         (static_cast<int32_t>(hw_idx) << kHWShift) |
         (static_cast<int32_t>(imm.value() & 0xffff) << kImm16Shift);
     Emit(encoding);
   }
 
-  void EmitLoadStoreExclusive(LoadStoreExclusiveOp op, Register rs, Register rn,
-                              Register rt, OperandSize sz = kDoubleWord) {
+  void EmitLoadStoreExclusive(LoadStoreExclusiveOp op,
+                              Register rs,
+                              Register rn,
+                              Register rt,
+                              OperandSize sz = kDoubleWord) {
     ASSERT(sz == kDoubleWord);
     const int32_t size = B31 | B30;
 
@@ -1748,40 +1688,42 @@
     ASSERT((rt != kNoRegister) && (rt != ZR));
 
     const int32_t encoding =
-        op | size |
-        (static_cast<int32_t>(ConcreteRegister(rs)) << kRsShift) |
+        op | size | (static_cast<int32_t>(ConcreteRegister(rs)) << kRsShift) |
         (static_cast<int32_t>(ConcreteRegister(rn)) << kRnShift) |
         (static_cast<int32_t>(ConcreteRegister(rt)) << kRtShift);
 
     Emit(encoding);
   }
 
-  void EmitLoadStoreReg(LoadStoreRegOp op, Register rt, Address a,
+  void EmitLoadStoreReg(LoadStoreRegOp op,
+                        Register rt,
+                        Address a,
                         OperandSize sz) {
     const Register crt = ConcreteRegister(rt);
     const int32_t size = Log2OperandSizeBytes(sz);
-    const int32_t encoding =
-        op | ((size & 0x3) << kSzShift) |
-        (static_cast<int32_t>(crt) << kRtShift) |
-        a.encoding();
+    const int32_t encoding = op | ((size & 0x3) << kSzShift) |
+                             (static_cast<int32_t>(crt) << kRtShift) |
+                             a.encoding();
     Emit(encoding);
   }
 
-  void EmitLoadRegLiteral(LoadRegLiteralOp op, Register rt, Address a,
+  void EmitLoadRegLiteral(LoadRegLiteralOp op,
+                          Register rt,
+                          Address a,
                           OperandSize sz) {
     ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord));
     ASSERT((rt != CSP) && (rt != R31));
     const Register crt = ConcreteRegister(rt);
     const int32_t size = (sz == kDoubleWord) ? B30 : 0;
     const int32_t encoding =
-        op | size |
-        (static_cast<int32_t>(crt) << kRtShift) |
-        a.encoding();
+        op | size | (static_cast<int32_t>(crt) << kRtShift) | a.encoding();
     Emit(encoding);
   }
 
   void EmitLoadStoreRegPair(LoadStoreRegPairOp op,
-                            Register rt, Register rt2, Address a,
+                            Register rt,
+                            Register rt2,
+                            Address a,
                             OperandSize sz) {
     ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord));
     ASSERT((rt != CSP) && (rt != R31));
@@ -1790,16 +1732,22 @@
     const Register crt2 = ConcreteRegister(rt2);
     int32_t opc = 0;
     switch (sz) {
-      case kDoubleWord: opc = B31; break;
-      case kWord: opc = B30; break;
-      case kUnsignedWord: opc = 0; break;
-      default: UNREACHABLE(); break;
+      case kDoubleWord:
+        opc = B31;
+        break;
+      case kWord:
+        opc = B30;
+        break;
+      case kUnsignedWord:
+        opc = 0;
+        break;
+      default:
+        UNREACHABLE();
+        break;
     }
     const int32_t encoding =
-      opc | op |
-      (static_cast<int32_t>(crt) << kRtShift) |
-      (static_cast<int32_t>(crt2) << kRt2Shift) |
-      a.encoding();
+        opc | op | (static_cast<int32_t>(crt) << kRtShift) |
+        (static_cast<int32_t>(crt2) << kRt2Shift) | a.encoding();
     Emit(encoding);
   }
 
@@ -1810,28 +1758,29 @@
     const int32_t loimm = (imm.value() & 0x3) << 29;
     const int32_t hiimm = ((imm.value() >> 2) << kImm19Shift) & kImm19Mask;
     const int32_t encoding =
-        op | loimm | hiimm |
-        (static_cast<int32_t>(crd) << kRdShift);
+        op | loimm | hiimm | (static_cast<int32_t>(crd) << kRdShift);
     Emit(encoding);
   }
 
   void EmitMiscDP1Source(MiscDP1SourceOp op,
-                         Register rd, Register rn,
+                         Register rd,
+                         Register rn,
                          OperandSize sz) {
     ASSERT((rd != CSP) && (rn != CSP));
     ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord));
     const Register crd = ConcreteRegister(rd);
     const Register crn = ConcreteRegister(rn);
     const int32_t size = (sz == kDoubleWord) ? B31 : 0;
-    const int32_t encoding =
-        op | size |
-        (static_cast<int32_t>(crd) << kRdShift) |
-        (static_cast<int32_t>(crn) << kRnShift);
+    const int32_t encoding = op | size |
+                             (static_cast<int32_t>(crd) << kRdShift) |
+                             (static_cast<int32_t>(crn) << kRnShift);
     Emit(encoding);
   }
 
   void EmitMiscDP2Source(MiscDP2SourceOp op,
-                         Register rd, Register rn, Register rm,
+                         Register rd,
+                         Register rn,
+                         Register rm,
                          OperandSize sz) {
     ASSERT((rd != CSP) && (rn != CSP) && (rm != CSP));
     ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord));
@@ -1839,16 +1788,18 @@
     const Register crn = ConcreteRegister(rn);
     const Register crm = ConcreteRegister(rm);
     const int32_t size = (sz == kDoubleWord) ? B31 : 0;
-    const int32_t encoding =
-        op | size |
-        (static_cast<int32_t>(crd) << kRdShift) |
-        (static_cast<int32_t>(crn) << kRnShift) |
-        (static_cast<int32_t>(crm) << kRmShift);
+    const int32_t encoding = op | size |
+                             (static_cast<int32_t>(crd) << kRdShift) |
+                             (static_cast<int32_t>(crn) << kRnShift) |
+                             (static_cast<int32_t>(crm) << kRmShift);
     Emit(encoding);
   }
 
   void EmitMiscDP3Source(MiscDP3SourceOp op,
-                         Register rd, Register rn, Register rm, Register ra,
+                         Register rd,
+                         Register rn,
+                         Register rm,
+                         Register ra,
                          OperandSize sz) {
     ASSERT((rd != CSP) && (rn != CSP) && (rm != CSP) && (ra != CSP));
     ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord));
@@ -1857,108 +1808,101 @@
     const Register crm = ConcreteRegister(rm);
     const Register cra = ConcreteRegister(ra);
     const int32_t size = (sz == kDoubleWord) ? B31 : 0;
-    const int32_t encoding =
-        op | size |
-        (static_cast<int32_t>(crd) << kRdShift) |
-        (static_cast<int32_t>(crn) << kRnShift) |
-        (static_cast<int32_t>(crm) << kRmShift) |
-        (static_cast<int32_t>(cra) << kRaShift);
+    const int32_t encoding = op | size |
+                             (static_cast<int32_t>(crd) << kRdShift) |
+                             (static_cast<int32_t>(crn) << kRnShift) |
+                             (static_cast<int32_t>(crm) << kRmShift) |
+                             (static_cast<int32_t>(cra) << kRaShift);
     Emit(encoding);
   }
 
   void EmitConditionalSelect(ConditionalSelectOp op,
-                             Register rd, Register rn, Register rm,
-                             Condition cond, OperandSize sz) {
+                             Register rd,
+                             Register rn,
+                             Register rm,
+                             Condition cond,
+                             OperandSize sz) {
     ASSERT((rd != CSP) && (rn != CSP) && (rm != CSP));
     ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord));
     const Register crd = ConcreteRegister(rd);
     const Register crn = ConcreteRegister(rn);
     const Register crm = ConcreteRegister(rm);
     const int32_t size = (sz == kDoubleWord) ? B31 : 0;
-    const int32_t encoding =
-        op | size |
-        (static_cast<int32_t>(crd) << kRdShift) |
-        (static_cast<int32_t>(crn) << kRnShift) |
-        (static_cast<int32_t>(crm) << kRmShift) |
-        (static_cast<int32_t>(cond) << kSelCondShift);
+    const int32_t encoding = op | size |
+                             (static_cast<int32_t>(crd) << kRdShift) |
+                             (static_cast<int32_t>(crn) << kRnShift) |
+                             (static_cast<int32_t>(crm) << kRmShift) |
+                             (static_cast<int32_t>(cond) << kSelCondShift);
     Emit(encoding);
   }
 
   void EmitFPImm(FPImmOp op, VRegister vd, uint8_t imm8) {
     const int32_t encoding =
-        op |
-        (static_cast<int32_t>(vd) << kVdShift) |
-        (imm8 << kImm8Shift);
+        op | (static_cast<int32_t>(vd) << kVdShift) | (imm8 << kImm8Shift);
     Emit(encoding);
   }
 
-  void EmitFPIntCvtOp(FPIntCvtOp op, Register rd, Register rn,
+  void EmitFPIntCvtOp(FPIntCvtOp op,
+                      Register rd,
+                      Register rn,
                       OperandSize sz = kDoubleWord) {
     ASSERT((sz == kDoubleWord) || (sz == kWord));
     const int32_t sfield = (sz == kDoubleWord) ? B31 : 0;
-    const int32_t encoding =
-        op |
-        (static_cast<int32_t>(rd) << kRdShift) |
-        (static_cast<int32_t>(rn) << kRnShift) |
-        sfield;
+    const int32_t encoding = op | (static_cast<int32_t>(rd) << kRdShift) |
+                             (static_cast<int32_t>(rn) << kRnShift) | sfield;
     Emit(encoding);
   }
 
   void EmitFPOneSourceOp(FPOneSourceOp op, VRegister vd, VRegister vn) {
-    const int32_t encoding =
-        op |
-        (static_cast<int32_t>(vd) << kVdShift) |
-        (static_cast<int32_t>(vn) << kVnShift);
+    const int32_t encoding = op | (static_cast<int32_t>(vd) << kVdShift) |
+                             (static_cast<int32_t>(vn) << kVnShift);
     Emit(encoding);
   }
 
   void EmitFPTwoSourceOp(FPTwoSourceOp op,
-                         VRegister vd, VRegister vn, VRegister vm) {
-    const int32_t encoding =
-        op |
-        (static_cast<int32_t>(vd) << kVdShift) |
-        (static_cast<int32_t>(vn) << kVnShift) |
-        (static_cast<int32_t>(vm) << kVmShift);
+                         VRegister vd,
+                         VRegister vn,
+                         VRegister vm) {
+    const int32_t encoding = op | (static_cast<int32_t>(vd) << kVdShift) |
+                             (static_cast<int32_t>(vn) << kVnShift) |
+                             (static_cast<int32_t>(vm) << kVmShift);
     Emit(encoding);
   }
 
   void EmitFPCompareOp(FPCompareOp op, VRegister vn, VRegister vm) {
-    const int32_t encoding =
-        op |
-        (static_cast<int32_t>(vn) << kVnShift) |
-        (static_cast<int32_t>(vm) << kVmShift);
+    const int32_t encoding = op | (static_cast<int32_t>(vn) << kVnShift) |
+                             (static_cast<int32_t>(vm) << kVmShift);
     Emit(encoding);
   }
 
   void EmitSIMDThreeSameOp(SIMDThreeSameOp op,
-                           VRegister vd, VRegister vn, VRegister vm) {
-    const int32_t encoding =
-        op |
-        (static_cast<int32_t>(vd) << kVdShift) |
-        (static_cast<int32_t>(vn) << kVnShift) |
-        (static_cast<int32_t>(vm) << kVmShift);
+                           VRegister vd,
+                           VRegister vn,
+                           VRegister vm) {
+    const int32_t encoding = op | (static_cast<int32_t>(vd) << kVdShift) |
+                             (static_cast<int32_t>(vn) << kVnShift) |
+                             (static_cast<int32_t>(vm) << kVmShift);
     Emit(encoding);
   }
 
-  void EmitSIMDCopyOp(SIMDCopyOp op, VRegister vd, VRegister vn, OperandSize sz,
-                      int32_t idx4, int32_t idx5) {
+  void EmitSIMDCopyOp(SIMDCopyOp op,
+                      VRegister vd,
+                      VRegister vn,
+                      OperandSize sz,
+                      int32_t idx4,
+                      int32_t idx5) {
     const int32_t shift = Log2OperandSizeBytes(sz);
     const int32_t imm5 = ((idx5 << (shift + 1)) | (1 << shift)) & 0x1f;
     const int32_t imm4 = (idx4 << shift) & 0xf;
-    const int32_t encoding =
-        op |
-        (imm5 << kImm5Shift) |
-        (imm4 << kImm4Shift) |
-        (static_cast<int32_t>(vd) << kVdShift) |
-        (static_cast<int32_t>(vn) << kVnShift);
+    const int32_t encoding = op | (imm5 << kImm5Shift) | (imm4 << kImm4Shift) |
+                             (static_cast<int32_t>(vd) << kVdShift) |
+                             (static_cast<int32_t>(vn) << kVnShift);
     Emit(encoding);
   }
 
   void EmitSIMDTwoRegOp(SIMDTwoRegOp op, VRegister vd, VRegister vn) {
-    const int32_t encoding =
-        op |
-        (static_cast<int32_t>(vd) << kVdShift) |
-        (static_cast<int32_t>(vn) << kVnShift);
+    const int32_t encoding = op | (static_cast<int32_t>(vd) << kVdShift) |
+                             (static_cast<int32_t>(vn) << kVnShift);
     Emit(encoding);
   }
 
diff --git a/runtime/vm/assembler_arm64_test.cc b/runtime/vm/assembler_arm64_test.cc
index ea2d2df..1bd0644 100644
--- a/runtime/vm/assembler_arm64_test.cc
+++ b/runtime/vm/assembler_arm64_test.cc
@@ -137,8 +137,8 @@
 
 ASSEMBLER_TEST_RUN(Movk0, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
-  EXPECT_EQ(
-      42LL | (1LL << 48), EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_EQ(42LL | (1LL << 48),
+            EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
 }
 
 
@@ -151,8 +151,8 @@
 
 ASSEMBLER_TEST_RUN(Movk1, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
-  EXPECT_EQ(
-      (42LL << 16) | 1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_EQ((42LL << 16) | 1,
+            EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
 }
 
 
@@ -165,8 +165,8 @@
 
 ASSEMBLER_TEST_RUN(Movk2, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
-  EXPECT_EQ(
-      (42LL << 32) | 1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_EQ((42LL << 32) | 1,
+            EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
 }
 
 
@@ -179,8 +179,8 @@
 
 ASSEMBLER_TEST_RUN(Movk3, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
-  EXPECT_EQ(
-      (42LL << 48) | 1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_EQ((42LL << 48) | 1,
+            EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
 }
 
 
@@ -255,7 +255,7 @@
 
 ASSEMBLER_TEST_GENERATE(AddASRNegReg, assembler) {
   __ movz(R0, Immediate(43), 0);
-  __ movn(R1, Immediate(0), 0);  // R1 <- -1
+  __ movn(R1, Immediate(0), 0);         // R1 <- -1
   __ add(R1, ZR, Operand(R1, LSL, 3));  // R1 <- -8
   __ add(R0, R0, Operand(R1, ASR, 3));  // R0 <- 43 + (-8 >> 3)
   __ ret();
@@ -272,7 +272,7 @@
 ASSEMBLER_TEST_GENERATE(AddExtReg, assembler) {
   __ movz(R0, Immediate(43), 0);
   __ movz(R1, Immediate(0xffff), 0);
-  __ movk(R1, Immediate(0xffff), 1);  // R1 <- -1 (32-bit)
+  __ movk(R1, Immediate(0xffff), 1);     // R1 <- -1 (32-bit)
   __ add(R0, R0, Operand(R1, SXTW, 0));  // R0 <- R0 + (sign extended R1)
   __ ret();
 }
@@ -289,8 +289,8 @@
   __ LoadImmediate(R1, 1);
   __ LoadImmediate(R0, 0);
   __ adds(IP0, R2, Operand(R1));  // c_out = 1.
-  __ adcs(IP0, R2, R0);  // c_in = 1, c_out = 1.
-  __ adc(R0, R0, R0);  // c_in = 1.
+  __ adcs(IP0, R2, R0);           // c_in = 1, c_out = 1.
+  __ adc(R0, R0, R0);             // c_in = 1.
   __ ret();
 }
 
@@ -305,8 +305,8 @@
   __ LoadImmediate(R1, 1);
   __ LoadImmediate(R0, 0);
   __ subs(IP0, R0, Operand(R1));  // c_out = 1.
-  __ sbcs(IP0, R0, R0);  // c_in = 1, c_out = 1.
-  __ sbc(R0, R0, R0);  // c_in = 1.
+  __ sbcs(IP0, R0, R0);           // c_in = 1, c_out = 1.
+  __ sbc(R0, R0, R0);             // c_in = 1.
   __ ret();
 }
 
@@ -323,8 +323,8 @@
   __ LoadImmediate(R2, 0xFFFFFFFFFFFFFFFF);
   __ LoadImmediate(R3, 0x7FFFFFFFFFFFFFFF);
   __ adds(IP0, R2, Operand(R1));  // c_out = 1.
-  __ adcs(IP0, R3, R0);  // c_in = 1, c_out = 1, v = 1.
-  __ csinc(R0, R0, R0, VS);  // R0 = v ? R0 : R0 + 1.
+  __ adcs(IP0, R3, R0);           // c_in = 1, c_out = 1, v = 1.
+  __ csinc(R0, R0, R0, VS);       // R0 = v ? R0 : R0 + 1.
   __ ret();
 }
 
@@ -340,8 +340,8 @@
   __ LoadImmediate(R1, 1);
   __ LoadImmediate(R0, 0);
   __ addsw(IP0, R2, Operand(R1));  // c_out = 1.
-  __ adcsw(IP0, R2, R0);  // c_in = 1, c_out = 1.
-  __ adcw(R0, R0, R0);  // c_in = 1.
+  __ adcsw(IP0, R2, R0);           // c_in = 1, c_out = 1.
+  __ adcw(R0, R0, R0);             // c_in = 1.
   __ ret();
 }
 
@@ -356,8 +356,8 @@
   __ LoadImmediate(R1, 1);
   __ LoadImmediate(R0, 0);
   __ subsw(IP0, R0, Operand(R1));  // c_out = 1.
-  __ sbcsw(IP0, R0, R0);  // c_in = 1, c_out = 1.
-  __ sbcw(R0, R0, R0);  // c_in = 1.
+  __ sbcsw(IP0, R0, R0);           // c_in = 1, c_out = 1.
+  __ sbcw(R0, R0, R0);             // c_in = 1.
   __ ret();
 }
 
@@ -374,8 +374,8 @@
   __ LoadImmediate(R2, 0xFFFFFFFF);
   __ LoadImmediate(R3, 0x7FFFFFFF);
   __ addsw(IP0, R2, Operand(R1));  // c_out = 1.
-  __ adcsw(IP0, R3, R0);  // c_in = 1, c_out = 1, v = 1.
-  __ csinc(R0, R0, R0, VS);  // R0 = v ? R0 : R0 + 1.
+  __ adcsw(IP0, R3, R0);           // c_in = 1, c_out = 1, v = 1.
+  __ csinc(R0, R0, R0, VS);        // R0 = v ? R0 : R0 + 1.
   __ ret();
 }
 
@@ -391,8 +391,8 @@
   __ SetupDartSP();
   __ movz(R0, Immediate(43), 0);
   __ movz(R1, Immediate(42), 0);
-  __ str(R1, Address(SP, -1*kWordSize, Address::PreIndex));
-  __ ldr(R0, Address(SP, 1*kWordSize, Address::PostIndex));
+  __ str(R1, Address(SP, -1 * kWordSize, Address::PreIndex));
+  __ ldr(R0, Address(SP, 1 * kWordSize, Address::PostIndex));
   __ RestoreCSP();
   __ ret();
 }
@@ -427,9 +427,9 @@
   __ movz(R0, Immediate(43), 0);
   __ movz(R1, Immediate(42), 0);
   // Largest negative offset that can fit in the signed 9-bit immediate field.
-  __ str(R1, Address(SP, -32*kWordSize, Address::PreIndex));
+  __ str(R1, Address(SP, -32 * kWordSize, Address::PreIndex));
   // Largest positive kWordSize aligned offset that we can fit.
-  __ ldr(R0, Address(SP, 31*kWordSize, Address::PostIndex));
+  __ ldr(R0, Address(SP, 31 * kWordSize, Address::PostIndex));
   // Correction.
   __ add(SP, SP, Operand(kWordSize));  // Restore SP.
   __ RestoreCSP();
@@ -447,9 +447,9 @@
   __ SetupDartSP();
   __ movz(R0, Immediate(43), 0);
   __ movz(R1, Immediate(42), 0);
-  __ sub(SP, SP, Operand(512*kWordSize));
-  __ str(R1, Address(SP, 512*kWordSize, Address::Offset));
-  __ add(SP, SP, Operand(512*kWordSize));
+  __ sub(SP, SP, Operand(512 * kWordSize));
+  __ str(R1, Address(SP, 512 * kWordSize, Address::Offset));
+  __ add(SP, SP, Operand(512 * kWordSize));
   __ ldr(R0, Address(SP));
   __ RestoreCSP();
   __ ret();
@@ -490,11 +490,11 @@
   __ movz(R0, Immediate(43), 0);
   __ movz(R1, Immediate(42), 0);
   __ movz(R2, Immediate(10), 0);
-  __ sub(SP, SP, Operand(10*kWordSize));
+  __ sub(SP, SP, Operand(10 * kWordSize));
   // Store R1 into SP + R2 * kWordSize.
   __ str(R1, Address(SP, R2, UXTX, Address::Scaled));
   __ ldr(R0, Address(SP, R2, UXTX, Address::Scaled));
-  __ add(SP, SP, Operand(10*kWordSize));
+  __ add(SP, SP, Operand(10 * kWordSize));
   __ RestoreCSP();
   __ ret();
 }
@@ -527,8 +527,8 @@
   __ SetupDartSP();
   __ LoadImmediate(R2, 43);
   __ LoadImmediate(R3, 42);
-  __ stp(R2, R3, Address(SP, -2*kWordSize, Address::PairPreIndex));
-  __ ldp(R0, R1, Address(SP, 2*kWordSize, Address::PairPostIndex));
+  __ stp(R2, R3, Address(SP, -2 * kWordSize, Address::PairPreIndex));
+  __ ldp(R0, R1, Address(SP, 2 * kWordSize, Address::PairPostIndex));
   __ sub(R0, R0, Operand(R1));
   __ RestoreCSP();
   __ ret();
@@ -572,7 +572,7 @@
   __ stxr(TMP, R1, SP);  // IP == 0, success
   __ cmp(TMP, Operand(0));
   __ b(&retry, NE);  // NE if context switch occurred between ldrex and strex.
-  __ Pop(R0);  // 42
+  __ Pop(R0);        // 42
   __ RestoreCSP();
   __ ret();
 }
@@ -591,9 +591,9 @@
   __ movz(R1, Immediate(42), 0);
   __ Push(R0);
   __ ldxr(R0, SP);
-  __ clrex();  // Simulate a context switch.
+  __ clrex();            // Simulate a context switch.
   __ stxr(TMP, R1, SP);  // IP == 1, failure
-  __ Pop(R0);  // 40
+  __ Pop(R0);            // 40
   __ add(R0, R0, Operand(TMP));
   __ RestoreCSP();
   __ ret();
@@ -666,7 +666,7 @@
 
 ASSEMBLER_TEST_GENERATE(OrnRegs, assembler) {
   __ movz(R1, Immediate(32), 0);
-  __ movn(R2, Immediate(0), 0);  // R2 <- 0xffffffffffffffff.
+  __ movn(R2, Immediate(0), 0);       // R2 <- 0xffffffffffffffff.
   __ movk(R2, Immediate(0xffd5), 0);  // R2 <- 0xffffffffffffffe5.
   __ orn(R0, R1, Operand(R2));
   __ ret();
@@ -1396,7 +1396,7 @@
 
 ASSEMBLER_TEST_GENERATE(Udiv_corner, assembler) {
   __ movz(R0, Immediate(0x8000), 3);  // R0 <- 0x8000000000000000
-  __ movn(R1, Immediate(0), 0);  // R1 <- 0xffffffffffffffff
+  __ movn(R1, Immediate(0), 0);       // R1 <- 0xffffffffffffffff
   __ udiv(R2, R0, R1);
   __ mov(R0, R2);
   __ ret();
@@ -1412,7 +1412,7 @@
 
 ASSEMBLER_TEST_GENERATE(Sdiv_corner, assembler) {
   __ movz(R3, Immediate(0x8000), 3);  // R0 <- 0x8000000000000000
-  __ movn(R1, Immediate(0), 0);  // R1 <- 0xffffffffffffffff
+  __ movn(R1, Immediate(0), 0);       // R1 <- 0xffffffffffffffff
   __ sdiv(R2, R3, R1);
   __ mov(R0, R2);
   __ ret();
@@ -1545,8 +1545,8 @@
 
 ASSEMBLER_TEST_GENERATE(Umulh, assembler) {
   __ movz(R1, Immediate(-1), 3);  // 0xffff000000000000
-  __ movz(R2, Immediate(7), 3);  // 0x0007000000000000
-  __ umulh(R0, R1, R2);  // 0x0006fff900000000
+  __ movz(R2, Immediate(7), 3);   // 0x0007000000000000
+  __ umulh(R0, R1, R2);           // 0x0006fff900000000
   __ ret();
 }
 
@@ -1562,7 +1562,7 @@
   __ movn(R1, Immediate(0), 0);  // W1 = 0xffffffff.
   __ movz(R2, Immediate(7), 0);  // W2 = 7.
   __ movz(R3, Immediate(8), 0);  // X3 = 8.
-  __ umaddl(R0, R1, R2, R3);  // X0 = W1*W2 + X3 = 0x700000001.
+  __ umaddl(R0, R1, R2, R3);     // X0 = W1*W2 + X3 = 0x700000001.
   __ ret();
 }
 
@@ -1606,8 +1606,8 @@
 
 ASSEMBLER_TEST_RUN(LoadImmediateMed2, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
-  EXPECT_EQ(
-      0x4321f1234123, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_EQ(0x4321f1234123,
+            EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
 }
 
 
@@ -1695,19 +1695,17 @@
   EXPECT(test != NULL);
   typedef intptr_t (*LoadHalfWordUnaligned)(intptr_t) DART_UNUSED;
   uint8_t buffer[4] = {
-    0x89, 0xAB, 0xCD, 0xEF,
+      0x89, 0xAB, 0xCD, 0xEF,
   };
 
-  EXPECT_EQ(static_cast<int16_t>(static_cast<uint16_t>(0xAB89)),
-            EXECUTE_TEST_CODE_INTPTR_INTPTR(
-                LoadHalfWordUnaligned,
-                test->entry(),
-                reinterpret_cast<intptr_t>(&buffer[0])));
-  EXPECT_EQ(static_cast<int16_t>(static_cast<uint16_t>(0xCDAB)),
-            EXECUTE_TEST_CODE_INTPTR_INTPTR(
-                LoadHalfWordUnaligned,
-                test->entry(),
-                reinterpret_cast<intptr_t>(&buffer[1])));
+  EXPECT_EQ(
+      static_cast<int16_t>(static_cast<uint16_t>(0xAB89)),
+      EXECUTE_TEST_CODE_INTPTR_INTPTR(LoadHalfWordUnaligned, test->entry(),
+                                      reinterpret_cast<intptr_t>(&buffer[0])));
+  EXPECT_EQ(
+      static_cast<int16_t>(static_cast<uint16_t>(0xCDAB)),
+      EXECUTE_TEST_CODE_INTPTR_INTPTR(LoadHalfWordUnaligned, test->entry(),
+                                      reinterpret_cast<intptr_t>(&buffer[1])));
 }
 
 
@@ -1722,19 +1720,15 @@
   EXPECT(test != NULL);
   typedef intptr_t (*LoadHalfWordUnsignedUnaligned)(intptr_t) DART_UNUSED;
   uint8_t buffer[4] = {
-    0x89, 0xAB, 0xCD, 0xEF,
+      0x89, 0xAB, 0xCD, 0xEF,
   };
 
-  EXPECT_EQ(0xAB89,
-            EXECUTE_TEST_CODE_INTPTR_INTPTR(
-                LoadHalfWordUnsignedUnaligned,
-                test->entry(),
-                reinterpret_cast<intptr_t>(&buffer[0])));
-  EXPECT_EQ(0xCDAB,
-            EXECUTE_TEST_CODE_INTPTR_INTPTR(
-                 LoadHalfWordUnsignedUnaligned,
-                 test->entry(),
-                 reinterpret_cast<intptr_t>(&buffer[1])));
+  EXPECT_EQ(0xAB89, EXECUTE_TEST_CODE_INTPTR_INTPTR(
+                        LoadHalfWordUnsignedUnaligned, test->entry(),
+                        reinterpret_cast<intptr_t>(&buffer[0])));
+  EXPECT_EQ(0xCDAB, EXECUTE_TEST_CODE_INTPTR_INTPTR(
+                        LoadHalfWordUnsignedUnaligned, test->entry(),
+                        reinterpret_cast<intptr_t>(&buffer[1])));
 }
 
 
@@ -1750,23 +1744,19 @@
   EXPECT(test != NULL);
   typedef intptr_t (*StoreHalfWordUnaligned)(intptr_t) DART_UNUSED;
   uint8_t buffer[4] = {
-    0, 0, 0, 0,
+      0, 0, 0, 0,
   };
 
-  EXPECT_EQ(0xABCD,
-            EXECUTE_TEST_CODE_INTPTR_INTPTR(
-                StoreHalfWordUnaligned,
-                test->entry(),
-                reinterpret_cast<intptr_t>(&buffer[0])));
+  EXPECT_EQ(0xABCD, EXECUTE_TEST_CODE_INTPTR_INTPTR(
+                        StoreHalfWordUnaligned, test->entry(),
+                        reinterpret_cast<intptr_t>(&buffer[0])));
   EXPECT_EQ(0xCD, buffer[0]);
   EXPECT_EQ(0xAB, buffer[1]);
   EXPECT_EQ(0, buffer[2]);
 
-  EXPECT_EQ(0xABCD,
-            EXECUTE_TEST_CODE_INTPTR_INTPTR(
-                StoreHalfWordUnaligned,
-                test->entry(),
-                reinterpret_cast<intptr_t>(&buffer[1])));
+  EXPECT_EQ(0xABCD, EXECUTE_TEST_CODE_INTPTR_INTPTR(
+                        StoreHalfWordUnaligned, test->entry(),
+                        reinterpret_cast<intptr_t>(&buffer[1])));
   EXPECT_EQ(0xCD, buffer[1]);
   EXPECT_EQ(0xAB, buffer[2]);
   EXPECT_EQ(0, buffer[3]);
@@ -1783,31 +1773,24 @@
 ASSEMBLER_TEST_RUN(LoadWordUnaligned, test) {
   EXPECT(test != NULL);
   typedef int32_t (*LoadWordUnaligned)(intptr_t) DART_UNUSED;
-  uint8_t buffer[8] = {
-    0x12, 0x34, 0x56, 0x78,
-    0x9A, 0xBC, 0xDE, 0xF0
-  };
+  uint8_t buffer[8] = {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0};
 
-  EXPECT_EQ(static_cast<int32_t>(0x78563412),
-            EXECUTE_TEST_CODE_INT32_INTPTR(
-                LoadWordUnaligned,
-                test->entry(),
-                reinterpret_cast<intptr_t>(&buffer[0])));
-  EXPECT_EQ(static_cast<int32_t>(0x9A785634),
-            EXECUTE_TEST_CODE_INT32_INTPTR(
-                LoadWordUnaligned,
-                test->entry(),
-                reinterpret_cast<intptr_t>(&buffer[1])));
-  EXPECT_EQ(static_cast<int32_t>(0xBC9A7856),
-            EXECUTE_TEST_CODE_INT32_INTPTR(
-                LoadWordUnaligned,
-                test->entry(),
-                reinterpret_cast<intptr_t>(&buffer[2])));
-  EXPECT_EQ(static_cast<int32_t>(0xDEBC9A78),
-            EXECUTE_TEST_CODE_INT32_INTPTR(
-                LoadWordUnaligned,
-                test->entry(),
-                reinterpret_cast<intptr_t>(&buffer[3])));
+  EXPECT_EQ(
+      static_cast<int32_t>(0x78563412),
+      EXECUTE_TEST_CODE_INT32_INTPTR(LoadWordUnaligned, test->entry(),
+                                     reinterpret_cast<intptr_t>(&buffer[0])));
+  EXPECT_EQ(
+      static_cast<int32_t>(0x9A785634),
+      EXECUTE_TEST_CODE_INT32_INTPTR(LoadWordUnaligned, test->entry(),
+                                     reinterpret_cast<intptr_t>(&buffer[1])));
+  EXPECT_EQ(
+      static_cast<int32_t>(0xBC9A7856),
+      EXECUTE_TEST_CODE_INT32_INTPTR(LoadWordUnaligned, test->entry(),
+                                     reinterpret_cast<intptr_t>(&buffer[2])));
+  EXPECT_EQ(
+      static_cast<int32_t>(0xDEBC9A78),
+      EXECUTE_TEST_CODE_INT32_INTPTR(LoadWordUnaligned, test->entry(),
+                                     reinterpret_cast<intptr_t>(&buffer[3])));
 }
 
 
@@ -1822,46 +1805,35 @@
 ASSEMBLER_TEST_RUN(StoreWordUnaligned, test) {
   EXPECT(test != NULL);
   typedef intptr_t (*StoreWordUnaligned)(intptr_t) DART_UNUSED;
-  uint8_t buffer[8] = {
-    0, 0, 0, 0,
-    0, 0, 0, 0
-  };
+  uint8_t buffer[8] = {0, 0, 0, 0, 0, 0, 0, 0};
 
-  EXPECT_EQ(0x12345678,
-            EXECUTE_TEST_CODE_INTPTR_INTPTR(
-                StoreWordUnaligned,
-                test->entry(),
-                reinterpret_cast<intptr_t>(&buffer[0])));
+  EXPECT_EQ(0x12345678, EXECUTE_TEST_CODE_INTPTR_INTPTR(
+                            StoreWordUnaligned, test->entry(),
+                            reinterpret_cast<intptr_t>(&buffer[0])));
   EXPECT_EQ(0x78, buffer[0]);
   EXPECT_EQ(0x56, buffer[1]);
   EXPECT_EQ(0x34, buffer[2]);
   EXPECT_EQ(0x12, buffer[3]);
 
-  EXPECT_EQ(0x12345678,
-            EXECUTE_TEST_CODE_INTPTR_INTPTR(
-                StoreWordUnaligned,
-                test->entry(),
-                reinterpret_cast<intptr_t>(&buffer[1])));
+  EXPECT_EQ(0x12345678, EXECUTE_TEST_CODE_INTPTR_INTPTR(
+                            StoreWordUnaligned, test->entry(),
+                            reinterpret_cast<intptr_t>(&buffer[1])));
   EXPECT_EQ(0x78, buffer[1]);
   EXPECT_EQ(0x56, buffer[2]);
   EXPECT_EQ(0x34, buffer[3]);
   EXPECT_EQ(0x12, buffer[4]);
 
-  EXPECT_EQ(0x12345678,
-            EXECUTE_TEST_CODE_INTPTR_INTPTR(
-                StoreWordUnaligned,
-                test->entry(),
-                reinterpret_cast<intptr_t>(&buffer[2])));
+  EXPECT_EQ(0x12345678, EXECUTE_TEST_CODE_INTPTR_INTPTR(
+                            StoreWordUnaligned, test->entry(),
+                            reinterpret_cast<intptr_t>(&buffer[2])));
   EXPECT_EQ(0x78, buffer[2]);
   EXPECT_EQ(0x56, buffer[3]);
   EXPECT_EQ(0x34, buffer[4]);
   EXPECT_EQ(0x12, buffer[5]);
 
-  EXPECT_EQ(0x12345678,
-            EXECUTE_TEST_CODE_INTPTR_INTPTR(
-                StoreWordUnaligned,
-                test->entry(),
-                reinterpret_cast<intptr_t>(&buffer[3])));
+  EXPECT_EQ(0x12345678, EXECUTE_TEST_CODE_INTPTR_INTPTR(
+                            StoreWordUnaligned, test->entry(),
+                            reinterpret_cast<intptr_t>(&buffer[3])));
   EXPECT_EQ(0x78, buffer[3]);
   EXPECT_EQ(0x56, buffer[4]);
   EXPECT_EQ(0x34, buffer[5]);
@@ -2108,7 +2080,8 @@
 ASSEMBLER_TEST_RUN(Fmovdi2, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_FLOAT_EQ(123412983.1324524315,
-      EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()), 0.0001f);
+                  EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()),
+                  0.0001f);
 }
 
 
@@ -2143,8 +2116,8 @@
 ASSEMBLER_TEST_GENERATE(FldrdFstrdPrePostIndex, assembler) {
   __ SetupDartSP();
   __ LoadDImmediate(V1, 42.0);
-  __ fstrd(V1, Address(SP, -1*kWordSize, Address::PreIndex));
-  __ fldrd(V0, Address(SP, 1*kWordSize, Address::PostIndex));
+  __ fstrd(V1, Address(SP, -1 * kWordSize, Address::PreIndex));
+  __ fldrd(V0, Address(SP, 1 * kWordSize, Address::PostIndex));
   __ RestoreCSP();
   __ ret();
 }
@@ -2160,8 +2133,8 @@
   __ SetupDartSP();
   __ LoadDImmediate(V1, 42.0);
   __ fcvtsd(V2, V1);
-  __ fstrs(V2, Address(SP, -1*kWordSize, Address::PreIndex));
-  __ fldrs(V3, Address(SP, 1*kWordSize, Address::PostIndex));
+  __ fstrs(V2, Address(SP, -1 * kWordSize, Address::PreIndex));
+  __ fldrs(V3, Address(SP, 1 * kWordSize, Address::PostIndex));
   __ fcvtds(V0, V3);
   __ RestoreCSP();
   __ ret();
@@ -2385,9 +2358,9 @@
   __ LoadDImmediate(V0, 43.0);
   __ LoadDImmediate(V1, 42.0);
   // Largest negative offset that can fit in the signed 9-bit immediate field.
-  __ fstrd(V1, Address(SP, -32*kWordSize, Address::PreIndex));
+  __ fstrd(V1, Address(SP, -32 * kWordSize, Address::PreIndex));
   // Largest positive kWordSize aligned offset that we can fit.
-  __ fldrd(V0, Address(SP, 31*kWordSize, Address::PostIndex));
+  __ fldrd(V0, Address(SP, 31 * kWordSize, Address::PostIndex));
   // Correction.
   __ add(SP, SP, Operand(kWordSize));  // Restore SP.
   __ RestoreCSP();
@@ -2405,9 +2378,9 @@
   __ SetupDartSP();
   __ LoadDImmediate(V0, 43.0);
   __ LoadDImmediate(V1, 42.0);
-  __ sub(SP, SP, Operand(512*kWordSize));
-  __ fstrd(V1, Address(SP, 512*kWordSize, Address::Offset));
-  __ add(SP, SP, Operand(512*kWordSize));
+  __ sub(SP, SP, Operand(512 * kWordSize));
+  __ fstrd(V1, Address(SP, 512 * kWordSize, Address::Offset));
+  __ add(SP, SP, Operand(512 * kWordSize));
   __ fldrd(V0, Address(SP));
   __ RestoreCSP();
   __ ret();
@@ -2448,11 +2421,11 @@
   __ LoadDImmediate(V0, 43.0);
   __ LoadDImmediate(V1, 42.0);
   __ movz(R2, Immediate(10), 0);
-  __ sub(SP, SP, Operand(10*kWordSize));
+  __ sub(SP, SP, Operand(10 * kWordSize));
   // Store V1 into SP + R2 * kWordSize.
   __ fstrd(V1, Address(SP, R2, UXTX, Address::Scaled));
   __ fldrd(V0, Address(SP, R2, UXTX, Address::Scaled));
-  __ add(SP, SP, Operand(10*kWordSize));
+  __ add(SP, SP, Operand(10 * kWordSize));
   __ RestoreCSP();
   __ ret();
 }
@@ -3578,9 +3551,12 @@
 // This is the same function as in the Simulator.
 static float arm_recip_estimate(float a) {
   // From the ARM Architecture Reference Manual A2-85.
-  if (isinf(a) || (fabs(a) >= exp2f(126))) return 0.0;
-  else if (a == 0.0) return kPosInfinity;
-  else if (isnan(a)) return a;
+  if (isinf(a) || (fabs(a) >= exp2f(126)))
+    return 0.0;
+  else if (a == 0.0)
+    return kPosInfinity;
+  else if (isnan(a))
+    return a;
 
   uint32_t a_bits = bit_cast<uint32_t, float>(a);
   // scaled = '0011 1111 1110' : a<22:0> : Zeros(29)
@@ -3600,7 +3576,7 @@
   // r in units of 1/256 rounded to nearest.
   int32_t s = static_cast<int32_t>(256.0 * r + 0.5);
   double estimate = static_cast<double>(s) / 256.0;
-  ASSERT((estimate >= 1.0) && (estimate <= (511.0/256.0)));
+  ASSERT((estimate >= 1.0) && (estimate <= (511.0 / 256.0)));
 
   // result = sign : result_exp<7:0> : estimate<51:29>
   int32_t result_bits =
@@ -3687,9 +3663,12 @@
 
 static float arm_reciprocal_sqrt_estimate(float a) {
   // From the ARM Architecture Reference Manual A2-87.
-  if (isinf(a) || (fabs(a) >= exp2f(126))) return 0.0;
-  else if (a == 0.0) return kPosInfinity;
-  else if (isnan(a)) return a;
+  if (isinf(a) || (fabs(a) >= exp2f(126)))
+    return 0.0;
+  else if (a == 0.0)
+    return kPosInfinity;
+  else if (isnan(a))
+    return a;
 
   uint32_t a_bits = bit_cast<uint32_t, float>(a);
   uint64_t scaled;
@@ -3727,10 +3706,11 @@
   // r in units of 1/256 rounded to nearest.
   int32_t s = static_cast<int>(256.0 * r + 0.5);
   double estimate = static_cast<double>(s) / 256.0;
-  ASSERT((estimate >= 1.0) && (estimate <= (511.0/256.0)));
+  ASSERT((estimate >= 1.0) && (estimate <= (511.0 / 256.0)));
 
   // result = 0 : result_exp<7:0> : estimate<51:29>
-  int32_t result_bits = ((result_exp & 0xff) << 23) |
+  int32_t result_bits =
+      ((result_exp & 0xff) << 23) |
       ((bit_cast<uint64_t, double>(estimate) >> 29) & 0x7fffff);
   return bit_cast<float, int32_t>(result_bits);
 }
@@ -3756,16 +3736,16 @@
 
 
 ASSEMBLER_TEST_GENERATE(Vrsqrtss, assembler) {
-    __ LoadDImmediate(V1, 5.0);
-    __ LoadDImmediate(V2, 10.0);
+  __ LoadDImmediate(V1, 5.0);
+  __ LoadDImmediate(V2, 10.0);
 
-    __ fcvtsd(V1, V1);
-    __ fcvtsd(V2, V2);
+  __ fcvtsd(V1, V1);
+  __ fcvtsd(V2, V2);
 
-    __ vrsqrtss(V0, V1, V2);
+  __ vrsqrtss(V0, V1, V2);
 
-    __ fcvtds(V0, V0);
-    __ ret();
+  __ fcvtds(V0, V0);
+  __ ret();
 }
 
 
@@ -3773,18 +3753,18 @@
   EXPECT(test != NULL);
   typedef double (*DoubleReturn)() DART_UNUSED;
   double res = EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry());
-  EXPECT_FLOAT_EQ((3.0 - 10.0 * 5.0)/2.0, res, 0.0001);
+  EXPECT_FLOAT_EQ((3.0 - 10.0 * 5.0) / 2.0, res, 0.0001);
 }
 
 
 ASSEMBLER_TEST_GENERATE(ReciprocalSqrt, assembler) {
-    __ LoadDImmediate(V1, 147000.0);
-    __ fcvtsd(V1, V1);
+  __ LoadDImmediate(V1, 147000.0);
+  __ fcvtsd(V1, V1);
 
-    __ VRSqrts(V0, V1);
+  __ VRSqrts(V0, V1);
 
-    __ fcvtds(V0, V0);
-    __ ret();
+  __ fcvtds(V0, V0);
+  __ ret();
 }
 
 
@@ -3792,7 +3772,7 @@
   EXPECT(test != NULL);
   typedef double (*DoubleReturn)() DART_UNUSED;
   double res = EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry());
-  EXPECT_FLOAT_EQ(1.0/sqrt(147000.0), res, 0.0001);
+  EXPECT_FLOAT_EQ(1.0 / sqrt(147000.0), res, 0.0001);
 }
 
 
@@ -3807,8 +3787,7 @@
   __ Push(THR);
   __ Push(LR);
   __ mov(THR, R2);
-  __ StoreIntoObject(R1,
-                     FieldAddress(R1, GrowableObjectArray::data_offset()),
+  __ StoreIntoObject(R1, FieldAddress(R1, GrowableObjectArray::data_offset()),
                      R0);
   __ Pop(LR);
   __ Pop(THR);
diff --git a/runtime/vm/assembler_arm_test.cc b/runtime/vm/assembler_arm_test.cc
index 8fe9960..e424b6a 100644
--- a/runtime/vm/assembler_arm_test.cc
+++ b/runtime/vm/assembler_arm_test.cc
@@ -108,19 +108,17 @@
   EXPECT(test != NULL);
   typedef intptr_t (*LoadHalfWordUnaligned)(intptr_t) DART_UNUSED;
   uint8_t buffer[4] = {
-    0x89, 0xAB, 0xCD, 0xEF,
+      0x89, 0xAB, 0xCD, 0xEF,
   };
 
-  EXPECT_EQ(static_cast<int16_t>(static_cast<uint16_t>(0xAB89)),
-            EXECUTE_TEST_CODE_INTPTR_INTPTR(
-                LoadHalfWordUnaligned,
-                test->entry(),
-                reinterpret_cast<intptr_t>(&buffer[0])));
-  EXPECT_EQ(static_cast<int16_t>(static_cast<uint16_t>(0xCDAB)),
-            EXECUTE_TEST_CODE_INTPTR_INTPTR(
-                LoadHalfWordUnaligned,
-                test->entry(),
-                reinterpret_cast<intptr_t>(&buffer[1])));
+  EXPECT_EQ(
+      static_cast<int16_t>(static_cast<uint16_t>(0xAB89)),
+      EXECUTE_TEST_CODE_INTPTR_INTPTR(LoadHalfWordUnaligned, test->entry(),
+                                      reinterpret_cast<intptr_t>(&buffer[0])));
+  EXPECT_EQ(
+      static_cast<int16_t>(static_cast<uint16_t>(0xCDAB)),
+      EXECUTE_TEST_CODE_INTPTR_INTPTR(LoadHalfWordUnaligned, test->entry(),
+                                      reinterpret_cast<intptr_t>(&buffer[1])));
 }
 
 
@@ -135,19 +133,15 @@
   EXPECT(test != NULL);
   typedef intptr_t (*LoadHalfWordUnsignedUnaligned)(intptr_t) DART_UNUSED;
   uint8_t buffer[4] = {
-    0x89, 0xAB, 0xCD, 0xEF,
+      0x89, 0xAB, 0xCD, 0xEF,
   };
 
-  EXPECT_EQ(0xAB89,
-            EXECUTE_TEST_CODE_INTPTR_INTPTR(
-                LoadHalfWordUnsignedUnaligned,
-                test->entry(),
-                reinterpret_cast<intptr_t>(&buffer[0])));
-  EXPECT_EQ(0xCDAB,
-            EXECUTE_TEST_CODE_INTPTR_INTPTR(
-                LoadHalfWordUnsignedUnaligned,
-                test->entry(),
-                reinterpret_cast<intptr_t>(&buffer[1])));
+  EXPECT_EQ(0xAB89, EXECUTE_TEST_CODE_INTPTR_INTPTR(
+                        LoadHalfWordUnsignedUnaligned, test->entry(),
+                        reinterpret_cast<intptr_t>(&buffer[0])));
+  EXPECT_EQ(0xCDAB, EXECUTE_TEST_CODE_INTPTR_INTPTR(
+                        LoadHalfWordUnsignedUnaligned, test->entry(),
+                        reinterpret_cast<intptr_t>(&buffer[1])));
 }
 
 
@@ -163,23 +157,19 @@
   EXPECT(test != NULL);
   typedef intptr_t (*StoreHalfWordUnaligned)(intptr_t) DART_UNUSED;
   uint8_t buffer[4] = {
-    0, 0, 0, 0,
+      0, 0, 0, 0,
   };
 
-  EXPECT_EQ(0xABCD,
-            EXECUTE_TEST_CODE_INTPTR_INTPTR(
-                StoreHalfWordUnaligned,
-                test->entry(),
-                reinterpret_cast<intptr_t>(&buffer[0])));
+  EXPECT_EQ(0xABCD, EXECUTE_TEST_CODE_INTPTR_INTPTR(
+                        StoreHalfWordUnaligned, test->entry(),
+                        reinterpret_cast<intptr_t>(&buffer[0])));
   EXPECT_EQ(0xCD, buffer[0]);
   EXPECT_EQ(0xAB, buffer[1]);
   EXPECT_EQ(0, buffer[2]);
 
-  EXPECT_EQ(0xABCD,
-            EXECUTE_TEST_CODE_INTPTR_INTPTR(
-                StoreHalfWordUnaligned,
-                test->entry(),
-                reinterpret_cast<intptr_t>(&buffer[1])));
+  EXPECT_EQ(0xABCD, EXECUTE_TEST_CODE_INTPTR_INTPTR(
+                        StoreHalfWordUnaligned, test->entry(),
+                        reinterpret_cast<intptr_t>(&buffer[1])));
   EXPECT_EQ(0xCD, buffer[1]);
   EXPECT_EQ(0xAB, buffer[2]);
   EXPECT_EQ(0, buffer[3]);
@@ -196,31 +186,24 @@
 ASSEMBLER_TEST_RUN(LoadWordUnaligned, test) {
   EXPECT(test != NULL);
   typedef intptr_t (*LoadWordUnaligned)(intptr_t) DART_UNUSED;
-  uint8_t buffer[8] = {
-    0x12, 0x34, 0x56, 0x78,
-    0x9A, 0xBC, 0xDE, 0xF0
-  };
+  uint8_t buffer[8] = {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0};
 
-  EXPECT_EQ(0x78563412,
-            EXECUTE_TEST_CODE_INTPTR_INTPTR(
-                LoadWordUnaligned,
-                test->entry(),
-                reinterpret_cast<intptr_t>(&buffer[0])));
-  EXPECT_EQ(0x9A785634,
-            EXECUTE_TEST_CODE_INTPTR_INTPTR(
-                LoadWordUnaligned,
-                test->entry(),
-                reinterpret_cast<intptr_t>(&buffer[1])));
-  EXPECT_EQ(0xBC9A7856,
-            EXECUTE_TEST_CODE_INTPTR_INTPTR(
-                LoadWordUnaligned,
-                test->entry(),
-                reinterpret_cast<intptr_t>(&buffer[2])));
-  EXPECT_EQ(0xDEBC9A78,
-            EXECUTE_TEST_CODE_INTPTR_INTPTR(
-                LoadWordUnaligned,
-                test->entry(),
-                reinterpret_cast<intptr_t>(&buffer[3])));
+  EXPECT_EQ(
+      static_cast<intptr_t>(0x78563412),
+      EXECUTE_TEST_CODE_INTPTR_INTPTR(LoadWordUnaligned, test->entry(),
+                                      reinterpret_cast<intptr_t>(&buffer[0])));
+  EXPECT_EQ(
+      static_cast<intptr_t>(0x9A785634),
+      EXECUTE_TEST_CODE_INTPTR_INTPTR(LoadWordUnaligned, test->entry(),
+                                      reinterpret_cast<intptr_t>(&buffer[1])));
+  EXPECT_EQ(
+      static_cast<intptr_t>(0xBC9A7856),
+      EXECUTE_TEST_CODE_INTPTR_INTPTR(LoadWordUnaligned, test->entry(),
+                                      reinterpret_cast<intptr_t>(&buffer[2])));
+  EXPECT_EQ(
+      static_cast<intptr_t>(0xDEBC9A78),
+      EXECUTE_TEST_CODE_INTPTR_INTPTR(LoadWordUnaligned, test->entry(),
+                                      reinterpret_cast<intptr_t>(&buffer[3])));
 }
 
 
@@ -235,46 +218,35 @@
 ASSEMBLER_TEST_RUN(StoreWordUnaligned, test) {
   EXPECT(test != NULL);
   typedef intptr_t (*StoreWordUnaligned)(intptr_t) DART_UNUSED;
-  uint8_t buffer[8] = {
-    0, 0, 0, 0,
-    0, 0, 0, 0
-  };
+  uint8_t buffer[8] = {0, 0, 0, 0, 0, 0, 0, 0};
 
-  EXPECT_EQ(0x12345678,
-            EXECUTE_TEST_CODE_INTPTR_INTPTR(
-                StoreWordUnaligned,
-                test->entry(),
-                reinterpret_cast<intptr_t>(&buffer[0])));
+  EXPECT_EQ(0x12345678, EXECUTE_TEST_CODE_INTPTR_INTPTR(
+                            StoreWordUnaligned, test->entry(),
+                            reinterpret_cast<intptr_t>(&buffer[0])));
   EXPECT_EQ(0x78, buffer[0]);
   EXPECT_EQ(0x56, buffer[1]);
   EXPECT_EQ(0x34, buffer[2]);
   EXPECT_EQ(0x12, buffer[3]);
 
-  EXPECT_EQ(0x12345678,
-            EXECUTE_TEST_CODE_INTPTR_INTPTR(
-                StoreWordUnaligned,
-                test->entry(),
-                reinterpret_cast<intptr_t>(&buffer[1])));
+  EXPECT_EQ(0x12345678, EXECUTE_TEST_CODE_INTPTR_INTPTR(
+                            StoreWordUnaligned, test->entry(),
+                            reinterpret_cast<intptr_t>(&buffer[1])));
   EXPECT_EQ(0x78, buffer[1]);
   EXPECT_EQ(0x56, buffer[2]);
   EXPECT_EQ(0x34, buffer[3]);
   EXPECT_EQ(0x12, buffer[4]);
 
-  EXPECT_EQ(0x12345678,
-            EXECUTE_TEST_CODE_INTPTR_INTPTR(
-                StoreWordUnaligned,
-                test->entry(),
-                reinterpret_cast<intptr_t>(&buffer[2])));
+  EXPECT_EQ(0x12345678, EXECUTE_TEST_CODE_INTPTR_INTPTR(
+                            StoreWordUnaligned, test->entry(),
+                            reinterpret_cast<intptr_t>(&buffer[2])));
   EXPECT_EQ(0x78, buffer[2]);
   EXPECT_EQ(0x56, buffer[3]);
   EXPECT_EQ(0x34, buffer[4]);
   EXPECT_EQ(0x12, buffer[5]);
 
-  EXPECT_EQ(0x12345678,
-            EXECUTE_TEST_CODE_INTPTR_INTPTR(
-                StoreWordUnaligned,
-                test->entry(),
-                reinterpret_cast<intptr_t>(&buffer[3])));
+  EXPECT_EQ(0x12345678, EXECUTE_TEST_CODE_INTPTR_INTPTR(
+                            StoreWordUnaligned, test->entry(),
+                            reinterpret_cast<intptr_t>(&buffer[3])));
   EXPECT_EQ(0x78, buffer[3]);
   EXPECT_EQ(0x56, buffer[4]);
   EXPECT_EQ(0x34, buffer[5]);
@@ -286,14 +258,14 @@
   if (TargetCPUFeatures::vfp_supported()) {
     __ mov(R3, Operand(43));
     __ mov(R1, Operand(41));
-    __ vmovsrr(S1, R1, R3);  // S1:S2 = 41:43
-    __ vmovs(S0, S2);  // S0 = S2, S0:S1 == 43:41
-    __ vmovd(D2, D0);  // D2 = D0, S4:S5 == 43:41
-    __ vmovrs(R3, S5);  // R3 = S5, R3 == 41
-    __ vmovrrs(R1, R2, S4);  // R1:R2 = S4:S5, R1:R2 == 43:41
-    __ vmovdrr(D3, R3, R2);  // D3 = R3:R2, S6:S7 == 41:41
-    __ vmovdr(D3, 1, R1);  // D3[1] == S7 = R1, S6:S7 == 41:43
-    __ vmovrrd(R0, R1, D3);  // R0:R1 = D3, R0:R1 == 41:43
+    __ vmovsrr(S1, R1, R3);       // S1:S2 = 41:43
+    __ vmovs(S0, S2);             // S0 = S2, S0:S1 == 43:41
+    __ vmovd(D2, D0);             // D2 = D0, S4:S5 == 43:41
+    __ vmovrs(R3, S5);            // R3 = S5, R3 == 41
+    __ vmovrrs(R1, R2, S4);       // R1:R2 = S4:S5, R1:R2 == 43:41
+    __ vmovdrr(D3, R3, R2);       // D3 = R3:R2, S6:S7 == 41:41
+    __ vmovdr(D3, 1, R1);         // D3[1] == S7 = R1, S6:S7 == 41:43
+    __ vmovrrd(R0, R1, D3);       // R0:R1 = D3, R0:R1 == 41:43
     __ sub(R0, R1, Operand(R0));  // 43-41
   }
   __ bx(LR);
@@ -328,7 +300,7 @@
   if (TargetCPUFeatures::vfp_supported()) {
     typedef float (*SingleVLoadStore)() DART_UNUSED;
     float res = EXECUTE_TEST_CODE_FLOAT(SingleVLoadStore, test->entry());
-    EXPECT_FLOAT_EQ(2*12.3f, res, 0.001f);
+    EXPECT_FLOAT_EQ(2 * 12.3f, res, 0.001f);
   }
 }
 
@@ -357,7 +329,7 @@
   if (TargetCPUFeatures::vfp_supported()) {
     typedef float (*SingleVLoadStore)() DART_UNUSED;
     float res = EXECUTE_TEST_CODE_FLOAT(SingleVLoadStore, test->entry());
-    EXPECT_FLOAT_EQ(2*12.3f, res, 0.001f);
+    EXPECT_FLOAT_EQ(2 * 12.3f, res, 0.001f);
   }
 }
 
@@ -385,7 +357,7 @@
   if (TargetCPUFeatures::vfp_supported()) {
     typedef double (*DoubleVLoadStore)() DART_UNUSED;
     float res = EXECUTE_TEST_CODE_DOUBLE(DoubleVLoadStore, test->entry());
-    EXPECT_FLOAT_EQ(2*12.3f, res, 0.001f);
+    EXPECT_FLOAT_EQ(2 * 12.3f, res, 0.001f);
   }
 }
 
@@ -394,13 +366,13 @@
   if (TargetCPUFeatures::vfp_supported()) {
     __ LoadSImmediate(S0, 12.3f);
     __ LoadSImmediate(S1, 3.4f);
-    __ vnegs(S0, S0);  // -12.3f
-    __ vabss(S0, S0);  // 12.3f
+    __ vnegs(S0, S0);      // -12.3f
+    __ vabss(S0, S0);      // 12.3f
     __ vadds(S0, S0, S1);  // 15.7f
     __ vmuls(S0, S0, S1);  // 53.38f
     __ vsubs(S0, S0, S1);  // 49.98f
     __ vdivs(S0, S0, S1);  // 14.7f
-    __ vsqrts(S0, S0);  // 3.8340579f
+    __ vsqrts(S0, S0);     // 3.8340579f
   }
   __ bx(LR);
 }
@@ -420,13 +392,13 @@
   if (TargetCPUFeatures::vfp_supported()) {
     __ LoadDImmediate(D0, 12.3, R0);
     __ LoadDImmediate(D1, 3.4, R0);
-    __ vnegd(D0, D0);  // -12.3
-    __ vabsd(D0, D0);  // 12.3
+    __ vnegd(D0, D0);      // -12.3
+    __ vabsd(D0, D0);      // 12.3
     __ vaddd(D0, D0, D1);  // 15.7
     __ vmuld(D0, D0, D1);  // 53.38
     __ vsubd(D0, D0, D1);  // 49.98
     __ vdivd(D0, D0, D1);  // 14.7
-    __ vsqrtd(D0, D0);  // 3.8340579
+    __ vsqrtd(D0, D0);     // 3.8340579
   }
   __ bx(LR);
 }
@@ -479,8 +451,8 @@
   EXPECT(test != NULL);
   if (TargetCPUFeatures::vfp_supported()) {
     typedef double (*IntToDoubleConversionCode)() DART_UNUSED;
-    double res = EXECUTE_TEST_CODE_DOUBLE(IntToDoubleConversionCode,
-                                          test->entry());
+    double res =
+        EXECUTE_TEST_CODE_DOUBLE(IntToDoubleConversionCode, test->entry());
     EXPECT_FLOAT_EQ(6.0, res, 0.001);
   }
 }
@@ -506,8 +478,8 @@
   EXPECT(test != NULL);
   if (TargetCPUFeatures::vfp_supported()) {
     typedef double (*LongToDoubleConversionCode)() DART_UNUSED;
-    double res = EXECUTE_TEST_CODE_DOUBLE(LongToDoubleConversionCode,
-                                          test->entry());
+    double res =
+        EXECUTE_TEST_CODE_DOUBLE(LongToDoubleConversionCode, test->entry());
     EXPECT_FLOAT_EQ(60000000000.0, res, 0.001);
   }
 }
@@ -527,8 +499,8 @@
   EXPECT(test != NULL);
   if (TargetCPUFeatures::vfp_supported()) {
     typedef float (*IntToFloatConversionCode)() DART_UNUSED;
-    float res = EXECUTE_TEST_CODE_FLOAT(IntToFloatConversionCode,
-                                        test->entry());
+    float res =
+        EXECUTE_TEST_CODE_FLOAT(IntToFloatConversionCode, test->entry());
     EXPECT_FLOAT_EQ(6.0, res, 0.001);
   }
 }
@@ -547,15 +519,12 @@
   EXPECT(test != NULL);
   if (TargetCPUFeatures::vfp_supported()) {
     typedef int (*FloatToIntConversion)(float arg) DART_UNUSED;
-    EXPECT_EQ(12,
-              EXECUTE_TEST_CODE_INT32_F(FloatToIntConversion, test->entry(),
-                                        12.8f));
-    EXPECT_EQ(INT_MIN,
-              EXECUTE_TEST_CODE_INT32_F(FloatToIntConversion, test->entry(),
-                                        -FLT_MAX));
-    EXPECT_EQ(INT_MAX,
-              EXECUTE_TEST_CODE_INT32_F(FloatToIntConversion, test->entry(),
-                                        FLT_MAX));
+    EXPECT_EQ(12, EXECUTE_TEST_CODE_INT32_F(FloatToIntConversion, test->entry(),
+                                            12.8f));
+    EXPECT_EQ(INT_MIN, EXECUTE_TEST_CODE_INT32_F(FloatToIntConversion,
+                                                 test->entry(), -FLT_MAX));
+    EXPECT_EQ(INT_MAX, EXECUTE_TEST_CODE_INT32_F(FloatToIntConversion,
+                                                 test->entry(), FLT_MAX));
   }
 }
 
@@ -573,15 +542,12 @@
   if (TargetCPUFeatures::vfp_supported()) {
     typedef int (*DoubleToIntConversion)(double arg) DART_UNUSED;
     EXPECT(test != NULL);
-    EXPECT_EQ(12,
-              EXECUTE_TEST_CODE_INT32_D(DoubleToIntConversion, test->entry(),
-                                        12.8));
-    EXPECT_EQ(INT_MIN,
-              EXECUTE_TEST_CODE_INT32_D(DoubleToIntConversion, test->entry(),
-                                        -DBL_MAX));
-    EXPECT_EQ(INT_MAX,
-              EXECUTE_TEST_CODE_INT32_D(DoubleToIntConversion, test->entry(),
-                                        DBL_MAX));
+    EXPECT_EQ(12, EXECUTE_TEST_CODE_INT32_D(DoubleToIntConversion,
+                                            test->entry(), 12.8));
+    EXPECT_EQ(INT_MIN, EXECUTE_TEST_CODE_INT32_D(DoubleToIntConversion,
+                                                 test->entry(), -DBL_MAX));
+    EXPECT_EQ(INT_MAX, EXECUTE_TEST_CODE_INT32_D(DoubleToIntConversion,
+                                                 test->entry(), DBL_MAX));
   }
 }
 
@@ -599,8 +565,8 @@
   if (TargetCPUFeatures::vfp_supported()) {
     typedef double (*FloatToDoubleConversionCode)() DART_UNUSED;
     EXPECT(test != NULL);
-    double res = EXECUTE_TEST_CODE_DOUBLE(FloatToDoubleConversionCode,
-                                          test->entry());
+    double res =
+        EXECUTE_TEST_CODE_DOUBLE(FloatToDoubleConversionCode, test->entry());
     EXPECT_FLOAT_EQ(12.8, res, 0.001);
   }
 }
@@ -619,8 +585,8 @@
   EXPECT(test != NULL);
   if (TargetCPUFeatures::vfp_supported()) {
     typedef float (*DoubleToFloatConversionCode)() DART_UNUSED;
-    float res = EXECUTE_TEST_CODE_FLOAT(DoubleToFloatConversionCode,
-                                        test->entry());
+    float res =
+        EXECUTE_TEST_CODE_FLOAT(DoubleToFloatConversionCode, test->entry());
     EXPECT_FLOAT_EQ(12.8, res, 0.001);
   }
 }
@@ -807,7 +773,7 @@
     __ strex(IP, R1, SP);  // IP == 0, success
     __ tst(IP, Operand(0));
     __ b(&retry, NE);  // NE if context switch occurred between ldrex and strex.
-    __ Pop(R0);  // 42
+    __ Pop(R0);        // 42
   }
   __ bx(LR);
 }
@@ -828,9 +794,9 @@
     __ mov(R1, Operand(42));
     __ Push(R0);
     __ ldrex(R0, SP);
-    __ clrex();  // Simulate a context switch.
+    __ clrex();            // Simulate a context switch.
     __ strex(IP, R1, SP);  // IP == 1, failure
-    __ Pop(R0);  // 40
+    __ Pop(R0);            // 40
     __ add(R0, R0, Operand(IP));
   }
   __ bx(LR);
@@ -886,7 +852,7 @@
   __ mov(R0, Operand(0));
   __ adds(IP, R2, Operand(R1));  // c_out = 1.
   __ adcs(IP, R2, Operand(R0));  // c_in = 1, c_out = 1.
-  __ adc(R0, R0, Operand(R0));  // c_in = 1.
+  __ adc(R0, R0, Operand(R0));   // c_in = 1.
   __ bx(LR);
 }
 
@@ -920,7 +886,7 @@
   __ mov(R0, Operand(0));
   __ subs(IP, R0, Operand(R1));  // c_out = 1.
   __ sbcs(IP, R0, Operand(R0));  // c_in = 1, c_out = 1.
-  __ sbc(R0, R0, Operand(R0));  // c_in = 1.
+  __ sbc(R0, R0, Operand(R0));   // c_in = 1.
   __ bx(LR);
 }
 
@@ -968,7 +934,7 @@
 
 ASSEMBLER_TEST_GENERATE(Orrs, assembler) {
   __ mov(R0, Operand(0));
-  __ tst(R0, Operand(R1));  // Set zero-flag.
+  __ tst(R0, Operand(R1));      // Set zero-flag.
   __ orrs(R0, R0, Operand(1));  // Clear zero-flag.
   __ bx(LR, EQ);
   __ mov(R0, Operand(42));
@@ -1009,7 +975,7 @@
     __ vcvtdi(D2, S4);
     __ vdivd(D0, D1, D2);
     __ vcvtid(S0, D0);
-    __ vmovrs(R1, S0);  // r1 = r0/r2
+    __ vmovrs(R1, S0);       // r1 = r0/r2
     __ mls(R0, R1, R2, R0);  // r0 = r0 - r1*r2
   }
   __ bx(LR);
@@ -1019,8 +985,8 @@
 ASSEMBLER_TEST_RUN(QuotientRemainder, test) {
   EXPECT(test != NULL);
   if (TargetCPUFeatures::vfp_supported()) {
-    typedef int64_t (*QuotientRemainder)
-        (int64_t dividend, int64_t divisor) DART_UNUSED;
+    typedef int64_t (*QuotientRemainder)(int64_t dividend, int64_t divisor)
+        DART_UNUSED;
     EXPECT_EQ(0x1000400000da8LL,
               EXECUTE_TEST_CODE_INT64_LL(QuotientRemainder, test->entry(),
                                          0x12345678, 0x1234));
@@ -1042,8 +1008,8 @@
 
 ASSEMBLER_TEST_RUN(Multiply64To64, test) {
   EXPECT(test != NULL);
-  typedef int64_t (*Multiply64To64)
-      (int64_t operand0, int64_t operand1) DART_UNUSED;
+  typedef int64_t (*Multiply64To64)(int64_t operand0, int64_t operand1)
+      DART_UNUSED;
   EXPECT_EQ(6,
             EXECUTE_TEST_CODE_INT64_LL(Multiply64To64, test->entry(), -3, -2));
 }
@@ -1057,8 +1023,8 @@
 
 ASSEMBLER_TEST_RUN(Multiply32To64, test) {
   EXPECT(test != NULL);
-  typedef int64_t (*Multiply32To64)
-      (int64_t operand0, int64_t operand1) DART_UNUSED;
+  typedef int64_t (*Multiply32To64)(int64_t operand0, int64_t operand1)
+      DART_UNUSED;
   EXPECT_EQ(6,
             EXECUTE_TEST_CODE_INT64_LL(Multiply32To64, test->entry(), -3, -2));
 }
@@ -1072,8 +1038,8 @@
 
 ASSEMBLER_TEST_RUN(MultiplyAccumAccum32To64, test) {
   EXPECT(test != NULL);
-  typedef int64_t (*MultiplyAccumAccum32To64)
-      (int64_t operand0, int64_t operand1) DART_UNUSED;
+  typedef int64_t (*MultiplyAccumAccum32To64)(int64_t operand0,
+                                              int64_t operand1) DART_UNUSED;
   EXPECT_EQ(3 + 7 + 5 * 11,
             EXECUTE_TEST_CODE_INT64_LL(MultiplyAccumAccum32To64, test->entry(),
                                        (3LL << 32) + 7, (5LL << 32) + 11));
@@ -1334,12 +1300,12 @@
 
 ASSEMBLER_TEST_GENERATE(Ldrd, assembler) {
   __ mov(IP, Operand(SP));
-  __ sub(SP, SP, Operand(kWordSize*30));
+  __ sub(SP, SP, Operand(kWordSize * 30));
   __ strd(R2, R3, SP, 0);
-  __ strd(R0, R1, IP, (-kWordSize*28));
-  __ ldrd(R2, R3, IP, (-kWordSize*28));
+  __ strd(R0, R1, IP, (-kWordSize * 28));
+  __ ldrd(R2, R3, IP, (-kWordSize * 28));
   __ ldrd(R0, R1, SP, 0);
-  __ add(SP, SP, Operand(kWordSize*30));
+  __ add(SP, SP, Operand(kWordSize * 30));
   __ sub(R0, R0, Operand(R2));
   __ add(R1, R1, Operand(R3));
   __ bx(LR);
@@ -1349,8 +1315,9 @@
 ASSEMBLER_TEST_RUN(Ldrd, test) {
   EXPECT(test != NULL);
   typedef int64_t (*Tst)(int64_t r0r1, int64_t r2r3) DART_UNUSED;
-  EXPECT_EQ(0x0000444400002222LL, EXECUTE_TEST_CODE_INT64_LL(
-      Tst, test->entry(), 0x0000111100000000LL, 0x0000333300002222LL));
+  EXPECT_EQ(0x0000444400002222LL,
+            EXECUTE_TEST_CODE_INT64_LL(Tst, test->entry(), 0x0000111100000000LL,
+                                       0x0000333300002222LL));
 }
 
 
@@ -1369,23 +1336,23 @@
   __ str(R2, Address(SP));                 // Should be a free slot.
   __ ldr(R9, Address(SP, 1 * kWordSize));  // R0.  R9 = +1.
   __ ldr(IP, Address(SP, 2 * kWordSize));  // R1.
-  __ sub(R9, R9, Operand(IP));      // -R1. R9 = -6.
+  __ sub(R9, R9, Operand(IP));             // -R1. R9 = -6.
   __ ldr(IP, Address(SP, 3 * kWordSize));  // R2.
-  __ add(R9, R9, Operand(IP));      // +R2. R9 = +5.
+  __ add(R9, R9, Operand(IP));             // +R2. R9 = +5.
   __ ldr(IP, Address(SP, 4 * kWordSize));  // R3.
-  __ sub(R9, R9, Operand(IP));      // -R3. R9 = -26.
+  __ sub(R9, R9, Operand(IP));             // -R3. R9 = -26.
   __ ldm(IB_W, SP, (1 << R0 | 1 << R1 | 1 << R2 | 1 << R3));
   // Same operations again. But this time from the restore registers.
   __ add(R9, R9, Operand(R0));
   __ sub(R9, R9, Operand(R1));
   __ add(R9, R9, Operand(R2));
   __ sub(R0, R9, Operand(R3));  // R0 = result = -52.
-  __ Pop(R1);  // Remove storage slot.
-  __ Pop(R9);  // Restore R9.
-  __ Pop(R9);  // Restore R9.
-  __ Pop(R9);  // Restore R9.
-  __ Pop(R9);  // Restore R9.
-  __ Pop(R9);  // Restore R9.
+  __ Pop(R1);                   // Remove storage slot.
+  __ Pop(R9);                   // Restore R9.
+  __ Pop(R9);                   // Restore R9.
+  __ Pop(R9);                   // Restore R9.
+  __ Pop(R9);                   // Restore R9.
+  __ Pop(R9);                   // Restore R9.
   __ bx(LR);
 }
 
@@ -3164,10 +3131,10 @@
 ASSEMBLER_TEST_GENERATE(Vmvnq, assembler) {
   if (TargetCPUFeatures::neon_supported()) {
     __ LoadImmediate(R1, 42);  // R1 <- 42.
-    __ vmovsr(S2, R1);  // S2 <- R1.
-    __ vmvnq(Q1, Q0);  // Q1 <- ~Q0.
-    __ vmvnq(Q2, Q1);  // Q2 <- ~Q1.
-    __ vmovrs(R0, S10);  // Now R0 should be 42 again.
+    __ vmovsr(S2, R1);         // S2 <- R1.
+    __ vmvnq(Q1, Q0);          // Q1 <- ~Q0.
+    __ vmvnq(Q2, Q1);          // Q2 <- ~Q1.
+    __ vmovrs(R0, S10);        // Now R0 should be 42 again.
   }
   __ bx(LR);
 }
@@ -3702,9 +3669,12 @@
 // This is the same function as in the Simulator.
 static float arm_recip_estimate(float a) {
   // From the ARM Architecture Reference Manual A2-85.
-  if (isinf(a) || (fabs(a) >= exp2f(126))) return 0.0;
-  else if (a == 0.0) return kPosInfinity;
-  else if (isnan(a)) return a;
+  if (isinf(a) || (fabs(a) >= exp2f(126)))
+    return 0.0;
+  else if (a == 0.0)
+    return kPosInfinity;
+  else if (isnan(a))
+    return a;
 
   uint32_t a_bits = bit_cast<uint32_t, float>(a);
   // scaled = '0011 1111 1110' : a<22:0> : Zeros(29)
@@ -3724,7 +3694,7 @@
   // r in units of 1/256 rounded to nearest.
   int32_t s = static_cast<int32_t>(256.0 * r + 0.5);
   double estimate = static_cast<double>(s) / 256.0;
-  ASSERT((estimate >= 1.0) && (estimate <= (511.0/256.0)));
+  ASSERT((estimate >= 1.0) && (estimate <= (511.0 / 256.0)));
 
   // result = sign : result_exp<7:0> : estimate<51:29>
   int32_t result_bits =
@@ -3808,16 +3778,19 @@
   if (TargetCPUFeatures::neon_supported()) {
     typedef float (*Reciprocal)() DART_UNUSED;
     float res = EXECUTE_TEST_CODE_FLOAT(Reciprocal, test->entry());
-    EXPECT_FLOAT_EQ(1.0/147000.0, res, 0.0001f);
+    EXPECT_FLOAT_EQ(1.0 / 147000.0, res, 0.0001f);
   }
 }
 
 
 static float arm_reciprocal_sqrt_estimate(float a) {
   // From the ARM Architecture Reference Manual A2-87.
-  if (isinf(a) || (fabs(a) >= exp2f(126))) return 0.0;
-  else if (a == 0.0) return kPosInfinity;
-  else if (isnan(a)) return a;
+  if (isinf(a) || (fabs(a) >= exp2f(126)))
+    return 0.0;
+  else if (a == 0.0)
+    return kPosInfinity;
+  else if (isnan(a))
+    return a;
 
   uint32_t a_bits = bit_cast<uint32_t, float>(a);
   uint64_t scaled;
@@ -3855,10 +3828,11 @@
   // r in units of 1/256 rounded to nearest.
   int32_t s = static_cast<int>(256.0 * r + 0.5);
   double estimate = static_cast<double>(s) / 256.0;
-  ASSERT((estimate >= 1.0) && (estimate <= (511.0/256.0)));
+  ASSERT((estimate >= 1.0) && (estimate <= (511.0 / 256.0)));
 
   // result = 0 : result_exp<7:0> : estimate<51:29>
-  int32_t result_bits = ((result_exp & 0xff) << 23) |
+  int32_t result_bits =
+      ((result_exp & 0xff) << 23) |
       ((bit_cast<uint64_t, double>(estimate) >> 29) & 0x7fffff);
   return bit_cast<float, int32_t>(result_bits);
 }
@@ -3910,7 +3884,7 @@
   if (TargetCPUFeatures::neon_supported()) {
     typedef float (*Vrsqrtsqs)() DART_UNUSED;
     float res = EXECUTE_TEST_CODE_FLOAT(Vrsqrtsqs, test->entry());
-    EXPECT_FLOAT_EQ((3.0 - 10.0 * 5.0)/2.0, res, 0.0001f);
+    EXPECT_FLOAT_EQ((3.0 - 10.0 * 5.0) / 2.0, res, 0.0001f);
   }
 }
 
@@ -3926,9 +3900,9 @@
     __ vrsqrteqs(Q0, Q1);
     // 2 Newton-Raphson steps. xn+1 = xn * (3 - Q1*xn^2) / 2.
     // First step.
-    __ vmulqs(Q2, Q0, Q0);  // Q2 <- xn^2
+    __ vmulqs(Q2, Q0, Q0);     // Q2 <- xn^2
     __ vrsqrtsqs(Q2, Q1, Q2);  // Q2 <- (3 - Q1*Q2) / 2.
-    __ vmulqs(Q0, Q0, Q2);  // xn+1 <- xn * Q2
+    __ vmulqs(Q0, Q0, Q2);     // xn+1 <- xn * Q2
     // Second step.
     __ vmulqs(Q2, Q0, Q0);
     __ vrsqrtsqs(Q2, Q1, Q2);
@@ -3943,7 +3917,7 @@
   if (TargetCPUFeatures::neon_supported()) {
     typedef float (*ReciprocalSqrt)() DART_UNUSED;
     float res = EXECUTE_TEST_CODE_FLOAT(ReciprocalSqrt, test->entry());
-    EXPECT_FLOAT_EQ(1.0/sqrt(147000.0), res, 0.0001f);
+    EXPECT_FLOAT_EQ(1.0 / sqrt(147000.0), res, 0.0001f);
   }
 }
 
@@ -3959,9 +3933,9 @@
     __ vrsqrteqs(Q0, Q1);
     // 2 Newton-Raphson steps. xn+1 = xn * (3 - Q1*xn^2) / 2.
     // First step.
-    __ vmulqs(Q2, Q0, Q0);  // Q2 <- xn^2
+    __ vmulqs(Q2, Q0, Q0);     // Q2 <- xn^2
     __ vrsqrtsqs(Q2, Q1, Q2);  // Q2 <- (3 - Q1*Q2) / 2.
-    __ vmulqs(Q0, Q0, Q2);  // xn+1 <- xn * Q2
+    __ vmulqs(Q0, Q0, Q2);     // xn+1 <- xn * Q2
     // Second step.
     __ vmulqs(Q2, Q0, Q0);
     __ vrsqrtsqs(Q2, Q1, Q2);
@@ -4002,9 +3976,9 @@
     __ vrsqrteqs(Q0, Q1);
     // 2 Newton-Raphson steps. xn+1 = xn * (3 - Q1*xn^2) / 2.
     // First step.
-    __ vmulqs(Q2, Q0, Q0);  // Q2 <- xn^2
+    __ vmulqs(Q2, Q0, Q0);     // Q2 <- xn^2
     __ vrsqrtsqs(Q2, Q1, Q2);  // Q2 <- (3 - Q1*Q2) / 2.
-    __ vmulqs(Q0, Q0, Q2);  // xn+1 <- xn * Q2
+    __ vmulqs(Q0, Q0, Q2);     // xn+1 <- xn * Q2
     // Second step.
     __ vmulqs(Q2, Q0, Q0);
     __ vrsqrtsqs(Q2, Q1, Q2);
@@ -4139,8 +4113,7 @@
 ASSEMBLER_TEST_GENERATE(StoreIntoObject, assembler) {
   __ PushList((1 << LR) | (1 << THR));
   __ mov(THR, Operand(R2));
-  __ StoreIntoObject(R1,
-                     FieldAddress(R1, GrowableObjectArray::data_offset()),
+  __ StoreIntoObject(R1, FieldAddress(R1, GrowableObjectArray::data_offset()),
                      R0);
   __ PopList((1 << LR) | (1 << THR));
   __ Ret();
diff --git a/runtime/vm/assembler_dbc.cc b/runtime/vm/assembler_dbc.cc
index f35d1d5..73beb06 100644
--- a/runtime/vm/assembler_dbc.cc
+++ b/runtime/vm/assembler_dbc.cc
@@ -26,11 +26,10 @@
   }
 }
 
-#define DEFINE_EMIT(Name, Signature, Fmt0, Fmt1, Fmt2)  \
-  void Assembler::Name(PARAMS_##Signature) {            \
-    Emit(Bytecode::FENCODE_##Signature(                 \
-        Bytecode::k##Name ENCODE_##Signature));         \
-  }                                                     \
+#define DEFINE_EMIT(Name, Signature, Fmt0, Fmt1, Fmt2)                         \
+  void Assembler::Name(PARAMS_##Signature) {                                   \
+    Emit(Bytecode::FENCODE_##Signature(Bytecode::k##Name ENCODE_##Signature)); \
+  }
 
 
 #define PARAMS_0
@@ -131,8 +130,7 @@
 
 
 intptr_t Assembler::AddConstant(const Object& obj) {
-  return object_pool_wrapper().FindObject(
-      Object::ZoneHandle(obj.raw()));
+  return object_pool_wrapper().FindObject(Object::ZoneHandle(obj.raw()));
 }
 
 
diff --git a/runtime/vm/assembler_dbc.h b/runtime/vm/assembler_dbc.h
index d956f70..dbe8216 100644
--- a/runtime/vm/assembler_dbc.h
+++ b/runtime/vm/assembler_dbc.h
@@ -29,7 +29,7 @@
 
 class Label : public ValueObject {
  public:
-  Label() : position_(0) { }
+  Label() : position_(0) {}
 
   ~Label() {
     // Assert if label is being destroyed with unresolved branches pending.
@@ -50,9 +50,7 @@
  private:
   intptr_t position_;
 
-  void Reinitialize() {
-    position_ = 0;
-  }
+  void Reinitialize() { position_ = 0; }
 
   void BindTo(intptr_t position) {
     ASSERT(!IsBound());
@@ -73,12 +71,9 @@
 
 class Assembler : public ValueObject {
  public:
-  explicit Assembler(bool use_far_branches = false)
-      : buffer_(),
-        comments_() {
-  }
+  explicit Assembler(bool use_far_branches = false) : buffer_(), comments_() {}
 
-  ~Assembler() { }
+  ~Assembler() {}
 
   void Bind(Label* label);
   void Jump(Label* label);
@@ -122,20 +117,16 @@
 
   static const char* RegisterName(Register reg);
 
-  static const char* FpuRegisterName(FpuRegister reg) {
-    return "?";
-  }
+  static const char* FpuRegisterName(FpuRegister reg) { return "?"; }
 
-  static uword GetBreakInstructionFiller() {
-    return Bytecode::kTrap;
-  }
+  static uword GetBreakInstructionFiller() { return Bytecode::kTrap; }
 
   static bool IsSafe(const Object& value) { return true; }
   static bool IsSafeSmi(const Object& value) { return false; }
 
-  // Bytecodes.
+// Bytecodes.
 
-#define DECLARE_EMIT(Name, Signature, Fmt0, Fmt1, Fmt2) \
+#define DECLARE_EMIT(Name, Signature, Fmt0, Fmt1, Fmt2)                        \
   void Name(PARAMS_##Signature);
 
 #define PARAMS_0
@@ -176,7 +167,7 @@
   class CodeComment : public ZoneAllocated {
    public:
     CodeComment(intptr_t pc_offset, const String& comment)
-        : pc_offset_(pc_offset), comment_(comment) { }
+        : pc_offset_(pc_offset), comment_(comment) {}
 
     intptr_t pc_offset() const { return pc_offset_; }
     const String& comment() const { return comment_; }
diff --git a/runtime/vm/assembler_dbc_test.cc b/runtime/vm/assembler_dbc_test.cc
index 254f638..a8d2fdf 100644
--- a/runtime/vm/assembler_dbc_test.cc
+++ b/runtime/vm/assembler_dbc_test.cc
@@ -14,22 +14,19 @@
 static RawObject* ExecuteTest(const Code& code) {
   Thread* thread = Thread::Current();
   TransitionToGenerated transition(thread);
-  return Simulator::Current()->Call(
-      code,
-      Array::Handle(ArgumentsDescriptor::New(0)),
-      Array::Handle(Array::New(0)),
-      thread);
+  return Simulator::Current()->Call(code,
+                                    Array::Handle(ArgumentsDescriptor::New(0)),
+                                    Array::Handle(Array::New(0)), thread);
 }
 
 
 #define EXECUTE_TEST_CODE_INTPTR(code)                                         \
-    Smi::Value(Smi::RawCast(ExecuteTest(code)))
+  Smi::Value(Smi::RawCast(ExecuteTest(code)))
 #define EXECUTE_TEST_CODE_BOOL(code)                                           \
-    (Bool::RawCast(ExecuteTest(code)) == Bool::True().raw())
-#define EXECUTE_TEST_CODE_OBJECT(code)                                         \
-    Object::Handle(ExecuteTest(code))
+  (Bool::RawCast(ExecuteTest(code)) == Bool::True().raw())
+#define EXECUTE_TEST_CODE_OBJECT(code) Object::Handle(ExecuteTest(code))
 #define EXECUTE_TEST_CODE_DOUBLE(code)                                         \
-    bit_cast<double, RawObject*>(ExecuteTest(code))
+  bit_cast<double, RawObject*>(ExecuteTest(code))
 
 #define __ assembler->
 
@@ -55,12 +52,11 @@
   const Script& script = Script::Handle();
   const Class& owner_class =
       Class::Handle(CreateDummyClass(class_name, script));
-  const Library& owner_library =
-      Library::Handle(CreateDummyLibrary(lib_name));
+  const Library& owner_library = Library::Handle(CreateDummyLibrary(lib_name));
   owner_class.set_library(owner_library);
   const String& function_name = String::ZoneHandle(Symbols::New(thread, name));
-  return Function::New(function_name, RawFunction::kRegularFunction,
-                       true, false, false, false, false, owner_class,
+  return Function::New(function_name, RawFunction::kRegularFunction, true,
+                       false, false, false, false, owner_class,
                        TokenPosition::kMinSource);
 }
 
@@ -86,11 +82,8 @@
   const Array& dummy_arguments_descriptor =
       Array::Handle(ArgumentsDescriptor::New(2));
   const ICData& ic_data = ICData::Handle(ICData::New(
-      dummy_instance_function,
-      String::Handle(dummy_instance_function.name()),
-      dummy_arguments_descriptor,
-      Thread::kNoDeoptId,
-      2,
+      dummy_instance_function, String::Handle(dummy_instance_function.name()),
+      dummy_arguments_descriptor, Thread::kNoDeoptId, 2,
       /* is_static_call= */ false));
 
   // Wire up the Function in the ICData.
@@ -1736,7 +1729,6 @@
 }
 
 
-
 //  - CheckSmi rA
 //
 //    If FP[rA] is a Smi, then skip the next instruction.
diff --git a/runtime/vm/assembler_ia32.cc b/runtime/vm/assembler_ia32.cc
index bb57905..713365d 100644
--- a/runtime/vm/assembler_ia32.cc
+++ b/runtime/vm/assembler_ia32.cc
@@ -35,8 +35,8 @@
 
 int32_t Assembler::jit_cookie() {
   if (jit_cookie_ == 0) {
-    jit_cookie_ = static_cast<int32_t>(
-        Isolate::Current()->random()->NextUInt32());
+    jit_cookie_ =
+        static_cast<int32_t>(Isolate::Current()->random()->NextUInt32());
   }
   return jit_cookie_;
 }
@@ -666,10 +666,8 @@
     uint32_t b;
     uint32_t c;
     uint32_t d;
-  } float_not_constant =
-      { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
-  xorps(dst,
-    Address::Absolute(reinterpret_cast<uword>(&float_not_constant)));
+  } float_not_constant = {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF};
+  xorps(dst, Address::Absolute(reinterpret_cast<uword>(&float_not_constant)));
 }
 
 
@@ -679,8 +677,7 @@
     uint32_t b;
     uint32_t c;
     uint32_t d;
-  } float_negate_constant =
-      { 0x80000000, 0x80000000, 0x80000000, 0x80000000 };
+  } float_negate_constant = {0x80000000, 0x80000000, 0x80000000, 0x80000000};
   xorps(dst,
         Address::Absolute(reinterpret_cast<uword>(&float_negate_constant)));
 }
@@ -692,8 +689,7 @@
     uint32_t b;
     uint32_t c;
     uint32_t d;
-  } float_absolute_constant =
-      { 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF };
+  } float_absolute_constant = {0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF};
   andps(dst,
         Address::Absolute(reinterpret_cast<uword>(&float_absolute_constant)));
 }
@@ -705,8 +701,7 @@
     uint32_t b;
     uint32_t c;
     uint32_t d;
-  } float_zerow_constant =
-      { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000 };
+  } float_zerow_constant = {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000};
   andps(dst, Address::Absolute(reinterpret_cast<uword>(&float_zerow_constant)));
 }
 
@@ -872,8 +867,7 @@
   static const struct ALIGN16 {
     uint64_t a;
     uint64_t b;
-  } double_negate_constant =
-      { 0x8000000000000000LL, 0x8000000000000000LL };
+  } double_negate_constant = {0x8000000000000000LL, 0x8000000000000000LL};
   xorpd(dst,
         Address::Absolute(reinterpret_cast<uword>(&double_negate_constant)));
 }
@@ -910,8 +904,7 @@
   static const struct ALIGN16 {
     uint64_t a;
     uint64_t b;
-  } double_absolute_constant =
-      { 0x7FFFFFFFFFFFFFFFLL, 0x7FFFFFFFFFFFFFFFLL };
+  } double_absolute_constant = {0x7FFFFFFFFFFFFFFFLL, 0x7FFFFFFFFFFFFFFFLL};
   andpd(dst,
         Address::Absolute(reinterpret_cast<uword>(&double_absolute_constant)));
 }
@@ -2252,9 +2245,8 @@
   // Mask out higher, uninteresting bits which were polluted by dest.
   andl(value, Immediate(kObjectAlignment - 1));
   // Compare with the expected bit pattern.
-  cmpl(value, Immediate(
-      (kNewObjectAlignmentOffset >> 1) + kHeapObjectTag +
-      kOldObjectAlignmentOffset + kHeapObjectTag));
+  cmpl(value, Immediate((kNewObjectAlignmentOffset >> 1) + kHeapObjectTag +
+                        kOldObjectAlignmentOffset + kHeapObjectTag));
   j(NOT_ZERO, no_update, Assembler::kNearJump);
 }
 
@@ -2373,8 +2365,7 @@
     uint32_t b;
     uint32_t c;
     uint32_t d;
-  } float_negate_constant =
-      { 0x80000000, 0x00000000, 0x80000000, 0x00000000 };
+  } float_negate_constant = {0x80000000, 0x00000000, 0x80000000, 0x00000000};
   xorps(f, Address::Absolute(reinterpret_cast<uword>(&float_negate_constant)));
 }
 
@@ -2383,8 +2374,7 @@
   static const struct ALIGN16 {
     uint64_t a;
     uint64_t b;
-  } double_negate_constant =
-      {0x8000000000000000LL, 0x8000000000000000LL};
+  } double_negate_constant = {0x8000000000000000LL, 0x8000000000000000LL};
   xorpd(d, Address::Absolute(reinterpret_cast<uword>(&double_negate_constant)));
 }
 
@@ -2393,8 +2383,7 @@
   static const struct ALIGN16 {
     uint64_t a;
     uint64_t b;
-  } double_abs_constant =
-      {0x7FFFFFFFFFFFFFFFLL, 0x7FFFFFFFFFFFFFFFLL};
+  } double_abs_constant = {0x7FFFFFFFFFFFFFFFLL, 0x7FFFFFFFFFFFFFFFLL};
   andpd(reg, Address::Absolute(reinterpret_cast<uword>(&double_abs_constant)));
 }
 
@@ -2438,14 +2427,12 @@
 
 static const intptr_t kNumberOfVolatileCpuRegisters = 3;
 static const Register volatile_cpu_registers[kNumberOfVolatileCpuRegisters] = {
-    EAX, ECX, EDX
-};
+    EAX, ECX, EDX};
 
 
 // XMM0 is used only as a scratch register in the optimized code. No need to
 // save it.
-static const intptr_t kNumberOfVolatileXmmRegisters =
-    kNumberOfXmmRegisters - 1;
+static const intptr_t kNumberOfVolatileXmmRegisters = kNumberOfXmmRegisters - 1;
 
 
 void Assembler::EnterCallRuntimeFrame(intptr_t frame_space) {
@@ -2546,7 +2533,7 @@
   if (bytes_needed) {
     nop(bytes_needed);
   }
-  ASSERT(((offset + buffer_.GetPosition()) & (alignment-1)) == 0);
+  ASSERT(((offset + buffer_.GetPosition()) & (alignment - 1)) == 0);
 }
 
 
@@ -2642,7 +2629,7 @@
     // (i.e. the allocation stub) which will allocate the object and trace the
     // allocation call site.
     NOT_IN_PRODUCT(
-      MaybeTraceAllocation(cls.id(), temp_reg, failure, near_jump));
+        MaybeTraceAllocation(cls.id(), temp_reg, failure, near_jump));
     const intptr_t instance_size = cls.instance_size();
     Heap::Space space = Heap::kNew;
     movl(temp_reg, Address(THR, Thread::heap_offset()));
@@ -2760,7 +2747,7 @@
     pushl(EAX);  // Preserve EAX.
     movl(EAX, Immediate(reinterpret_cast<int32_t>(message)));
     Call(*StubCode::PrintStopMessage_entry());  // Passing message in EAX.
-    popl(EAX);  // Restore EAX.
+    popl(EAX);                                  // Restore EAX.
   } else {
     // Emit the message address as immediate operand in the test instruction.
     testl(EAX, Immediate(reinterpret_cast<int32_t>(message)));
@@ -2837,9 +2824,7 @@
 }
 
 
-void Assembler::EmitGenericShift(int rm,
-                                 Register reg,
-                                 const Immediate& imm) {
+void Assembler::EmitGenericShift(int rm, Register reg, const Immediate& imm) {
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   ASSERT(imm.is_int8());
   if (imm.value() == 1) {
@@ -2866,8 +2851,8 @@
 void Assembler::LoadClassId(Register result, Register object) {
   ASSERT(RawObject::kClassIdTagPos == 16);
   ASSERT(RawObject::kClassIdTagSize == 16);
-  const intptr_t class_id_offset = Object::tags_offset() +
-      RawObject::kClassIdTagPos / kBitsPerByte;
+  const intptr_t class_id_offset =
+      Object::tags_offset() + RawObject::kClassIdTagPos / kBitsPerByte;
   movzxw(result, FieldAddress(object, class_id_offset));
 }
 
@@ -2904,8 +2889,8 @@
   ASSERT(kSmiTagShift == 1);
   ASSERT(RawObject::kClassIdTagPos == 16);
   ASSERT(RawObject::kClassIdTagSize == 16);
-  const intptr_t class_id_offset = Object::tags_offset() +
-      RawObject::kClassIdTagPos / kBitsPerByte;
+  const intptr_t class_id_offset =
+      Object::tags_offset() + RawObject::kClassIdTagPos / kBitsPerByte;
 
   // Untag optimistically. Tag bit is shifted into the CARRY.
   SmiUntag(object);
@@ -2950,7 +2935,7 @@
     return Address(array, index * index_scale);
   } else {
     const int64_t disp = static_cast<int64_t>(index) * index_scale +
-        Instance::DataOffsetFor(cid);
+                         Instance::DataOffsetFor(cid);
     ASSERT(Utils::IsInt(32, disp));
     return FieldAddress(array, static_cast<int32_t>(disp));
   }
@@ -2963,11 +2948,16 @@
   // expected to be untagged before accessing.
   ASSERT(kSmiTagShift == 1);
   switch (index_scale) {
-    case 1: return TIMES_1;
-    case 2: return TIMES_1;
-    case 4: return TIMES_2;
-    case 8: return TIMES_4;
-    case 16: return TIMES_8;
+    case 1:
+      return TIMES_1;
+    case 2:
+      return TIMES_1;
+    case 4:
+      return TIMES_2;
+    case 8:
+      return TIMES_4;
+    case 16:
+      return TIMES_8;
     default:
       UNREACHABLE();
       return TIMES_1;
@@ -2976,24 +2966,21 @@
 
 
 Address Assembler::ElementAddressForRegIndex(bool is_external,
-                                            intptr_t cid,
-                                            intptr_t index_scale,
-                                            Register array,
-                                            Register index) {
+                                             intptr_t cid,
+                                             intptr_t index_scale,
+                                             Register array,
+                                             Register index) {
   if (is_external) {
     return Address(array, index, ToScaleFactor(index_scale), 0);
   } else {
-    return FieldAddress(array,
-                        index,
-                        ToScaleFactor(index_scale),
+    return FieldAddress(array, index, ToScaleFactor(index_scale),
                         Instance::DataOffsetFor(cid));
   }
 }
 
 
 static const char* cpu_reg_names[kNumberOfCpuRegisters] = {
-  "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi"
-};
+    "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi"};
 
 
 const char* Assembler::RegisterName(Register reg) {
@@ -3003,8 +2990,7 @@
 
 
 static const char* xmm_reg_names[kNumberOfXmmRegisters] = {
-  "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7"
-};
+    "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7"};
 
 
 const char* Assembler::FpuRegisterName(FpuRegister reg) {
diff --git a/runtime/vm/assembler_ia32.h b/runtime/vm/assembler_ia32.h
index d49e844..90214f5 100644
--- a/runtime/vm/assembler_ia32.h
+++ b/runtime/vm/assembler_ia32.h
@@ -21,9 +21,9 @@
 
 class Immediate : public ValueObject {
  public:
-  explicit Immediate(int32_t value) : value_(value) { }
+  explicit Immediate(int32_t value) : value_(value) {}
 
-  Immediate(const Immediate& other) : ValueObject(), value_(other.value_) { }
+  Immediate(const Immediate& other) : ValueObject(), value_(other.value_) {}
 
   int32_t value() const { return value_; }
 
@@ -42,13 +42,9 @@
 
 class Operand : public ValueObject {
  public:
-  uint8_t mod() const {
-    return (encoding_at(0) >> 6) & 3;
-  }
+  uint8_t mod() const { return (encoding_at(0) >> 6) & 3; }
 
-  Register rm() const {
-    return static_cast<Register>(encoding_at(0) & 7);
-  }
+  Register rm() const { return static_cast<Register>(encoding_at(0) & 7); }
 
   ScaleFactor scale() const {
     return static_cast<ScaleFactor>((encoding_at(1) >> 6) & 3);
@@ -58,9 +54,7 @@
     return static_cast<Register>((encoding_at(1) >> 3) & 7);
   }
 
-  Register base() const {
-    return static_cast<Register>(encoding_at(1) & 7);
-  }
+  Register base() const { return static_cast<Register>(encoding_at(1) & 7); }
 
   int8_t disp8() const {
     ASSERT(length_ >= 2);
@@ -91,7 +85,7 @@
   }
 
  protected:
-  Operand() : length_(0) { }  // Needed by subclass Address.
+  Operand() : length_(0) {}  // Needed by subclass Address.
 
   void SetModRM(int mod, Register rm) {
     ASSERT((mod & ~3) == 0);
@@ -135,7 +129,7 @@
   // disguise. Used from the assembler to generate better encodings.
   bool IsRegister(Register reg) const {
     return ((encoding_[0] & 0xF8) == 0xC0)  // Addressing mode is register only.
-        && ((encoding_[0] & 0x07) == reg);  // Register codes match.
+           && ((encoding_[0] & 0x07) == reg);  // Register codes match.
   }
 
   friend class Assembler;
@@ -188,7 +182,7 @@
   // This addressing mode does not exist.
   Address(Register base, Register index, ScaleFactor scale, Register r);
 
-  Address(const Address& other) : Operand(other) { }
+  Address(const Address& other) : Operand(other) {}
 
   Address& operator=(const Address& other) {
     Operand::operator=(other);
@@ -203,25 +197,25 @@
   }
 
  private:
-  Address() { }  // Needed by Address::Absolute.
+  Address() {}  // Needed by Address::Absolute.
 };
 
 
 class FieldAddress : public Address {
  public:
   FieldAddress(Register base, int32_t disp)
-      : Address(base, disp - kHeapObjectTag) { }
+      : Address(base, disp - kHeapObjectTag) {}
 
   // This addressing mode does not exist.
   FieldAddress(Register base, Register r);
 
   FieldAddress(Register base, Register index, ScaleFactor scale, int32_t disp)
-      : Address(base, index, scale, disp - kHeapObjectTag) { }
+      : Address(base, index, scale, disp - kHeapObjectTag) {}
 
   // This addressing mode does not exist.
   FieldAddress(Register base, Register index, ScaleFactor scale, Register r);
 
-  FieldAddress(const FieldAddress& other) : Address(other) { }
+  FieldAddress(const FieldAddress& other) : Address(other) {}
 
   FieldAddress& operator=(const FieldAddress& other) {
     Address::operator=(other);
@@ -310,7 +304,7 @@
     // This mode is only needed and implemented for MIPS and ARM.
     ASSERT(!use_far_branches);
   }
-  ~Assembler() { }
+  ~Assembler() {}
 
   static const bool kNearJump = true;
   static const bool kFarJump = false;
@@ -498,9 +492,9 @@
 
   enum RoundingMode {
     kRoundToNearest = 0x0,
-    kRoundDown      = 0x1,
-    kRoundUp        = 0x2,
-    kRoundToZero    = 0x3
+    kRoundDown = 0x1,
+    kRoundUp = 0x2,
+    kRoundToZero = 0x3
   };
   void roundsd(XmmRegister dst, XmmRegister src, RoundingMode mode);
 
@@ -632,9 +626,7 @@
   void int3();
   void hlt();
 
-  static uword GetBreakInstructionFiller() {
-    return 0xCCCCCCCC;
-  }
+  static uword GetBreakInstructionFiller() { return 0xCCCCCCCC; }
 
   void j(Condition condition, Label* label, bool near = kFarJump);
   void j(Condition condition, const ExternalLabel* label);
@@ -675,9 +667,9 @@
   void CompareObject(Register reg, const Object& object);
   void LoadDoubleConstant(XmmRegister dst, double value);
 
-  void StoreIntoObject(Register object,  // Object we are storing into.
+  void StoreIntoObject(Register object,      // Object we are storing into.
                        const Address& dest,  // Where we are storing into.
-                       Register value,  // Value we are storing.
+                       Register value,       // Value we are storing.
                        bool can_value_be_smi = true);
 
   void StoreIntoObjectNoBarrier(Register object,
@@ -759,13 +751,9 @@
   /*
    * Misc. functionality
    */
-  void SmiTag(Register reg) {
-    addl(reg, reg);
-  }
+  void SmiTag(Register reg) { addl(reg, reg); }
 
-  void SmiUntag(Register reg) {
-    sarl(reg, Immediate(kSmiTagSize));
-  }
+  void SmiUntag(Register reg) { sarl(reg, Immediate(kSmiTagSize)); }
 
   void BranchIfNotSmi(Register reg, Label* label) {
     testl(reg, Immediate(kSmiTagMask));
@@ -777,9 +765,7 @@
   void Jump(Label* label) { jmp(label); }
 
   // Address of code at offset.
-  uword CodeAddress(intptr_t offset) {
-    return buffer_.Address(offset);
-  }
+  uword CodeAddress(intptr_t offset) { return buffer_.Address(offset); }
 
   intptr_t CodeSize() const { return buffer_.Size(); }
   intptr_t prologue_offset() const { return prologue_offset_; }
@@ -787,9 +773,7 @@
 
   // Count the fixups that produce a pointer offset, without processing
   // the fixups.
-  intptr_t CountPointerOffsets() const {
-    return buffer_.CountPointerOffsets();
-  }
+  intptr_t CountPointerOffsets() const { return buffer_.CountPointerOffsets(); }
   const ZoneGrowableArray<intptr_t>& GetPointerOffsets() const {
     return buffer_.pointer_offsets();
   }
@@ -932,9 +916,7 @@
     return !object.IsSmi() || IsSafeSmi(object);
   }
 
-  void set_code_object(const Code& code) {
-    code_ ^= code.raw();
-  }
+  void set_code_object(const Code& code) { code_ ^= code.raw(); }
 
   void PushCodeObject();
 
@@ -942,7 +924,7 @@
   class CodeComment : public ZoneAllocated {
    public:
     CodeComment(intptr_t pc_offset, const String& comment)
-        : pc_offset_(pc_offset), comment_(comment) { }
+        : pc_offset_(pc_offset), comment_(comment) {}
 
     intptr_t pc_offset() const { return pc_offset_; }
     const String& comment() const { return comment_; }
diff --git a/runtime/vm/assembler_ia32_test.cc b/runtime/vm/assembler_ia32_test.cc
index 116cc9e..4ea1c65 100644
--- a/runtime/vm/assembler_ia32_test.cc
+++ b/runtime/vm/assembler_ia32_test.cc
@@ -107,8 +107,7 @@
 ASSEMBLER_TEST_GENERATE(JumpAroundCrash, assembler) {
   Label done;
   // Make sure all the condition jumps work.
-  for (Condition condition = OVERFLOW;
-       condition <= GREATER;
+  for (Condition condition = OVERFLOW; condition <= GREATER;
        condition = static_cast<Condition>(condition + 1)) {
     __ j(condition, &done);
   }
@@ -136,8 +135,7 @@
 ASSEMBLER_TEST_GENERATE(NearJumpAroundCrash, assembler) {
   Label done;
   // Make sure all the condition jumps work.
-  for (Condition condition = OVERFLOW;
-       condition <= GREATER;
+  for (Condition condition = OVERFLOW; condition <= GREATER;
        condition = static_cast<Condition>(condition + 1)) {
     __ j(condition, &done, Assembler::kNearJump);
   }
@@ -359,7 +357,7 @@
 ASSEMBLER_TEST_GENERATE(MoveExtend, assembler) {
   __ pushl(EBX);  // preserve EBX.
   __ movl(EDX, Immediate(0x1234ffff));
-  __ movzxb(EAX, DL);  // EAX = 0xff
+  __ movzxb(EAX, DL);   // EAX = 0xff
   __ movsxw(EBX, EDX);  // EBX = -1
   __ movzxw(ECX, EDX);  // ECX = 0xffff
   __ addl(EBX, ECX);
@@ -409,16 +407,16 @@
   __ andl(ECX, EAX);  // 0x740.
   __ pushl(Immediate(0xF6FF));
   __ andl(ECX, Address(ESP, 0));  // 0x640.
-  __ popl(EAX);  // Discard.
+  __ popl(EAX);                   // Discard.
   __ movl(EAX, Immediate(1));
   __ orl(ECX, EAX);  // 0x641.
   __ pushl(Immediate(0x7));
   __ orl(ECX, Address(ESP, 0));  // 0x647.
-  __ popl(EAX);  // Discard.
-  __ xorl(ECX, Immediate(0));  // 0x647.
+  __ popl(EAX);                  // Discard.
+  __ xorl(ECX, Immediate(0));    // 0x647.
   __ pushl(Immediate(0x1C));
   __ xorl(ECX, Address(ESP, 0));  // 0x65B.
-  __ popl(EAX);  // Discard.
+  __ popl(EAX);                   // Discard.
   __ movl(EAX, Address(ESP, kWordSize));
   __ movl(EDX, Immediate(0xB0));
   __ orl(Address(EAX, 0), EDX);
@@ -776,8 +774,9 @@
 
 static int ComputeStackSpaceReservation(int needed, int fixed) {
   return (OS::ActivationFrameAlignment() > 1)
-      ? Utils::RoundUp(needed + fixed, OS::ActivationFrameAlignment()) - fixed
-      : needed;
+             ? Utils::RoundUp(needed + fixed, OS::ActivationFrameAlignment()) -
+                   fixed
+             : needed;
 }
 
 
@@ -880,7 +879,6 @@
 }
 
 
-
 ASSEMBLER_TEST_GENERATE(SingleFPMoves2, assembler) {
   __ pushl(EBX);  // preserve EBX.
   __ pushl(ECX);  // preserve ECX.
@@ -955,10 +953,10 @@
   __ movl(EAX, Immediate(bit_cast<int32_t, float>(3.4f)));
   __ movd(XMM1, EAX);
   __ shufps(XMM1, XMM1, Immediate(0x0));
-  __ addps(XMM0, XMM1);  // 15.7f
-  __ mulps(XMM0, XMM1);  // 53.38f
-  __ subps(XMM0, XMM1);  // 49.98f
-  __ divps(XMM0, XMM1);  // 14.7f
+  __ addps(XMM0, XMM1);                    // 15.7f
+  __ mulps(XMM0, XMM1);                    // 53.38f
+  __ subps(XMM0, XMM1);                    // 49.98f
+  __ divps(XMM0, XMM1);                    // 14.7f
   __ shufps(XMM0, XMM0, Immediate(0x55));  // Copy second lane into all 4 lanes.
   __ pushl(EAX);
   // Copy the low lane at ESP.
@@ -1006,11 +1004,11 @@
   __ movd(XMM0, EAX);
   __ shufps(XMM0, XMM0, Immediate(0x0));
 
-  __ movaps(XMM1, XMM0);  // Copy XMM0
-  __ reciprocalps(XMM1);  // 0.25
-  __ sqrtps(XMM1);  // 0.5
-  __ rsqrtps(XMM0);  // ~0.5
-  __ subps(XMM0, XMM1);  // ~0.0
+  __ movaps(XMM1, XMM0);                   // Copy XMM0
+  __ reciprocalps(XMM1);                   // 0.25
+  __ sqrtps(XMM1);                         // 0.5
+  __ rsqrtps(XMM0);                        // ~0.5
+  __ subps(XMM0, XMM1);                    // ~0.0
   __ shufps(XMM0, XMM0, Immediate(0x00));  // Copy second lane into all 4 lanes.
   __ pushl(EAX);
   // Copy the low lane at ESP.
@@ -1258,15 +1256,13 @@
     uint32_t b;
     uint32_t c;
     uint32_t d;
-  } constant1 =
-      { 0xF0F0F0F0, 0xF0F0F0F0, 0xF0F0F0F0, 0xF0F0F0F0 };
+  } constant1 = {0xF0F0F0F0, 0xF0F0F0F0, 0xF0F0F0F0, 0xF0F0F0F0};
   static const struct ALIGN16 {
     uint32_t a;
     uint32_t b;
     uint32_t c;
     uint32_t d;
-  } constant2 =
-      { 0x0F0F0F0F, 0x0F0F0F0F, 0x0F0F0F0F, 0x0F0F0F0F };
+  } constant2 = {0x0F0F0F0F, 0x0F0F0F0F, 0x0F0F0F0F, 0x0F0F0F0F};
   __ movups(XMM0, Address::Absolute(reinterpret_cast<uword>(&constant1)));
   __ movups(XMM1, Address::Absolute(reinterpret_cast<uword>(&constant2)));
   __ orps(XMM0, XMM1);
@@ -1292,15 +1288,13 @@
     uint32_t b;
     uint32_t c;
     uint32_t d;
-  } constant1 =
-      { 0xF0F0F0F0, 0xF0F0F0F0, 0xF0F0F0F0, 0xF0F0F0F0 };
+  } constant1 = {0xF0F0F0F0, 0xF0F0F0F0, 0xF0F0F0F0, 0xF0F0F0F0};
   static const struct ALIGN16 {
     uint32_t a;
     uint32_t b;
     uint32_t c;
     uint32_t d;
-  } constant2 =
-      { 0x0F0FFF0F, 0x0F0F0F0F, 0x0F0F0F0F, 0x0F0F0F0F };
+  } constant2 = {0x0F0FFF0F, 0x0F0F0F0F, 0x0F0F0F0F, 0x0F0F0F0F};
   __ movups(XMM0, Address::Absolute(reinterpret_cast<uword>(&constant1)));
   __ andps(XMM0, Address::Absolute(reinterpret_cast<uword>(&constant2)));
   // Copy the low lane at ESP.
@@ -1325,8 +1319,7 @@
     uint32_t b;
     uint32_t c;
     uint32_t d;
-  } constant1 =
-      { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
+  } constant1 = {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF};
   __ movups(XMM0, Address::Absolute(reinterpret_cast<uword>(&constant1)));
   __ notps(XMM0);
   // Copy the low lane at ESP.
@@ -1351,13 +1344,13 @@
     float b;
     float c;
     float d;
-  } constant0 = { 1.0, 2.0, 3.0, 4.0 };
+  } constant0 = {1.0, 2.0, 3.0, 4.0};
   static const struct ALIGN16 {
     float a;
     float b;
     float c;
     float d;
-  } constant1 = { 5.0, 6.0, 7.0, 8.0 };
+  } constant1 = {5.0, 6.0, 7.0, 8.0};
   // XMM0 = 1.0f, 2.0f, 3.0f, 4.0f.
   __ movups(XMM0, Address::Absolute(reinterpret_cast<uword>(&constant0)));
   // XMM1 = 5.0f, 6.0f, 7.0f, 8.0f.
@@ -1369,7 +1362,7 @@
   __ movaps(XMM1, XMM0);
   __ shufps(XMM0, XMM0, Immediate(0x00));  // 7.0f.
   __ shufps(XMM1, XMM1, Immediate(0x55));  // 8.0f.
-  __ addss(XMM0, XMM1);  // 15.0f.
+  __ addss(XMM0, XMM1);                    // 15.0f.
   __ pushl(EAX);
   __ movss(Address(ESP, 0), XMM0);
   __ flds(Address(ESP, 0));
@@ -1391,13 +1384,13 @@
     float b;
     float c;
     float d;
-  } constant0 = { 1.0, 2.0, 3.0, 4.0 };
+  } constant0 = {1.0, 2.0, 3.0, 4.0};
   static const struct ALIGN16 {
     float a;
     float b;
     float c;
     float d;
-  } constant1 = { 5.0, 6.0, 7.0, 8.0 };
+  } constant1 = {5.0, 6.0, 7.0, 8.0};
   // XMM0 = 1.0f, 2.0f, 3.0f, 4.0f.
   __ movups(XMM0, Address::Absolute(reinterpret_cast<uword>(&constant0)));
   // XMM1 = 5.0f, 6.0f, 7.0f, 8.0f.
@@ -1409,7 +1402,7 @@
   __ movaps(XMM1, XMM0);
   __ shufps(XMM0, XMM0, Immediate(0xAA));  // 5.0f.
   __ shufps(XMM1, XMM1, Immediate(0xFF));  // 6.0f.
-  __ addss(XMM0, XMM1);  // 11.0f.
+  __ addss(XMM0, XMM1);                    // 11.0f.
   __ pushl(EAX);
   __ movss(Address(ESP, 0), XMM0);
   __ flds(Address(ESP, 0));
@@ -1431,13 +1424,13 @@
     float b;
     float c;
     float d;
-  } constant0 = { 1.0, 2.0, 3.0, 4.0 };
+  } constant0 = {1.0, 2.0, 3.0, 4.0};
   static const struct ALIGN16 {
     float a;
     float b;
     float c;
     float d;
-  } constant1 = { 5.0, 6.0, 7.0, 8.0 };
+  } constant1 = {5.0, 6.0, 7.0, 8.0};
   // XMM0 = 1.0f, 2.0f, 3.0f, 4.0f.
   __ movups(XMM0, Address::Absolute(reinterpret_cast<uword>(&constant0)));
   // XMM1 = 5.0f, 6.0f, 7.0f, 8.0f.
@@ -1470,13 +1463,13 @@
     float b;
     float c;
     float d;
-  } constant0 = { 1.0, 2.0, 3.0, 4.0 };
+  } constant0 = {1.0, 2.0, 3.0, 4.0};
   static const struct ALIGN16 {
     float a;
     float b;
     float c;
     float d;
-  } constant1 = { 5.0, 6.0, 7.0, 8.0 };
+  } constant1 = {5.0, 6.0, 7.0, 8.0};
   // XMM0 = 1.0f, 2.0f, 3.0f, 4.0f.
   __ movups(XMM0, Address::Absolute(reinterpret_cast<uword>(&constant0)));
   // XMM1 = 5.0f, 6.0f, 7.0f, 8.0f.
@@ -1509,13 +1502,13 @@
     float b;
     float c;
     float d;
-  } constant0 = { 1.0, 2.0, 3.0, 4.0 };
+  } constant0 = {1.0, 2.0, 3.0, 4.0};
   static const struct ALIGN16 {
     float a;
     float b;
     float c;
     float d;
-  } constant1 = { 5.0, 6.0, 7.0, 8.0 };
+  } constant1 = {5.0, 6.0, 7.0, 8.0};
   // XMM0 = 1.0f, 2.0f, 3.0f, 4.0f.
   __ movups(XMM0, Address::Absolute(reinterpret_cast<uword>(&constant0)));
   // XMM1 = 5.0f, 6.0f, 7.0f, 8.0f.
@@ -1548,13 +1541,13 @@
     float b;
     float c;
     float d;
-  } constant0 = { 1.0, 2.0, 3.0, 4.0 };
+  } constant0 = {1.0, 2.0, 3.0, 4.0};
   static const struct ALIGN16 {
     float a;
     float b;
     float c;
     float d;
-  } constant1 = { 5.0, 6.0, 7.0, 8.0 };
+  } constant1 = {5.0, 6.0, 7.0, 8.0};
   // XMM0 = 1.0f, 2.0f, 3.0f, 4.0f.
   __ movups(XMM0, Address::Absolute(reinterpret_cast<uword>(&constant0)));
   // XMM1 = 5.0f, 6.0f, 7.0f, 8.0f.
@@ -1585,11 +1578,11 @@
   static const struct ALIGN16 {
     double a;
     double b;
-  } constant0 = { 1.0, 2.0 };
+  } constant0 = {1.0, 2.0};
   static const struct ALIGN16 {
     double a;
     double b;
-  } constant1 = { 3.0, 4.0 };
+  } constant1 = {3.0, 4.0};
   __ movups(XMM0, Address::Absolute(reinterpret_cast<uword>(&constant0)));
   __ movups(XMM1, Address::Absolute(reinterpret_cast<uword>(&constant1)));
   __ addpd(XMM0, XMM1);
@@ -1614,11 +1607,11 @@
   static const struct ALIGN16 {
     double a;
     double b;
-  } constant0 = { 1.0, 2.0 };
+  } constant0 = {1.0, 2.0};
   static const struct ALIGN16 {
     double a;
     double b;
-  } constant1 = { 3.0, 4.0 };
+  } constant1 = {3.0, 4.0};
   __ movups(XMM0, Address::Absolute(reinterpret_cast<uword>(&constant0)));
   __ movups(XMM1, Address::Absolute(reinterpret_cast<uword>(&constant1)));
   __ subpd(XMM0, XMM1);
@@ -1643,7 +1636,7 @@
   static const struct ALIGN16 {
     double a;
     double b;
-  } constant0 = { 1.0, 2.0 };
+  } constant0 = {1.0, 2.0};
   __ movups(XMM0, Address::Absolute(reinterpret_cast<uword>(&constant0)));
   __ negatepd(XMM0);
   __ pushl(EAX);
@@ -1667,7 +1660,7 @@
   static const struct ALIGN16 {
     double a;
     double b;
-  } constant0 = { -1.0, 2.0 };
+  } constant0 = {-1.0, 2.0};
   __ movups(XMM0, Address::Absolute(reinterpret_cast<uword>(&constant0)));
   __ abspd(XMM0);
   __ pushl(EAX);
@@ -1691,11 +1684,11 @@
   static const struct ALIGN16 {
     double a;
     double b;
-  } constant0 = { 3.0, 2.0 };
+  } constant0 = {3.0, 2.0};
   static const struct ALIGN16 {
     double a;
     double b;
-  } constant1 = { 3.0, 4.0 };
+  } constant1 = {3.0, 4.0};
   __ movups(XMM0, Address::Absolute(reinterpret_cast<uword>(&constant0)));
   __ movups(XMM1, Address::Absolute(reinterpret_cast<uword>(&constant1)));
   __ mulpd(XMM0, XMM1);
@@ -1720,11 +1713,11 @@
   static const struct ALIGN16 {
     double a;
     double b;
-  } constant0 = { 9.0, 2.0 };
+  } constant0 = {9.0, 2.0};
   static const struct ALIGN16 {
     double a;
     double b;
-  } constant1 = { 3.0, 4.0 };
+  } constant1 = {3.0, 4.0};
   __ movups(XMM0, Address::Absolute(reinterpret_cast<uword>(&constant0)));
   __ movups(XMM1, Address::Absolute(reinterpret_cast<uword>(&constant1)));
   __ divpd(XMM0, XMM1);
@@ -1749,7 +1742,7 @@
   static const struct ALIGN16 {
     double a;
     double b;
-  } constant0 = { 16.0, 2.0 };
+  } constant0 = {16.0, 2.0};
   __ movups(XMM0, Address::Absolute(reinterpret_cast<uword>(&constant0)));
   __ sqrtpd(XMM0);
   __ pushl(EAX);
@@ -1773,11 +1766,11 @@
   static const struct ALIGN16 {
     double a;
     double b;
-  } constant0 = { 9.0, 2.0 };
+  } constant0 = {9.0, 2.0};
   static const struct ALIGN16 {
     double a;
     double b;
-  } constant1 = { 3.0, 4.0 };
+  } constant1 = {3.0, 4.0};
   __ movups(XMM0, Address::Absolute(reinterpret_cast<uword>(&constant0)));
   __ movups(XMM1, Address::Absolute(reinterpret_cast<uword>(&constant1)));
   __ minpd(XMM0, XMM1);
@@ -1802,11 +1795,11 @@
   static const struct ALIGN16 {
     double a;
     double b;
-  } constant0 = { 9.0, 2.0 };
+  } constant0 = {9.0, 2.0};
   static const struct ALIGN16 {
     double a;
     double b;
-  } constant1 = { 3.0, 4.0 };
+  } constant1 = {3.0, 4.0};
   __ movups(XMM0, Address::Absolute(reinterpret_cast<uword>(&constant0)));
   __ movups(XMM1, Address::Absolute(reinterpret_cast<uword>(&constant1)));
   __ maxpd(XMM0, XMM1);
@@ -1831,7 +1824,7 @@
   static const struct ALIGN16 {
     double a;
     double b;
-  } constant0 = { 2.0, 9.0 };
+  } constant0 = {2.0, 9.0};
   __ movups(XMM0, Address::Absolute(reinterpret_cast<uword>(&constant0)));
   // Splat Y across all lanes.
   __ shufpd(XMM0, XMM0, Immediate(0x33));
@@ -1859,7 +1852,7 @@
   static const struct ALIGN16 {
     double a;
     double b;
-  } constant0 = { 9.0, 2.0 };
+  } constant0 = {9.0, 2.0};
   __ movups(XMM1, Address::Absolute(reinterpret_cast<uword>(&constant0)));
   __ cvtpd2ps(XMM0, XMM1);
   __ pushl(EAX);
@@ -1883,7 +1876,7 @@
     float b;
     float c;
     float d;
-  } constant0 = { 9.0f, 2.0f, 3.0f, 4.0f };
+  } constant0 = {9.0f, 2.0f, 3.0f, 4.0f};
   __ movups(XMM1, Address::Absolute(reinterpret_cast<uword>(&constant0)));
   __ cvtps2pd(XMM0, XMM1);
   __ pushl(EAX);
@@ -2635,7 +2628,7 @@
   a = 4021288948u;
   b = 13;
   res = reinterpret_cast<LongUnsignedMulRegCode>(test->entry())(a, b);
-  mul_res =  static_cast<uint64_t>(a) * static_cast<uint64_t>(b);
+  mul_res = static_cast<uint64_t>(a) * static_cast<uint64_t>(b);
   EXPECT_EQ(mul_res, res);
 }
 
@@ -2658,7 +2651,7 @@
   a = 4294967284u;
   b = 13;
   res = reinterpret_cast<LongUnsignedMulAddressCode>(test->entry())(a, b);
-  mul_res =  static_cast<uint64_t>(a) * static_cast<uint64_t>(b);
+  mul_res = static_cast<uint64_t>(a) * static_cast<uint64_t>(b);
   EXPECT_EQ(mul_res, res);
 }
 
@@ -3084,10 +3077,10 @@
 ASSEMBLER_TEST_RUN(DoubleAbs, test) {
   typedef double (*DoubleAbsCode)(double d);
   double val = -12.45;
-  double res =  reinterpret_cast<DoubleAbsCode>(test->entry())(val);
+  double res = reinterpret_cast<DoubleAbsCode>(test->entry())(val);
   EXPECT_FLOAT_EQ(-val, res, 0.001);
   val = 12.45;
-  res =  reinterpret_cast<DoubleAbsCode>(test->entry())(val);
+  res = reinterpret_cast<DoubleAbsCode>(test->entry())(val);
   EXPECT_FLOAT_EQ(val, res, 0.001);
 }
 
@@ -3153,8 +3146,8 @@
 
 ASSEMBLER_TEST_RUN(ConditionalMovesNoOverflow, test) {
   typedef int (*ConditionalMovesNoOverflowCode)(int i, int j);
-  int res = reinterpret_cast<ConditionalMovesNoOverflowCode>(
-      test->entry())(0x7fffffff, 2);
+  int res = reinterpret_cast<ConditionalMovesNoOverflowCode>(test->entry())(
+      0x7fffffff, 2);
   EXPECT_EQ(1, res);
   res = reinterpret_cast<ConditionalMovesNoOverflowCode>(test->entry())(1, 1);
   EXPECT_EQ(0, res);
@@ -3202,7 +3195,7 @@
 
 
 ASSEMBLER_TEST_GENERATE(ConditionalMovesCompare, assembler) {
-  __ movl(EDX, Immediate(1));  // Greater equal.
+  __ movl(EDX, Immediate(1));   // Greater equal.
   __ movl(ECX, Immediate(-1));  // Less
   __ movl(EAX, Address(ESP, 1 * kWordSize));
   __ cmpl(EAX, Address(ESP, 2 * kWordSize));
@@ -3387,7 +3380,7 @@
   for (int i = 0; i < 10; i++) {
     EXPECT_EQ(from[i], to[i]);
   }
-  delete [] to;
+  delete[] to;
 }
 
 
@@ -3398,8 +3391,7 @@
   __ movl(ECX, Address(ESP, 3 * kWordSize));
   __ movl(THR, Address(ESP, 4 * kWordSize));
   __ pushl(EAX);
-  __ StoreIntoObject(ECX,
-                     FieldAddress(ECX, GrowableObjectArray::data_offset()),
+  __ StoreIntoObject(ECX, FieldAddress(ECX, GrowableObjectArray::data_offset()),
                      EAX);
   __ popl(EAX);
   __ popl(THR);
diff --git a/runtime/vm/assembler_mips.cc b/runtime/vm/assembler_mips.cc
index dcf1473..00ebd25 100644
--- a/runtime/vm/assembler_mips.cc
+++ b/runtime/vm/assembler_mips.cc
@@ -52,8 +52,7 @@
 int32_t Assembler::EncodeBranchOffset(int32_t offset, int32_t instr) {
   if (!CanEncodeBranchOffset(offset)) {
     ASSERT(!use_far_branches());
-    Thread::Current()->long_jump_base()->Jump(
-        1, Object::branch_offset_error());
+    Thread::Current()->long_jump_base()->Jump(1, Object::branch_offset_error());
   }
 
   // Properly preserve only the bits supported in the instruction.
@@ -71,7 +70,7 @@
 
 static int32_t DecodeLoadImmediate(int32_t ori_instr, int32_t lui_instr) {
   return (((lui_instr & kBranchOffsetMask) << 16) |
-           (ori_instr & kBranchOffsetMask));
+          (ori_instr & kBranchOffsetMask));
 }
 
 
@@ -95,8 +94,7 @@
       // Change the offset to the absolute value.
       const int32_t encoded_low =
           EncodeLoadImmediate(dest & kBranchOffsetMask, low);
-      const int32_t encoded_high =
-          EncodeLoadImmediate(dest >> 16, high);
+      const int32_t encoded_high = EncodeLoadImmediate(dest >> 16, high);
 
       region.Store<int32_t>(position, encoded_high);
       region.Store<int32_t>(position + Instr::kInstrSize, encoded_low);
@@ -129,14 +127,22 @@
 
 static Opcode OppositeBranchOpcode(Opcode b) {
   switch (b) {
-    case BEQ: return BNE;
-    case BNE: return BEQ;
-    case BGTZ: return BLEZ;
-    case BLEZ: return BGTZ;
-    case BEQL: return BNEL;
-    case BNEL: return BEQL;
-    case BGTZL: return BLEZL;
-    case BLEZL: return BGTZL;
+    case BEQ:
+      return BNE;
+    case BNE:
+      return BEQ;
+    case BGTZ:
+      return BLEZ;
+    case BLEZ:
+      return BGTZ;
+    case BEQL:
+      return BNEL;
+    case BNEL:
+      return BEQL;
+    case BGTZL:
+      return BLEZL;
+    case BLEZL:
+      return BGTZL;
     default:
       UNREACHABLE();
       break;
@@ -145,7 +151,9 @@
 }
 
 
-void Assembler::EmitFarBranch(Opcode b, Register rs, Register rt,
+void Assembler::EmitFarBranch(Opcode b,
+                              Register rs,
+                              Register rt,
                               int32_t offset) {
   ASSERT(!in_delay_slot_);
   EmitIType(b, rs, rt, 4);
@@ -156,10 +164,14 @@
 
 static RtRegImm OppositeBranchNoLink(RtRegImm b) {
   switch (b) {
-    case BLTZ: return BGEZ;
-    case BGEZ: return BLTZ;
-    case BLTZAL: return BGEZ;
-    case BGEZAL: return BLTZ;
+    case BLTZ:
+      return BGEZ;
+    case BGEZ:
+      return BLTZ;
+    case BLTZAL:
+      return BGEZ;
+    case BGEZAL:
+      return BLTZ;
     default:
       UNREACHABLE();
       break;
@@ -237,7 +249,7 @@
 }
 
 
-void Assembler::EmitFpuBranch(bool kind, Label *label) {
+void Assembler::EmitFpuBranch(bool kind, Label* label) {
   ASSERT(!in_delay_slot_);
   const int32_t b16 = kind ? (1 << 16) : 0;  // Bit 16 set for branch on true.
   if (label->IsBound()) {
@@ -248,10 +260,7 @@
       EmitFarFpuBranch(kind, label->Position());
     } else {
       const uint16_t dest_off = EncodeBranchOffset(dest, 0);
-      Emit(COP1 << kOpcodeShift |
-           COP1_BC << kCop1SubShift |
-           b16 |
-           dest_off);
+      Emit(COP1 << kOpcodeShift | COP1_BC << kCop1SubShift | b16 | dest_off);
     }
   } else {
     const intptr_t position = buffer_.Size();
@@ -260,10 +269,7 @@
       EmitFarFpuBranch(kind, dest_off);
     } else {
       const uint16_t dest_off = EncodeBranchOffset(label->position_, 0);
-      Emit(COP1 << kOpcodeShift |
-           COP1_BC << kCop1SubShift |
-           b16 |
-           dest_off);
+      Emit(COP1 << kOpcodeShift | COP1_BC << kCop1SubShift | b16 | dest_off);
     }
     label->LinkTo(position);
   }
@@ -309,8 +315,7 @@
       dest = buffer_.Size();
       const int32_t encoded_low =
           EncodeLoadImmediate(dest & kBranchOffsetMask, low);
-      const int32_t encoded_high =
-          EncodeLoadImmediate(dest >> 16, high);
+      const int32_t encoded_high = EncodeLoadImmediate(dest >> 16, high);
 
       // Skip the unconditional far jump if the test fails by flipping the
       // sense of the branch instruction.
@@ -334,7 +339,7 @@
       // Clear out the old (far) branch.
       for (int i = 0; i < 5; i++) {
         buffer_.Store<int32_t>(position + i * Instr::kInstrSize,
-            Instr::kNopInstruction);
+                               Instr::kNopInstruction);
       }
 
       // Calculate the new offset.
@@ -377,8 +382,11 @@
 }
 
 
-void Assembler::AdduDetectOverflow(Register rd, Register rs, Register rt,
-                                   Register ro, Register scratch) {
+void Assembler::AdduDetectOverflow(Register rd,
+                                   Register rs,
+                                   Register rt,
+                                   Register ro,
+                                   Register scratch) {
   ASSERT(!in_delay_slot_);
   ASSERT(rd != ro);
   ASSERT(rd != TMP);
@@ -398,14 +406,14 @@
   }
 
   if (rd == rs) {
-    mov(TMP, rs);  // Preserve rs.
-    addu(rd, rs, rt);  // rs is overwritten.
+    mov(TMP, rs);        // Preserve rs.
+    addu(rd, rs, rt);    // rs is overwritten.
     xor_(TMP, rd, TMP);  // Original rs.
     xor_(ro, rd, rt);
     and_(ro, ro, TMP);
   } else if (rd == rt) {
-    mov(TMP, rt);  // Preserve rt.
-    addu(rd, rs, rt);  // rt is overwritten.
+    mov(TMP, rt);        // Preserve rt.
+    addu(rd, rs, rt);    // rt is overwritten.
     xor_(TMP, rd, TMP);  // Original rt.
     xor_(ro, rd, rs);
     and_(ro, ro, TMP);
@@ -418,7 +426,9 @@
 }
 
 
-void Assembler::SubuDetectOverflow(Register rd, Register rs, Register rt,
+void Assembler::SubuDetectOverflow(Register rd,
+                                   Register rs,
+                                   Register rt,
                                    Register ro) {
   ASSERT(!in_delay_slot_);
   ASSERT(rd != ro);
@@ -438,13 +448,13 @@
   }
 
   if (rd == rs) {
-    mov(TMP, rs);  // Preserve left.
-    subu(rd, rs, rt);  // Left is overwritten.
-    xor_(ro, rd, TMP);  // scratch is original left.
+    mov(TMP, rs);        // Preserve left.
+    subu(rd, rs, rt);    // Left is overwritten.
+    xor_(ro, rd, TMP);   // scratch is original left.
     xor_(TMP, TMP, rs);  // scratch is original left.
     and_(ro, TMP, ro);
   } else if (rd == rt) {
-    mov(TMP, rt);  // Preserve right.
+    mov(TMP, rt);      // Preserve right.
     subu(rd, rs, rt);  // Right is overwritten.
     xor_(ro, rd, rs);
     xor_(TMP, rs, TMP);  // Original right.
@@ -473,7 +483,7 @@
   Bind(&cid_ok);
   GetNextPC(CMPRES1, TMP);
   const intptr_t entry_offset = CodeSize() - Instr::kInstrSize +
-      Instructions::HeaderSize() - kHeapObjectTag;
+                                Instructions::HeaderSize() - kHeapObjectTag;
   AddImmediate(CMPRES1, CMPRES1, -entry_offset);
   lw(CMPRES2, FieldAddress(CODE_REG, Code::saved_instructions_offset()));
   BranchEqual(CMPRES1, CMPRES2, &instructions_ok);
@@ -711,8 +721,8 @@
                                       Register value,
                                       bool can_value_be_smi) {
   if (Address::CanHoldOffset(offset - kHeapObjectTag)) {
-    StoreIntoObject(
-        object, FieldAddress(object, offset), value, can_value_be_smi);
+    StoreIntoObject(object, FieldAddress(object, offset), value,
+                    can_value_be_smi);
   } else {
     AddImmediate(TMP, object, offset - kHeapObjectTag);
     StoreIntoObject(object, Address(TMP), value, can_value_be_smi);
@@ -781,8 +791,8 @@
 void Assembler::LoadClassId(Register result, Register object) {
   ASSERT(RawObject::kClassIdTagPos == 16);
   ASSERT(RawObject::kClassIdTagSize == 16);
-  const intptr_t class_id_offset = Object::tags_offset() +
-      RawObject::kClassIdTagPos / kBitsPerByte;
+  const intptr_t class_id_offset =
+      Object::tags_offset() + RawObject::kClassIdTagPos / kBitsPerByte;
   lhu(result, FieldAddress(object, class_id_offset));
 }
 
@@ -896,7 +906,7 @@
   intptr_t state_offset = ClassTable::StateOffsetFor(cid);
   LoadIsolate(temp_reg);
   intptr_t table_offset =
-    Isolate::class_table_offset() + ClassTable::TableOffsetFor(cid);
+      Isolate::class_table_offset() + ClassTable::TableOffsetFor(cid);
   lw(temp_reg, Address(temp_reg, table_offset));
   AddImmediate(temp_reg, state_offset);
   lw(temp_reg, Address(temp_reg, 0));
@@ -934,12 +944,14 @@
   ASSERT(cid > 0);
   ASSERT(temp_reg != TMP);
   const uword class_offset = ClassTable::ClassOffsetFor(cid);
-  const uword count_field_offset = (space == Heap::kNew) ?
-    ClassHeapStats::allocated_since_gc_new_space_offset() :
-    ClassHeapStats::allocated_since_gc_old_space_offset();
-  const uword size_field_offset = (space == Heap::kNew) ?
-    ClassHeapStats::allocated_size_since_gc_new_space_offset() :
-    ClassHeapStats::allocated_size_since_gc_old_space_offset();
+  const uword count_field_offset =
+      (space == Heap::kNew)
+          ? ClassHeapStats::allocated_since_gc_new_space_offset()
+          : ClassHeapStats::allocated_since_gc_old_space_offset();
+  const uword size_field_offset =
+      (space == Heap::kNew)
+          ? ClassHeapStats::allocated_size_since_gc_new_space_offset()
+          : ClassHeapStats::allocated_size_since_gc_old_space_offset();
   LoadIsolate(temp_reg);
   intptr_t table_offset =
       Isolate::class_table_offset() + ClassTable::TableOffsetFor(cid);
@@ -1137,10 +1149,9 @@
 
 void Assembler::EnterCallRuntimeFrame(intptr_t frame_space) {
   ASSERT(!in_delay_slot_);
-  const intptr_t kPushedRegistersSize =
-      kDartVolatileCpuRegCount * kWordSize +
-      3 * kWordSize +  // PP, FP and RA.
-      kDartVolatileFpuRegCount * kWordSize;
+  const intptr_t kPushedRegistersSize = kDartVolatileCpuRegCount * kWordSize +
+                                        3 * kWordSize +  // PP, FP and RA.
+                                        kDartVolatileFpuRegCount * kWordSize;
 
   SetPrologueOffset();
 
@@ -1183,10 +1194,9 @@
 
 void Assembler::LeaveCallRuntimeFrame() {
   ASSERT(!in_delay_slot_);
-  const intptr_t kPushedRegistersSize =
-      kDartVolatileCpuRegCount * kWordSize +
-      3 * kWordSize +  // FP and RA.
-      kDartVolatileFpuRegCount * kWordSize;
+  const intptr_t kPushedRegistersSize = kDartVolatileCpuRegCount * kWordSize +
+                                        3 * kWordSize +  // FP and RA.
+                                        kDartVolatileFpuRegCount * kWordSize;
 
   Comment("LeaveCallRuntimeFrame");
 
@@ -1221,7 +1231,8 @@
                                              intptr_t index_scale,
                                              Register array,
                                              intptr_t index) const {
-  const int64_t offset = index * index_scale +
+  const int64_t offset =
+      index * index_scale +
       (is_external ? 0 : (Instance::DataOffsetFor(cid) - kHeapObjectTag));
   ASSERT(Utils::IsInt(32, offset));
   ASSERT(Address::CanHoldOffset(offset));
@@ -1235,7 +1246,8 @@
                                               intptr_t index_scale,
                                               Register array,
                                               intptr_t index) {
-  const int64_t offset = index * index_scale +
+  const int64_t offset =
+      index * index_scale +
       (is_external ? 0 : (Instance::DataOffsetFor(cid) - kHeapObjectTag));
   AddImmediate(address, array, offset);
 }
@@ -1356,10 +1368,9 @@
 
 
 static const char* cpu_reg_names[kNumberOfCpuRegisters] = {
-  "zr", "tmp", "v0", "v1", "a0", "a1", "a2", "a3",
-  "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7",
-  "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
-  "t8", "t9", "k0", "k1", "gp", "sp", "fp", "ra",
+    "zr", "tmp", "v0", "v1", "a0", "a1", "a2", "a3", "t0", "t1", "t2",
+    "t3", "t4",  "t5", "t6", "t7", "s0", "s1", "s2", "s3", "s4", "s5",
+    "s6", "s7",  "t8", "t9", "k0", "k1", "gp", "sp", "fp", "ra",
 };
 
 
@@ -1370,8 +1381,8 @@
 
 
 static const char* fpu_reg_names[kNumberOfFpuRegisters] = {
-  "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
-  "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
+    "d0", "d1", "d2",  "d3",  "d4",  "d5",  "d6",  "d7",
+    "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
 };
 
 
diff --git a/runtime/vm/assembler_mips.h b/runtime/vm/assembler_mips.h
index 4abaa23..379ebba 100644
--- a/runtime/vm/assembler_mips.h
+++ b/runtime/vm/assembler_mips.h
@@ -30,9 +30,9 @@
 
 class Immediate : public ValueObject {
  public:
-  explicit Immediate(int32_t value) : value_(value) { }
+  explicit Immediate(int32_t value) : value_(value) {}
 
-  Immediate(const Immediate& other) : ValueObject(), value_(other.value_) { }
+  Immediate(const Immediate& other) : ValueObject(), value_(other.value_) {}
   Immediate& operator=(const Immediate& other) {
     value_ = other.value_;
     return *this;
@@ -50,13 +50,13 @@
 class Address : public ValueObject {
  public:
   explicit Address(Register base, int32_t offset = 0)
-      : ValueObject(), base_(base), offset_(offset) { }
+      : ValueObject(), base_(base), offset_(offset) {}
 
   // This addressing mode does not exist.
   Address(Register base, Register offset);
 
   Address(const Address& other)
-      : ValueObject(), base_(other.base_), offset_(other.offset_) { }
+      : ValueObject(), base_(other.base_), offset_(other.offset_) {}
   Address& operator=(const Address& other) {
     base_ = other.base_;
     offset_ = other.offset_;
@@ -85,9 +85,9 @@
 class FieldAddress : public Address {
  public:
   FieldAddress(Register base, int32_t disp)
-      : Address(base, disp - kHeapObjectTag) { }
+      : Address(base, disp - kHeapObjectTag) {}
 
-  FieldAddress(const FieldAddress& other) : Address(other) { }
+  FieldAddress(const FieldAddress& other) : Address(other) {}
 
   FieldAddress& operator=(const FieldAddress& other) {
     Address::operator=(other);
@@ -98,7 +98,7 @@
 
 class Label : public ValueObject {
  public:
-  Label() : position_(0) { }
+  Label() : position_(0) {}
 
   ~Label() {
     // Assert if label is being destroyed with unresolved branches pending.
@@ -119,9 +119,7 @@
  private:
   intptr_t position_;
 
-  void Reinitialize() {
-    position_ = 0;
-  }
+  void Reinitialize() { position_ = 0; }
 
   void BindTo(intptr_t position) {
     ASSERT(!IsBound());
@@ -160,8 +158,8 @@
 
   class LeftBits : public BitField<uword, Register, kLeftPos, kLeftSize> {};
   class RightBits : public BitField<uword, Register, kRightPos, kRightSize> {};
-  class RelOpBits :
-      public BitField<uword, RelationOperator, kRelOpPos, kRelOpSize> {};
+  class RelOpBits
+      : public BitField<uword, RelationOperator, kRelOpPos, kRelOpSize> {};
   class ImmBits : public BitField<uword, uint16_t, kImmPos, kImmSize> {};
 
   Register left() const { return LeftBits::decode(bits_); }
@@ -180,10 +178,10 @@
   }
 
   // Uninitialized condition.
-  Condition() : ValueObject(), bits_(0) { }
+  Condition() : ValueObject(), bits_(0) {}
 
   // Copy constructor.
-  Condition(const Condition& other) : ValueObject(), bits_(other.bits_) { }
+  Condition(const Condition& other) : ValueObject(), bits_(other.bits_) {}
 
   // Copy assignment operator.
   Condition& operator=(const Condition& other) {
@@ -244,9 +242,8 @@
         delay_slot_available_(false),
         in_delay_slot_(false),
         comments_(),
-        constant_pool_allowed_(true) {
-  }
-  ~Assembler() { }
+        constant_pool_allowed_(true) {}
+  ~Assembler() {}
 
   void PopRegister(Register r) { Pop(r); }
 
@@ -260,9 +257,7 @@
 
   // Count the fixups that produce a pointer offset, without processing
   // the fixups.
-  intptr_t CountPointerOffsets() const {
-    return buffer_.CountPointerOffsets();
-  }
+  intptr_t CountPointerOffsets() const { return buffer_.CountPointerOffsets(); }
 
   const ZoneGrowableArray<intptr_t>& GetPointerOffsets() const {
     return buffer_.pointer_offsets();
@@ -282,9 +277,7 @@
     return FLAG_use_far_branches || use_far_branches_;
   }
 
-  void set_use_far_branches(bool b) {
-    use_far_branches_ = b;
-  }
+  void set_use_far_branches(bool b) { use_far_branches_ = b; }
 
   void EnterFrame();
   void LeaveFrameAndReturn();
@@ -309,9 +302,7 @@
                                      Heap::Space space);
 
 
-  void MaybeTraceAllocation(intptr_t cid,
-                            Register temp_reg,
-                            Label* trace);
+  void MaybeTraceAllocation(intptr_t cid, Register temp_reg, Label* trace);
 
   // Inlined allocation of an instance of class 'cls', code has no runtime
   // calls. Jump to 'failure' if the instance cannot be allocated here.
@@ -357,7 +348,7 @@
   Assembler* delay_slot() {
     ASSERT(delay_slot_available_);
     ASSERT(buffer_.Load<int32_t>(buffer_.GetPosition() - sizeof(int32_t)) ==
-        Instr::kNopInstruction);
+           Instr::kNopInstruction);
     buffer_.Remit<int32_t>();
     delay_slot_available_ = false;
     in_delay_slot_ = true;
@@ -394,11 +385,9 @@
   }
 
   // Unconditional branch.
-  void b(Label* l) {
-    beq(R0, R0, l);
-  }
+  void b(Label* l) { beq(R0, R0, l); }
 
-  void bal(Label *l) {
+  void bal(Label* l) {
     ASSERT(!in_delay_slot_);
     EmitRegImmBranch(BGEZAL, R0, l);
     EmitBranchDelayNop();
@@ -508,19 +497,14 @@
 
   static int32_t BreakEncoding(int32_t code) {
     ASSERT(Utils::IsUint(20, code));
-    return SPECIAL << kOpcodeShift |
-           code << kBreakCodeShift |
+    return SPECIAL << kOpcodeShift | code << kBreakCodeShift |
            BREAK << kFunctionShift;
   }
 
 
-  void break_(int32_t code) {
-    Emit(BreakEncoding(code));
-  }
+  void break_(int32_t code) { Emit(BreakEncoding(code)); }
 
-  static uword GetBreakInstructionFiller() {
-    return BreakEncoding(0);
-  }
+  static uword GetBreakInstructionFiller() { return BreakEncoding(0); }
 
   // FPU compare, always false.
   void cfd(DRegister ds, DRegister dt) {
@@ -610,9 +594,7 @@
     EmitFpuRType(COP1, FMT_D, F0, fs, fd, COP1_CVT_S);
   }
 
-  void div(Register rs, Register rt) {
-    EmitRType(SPECIAL, rs, rt, R0, 0, DIV);
-  }
+  void div(Register rs, Register rt) { EmitRType(SPECIAL, rs, rt, R0, 0, DIV); }
 
   void divd(DRegister dd, DRegister ds, DRegister dt) {
     FRegister fd = static_cast<FRegister>(dd * 2);
@@ -638,30 +620,20 @@
     EmitBranchDelayNop();
   }
 
-  void lb(Register rt, const Address& addr) {
-    EmitLoadStore(LB, rt, addr);
-  }
+  void lb(Register rt, const Address& addr) { EmitLoadStore(LB, rt, addr); }
 
-  void lbu(Register rt, const Address& addr) {
-    EmitLoadStore(LBU, rt, addr);
-  }
+  void lbu(Register rt, const Address& addr) { EmitLoadStore(LBU, rt, addr); }
 
   void ldc1(DRegister dt, const Address& addr) {
     FRegister ft = static_cast<FRegister>(dt * 2);
     EmitFpuLoadStore(LDC1, ft, addr);
   }
 
-  void lh(Register rt, const Address& addr) {
-    EmitLoadStore(LH, rt, addr);
-  }
+  void lh(Register rt, const Address& addr) { EmitLoadStore(LH, rt, addr); }
 
-  void lhu(Register rt, const Address& addr) {
-    EmitLoadStore(LHU, rt, addr);
-  }
+  void lhu(Register rt, const Address& addr) { EmitLoadStore(LHU, rt, addr); }
 
-  void ll(Register rt, const Address& addr) {
-    EmitLoadStore(LL, rt, addr);
-  }
+  void ll(Register rt, const Address& addr) { EmitLoadStore(LL, rt, addr); }
 
   void lui(Register rt, const Immediate& imm) {
     ASSERT(Utils::IsUint(kImmBits, imm.value()));
@@ -669,9 +641,7 @@
     EmitIType(LUI, R0, rt, imm_value);
   }
 
-  void lw(Register rt, const Address& addr) {
-    EmitLoadStore(LW, rt, addr);
-  }
+  void lw(Register rt, const Address& addr) { EmitLoadStore(LW, rt, addr); }
 
   void lwc1(FRegister ft, const Address& addr) {
     EmitFpuLoadStore(LWC1, ft, addr);
@@ -686,23 +656,15 @@
   }
 
   void mfc1(Register rt, FRegister fs) {
-    Emit(COP1 << kOpcodeShift |
-         COP1_MF << kCop1SubShift |
-         rt << kRtShift |
+    Emit(COP1 << kOpcodeShift | COP1_MF << kCop1SubShift | rt << kRtShift |
          fs << kFsShift);
   }
 
-  void mfhi(Register rd) {
-    EmitRType(SPECIAL, R0, R0, rd, 0, MFHI);
-  }
+  void mfhi(Register rd) { EmitRType(SPECIAL, R0, R0, rd, 0, MFHI); }
 
-  void mflo(Register rd) {
-    EmitRType(SPECIAL, R0, R0, rd, 0, MFLO);
-  }
+  void mflo(Register rd) { EmitRType(SPECIAL, R0, R0, rd, 0, MFLO); }
 
-  void mov(Register rd, Register rs) {
-    or_(rd, rs, ZR);
-  }
+  void mov(Register rd, Register rs) { or_(rd, rs, ZR); }
 
   void movd(DRegister dd, DRegister ds) {
     FRegister fd = static_cast<FRegister>(dd * 2);
@@ -734,19 +696,13 @@
   }
 
   void mtc1(Register rt, FRegister fs) {
-    Emit(COP1 << kOpcodeShift |
-         COP1_MT << kCop1SubShift |
-         rt << kRtShift |
+    Emit(COP1 << kOpcodeShift | COP1_MT << kCop1SubShift | rt << kRtShift |
          fs << kFsShift);
   }
 
-  void mthi(Register rs) {
-    EmitRType(SPECIAL, rs, R0, R0, 0, MTHI);
-  }
+  void mthi(Register rs) { EmitRType(SPECIAL, rs, R0, R0, 0, MTHI); }
 
-  void mtlo(Register rs) {
-    EmitRType(SPECIAL, rs, R0, R0, 0, MTLO);
-  }
+  void mtlo(Register rs) { EmitRType(SPECIAL, rs, R0, R0, 0, MTLO); }
 
   void muld(DRegister dd, DRegister ds, DRegister dt) {
     FRegister fd = static_cast<FRegister>(dd * 2);
@@ -769,9 +725,7 @@
     EmitFpuRType(COP1, FMT_D, F0, fs, fd, COP1_NEG);
   }
 
-  void nop() {
-    Emit(Instr::kNopInstruction);
-  }
+  void nop() { Emit(Instr::kNopInstruction); }
 
   void nor(Register rd, Register rs, Register rt) {
     EmitRType(SPECIAL, rs, rt, rd, 0, NOR);
@@ -787,23 +741,17 @@
     EmitIType(ORI, rs, rt, imm_value);
   }
 
-  void sb(Register rt, const Address& addr) {
-    EmitLoadStore(SB, rt, addr);
-  }
+  void sb(Register rt, const Address& addr) { EmitLoadStore(SB, rt, addr); }
 
   // rt = 1 on success, 0 on failure.
-  void sc(Register rt, const Address& addr) {
-    EmitLoadStore(SC, rt, addr);
-  }
+  void sc(Register rt, const Address& addr) { EmitLoadStore(SC, rt, addr); }
 
   void sdc1(DRegister dt, const Address& addr) {
     FRegister ft = static_cast<FRegister>(dt * 2);
     EmitFpuLoadStore(SDC1, ft, addr);
   }
 
-  void sh(Register rt, const Address& addr) {
-    EmitLoadStore(SH, rt, addr);
-  }
+  void sh(Register rt, const Address& addr) { EmitLoadStore(SH, rt, addr); }
 
   void sll(Register rd, Register rt, int sa) {
     EmitRType(SPECIAL, R0, rt, rd, sa, SLL);
@@ -869,9 +817,7 @@
     EmitRType(SPECIAL, rs, rt, rd, 0, SUBU);
   }
 
-  void sw(Register rt, const Address& addr) {
-    EmitLoadStore(SW, rt, addr);
-  }
+  void sw(Register rt, const Address& addr) { EmitLoadStore(SW, rt, addr); }
 
   void swc1(FRegister ft, const Address& addr) {
     EmitFpuLoadStore(SWC1, ft, addr);
@@ -895,15 +841,21 @@
   // ro must be different from all the other registers.
   // If rd, rs, and rt are the same register, then a scratch register different
   // from the other registers is needed.
-  void AdduDetectOverflow(Register rd, Register rs, Register rt, Register ro,
+  void AdduDetectOverflow(Register rd,
+                          Register rs,
+                          Register rt,
+                          Register ro,
                           Register scratch = kNoRegister);
 
   // ro must be different from rd and rs.
   // rd and ro must not be TMP.
   // If rd and rs are the same, a scratch register different from the other
   // registers is needed.
-  void AddImmediateDetectOverflow(Register rd, Register rs, int32_t imm,
-                                  Register ro, Register scratch = kNoRegister) {
+  void AddImmediateDetectOverflow(Register rd,
+                                  Register rs,
+                                  int32_t imm,
+                                  Register ro,
+                                  Register scratch = kNoRegister) {
     ASSERT(!in_delay_slot_);
     LoadImmediate(rd, imm);
     AdduDetectOverflow(rd, rs, rd, ro, scratch);
@@ -917,7 +869,9 @@
 
   // ro must be different from rd and rs.
   // None of rd, rs, rt, or ro may be TMP.
-  void SubImmediateDetectOverflow(Register rd, Register rs, int32_t imm,
+  void SubImmediateDetectOverflow(Register rd,
+                                  Register rs,
+                                  int32_t imm,
                                   Register ro) {
     ASSERT(!in_delay_slot_);
     LoadImmediate(rd, imm);
@@ -1087,8 +1041,11 @@
     Register right = cond.right();
     RelationOperator rel_op = cond.rel_op();
     switch (rel_op) {
-      case NV: return;
-      case AL: b(l); return;
+      case NV:
+        return;
+      case AL:
+        b(l);
+        return;
       case EQ:  // fall through.
       case NE: {
         if (left == IMM) {
@@ -1228,9 +1185,7 @@
     }
   }
 
-  void BranchEqual(Register rd, Register rn, Label* l) {
-    beq(rd, rn, l);
-  }
+  void BranchEqual(Register rd, Register rn, Label* l) { beq(rd, rn, l); }
 
   void BranchEqual(Register rd, const Immediate& imm, Label* l) {
     ASSERT(!in_delay_slot_);
@@ -1250,9 +1205,7 @@
     beq(rd, CMPRES2, l);
   }
 
-  void BranchNotEqual(Register rd, Register rn, Label* l) {
-    bne(rd, rn, l);
-  }
+  void BranchNotEqual(Register rd, Register rn, Label* l) { bne(rd, rn, l); }
 
   void BranchNotEqual(Register rd, const Immediate& imm, Label* l) {
     ASSERT(!in_delay_slot_);
@@ -1319,7 +1272,7 @@
   void BranchSignedGreaterEqual(Register rd, Register rs, Label* l) {
     ASSERT(!in_delay_slot_);
     slt(CMPRES2, rd, rs);  // CMPRES2 = rd < rs ? 1 : 0.
-    beq(CMPRES2, ZR, l);  // If CMPRES2 = 0, then rd >= rs.
+    beq(CMPRES2, ZR, l);   // If CMPRES2 = 0, then rd >= rs.
   }
 
   void BranchSignedGreaterEqual(Register rd, const Immediate& imm, Label* l) {
@@ -1456,25 +1409,15 @@
     addiu(SP, SP, Immediate(kWordSize));
   }
 
-  void Ret() {
-    jr(RA);
-  }
+  void Ret() { jr(RA); }
 
-  void SmiTag(Register reg) {
-    sll(reg, reg, kSmiTagSize);
-  }
+  void SmiTag(Register reg) { sll(reg, reg, kSmiTagSize); }
 
-  void SmiTag(Register dst, Register src) {
-    sll(dst, src, kSmiTagSize);
-  }
+  void SmiTag(Register dst, Register src) { sll(dst, src, kSmiTagSize); }
 
-  void SmiUntag(Register reg) {
-    sra(reg, reg, kSmiTagSize);
-  }
+  void SmiUntag(Register reg) { sra(reg, reg, kSmiTagSize); }
 
-  void SmiUntag(Register dst, Register src) {
-    sra(dst, src, kSmiTagSize);
-  }
+  void SmiUntag(Register dst, Register src) { sra(dst, src, kSmiTagSize); }
 
   void BranchIfNotSmi(Register reg, Label* label) {
     andi(CMPRES1, reg, Immediate(kSmiTagMask));
@@ -1558,9 +1501,9 @@
   void LoadClassIdMayBeSmi(Register result, Register object);
   void LoadTaggedClassIdMayBeSmi(Register result, Register object);
 
-  void StoreIntoObject(Register object,  // Object we are storing into.
+  void StoreIntoObject(Register object,      // Object we are storing into.
                        const Address& dest,  // Where we are storing into.
-                       Register value,  // Value we are storing.
+                       Register value,       // Value we are storing.
                        bool can_value_be_smi = true);
   void StoreIntoObjectOffset(Register object,
                              int32_t offset,
@@ -1634,12 +1577,8 @@
   static bool IsSafe(const Object& object) { return true; }
   static bool IsSafeSmi(const Object& object) { return object.IsSmi(); }
 
-  bool constant_pool_allowed() const {
-    return constant_pool_allowed_;
-  }
-  void set_constant_pool_allowed(bool b) {
-    constant_pool_allowed_ = b;
-  }
+  bool constant_pool_allowed() const { return constant_pool_allowed_; }
+  void set_constant_pool_allowed(bool b) { constant_pool_allowed_ = b; }
 
  private:
   AssemblerBuffer buffer_;
@@ -1654,7 +1593,7 @@
   class CodeComment : public ZoneAllocated {
    public:
     CodeComment(intptr_t pc_offset, const String& comment)
-        : pc_offset_(pc_offset), comment_(comment) { }
+        : pc_offset_(pc_offset), comment_(comment) {}
 
     intptr_t pc_offset() const { return pc_offset_; }
     const String& comment() const { return comment_; }
@@ -1688,43 +1627,23 @@
 
   // Encode CPU instructions according to the types specified in
   // Figures 4-1, 4-2 and 4-3 in VolI-A.
-  void EmitIType(Opcode opcode,
-                 Register rs,
-                 Register rt,
-                 uint16_t imm) {
-    Emit(opcode << kOpcodeShift |
-         rs << kRsShift |
-         rt << kRtShift |
-         imm);
+  void EmitIType(Opcode opcode, Register rs, Register rt, uint16_t imm) {
+    Emit(opcode << kOpcodeShift | rs << kRsShift | rt << kRtShift | imm);
   }
 
-  void EmitLoadStore(Opcode opcode, Register rt,
-                     const Address &addr) {
-    Emit(opcode << kOpcodeShift |
-         rt << kRtShift |
-         addr.encoding());
+  void EmitLoadStore(Opcode opcode, Register rt, const Address& addr) {
+    Emit(opcode << kOpcodeShift | rt << kRtShift | addr.encoding());
   }
 
-  void EmitFpuLoadStore(Opcode opcode, FRegister ft,
-                        const Address &addr) {
-    Emit(opcode << kOpcodeShift |
-         ft << kFtShift |
-         addr.encoding());
+  void EmitFpuLoadStore(Opcode opcode, FRegister ft, const Address& addr) {
+    Emit(opcode << kOpcodeShift | ft << kFtShift | addr.encoding());
   }
 
-  void EmitRegImmType(Opcode opcode,
-                      Register rs,
-                      RtRegImm code,
-                      uint16_t imm) {
-    Emit(opcode << kOpcodeShift |
-         rs << kRsShift |
-         code << kRtShift |
-         imm);
+  void EmitRegImmType(Opcode opcode, Register rs, RtRegImm code, uint16_t imm) {
+    Emit(opcode << kOpcodeShift | rs << kRsShift | code << kRtShift | imm);
   }
 
-  void EmitJType(Opcode opcode, uint32_t destination) {
-    UNIMPLEMENTED();
-  }
+  void EmitJType(Opcode opcode, uint32_t destination) { UNIMPLEMENTED(); }
 
   void EmitRType(Opcode opcode,
                  Register rs,
@@ -1733,12 +1652,8 @@
                  int sa,
                  SpecialFunction func) {
     ASSERT(Utils::IsUint(5, sa));
-    Emit(opcode << kOpcodeShift |
-         rs << kRsShift |
-         rt << kRtShift |
-         rd << kRdShift |
-         sa << kSaShift |
-         func << kFunctionShift);
+    Emit(opcode << kOpcodeShift | rs << kRsShift | rt << kRtShift |
+         rd << kRdShift | sa << kSaShift | func << kFunctionShift);
   }
 
   void EmitFpuRType(Opcode opcode,
@@ -1747,12 +1662,8 @@
                     FRegister fs,
                     FRegister fd,
                     Cop1Function func) {
-    Emit(opcode << kOpcodeShift |
-         fmt << kFmtShift |
-         ft << kFtShift |
-         fs << kFsShift |
-         fd << kFdShift |
-         func << kCop1FnShift);
+    Emit(opcode << kOpcodeShift | fmt << kFmtShift | ft << kFtShift |
+         fs << kFsShift | fd << kFdShift | func << kCop1FnShift);
   }
 
   int32_t EncodeBranchOffset(int32_t offset, int32_t instr);
@@ -1763,7 +1674,7 @@
   void EmitFarFpuBranch(bool kind, int32_t offset);
   void EmitBranch(Opcode b, Register rs, Register rt, Label* label);
   void EmitRegImmBranch(RtRegImm b, Register rs, Label* label);
-  void EmitFpuBranch(bool kind, Label *label);
+  void EmitFpuBranch(bool kind, Label* label);
 
   void EmitBranchDelayNop() {
     Emit(Instr::kNopInstruction);  // Branch delay NOP.
diff --git a/runtime/vm/assembler_mips_test.cc b/runtime/vm/assembler_mips_test.cc
index f34b79cb..44c633f 100644
--- a/runtime/vm/assembler_mips_test.cc
+++ b/runtime/vm/assembler_mips_test.cc
@@ -330,19 +330,17 @@
   EXPECT(test != NULL);
   typedef intptr_t (*LoadHalfWordUnaligned)(intptr_t) DART_UNUSED;
   uint8_t buffer[4] = {
-    0x89, 0xAB, 0xCD, 0xEF,
+      0x89, 0xAB, 0xCD, 0xEF,
   };
 
-  EXPECT_EQ(static_cast<int16_t>(static_cast<uint16_t>(0xAB89)),
-            EXECUTE_TEST_CODE_INTPTR_INTPTR(
-                LoadHalfWordUnaligned,
-                test->entry(),
-                reinterpret_cast<intptr_t>(&buffer[0])));
-  EXPECT_EQ(static_cast<int16_t>(static_cast<uint16_t>(0xCDAB)),
-            EXECUTE_TEST_CODE_INTPTR_INTPTR(
-                LoadHalfWordUnaligned,
-                test->entry(),
-                reinterpret_cast<intptr_t>(&buffer[1])));
+  EXPECT_EQ(
+      static_cast<int16_t>(static_cast<uint16_t>(0xAB89)),
+      EXECUTE_TEST_CODE_INTPTR_INTPTR(LoadHalfWordUnaligned, test->entry(),
+                                      reinterpret_cast<intptr_t>(&buffer[0])));
+  EXPECT_EQ(
+      static_cast<int16_t>(static_cast<uint16_t>(0xCDAB)),
+      EXECUTE_TEST_CODE_INTPTR_INTPTR(LoadHalfWordUnaligned, test->entry(),
+                                      reinterpret_cast<intptr_t>(&buffer[1])));
 }
 
 
@@ -356,19 +354,15 @@
   EXPECT(test != NULL);
   typedef intptr_t (*LoadHalfWordUnsignedUnaligned)(intptr_t) DART_UNUSED;
   uint8_t buffer[4] = {
-    0x89, 0xAB, 0xCD, 0xEF,
+      0x89, 0xAB, 0xCD, 0xEF,
   };
 
-  EXPECT_EQ(0xAB89,
-            EXECUTE_TEST_CODE_INTPTR_INTPTR(
-                LoadHalfWordUnsignedUnaligned,
-                test->entry(),
-                reinterpret_cast<intptr_t>(&buffer[0])));
-  EXPECT_EQ(0xCDAB,
-            EXECUTE_TEST_CODE_INTPTR_INTPTR(
-                LoadHalfWordUnsignedUnaligned,
-                test->entry(),
-                reinterpret_cast<intptr_t>(&buffer[1])));
+  EXPECT_EQ(0xAB89, EXECUTE_TEST_CODE_INTPTR_INTPTR(
+                        LoadHalfWordUnsignedUnaligned, test->entry(),
+                        reinterpret_cast<intptr_t>(&buffer[0])));
+  EXPECT_EQ(0xCDAB, EXECUTE_TEST_CODE_INTPTR_INTPTR(
+                        LoadHalfWordUnsignedUnaligned, test->entry(),
+                        reinterpret_cast<intptr_t>(&buffer[1])));
 }
 
 
@@ -384,23 +378,19 @@
   EXPECT(test != NULL);
   typedef intptr_t (*StoreHalfWordUnaligned)(intptr_t) DART_UNUSED;
   uint8_t buffer[4] = {
-    0, 0, 0, 0,
+      0, 0, 0, 0,
   };
 
-  EXPECT_EQ(0xABCD,
-            EXECUTE_TEST_CODE_INTPTR_INTPTR(
-                StoreHalfWordUnaligned,
-                test->entry(),
-                reinterpret_cast<intptr_t>(&buffer[0])));
+  EXPECT_EQ(0xABCD, EXECUTE_TEST_CODE_INTPTR_INTPTR(
+                        StoreHalfWordUnaligned, test->entry(),
+                        reinterpret_cast<intptr_t>(&buffer[0])));
   EXPECT_EQ(0xCD, buffer[0]);
   EXPECT_EQ(0xAB, buffer[1]);
   EXPECT_EQ(0, buffer[2]);
 
-  EXPECT_EQ(0xABCD,
-            EXECUTE_TEST_CODE_INTPTR_INTPTR(
-                StoreHalfWordUnaligned,
-                test->entry(),
-                reinterpret_cast<intptr_t>(&buffer[1])));
+  EXPECT_EQ(0xABCD, EXECUTE_TEST_CODE_INTPTR_INTPTR(
+                        StoreHalfWordUnaligned, test->entry(),
+                        reinterpret_cast<intptr_t>(&buffer[1])));
   EXPECT_EQ(0xCD, buffer[1]);
   EXPECT_EQ(0xAB, buffer[2]);
   EXPECT_EQ(0, buffer[3]);
@@ -416,31 +406,24 @@
 ASSEMBLER_TEST_RUN(LoadWordUnaligned, test) {
   EXPECT(test != NULL);
   typedef intptr_t (*LoadWordUnaligned)(intptr_t) DART_UNUSED;
-  uint8_t buffer[8] = {
-    0x12, 0x34, 0x56, 0x78,
-    0x9A, 0xBC, 0xDE, 0xF0
-  };
+  uint8_t buffer[8] = {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0};
 
-  EXPECT_EQ(0x78563412,
-            EXECUTE_TEST_CODE_INTPTR_INTPTR(
-                LoadWordUnaligned,
-                test->entry(),
-                reinterpret_cast<intptr_t>(&buffer[0])));
-  EXPECT_EQ(0x9A785634,
-            EXECUTE_TEST_CODE_INTPTR_INTPTR(
-                LoadWordUnaligned,
-                test->entry(),
-                reinterpret_cast<intptr_t>(&buffer[1])));
-  EXPECT_EQ(0xBC9A7856,
-            EXECUTE_TEST_CODE_INTPTR_INTPTR(
-                LoadWordUnaligned,
-                test->entry(),
-                reinterpret_cast<intptr_t>(&buffer[2])));
-  EXPECT_EQ(0xDEBC9A78,
-            EXECUTE_TEST_CODE_INTPTR_INTPTR(
-                LoadWordUnaligned,
-                test->entry(),
-                reinterpret_cast<intptr_t>(&buffer[3])));
+  EXPECT_EQ(
+      static_cast<intptr_t>(0x78563412),
+      EXECUTE_TEST_CODE_INTPTR_INTPTR(LoadWordUnaligned, test->entry(),
+                                      reinterpret_cast<intptr_t>(&buffer[0])));
+  EXPECT_EQ(
+      static_cast<intptr_t>(0x9A785634),
+      EXECUTE_TEST_CODE_INTPTR_INTPTR(LoadWordUnaligned, test->entry(),
+                                      reinterpret_cast<intptr_t>(&buffer[1])));
+  EXPECT_EQ(
+      static_cast<intptr_t>(0xBC9A7856),
+      EXECUTE_TEST_CODE_INTPTR_INTPTR(LoadWordUnaligned, test->entry(),
+                                      reinterpret_cast<intptr_t>(&buffer[2])));
+  EXPECT_EQ(
+      static_cast<intptr_t>(0xDEBC9A78),
+      EXECUTE_TEST_CODE_INTPTR_INTPTR(LoadWordUnaligned, test->entry(),
+                                      reinterpret_cast<intptr_t>(&buffer[3])));
 }
 
 
@@ -455,46 +438,35 @@
 ASSEMBLER_TEST_RUN(StoreWordUnaligned, test) {
   EXPECT(test != NULL);
   typedef intptr_t (*StoreWordUnaligned)(intptr_t) DART_UNUSED;
-  uint8_t buffer[8] = {
-    0, 0, 0, 0,
-    0, 0, 0, 0
-  };
+  uint8_t buffer[8] = {0, 0, 0, 0, 0, 0, 0, 0};
 
-  EXPECT_EQ(0x12345678,
-            EXECUTE_TEST_CODE_INTPTR_INTPTR(
-                StoreWordUnaligned,
-                test->entry(),
-                reinterpret_cast<intptr_t>(&buffer[0])));
+  EXPECT_EQ(0x12345678, EXECUTE_TEST_CODE_INTPTR_INTPTR(
+                            StoreWordUnaligned, test->entry(),
+                            reinterpret_cast<intptr_t>(&buffer[0])));
   EXPECT_EQ(0x78, buffer[0]);
   EXPECT_EQ(0x56, buffer[1]);
   EXPECT_EQ(0x34, buffer[2]);
   EXPECT_EQ(0x12, buffer[3]);
 
-  EXPECT_EQ(0x12345678,
-            EXECUTE_TEST_CODE_INTPTR_INTPTR(
-                StoreWordUnaligned,
-                test->entry(),
-                reinterpret_cast<intptr_t>(&buffer[1])));
+  EXPECT_EQ(0x12345678, EXECUTE_TEST_CODE_INTPTR_INTPTR(
+                            StoreWordUnaligned, test->entry(),
+                            reinterpret_cast<intptr_t>(&buffer[1])));
   EXPECT_EQ(0x78, buffer[1]);
   EXPECT_EQ(0x56, buffer[2]);
   EXPECT_EQ(0x34, buffer[3]);
   EXPECT_EQ(0x12, buffer[4]);
 
-  EXPECT_EQ(0x12345678,
-            EXECUTE_TEST_CODE_INTPTR_INTPTR(
-                StoreWordUnaligned,
-                test->entry(),
-                reinterpret_cast<intptr_t>(&buffer[2])));
+  EXPECT_EQ(0x12345678, EXECUTE_TEST_CODE_INTPTR_INTPTR(
+                            StoreWordUnaligned, test->entry(),
+                            reinterpret_cast<intptr_t>(&buffer[2])));
   EXPECT_EQ(0x78, buffer[2]);
   EXPECT_EQ(0x56, buffer[3]);
   EXPECT_EQ(0x34, buffer[4]);
   EXPECT_EQ(0x12, buffer[5]);
 
-  EXPECT_EQ(0x12345678,
-            EXECUTE_TEST_CODE_INTPTR_INTPTR(
-                StoreWordUnaligned,
-                test->entry(),
-                reinterpret_cast<intptr_t>(&buffer[3])));
+  EXPECT_EQ(0x12345678, EXECUTE_TEST_CODE_INTPTR_INTPTR(
+                            StoreWordUnaligned, test->entry(),
+                            reinterpret_cast<intptr_t>(&buffer[3])));
   EXPECT_EQ(0x78, buffer[3]);
   EXPECT_EQ(0x56, buffer[4]);
   EXPECT_EQ(0x34, buffer[5]);
@@ -818,7 +790,7 @@
 ASSEMBLER_TEST_GENERATE(Slti, assembler) {
   __ LoadImmediate(T1, -2);
   __ slti(A0, T1, Immediate(-1));  // -2 < -1 -> 1.
-  __ slti(A1, T1, Immediate(0));  // -2 < 0 -> 1.
+  __ slti(A1, T1, Immediate(0));   // -2 < 0 -> 1.
   __ and_(V0, A0, A1);
   __ jr(RA);
 }
@@ -834,7 +806,7 @@
   __ LoadImmediate(T1, -1);
   __ LoadImmediate(T2, 0x10000);
   __ sltiu(A0, T1, Immediate(-2));  // 0xffffffffUL < 0xfffffffeUL -> 0.
-  __ sltiu(A1, T1, Immediate(0));  // 0xffffffffUL < 0 -> 0.
+  __ sltiu(A1, T1, Immediate(0));   // 0xffffffffUL < 0 -> 0.
   __ sltiu(A2, T2, Immediate(-2));  // 0x10000UL < 0xfffffffeUL -> 1.
   __ addiu(A2, A2, Immediate(-1));
   __ or_(V0, A0, A1);
@@ -2224,7 +2196,7 @@
 
 
 ASSEMBLER_TEST_GENERATE(Cop1TruncWD_Overflow, assembler) {
-  __ LoadImmediate(D1, 2.0*kMaxInt32);
+  __ LoadImmediate(D1, 2.0 * kMaxInt32);
   __ truncwd(F0, D1);
   __ mfc1(V0, F0);
   __ Ret();
@@ -2239,7 +2211,7 @@
 
 
 ASSEMBLER_TEST_GENERATE(Cop1TruncWD_Underflow, assembler) {
-  __ LoadImmediate(D1, 2.0*kMinInt32);
+  __ LoadImmediate(D1, 2.0 * kMinInt32);
   __ truncwd(F0, D1);
   __ mfc1(V0, F0);
   __ Ret();
@@ -2312,8 +2284,7 @@
   __ sw(THR, Address(SP, 1 * kWordSize));
   __ sw(RA, Address(SP, 0 * kWordSize));
   __ mov(THR, A2);
-  __ StoreIntoObject(A1,
-                     FieldAddress(A1, GrowableObjectArray::data_offset()),
+  __ StoreIntoObject(A1, FieldAddress(A1, GrowableObjectArray::data_offset()),
                      A0);
   __ lw(RA, Address(SP, 0 * kWordSize));
   __ lw(THR, Address(SP, 1 * kWordSize));
@@ -2335,7 +2306,7 @@
   __ sc(T2, Address(SP));  // T1 == 1, success
   __ LoadImmediate(T3, 1);
   __ bne(T2, T3, &retry);  // NE if context switch occurred between ll and sc
-  __ Pop(V0);  // 42
+  __ Pop(V0);              // 42
   __ LeaveFrameAndReturn();
 }
 
diff --git a/runtime/vm/assembler_test.cc b/runtime/vm/assembler_test.cc
index fbbd994..be5b7c3 100644
--- a/runtime/vm/assembler_test.cc
+++ b/runtime/vm/assembler_test.cc
@@ -15,8 +15,8 @@
 
 ASSEMBLER_TEST_RUN(StoreIntoObject, test) {
 #define TEST_CODE(value, growable_array, thread)                               \
-  test->Invoke<void, RawObject*, RawObject*, Thread*>(                         \
-  value, growable_array, thread)
+  test->Invoke<void, RawObject*, RawObject*, Thread*>(value, growable_array,   \
+                                                      thread)
 
   const Array& old_array = Array::Handle(Array::New(3, Heap::kOld));
   const Array& new_array = Array::Handle(Array::New(3, Heap::kNew));
diff --git a/runtime/vm/assembler_x64.cc b/runtime/vm/assembler_x64.cc
index a1b6695..20541ef 100644
--- a/runtime/vm/assembler_x64.cc
+++ b/runtime/vm/assembler_x64.cc
@@ -487,7 +487,6 @@
 }
 
 
-
 void Assembler::movss(XmmRegister dst, const Address& src) {
   ASSERT(dst <= XMM15);
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
@@ -2792,9 +2791,8 @@
   if (Thread::CanLoadFromThread(object)) {
     movq(dst, Address(THR, Thread::OffsetFromThread(object)));
   } else if (CanLoadFromObjectPool(object)) {
-    const intptr_t idx =
-        is_unique ? object_pool_wrapper_.AddObject(object)
-                  : object_pool_wrapper_.FindObject(object);
+    const intptr_t idx = is_unique ? object_pool_wrapper_.AddObject(object)
+                                   : object_pool_wrapper_.FindObject(object);
     const int32_t offset = ObjectPool::element_offset(idx);
     LoadWordFromPoolOffset(dst, offset - kHeapObjectTag);
   } else {
@@ -2863,12 +2861,11 @@
     cmpq(reg, Address(THR, Thread::OffsetFromThread(object)));
   } else if (CanLoadFromObjectPool(object)) {
     const intptr_t idx = object_pool_wrapper_.FindObject(object, kNotPatchable);
-    const int32_t offset =  ObjectPool::element_offset(idx);
-    cmpq(reg, Address(PP, offset-kHeapObjectTag));
+    const int32_t offset = ObjectPool::element_offset(idx);
+    cmpq(reg, Address(PP, offset - kHeapObjectTag));
   } else {
     ASSERT(object.IsSmi());
-    CompareImmediate(
-        reg, Immediate(reinterpret_cast<int64_t>(object.raw())));
+    CompareImmediate(reg, Immediate(reinterpret_cast<int64_t>(object.raw())));
   }
 }
 
@@ -2932,9 +2929,8 @@
   // Mask out higher, uninteresting bits which were polluted by dest.
   andl(value, Immediate(kObjectAlignment - 1));
   // Compare with the expected bit pattern.
-  cmpl(value, Immediate(
-      (kNewObjectAlignmentOffset >> 1) + kHeapObjectTag +
-      kOldObjectAlignmentOffset + kHeapObjectTag));
+  cmpl(value, Immediate((kNewObjectAlignmentOffset >> 1) + kHeapObjectTag +
+                        kOldObjectAlignmentOffset + kHeapObjectTag));
   j(NOT_ZERO, no_update, Assembler::kNearJump);
 }
 
@@ -3372,8 +3368,7 @@
 }
 
 
-void Assembler::UpdateAllocationStats(intptr_t cid,
-                                      Heap::Space space) {
+void Assembler::UpdateAllocationStats(intptr_t cid, Heap::Space space) {
   ASSERT(cid > 0);
   intptr_t counter_offset =
       ClassTable::CounterOffsetFor(cid, space == Heap::kNew);
@@ -3507,7 +3502,7 @@
   if (bytes_needed) {
     nop(bytes_needed);
   }
-  ASSERT(((offset + buffer_.GetPosition()) & (alignment-1)) == 0);
+  ASSERT(((offset + buffer_.GetPosition()) & (alignment - 1)) == 0);
 }
 
 
@@ -3632,8 +3627,8 @@
   ASSERT(RawObject::kClassIdTagPos == kBitsPerInt32);
   ASSERT(RawObject::kClassIdTagSize == kBitsPerInt32);
   ASSERT(sizeof(classid_t) == sizeof(uint32_t));
-  const intptr_t class_id_offset = Object::tags_offset() +
-      RawObject::kClassIdTagPos / kBitsPerByte;
+  const intptr_t class_id_offset =
+      Object::tags_offset() + RawObject::kClassIdTagPos / kBitsPerByte;
   movl(result, FieldAddress(object, class_id_offset));
 }
 
@@ -3667,8 +3662,8 @@
   ASSERT(RawObject::kClassIdTagPos == kBitsPerInt32);
   ASSERT(RawObject::kClassIdTagSize == kBitsPerInt32);
   ASSERT(sizeof(classid_t) == sizeof(uint32_t));
-  const intptr_t class_id_offset = Object::tags_offset() +
-      RawObject::kClassIdTagPos / kBitsPerByte;
+  const intptr_t class_id_offset =
+      Object::tags_offset() + RawObject::kClassIdTagPos / kBitsPerByte;
 
   // Untag optimistically. Tag bit is shifted into the CARRY.
   SmiUntag(object);
@@ -3716,7 +3711,7 @@
     return Address(array, index * index_scale);
   } else {
     const int64_t disp = static_cast<int64_t>(index) * index_scale +
-        Instance::DataOffsetFor(cid);
+                         Instance::DataOffsetFor(cid);
     ASSERT(Utils::IsInt(32, disp));
     return FieldAddress(array, static_cast<int32_t>(disp));
   }
@@ -3729,11 +3724,16 @@
   // expected to be untagged before accessing.
   ASSERT(kSmiTagShift == 1);
   switch (index_scale) {
-    case 1: return TIMES_1;
-    case 2: return TIMES_1;
-    case 4: return TIMES_2;
-    case 8: return TIMES_4;
-    case 16: return TIMES_8;
+    case 1:
+      return TIMES_1;
+    case 2:
+      return TIMES_1;
+    case 4:
+      return TIMES_2;
+    case 8:
+      return TIMES_4;
+    case 16:
+      return TIMES_8;
     default:
       UNREACHABLE();
       return TIMES_1;
@@ -3749,18 +3749,15 @@
   if (is_external) {
     return Address(array, index, ToScaleFactor(index_scale), 0);
   } else {
-    return FieldAddress(array,
-                        index,
-                        ToScaleFactor(index_scale),
+    return FieldAddress(array, index, ToScaleFactor(index_scale),
                         Instance::DataOffsetFor(cid));
   }
 }
 
 
 static const char* cpu_reg_names[kNumberOfCpuRegisters] = {
-  "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
-  "r8", "r9", "r10", "r11", "r12", "r13", "thr", "pp"
-};
+    "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
+    "r8",  "r9",  "r10", "r11", "r12", "r13", "thr", "pp"};
 
 
 const char* Assembler::RegisterName(Register reg) {
@@ -3770,9 +3767,8 @@
 
 
 static const char* xmm_reg_names[kNumberOfXmmRegisters] = {
-  "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
-  "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
-};
+    "xmm0", "xmm1", "xmm2",  "xmm3",  "xmm4",  "xmm5",  "xmm6",  "xmm7",
+    "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"};
 
 
 const char* Assembler::FpuRegisterName(FpuRegister reg) {
diff --git a/runtime/vm/assembler_x64.h b/runtime/vm/assembler_x64.h
index b6db263..77f3bb9 100644
--- a/runtime/vm/assembler_x64.h
+++ b/runtime/vm/assembler_x64.h
@@ -23,9 +23,9 @@
 
 class Immediate : public ValueObject {
  public:
-  explicit Immediate(int64_t value) : value_(value) { }
+  explicit Immediate(int64_t value) : value_(value) {}
 
-  Immediate(const Immediate& other) : ValueObject(), value_(other.value_) { }
+  Immediate(const Immediate& other) : ValueObject(), value_(other.value_) {}
 
   int64_t value() const { return value_; }
 
@@ -45,13 +45,9 @@
 
 class Operand : public ValueObject {
  public:
-  uint8_t rex() const {
-    return rex_;
-  }
+  uint8_t rex() const { return rex_; }
 
-  uint8_t mod() const {
-    return (encoding_at(0) >> 6) & 3;
-  }
+  uint8_t mod() const { return (encoding_at(0) >> 6) & 3; }
 
   Register rm() const {
     int rm_rex = (rex_ & REX_B) << 3;
@@ -104,7 +100,7 @@
   }
 
  protected:
-  Operand() : length_(0), rex_(REX_NONE) { }  // Needed by subclass Address.
+  Operand() : length_(0), rex_(REX_NONE) {}  // Needed by subclass Address.
 
   void SetModRM(int mod, Register rm) {
     ASSERT((mod & ~3) == 0);
@@ -155,8 +151,8 @@
   // disguise. Used from the assembler to generate better encodings.
   bool IsRegister(Register reg) const {
     return ((reg > 7 ? 1 : 0) == (rex_ & REX_B))  // REX.B match.
-        && ((encoding_at(0) & 0xF8) == 0xC0)  // Addressing mode is register.
-        && ((encoding_at(0) & 0x07) == reg);  // Register codes match.
+           && ((encoding_at(0) & 0xF8) == 0xC0)  // Addressing mode is register.
+           && ((encoding_at(0) & 0x07) == reg);  // Register codes match.
   }
 
   friend class Assembler;
@@ -218,7 +214,7 @@
   // This addressing mode does not exist.
   Address(Register base, Register index, ScaleFactor scale, Register r);
 
-  Address(const Address& other) : Operand(other) { }
+  Address(const Address& other) : Operand(other) {}
 
   Address& operator=(const Address& other) {
     Operand::operator=(other);
@@ -246,7 +242,7 @@
   }
 
   struct RIPRelativeDisp {
-    explicit RIPRelativeDisp(int32_t disp) : disp_(disp) { }
+    explicit RIPRelativeDisp(int32_t disp) : disp_(disp) {}
     const int32_t disp_;
   };
 
@@ -260,18 +256,18 @@
 class FieldAddress : public Address {
  public:
   FieldAddress(Register base, int32_t disp)
-      : Address(base, disp - kHeapObjectTag) { }
+      : Address(base, disp - kHeapObjectTag) {}
 
   // This addressing mode does not exist.
   FieldAddress(Register base, Register r);
 
   FieldAddress(Register base, Register index, ScaleFactor scale, int32_t disp)
-      : Address(base, index, scale, disp - kHeapObjectTag) { }
+      : Address(base, index, scale, disp - kHeapObjectTag) {}
 
   // This addressing mode does not exist.
   FieldAddress(Register base, Register index, ScaleFactor scale, Register r);
 
-  FieldAddress(const FieldAddress& other) : Address(other) { }
+  FieldAddress(const FieldAddress& other) : Address(other) {}
 
   FieldAddress& operator=(const FieldAddress& other) {
     Address::operator=(other);
@@ -353,7 +349,7 @@
  public:
   explicit Assembler(bool use_far_branches = false);
 
-  ~Assembler() { }
+  ~Assembler() {}
 
   static const bool kNearJump = true;
   static const bool kFarJump = false;
@@ -503,9 +499,9 @@
 
   enum RoundingMode {
     kRoundToNearest = 0x0,
-    kRoundDown      = 0x1,
-    kRoundUp        = 0x2,
-    kRoundToZero    = 0x3
+    kRoundDown = 0x1,
+    kRoundUp = 0x2,
+    kRoundToZero = 0x3
   };
   void roundsd(XmmRegister dst, XmmRegister src, RoundingMode mode);
 
@@ -682,9 +678,7 @@
   void int3();
   void hlt();
 
-  static uword GetBreakInstructionFiller() {
-    return 0xCCCCCCCCCCCCCCCC;
-  }
+  static uword GetBreakInstructionFiller() { return 0xCCCCCCCCCCCCCCCC; }
 
   void j(Condition condition, Label* label, bool near = kFarJump);
 
@@ -749,12 +743,8 @@
 
   void Drop(intptr_t stack_elements, Register tmp = TMP);
 
-  bool constant_pool_allowed() const {
-    return constant_pool_allowed_;
-  }
-  void set_constant_pool_allowed(bool b) {
-    constant_pool_allowed_ = b;
-  }
+  bool constant_pool_allowed() const { return constant_pool_allowed_; }
+  void set_constant_pool_allowed(bool b) { constant_pool_allowed_ = b; }
 
   void LoadImmediate(Register reg, const Immediate& imm);
   void LoadIsolate(Register dst);
@@ -783,9 +773,9 @@
   void CompareObject(Register reg, const Object& object);
 
   // Destroys value.
-  void StoreIntoObject(Register object,  // Object we are storing into.
+  void StoreIntoObject(Register object,      // Object we are storing into.
                        const Address& dest,  // Where we are storing into.
-                       Register value,  // Value we are storing.
+                       Register value,       // Value we are storing.
                        bool can_value_be_smi = true);
 
   void StoreIntoObjectNoBarrier(Register object,
@@ -853,13 +843,9 @@
   /*
    * Misc. functionality.
    */
-  void SmiTag(Register reg) {
-    addq(reg, reg);
-  }
+  void SmiTag(Register reg) { addq(reg, reg); }
 
-  void SmiUntag(Register reg) {
-    sarq(reg, Immediate(kSmiTagSize));
-  }
+  void SmiUntag(Register reg) { sarq(reg, Immediate(kSmiTagSize)); }
 
   void BranchIfNotSmi(Register reg, Label* label) {
     testq(reg, Immediate(kSmiTagMask));
@@ -876,9 +862,7 @@
   const Code::Comments& GetCodeComments() const;
 
   // Address of code at offset.
-  uword CodeAddress(intptr_t offset) {
-    return buffer_.Address(offset);
-  }
+  uword CodeAddress(intptr_t offset) { return buffer_.Address(offset); }
 
   intptr_t CodeSize() const { return buffer_.Size(); }
   intptr_t prologue_offset() const { return prologue_offset_; }
@@ -886,9 +870,7 @@
 
   // Count the fixups that produce a pointer offset, without processing
   // the fixups.
-  intptr_t CountPointerOffsets() const {
-    return buffer_.CountPointerOffsets();
-  }
+  intptr_t CountPointerOffsets() const { return buffer_.CountPointerOffsets(); }
 
   const ZoneGrowableArray<intptr_t>& GetPointerOffsets() const {
     return buffer_.pointer_offsets();
@@ -952,8 +934,7 @@
 
   void MonomorphicCheckedEntry();
 
-  void UpdateAllocationStats(intptr_t cid,
-                             Heap::Space space);
+  void UpdateAllocationStats(intptr_t cid, Heap::Space space);
 
   void UpdateAllocationStatsWithSize(intptr_t cid,
                                      Register size_reg,
@@ -964,9 +945,7 @@
 
   // If allocation tracing for |cid| is enabled, will jump to |trace| label,
   // which will allocate in the runtime where tracing occurs.
-  void MaybeTraceAllocation(intptr_t cid,
-                            Label* trace,
-                            bool near_jump);
+  void MaybeTraceAllocation(intptr_t cid, Label* trace, bool near_jump);
 
   // Inlined allocation of an instance of class 'cls', code has no runtime
   // calls. Jump to 'failure' if the instance cannot be allocated here.
@@ -1029,7 +1008,7 @@
   class CodeComment : public ZoneAllocated {
    public:
     CodeComment(intptr_t pc_offset, const String& comment)
-        : pc_offset_(pc_offset), comment_(comment) { }
+        : pc_offset_(pc_offset), comment_(comment) {}
 
     intptr_t pc_offset() const { return pc_offset_; }
     const String& comment() const { return comment_; }
@@ -1146,18 +1125,14 @@
 }
 
 
-inline void Assembler::EmitREX_RB(XmmRegister reg,
-                                  Register base,
-                                  uint8_t rex) {
+inline void Assembler::EmitREX_RB(XmmRegister reg, Register base, uint8_t rex) {
   if (reg > 7) rex |= REX_R;
   if (base > 7) rex |= REX_B;
   if (rex != REX_NONE) EmitUint8(REX_PREFIX | rex);
 }
 
 
-inline void Assembler::EmitREX_RB(Register reg,
-                                  XmmRegister base,
-                                  uint8_t rex) {
+inline void Assembler::EmitREX_RB(Register reg, XmmRegister base, uint8_t rex) {
   if (reg > 7) rex |= REX_R;
   if (base > 7) rex |= REX_B;
   if (rex != REX_NONE) EmitUint8(REX_PREFIX | rex);
diff --git a/runtime/vm/assembler_x64_test.cc b/runtime/vm/assembler_x64_test.cc
index 4193276..8816dd0 100644
--- a/runtime/vm/assembler_x64_test.cc
+++ b/runtime/vm/assembler_x64_test.cc
@@ -233,8 +233,7 @@
 ASSEMBLER_TEST_GENERATE(JumpAroundCrash, assembler) {
   Label done;
   // Make sure all the condition jumps work.
-  for (Condition condition = OVERFLOW;
-       condition <= GREATER;
+  for (Condition condition = OVERFLOW; condition <= GREATER;
        condition = static_cast<Condition>(condition + 1)) {
     __ j(condition, &done);
   }
@@ -413,8 +412,8 @@
 ASSEMBLER_TEST_GENERATE(UnsignedMultiply, assembler) {
   __ movl(RAX, Immediate(-1));  // RAX = 0xFFFFFFFF
   __ movl(RCX, Immediate(16));  // RCX = 0x10
-  __ mull(RCX);  // RDX:RAX = RAX * RCX = 0x0FFFFFFFF0
-  __ movq(RAX, RDX);  // Return high32(0x0FFFFFFFF0) == 0x0F
+  __ mull(RCX);                 // RDX:RAX = RAX * RCX = 0x0FFFFFFFF0
+  __ movq(RAX, RDX);            // Return high32(0x0FFFFFFFF0) == 0x0F
   __ ret();
 }
 
@@ -534,8 +533,8 @@
 ASSEMBLER_TEST_GENERATE(UnsignedMultiplyLong, assembler) {
   __ movq(RAX, Immediate(-1));  // RAX = 0xFFFFFFFFFFFFFFFF
   __ movq(RCX, Immediate(16));  // RCX = 0x10
-  __ mulq(RCX);  // RDX:RAX = RAX * RCX = 0x0FFFFFFFFFFFFFFFF0
-  __ movq(RAX, RDX);  // Return high64(0x0FFFFFFFFFFFFFFFF0) == 0x0F
+  __ mulq(RCX);                 // RDX:RAX = RAX * RCX = 0x0FFFFFFFFFFFFFFFF0
+  __ movq(RAX, RDX);            // Return high64(0x0FFFFFFFFFFFFFFFF0) == 0x0F
   __ ret();
 }
 
@@ -801,8 +800,8 @@
   __ pushq(CallingConventions::kArg1Reg);
   __ movl(RAX, Address(RSP, 0));  // left low.
   __ movl(RDX, Address(RSP, 4));  // left high.
-  __ addl(RAX, Immediate(12));  // right low immediate.
-  __ adcl(RDX, Immediate(11));  // right high immediate.
+  __ addl(RAX, Immediate(12));    // right low immediate.
+  __ adcl(RDX, Immediate(11));    // right high immediate.
   // Result is in RAX/RDX.
   __ movl(Address(RSP, 0), RAX);  // result low.
   __ movl(Address(RSP, 4), RDX);  // result high.
@@ -826,9 +825,9 @@
 ASSEMBLER_TEST_GENERATE(LongAddAddress, assembler) {
   __ pushq(CallingConventions::kArg2Reg);
   __ pushq(CallingConventions::kArg1Reg);
-  __ movl(RAX, Address(RSP, 0));  // left low.
-  __ movl(RDX, Address(RSP, 4));  // left high.
-  __ addl(RAX, Address(RSP, 8));  // low.
+  __ movl(RAX, Address(RSP, 0));   // left low.
+  __ movl(RDX, Address(RSP, 4));   // left high.
+  __ addl(RAX, Address(RSP, 8));   // low.
   __ adcl(RDX, Address(RSP, 12));  // high.
   // Result is in RAX/RDX.
   __ movl(Address(RSP, 0), RAX);  // result low.
@@ -887,8 +886,8 @@
   __ pushq(CallingConventions::kArg1Reg);
   __ movl(RAX, Address(RSP, 0));  // left low.
   __ movl(RDX, Address(RSP, 4));  // left high.
-  __ subl(RAX, Immediate(12));  // right low immediate.
-  __ sbbl(RDX, Immediate(11));  // right high immediate.
+  __ subl(RAX, Immediate(12));    // right low immediate.
+  __ sbbl(RDX, Immediate(11));    // right high immediate.
   // Result is in RAX/RDX.
   __ movl(Address(RSP, 0), RAX);  // result low.
   __ movl(Address(RSP, 4), RDX);  // result high.
@@ -912,9 +911,9 @@
 ASSEMBLER_TEST_GENERATE(LongSubAddress, assembler) {
   __ pushq(CallingConventions::kArg2Reg);
   __ pushq(CallingConventions::kArg1Reg);
-  __ movl(RAX, Address(RSP, 0));  // left low.
-  __ movl(RDX, Address(RSP, 4));  // left high.
-  __ subl(RAX, Address(RSP, 8));  // low.
+  __ movl(RAX, Address(RSP, 0));   // left low.
+  __ movl(RDX, Address(RSP, 4));   // left high.
+  __ subl(RAX, Address(RSP, 8));   // low.
   __ sbbl(RDX, Address(RSP, 12));  // high.
   // Result is in RAX/RDX.
   __ movl(Address(RSP, 0), RAX);  // result low.
@@ -964,9 +963,9 @@
 
 ASSEMBLER_TEST_GENERATE(AddImmediate, assembler) {
   __ movq(R10, CallingConventions::kArg1Reg);  // al.
-  __ addq(R10, Immediate(13));  // bl.
+  __ addq(R10, Immediate(13));                 // bl.
   __ movq(RAX, CallingConventions::kArg2Reg);  // ah.
-  __ adcq(RAX, Immediate(14));  // bh.
+  __ adcq(RAX, Immediate(14));                 // bh.
   // RAX = high64(ah:al + bh:bl).
   __ ret();
 }
@@ -1040,9 +1039,9 @@
 
 ASSEMBLER_TEST_GENERATE(SubImmediate, assembler) {
   __ movq(R10, CallingConventions::kArg1Reg);  // al.
-  __ subq(R10, Immediate(12));  // bl.
+  __ subq(R10, Immediate(12));                 // bl.
   __ movq(RAX, CallingConventions::kArg2Reg);  // ah.
-  __ sbbq(RAX, Immediate(11));  // bh.
+  __ sbbq(RAX, Immediate(11));                 // bh.
   // RAX = high64(ah:al - bh:bl).
   __ ret();
 }
@@ -1811,8 +1810,9 @@
 
 static int ComputeStackSpaceReservation(int needed, int fixed) {
   return (OS::ActivationFrameAlignment() > 1)
-      ? Utils::RoundUp(needed + fixed, OS::ActivationFrameAlignment()) - fixed
-      : needed;
+             ? Utils::RoundUp(needed + fixed, OS::ActivationFrameAlignment()) -
+                   fixed
+             : needed;
 }
 
 
@@ -1972,11 +1972,11 @@
   static const struct ALIGN16 {
     double a;
     double b;
-  } constant0 = { 1.0, 2.0 };
+  } constant0 = {1.0, 2.0};
   static const struct ALIGN16 {
     double a;
     double b;
-  } constant1 = { 3.0, 4.0 };
+  } constant1 = {3.0, 4.0};
   __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant0)));
   __ movups(XMM10, Address(RAX, 0));
   __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant1)));
@@ -1998,11 +1998,11 @@
   static const struct ALIGN16 {
     double a;
     double b;
-  } constant0 = { 1.0, 2.0 };
+  } constant0 = {1.0, 2.0};
   static const struct ALIGN16 {
     double a;
     double b;
-  } constant1 = { 3.0, 4.0 };
+  } constant1 = {3.0, 4.0};
   __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant0)));
   __ movups(XMM10, Address(RAX, 0));
   __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant1)));
@@ -2046,7 +2046,7 @@
   static const struct ALIGN16 {
     double a;
     double b;
-  } constant0 = { 1.0, 2.0 };
+  } constant0 = {1.0, 2.0};
   EnterTestFrame(assembler);
   __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant0)));
   __ movups(XMM10, Address(RAX, 0));
@@ -2067,7 +2067,7 @@
   static const struct ALIGN16 {
     double a;
     double b;
-  } constant0 = { -1.0, 2.0 };
+  } constant0 = {-1.0, 2.0};
   EnterTestFrame(assembler);
   __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant0)));
   __ movups(XMM10, Address(RAX, 0));
@@ -2088,11 +2088,11 @@
   static const struct ALIGN16 {
     double a;
     double b;
-  } constant0 = { 3.0, 2.0 };
+  } constant0 = {3.0, 2.0};
   static const struct ALIGN16 {
     double a;
     double b;
-  } constant1 = { 3.0, 4.0 };
+  } constant1 = {3.0, 4.0};
   __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant0)));
   __ movups(XMM10, Address(RAX, 0));
   __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant1)));
@@ -2114,11 +2114,11 @@
   static const struct ALIGN16 {
     double a;
     double b;
-  } constant0 = { 9.0, 2.0 };
+  } constant0 = {9.0, 2.0};
   static const struct ALIGN16 {
     double a;
     double b;
-  } constant1 = { 3.0, 4.0 };
+  } constant1 = {3.0, 4.0};
   __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant0)));
   __ movups(XMM10, Address(RAX, 0));
   __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant1)));
@@ -2140,7 +2140,7 @@
   static const struct ALIGN16 {
     double a;
     double b;
-  } constant0 = { 16.0, 2.0 };
+  } constant0 = {16.0, 2.0};
   __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant0)));
   __ movups(XMM10, Address(RAX, 0));
   __ sqrtpd(XMM10);
@@ -2160,11 +2160,11 @@
   static const struct ALIGN16 {
     double a;
     double b;
-  } constant0 = { 9.0, 2.0 };
+  } constant0 = {9.0, 2.0};
   static const struct ALIGN16 {
     double a;
     double b;
-  } constant1 = { 3.0, 4.0 };
+  } constant1 = {3.0, 4.0};
   __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant0)));
   __ movups(XMM10, Address(RAX, 0));
   __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant1)));
@@ -2186,11 +2186,11 @@
   static const struct ALIGN16 {
     double a;
     double b;
-  } constant0 = { 9.0, 2.0 };
+  } constant0 = {9.0, 2.0};
   static const struct ALIGN16 {
     double a;
     double b;
-  } constant1 = { 3.0, 4.0 };
+  } constant1 = {3.0, 4.0};
   __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant0)));
   __ movups(XMM10, Address(RAX, 0));
   __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant1)));
@@ -2212,7 +2212,7 @@
   static const struct ALIGN16 {
     double a;
     double b;
-  } constant0 = { 2.0, 9.0 };
+  } constant0 = {2.0, 9.0};
   __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant0)));
   __ movups(XMM10, Address(RAX, 0));
   // Splat Y across all lanes.
@@ -2236,7 +2236,7 @@
   static const struct ALIGN16 {
     double a;
     double b;
-  } constant0 = { 9.0, 2.0 };
+  } constant0 = {9.0, 2.0};
   __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant0)));
   __ movups(XMM11, Address(RAX, 0));
   __ cvtpd2ps(XMM10, XMM11);
@@ -2258,7 +2258,7 @@
     float b;
     float c;
     float d;
-  } constant0 = { 9.0f, 2.0f, 3.0f, 4.0f };
+  } constant0 = {9.0f, 2.0f, 3.0f, 4.0f};
   __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant0)));
   __ movups(XMM11, Address(RAX, 0));
   __ cvtps2pd(XMM10, XMM11);
@@ -2387,11 +2387,11 @@
   __ movd(XMM0, RAX);
   __ shufps(XMM0, XMM0, Immediate(0x0));
 
-  __ movaps(XMM11, XMM0);  // Copy XMM0
-  __ reciprocalps(XMM11);  // 0.25
-  __ sqrtps(XMM11);  // 0.5
-  __ rsqrtps(XMM0);  // ~0.5
-  __ subps(XMM0, XMM11);  // ~0.0
+  __ movaps(XMM11, XMM0);                  // Copy XMM0
+  __ reciprocalps(XMM11);                  // 0.25
+  __ sqrtps(XMM11);                        // 0.5
+  __ rsqrtps(XMM0);                        // ~0.5
+  __ subps(XMM0, XMM11);                   // ~0.0
   __ shufps(XMM0, XMM0, Immediate(0x00));  // Copy second lane into all 4 lanes.
   __ ret();
 }
@@ -2600,15 +2600,13 @@
     uint32_t b;
     uint32_t c;
     uint32_t d;
-  } constant1 =
-      { 0xF0F0F0F0, 0xF0F0F0F0, 0xF0F0F0F0, 0xF0F0F0F0 };
+  } constant1 = {0xF0F0F0F0, 0xF0F0F0F0, 0xF0F0F0F0, 0xF0F0F0F0};
   static const struct ALIGN16 {
     uint32_t a;
     uint32_t b;
     uint32_t c;
     uint32_t d;
-  } constant2 =
-      { 0x0F0F0F0F, 0x0F0F0F0F, 0x0F0F0F0F, 0x0F0F0F0F };
+  } constant2 = {0x0F0F0F0F, 0x0F0F0F0F, 0x0F0F0F0F, 0x0F0F0F0F};
   __ movq(RAX, Immediate(reinterpret_cast<intptr_t>(&constant1)));
   __ movups(XMM0, Address(RAX, 0));
   __ movq(RAX, Immediate(reinterpret_cast<intptr_t>(&constant2)));
@@ -2634,15 +2632,13 @@
     uint32_t b;
     uint32_t c;
     uint32_t d;
-  } constant1 =
-      { 0xF0F0F0F0, 0xF0F0F0F0, 0xF0F0F0F0, 0xF0F0F0F0 };
+  } constant1 = {0xF0F0F0F0, 0xF0F0F0F0, 0xF0F0F0F0, 0xF0F0F0F0};
   static const struct ALIGN16 {
     uint32_t a;
     uint32_t b;
     uint32_t c;
     uint32_t d;
-  } constant2 =
-      { 0x0F0FFF0F, 0x0F0F0F0F, 0x0F0F0F0F, 0x0F0F0F0F };
+  } constant2 = {0x0F0FFF0F, 0x0F0F0F0F, 0x0F0F0F0F, 0x0F0F0F0F};
   __ movq(RAX, Immediate(reinterpret_cast<intptr_t>(&constant1)));
   __ movups(XMM0, Address(RAX, 0));
   __ movq(RAX, Immediate(reinterpret_cast<intptr_t>(&constant2)));
@@ -2667,8 +2663,7 @@
     uint32_t b;
     uint32_t c;
     uint32_t d;
-  } constant1 =
-      { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
+  } constant1 = {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF};
   EnterTestFrame(assembler);
   __ LoadImmediate(RAX, Immediate(reinterpret_cast<intptr_t>(&constant1)));
   __ movups(XMM9, Address(RAX, 0));
@@ -2694,13 +2689,13 @@
     float b;
     float c;
     float d;
-  } constant0 = { 1.0, 2.0, 3.0, 4.0 };
+  } constant0 = {1.0, 2.0, 3.0, 4.0};
   static const struct ALIGN16 {
     float a;
     float b;
     float c;
     float d;
-  } constant1 = { 5.0, 6.0, 7.0, 8.0 };
+  } constant1 = {5.0, 6.0, 7.0, 8.0};
   // XMM9 = 1.0f, 2.0f, 3.0f, 4.0f.
   __ movq(RAX, Immediate(reinterpret_cast<intptr_t>(&constant0)));
   __ movups(XMM9, Address(RAX, 0));
@@ -2714,7 +2709,7 @@
   __ movaps(XMM1, XMM9);
   __ shufps(XMM9, XMM9, Immediate(0x00));  // 7.0f.
   __ shufps(XMM1, XMM1, Immediate(0x55));  // 8.0f.
-  __ addss(XMM9, XMM1);  // 15.0f.
+  __ addss(XMM9, XMM1);                    // 15.0f.
   __ movaps(XMM0, XMM9);
   __ ret();
 }
@@ -2733,13 +2728,13 @@
     float b;
     float c;
     float d;
-  } constant0 = { 1.0, 2.0, 3.0, 4.0 };
+  } constant0 = {1.0, 2.0, 3.0, 4.0};
   static const struct ALIGN16 {
     float a;
     float b;
     float c;
     float d;
-  } constant1 = { 5.0, 6.0, 7.0, 8.0 };
+  } constant1 = {5.0, 6.0, 7.0, 8.0};
   // XMM9 = 1.0f, 2.0f, 3.0f, 4.0f.
   __ movq(RAX, Immediate(reinterpret_cast<intptr_t>(&constant0)));
   __ movups(XMM9, Address(RAX, 0));
@@ -2753,7 +2748,7 @@
   __ movaps(XMM1, XMM9);
   __ shufps(XMM9, XMM9, Immediate(0xAA));  // 5.0f.
   __ shufps(XMM1, XMM1, Immediate(0xFF));  // 6.0f.
-  __ addss(XMM9, XMM1);  // 11.0f.
+  __ addss(XMM9, XMM1);                    // 11.0f.
   __ movaps(XMM0, XMM9);
   __ ret();
 }
@@ -2772,13 +2767,13 @@
     float b;
     float c;
     float d;
-  } constant0 = { 1.0, 2.0, 3.0, 4.0 };
+  } constant0 = {1.0, 2.0, 3.0, 4.0};
   static const struct ALIGN16 {
     float a;
     float b;
     float c;
     float d;
-  } constant1 = { 5.0, 6.0, 7.0, 8.0 };
+  } constant1 = {5.0, 6.0, 7.0, 8.0};
   // XMM9 = 1.0f, 2.0f, 3.0f, 4.0f.
   __ movq(RAX, Immediate(reinterpret_cast<intptr_t>(&constant0)));
   __ movups(XMM9, Address(RAX, 0));
@@ -2810,13 +2805,13 @@
     float b;
     float c;
     float d;
-  } constant0 = { 1.0, 2.0, 3.0, 4.0 };
+  } constant0 = {1.0, 2.0, 3.0, 4.0};
   static const struct ALIGN16 {
     float a;
     float b;
     float c;
     float d;
-  } constant1 = { 5.0, 6.0, 7.0, 8.0 };
+  } constant1 = {5.0, 6.0, 7.0, 8.0};
   // XMM9 = 1.0f, 2.0f, 3.0f, 4.0f.
   __ movq(RAX, Immediate(reinterpret_cast<intptr_t>(&constant0)));
   __ movups(XMM9, Address(RAX, 0));
@@ -2848,13 +2843,13 @@
     float b;
     float c;
     float d;
-  } constant0 = { 1.0, 2.0, 3.0, 4.0 };
+  } constant0 = {1.0, 2.0, 3.0, 4.0};
   static const struct ALIGN16 {
     float a;
     float b;
     float c;
     float d;
-  } constant1 = { 5.0, 6.0, 7.0, 8.0 };
+  } constant1 = {5.0, 6.0, 7.0, 8.0};
   // XMM9 = 1.0f, 2.0f, 3.0f, 4.0f.
   __ movq(RAX, Immediate(reinterpret_cast<intptr_t>(&constant0)));
   __ movups(XMM9, Address(RAX, 0));
@@ -2886,13 +2881,13 @@
     float b;
     float c;
     float d;
-  } constant0 = { 1.0, 2.0, 3.0, 4.0 };
+  } constant0 = {1.0, 2.0, 3.0, 4.0};
   static const struct ALIGN16 {
     float a;
     float b;
     float c;
     float d;
-  } constant1 = { 5.0, 6.0, 7.0, 8.0 };
+  } constant1 = {5.0, 6.0, 7.0, 8.0};
   // XMM9 = 1.0f, 2.0f, 3.0f, 4.0f.
   __ movq(RAX, Immediate(reinterpret_cast<intptr_t>(&constant0)));
   __ movups(XMM9, Address(RAX, 0));
@@ -2975,8 +2970,8 @@
 
 ASSEMBLER_TEST_RUN(DoubleFPMoves, test) {
   typedef double (*DoubleFPMovesCode)();
-  EXPECT_FLOAT_EQ(1024.67,
-                  reinterpret_cast<DoubleFPMovesCode>(test->entry())(), 0.001);
+  EXPECT_FLOAT_EQ(1024.67, reinterpret_cast<DoubleFPMovesCode>(test->entry())(),
+                  0.001);
 }
 
 
@@ -2994,12 +2989,12 @@
   __ divsd(XMM8, XMM12);  // 14.7
   __ sqrtsd(XMM8, XMM8);  // 3.834
   __ movsd(XMM1, Address(RSP, 0));
-  __ addsd(XMM0, XMM1);  // 15.7
-  __ mulsd(XMM0, XMM1);  // 53.38
-  __ subsd(XMM0, XMM1);  // 49.98
-  __ divsd(XMM0, XMM1);  // 14.7
+  __ addsd(XMM0, XMM1);   // 15.7
+  __ mulsd(XMM0, XMM1);   // 53.38
+  __ subsd(XMM0, XMM1);   // 49.98
+  __ divsd(XMM0, XMM1);   // 14.7
   __ sqrtsd(XMM0, XMM0);  // 3.834057902
-  __ addsd(XMM0, XMM8);  // 7.6681
+  __ addsd(XMM0, XMM8);   // 7.6681
   __ popq(RAX);
   __ ret();
 }
@@ -3035,7 +3030,7 @@
   __ movq(RDX, Immediate(12LL << 32));
   __ cvtsi2sdq(XMM0, RDX);
   __ movsd(XMM15, XMM0);  // Move to high register
-  __ addsd(XMM0, XMM0);  // Stomp XMM0
+  __ addsd(XMM0, XMM0);   // Stomp XMM0
   __ movsd(XMM0, XMM15);  // Move back to XMM0
   __ ret();
 }
@@ -3435,7 +3430,7 @@
 
 ASSEMBLER_TEST_RUN(DoubleAbs, test) {
   double val = -12.45;
-  double res =  test->InvokeWithCodeAndThread<double, double>(val);
+  double res = test->InvokeWithCodeAndThread<double, double>(val);
   EXPECT_FLOAT_EQ(-val, res, 0.001);
   val = 12.45;
   res = test->InvokeWithCodeAndThread<double, double>(val);
@@ -3479,9 +3474,9 @@
 ASSEMBLER_TEST_GENERATE(TestRepMovsBytes, assembler) {
   __ pushq(RSI);
   __ pushq(RDI);
-  __ pushq(CallingConventions::kArg1Reg);  // from.
-  __ pushq(CallingConventions::kArg2Reg);  // to.
-  __ pushq(CallingConventions::kArg3Reg);  // count.
+  __ pushq(CallingConventions::kArg1Reg);     // from.
+  __ pushq(CallingConventions::kArg2Reg);     // to.
+  __ pushq(CallingConventions::kArg3Reg);     // count.
   __ movq(RSI, Address(RSP, 2 * kWordSize));  // from.
   __ movq(RDI, Address(RSP, 1 * kWordSize));  // to.
   __ movq(RCX, Address(RSP, 0 * kWordSize));  // count.
@@ -3505,13 +3500,13 @@
   for (int i = 0; i < 10; i++) {
     EXPECT_EQ(from[i], to[i]);
   }
-  delete [] to;
+  delete[] to;
 }
 
 
 ASSEMBLER_TEST_GENERATE(ConditionalMovesCompare, assembler) {
   __ cmpq(CallingConventions::kArg1Reg, CallingConventions::kArg2Reg);
-  __ movq(RDX, Immediate(1));  // Greater equal.
+  __ movq(RDX, Immediate(1));   // Greater equal.
   __ movq(RCX, Immediate(-1));  // Less
   __ cmovlessq(RAX, RCX);
   __ cmovgeq(RAX, RDX);
@@ -3582,8 +3577,8 @@
 
 ASSEMBLER_TEST_RUN(ConditionalMovesNoOverflow, test) {
   typedef int (*ConditionalMovesNoOverflowCode)(int64_t i, int64_t j);
-  int res = reinterpret_cast<ConditionalMovesNoOverflowCode>(
-      test->entry())(0x7fffffffffffffff, 2);
+  int res = reinterpret_cast<ConditionalMovesNoOverflowCode>(test->entry())(
+      0x7fffffffffffffff, 2);
   EXPECT_EQ(1, res);
   res = reinterpret_cast<ConditionalMovesNoOverflowCode>(test->entry())(1, 1);
   EXPECT_EQ(0, res);
diff --git a/runtime/vm/ast.cc b/runtime/vm/ast.cc
index cfe1637..69fb0d3 100644
--- a/runtime/vm/ast.cc
+++ b/runtime/vm/ast.cc
@@ -14,18 +14,16 @@
 namespace dart {
 
 #define DEFINE_VISIT_FUNCTION(BaseName)                                        \
-void BaseName##Node::Visit(AstNodeVisitor* visitor) {                          \
-  visitor->Visit##BaseName##Node(this);                                        \
-}
+  void BaseName##Node::Visit(AstNodeVisitor* visitor) {                        \
+    visitor->Visit##BaseName##Node(this);                                      \
+  }
 
 FOR_EACH_NODE(DEFINE_VISIT_FUNCTION)
 #undef DEFINE_VISIT_FUNCTION
 
 
 #define DEFINE_NAME_FUNCTION(BaseName)                                         \
-const char* BaseName##Node::Name() const {                                     \
-  return #BaseName;                                                            \
-}
+  const char* BaseName##Node::Name() const { return #BaseName; }
 
 FOR_EACH_NODE(DEFINE_NAME_FUNCTION)
 #undef DEFINE_NAME_FUNCTION
@@ -46,8 +44,7 @@
 // array.
 class AstNodeCollector : public AstNodeVisitor {
  public:
-  explicit AstNodeCollector(GrowableArray<AstNode*>* nodes)
-    : nodes_(nodes) { }
+  explicit AstNodeCollector(GrowableArray<AstNode*>* nodes) : nodes_(nodes) {}
 
 #define DEFINE_VISITOR_FUNCTION(BaseName)                                      \
   virtual void Visit##BaseName##Node(BaseName##Node* node) {                   \
@@ -55,7 +52,7 @@
     node->VisitChildren(this);                                                 \
   }
 
-FOR_EACH_NODE(DEFINE_VISITOR_FUNCTION)
+  FOR_EACH_NODE(DEFINE_VISITOR_FUNCTION)
 #undef DEFINE_VISITOR_FUNCTION
 
  private:
@@ -85,8 +82,7 @@
 }
 
 
-void PrimaryNode::VisitChildren(AstNodeVisitor* visitor) const {
-}
+void PrimaryNode::VisitChildren(AstNodeVisitor* visitor) const {}
 
 
 void ArgumentListNode::VisitChildren(AstNodeVisitor* visitor) const {
@@ -97,10 +93,7 @@
 
 
 LetNode::LetNode(TokenPosition token_pos)
-  : AstNode(token_pos),
-    vars_(1),
-    initializers_(1),
-    nodes_(1) { }
+    : AstNode(token_pos), vars_(1), initializers_(1), nodes_(1) {}
 
 
 LocalVariable* LetNode::AddInitializer(AstNode* node) {
@@ -108,11 +101,10 @@
   Zone* zone = thread->zone();
   initializers_.Add(node);
   char name[64];
-  OS::SNPrint(name, sizeof(name), ":lt%s_%" Pd "",
-      token_pos().ToCString(), vars_.length());
+  OS::SNPrint(name, sizeof(name), ":lt%s_%" Pd "", token_pos().ToCString(),
+              vars_.length());
   LocalVariable* temp_var =
-      new LocalVariable(TokenPosition::kNoSource,
-                        token_pos(),
+      new LocalVariable(TokenPosition::kNoSource, token_pos(),
                         String::ZoneHandle(zone, Symbols::New(thread, name)),
                         Object::dynamic_type());
   vars_.Add(temp_var);
@@ -233,10 +225,9 @@
 
 
 bool ComparisonNode::IsKindValid() const {
-  return Token::IsRelationalOperator(kind_)
-      || Token::IsEqualityOperator(kind_)
-      || Token::IsTypeTestOperator(kind_)
-      || Token::IsTypeCastOperator(kind_);
+  return Token::IsRelationalOperator(kind_) ||
+         Token::IsEqualityOperator(kind_) || Token::IsTypeTestOperator(kind_) ||
+         Token::IsTypeCastOperator(kind_);
 }
 
 
@@ -256,7 +247,7 @@
     case Token::kEQ_STRICT:
     case Token::kNE_STRICT:
       return this->left()->IsPotentiallyConst() &&
-          this->right()->IsPotentiallyConst();
+             this->right()->IsPotentiallyConst();
     default:
       return false;
   }
@@ -286,14 +277,10 @@
     case Token::kNE:
       // The comparison is a compile time const if both operands are either a
       // number, string, or boolean value (but not necessarily the same type).
-      if ((left_val->IsNumber() ||
-          left_val->IsString() ||
-          left_val->IsBool() ||
-          left_val->IsNull()) &&
-          (right_val->IsNumber() ||
-          right_val->IsString() ||
-          right_val->IsBool() ||
-          right_val->IsNull())) {
+      if ((left_val->IsNumber() || left_val->IsString() || left_val->IsBool() ||
+           left_val->IsNull()) &&
+          (right_val->IsNumber() || right_val->IsString() ||
+           right_val->IsBool() || right_val->IsNull())) {
         return &Bool::False();
       }
       return NULL;
@@ -309,7 +296,6 @@
 }
 
 
-
 bool BinaryOpNode::IsKindValid() const {
   switch (kind_) {
     case Token::kADD:
@@ -350,7 +336,7 @@
           this->right()->AsLiteralNode()->literal().IsNull()) {
         return false;
       }
-      // Fall-through intentional.
+    // Fall-through intentional.
     case Token::kADD:
     case Token::kSUB:
     case Token::kMUL:
@@ -364,7 +350,7 @@
     case Token::kSHR:
     case Token::kIFNULL:
       return this->left()->IsPotentiallyConst() &&
-          this->right()->IsPotentiallyConst();
+             this->right()->IsPotentiallyConst();
     default:
       UNREACHABLE();
       return false;
@@ -390,7 +376,7 @@
       if (left_val->IsString()) {
         return right_val->IsString() ? left_val : NULL;
       }
-      // Fall-through intentional.
+    // Fall-through intentional.
     case Token::kSUB:
     case Token::kMUL:
     case Token::kDIV:
@@ -402,8 +388,7 @@
         } else if (right_val->IsNumber()) {
           return right_val;
         }
-      } else if (left_val->IsNumber() &&
-                 right_val->IsNumber()) {
+      } else if (left_val->IsNumber() && right_val->IsNumber()) {
         return left_val;
       }
       return NULL;
@@ -412,8 +397,7 @@
     case Token::kBIT_AND:
     case Token::kSHL:
     case Token::kSHR:
-      if (left_val->IsInteger() &&
-          right_val->IsInteger()) {
+      if (left_val->IsInteger() && right_val->IsInteger()) {
         return right_val;
       }
       return NULL;
@@ -488,15 +472,14 @@
 
 bool ConditionalExprNode::IsPotentiallyConst() const {
   return this->condition()->IsPotentiallyConst() &&
-    this->true_expr()->IsPotentiallyConst() &&
-    this->false_expr()->IsPotentiallyConst();
+         this->true_expr()->IsPotentiallyConst() &&
+         this->false_expr()->IsPotentiallyConst();
 }
 
 
 const Instance* ConditionalExprNode::EvalConstExpr() const {
   const Instance* cond = this->condition()->EvalConstExpr();
-  if ((cond != NULL) &&
-      cond->IsBool() &&
+  if ((cond != NULL) && cond->IsBool() &&
       (this->true_expr()->EvalConstExpr() != NULL) &&
       (this->false_expr()->EvalConstExpr() != NULL)) {
     return cond;
@@ -514,8 +497,7 @@
 
 
 const Instance* ClosureNode::EvalConstExpr() const {
-  if (!is_deferred_reference_ &&
-      function().IsImplicitStaticClosureFunction()) {
+  if (!is_deferred_reference_ && function().IsImplicitStaticClosureFunction()) {
     // Return a value that represents an instance. Only the type is relevant.
     return &Instance::Handle();
   }
@@ -528,11 +510,9 @@
     // This is an implicit closure node created because a static getter was not
     // found. Change the getter into a setter. If it does not exist,
     // noSuchMethod will be called.
-    return new StaticSetterNode(token_pos(),
-                                receiver(),
+    return new StaticSetterNode(token_pos(), receiver(),
                                 Class::ZoneHandle(function().Owner()),
-                                String::ZoneHandle(function().name()),
-                                rhs);
+                                String::ZoneHandle(function().name()), rhs);
   }
   return NULL;
 }
@@ -579,30 +559,24 @@
     return NULL;
   }
   if (Isolate::Current()->type_checks()) {
-    rhs = new AssignableNode(
-        field().token_pos(),
-        rhs,
-        AbstractType::ZoneHandle(field().type()),
-        String::ZoneHandle(field().name()));
+    rhs = new AssignableNode(field().token_pos(), rhs,
+                             AbstractType::ZoneHandle(field().type()),
+                             String::ZoneHandle(field().name()));
   }
-  return new StoreStaticFieldNode(
-      token_pos(), Field::ZoneHandle(field().Original()), rhs);
+  return new StoreStaticFieldNode(token_pos(),
+                                  Field::ZoneHandle(field().Original()), rhs);
 }
 
 
 AstNode* InstanceGetterNode::MakeAssignmentNode(AstNode* rhs) {
-  return new InstanceSetterNode(token_pos(),
-                                receiver(),
-                                field_name(),
-                                rhs,
+  return new InstanceSetterNode(token_pos(), receiver(), field_name(), rhs,
                                 is_conditional());
 }
 
 
 bool InstanceGetterNode::IsPotentiallyConst() const {
-  return field_name().Equals(Symbols::Length()) &&
-    !is_conditional() &&
-    receiver()->IsPotentiallyConst();
+  return field_name().Equals(Symbols::Length()) && !is_conditional() &&
+         receiver()->IsPotentiallyConst();
 }
 
 
@@ -618,8 +592,8 @@
 
 
 AstNode* LoadIndexedNode::MakeAssignmentNode(AstNode* rhs) {
-  return new StoreIndexedNode(token_pos(), array(), index_expr(),
-                              rhs, super_class());
+  return new StoreIndexedNode(token_pos(), array(), index_expr(), rhs,
+                              super_class());
 }
 
 
@@ -638,16 +612,10 @@
     if (setter.IsNull() || setter.is_abstract()) {
       // No instance setter found in super class chain,
       // noSuchMethod will be called at runtime.
-      return new StaticSetterNode(token_pos(),
-                                  receiver(),
-                                  cls(),
-                                  field_name_,
+      return new StaticSetterNode(token_pos(), receiver(), cls(), field_name_,
                                   rhs);
     }
-    return new StaticSetterNode(token_pos(),
-                                receiver(),
-                                field_name_,
-                                setter,
+    return new StaticSetterNode(token_pos(), receiver(), field_name_, setter,
                                 rhs);
   }
 
@@ -668,8 +636,7 @@
       const Field& field = Field::ZoneHandle(zone, Field::Cast(obj).raw());
       if (!field.is_final()) {
         if (isolate->type_checks()) {
-          rhs = new AssignableNode(field.token_pos(),
-                                   rhs,
+          rhs = new AssignableNode(field.token_pos(), rhs,
                                    AbstractType::ZoneHandle(zone, field.type()),
                                    field_name_);
         }
@@ -679,15 +646,15 @@
 
     // No field found in prefix. Look for a setter function.
     const String& setter_name =
-         String::Handle(zone, Field::LookupSetterSymbol(field_name_));
+        String::Handle(zone, Field::LookupSetterSymbol(field_name_));
     if (!setter_name.IsNull()) {
       obj = prefix.LookupObject(setter_name);
       if (obj.IsFunction()) {
         const Function& setter =
             Function::ZoneHandle(zone, Function::Cast(obj).raw());
         ASSERT(setter.is_static() && setter.IsSetterFunction());
-        return new StaticSetterNode(
-            token_pos(), NULL, field_name_, setter, rhs);
+        return new StaticSetterNode(token_pos(), NULL, field_name_, setter,
+                                    rhs);
       }
     }
 
@@ -703,8 +670,7 @@
       const Field& field = Field::ZoneHandle(zone, Field::Cast(obj).raw());
       if (!field.is_final()) {
         if (isolate->type_checks()) {
-          rhs = new AssignableNode(field.token_pos(),
-                                   rhs,
+          rhs = new AssignableNode(field.token_pos(), rhs,
                                    AbstractType::ZoneHandle(zone, field.type()),
                                    field_name_);
         }
@@ -721,8 +687,8 @@
         const Function& setter =
             Function::ZoneHandle(zone, Function::Cast(obj).raw());
         ASSERT(setter.is_static() && setter.IsSetterFunction());
-        return
-            new StaticSetterNode(token_pos(), NULL, field_name_, setter, rhs);
+        return new StaticSetterNode(token_pos(), NULL, field_name_, setter,
+                                    rhs);
       }
     }
 
@@ -740,8 +706,8 @@
   // Access to a lazily initialized static field that has not yet been
   // initialized is compiled to a static implicit getter.
   // A setter may not exist for such a field.
-  const Field& field = Field::ZoneHandle(zone,
-                                         cls().LookupStaticField(field_name_));
+  const Field& field =
+      Field::ZoneHandle(zone, cls().LookupStaticField(field_name_));
   if (!field.IsNull()) {
     if (field.is_final()) {
       // Attempting to assign to a final variable will cause a NoSuchMethodError
@@ -759,11 +725,9 @@
            (getter.kind() == RawFunction::kImplicitStaticFinalGetter));
 #endif
     if (isolate->type_checks()) {
-      rhs = new AssignableNode(
-          field.token_pos(),
-          rhs,
-          AbstractType::ZoneHandle(zone, field.type()),
-          String::ZoneHandle(zone, field.name()));
+      rhs = new AssignableNode(field.token_pos(), rhs,
+                               AbstractType::ZoneHandle(zone, field.type()),
+                               String::ZoneHandle(zone, field.name()));
     }
     return new StoreStaticFieldNode(token_pos(), field, rhs);
   }
diff --git a/runtime/vm/ast.h b/runtime/vm/ast.h
index 8fa533b..ef26563 100644
--- a/runtime/vm/ast.h
+++ b/runtime/vm/ast.h
@@ -64,7 +64,7 @@
   V(TryCatch)                                                                  \
   V(Throw)                                                                     \
   V(InlinedFinally)                                                            \
-  V(StringInterpolate)                                                         \
+  V(StringInterpolate)
 
 
 #define FORWARD_DECLARATION(BaseName) class BaseName##Node;
@@ -79,7 +79,7 @@
   virtual ~AstNodeVisitor() {}
 
 #define DEFINE_VISITOR_FUNCTION(BaseName)                                      \
-  virtual void Visit##BaseName##Node(BaseName##Node* node) { }
+  virtual void Visit##BaseName##Node(BaseName##Node* node) {}
 
   FOR_EACH_NODE(DEFINE_VISITOR_FUNCTION)
 #undef DEFINE_VISITOR_FUNCTION
@@ -97,12 +97,11 @@
 
 class AstNode : public ZoneAllocated {
  public:
-  explicit AstNode(TokenPosition token_pos)
-      : token_pos_(token_pos) {
+  explicit AstNode(TokenPosition token_pos) : token_pos_(token_pos) {
     ASSERT(!token_pos_.IsClassifying() ||
            (token_pos_ == TokenPosition::kMethodExtractor));
   }
-  virtual ~AstNode() { }
+  virtual ~AstNode() {}
 
   TokenPosition token_pos() const { return token_pos_; }
 
@@ -126,9 +125,7 @@
   }
 
   // Return NULL if 'unary_op_kind' can't be applied.
-  virtual AstNode* ApplyUnaryOp(Token::Kind unary_op_kind) {
-    return NULL;
-  }
+  virtual AstNode* ApplyUnaryOp(Token::Kind unary_op_kind) { return NULL; }
 
   // Returns true if this node can be a compile-time constant, assuming
   // that all nodes it depends on are also compile-time constants of
@@ -171,17 +168,15 @@
             LocalVariable* outer_saved_try_ctx,
             LocalVariable* outer_async_saved_try_ctx,
             LocalScope* scope)
-    : AstNode(token_pos),
-      expr_(expr),
-      saved_try_ctx_(saved_try_ctx),
-      async_saved_try_ctx_(async_saved_try_ctx),
-      outer_saved_try_ctx_(outer_saved_try_ctx),
-      outer_async_saved_try_ctx_(outer_async_saved_try_ctx),
-      scope_(scope) { }
+      : AstNode(token_pos),
+        expr_(expr),
+        saved_try_ctx_(saved_try_ctx),
+        async_saved_try_ctx_(async_saved_try_ctx),
+        outer_saved_try_ctx_(outer_saved_try_ctx),
+        outer_async_saved_try_ctx_(outer_async_saved_try_ctx),
+        scope_(scope) {}
 
-  void VisitChildren(AstNodeVisitor* visitor) const {
-    expr_->Visit(visitor);
-  }
+  void VisitChildren(AstNodeVisitor* visitor) const { expr_->Visit(visitor); }
 
   AstNode* expr() const { return expr_; }
   LocalVariable* saved_try_ctx() const { return saved_try_ctx_; }
@@ -220,15 +215,15 @@
   AwaitMarkerNode(LocalScope* async_scope,
                   LocalScope* await_scope,
                   TokenPosition token_pos)
-    : AstNode(token_pos),
-      async_scope_(async_scope),
-      await_scope_(await_scope) {
+      : AstNode(token_pos),
+        async_scope_(async_scope),
+        await_scope_(await_scope) {
     ASSERT(async_scope != NULL);
     ASSERT(await_scope != NULL);
     await_scope->CaptureLocalVariables(async_scope);
   }
 
-  void VisitChildren(AstNodeVisitor* visitor) const { }
+  void VisitChildren(AstNodeVisitor* visitor) const {}
 
   LocalScope* async_scope() const { return async_scope_; }
   LocalScope* await_scope() const { return await_scope_; }
@@ -246,11 +241,7 @@
 class SequenceNode : public AstNode {
  public:
   SequenceNode(TokenPosition token_pos, LocalScope* scope)
-    : AstNode(token_pos),
-      scope_(scope),
-      nodes_(4),
-      label_(NULL) {
-  }
+      : AstNode(token_pos), scope_(scope), nodes_(4), label_(NULL) {}
 
   LocalScope* scope() const { return scope_; }
 
@@ -280,11 +271,9 @@
 
 class CloneContextNode : public AstNode {
  public:
-  explicit CloneContextNode(TokenPosition token_pos)
-    : AstNode(token_pos) {
-  }
+  explicit CloneContextNode(TokenPosition token_pos) : AstNode(token_pos) {}
 
-  virtual void VisitChildren(AstNodeVisitor* visitor) const { }
+  virtual void VisitChildren(AstNodeVisitor* visitor) const {}
 
   DECLARE_COMMON_NODE_FUNCTIONS(CloneContextNode);
 
@@ -296,23 +285,16 @@
 class ArgumentListNode : public AstNode {
  public:
   explicit ArgumentListNode(TokenPosition token_pos)
-     : AstNode(token_pos),
-       nodes_(4),
-       names_(Array::ZoneHandle()) {
-  }
+      : AstNode(token_pos), nodes_(4), names_(Array::ZoneHandle()) {}
 
   void VisitChildren(AstNodeVisitor* visitor) const;
 
-  void Add(AstNode* node) {
-    nodes_.Add(node);
-  }
+  void Add(AstNode* node) { nodes_.Add(node); }
   intptr_t length() const { return nodes_.length(); }
   AstNode* NodeAt(intptr_t index) const { return nodes_[index]; }
   void SetNodeAt(intptr_t index, AstNode* node) { nodes_[index] = node; }
   const Array& names() const { return names_; }
-  void set_names(const Array& names) {
-    names_ = names.raw();
-  }
+  void set_names(const Array& names) { names_ = names.raw(); }
   const GrowableArray<AstNode*>& nodes() const { return nodes_; }
 
   DECLARE_COMMON_NODE_FUNCTIONS(ArgumentListNode);
@@ -341,9 +323,7 @@
 
   void AddNode(AstNode* node) { nodes_.Add(node); }
 
-  intptr_t num_temps() const {
-    return vars_.length();
-  }
+  intptr_t num_temps() const { return vars_.length(); }
 
   void VisitChildren(AstNodeVisitor* visitor) const;
 
@@ -361,17 +341,13 @@
 class ArrayNode : public AstNode {
  public:
   ArrayNode(TokenPosition token_pos, const AbstractType& type)
-      : AstNode(token_pos),
-        type_(type),
-        elements_() {
+      : AstNode(token_pos), type_(type), elements_() {
     CheckFields();
   }
   ArrayNode(TokenPosition token_pos,
             const AbstractType& type,
             const GrowableArray<AstNode*>& elements)
-      : AstNode(token_pos),
-        type_(type),
-        elements_(elements.length()) {
+      : AstNode(token_pos), type_(type), elements_(elements.length()) {
     CheckFields();
     for (intptr_t i = 0; i < elements.length(); i++) {
       elements_.Add(elements[i]);
@@ -412,7 +388,7 @@
 class StringInterpolateNode : public AstNode {
  public:
   StringInterpolateNode(TokenPosition token_pos, ArrayNode* value)
-      : AstNode(token_pos), value_(value) { }
+      : AstNode(token_pos), value_(value) {}
 
   virtual void VisitChildren(AstNodeVisitor* visitor) const {
     value_->Visit(visitor);
@@ -450,11 +426,9 @@
   const Instance& literal() const { return literal_; }
 
   virtual bool IsPotentiallyConst() const;
-  virtual const Instance* EvalConstExpr() const {
-    return &literal();
-  }
+  virtual const Instance* EvalConstExpr() const { return &literal(); }
 
-  virtual void VisitChildren(AstNodeVisitor* visitor) const { }
+  virtual void VisitChildren(AstNodeVisitor* visitor) const {}
 
   virtual AstNode* ApplyUnaryOp(Token::Kind unary_op_kind);
 
@@ -475,8 +449,7 @@
     ASSERT(!type_.IsNull());
     ASSERT(type_.IsFinalized());
     // A wellformed literal Type must be canonical.
-    ASSERT(!type_.IsType() ||
-           type_.IsMalformedOrMalbounded() ||
+    ASSERT(!type_.IsType() || type_.IsMalformedOrMalbounded() ||
            type_.IsCanonical());
   }
 
@@ -491,7 +464,7 @@
     return &type();
   }
 
-  virtual void VisitChildren(AstNodeVisitor* visitor) const { }
+  virtual void VisitChildren(AstNodeVisitor* visitor) const {}
 
   DECLARE_COMMON_NODE_FUNCTIONS(TypeNode);
 
@@ -591,9 +564,7 @@
 class PrimaryNode : public AstNode {
  public:
   PrimaryNode(TokenPosition token_pos, const Object& primary)
-      : AstNode(token_pos),
-        primary_(primary),
-        is_deferred_reference_(false) {
+      : AstNode(token_pos), primary_(primary), is_deferred_reference_(false) {
     ASSERT(primary_.IsNotTemporaryScopedHandle());
   }
 
@@ -629,21 +600,16 @@
 // In synchronous functions, return nodes are always of type'kRegular'
 class ReturnNode : public AstNode {
  public:
-  enum ReturnType {
-    kRegular,
-    kContinuation,
-    kContinuationTarget
-  };
+  enum ReturnType { kRegular, kContinuation, kContinuationTarget };
 
   // Return from a void function returns the null object.
   explicit ReturnNode(TokenPosition token_pos)
       : AstNode(token_pos),
         value_(new LiteralNode(token_pos, Instance::ZoneHandle())),
         inlined_finally_list_(),
-        return_type_(kRegular) { }
+        return_type_(kRegular) {}
   // Return from a non-void function.
-  ReturnNode(TokenPosition token_pos,
-             AstNode* value)
+  ReturnNode(TokenPosition token_pos, AstNode* value)
       : AstNode(token_pos),
         value_(value),
         inlined_finally_list_(),
@@ -693,7 +659,7 @@
                  Token::Kind kind,
                  AstNode* left,
                  AstNode* right)
-  : AstNode(token_pos), kind_(kind), left_(left), right_(right) {
+      : AstNode(token_pos), kind_(kind), left_(left), right_(right) {
     ASSERT(left_ != NULL);
     ASSERT(right_ != NULL);
     ASSERT(IsKindValid());
@@ -775,9 +741,7 @@
   static AstNode* UnaryOpOrLiteral(TokenPosition token_pos,
                                    Token::Kind kind,
                                    AstNode* operand);
-  UnaryOpNode(TokenPosition token_pos,
-              Token::Kind kind,
-              AstNode* operand)
+  UnaryOpNode(TokenPosition token_pos, Token::Kind kind, AstNode* operand)
       : AstNode(token_pos), kind_(kind), operand_(operand) {
     ASSERT(operand_ != NULL);
     ASSERT(IsKindValid());
@@ -816,9 +780,9 @@
         condition_(condition),
         true_expr_(true_expr),
         false_expr_(false_expr) {
-      ASSERT(condition_ != NULL);
-      ASSERT(true_expr_ != NULL);
-      ASSERT(false_expr_ != NULL);
+    ASSERT(condition_ != NULL);
+    ASSERT(true_expr_ != NULL);
+    ASSERT(false_expr_ != NULL);
   }
 
   AstNode* condition() const { return condition_; }
@@ -864,7 +828,7 @@
         condition_(condition),
         true_branch_(true_branch),
         false_branch_(false_branch) {
-      ASSERT(condition_ != NULL);
+    ASSERT(condition_ != NULL);
   }
 
   AstNode* condition() const { return condition_; }
@@ -898,12 +862,12 @@
            bool contains_default,
            LocalVariable* switch_expr_value,
            SequenceNode* statements)
-    : AstNode(token_pos),
-      label_(label),
-      case_expressions_(case_expressions),
-      contains_default_(contains_default),
-      switch_expr_value_(switch_expr_value),
-      statements_(statements) {
+      : AstNode(token_pos),
+        label_(label),
+        case_expressions_(case_expressions),
+        contains_default_(contains_default),
+        switch_expr_value_(switch_expr_value),
+        statements_(statements) {
     // label may be NULL.
     ASSERT(case_expressions_ != NULL);
     ASSERT(switch_expr_value_ != NULL);
@@ -936,12 +900,8 @@
 
 class SwitchNode : public AstNode {
  public:
-  SwitchNode(TokenPosition token_pos,
-             SourceLabel* label,
-             SequenceNode* body)
-    : AstNode(token_pos),
-      label_(label),
-      body_(body) {
+  SwitchNode(TokenPosition token_pos, SourceLabel* label, SequenceNode* body)
+      : AstNode(token_pos), label_(label), body_(body) {
     ASSERT(label_ != NULL);
     ASSERT(body_ != NULL);
   }
@@ -970,11 +930,11 @@
             AstNode* condition,
             SequenceNode* condition_preamble,
             SequenceNode* body)
-    : AstNode(token_pos),
-      label_(label),
-      condition_(condition),
-      condition_preamble_(condition_preamble),
-      body_(body) {
+      : AstNode(token_pos),
+        label_(label),
+        condition_(condition),
+        condition_preamble_(condition_preamble),
+        body_(body) {
     ASSERT(label_ != NULL);
     ASSERT(condition_ != NULL);
     ASSERT(body_ != NULL);
@@ -1011,10 +971,7 @@
               SourceLabel* label,
               AstNode* condition,
               SequenceNode* body)
-    : AstNode(token_pos),
-      label_(label),
-      condition_(condition),
-      body_(body) {
+      : AstNode(token_pos), label_(label), condition_(condition), body_(body) {
     ASSERT(label_ != NULL);
     ASSERT(condition_ != NULL);
     ASSERT(body_ != NULL);
@@ -1050,13 +1007,13 @@
           SequenceNode* condition_preamble,
           SequenceNode* increment,
           SequenceNode* body)
-    : AstNode(token_pos),
-      label_(label),
-      initializer_(initializer),
-      condition_(condition),
-      condition_preamble_(condition_preamble),
-      increment_(increment),
-      body_(body) {
+      : AstNode(token_pos),
+        label_(label),
+        initializer_(initializer),
+        condition_(condition),
+        condition_preamble_(condition_preamble),
+        increment_(increment),
+        body_(body) {
     ASSERT(label_ != NULL);
     ASSERT(initializer_ != NULL);
     ASSERT(increment_ != NULL);
@@ -1099,13 +1056,11 @@
 
 class JumpNode : public AstNode {
  public:
-  JumpNode(TokenPosition token_pos,
-           Token::Kind kind,
-           SourceLabel* label)
-    : AstNode(token_pos),
-      kind_(kind),
-      label_(label),
-      inlined_finally_list_() {
+  JumpNode(TokenPosition token_pos, Token::Kind kind, SourceLabel* label)
+      : AstNode(token_pos),
+        kind_(kind),
+        label_(label),
+        inlined_finally_list_() {
     ASSERT(label_ != NULL);
     ASSERT(kind_ == Token::kBREAK || kind_ == Token::kCONTINUE);
   }
@@ -1125,7 +1080,7 @@
 
   const char* TokenName() const;
 
-  virtual void VisitChildren(AstNodeVisitor* visitor) const { }
+  virtual void VisitChildren(AstNodeVisitor* visitor) const {}
 
   DECLARE_COMMON_NODE_FUNCTIONS(JumpNode);
 
@@ -1141,14 +1096,13 @@
 class StopNode : public AstNode {
  public:
   StopNode(TokenPosition token_pos, const char* message)
-      : AstNode(token_pos),
-        message_(message) {
+      : AstNode(token_pos), message_(message) {
     ASSERT(message != NULL);
   }
 
   const char* message() const { return message_; }
 
-  virtual void VisitChildren(AstNodeVisitor* visitor) const { }
+  virtual void VisitChildren(AstNodeVisitor* visitor) const {}
 
   DECLARE_COMMON_NODE_FUNCTIONS(StopNode);
 
@@ -1168,7 +1122,7 @@
 
   const LocalVariable& local() const { return local_; }
 
-  virtual void VisitChildren(AstNodeVisitor* visitor) const { }
+  virtual void VisitChildren(AstNodeVisitor* visitor) const {}
 
   virtual const Instance* EvalConstExpr() const;
   virtual bool IsPotentiallyConst() const;
@@ -1188,7 +1142,7 @@
   StoreLocalNode(TokenPosition token_pos,
                  const LocalVariable* local,
                  AstNode* value)
-      : AstNode(token_pos),  local_(*local), value_(value) {
+      : AstNode(token_pos), local_(*local), value_(value) {
     ASSERT(local != NULL);
     ASSERT(value_ != NULL);
   }
@@ -1215,8 +1169,7 @@
   LoadInstanceFieldNode(TokenPosition token_pos,
                         AstNode* instance,
                         const Field& field)
-      : AstNode(token_pos), instance_(instance),
-        field_(*MayCloneField(field)) {
+      : AstNode(token_pos), instance_(instance), field_(*MayCloneField(field)) {
     ASSERT(instance_ != NULL);
     ASSERT(field_.IsZoneHandle());
   }
@@ -1290,19 +1243,17 @@
   void set_is_deferred(bool value) { is_deferred_reference_ = value; }
   bool is_deferred_reference() const { return is_deferred_reference_; }
 
-  virtual void VisitChildren(AstNodeVisitor* visitor) const { }
+  virtual void VisitChildren(AstNodeVisitor* visitor) const {}
 
   virtual AstNode* MakeAssignmentNode(AstNode* rhs);
 
-  virtual bool IsPotentiallyConst() const {
-    return field_.is_const();
-  }
+  virtual bool IsPotentiallyConst() const { return field_.is_const(); }
 
   virtual const Instance* EvalConstExpr() const {
     ASSERT(field_.is_static());
     return !is_deferred_reference_ && field_.is_const()
-        ? &Instance::ZoneHandle(field_.StaticValue())
-        : NULL;
+               ? &Instance::ZoneHandle(field_.StaticValue())
+               : NULL;
   }
 
   DECLARE_COMMON_NODE_FUNCTIONS(LoadStaticFieldNode);
@@ -1320,9 +1271,7 @@
   StoreStaticFieldNode(TokenPosition token_pos,
                        const Field& field,
                        AstNode* value)
-      : AstNode(token_pos),
-        field_(*MayCloneField(field)),
-        value_(value) {
+      : AstNode(token_pos), field_(*MayCloneField(field)), value_(value) {
     ASSERT(field_.IsZoneHandle());
     ASSERT(value_ != NULL);
   }
@@ -1388,11 +1337,11 @@
                    AstNode* index,
                    AstNode* value,
                    const Class& super_class)
-    : AstNode(token_pos),
-      array_(array),
-      index_expr_(index),
-      value_(value),
-      super_class_(super_class) {
+      : AstNode(token_pos),
+        array_(array),
+        index_expr_(index),
+        value_(value),
+        super_class_(super_class) {
     ASSERT(array_ != NULL);
     ASSERT(index_expr_ != NULL);
     ASSERT(value_ != NULL);
@@ -1544,14 +1493,13 @@
 class InitStaticFieldNode : public AstNode {
  public:
   InitStaticFieldNode(TokenPosition token_pos, const Field& field)
-      : AstNode(token_pos),
-        field_(*MayCloneField(field)) {
+      : AstNode(token_pos), field_(*MayCloneField(field)) {
     ASSERT(field_.IsZoneHandle());
   }
 
   const Field& field() const { return field_; }
 
-  virtual void VisitChildren(AstNodeVisitor* visitor) const { }
+  virtual void VisitChildren(AstNodeVisitor* visitor) const {}
 
   DECLARE_COMMON_NODE_FUNCTIONS(InitStaticFieldNode);
 
@@ -1598,7 +1546,7 @@
   bool is_super_getter() const { return receiver_ != NULL; }
   void set_is_deferred(bool value) { is_deferred_reference_ = value; }
 
-  virtual void VisitChildren(AstNodeVisitor* visitor) const { }
+  virtual void VisitChildren(AstNodeVisitor* visitor) const {}
 
   virtual AstNode* MakeAssignmentNode(AstNode* rhs);
 
@@ -1644,12 +1592,12 @@
                    const Class& cls,
                    const String& field_name,
                    AstNode* value)
-  : AstNode(token_pos),
-  receiver_(receiver),
-  cls_(cls),
-  field_name_(field_name),
-  function_(Function::ZoneHandle()),
-  value_(value) {
+      : AstNode(token_pos),
+        receiver_(receiver),
+        cls_(cls),
+        field_name_(field_name),
+        function_(Function::ZoneHandle()),
+        value_(value) {
     ASSERT(cls_.IsZoneHandle());
     ASSERT(field_name_.IsZoneHandle());
     ASSERT(value_ != NULL);
@@ -1686,9 +1634,7 @@
   StaticCallNode(TokenPosition token_pos,
                  const Function& function,
                  ArgumentListNode* arguments)
-      : AstNode(token_pos),
-        function_(function),
-        arguments_(arguments) {
+      : AstNode(token_pos), function_(function), arguments_(arguments) {
     ASSERT(function_.IsZoneHandle());
     ASSERT(arguments_ != NULL);
   }
@@ -1717,9 +1663,7 @@
   ClosureCallNode(TokenPosition token_pos,
                   AstNode* closure,
                   ArgumentListNode* arguments)
-      : AstNode(token_pos),
-        closure_(closure),
-        arguments_(arguments) {
+      : AstNode(token_pos), closure_(closure), arguments_(arguments) {
     ASSERT(closure_ != NULL);
     ASSERT(arguments_ != NULL);
   }
@@ -1783,9 +1727,7 @@
     ASSERT(arguments_ != NULL);
   }
 
-  const TypeArguments& type_arguments() const {
-    return type_arguments_;
-  }
+  const TypeArguments& type_arguments() const { return type_arguments_; }
   const Function& constructor() const { return constructor_; }
   ArgumentListNode* arguments() const { return arguments_; }
 
@@ -1830,7 +1772,7 @@
 
   bool link_lazily() const { return link_lazily_; }
 
-  virtual void VisitChildren(AstNodeVisitor* visitor) const { }
+  virtual void VisitChildren(AstNodeVisitor* visitor) const {}
 
   DECLARE_COMMON_NODE_FUNCTIONS(NativeBodyNode);
 
@@ -1881,10 +1823,10 @@
   const LocalVariable& exception_var() const { return exception_var_; }
   const LocalVariable& stacktrace_var() const { return stacktrace_var_; }
   const LocalVariable& rethrow_exception_var() const {
-      return rethrow_exception_var_;
+    return rethrow_exception_var_;
   }
   const LocalVariable& rethrow_stacktrace_var() const {
-      return rethrow_stacktrace_var_;
+    return rethrow_stacktrace_var_;
   }
   intptr_t catch_handler_index() const { return catch_handler_index_; }
   bool needs_stacktrace() const { return needs_stacktrace_; }
diff --git a/runtime/vm/ast_printer.cc b/runtime/vm/ast_printer.cc
index 6b47267..e196109 100644
--- a/runtime/vm/ast_printer.cc
+++ b/runtime/vm/ast_printer.cc
@@ -15,11 +15,10 @@
 namespace dart {
 
 AstPrinter::AstPrinter(bool log)
-    : indent_(0),
-      logger_(log ? Log::Current() : Log::NoOpLog()) { }
+    : indent_(0), logger_(log ? Log::Current() : Log::NoOpLog()) {}
 
 
-AstPrinter::~AstPrinter() { }
+AstPrinter::~AstPrinter() {}
 
 
 void AstPrinter::VisitGenericAstNode(AstNode* node) {
@@ -34,14 +33,11 @@
   LocalScope* scope = node->scope();
   logger_->Print("(%s (scope \"%p\"", node->Name(), scope);
   if (scope != NULL) {
-    logger_->Print(" (%s-%s) loop %d",
-              scope->begin_token_pos().ToCString(),
-              scope->end_token_pos().ToCString(),
-              scope->loop_level());
+    logger_->Print(" (%s-%s) loop %d", scope->begin_token_pos().ToCString(),
+                   scope->end_token_pos().ToCString(), scope->loop_level());
     if (scope->HasContextLevel()) {
-      logger_->Print(" context %d captures %d",
-                scope->context_level(),
-                scope->num_context_variables());
+      logger_->Print(" context %d captures %d", scope->context_level(),
+                     scope->num_context_variables());
     } else {
       ASSERT(scope->num_context_variables() == 0);
     }
@@ -93,15 +89,12 @@
 
 void AstPrinter::VisitGenericLocalNode(AstNode* node,
                                        const LocalVariable& var) {
-  logger_->Print("(%s %s%s \"%s\"",
-            node->Name(),
-            var.is_final() ? "final " : "",
-            String::Handle(var.type().Name()).ToCString(),
-            var.name().ToCString());
+  logger_->Print(
+      "(%s %s%s \"%s\"", node->Name(), var.is_final() ? "final " : "",
+      String::Handle(var.type().Name()).ToCString(), var.name().ToCString());
   if (var.HasIndex()) {
     if (var.is_captured()) {
-      logger_->Print(" (context %d %d)",
-                     var.owner()->context_level(),
+      logger_->Print(" (context %d %d)", var.owner()->context_level(),
                      var.index());
     } else {
       logger_->Print(" (stack %d)", var.index());
@@ -124,12 +117,10 @@
 
 
 void AstPrinter::VisitGenericFieldNode(AstNode* node, const Field& field) {
-  logger_->Print("(%s %s%s \"%s\" ",
-            node->Name(),
-            field.is_final() ? "final " : "",
-            String::Handle(AbstractType::Handle(field.type()).Name()).
-                ToCString(),
-            String::Handle(field.name()).ToCString());
+  logger_->Print(
+      "(%s %s%s \"%s\" ", node->Name(), field.is_final() ? "final " : "",
+      String::Handle(AbstractType::Handle(field.type()).Name()).ToCString(),
+      String::Handle(field.name()).ToCString());
   node->VisitChildren(this);
   logger_->Print(")");
 }
@@ -178,19 +169,16 @@
 
 void AstPrinter::VisitTypeNode(TypeNode* node) {
   const AbstractType& type = node->type();
-  logger_->Print("(%s \"%s\")",
-            node->Name(),
-            String::Handle(type.Name()).ToCString());
+  logger_->Print("(%s \"%s\")", node->Name(),
+                 String::Handle(type.Name()).ToCString());
 }
 
 
 void AstPrinter::VisitAssignableNode(AssignableNode* node) {
   const AbstractType& type = node->type();
   const String& dst_name = node->dst_name();
-  logger_->Print("(%s (type \"%s\") (of \"%s\") ",
-            node->Name(),
-            String::Handle(type.Name()).ToCString(),
-            dst_name.ToCString());
+  logger_->Print("(%s (type \"%s\") (of \"%s\") ", node->Name(),
+                 String::Handle(type.Name()).ToCString(), dst_name.ToCString());
   node->VisitChildren(this);
   logger_->Print(")");
 }
@@ -204,17 +192,14 @@
 
 
 void AstPrinter::VisitAwaitMarkerNode(AwaitMarkerNode* node) {
-  logger_->Print("(%s (async_scope \"%p\" await_scope \"%p\"))",
-            node->Name(),
-            node->async_scope(),
-            node->await_scope());
+  logger_->Print("(%s (async_scope \"%p\" await_scope \"%p\"))", node->Name(),
+                 node->async_scope(), node->await_scope());
 }
 
 
 void AstPrinter::VisitPrimaryNode(PrimaryNode* node) {
-  logger_->Print("(*****%s***** \"%s\")",
-            node->Name(),
-            node->primary().ToCString());
+  logger_->Print("(*****%s***** \"%s\")", node->Name(),
+                 node->primary().ToCString());
 }
 
 
@@ -296,18 +281,14 @@
 
 
 void AstPrinter::VisitJumpNode(JumpNode* node) {
-  logger_->Print("(%s %s %s (scope \"%p\"))",
-            node->Name(),
-            node->TokenName(),
-            node->label()->name().ToCString(),
-            node->label()->owner());
+  logger_->Print("(%s %s %s (scope \"%p\"))", node->Name(), node->TokenName(),
+                 node->label()->name().ToCString(), node->label()->owner());
 }
 
 
 void AstPrinter::VisitInstanceCallNode(InstanceCallNode* node) {
-  logger_->Print("(%s \"%s\" ",
-            node->Name(),
-            node->function_name().ToCString());
+  logger_->Print("(%s \"%s\" ", node->Name(),
+                 node->function_name().ToCString());
   node->VisitChildren(this);
   logger_->Print(")");
 }
@@ -356,27 +337,22 @@
 
 
 void AstPrinter::VisitInitStaticFieldNode(InitStaticFieldNode* node) {
-  logger_->Print("(%s \"%s\")",
-            node->Name(),
-            String::Handle(node->field().name()).ToCString());
+  logger_->Print("(%s \"%s\")", node->Name(),
+                 String::Handle(node->field().name()).ToCString());
 }
 
 
 void AstPrinter::VisitStaticGetterNode(StaticGetterNode* node) {
   String& class_name = String::Handle(node->cls().Name());
-  logger_->Print("(%s \"%s.%s\")",
-            node->Name(),
-            class_name.ToCString(),
-            node->field_name().ToCString());
+  logger_->Print("(%s \"%s.%s\")", node->Name(), class_name.ToCString(),
+                 node->field_name().ToCString());
 }
 
 
 void AstPrinter::VisitStaticSetterNode(StaticSetterNode* node) {
   String& class_name = String::Handle(node->cls().Name());
-  logger_->Print("(%s \"%s.%s\" ",
-            node->Name(),
-            class_name.ToCString(),
-            node->field_name().ToCString());
+  logger_->Print("(%s \"%s.%s\" ", node->Name(), class_name.ToCString(),
+                 node->field_name().ToCString());
   node->VisitChildren(this);
   logger_->Print(")");
 }
@@ -397,10 +373,10 @@
 
 
 void AstPrinter::VisitNativeBodyNode(NativeBodyNode* node) {
-  logger_->Print("(%s \"%s\" (%" Pd " args))",
-            node->Name(),
-            node->native_c_function_name().ToCString(),
-            NativeArguments::ParameterCountForResolution(node->function()));
+  logger_->Print(
+      "(%s \"%s\" (%" Pd " args))", node->Name(),
+      node->native_c_function_name().ToCString(),
+      NativeArguments::ParameterCountForResolution(node->function()));
 }
 
 
@@ -458,10 +434,9 @@
   ASSERT(scope != NULL);
   ASSERT(var != NULL);
   IndentN(indent);
-  logger_->Print("(%s%s '%s'",
-            var->is_final() ? "final " : "",
-            String::Handle(var->type().Name()).ToCString(),
-            var->name().ToCString());
+  logger_->Print("(%s%s '%s'", var->is_final() ? "final " : "",
+                 String::Handle(var->type().Name()).ToCString(),
+                 var->name().ToCString());
   if (var->owner() != scope) {
     logger_->Print(" alias");
   }
@@ -473,9 +448,8 @@
   } else if (var->owner()->function_level() != 0) {
     logger_->Print(" lev %d", var->owner()->function_level());
   }
-  logger_->Print(" valid %s-%s)\n",
-            var->token_pos().ToCString(),
-            scope->end_token_pos().ToCString());
+  logger_->Print(" valid %s-%s)\n", var->token_pos().ToCString(),
+                 scope->end_token_pos().ToCString());
 }
 
 
@@ -492,9 +466,8 @@
     IndentN(indent);
     logger_->Print("{scope %p ", child);
     if (child->HasContextLevel()) {
-      logger_->Print("ctx %d numctxvar %d ",
-                child->context_level(),
-                child->num_context_variables());
+      logger_->Print("ctx %d numctxvar %d ", child->context_level(),
+                     child->num_context_variables());
     }
     logger_->Print("llev %d\n", child->loop_level());
     PrintLocalScope(child, 0, indent + kScopeIndent);
@@ -515,9 +488,8 @@
   const char* function_name = function.ToFullyQualifiedCString();
   logger_->Print("Scope for function '%s'\n{scope %p ", function_name, scope);
   if (scope->HasContextLevel()) {
-    logger_->Print("ctx %d numctxvar %d ",
-              scope->context_level(),
-              scope->num_context_variables());
+    logger_->Print("ctx %d numctxvar %d ", scope->context_level(),
+                   scope->num_context_variables());
   }
   logger_->Print("llev %d\n", scope->loop_level());
   const int num_fixed_params = function.num_fixed_parameters();
@@ -530,10 +502,9 @@
     LocalVariable* param = scope->VariableAt(pos);
     ASSERT(param->owner() == scope);  // No aliases should precede parameters.
     IndentN(indent);
-    logger_->Print("(param %s%s '%s'",
-              param->is_final() ? "final " : "",
-              String::Handle(param->type().Name()).ToCString(),
-              param->name().ToCString());
+    logger_->Print("(param %s%s '%s'", param->is_final() ? "final " : "",
+                   String::Handle(param->type().Name()).ToCString(),
+                   param->name().ToCString());
     // Print the default value if the parameter is optional.
     if (pos >= num_fixed_params && pos < num_params) {
       const Instance& default_parameter_value =
@@ -546,9 +517,8 @@
         logger_->Print(" ctx %d", param->owner()->context_level());
       }
     }
-    logger_->Print(" valid %s-%s)\n",
-              param->token_pos().ToCString(),
-              scope->end_token_pos().ToCString());
+    logger_->Print(" valid %s-%s)\n", param->token_pos().ToCString(),
+                   scope->end_token_pos().ToCString());
     pos++;
   }
   // Visit remaining non-parameter variables and children scopes.
diff --git a/runtime/vm/ast_printer_test.cc b/runtime/vm/ast_printer_test.cc
index f3f7fd6..5ea05a4 100644
--- a/runtime/vm/ast_printer_test.cc
+++ b/runtime/vm/ast_printer_test.cc
@@ -16,11 +16,9 @@
 
 TEST_CASE(AstPrinter) {
   const TokenPosition kPos = TokenPosition::kNoSource;
-  LocalVariable* v =
-      new LocalVariable(kPos,
-                        kPos,
-                        String::ZoneHandle(Symbols::New(thread, "wurscht")),
-                        Type::ZoneHandle(Type::DynamicType()));
+  LocalVariable* v = new LocalVariable(
+      kPos, kPos, String::ZoneHandle(Symbols::New(thread, "wurscht")),
+      Type::ZoneHandle(Type::DynamicType()));
   v->set_index(5);
   AstPrinter ast_printer;
   LoadLocalNode* ll = new LoadLocalNode(kPos, v);
@@ -33,10 +31,9 @@
 
   ast_printer.PrintNode(new ReturnNode(kPos));
 
-  ast_printer.PrintNode(new BinaryOpNode(kPos,
-                        Token::kADD,
-                        new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(3))),
-                        new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(5)))));
+  ast_printer.PrintNode(new BinaryOpNode(
+      kPos, Token::kADD, new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(3))),
+      new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(5)))));
   ast_printer.PrintNode(new UnaryOpNode(kPos, Token::kNEGATE, ll));
 }
 
diff --git a/runtime/vm/ast_test.cc b/runtime/vm/ast_test.cc
index 7b49c9c..0de9984 100644
--- a/runtime/vm/ast_test.cc
+++ b/runtime/vm/ast_test.cc
@@ -13,11 +13,10 @@
 namespace dart {
 
 TEST_CASE(Ast) {
-  LocalVariable* v = new LocalVariable(
-      TokenPosition::kNoSource,
-      TokenPosition::kNoSource,
-      String::ZoneHandle(Symbols::New(thread, "v")),
-      Type::ZoneHandle(Type::DynamicType()));
+  LocalVariable* v =
+      new LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
+                        String::ZoneHandle(Symbols::New(thread, "v")),
+                        Type::ZoneHandle(Type::DynamicType()));
   AstNode* ll = new LoadLocalNode(TokenPosition::kNoSource, v);
   EXPECT(ll->IsLoadLocalNode());
   EXPECT(!ll->IsLiteralNode());
@@ -26,11 +25,10 @@
   v->set_index(1);
   EXPECT_EQ(1, v->index());
 
-  LocalVariable* p = new LocalVariable(
-      TokenPosition::kNoSource,
-      TokenPosition::kNoSource,
-      String::ZoneHandle(Symbols::New(thread, "p")),
-      Type::ZoneHandle(Type::DynamicType()));
+  LocalVariable* p =
+      new LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
+                        String::ZoneHandle(Symbols::New(thread, "p")),
+                        Type::ZoneHandle(Type::DynamicType()));
   EXPECT(!p->HasIndex());
   p->set_index(-1);
   EXPECT(p->HasIndex());
@@ -39,8 +37,8 @@
   ReturnNode* r = new ReturnNode(TokenPosition::kNoSource, lln);
   EXPECT_EQ(lln, r->value());
 
-  LiteralNode* l = new LiteralNode(TokenPosition::kNoSource,
-                                   Smi::ZoneHandle(Smi::New(3)));
+  LiteralNode* l =
+      new LiteralNode(TokenPosition::kNoSource, Smi::ZoneHandle(Smi::New(3)));
   EXPECT(l->literal().IsSmi());
   EXPECT_EQ(Smi::New(3), l->literal().raw());
 
@@ -50,17 +48,15 @@
   EXPECT_EQ(l, b->left());
   EXPECT_EQ(lln, b->right());
 
-  UnaryOpNode* u =
-      new UnaryOpNode(TokenPosition::kNoSource, Token::kNEGATE, b);
+  UnaryOpNode* u = new UnaryOpNode(TokenPosition::kNoSource, Token::kNEGATE, b);
   EXPECT_EQ(Token::kNEGATE, u->kind());
   EXPECT_EQ(b, u->operand());
 
   SequenceNode* sequence_node =
       new SequenceNode(TokenPosition(1), new LocalScope(NULL, 0, 0));
   LiteralNode* literal_node =
-      new LiteralNode(TokenPosition(2),  Smi::ZoneHandle(Smi::New(3)));
-  ReturnNode* return_node =
-      new ReturnNode(TokenPosition(3), literal_node);
+      new LiteralNode(TokenPosition(2), Smi::ZoneHandle(Smi::New(3)));
+  ReturnNode* return_node = new ReturnNode(TokenPosition(3), literal_node);
   sequence_node->Add(return_node);
   GrowableArray<AstNode*> nodes;
   sequence_node->CollectAllNodes(&nodes);
diff --git a/runtime/vm/ast_transformer.cc b/runtime/vm/ast_transformer.cc
index a137674..c731c33 100644
--- a/runtime/vm/ast_transformer.cc
+++ b/runtime/vm/ast_transformer.cc
@@ -44,9 +44,9 @@
   V(While)
 
 #define DEFINE_UNREACHABLE(BaseName)                                           \
-void AwaitTransformer::Visit##BaseName##Node(BaseName##Node* node) {           \
-  UNREACHABLE();                                                               \
-}
+  void AwaitTransformer::Visit##BaseName##Node(BaseName##Node* node) {         \
+    UNREACHABLE();                                                             \
+  }
 
 FOR_EACH_UNREACHABLE_NODE(DEFINE_UNREACHABLE)
 #undef DEFINE_UNREACHABLE
@@ -76,11 +76,9 @@
   LocalVariable* await_tmp = async_temp_scope_->LocalLookupVariable(symbol);
   if (await_tmp == NULL) {
     // We need a new temp variable; add it to the function's top scope.
-    await_tmp = new(Z) LocalVariable(
-        TokenPosition::kNoSource,
-        TokenPosition::kNoSource,
-        symbol,
-        Object::dynamic_type());
+    await_tmp = new (Z)
+        LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
+                      symbol, Object::dynamic_type());
     async_temp_scope_->AddVariable(await_tmp);
     // After adding it to the top scope, we can look it up from the preamble.
     // The following call includes an ASSERT check.
@@ -103,7 +101,7 @@
     TokenPosition token_pos) {
   LocalVariable* tmp_var = EnsureCurrentTempVar();
   ASSERT(token_pos.IsSynthetic() || token_pos.IsNoSource());
-  preamble_->Add(new(Z) StoreLocalNode(token_pos, tmp_var, node));
+  preamble_->Add(new (Z) StoreLocalNode(token_pos, tmp_var, node));
   NextTempVar();
   return tmp_var;
 }
@@ -111,7 +109,7 @@
 
 LoadLocalNode* AwaitTransformer::MakeName(AstNode* node) {
   LocalVariable* temp = AddNewTempVarToPreamble(node, ST(node->token_pos()));
-  return new(Z) LoadLocalNode(ST(node->token_pos()), temp);
+  return new (Z) LoadLocalNode(ST(node->token_pos()), temp);
 }
 
 
@@ -121,7 +119,7 @@
 
 
 void AwaitTransformer::VisitTypeNode(TypeNode* node) {
-  result_ = new(Z) TypeNode(node->token_pos(), node->type());
+  result_ = new (Z) TypeNode(node->token_pos(), node->type());
 }
 
 
@@ -138,25 +136,25 @@
   //   :await_temp_var_(X+1) = :result_param;
 
   const TokenPosition token_pos = ST(node->token_pos());
-  LocalVariable* async_op = GetVariableInScope(
-      preamble_->scope(), Symbols::AsyncOperation());
-  LocalVariable* async_then_callback = GetVariableInScope(
-      preamble_->scope(), Symbols::AsyncThenCallback());
+  LocalVariable* async_op =
+      GetVariableInScope(preamble_->scope(), Symbols::AsyncOperation());
+  LocalVariable* async_then_callback =
+      GetVariableInScope(preamble_->scope(), Symbols::AsyncThenCallback());
   LocalVariable* async_catch_error_callback = GetVariableInScope(
       preamble_->scope(), Symbols::AsyncCatchErrorCallback());
-  LocalVariable* result_param = GetVariableInScope(
-      preamble_->scope(), Symbols::AsyncOperationParam());
+  LocalVariable* result_param =
+      GetVariableInScope(preamble_->scope(), Symbols::AsyncOperationParam());
   LocalVariable* error_param = GetVariableInScope(
       preamble_->scope(), Symbols::AsyncOperationErrorParam());
   LocalVariable* stack_trace_param = GetVariableInScope(
       preamble_->scope(), Symbols::AsyncOperationStackTraceParam());
 
   AstNode* transformed_expr = Transform(node->expr());
-  LocalVariable* await_temp = AddNewTempVarToPreamble(transformed_expr,
-                                                      ST(node->token_pos()));
+  LocalVariable* await_temp =
+      AddNewTempVarToPreamble(transformed_expr, ST(node->token_pos()));
 
   AwaitMarkerNode* await_marker =
-      new(Z) AwaitMarkerNode(async_temp_scope_, node->scope(), token_pos);
+      new (Z) AwaitMarkerNode(async_temp_scope_, node->scope(), token_pos);
   preamble_->Add(await_marker);
 
   // :result_param = _awaitHelper(
@@ -166,22 +164,19 @@
       Z, async_lib.LookupFunctionAllowPrivate(Symbols::AsyncAwaitHelper()));
   ASSERT(!async_await_helper.IsNull());
   ArgumentListNode* async_await_helper_args =
-      new(Z) ArgumentListNode(token_pos);
+      new (Z) ArgumentListNode(token_pos);
+  async_await_helper_args->Add(new (Z) LoadLocalNode(token_pos, await_temp));
   async_await_helper_args->Add(
-      new(Z) LoadLocalNode(token_pos, await_temp));
+      new (Z) LoadLocalNode(token_pos, async_then_callback));
   async_await_helper_args->Add(
-      new(Z) LoadLocalNode(token_pos, async_then_callback));
-  async_await_helper_args->Add(
-      new(Z) LoadLocalNode(token_pos, async_catch_error_callback));
-  StaticCallNode* await_helper_call = new(Z) StaticCallNode(
-      node->token_pos(),
-      async_await_helper,
-      async_await_helper_args);
+      new (Z) LoadLocalNode(token_pos, async_catch_error_callback));
+  StaticCallNode* await_helper_call = new (Z) StaticCallNode(
+      node->token_pos(), async_await_helper, async_await_helper_args);
 
-  preamble_->Add(new(Z) StoreLocalNode(
-      token_pos, result_param, await_helper_call));
+  preamble_->Add(
+      new (Z) StoreLocalNode(token_pos, result_param, await_helper_call));
 
-  ReturnNode* continuation_return = new(Z) ReturnNode(token_pos);
+  ReturnNode* continuation_return = new (Z) ReturnNode(token_pos);
   continuation_return->set_return_type(ReturnNode::kContinuationTarget);
   preamble_->Add(continuation_return);
 
@@ -189,17 +184,13 @@
   // restoring the saved try context that lives on the stack and possibly the
   // saved try context of the outer try block.
   if (node->saved_try_ctx() != NULL) {
-    preamble_->Add(new(Z) StoreLocalNode(
-        token_pos,
-        node->saved_try_ctx(),
-        new(Z) LoadLocalNode(token_pos,
-                             node->async_saved_try_ctx())));
+    preamble_->Add(new (Z) StoreLocalNode(
+        token_pos, node->saved_try_ctx(),
+        new (Z) LoadLocalNode(token_pos, node->async_saved_try_ctx())));
     if (node->outer_saved_try_ctx() != NULL) {
-      preamble_->Add(new(Z) StoreLocalNode(
-          token_pos,
-          node->outer_saved_try_ctx(),
-          new(Z) LoadLocalNode(token_pos,
-                               node->outer_async_saved_try_ctx())));
+      preamble_->Add(new (Z) StoreLocalNode(
+          token_pos, node->outer_saved_try_ctx(),
+          new (Z) LoadLocalNode(token_pos, node->outer_async_saved_try_ctx())));
     }
   } else {
     ASSERT(node->outer_saved_try_ctx() == NULL);
@@ -207,33 +198,26 @@
 
   // Load the async_op variable. It is unused, but the observatory uses it
   // to determine if a breakpoint is inside an asynchronous function.
-  LoadLocalNode* load_async_op = new(Z) LoadLocalNode(token_pos, async_op);
+  LoadLocalNode* load_async_op = new (Z) LoadLocalNode(token_pos, async_op);
   preamble_->Add(load_async_op);
 
-  LoadLocalNode* load_error_param = new(Z) LoadLocalNode(
-      token_pos, error_param);
-  LoadLocalNode* load_stack_trace_param = new(Z) LoadLocalNode(
-      token_pos, stack_trace_param);
-  SequenceNode* error_ne_null_branch = new(Z) SequenceNode(
-      token_pos, ChainNewScope(preamble_->scope()));
-  error_ne_null_branch->Add(new(Z) ThrowNode(
-      token_pos,
-      load_error_param,
-      load_stack_trace_param));
-  preamble_->Add(new(Z) IfNode(
-      token_pos,
-      new(Z) ComparisonNode(
-          token_pos,
-          Token::kNE,
-          load_error_param,
-          new(Z) LiteralNode(token_pos,
-                              Object::null_instance())),
-          error_ne_null_branch,
-          NULL));
+  LoadLocalNode* load_error_param =
+      new (Z) LoadLocalNode(token_pos, error_param);
+  LoadLocalNode* load_stack_trace_param =
+      new (Z) LoadLocalNode(token_pos, stack_trace_param);
+  SequenceNode* error_ne_null_branch =
+      new (Z) SequenceNode(token_pos, ChainNewScope(preamble_->scope()));
+  error_ne_null_branch->Add(
+      new (Z) ThrowNode(token_pos, load_error_param, load_stack_trace_param));
+  preamble_->Add(new (Z) IfNode(
+      token_pos, new (Z) ComparisonNode(
+                     token_pos, Token::kNE, load_error_param,
+                     new (Z) LiteralNode(token_pos, Object::null_instance())),
+      error_ne_null_branch, NULL));
 
-  LocalVariable* result = AddNewTempVarToPreamble(new(Z) LoadLocalNode(
-      token_pos, result_param), ST(node->token_pos()));
-  result_ = new(Z) LoadLocalNode(token_pos, result);
+  LocalVariable* result = AddNewTempVarToPreamble(
+      new (Z) LoadLocalNode(token_pos, result_param), ST(node->token_pos()));
+  result_ = new (Z) LoadLocalNode(token_pos, result);
 }
 
 
@@ -257,31 +241,28 @@
                                          AstNode* right) {
   ASSERT(logical_op == Token::kAND || logical_op == Token::kOR);
   AstNode* result = NULL;
-  const Token::Kind compare_logical_op = (logical_op == Token::kAND) ?
-      Token::kEQ : Token::kNE;
-  SequenceNode* eval = new(Z) SequenceNode(
-      ST(new_left->token_pos()), ChainNewScope(preamble_->scope()));
+  const Token::Kind compare_logical_op =
+      (logical_op == Token::kAND) ? Token::kEQ : Token::kNE;
+  SequenceNode* eval = new (Z) SequenceNode(ST(new_left->token_pos()),
+                                            ChainNewScope(preamble_->scope()));
   SequenceNode* saved_preamble = preamble_;
   preamble_ = eval;
   result = Transform(right);
   preamble_ = saved_preamble;
-  IfNode* right_body = new(Z) IfNode(
-      ST(new_left->token_pos()),
-      new(Z) ComparisonNode(
-          ST(new_left->token_pos()),
-          compare_logical_op,
-          new_left,
-          new(Z) LiteralNode(ST(new_left->token_pos()), Bool::True())),
-      eval,
-      NULL);
+  IfNode* right_body = new (Z)
+      IfNode(ST(new_left->token_pos()),
+             new (Z) ComparisonNode(
+                 ST(new_left->token_pos()), compare_logical_op, new_left,
+                 new (Z) LiteralNode(ST(new_left->token_pos()), Bool::True())),
+             eval, NULL);
   preamble_->Add(right_body);
   return result;
 }
 
 
 LocalScope* AwaitTransformer::ChainNewScope(LocalScope* parent) {
-  return new(Z) LocalScope(
-      parent, parent->function_level(), parent->loop_level());
+  return new (Z)
+      LocalScope(parent, parent->function_level(), parent->loop_level());
 }
 
 
@@ -294,28 +275,23 @@
   } else {
     new_right = Transform(node->right());
   }
-  result_ = MakeName(new(Z) BinaryOpNode(node->token_pos(),
-      node->kind(),
-      new_left,
-      new_right));
+  result_ = MakeName(new (Z) BinaryOpNode(node->token_pos(), node->kind(),
+                                          new_left, new_right));
 }
 
 
 void AwaitTransformer::VisitComparisonNode(ComparisonNode* node) {
   AstNode* new_left = Transform(node->left());
   AstNode* new_right = Transform(node->right());
-  result_ = MakeName(new(Z) ComparisonNode(node->token_pos(),
-      node->kind(),
-      new_left,
-      new_right));
+  result_ = MakeName(new (Z) ComparisonNode(node->token_pos(), node->kind(),
+                                            new_left, new_right));
 }
 
 
 void AwaitTransformer::VisitUnaryOpNode(UnaryOpNode* node) {
   AstNode* new_operand = Transform(node->operand());
-  result_ = MakeName(new(Z) UnaryOpNode(node->token_pos(),
-      node->kind(),
-      new_operand));
+  result_ = MakeName(
+      new (Z) UnaryOpNode(node->token_pos(), node->kind(), new_operand));
 }
 
 
@@ -323,30 +299,26 @@
 //
 void AwaitTransformer::VisitConditionalExprNode(ConditionalExprNode* node) {
   AstNode* new_condition = Transform(node->condition());
-  SequenceNode* new_true = new(Z) SequenceNode(
+  SequenceNode* new_true = new (Z) SequenceNode(
       ST(node->true_expr()->token_pos()), ChainNewScope(preamble_->scope()));
   SequenceNode* saved_preamble = preamble_;
   preamble_ = new_true;
   AstNode* new_true_result = Transform(node->true_expr());
-  SequenceNode* new_false = new(Z) SequenceNode(
+  SequenceNode* new_false = new (Z) SequenceNode(
       ST(node->false_expr()->token_pos()), ChainNewScope(preamble_->scope()));
   preamble_ = new_false;
   AstNode* new_false_result = Transform(node->false_expr());
   preamble_ = saved_preamble;
-  IfNode* new_if = new(Z) IfNode(ST(node->token_pos()),
-                                 new_condition,
-                                 new_true,
-                                 new_false);
+  IfNode* new_if =
+      new (Z) IfNode(ST(node->token_pos()), new_condition, new_true, new_false);
   preamble_->Add(new_if);
-  result_ = MakeName(new(Z) ConditionalExprNode(ST(node->token_pos()),
-      new_condition,
-      new_true_result,
-      new_false_result));
+  result_ = MakeName(new (Z) ConditionalExprNode(
+      ST(node->token_pos()), new_condition, new_true_result, new_false_result));
 }
 
 
 void AwaitTransformer::VisitArgumentListNode(ArgumentListNode* node) {
-  ArgumentListNode* new_args = new(Z) ArgumentListNode(node->token_pos());
+  ArgumentListNode* new_args = new (Z) ArgumentListNode(node->token_pos());
   for (intptr_t i = 0; i < node->length(); i++) {
     new_args->Add(Transform(node->NodeAt(i)));
   }
@@ -360,14 +332,14 @@
   for (intptr_t i = 0; i < node->length(); i++) {
     new_elements.Add(Transform(node->ElementAt(i)));
   }
-  result_ = new(Z) ArrayNode(node->token_pos(), node->type(), new_elements);
+  result_ = new (Z) ArrayNode(node->token_pos(), node->type(), new_elements);
 }
 
 
 void AwaitTransformer::VisitStringInterpolateNode(StringInterpolateNode* node) {
   ArrayNode* new_value = Transform(node->value())->AsArrayNode();
-  result_ = MakeName(new(Z) StringInterpolateNode(node->token_pos(),
-      new_value));
+  result_ =
+      MakeName(new (Z) StringInterpolateNode(node->token_pos(), new_value));
 }
 
 
@@ -376,10 +348,8 @@
   if (new_receiver != NULL) {
     new_receiver = Transform(new_receiver);
   }
-  result_ = MakeName(new(Z) ClosureNode(node->token_pos(),
-      node->function(),
-      new_receiver,
-      node->scope()));
+  result_ = MakeName(new (Z) ClosureNode(node->token_pos(), node->function(),
+                                         new_receiver, node->scope()));
 }
 
 
@@ -387,39 +357,34 @@
   AstNode* new_receiver = Transform(node->receiver());
   ArgumentListNode* new_args =
       Transform(node->arguments())->AsArgumentListNode();
-  result_ = MakeName(new(Z) InstanceCallNode(node->token_pos(),
-      new_receiver,
-      node->function_name(),
-      new_args,
-      node->is_conditional()));
+  result_ = MakeName(new (Z) InstanceCallNode(node->token_pos(), new_receiver,
+                                              node->function_name(), new_args,
+                                              node->is_conditional()));
 }
 
 
 void AwaitTransformer::VisitStaticCallNode(StaticCallNode* node) {
   ArgumentListNode* new_args =
       Transform(node->arguments())->AsArgumentListNode();
-  result_ = MakeName(new(Z) StaticCallNode(node->token_pos(),
-      node->function(),
-      new_args));
+  result_ = MakeName(
+      new (Z) StaticCallNode(node->token_pos(), node->function(), new_args));
 }
 
 
 void AwaitTransformer::VisitConstructorCallNode(ConstructorCallNode* node) {
   ArgumentListNode* new_args =
       Transform(node->arguments())->AsArgumentListNode();
-  result_ = MakeName(new(Z) ConstructorCallNode(node->token_pos(),
-      node->type_arguments(),
-      node->constructor(),
-      new_args));
+  result_ = MakeName(
+      new (Z) ConstructorCallNode(node->token_pos(), node->type_arguments(),
+                                  node->constructor(), new_args));
 }
 
 
 void AwaitTransformer::VisitInstanceGetterNode(InstanceGetterNode* node) {
   AstNode* new_receiver = Transform(node->receiver());
-  result_ = MakeName(new(Z) InstanceGetterNode(node->token_pos(),
-      new_receiver,
-      node->field_name(),
-      node->is_conditional()));
+  result_ = MakeName(new (Z) InstanceGetterNode(node->token_pos(), new_receiver,
+                                                node->field_name(),
+                                                node->is_conditional()));
 }
 
 
@@ -429,11 +394,9 @@
     new_receiver = Transform(new_receiver);
   }
   AstNode* new_value = Transform(node->value());
-  result_ = MakeName(new(Z) InstanceSetterNode(node->token_pos(),
-      new_receiver,
-      node->field_name(),
-      new_value,
-      node->is_conditional()));
+  result_ = MakeName(new (Z) InstanceSetterNode(node->token_pos(), new_receiver,
+                                                node->field_name(), new_value,
+                                                node->is_conditional()));
 }
 
 
@@ -442,11 +405,8 @@
   if (new_receiver != NULL) {
     new_receiver = Transform(new_receiver);
   }
-  StaticGetterNode* new_getter =
-      new(Z) StaticGetterNode(node->token_pos(),
-                              new_receiver,
-                              node->cls(),
-                              node->field_name());
+  StaticGetterNode* new_getter = new (Z) StaticGetterNode(
+      node->token_pos(), new_receiver, node->cls(), node->field_name());
   new_getter->set_owner(node->owner());
   result_ = MakeName(new_getter);
 }
@@ -460,16 +420,11 @@
   AstNode* new_value = Transform(node->value());
   StaticSetterNode* new_setter =
       node->function().IsNull()
-      ? new(Z) StaticSetterNode(node->token_pos(),
-                                new_receiver,
-                                node->cls(),
-                                node->field_name(),
-                                new_value)
-      : new(Z) StaticSetterNode(node->token_pos(),
-                                new_receiver,
-                                node->field_name(),
-                                node->function(),
-                                new_value);
+          ? new (Z) StaticSetterNode(node->token_pos(), new_receiver,
+                                     node->cls(), node->field_name(), new_value)
+          : new (Z) StaticSetterNode(node->token_pos(), new_receiver,
+                                     node->field_name(), node->function(),
+                                     new_value);
 
   result_ = MakeName(new_setter);
 }
@@ -482,9 +437,8 @@
 
 void AwaitTransformer::VisitStoreLocalNode(StoreLocalNode* node) {
   AstNode* new_value = Transform(node->value());
-  result_ = MakeName(new(Z) StoreLocalNode(node->token_pos(),
-      &node->local(),
-      new_value));
+  result_ = MakeName(
+      new (Z) StoreLocalNode(node->token_pos(), &node->local(), new_value));
 }
 
 
@@ -495,8 +449,8 @@
 
 void AwaitTransformer::VisitStoreStaticFieldNode(StoreStaticFieldNode* node) {
   AstNode* new_value = Transform(node->value());
-  result_ = MakeName(new(Z) StoreStaticFieldNode(node->token_pos(),
-      Field::ZoneHandle(Z, node->field().Original()),
+  result_ = MakeName(new (Z) StoreStaticFieldNode(
+      node->token_pos(), Field::ZoneHandle(Z, node->field().Original()),
       new_value));
 }
 
@@ -504,10 +458,8 @@
 void AwaitTransformer::VisitLoadIndexedNode(LoadIndexedNode* node) {
   AstNode* new_array = Transform(node->array());
   AstNode* new_index = Transform(node->index_expr());
-  result_ = MakeName(new(Z) LoadIndexedNode(node->token_pos(),
-      new_array,
-      new_index,
-      node->super_class()));
+  result_ = MakeName(new (Z) LoadIndexedNode(node->token_pos(), new_array,
+                                             new_index, node->super_class()));
 }
 
 
@@ -515,20 +467,15 @@
   AstNode* new_array = Transform(node->array());
   AstNode* new_index = Transform(node->index_expr());
   AstNode* new_value = Transform(node->value());
-  result_ = MakeName(new(Z) StoreIndexedNode(node->token_pos(),
-      new_array,
-      new_index,
-      new_value,
-      node->super_class()));
+  result_ = MakeName(new (Z) StoreIndexedNode(
+      node->token_pos(), new_array, new_index, new_value, node->super_class()));
 }
 
 
 void AwaitTransformer::VisitAssignableNode(AssignableNode* node) {
   AstNode* new_expr = Transform(node->expr());
-  result_ = MakeName(new(Z) AssignableNode(node->token_pos(),
-      new_expr,
-      node->type(),
-      node->dst_name()));
+  result_ = MakeName(new (Z) AssignableNode(node->token_pos(), new_expr,
+                                            node->type(), node->dst_name()));
 }
 
 
@@ -541,9 +488,8 @@
   for (intptr_t i = 0; i < node->num_temps(); i++) {
     async_temp_scope_->AddVariable(node->TempAt(i));
     AstNode* new_init_val = Transform(node->InitializerAt(i));
-    preamble_->Add(new(Z) StoreLocalNode(node->token_pos(),
-                                         node->TempAt(i),
-                                         new_init_val));
+    preamble_->Add(new (Z) StoreLocalNode(node->token_pos(), node->TempAt(i),
+                                          new_init_val));
   }
 
   // Add all expressions but the last to the preamble. We must do
@@ -565,9 +511,8 @@
 
 void AwaitTransformer::VisitThrowNode(ThrowNode* node) {
   AstNode* new_exception = Transform(node->exception());
-  result_ = MakeName(new(Z) ThrowNode(node->token_pos(),
-      new_exception,
-      node->stacktrace()));
+  result_ = MakeName(
+      new (Z) ThrowNode(node->token_pos(), new_exception, node->stacktrace()));
 }
 
 }  // namespace dart
diff --git a/runtime/vm/atomic.h b/runtime/vm/atomic.h
index 75d0b84..c66c2cf 100644
--- a/runtime/vm/atomic.h
+++ b/runtime/vm/atomic.h
@@ -48,8 +48,9 @@
   //
   // NOTE: OK to use with memory locations that are accessed by generated code
   static uword CompareAndSwapWord(uword* ptr, uword old_value, uword new_value);
-  static uint32_t CompareAndSwapUint32(
-      uint32_t* ptr, uint32_t old_value, uint32_t new_value);
+  static uint32_t CompareAndSwapUint32(uint32_t* ptr,
+                                       uint32_t old_value,
+                                       uint32_t new_value);
 
   // Performs a load of a word from 'ptr', but without any guarantees about
   // memory order (i.e., no load barriers/fences).
diff --git a/runtime/vm/atomic_test.cc b/runtime/vm/atomic_test.cc
index 262a328..3a95a64 100644
--- a/runtime/vm/atomic_test.cc
+++ b/runtime/vm/atomic_test.cc
@@ -65,8 +65,8 @@
 TEST_CASE(CompareAndSwapWord) {
   uword old_value = 42;
   uword new_value = 100;
-  uword result = AtomicOperations::CompareAndSwapWord(
-      &old_value, old_value, new_value);
+  uword result =
+      AtomicOperations::CompareAndSwapWord(&old_value, old_value, new_value);
   EXPECT_EQ(static_cast<uword>(42), result);
 }
 
@@ -74,8 +74,8 @@
 TEST_CASE(CompareAndSwapUint32) {
   uint32_t old_value = 42;
   uint32_t new_value = 100;
-  uint32_t result = AtomicOperations::CompareAndSwapUint32(
-      &old_value, old_value, new_value);
+  uint32_t result =
+      AtomicOperations::CompareAndSwapUint32(&old_value, old_value, new_value);
   EXPECT_EQ(static_cast<uint32_t>(42), result);
 }
 
diff --git a/runtime/vm/atomic_win.h b/runtime/vm/atomic_win.h
index 7abf59e..398ed43 100644
--- a/runtime/vm/atomic_win.h
+++ b/runtime/vm/atomic_win.h
@@ -18,10 +18,12 @@
 inline uintptr_t AtomicOperations::FetchAndIncrement(uintptr_t* p) {
 #if defined(HOST_ARCH_X64)
   return static_cast<uintptr_t>(
-      InterlockedIncrement64(reinterpret_cast<LONGLONG*>(p))) - 1;
+             InterlockedIncrement64(reinterpret_cast<LONGLONG*>(p))) -
+         1;
 #elif defined(HOST_ARCH_IA32)
   return static_cast<uintptr_t>(
-      InterlockedIncrement(reinterpret_cast<LONG*>(p))) - 1;
+             InterlockedIncrement(reinterpret_cast<LONG*>(p))) -
+         1;
 #else
 #error Unsupported host architecture.
 #endif
@@ -31,10 +33,12 @@
 inline intptr_t AtomicOperations::FetchAndIncrement(intptr_t* p) {
 #if defined(HOST_ARCH_X64)
   return static_cast<intptr_t>(
-      InterlockedIncrement64(reinterpret_cast<LONGLONG*>(p))) - 1;
+             InterlockedIncrement64(reinterpret_cast<LONGLONG*>(p))) -
+         1;
 #elif defined(HOST_ARCH_IA32)
   return static_cast<intptr_t>(
-      InterlockedIncrement(reinterpret_cast<LONG*>(p))) - 1;
+             InterlockedIncrement(reinterpret_cast<LONG*>(p))) -
+         1;
 #else
 #error Unsupported host architecture.
 #endif
@@ -46,8 +50,7 @@
   InterlockedExchangeAdd64(reinterpret_cast<LONGLONG*>(p),
                            static_cast<LONGLONG>(value));
 #elif defined(HOST_ARCH_IA32)
-  InterlockedExchangeAdd(reinterpret_cast<LONG*>(p),
-                         static_cast<LONG>(value));
+  InterlockedExchangeAdd(reinterpret_cast<LONG*>(p), static_cast<LONG>(value));
 #else
 #error Unsupported host architecture.
 #endif
@@ -67,10 +70,12 @@
 inline uintptr_t AtomicOperations::FetchAndDecrement(uintptr_t* p) {
 #if defined(HOST_ARCH_X64)
   return static_cast<uintptr_t>(
-      InterlockedDecrement64(reinterpret_cast<LONGLONG*>(p))) + 1;
+             InterlockedDecrement64(reinterpret_cast<LONGLONG*>(p))) +
+         1;
 #elif defined(HOST_ARCH_IA32)
   return static_cast<uintptr_t>(
-      InterlockedDecrement(reinterpret_cast<LONG*>(p))) + 1;
+             InterlockedDecrement(reinterpret_cast<LONG*>(p))) +
+         1;
 #else
 #error Unsupported host architecture.
 #endif
@@ -80,10 +85,12 @@
 inline intptr_t AtomicOperations::FetchAndDecrement(intptr_t* p) {
 #if defined(HOST_ARCH_X64)
   return static_cast<intptr_t>(
-      InterlockedDecrement64(reinterpret_cast<LONGLONG*>(p))) + 1;
+             InterlockedDecrement64(reinterpret_cast<LONGLONG*>(p))) +
+         1;
 #elif defined(HOST_ARCH_IA32)
   return static_cast<intptr_t>(
-      InterlockedDecrement(reinterpret_cast<LONG*>(p))) + 1;
+             InterlockedDecrement(reinterpret_cast<LONG*>(p))) +
+         1;
 #else
 #error Unsupported host architecture.
 #endif
@@ -95,8 +102,7 @@
   InterlockedExchangeAdd64(reinterpret_cast<LONGLONG*>(p),
                            static_cast<LONGLONG>(-value));
 #elif defined(HOST_ARCH_IA32)
-  InterlockedExchangeAdd(reinterpret_cast<LONG*>(p),
-                         static_cast<LONG>(-value));
+  InterlockedExchangeAdd(reinterpret_cast<LONG*>(p), static_cast<LONG>(-value));
 #else
 #error Unsupported host architecture.
 #endif
@@ -108,15 +114,13 @@
                                                   uword old_value,
                                                   uword new_value) {
 #if defined(HOST_ARCH_X64)
-  return static_cast<uword>(
-      InterlockedCompareExchange64(reinterpret_cast<LONGLONG*>(ptr),
-                                   static_cast<LONGLONG>(new_value),
-                                   static_cast<LONGLONG>(old_value)));
+  return static_cast<uword>(InterlockedCompareExchange64(
+      reinterpret_cast<LONGLONG*>(ptr), static_cast<LONGLONG>(new_value),
+      static_cast<LONGLONG>(old_value)));
 #elif defined(HOST_ARCH_IA32)
-  return static_cast<uword>(
-      InterlockedCompareExchange(reinterpret_cast<LONG*>(ptr),
-                                 static_cast<LONG>(new_value),
-                                 static_cast<LONG>(old_value)));
+  return static_cast<uword>(InterlockedCompareExchange(
+      reinterpret_cast<LONG*>(ptr), static_cast<LONG>(new_value),
+      static_cast<LONG>(old_value)));
 #else
 #error Unsupported host architecture.
 #endif
@@ -125,10 +129,9 @@
                                                        uint32_t old_value,
                                                        uint32_t new_value) {
 #if (defined(HOST_ARCH_X64) || defined(HOST_ARCH_IA32))
-  return static_cast<uint32_t>(
-      InterlockedCompareExchange(reinterpret_cast<LONG*>(ptr),
-                                 static_cast<LONG>(new_value),
-                                 static_cast<LONG>(old_value)));
+  return static_cast<uint32_t>(InterlockedCompareExchange(
+      reinterpret_cast<LONG*>(ptr), static_cast<LONG>(new_value),
+      static_cast<LONG>(old_value)));
 #else
 #error Unsupported host architecture.
 #endif
diff --git a/runtime/vm/base_isolate.h b/runtime/vm/base_isolate.h
index bd76b90..5449880 100644
--- a/runtime/vm/base_isolate.h
+++ b/runtime/vm/base_isolate.h
@@ -31,9 +31,7 @@
 #endif
 
  protected:
-  BaseIsolate()
-      : mutator_thread_(NULL) {
-  }
+  BaseIsolate() : mutator_thread_(NULL) {}
 
   ~BaseIsolate() {
     // Do not delete stack resources: top_resource_ and current_zone_.
diff --git a/runtime/vm/become.cc b/runtime/vm/become.cc
index 5424805..0fddef2 100644
--- a/runtime/vm/become.cc
+++ b/runtime/vm/become.cc
@@ -62,8 +62,8 @@
   const intptr_t size_before = before_obj->Size();
 
   uword corpse_addr = reinterpret_cast<uword>(before_obj) - kHeapObjectTag;
-  ForwardingCorpse* forwarder = ForwardingCorpse::AsForwarder(corpse_addr,
-                                                              size_before);
+  ForwardingCorpse* forwarder =
+      ForwardingCorpse::AsForwarder(corpse_addr, size_before);
   forwarder->set_target(after_obj);
   if (!IsForwardingObject(before_obj)) {
     FATAL("become: ForwardObjectTo failure.");
@@ -79,7 +79,7 @@
 class ForwardPointersVisitor : public ObjectPointerVisitor {
  public:
   explicit ForwardPointersVisitor(Isolate* isolate)
-      : ObjectPointerVisitor(isolate), visiting_object_(NULL), count_(0) { }
+      : ObjectPointerVisitor(isolate), visiting_object_(NULL), count_(0) {}
 
   virtual void VisitPointers(RawObject** first, RawObject** last) {
     for (RawObject** p = first; p <= last; p++) {
@@ -111,7 +111,7 @@
 class ForwardHeapPointersVisitor : public ObjectVisitor {
  public:
   explicit ForwardHeapPointersVisitor(ForwardPointersVisitor* pointer_visitor)
-      : pointer_visitor_(pointer_visitor) { }
+      : pointer_visitor_(pointer_visitor) {}
 
   virtual void VisitObject(RawObject* obj) {
     pointer_visitor_->VisitingObject(obj);
@@ -128,7 +128,7 @@
 class ForwardHeapPointersHandleVisitor : public HandleVisitor {
  public:
   ForwardHeapPointersHandleVisitor()
-      : HandleVisitor(Thread::Current()), count_(0) { }
+      : HandleVisitor(Thread::Current()), count_(0) {}
 
   virtual void VisitHandle(uword addr) {
     FinalizablePersistentHandle* handle =
@@ -173,8 +173,8 @@
 #else
 class WritableCodeLiteralsScope : public ValueObject {
  public:
-  explicit WritableCodeLiteralsScope(Heap* heap) { }
-  ~WritableCodeLiteralsScope() { }
+  explicit WritableCodeLiteralsScope(Heap* heap) {}
+  ~WritableCodeLiteralsScope() {}
 };
 #endif
 
@@ -291,7 +291,7 @@
 
 #if !defined(PRODUCT)
     tds.SetNumArguments(2);
-    tds.FormatArgument(0, "Remapped objects", "%" Pd,  before.Length());
+    tds.FormatArgument(0, "Remapped objects", "%" Pd, before.Length());
     tds.FormatArgument(1, "Remapped references", "%" Pd,
                        pointer_visitor.count() + handle_visitor.count());
 #endif
diff --git a/runtime/vm/become.h b/runtime/vm/become.h
index 0bee126..1784d22 100644
--- a/runtime/vm/become.h
+++ b/runtime/vm/become.h
@@ -22,12 +22,8 @@
 // representation as a FreeListElement.
 class ForwardingCorpse {
  public:
-  RawObject* target() const {
-    return target_;
-  }
-  void set_target(RawObject* target) {
-    target_ = target;
-  }
+  RawObject* target() const { return target_; }
+  void set_target(RawObject* target) { target_ = target; }
 
   intptr_t Size() {
     intptr_t size = RawObject::SizeTag::decode(tags_);
@@ -42,7 +38,7 @@
   // Used to allocate class for forwarding corpses in Object::InitOnce.
   class FakeInstance {
    public:
-    FakeInstance() { }
+    FakeInstance() {}
     static cpp_vtable vtable() { return 0; }
     static intptr_t InstanceSize() { return 0; }
     static intptr_t NextFieldOffset() { return -kWordSize; }
diff --git a/runtime/vm/benchmark_test.cc b/runtime/vm/benchmark_test.cc
index 0dcfa2b..db3bfc4 100644
--- a/runtime/vm/benchmark_test.cc
+++ b/runtime/vm/benchmark_test.cc
@@ -32,20 +32,14 @@
 static char* ComputeDart2JSPath(const char* arg) {
   char buffer[2048];
   char* dart2js_path = strdup(File::GetCanonicalPath(arg));
-  const char* compiler_path =
-      "%s%spkg%scompiler%slib%scompiler.dart";
+  const char* compiler_path = "%s%spkg%scompiler%slib%scompiler.dart";
   const char* path_separator = File::PathSeparator();
   ASSERT(path_separator != NULL && strlen(path_separator) == 1);
   char* ptr = strrchr(dart2js_path, *path_separator);
   while (ptr != NULL) {
     *ptr = '\0';
-    OS::SNPrint(buffer, 2048, compiler_path,
-                dart2js_path,
-                path_separator,
-                path_separator,
-                path_separator,
-                path_separator,
-                path_separator);
+    OS::SNPrint(buffer, 2048, compiler_path, dart2js_path, path_separator,
+                path_separator, path_separator, path_separator, path_separator);
     if (File::Exists(buffer)) {
       break;
     }
@@ -59,8 +53,7 @@
 }
 
 
-static void func(Dart_NativeArguments args) {
-}
+static void func(Dart_NativeArguments args) {}
 
 
 static Dart_NativeFunction NativeResolver(Dart_Handle name,
@@ -85,8 +78,8 @@
       strdup(File::GetCanonicalPath(Benchmark::Executable()));
   const char* packages_path = "%s%s..%spackages";
   const char* path_separator = File::PathSeparator();
-  OS::SNPrint(buffer, 2048, packages_path,
-              executable_path, path_separator, path_separator);
+  OS::SNPrint(buffer, 2048, packages_path, executable_path, path_separator,
+              path_separator);
   result = bin::DartUtils::SetupPackageRoot(buffer, NULL);
   DART_CHECK_VALID(result);
 }
@@ -163,11 +156,10 @@
   char* script = NULL;
   if (dart_root != NULL) {
     HANDLESCOPE(thread);
-    script = OS::SCreate(NULL,
-        "import '%s/pkg/compiler/lib/compiler.dart';", dart_root);
+    script = OS::SCreate(NULL, "import '%s/pkg/compiler/lib/compiler.dart';",
+                         dart_root);
     Dart_Handle lib = TestCase::LoadTestScript(
-        script,
-        reinterpret_cast<Dart_NativeEntryResolver>(NativeResolver));
+        script, reinterpret_cast<Dart_NativeEntryResolver>(NativeResolver));
     EXPECT_VALID(lib);
   } else {
     Dart_Handle lib = TestCase::LoadTestScript(
@@ -301,14 +293,12 @@
       "}\n";
 
   Dart_Handle lib = TestCase::LoadTestScript(
-      kScriptChars,
-      reinterpret_cast<Dart_NativeEntryResolver>(bm_uda_lookup),
-      USER_TEST_URI,
-      false);
+      kScriptChars, reinterpret_cast<Dart_NativeEntryResolver>(bm_uda_lookup),
+      USER_TEST_URI, false);
 
   // Create a native wrapper class with native fields.
-  Dart_Handle result = Dart_CreateNativeWrapperClass(
-      lib, NewString("NativeFieldsWrapper"), 1);
+  Dart_Handle result =
+      Dart_CreateNativeWrapperClass(lib, NewString("NativeFieldsWrapper"), 1);
   EXPECT_VALID(result);
   result = Dart_FinalizeLoading(false);
   EXPECT_VALID(result);
@@ -338,7 +328,7 @@
   Dart_EnterScope();
 
   // Create strings.
-  uint8_t data8[] = { 'o', 'n', 'e', 0xFF };
+  uint8_t data8[] = {'o', 'n', 'e', 0xFF};
   int external_peer_data = 123;
   intptr_t char_size;
   intptr_t str_len;
@@ -353,9 +343,7 @@
     EXPECT_VALID(external_string);
     EXPECT(Dart_IsExternalString(external_string));
     void* external_peer = NULL;
-    EXPECT_VALID(Dart_StringGetProperties(external_string,
-                                          &char_size,
-                                          &str_len,
+    EXPECT_VALID(Dart_StringGetProperties(external_string, &char_size, &str_len,
                                           &external_peer));
     EXPECT_EQ(1, char_size);
     EXPECT_EQ(4, str_len);
@@ -377,11 +365,10 @@
   char* script = NULL;
   if (dart_root != NULL) {
     HANDLESCOPE(thread);
-    script = OS::SCreate(NULL,
-        "import '%s/pkg/compiler/lib/compiler.dart';", dart_root);
+    script = OS::SCreate(NULL, "import '%s/pkg/compiler/lib/compiler.dart';",
+                         dart_root);
     Dart_Handle lib = TestCase::LoadTestScript(
-        script,
-        reinterpret_cast<Dart_NativeEntryResolver>(NativeResolver));
+        script, reinterpret_cast<Dart_NativeEntryResolver>(NativeResolver));
     EXPECT_VALID(lib);
   } else {
     Dart_Handle lib = TestCase::LoadTestScript(
@@ -498,8 +485,9 @@
 }
 
 
-static uint8_t* malloc_allocator(
-    uint8_t* ptr, intptr_t old_size, intptr_t new_size) {
+static uint8_t* malloc_allocator(uint8_t* ptr,
+                                 intptr_t old_size,
+                                 intptr_t new_size) {
   return reinterpret_cast<uint8_t*>(realloc(ptr, new_size));
 }
 
@@ -525,10 +513,8 @@
   Api::CheckAndFinalizePendingClasses(thread);
 
   // Write snapshot with object content.
-  FullSnapshotWriter writer(Snapshot::kCore,
-                            &vm_isolate_snapshot_buffer,
-                            &isolate_snapshot_buffer,
-                            &malloc_allocator,
+  FullSnapshotWriter writer(Snapshot::kCore, &vm_isolate_snapshot_buffer,
+                            &isolate_snapshot_buffer, &malloc_allocator,
                             NULL /* instructions_writer */);
   writer.WriteFullSnapshot();
   const Snapshot* snapshot = Snapshot::SetupFromBuffer(isolate_snapshot_buffer);
@@ -561,10 +547,8 @@
   Api::CheckAndFinalizePendingClasses(thread);
 
   // Write snapshot with object content.
-  FullSnapshotWriter writer(Snapshot::kCore,
-                            &vm_isolate_snapshot_buffer,
-                            &isolate_snapshot_buffer,
-                            &malloc_allocator,
+  FullSnapshotWriter writer(Snapshot::kCore, &vm_isolate_snapshot_buffer,
+                            &isolate_snapshot_buffer, &malloc_allocator,
                             NULL /* instructions_writer */);
   writer.WriteFullSnapshot();
   const Snapshot* snapshot = Snapshot::SetupFromBuffer(isolate_snapshot_buffer);
@@ -613,8 +597,9 @@
 
 
 static uint8_t message_buffer[64];
-static uint8_t* message_allocator(
-    uint8_t* ptr, intptr_t old_size, intptr_t new_size) {
+static uint8_t* message_allocator(uint8_t* ptr,
+                                  intptr_t old_size,
+                                  intptr_t new_size) {
   return message_buffer;
 }
 
@@ -632,9 +617,7 @@
     intptr_t buffer_len = writer.BytesWritten();
 
     // Read object back from the snapshot.
-    MessageSnapshotReader reader(buffer,
-                                 buffer_len,
-                                 thread);
+    MessageSnapshotReader reader(buffer, buffer_len, thread);
     reader.ReadObject();
   }
   timer.Stop();
@@ -656,9 +639,7 @@
     intptr_t buffer_len = writer.BytesWritten();
 
     // Read object back from the snapshot.
-    MessageSnapshotReader reader(buffer,
-                                 buffer_len,
-                                 thread);
+    MessageSnapshotReader reader(buffer, buffer_len, thread);
     reader.ReadObject();
   }
   timer.Stop();
@@ -683,9 +664,7 @@
     intptr_t buffer_len = writer.BytesWritten();
 
     // Read object back from the snapshot.
-    MessageSnapshotReader reader(buffer,
-                                 buffer_len,
-                                 thread);
+    MessageSnapshotReader reader(buffer, buffer_len, thread);
     reader.ReadObject();
     free(buffer);
   }
@@ -719,9 +698,7 @@
     intptr_t buffer_len = writer.BytesWritten();
 
     // Read object back from the snapshot.
-    MessageSnapshotReader reader(buffer,
-                                 buffer_len,
-                                 thread);
+    MessageSnapshotReader reader(buffer, buffer_len, thread);
     reader.ReadObject();
     free(buffer);
   }
diff --git a/runtime/vm/benchmark_test.h b/runtime/vm/benchmark_test.h
index db0c1f6..b51c64c 100644
--- a/runtime/vm/benchmark_test.h
+++ b/runtime/vm/benchmark_test.h
@@ -34,7 +34,8 @@
 #define BENCHMARK_HELPER(name, kind)                                           \
   void Dart_Benchmark##name(Benchmark* benchmark);                             \
   static Benchmark kRegister##name(Dart_Benchmark##name, #name, kind);         \
-  static void Dart_BenchmarkHelper##name(Benchmark* benchmark, Thread* thread);\
+  static void Dart_BenchmarkHelper##name(Benchmark* benchmark,                 \
+                                         Thread* thread);                      \
   void Dart_Benchmark##name(Benchmark* benchmark) {                            \
     FLAG_old_gen_growth_space_ratio = 100;                                     \
     BenchmarkIsolateScope __isolate__(benchmark);                              \
@@ -57,15 +58,15 @@
 
 class Benchmark {
  public:
-  typedef void (RunEntry)(Benchmark* benchmark);
+  typedef void(RunEntry)(Benchmark* benchmark);
 
-  Benchmark(RunEntry* run, const char* name, const char* score_kind) :
-      run_(run),
-      name_(name),
-      score_kind_(score_kind),
-      score_(0),
-      isolate_(NULL),
-      next_(NULL) {
+  Benchmark(RunEntry* run, const char* name, const char* score_kind)
+      : run_(run),
+        name_(name),
+        score_kind_(score_kind),
+        score_(0),
+        isolate_(NULL),
+        next_(NULL) {
     if (first_ == NULL) {
       first_ = this;
     } else {
diff --git a/runtime/vm/bigint_test.cc b/runtime/vm/bigint_test.cc
index 21ba79b..22300f4 100644
--- a/runtime/vm/bigint_test.cc
+++ b/runtime/vm/bigint_test.cc
@@ -153,8 +153,7 @@
   EXPECT_EQ(4.1909428413307135e+24, bigint.AsDoubleValue());
 
   // Reduced precision.
-  bigint = Bigint::NewFromCString(
-      "9876543210987654321098765432109876543210");
+  bigint = Bigint::NewFromCString("9876543210987654321098765432109876543210");
   EXPECT_EQ(9.8765432109876546e+39, bigint.AsDoubleValue());
 
   bigint = Bigint::NewFromCString(
@@ -169,7 +168,7 @@
       "12345678901234567890123456789012345678901234567890"
       "12345678901234567890123456789012345678901234567890");
   double zero = 0.0;
-  EXPECT_EQ(1.0/zero, bigint.AsDoubleValue());
+  EXPECT_EQ(1.0 / zero, bigint.AsDoubleValue());
 
   bigint = Bigint::NewFromCString(
       "17976931348623157081452742373170435679807056752584"
@@ -189,7 +188,7 @@
       "29520850057688381506823424628814739131105408272371"
       "63350510684586298239947245938479716304835356329624"
       "224137216");
-  EXPECT_EQ(1.0/zero, bigint.AsDoubleValue());
+  EXPECT_EQ(1.0 / zero, bigint.AsDoubleValue());
 
   bigint = Bigint::NewFromCString(
       "17976931348623158079372897140530341507993413271003"
@@ -199,7 +198,7 @@
       "57302700698555713669596228429148198608349364752927"
       "19074168444365510704342711559699508093042880177904"
       "174497792");
-  EXPECT_EQ(1.0/zero, bigint.AsDoubleValue());
+  EXPECT_EQ(1.0 / zero, bigint.AsDoubleValue());
 
   bigint = Bigint::NewFromCString(
       "17976931348623158079372897140530341507993413271003"
@@ -218,12 +217,12 @@
   EXPECT_EQ(1.0000000000000001e+23, bigint.AsDoubleValue());
 
   // Same but shifted 64 bits to the left.
-  bigint = Bigint::NewFromCString(
-      "1844674407370955161600000000000000000000000");
+  bigint =
+      Bigint::NewFromCString("1844674407370955161600000000000000000000000");
   EXPECT_EQ(1.844674407370955e+42, bigint.AsDoubleValue());
 
-  bigint = Bigint::NewFromCString(
-      "1844674407370955161600000000000000000000001");
+  bigint =
+      Bigint::NewFromCString("1844674407370955161600000000000000000000001");
   EXPECT_EQ(1.8446744073709553e+42, bigint.AsDoubleValue());
 }
 
@@ -327,22 +326,22 @@
   }
 
   {
-    const Bigint& bigint = Bigint::Handle(
-        Bigint::NewFromCString("0x000000123"));
+    const Bigint& bigint =
+        Bigint::Handle(Bigint::NewFromCString("0x000000123"));
     const char* str = bigint.ToHexCString(zone);
     EXPECT_STREQ("0x123", str);
   }
 
   {
-    const Bigint& bigint = Bigint::Handle(
-        Bigint::NewFromCString("0x0000aBcEf"));
+    const Bigint& bigint =
+        Bigint::Handle(Bigint::NewFromCString("0x0000aBcEf"));
     const char* str = bigint.ToHexCString(zone);
     EXPECT_STREQ("0xABCEF", str);
   }
 
   {
     const char* in = "0x00000000000000000000000000000000000000000000123456789";
-    const char* out =                                            "0x123456789";
+    const char* out = "0x123456789";
     const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
     const char* str = bigint.ToHexCString(zone);
     EXPECT_STREQ(out, str);
@@ -350,36 +349,36 @@
 
   {
     const char* in = "0x00000123456789ABCDEF01234567890ABCDEF0123456789ABCDEF0";
-    const char* out =     "0x123456789ABCDEF01234567890ABCDEF0123456789ABCDEF0";
+    const char* out = "0x123456789ABCDEF01234567890ABCDEF0123456789ABCDEF0";
     const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
     const char* str = bigint.ToHexCString(zone);
     EXPECT_STREQ(out, str);
   }
 
   {
-    const Bigint& bigint = Bigint::Handle(
-        Bigint::NewFromCString("-0x00000123"));
+    const Bigint& bigint =
+        Bigint::Handle(Bigint::NewFromCString("-0x00000123"));
     EXPECT(bigint.FitsIntoSmi());
     EXPECT_EQ(-0x123, bigint.AsInt64Value());
   }
 
   {
-    const Bigint& bigint = Bigint::Handle(
-        Bigint::NewFromCString("-0x00000123"));
+    const Bigint& bigint =
+        Bigint::Handle(Bigint::NewFromCString("-0x00000123"));
     const char* str = bigint.ToHexCString(zone);
     EXPECT_STREQ("-0x123", str);
   }
 
   {
-    const Bigint& bigint = Bigint::Handle(
-        Bigint::NewFromCString("-0x000aBcEf"));
+    const Bigint& bigint =
+        Bigint::Handle(Bigint::NewFromCString("-0x000aBcEf"));
     const char* str = bigint.ToHexCString(zone);
     EXPECT_STREQ("-0xABCEF", str);
   }
 
   {
     const char* in = "-0x00000000000000000000000000000000000000000000123456789";
-    const char* out =                                            "-0x123456789";
+    const char* out = "-0x123456789";
     const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
     const char* str = bigint.ToHexCString(zone);
     EXPECT_STREQ(out, str);
@@ -387,7 +386,7 @@
 
   {
     const char* in = "-0x0000123456789ABCDEF01234567890ABCDEF0123456789ABCDEF0";
-    const char* out =    "-0x123456789ABCDEF01234567890ABCDEF0123456789ABCDEF0";
+    const char* out = "-0x123456789ABCDEF01234567890ABCDEF0123456789ABCDEF0";
     const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
     const char* str = bigint.ToHexCString(zone);
     EXPECT_STREQ(out, str);
@@ -395,8 +394,7 @@
   {
     const char* test = "12345678901234567890";
     const char* out = "0xAB54A98CEB1F0AD2";
-    const Bigint& bigint = Bigint::Handle(
-        Bigint::NewFromCString(test));
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(test));
     const char* str = bigint.ToHexCString(zone);
     EXPECT_STREQ(out, str);
   }
@@ -456,7 +454,7 @@
     const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
     const char* str = bigint.ToDecCString(zone);
     EXPECT_STREQ("7141946863373290020600059860922167424469804758405880798960",
-        str);
+                 str);
   }
 
   {
@@ -489,7 +487,7 @@
     const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
     const char* str = bigint.ToDecCString(zone);
     EXPECT_STREQ("-7141946863373290020600059860922167424469804758405880798960",
-        str);
+                 str);
   }
 
   {
@@ -499,8 +497,8 @@
   }
 
   {
-    const Bigint& bigint = Bigint::Handle(
-        Bigint::NewFromCString("0x000000123"));
+    const Bigint& bigint =
+        Bigint::Handle(Bigint::NewFromCString("0x000000123"));
     const char* str = bigint.ToDecCString(zone);
     EXPECT_STREQ("291", str);
   }
@@ -643,8 +641,8 @@
   }
 
   {
-    const Bigint& bigint = Bigint::Handle(
-        Bigint::NewFromCString("-1311768467463790320"));
+    const Bigint& bigint =
+        Bigint::Handle(Bigint::NewFromCString("-1311768467463790320"));
     const char* str = bigint.ToHexCString(zone);
     EXPECT_STREQ("-0x123456789ABCDEF0", str);
   }
diff --git a/runtime/vm/bit_set.h b/runtime/vm/bit_set.h
index 2735a72..4e716c1 100644
--- a/runtime/vm/bit_set.h
+++ b/runtime/vm/bit_set.h
@@ -12,12 +12,10 @@
 
 // Just like its namesake in the STL, a BitSet object contains a fixed
 // length sequence of bits.
-template<intptr_t N>
+template <intptr_t N>
 class BitSet {
  public:
-  BitSet() {
-    Reset();
-  }
+  BitSet() { Reset(); }
 
   void Set(intptr_t i, bool value) {
     ASSERT(i >= 0);
@@ -85,13 +83,9 @@
     }
   }
 
-  void Reset() {
-    memset(data_, 0, sizeof(data_));
-  }
+  void Reset() { memset(data_, 0, sizeof(data_)); }
 
-  intptr_t Size() const {
-    return N;
-  }
+  intptr_t Size() const { return N; }
 
  private:
   static const int kLengthInWords = 1 + ((N - 1) / kBitsPerWord);
diff --git a/runtime/vm/bit_set_test.cc b/runtime/vm/bit_set_test.cc
index 426ed4f5..432d086 100644
--- a/runtime/vm/bit_set_test.cc
+++ b/runtime/vm/bit_set_test.cc
@@ -8,7 +8,7 @@
 
 namespace dart {
 
-template<intptr_t Size>
+template <intptr_t Size>
 void TestBitSet() {
   BitSet<Size> set;
   EXPECT_EQ(-1, set.Last());
diff --git a/runtime/vm/bit_vector.h b/runtime/vm/bit_vector.h
index e1c133a..b04c6ec 100644
--- a/runtime/vm/bit_vector.h
+++ b/runtime/vm/bit_vector.h
@@ -25,7 +25,7 @@
       ASSERT(target->data_length_ > 0);
       Advance();
     }
-    ~Iterator() { }
+    ~Iterator() {}
 
     bool Done() const { return word_index_ >= target_->data_length_; }
     void Advance();
diff --git a/runtime/vm/bit_vector_test.cc b/runtime/vm/bit_vector_test.cc
index d2b7d1a..bcf0c91 100644
--- a/runtime/vm/bit_vector_test.cc
+++ b/runtime/vm/bit_vector_test.cc
@@ -11,11 +11,13 @@
 #define Z (thread->zone())
 
 TEST_CASE(BitVector) {
-  { BitVector* v = new BitVector(Z, 15);
+  {
+    BitVector* v = new BitVector(Z, 15);
     v->Add(1);
     EXPECT_EQ(true, v->Contains(1));
     EXPECT_EQ(false, v->Contains(0));
-    { BitVector::Iterator iter(v);
+    {
+      BitVector::Iterator iter(v);
       EXPECT_EQ(1, iter.Current());
       iter.Advance();
       EXPECT(iter.Done());
@@ -24,7 +26,8 @@
     v->Add(1);
     EXPECT_EQ(true, v->Contains(0));
     EXPECT_EQ(true, v->Contains(1));
-    { BitVector::Iterator iter(v);
+    {
+      BitVector::Iterator iter(v);
       EXPECT_EQ(0, iter.Current());
       iter.Advance();
       EXPECT_EQ(1, iter.Current());
@@ -33,7 +36,8 @@
     }
   }
 
-  { BitVector* v = new BitVector(Z, 128);
+  {
+    BitVector* v = new BitVector(Z, 128);
     v->Add(49);
     v->Add(62);
     v->Add(63);
@@ -55,7 +59,8 @@
     EXPECT(iter.Done());
   }
 
-  { BitVector* a = new BitVector(Z, 128);
+  {
+    BitVector* a = new BitVector(Z, 128);
     BitVector* b = new BitVector(Z, 128);
     BitVector* c = new BitVector(Z, 128);
     b->Add(0);
@@ -86,7 +91,8 @@
     EXPECT_EQ(false, a->Contains(96));
   }
 
-  { BitVector* a = new BitVector(Z, 34);
+  {
+    BitVector* a = new BitVector(Z, 34);
     BitVector* b = new BitVector(Z, 34);
     a->SetAll();
     b->Add(0);
@@ -97,7 +103,8 @@
     EXPECT_EQ(true, a->Equals(*b));
   }
 
-  { BitVector* a = new BitVector(Z, 2);
+  {
+    BitVector* a = new BitVector(Z, 2);
     BitVector* b = new BitVector(Z, 2);
     a->SetAll();
     a->Remove(0);
@@ -105,7 +112,8 @@
     EXPECT_EQ(true, a->Equals(*b));
   }
 
-  { BitVector* a = new BitVector(Z, 128);
+  {
+    BitVector* a = new BitVector(Z, 128);
     BitVector* b = new BitVector(Z, 128);
     b->Add(0);
     b->Add(32);
diff --git a/runtime/vm/bitfield.h b/runtime/vm/bitfield.h
index eba83fee..e17ffcf 100644
--- a/runtime/vm/bitfield.h
+++ b/runtime/vm/bitfield.h
@@ -11,7 +11,7 @@
 
 // BitField is a template for encoding and decoding a value of type T
 // inside a storage of type S.
-template<typename S, typename T, int position, int size>
+template <typename S, typename T, int position, int size>
 class BitField {
  public:
   static const intptr_t kNextBit = position + size;
@@ -22,26 +22,18 @@
   }
 
   // Returns a S mask of the bit field.
-  static S mask() {
-    return (kUwordOne << size) - 1;
-  }
+  static S mask() { return (kUwordOne << size) - 1; }
 
   // Returns a S mask of the bit field which can be applied directly to
   // to the raw unshifted bits.
-  static S mask_in_place() {
-    return ((kUwordOne << size) - 1) << position;
-  }
+  static S mask_in_place() { return ((kUwordOne << size) - 1) << position; }
 
   // Returns the shift count needed to right-shift the bit field to
   // the least-significant bits.
-  static int shift() {
-    return position;
-  }
+  static int shift() { return position; }
 
   // Returns the size of the bit field.
-  static int bitsize() {
-    return size;
-  }
+  static int bitsize() { return size; }
 
   // Returns an S with the bit field value encoded.
   static S encode(T value) {
@@ -60,8 +52,7 @@
   // will be changed.
   static S update(T value, S original) {
     ASSERT(is_valid(value));
-    return (static_cast<S>(value) << position) |
-        (~mask_in_place() & original);
+    return (static_cast<S>(value) << position) | (~mask_in_place() & original);
   }
 };
 
diff --git a/runtime/vm/bitmap.cc b/runtime/vm/bitmap.cc
index ae091ae..f4d35b4 100644
--- a/runtime/vm/bitmap.cc
+++ b/runtime/vm/bitmap.cc
@@ -54,8 +54,7 @@
       data_size_in_bytes_ =
           Utils::RoundUp(byte_offset + 1, kIncrementSizeInBytes);
       ASSERT(data_size_in_bytes_ > 0);
-      data_ = Thread::Current()->zone()->Alloc<uint8_t>(
-          data_size_in_bytes_);
+      data_ = Thread::Current()->zone()->Alloc<uint8_t>(data_size_in_bytes_);
       ASSERT(data_ != NULL);
       memmove(data_, old_data, old_size);
       memset(&data_[old_size], 0, (data_size_in_bytes_ - old_size));
@@ -98,8 +97,10 @@
 
 void BitmapBuilder::SetBit(intptr_t bit_offset, bool value) {
   if (!InRange(bit_offset)) {
-    FATAL1("Fatal error in BitmapBuilder::SetBit :"
-           " invalid bit_offset, %" Pd "\n", bit_offset);
+    FATAL1(
+        "Fatal error in BitmapBuilder::SetBit :"
+        " invalid bit_offset, %" Pd "\n",
+        bit_offset);
   }
   intptr_t byte_offset = bit_offset >> kBitsPerByteLog2;
   ASSERT(byte_offset < data_size_in_bytes_);
diff --git a/runtime/vm/bitmap.h b/runtime/vm/bitmap.h
index 20c1983..657bd24 100644
--- a/runtime/vm/bitmap.h
+++ b/runtime/vm/bitmap.h
@@ -24,8 +24,7 @@
   BitmapBuilder()
       : length_(0),
         data_size_in_bytes_(kInitialSizeInBytes),
-        data_(Thread::Current()->zone()->Alloc<uint8_t>(
-            kInitialSizeInBytes)) {
+        data_(Thread::Current()->zone()->Alloc<uint8_t>(kInitialSizeInBytes)) {
     memset(data_, 0, kInitialSizeInBytes);
   }
 
@@ -55,8 +54,10 @@
 
   bool InRange(intptr_t offset) const {
     if (offset < 0) {
-      FATAL1("Fatal error in BitmapBuilder::InRange :"
-             " invalid bit_offset, %" Pd "\n", offset);
+      FATAL1(
+          "Fatal error in BitmapBuilder::InRange :"
+          " invalid bit_offset, %" Pd "\n",
+          offset);
     }
     return (offset < length_);
   }
diff --git a/runtime/vm/block_scheduler.cc b/runtime/vm/block_scheduler.cc
index d792551..7411fcc 100644
--- a/runtime/vm/block_scheduler.cc
+++ b/runtime/vm/block_scheduler.cc
@@ -40,8 +40,7 @@
   } else {
     GotoInstr* jump = block->last_instruction()->AsGoto();
     if (jump != NULL) {
-      intptr_t count =
-          GetEdgeCount(edge_counters, block->preorder_number());
+      intptr_t count = GetEdgeCount(edge_counters, block->preorder_number());
       if ((count >= 0) && (entry_count != 0)) {
         double weight =
             static_cast<double>(count) / static_cast<double>(entry_count);
@@ -57,12 +56,13 @@
     return;
   }
 
-  const Array& ic_data_array = Array::Handle(flow_graph()->zone(),
-      flow_graph()->parsed_function().function().ic_data_array());
+  const Array& ic_data_array =
+      Array::Handle(flow_graph()->zone(),
+                    flow_graph()->parsed_function().function().ic_data_array());
   if (Compiler::IsBackgroundCompilation() && ic_data_array.IsNull()) {
     // Deferred loading cleared ic_data_array.
-    Compiler::AbortBackgroundCompilation(Thread::kNoDeoptId,
-        "BlockScheduler: ICData array cleared");
+    Compiler::AbortBackgroundCompilation(
+        Thread::kNoDeoptId, "BlockScheduler: ICData array cleared");
   }
   if (ic_data_array.IsNull()) {
     ASSERT(Isolate::Current()->HasAttemptedReload());
@@ -77,8 +77,7 @@
   flow_graph()->graph_entry()->set_entry_count(entry_count);
 
   for (BlockIterator it = flow_graph()->reverse_postorder_iterator();
-       !it.Done();
-       it.Advance()) {
+       !it.Done(); it.Advance()) {
     BlockEntryInstr* block = it.Current();
     Instruction* last = block->last_instruction();
     for (intptr_t i = 0; i < last->SuccessorCount(); ++i) {
@@ -92,7 +91,7 @@
 // A weighted control-flow graph edge.
 struct Edge {
   Edge(BlockEntryInstr* source, BlockEntryInstr* target, double weight)
-      : source(source), target(target), weight(weight) { }
+      : source(source), target(target), weight(weight) {}
 
   static int LowestWeightFirst(const Edge* a, const Edge* b);
 
@@ -104,7 +103,7 @@
 
 // A linked list node in a chain of blocks.
 struct Link : public ZoneAllocated {
-  Link(BlockEntryInstr* block, Link* next) : block(block), next(next) { }
+  Link(BlockEntryInstr* block, Link* next) : block(block), next(next) {}
 
   BlockEntryInstr* block;
   Link* next;
@@ -115,7 +114,7 @@
 // a length to support adding a shorter chain's links to a longer chain.
 struct Chain : public ZoneAllocated {
   explicit Chain(BlockEntryInstr* block)
-      : first(new Link(block, NULL)), last(first), length(1) { }
+      : first(new Link(block, NULL)), last(first), length(1) {}
 
   Link* first;
   Link* last;
@@ -168,8 +167,7 @@
   // shared ones).  Find(n) is simply chains[n].
   GrowableArray<Chain*> chains(block_count);
 
-  for (BlockIterator it = flow_graph()->postorder_iterator();
-       !it.Done();
+  for (BlockIterator it = flow_graph()->postorder_iterator(); !it.Done();
        it.Advance()) {
     BlockEntryInstr* block = it.Current();
     chains.Add(new Chain(block));
diff --git a/runtime/vm/block_scheduler.h b/runtime/vm/block_scheduler.h
index 94982d3..8a5cada 100644
--- a/runtime/vm/block_scheduler.h
+++ b/runtime/vm/block_scheduler.h
@@ -13,7 +13,7 @@
 
 class BlockScheduler : public ValueObject {
  public:
-  explicit BlockScheduler(FlowGraph* flow_graph) : flow_graph_(flow_graph) { }
+  explicit BlockScheduler(FlowGraph* flow_graph) : flow_graph_(flow_graph) {}
 
   FlowGraph* flow_graph() const { return flow_graph_; }
 
diff --git a/runtime/vm/boolfield.h b/runtime/vm/boolfield.h
index 6cd45ba..fe20f5b 100644
--- a/runtime/vm/boolfield.h
+++ b/runtime/vm/boolfield.h
@@ -11,7 +11,7 @@
 
 // BoolField is a template for encoding and decoding a bit inside an
 // unsigned machine word.
-template<int position>
+template <int position>
 class BoolField {
  public:
   // Returns a uword with the bool value encoded.
diff --git a/runtime/vm/bootstrap.cc b/runtime/vm/bootstrap.cc
index ed97340..d242edab 100644
--- a/runtime/vm/bootstrap.cc
+++ b/runtime/vm/bootstrap.cc
@@ -16,18 +16,14 @@
 
 namespace dart {
 
-#define INIT_LIBRARY(index, name, source, patch)                               \
-  { index,                                                                     \
-    "dart:"#name, source,                                                      \
-    "dart:"#name"-patch", patch }                                              \
 
-typedef struct {
-  ObjectStore::BootstrapLibraryId index_;
-  const char* uri_;
-  const char** source_paths_;
-  const char* patch_uri_;
-  const char** patch_paths_;
-} bootstrap_lib_props;
+struct BootstrapLibProps {
+  ObjectStore::BootstrapLibraryId index;
+  const char* uri;
+  const char** source_paths;
+  const char* patch_uri;
+  const char** patch_paths;
+};
 
 
 enum {
@@ -38,81 +34,31 @@
 };
 
 
-static bootstrap_lib_props bootstrap_libraries[] = {
-  INIT_LIBRARY(ObjectStore::kCore,
-               core,
-               Bootstrap::core_source_paths_,
-               Bootstrap::core_patch_paths_),
-  INIT_LIBRARY(ObjectStore::kAsync,
-               async,
-               Bootstrap::async_source_paths_,
-               Bootstrap::async_patch_paths_),
-  INIT_LIBRARY(ObjectStore::kConvert,
-               convert,
-               Bootstrap::convert_source_paths_,
-               Bootstrap::convert_patch_paths_),
-  INIT_LIBRARY(ObjectStore::kCollection,
-               collection,
-               Bootstrap::collection_source_paths_,
-               Bootstrap::collection_patch_paths_),
-  INIT_LIBRARY(ObjectStore::kDeveloper,
-               developer,
-               Bootstrap::developer_source_paths_,
-               Bootstrap::developer_patch_paths_),
-  INIT_LIBRARY(ObjectStore::kInternal,
-               _internal,
-               Bootstrap::_internal_source_paths_,
-               Bootstrap::_internal_patch_paths_),
-  INIT_LIBRARY(ObjectStore::kIsolate,
-               isolate,
-               Bootstrap::isolate_source_paths_,
-               Bootstrap::isolate_patch_paths_),
-  INIT_LIBRARY(ObjectStore::kMath,
-               math,
-               Bootstrap::math_source_paths_,
-               Bootstrap::math_patch_paths_),
-  INIT_LIBRARY(ObjectStore::kMirrors,
-               mirrors,
-               Bootstrap::mirrors_source_paths_,
-               Bootstrap::mirrors_patch_paths_),
-  INIT_LIBRARY(ObjectStore::kProfiler,
-               profiler,
-               Bootstrap::profiler_source_paths_,
-               NULL),
-  INIT_LIBRARY(ObjectStore::kTypedData,
-               typed_data,
-               Bootstrap::typed_data_source_paths_,
-               NULL),
-  INIT_LIBRARY(ObjectStore::kVMService,
-               _vmservice,
-               Bootstrap::_vmservice_source_paths_,
-               Bootstrap::_vmservice_patch_paths_),
-  { ObjectStore::kNone, NULL, NULL, NULL, NULL }
-};
+const char** Bootstrap::profiler_patch_paths_ = NULL;
+const char** Bootstrap::typed_data_patch_paths_ = NULL;
 
 
-static RawString* GetLibrarySource(const Library& lib,
-                                   const String& uri,
-                                   bool patch) {
-  // First check if this is a valid bootstrap library and find it's index
-  // in the 'bootstrap_libraries' table above.
-  intptr_t index;
-  const String& lib_uri = String::Handle(lib.url());
-  for (index = 0;
-       bootstrap_libraries[index].index_ != ObjectStore::kNone;
-       ++index) {
-    if (lib_uri.Equals(bootstrap_libraries[index].uri_)) {
-      break;
-    }
-  }
-  if (bootstrap_libraries[index].index_ == ObjectStore::kNone) {
-    return String::null();  // Library is not a bootstrap library.
-  }
+#define MAKE_PROPERTIES(CamelName, name)                                       \
+  {ObjectStore::k##CamelName, "dart:" #name, Bootstrap::name##_source_paths_,  \
+   "dart:" #name "-patch", Bootstrap::name##_patch_paths_},
+
+static const BootstrapLibProps bootstrap_libraries[] = {
+    FOR_EACH_BOOTSTRAP_LIBRARY(MAKE_PROPERTIES)};
+
+#undef MAKE_PROPERTIES
+
+
+static const intptr_t kBootstrapLibraryCount = ARRAY_SIZE(bootstrap_libraries);
+
+
+static RawString* GetLibrarySourceByIndex(intptr_t index,
+                                          const String& uri,
+                                          bool patch) {
+  ASSERT(index >= 0 && index < kBootstrapLibraryCount);
 
   // Try to read the source using the path specified for the uri.
-  const char** source_paths = patch ?
-      bootstrap_libraries[index].patch_paths_ :
-      bootstrap_libraries[index].source_paths_;
+  const char** source_paths = patch ? bootstrap_libraries[index].patch_paths
+                                    : bootstrap_libraries[index].source_paths;
   if (source_paths == NULL) {
     return String::null();  // No path mapping information exists for library.
   }
@@ -157,6 +103,26 @@
 }
 
 
+static RawString* GetLibrarySource(const Library& lib,
+                                   const String& uri,
+                                   bool patch) {
+  // First check if this is a valid bootstrap library and find its index in
+  // the 'bootstrap_libraries' table above.
+  intptr_t index;
+  const String& lib_uri = String::Handle(lib.url());
+  for (index = 0; index < kBootstrapLibraryCount; ++index) {
+    if (lib_uri.Equals(bootstrap_libraries[index].uri)) {
+      break;
+    }
+  }
+  if (index == kBootstrapLibraryCount) {
+    return String::null();  // The library is not a bootstrap library.
+  }
+
+  return GetLibrarySourceByIndex(index, uri, patch);
+}
+
+
 static RawError* Compile(const Library& library, const Script& script) {
   bool update_lib_status = (script.kind() == RawScript::kScriptTag ||
                             script.kind() == RawScript::kLibraryTag);
@@ -181,8 +147,8 @@
                                   const Library& lib,
                                   const String& uri) {
   Zone* zone = thread->zone();
-  const String& part_source = String::Handle(
-      zone, GetLibrarySource(lib, uri, false));
+  const String& part_source =
+      String::Handle(zone, GetLibrarySource(lib, uri, false));
   const String& lib_uri = String::Handle(zone, lib.url());
   if (part_source.IsNull()) {
     return Api::NewError("Unable to read part file '%s' of library '%s'",
@@ -240,10 +206,15 @@
 }
 
 
-static RawError* LoadPatchFiles(Zone* zone,
+static RawError* LoadPatchFiles(Thread* thread,
                                 const Library& lib,
-                                const String& patch_uri,
-                                const char** patch_files) {
+                                intptr_t index) {
+  const char** patch_files = bootstrap_libraries[index].patch_paths;
+  if (patch_files == NULL) return Error::null();
+
+  Zone* zone = thread->zone();
+  String& patch_uri = String::Handle(
+      zone, Symbols::New(thread, bootstrap_libraries[index].patch_uri));
   String& patch_file_uri = String::Handle(zone);
   String& source = String::Handle(zone);
   Script& script = Script::Handle(zone);
@@ -253,7 +224,7 @@
   strings.SetAt(1, Symbols::Slash());
   for (intptr_t j = 0; patch_files[j] != NULL; j += kPathsEntryLength) {
     patch_file_uri = String::New(patch_files[j + kPathsUriOffset]);
-    source = GetLibrarySource(lib, patch_file_uri, true);
+    source = GetLibrarySourceByIndex(index, patch_file_uri, true);
     if (source.IsNull()) {
       const String& message = String::Handle(
           String::NewFormatted("Unable to find dart patch source for %s",
@@ -273,61 +244,31 @@
 }
 
 
-RawError* Bootstrap::LoadandCompileScripts() {
-  Thread* thread = Thread::Current();
+static RawError* BootstrapFromSource(Thread* thread) {
   Isolate* isolate = thread->isolate();
   Zone* zone = thread->zone();
   String& uri = String::Handle(zone);
-  String& patch_uri = String::Handle(zone);
   String& source = String::Handle(zone);
   Script& script = Script::Handle(zone);
   Library& lib = Library::Handle(zone);
   Error& error = Error::Handle(zone);
-  Dart_LibraryTagHandler saved_tag_handler = isolate->library_tag_handler();
 
   // Set the library tag handler for the isolate to the bootstrap
   // library tag handler so that we can load all the bootstrap libraries.
+  Dart_LibraryTagHandler saved_tag_handler = isolate->library_tag_handler();
   isolate->set_library_tag_handler(BootstrapLibraryTagHandler);
 
-  HANDLESCOPE(thread);
-
-  // Create library objects for all the bootstrap libraries.
-  for (intptr_t i = 0;
-       bootstrap_libraries[i].index_ != ObjectStore::kNone;
-       ++i) {
-#ifdef PRODUCT
-    if (bootstrap_libraries[i].index_ == ObjectStore::kMirrors) {
-      continue;
-    }
-#endif  // !PRODUCT
-    uri = Symbols::New(thread, bootstrap_libraries[i].uri_);
-    lib = Library::LookupLibrary(thread, uri);
-    if (lib.IsNull()) {
-      lib = Library::NewLibraryHelper(uri, false);
-      lib.SetLoadRequested();
-      lib.Register(thread);
-    }
-    isolate->object_store()->set_bootstrap_library(
-        bootstrap_libraries[i].index_, lib);
-  }
-
   // Load, compile and patch bootstrap libraries.
-  for (intptr_t i = 0;
-       bootstrap_libraries[i].index_ != ObjectStore::kNone;
-       ++i) {
-#ifdef PRODUCT
-    if (bootstrap_libraries[i].index_ == ObjectStore::kMirrors) {
-      continue;
-    }
-#endif  // PRODUCT
-    uri = Symbols::New(thread, bootstrap_libraries[i].uri_);
-    lib = Library::LookupLibrary(thread, uri);
+  for (intptr_t i = 0; i < kBootstrapLibraryCount; ++i) {
+    ObjectStore::BootstrapLibraryId id = bootstrap_libraries[i].index;
+    uri = Symbols::New(thread, bootstrap_libraries[i].uri);
+    lib = isolate->object_store()->bootstrap_library(id);
     ASSERT(!lib.IsNull());
-    source = GetLibrarySource(lib, uri, false);
+    ASSERT(lib.raw() == Library::LookupLibrary(thread, uri));
+    source = GetLibrarySourceByIndex(i, uri, false);
     if (source.IsNull()) {
-      const String& message = String::Handle(
-          String::NewFormatted("Unable to find dart source for %s",
-                               uri.ToCString()));
+      const String& message = String::Handle(String::NewFormatted(
+          "Unable to find dart source for %s", uri.ToCString()));
       error ^= ApiError::New(message);
       break;
     }
@@ -337,26 +278,20 @@
       break;
     }
     // If a patch exists, load and patch the script.
-    if (bootstrap_libraries[i].patch_paths_ != NULL) {
-      patch_uri = Symbols::New(thread, bootstrap_libraries[i].patch_uri_);
-      error = LoadPatchFiles(zone,
-                             lib,
-                             patch_uri,
-                             bootstrap_libraries[i].patch_paths_);
-      if (!error.IsNull()) {
-        break;
-      }
+    error = LoadPatchFiles(thread, lib, i);
+    if (!error.IsNull()) {
+      break;
     }
   }
+
   if (error.IsNull()) {
-    SetupNativeResolver();
+    Bootstrap::SetupNativeResolver();
     ClassFinalizer::ProcessPendingClasses();
 
     // Eagerly compile the _Closure class as it is the class of all closure
     // instances. This allows us to just finalize function types
     // without going through the hoops of trying to compile their scope class.
-    Class& cls =
-        Class::Handle(zone, isolate->object_store()->closure_class());
+    Class& cls = Class::Handle(zone, isolate->object_store()->closure_class());
     Compiler::CompileClass(cls);
     // Eagerly compile Bool class, bool constants are used from within compiler.
     cls = isolate->object_store()->bool_class();
@@ -369,4 +304,31 @@
   return error.raw();
 }
 
+
+RawError* Bootstrap::DoBootstrapping() {
+  Thread* thread = Thread::Current();
+  Isolate* isolate = thread->isolate();
+  Zone* zone = thread->zone();
+  String& uri = String::Handle(zone);
+  Library& lib = Library::Handle(zone);
+
+  HANDLESCOPE(thread);
+
+  // Ensure there are library objects for all the bootstrap libraries.
+  for (intptr_t i = 0; i < kBootstrapLibraryCount; ++i) {
+    ObjectStore::BootstrapLibraryId id = bootstrap_libraries[i].index;
+    uri = Symbols::New(thread, bootstrap_libraries[i].uri);
+    lib = isolate->object_store()->bootstrap_library(id);
+    ASSERT(lib.raw() == Library::LookupLibrary(thread, uri));
+    if (lib.IsNull()) {
+      lib = Library::NewLibraryHelper(uri, false);
+      lib.SetLoadRequested();
+      lib.Register(thread);
+      isolate->object_store()->set_bootstrap_library(id, lib);
+    }
+  }
+
+  return BootstrapFromSource(thread);
+}
+
 }  // namespace dart
diff --git a/runtime/vm/bootstrap.h b/runtime/vm/bootstrap.h
index 7c5ab0e..0c2d912 100644
--- a/runtime/vm/bootstrap.h
+++ b/runtime/vm/bootstrap.h
@@ -15,7 +15,7 @@
 
 class Bootstrap : public AllStatic {
  public:
-  static RawError* LoadandCompileScripts();
+  static RawError* DoBootstrapping();
   static void SetupNativeResolver();
   static bool IsBootstapResolver(Dart_NativeEntryResolver resolver);
 
@@ -45,9 +45,11 @@
   static const char* isolate_patch_paths_[];
   static const char* math_patch_paths_[];
   static const char* mirrors_patch_paths_[];
-  static const char* profiler_patch_paths_[];
-  static const char* typed_data_patch_paths_[];
   static const char* _vmservice_patch_paths_[];
+
+  // NULL patch paths for libraries that do not have patch files.
+  static const char** profiler_patch_paths_;
+  static const char** typed_data_patch_paths_;
 };
 
 }  // namespace dart
diff --git a/runtime/vm/bootstrap_natives.cc b/runtime/vm/bootstrap_natives.cc
index 7e1ea34..ef4b92f 100644
--- a/runtime/vm/bootstrap_natives.cc
+++ b/runtime/vm/bootstrap_natives.cc
@@ -16,7 +16,7 @@
 
 // Helper macros for declaring and defining native entries.
 #define REGISTER_NATIVE_ENTRY(name, count)                                     \
-  { ""#name, BootstrapNatives::DN_##name, count },
+  {"" #name, BootstrapNatives::DN_##name, count},
 
 
 // List all native functions implemented in the vm or core bootstrap dart
@@ -26,10 +26,9 @@
   const char* name_;
   Dart_NativeFunction function_;
   int argument_count_;
-} BootStrapEntries[] = {
-  BOOTSTRAP_NATIVE_LIST(REGISTER_NATIVE_ENTRY)
+} BootStrapEntries[] = {BOOTSTRAP_NATIVE_LIST(REGISTER_NATIVE_ENTRY)
 #ifndef PRODUCT
-  MIRRORS_BOOTSTRAP_NATIVE_LIST(REGISTER_NATIVE_ENTRY)
+                            MIRRORS_BOOTSTRAP_NATIVE_LIST(REGISTER_NATIVE_ENTRY)
 #endif  // !PRODUCT
 };
 
@@ -76,8 +75,7 @@
       reinterpret_cast<Dart_NativeEntryResolver>(BootstrapNatives::Lookup);
 
   Dart_NativeEntrySymbol symbol_resolver =
-      reinterpret_cast<Dart_NativeEntrySymbol>(
-          BootstrapNatives::Symbol);
+      reinterpret_cast<Dart_NativeEntrySymbol>(BootstrapNatives::Symbol);
 
   library = Library::AsyncLibrary();
   ASSERT(!library.IsNull());
@@ -119,11 +117,12 @@
   library.set_native_entry_resolver(resolver);
   library.set_native_entry_symbol_resolver(symbol_resolver);
 
-NOT_IN_PRODUCT(
+#if !defined(PRODUCT)
   library = Library::MirrorsLibrary();
   ASSERT(!library.IsNull());
   library.set_native_entry_resolver(resolver);
-  library.set_native_entry_symbol_resolver(symbol_resolver));
+  library.set_native_entry_symbol_resolver(symbol_resolver);
+#endif  // !defined(PRODUCT)
 
   library = Library::ProfilerLibrary();
   ASSERT(!library.IsNull());
diff --git a/runtime/vm/bootstrap_natives.h b/runtime/vm/bootstrap_natives.h
index cad4e67..559f44a 100644
--- a/runtime/vm/bootstrap_natives.h
+++ b/runtime/vm/bootstrap_natives.h
@@ -356,7 +356,7 @@
   V(VMService_CancelStream, 1)                                                 \
   V(VMService_RequestAssets, 0)                                                \
   V(VMService_DecodeAssets, 1)                                                 \
-  V(VMService_spawnUriNotify, 2)                                               \
+  V(VMService_spawnUriNotify, 2)
 
 // List of bootstrap native entry points used in the dart:mirror library.
 #define MIRRORS_BOOTSTRAP_NATIVE_LIST(V)                                       \
@@ -408,7 +408,7 @@
   V(ParameterMirror_type, 3)                                                   \
   V(TypedefMirror_referent, 1)                                                 \
   V(TypedefMirror_declaration, 1)                                              \
-  V(VariableMirror_type, 2)                                                    \
+  V(VariableMirror_type, 2)
 
 class BootstrapNatives : public AllStatic {
  public:
diff --git a/runtime/vm/bootstrap_nocore.cc b/runtime/vm/bootstrap_nocore.cc
index d2aa1e3..64db0eb 100644
--- a/runtime/vm/bootstrap_nocore.cc
+++ b/runtime/vm/bootstrap_nocore.cc
@@ -11,9 +11,10 @@
 namespace dart {
 
 
-RawError* Bootstrap::LoadandCompileScripts() {
+RawError* Bootstrap::DoBootstrapping() {
   UNREACHABLE();
   return Error::null();
 }
 
+
 }  // namespace dart
diff --git a/runtime/vm/branch_optimizer.cc b/runtime/vm/branch_optimizer.cc
index 567a2bf..62fdb47 100644
--- a/runtime/vm/branch_optimizer.cc
+++ b/runtime/vm/branch_optimizer.cc
@@ -18,8 +18,7 @@
   }
 
   BlockEntryInstr* block = phi->block();
-  for (Value* env_use = phi->env_use_list();
-       env_use != NULL;
+  for (Value* env_use = phi->env_use_list(); env_use != NULL;
        env_use = env_use->next_use()) {
     if ((env_use->instruction() != block) &&
         (env_use->instruction() != use->instruction())) {
@@ -55,12 +54,9 @@
   Value* right = comparison->right();
   ConstantInstr* constant =
       (right == NULL) ? NULL : right->definition()->AsConstant();
-  return (phi != NULL) &&
-      (constant != NULL) &&
-      (phi->GetBlock() == block) &&
-      PhiHasSingleUse(phi, left) &&
-      (block->next() == branch) &&
-      (block->phis()->length() == 1);
+  return (phi != NULL) && (constant != NULL) && (phi->GetBlock() == block) &&
+         PhiHasSingleUse(phi, left) && (block->next() == branch) &&
+         (block->phis()->length() == 1);
 }
 
 
@@ -70,7 +66,7 @@
   // so the former true and false targets become joins of the control flows
   // from all the duplicated branches.
   JoinEntryInstr* join =
-      new(zone) JoinEntryInstr(target->block_id(), target->try_index());
+      new (zone) JoinEntryInstr(target->block_id(), target->try_index());
   join->InheritDeoptTarget(zone, target);
   join->LinkTo(target->next());
   join->set_last_instruction(target->last_instruction());
@@ -86,7 +82,7 @@
   ComparisonInstr* comparison = branch->comparison();
   ComparisonInstr* new_comparison =
       comparison->CopyWithNewOperands(new_left, new_right);
-  BranchInstr* new_branch = new(zone) BranchInstr(new_comparison);
+  BranchInstr* new_branch = new (zone) BranchInstr(new_comparison);
   new_branch->set_is_checked(branch->is_checked());
   return new_branch;
 }
@@ -134,10 +130,8 @@
       // worklist.
       BranchInstr* branch = block->last_instruction()->AsBranch();
       ASSERT(branch != NULL);
-      JoinEntryInstr* join_true =
-          ToJoinEntry(zone, branch->true_successor());
-      JoinEntryInstr* join_false =
-          ToJoinEntry(zone, branch->false_successor());
+      JoinEntryInstr* join_true = ToJoinEntry(zone, branch->true_successor());
+      JoinEntryInstr* join_false = ToJoinEntry(zone, branch->false_successor());
 
       ComparisonInstr* comparison = branch->comparison();
       PhiInstr* phi = comparison->left()->definition()->AsPhi();
@@ -152,7 +146,7 @@
         // Replace the goto in each predecessor with a rewritten branch,
         // rewritten to use the corresponding phi input instead of the phi.
         Value* new_left = phi->InputAt(i)->Copy(zone);
-        Value* new_right = new(zone) Value(constant);
+        Value* new_right = new (zone) Value(constant);
         BranchInstr* new_branch =
             CloneBranch(zone, branch, new_left, new_right);
         if (branch->env() == NULL) {
@@ -166,8 +160,7 @@
           new_branch->comparison()->SetDeoptId(*comparison);
           // The phi can be used in the branch's environment.  Rename such
           // uses.
-          for (Environment::DeepIterator it(new_branch->env());
-               !it.Done();
+          for (Environment::DeepIterator it(new_branch->env()); !it.Done();
                it.Advance()) {
             Value* use = it.CurrentValue();
             if (use->definition() == phi) {
@@ -191,22 +184,20 @@
 
         // Connect the branch to the true and false joins, via empty target
         // blocks.
-        TargetEntryInstr* true_target =
-            new(zone) TargetEntryInstr(flow_graph->max_block_id() + 1,
-                                          block->try_index());
+        TargetEntryInstr* true_target = new (zone) TargetEntryInstr(
+            flow_graph->max_block_id() + 1, block->try_index());
         true_target->InheritDeoptTarget(zone, join_true);
-        TargetEntryInstr* false_target =
-            new(zone) TargetEntryInstr(flow_graph->max_block_id() + 2,
-                                          block->try_index());
+        TargetEntryInstr* false_target = new (zone) TargetEntryInstr(
+            flow_graph->max_block_id() + 2, block->try_index());
         false_target->InheritDeoptTarget(zone, join_false);
         flow_graph->set_max_block_id(flow_graph->max_block_id() + 2);
         *new_branch->true_successor_address() = true_target;
         *new_branch->false_successor_address() = false_target;
-        GotoInstr* goto_true = new(zone) GotoInstr(join_true);
+        GotoInstr* goto_true = new (zone) GotoInstr(join_true);
         goto_true->InheritDeoptTarget(zone, join_true);
         true_target->LinkTo(goto_true);
         true_target->set_last_instruction(goto_true);
-        GotoInstr* goto_false = new(zone) GotoInstr(join_false);
+        GotoInstr* goto_false = new (zone) GotoInstr(join_false);
         goto_false->InheritDeoptTarget(zone, join_false);
         false_target->LinkTo(goto_false);
         false_target->set_last_instruction(goto_false);
@@ -231,8 +222,9 @@
 
 static bool IsTrivialBlock(BlockEntryInstr* block, Definition* defn) {
   return (block->IsTargetEntry() && (block->PredecessorCount() == 1)) &&
-    ((block->next() == block->last_instruction()) ||
-     ((block->next() == defn) && (defn->next() == block->last_instruction())));
+         ((block->next() == block->last_instruction()) ||
+          ((block->next() == defn) &&
+           (defn->next() == block->last_instruction())));
 }
 
 
@@ -279,10 +271,8 @@
     // Ba:
     //   v3 = IfThenElse(COMP ? v1 : v2)
     //
-    if ((join != NULL) &&
-        (join->phis() != NULL) &&
-        (join->phis()->length() == 1) &&
-        (block->PredecessorCount() == 2)) {
+    if ((join != NULL) && (join->phis() != NULL) &&
+        (join->phis()->length() == 1) && (block->PredecessorCount() == 2)) {
       BlockEntryInstr* pred1 = block->PredecessorAt(0);
       BlockEntryInstr* pred2 = block->PredecessorAt(1);
 
@@ -304,17 +294,11 @@
           Value* if_true = (pred1 == branch->true_successor()) ? v1 : v2;
           Value* if_false = (pred2 == branch->true_successor()) ? v1 : v2;
 
-          ComparisonInstr* new_comparison =
-              comparison->CopyWithNewOperands(
-                  comparison->left()->Copy(zone),
-                  comparison->right()->Copy(zone));
-          IfThenElseInstr* if_then_else = new(zone) IfThenElseInstr(
-              new_comparison,
-              if_true->Copy(zone),
-              if_false->Copy(zone));
-          flow_graph->InsertBefore(branch,
-                                   if_then_else,
-                                   NULL,
+          ComparisonInstr* new_comparison = comparison->CopyWithNewOperands(
+              comparison->left()->Copy(zone), comparison->right()->Copy(zone));
+          IfThenElseInstr* if_then_else = new (zone) IfThenElseInstr(
+              new_comparison, if_true->Copy(zone), if_false->Copy(zone));
+          flow_graph->InsertBefore(branch, if_then_else, NULL,
                                    FlowGraph::kValue);
 
           phi->ReplaceUsesWith(if_then_else);
diff --git a/runtime/vm/branch_optimizer.h b/runtime/vm/branch_optimizer.h
index caef6a7..5758a7c 100644
--- a/runtime/vm/branch_optimizer.h
+++ b/runtime/vm/branch_optimizer.h
@@ -26,8 +26,7 @@
   // Replace a target entry instruction with a join entry instruction.  Does
   // not update the original target's predecessors to point to the new block
   // and does not replace the target in already computed block order lists.
-  static JoinEntryInstr* ToJoinEntry(Zone* zone,
-                                     TargetEntryInstr* target);
+  static JoinEntryInstr* ToJoinEntry(Zone* zone, TargetEntryInstr* target);
 
  private:
   // Match an instance of the pattern to rewrite.  See the implementation
diff --git a/runtime/vm/cha.cc b/runtime/vm/cha.cc
index 6a0a16d..83a2bc5 100644
--- a/runtime/vm/cha.cc
+++ b/runtime/vm/cha.cc
@@ -18,10 +18,8 @@
       return;
     }
   }
-  GuardedClassInfo info = {
-    &Class::ZoneHandle(thread_->zone(), cls.raw()),
-    subclass_count
-  };
+  GuardedClassInfo info = {&Class::ZoneHandle(thread_->zone(), cls.raw()),
+                           subclass_count};
   guarded_classes_.Add(info);
   return;
 }
@@ -62,7 +60,7 @@
 
 
 bool CHA::ConcreteSubclasses(const Class& cls,
-                             GrowableArray<intptr_t> *class_ids) {
+                             GrowableArray<intptr_t>* class_ids) {
   if (cls.InVMHeap()) return false;
   if (cls.IsObjectClass()) return false;
 
@@ -161,7 +159,7 @@
     }
 
     if (direct_subclass.LookupDynamicFunction(function_name) !=
-            Function::null()) {
+        Function::null()) {
       return true;
     }
 
diff --git a/runtime/vm/cha.h b/runtime/vm/cha.h
index 5bd7796..63072d2 100644
--- a/runtime/vm/cha.h
+++ b/runtime/vm/cha.h
@@ -13,7 +13,8 @@
 
 class Class;
 class Function;
-template <typename T> class ZoneGrowableArray;
+template <typename T>
+class ZoneGrowableArray;
 class String;
 
 class CHA : public StackResource {
@@ -38,7 +39,7 @@
   // Collect the concrete subclasses of 'cls' into 'class_ids'. Return true if
   // the result is valid (may be invalid because we don't track the subclasses
   // of classes allocated in the VM isolate or class Object).
-  bool ConcreteSubclasses(const Class& cls, GrowableArray<intptr_t> *class_ids);
+  bool ConcreteSubclasses(const Class& cls, GrowableArray<intptr_t>* class_ids);
 
   // Return true if the class is implemented by some other class.
   static bool IsImplemented(const Class& cls);
diff --git a/runtime/vm/cha_test.cc b/runtime/vm/cha_test.cc
index 107c233..873840c 100644
--- a/runtime/vm/cha_test.cc
+++ b/runtime/vm/cha_test.cc
@@ -34,20 +34,20 @@
   const Library& lib = Library::Handle(Library::LookupLibrary(thread, name));
   EXPECT(!lib.IsNull());
 
-  const Class& class_a = Class::Handle(
-      lib.LookupClass(String::Handle(Symbols::New(thread, "A"))));
+  const Class& class_a =
+      Class::Handle(lib.LookupClass(String::Handle(Symbols::New(thread, "A"))));
   EXPECT(!class_a.IsNull());
 
-  const Class& class_b = Class::Handle(
-      lib.LookupClass(String::Handle(Symbols::New(thread, "B"))));
+  const Class& class_b =
+      Class::Handle(lib.LookupClass(String::Handle(Symbols::New(thread, "B"))));
   EXPECT(!class_b.IsNull());
 
-  const Class& class_c = Class::Handle(
-      lib.LookupClass(String::Handle(Symbols::New(thread, "C"))));
+  const Class& class_c =
+      Class::Handle(lib.LookupClass(String::Handle(Symbols::New(thread, "C"))));
   EXPECT(!class_c.IsNull());
 
-  const Class& class_d = Class::Handle(
-      lib.LookupClass(String::Handle(Symbols::New(thread, "D"))));
+  const Class& class_d =
+      Class::Handle(lib.LookupClass(String::Handle(Symbols::New(thread, "D"))));
   EXPECT(!class_d.IsNull());
 
   const String& function_foo_name = String::Handle(String::New("foo"));
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index 8d9c266..98d74ff 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -78,7 +78,8 @@
 // Use array instead of set since we expect very few subclassed classes
 // to occur.
 static void CollectFinalizedSuperClasses(
-    const Class& cls_, GrowableArray<intptr_t>* finalized_super_classes) {
+    const Class& cls_,
+    GrowableArray<intptr_t>* finalized_super_classes) {
   Class& cls = Class::Handle(cls_.raw());
   AbstractType& super_type = Type::Handle();
   super_type = cls.super_type();
@@ -93,8 +94,8 @@
 }
 
 
-static void CollectImmediateSuperInterfaces(
-    const Class& cls, GrowableArray<intptr_t>* cids) {
+static void CollectImmediateSuperInterfaces(const Class& cls,
+                                            GrowableArray<intptr_t>* cids) {
   const Array& interfaces = Array::Handle(cls.interfaces());
   Class& ifc = Class::Handle();
   AbstractType& type = AbstractType::Handle();
@@ -172,8 +173,8 @@
 
 // Adds all interfaces of cls into 'collected'. Duplicate entries may occur.
 // No cycles are allowed.
-void ClassFinalizer::CollectInterfaces(
-    const Class& cls, GrowableArray<const Class*>* collected) {
+void ClassFinalizer::CollectInterfaces(const Class& cls,
+                                       GrowableArray<const Class*>* collected) {
   Zone* zone = Thread::Current()->zone();
   const Array& interface_array = Array::Handle(zone, cls.interfaces());
   AbstractType& interface = AbstractType::Handle(zone);
@@ -270,8 +271,8 @@
 
 // Resolve unresolved_class in the library of cls, or return null.
 RawClass* ClassFinalizer::ResolveClass(
-      const Class& cls,
-      const UnresolvedClass& unresolved_class) {
+    const Class& cls,
+    const UnresolvedClass& unresolved_class) {
   const String& class_name = String::Handle(unresolved_class.ident());
   Library& lib = Library::Handle();
   Class& resolved_class = Class::Handle();
@@ -289,7 +290,6 @@
 }
 
 
-
 void ClassFinalizer::ResolveRedirectingFactory(const Class& cls,
                                                const Function& factory) {
   const Function& target = Function::Handle(factory.RedirectionTarget());
@@ -354,19 +354,18 @@
   ASSERT(!type.IsTypeParameter());  // Resolved in parser.
   if (type.IsDynamicType()) {
     // Replace the type with a malformed type and compile a throw when called.
-    type = NewFinalizedMalformedType(
-        Error::Handle(),  // No previous error.
-        Script::Handle(cls.script()),
-        factory.token_pos(),
-        "factory may not redirect to 'dynamic'");
+    type = NewFinalizedMalformedType(Error::Handle(),  // No previous error.
+                                     Script::Handle(cls.script()),
+                                     factory.token_pos(),
+                                     "factory may not redirect to 'dynamic'");
     factory.SetRedirectionType(type);
     ASSERT(factory.RedirectionTarget() == Function::null());
     return;
   }
   const Class& target_class = Class::Handle(type.type_class());
   String& target_class_name = String::Handle(target_class.Name());
-  String& target_name = String::Handle(
-      String::Concat(target_class_name, Symbols::Dot()));
+  String& target_name =
+      String::Handle(String::Concat(target_class_name, Symbols::Dot()));
   const String& identifier = String::Handle(factory.RedirectionIdentifier());
   if (!identifier.IsNull()) {
     target_name = String::Concat(target_name, identifier);
@@ -383,11 +382,9 @@
     // Replace the type with a malformed type and compile a throw when called.
     type = NewFinalizedMalformedType(
         Error::Handle(),  // No previous error.
-        Script::Handle(target_class.script()),
-        factory.token_pos(),
+        Script::Handle(target_class.script()), factory.token_pos(),
         "class '%s' has no constructor or factory named '%s'",
-        target_class_name.ToCString(),
-        user_visible_target_name.ToCString());
+        target_class_name.ToCString(), user_visible_target_name.ToCString());
     factory.SetRedirectionType(type);
     ASSERT(factory.RedirectionTarget() == Function::null());
     return;
@@ -441,8 +438,8 @@
     if (!target_type.IsInstantiated()) {
       const TypeArguments& type_args = TypeArguments::Handle(type.arguments());
       Error& bound_error = Error::Handle();
-      target_type ^= target_type.InstantiateFrom(
-          type_args, &bound_error, NULL, NULL, Heap::kOld);
+      target_type ^= target_type.InstantiateFrom(type_args, &bound_error, NULL,
+                                                 NULL, Heap::kOld);
       if (bound_error.IsNull()) {
         target_type ^= FinalizeType(cls, target_type, kCanonicalize);
       } else {
@@ -484,13 +481,11 @@
     type_class = ResolveClass(cls, unresolved_class);
     if (type_class.IsNull()) {
       // The type class could not be resolved. The type is malformed.
-      FinalizeMalformedType(
-          Error::Handle(),  // No previous error.
-          Script::Handle(cls.script()),
-          type,
-          "cannot resolve class '%s' from '%s'",
-          String::Handle(unresolved_class.Name()).ToCString(),
-          String::Handle(cls.Name()).ToCString());
+      FinalizeMalformedType(Error::Handle(),  // No previous error.
+                            Script::Handle(cls.script()), type,
+                            "cannot resolve class '%s' from '%s'",
+                            String::Handle(unresolved_class.Name()).ToCString(),
+                            String::Handle(cls.Name()).ToCString());
       return;
     }
     // Replace unresolved class with resolved type class.
@@ -499,8 +494,7 @@
   // Promote the type to a function type in case its type class is a typedef.
   // Note that the type may already be a function type if it was parsed as a
   // formal parameter function type.
-  if (!type.IsFunctionType() &&
-      type_class.IsTypedefClass() &&
+  if (!type.IsFunctionType() && type_class.IsTypedefClass() &&
       !type.IsMalformedOrMalbounded()) {
     type.set_signature(Function::Handle(type_class.signature_function()));
   }
@@ -549,9 +543,8 @@
 }
 
 
-void ClassFinalizer::FinalizeTypeParameters(
-    const Class& cls,
-    PendingTypes* pending_types) {
+void ClassFinalizer::FinalizeTypeParameters(const Class& cls,
+                                            PendingTypes* pending_types) {
   if (FLAG_trace_type_finalization) {
     THR_Print("Finalizing type parameters of '%s'\n",
               String::Handle(cls.Name()).ToCString());
@@ -569,8 +562,8 @@
     const intptr_t num_types = type_parameters.Length();
     for (intptr_t i = 0; i < num_types; i++) {
       type_parameter ^= type_parameters.TypeAt(i);
-      type_parameter ^= FinalizeType(
-          cls, type_parameter, kFinalize, pending_types);
+      type_parameter ^=
+          FinalizeType(cls, type_parameter, kFinalize, pending_types);
       type_parameters.SetTypeAt(i, type_parameter);
     }
   }
@@ -593,8 +586,7 @@
   Zone* zone = Thread::Current()->zone();
   if (FLAG_trace_type_finalization) {
     THR_Print("Checking recursive type '%s': %s\n",
-              String::Handle(type.Name()).ToCString(),
-              type.ToCString());
+              String::Handle(type.Name()).ToCString(), type.ToCString());
   }
   const Class& type_cls = Class::Handle(zone, type.type_class());
   const TypeArguments& arguments =
@@ -626,19 +618,17 @@
                 String::Handle(pending_type.Name()).ToCString(),
                 pending_type.ToCString());
     }
-    if ((pending_type.raw() != type.raw()) &&
-        pending_type.IsType() &&
+    if ((pending_type.raw() != type.raw()) && pending_type.IsType() &&
         (pending_type.type_class() == type_cls.raw())) {
       pending_arguments = pending_type.arguments();
-      if (!pending_arguments.IsSubvectorEquivalent(arguments,
-                                                   first_type_param,
+      if (!pending_arguments.IsSubvectorEquivalent(arguments, first_type_param,
                                                    num_type_params) &&
           !pending_arguments.IsSubvectorInstantiated(first_type_param,
                                                      num_type_params)) {
         // Reject the non-contractive recursive type.
         const String& type_name = String::Handle(zone, type.Name());
-        ReportError(cls, type.token_pos(),
-                    "illegal recursive type '%s'", type_name.ToCString());
+        ReportError(cls, type.token_pos(), "illegal recursive type '%s'",
+                    type_name.ToCString());
       }
     }
   }
@@ -710,8 +700,7 @@
       // Copy the parsed type arguments at the correct offset in the full type
       // argument vector.
       const intptr_t offset = num_type_arguments - num_type_parameters;
-      AbstractType& type_arg =
-          AbstractType::Handle(zone, Type::DynamicType());
+      AbstractType& type_arg = AbstractType::Handle(zone, Type::DynamicType());
       // Leave the temporary type arguments at indices [0..offset[ as null.
       for (intptr_t i = 0; i < num_type_parameters; i++) {
         // If no type parameters were provided, a raw type is desired, so we
@@ -745,8 +734,8 @@
       if (offset > 0) {
         TrailPtr instantiation_trail = new Trail(zone, 4);
         Error& bound_error = Error::Handle(zone);
-        FinalizeTypeArguments(type_class, full_arguments, offset,
-                              &bound_error, pending_types, instantiation_trail);
+        FinalizeTypeArguments(type_class, full_arguments, offset, &bound_error,
+                              pending_types, instantiation_trail);
       }
       if (full_arguments.IsRaw(0, num_type_arguments)) {
         // The parameterized_type is raw. Set its argument vector to null, which
@@ -809,13 +798,12 @@
 // same time. Canonicalization happens when pending types are processed.
 // The trail is required to correctly instantiate a recursive type argument
 // of the super type.
-void ClassFinalizer::FinalizeTypeArguments(
-    const Class& cls,
-    const TypeArguments& arguments,
-    intptr_t num_uninitialized_arguments,
-    Error* bound_error,
-    PendingTypes* pending_types,
-    TrailPtr instantiation_trail) {
+void ClassFinalizer::FinalizeTypeArguments(const Class& cls,
+                                           const TypeArguments& arguments,
+                                           intptr_t num_uninitialized_arguments,
+                                           Error* bound_error,
+                                           PendingTypes* pending_types,
+                                           TrailPtr instantiation_trail) {
   ASSERT(arguments.Length() >= cls.NumTypeArguments());
   if (!cls.is_type_finalized()) {
     FinalizeTypeParameters(cls, pending_types);
@@ -829,12 +817,11 @@
     ASSERT(num_super_type_args ==
            (cls.NumTypeArguments() - cls.NumOwnTypeArguments()));
     if (!super_type.IsFinalized() && !super_type.IsBeingFinalized()) {
-      super_type ^= FinalizeType(
-          cls, super_type, kFinalize, pending_types);
+      super_type ^= FinalizeType(cls, super_type, kFinalize, pending_types);
       cls.set_super_type(super_type);
     }
-    TypeArguments& super_type_args = TypeArguments::Handle(
-        super_type.arguments());
+    TypeArguments& super_type_args =
+        TypeArguments::Handle(super_type.arguments());
     // Offset of super type's type parameters in cls' type argument vector.
     const intptr_t super_offset = num_super_type_args - num_super_type_params;
     AbstractType& super_type_arg = AbstractType::Handle(Type::DynamicType());
@@ -854,8 +841,8 @@
             super_type_args.SetTypeAt(i, super_type_arg);
           } else {
             if (!super_type_arg.IsFinalized()) {
-              super_type_arg ^= FinalizeType(
-                  cls, super_type_arg, kFinalize, pending_types);
+              super_type_arg ^=
+                  FinalizeType(cls, super_type_arg, kFinalize, pending_types);
               super_type_args.SetTypeAt(i, super_type_arg);
               // Note that super_type_arg may still not be finalized here, in
               // which case it is a TypeRef to a legal recursive type.
@@ -865,13 +852,13 @@
         // Instantiate super_type_arg with the current argument vector.
         if (!super_type_arg.IsInstantiated()) {
           if (FLAG_trace_type_finalization && super_type_arg.IsTypeRef()) {
-            AbstractType& ref_type = AbstractType::Handle(
-                TypeRef::Cast(super_type_arg).type());
-            THR_Print("Instantiating TypeRef '%s': '%s'\n"
-                      "  instantiator: '%s'\n",
-                      String::Handle(super_type_arg.Name()).ToCString(),
-                      ref_type.ToCString(),
-                      arguments.ToCString());
+            AbstractType& ref_type =
+                AbstractType::Handle(TypeRef::Cast(super_type_arg).type());
+            THR_Print(
+                "Instantiating TypeRef '%s': '%s'\n"
+                "  instantiator: '%s'\n",
+                String::Handle(super_type_arg.Name()).ToCString(),
+                ref_type.ToCString(), arguments.ToCString());
           }
           Error& error = Error::Handle();
           super_type_arg = super_type_arg.InstantiateFrom(
@@ -897,20 +884,17 @@
             pending_types->Add(super_type_arg);
             const Class& cls = Class::Handle(super_type_arg.type_class());
             FinalizeTypeArguments(
-                cls,
-                TypeArguments::Handle(super_type_arg.arguments()),
-                cls.NumTypeArguments() - cls.NumTypeParameters(),
-                bound_error,
-                pending_types,
-                instantiation_trail);
+                cls, TypeArguments::Handle(super_type_arg.arguments()),
+                cls.NumTypeArguments() - cls.NumTypeParameters(), bound_error,
+                pending_types, instantiation_trail);
             Type::Cast(super_type_arg).SetIsFinalized();
           }
         }
       }
       arguments.SetTypeAt(i, super_type_arg);
     }
-    FinalizeTypeArguments(super_class, arguments, super_offset,
-                          bound_error, pending_types, instantiation_trail);
+    FinalizeTypeArguments(super_class, arguments, super_offset, bound_error,
+                          pending_types, instantiation_trail);
   }
 }
 
@@ -1000,8 +984,8 @@
         if (type_arg.IsTypeParameter()) {
           const Class& type_arg_cls = Class::Handle(
               TypeParameter::Cast(type_arg).parameterized_class());
-          AbstractType& bound = AbstractType::Handle(
-              TypeParameter::Cast(type_arg).bound());
+          AbstractType& bound =
+              AbstractType::Handle(TypeParameter::Cast(type_arg).bound());
           if (!bound.IsFinalized() && !bound.IsBeingFinalized()) {
             bound = FinalizeType(type_arg_cls, bound, kCanonicalize);
             TypeParameter::Cast(type_arg).set_bound(bound);
@@ -1009,8 +993,8 @@
         }
         // This may be called only if type needs to be finalized, therefore
         // seems OK to allocate finalized types in old space.
-        if (!type_param.CheckBound(type_arg, instantiated_bound,
-                                   &error, NULL, Heap::kOld) &&
+        if (!type_param.CheckBound(type_arg, instantiated_bound, &error, NULL,
+                                   Heap::kOld) &&
             error.IsNull()) {
           // The bound cannot be checked at compile time; postpone to run time.
           type_arg = BoundedType::New(type_arg, instantiated_bound, type_param);
@@ -1056,11 +1040,9 @@
     if (!bound_error.IsNull()) {
       // No compile-time error during finalization.
       const String& type_name = String::Handle(zone, type.UserVisibleName());
-      FinalizeMalboundedType(bound_error,
-                             Script::Handle(zone, cls.script()),
-                             type,
-                             "type '%s' has an out of bound type argument",
-                             type_name.ToCString());
+      FinalizeMalboundedType(
+          bound_error, Script::Handle(zone, cls.script()), type,
+          "type '%s' has an out of bound type argument", type_name.ToCString());
       if (FLAG_trace_type_finalization) {
         THR_Print("Marking type '%s' as malbounded: %s\n",
                   String::Handle(zone, type.Name()).ToCString(),
@@ -1070,27 +1052,23 @@
   }
   if (FLAG_trace_type_finalization) {
     THR_Print("Done checking bounds of type '%s': %s\n",
-              String::Handle(zone, type.Name()).ToCString(),
-              type.ToCString());
+              String::Handle(zone, type.Name()).ToCString(), type.ToCString());
   }
 }
 
 
-RawAbstractType* ClassFinalizer::FinalizeType(
-    const Class& cls,
-    const AbstractType& type,
-    FinalizationKind finalization,
-    PendingTypes* pending_types) {
+RawAbstractType* ClassFinalizer::FinalizeType(const Class& cls,
+                                              const AbstractType& type,
+                                              FinalizationKind finalization,
+                                              PendingTypes* pending_types) {
   // Only the 'root' type of the graph can be canonicalized, after all depending
   // types have been bound checked.
   ASSERT((pending_types == NULL) || (finalization < kCanonicalize));
   if (type.IsFinalized()) {
     // Ensure type is canonical if canonicalization is requested, unless type is
     // malformed.
-    if ((finalization >= kCanonicalize) &&
-        !type.IsMalformed() &&
-        !type.IsCanonical() &&
-        type.IsType()) {
+    if ((finalization >= kCanonicalize) && !type.IsMalformed() &&
+        !type.IsCanonical() && type.IsType()) {
       CheckTypeBounds(cls, type);
       return type.Canonicalize();
     }
@@ -1199,8 +1177,7 @@
   if (FLAG_trace_type_finalization) {
     THR_Print("Done finalizing type '%s' with %" Pd " type args: %s\n",
               String::Handle(zone, type.Name()).ToCString(),
-              num_expanded_type_arguments,
-              type.ToCString());
+              num_expanded_type_arguments, type.ToCString());
   }
 
   if (finalization >= kCanonicalize) {
@@ -1297,8 +1274,7 @@
   super_class = cls.SuperClass();
   while (!super_class.IsNull()) {
     function = super_class.LookupFunction(name);
-    if (!function.IsNull() &&
-        !function.is_static() &&
+    if (!function.IsNull() && !function.is_static() &&
         !function.IsMethodExtractor()) {
       return super_class.raw();
     }
@@ -1397,9 +1373,7 @@
         ReportError(cls, field.token_pos(),
                     "static field '%s' of class '%s' conflicts with "
                     "instance member '%s' of super class '%s'",
-                    name.ToCString(),
-                    class_name.ToCString(),
-                    name.ToCString(),
+                    name.ToCString(), class_name.ToCString(), name.ToCString(),
                     super_cls_name.ToCString());
       }
       // An implicit setter is not generated for a static field, therefore, we
@@ -1413,9 +1387,7 @@
         ReportError(cls, field.token_pos(),
                     "static field '%s' of class '%s' conflicts with "
                     "instance setter '%s=' of super class '%s'",
-                    name.ToCString(),
-                    class_name.ToCString(),
-                    name.ToCString(),
+                    name.ToCString(), class_name.ToCString(), name.ToCString(),
                     super_cls_name.ToCString());
       }
 
@@ -1429,14 +1401,11 @@
         ReportError(cls, field.token_pos(),
                     "field '%s' of class '%s' conflicts with method '%s' "
                     "of super class '%s'",
-                    name.ToCString(),
-                    class_name.ToCString(),
-                    name.ToCString(),
+                    name.ToCString(), class_name.ToCString(), name.ToCString(),
                     super_cls_name.ToCString());
       }
     }
-    if (field.is_static() &&
-        (field.StaticValue() != Object::null()) &&
+    if (field.is_static() && (field.StaticValue() != Object::null()) &&
         (field.StaticValue() != Object::sentinel().raw())) {
       // The parser does not preset the value if the type is a type parameter or
       // is parameterized unless the value is null.
@@ -1446,25 +1415,22 @@
       } else {
         ASSERT(type.IsInstantiated());
       }
-      const Instance& const_value =
-          Instance::Handle(zone, field.StaticValue());
+      const Instance& const_value = Instance::Handle(zone, field.StaticValue());
       if (!error.IsNull() ||
           (!type.IsDynamicType() &&
-           !const_value.IsInstanceOf(type,
-                                     Object::null_type_arguments(),
+           !const_value.IsInstanceOf(type, Object::null_type_arguments(),
                                      &error))) {
         if (Isolate::Current()->error_on_bad_type()) {
-          const AbstractType& const_value_type = AbstractType::Handle(
-              zone, const_value.GetType());
-          const String& const_value_type_name = String::Handle(
-              zone, const_value_type.UserVisibleName());
-          const String& type_name = String::Handle(
-              zone, type.UserVisibleName());
+          const AbstractType& const_value_type =
+              AbstractType::Handle(zone, const_value.GetType());
+          const String& const_value_type_name =
+              String::Handle(zone, const_value_type.UserVisibleName());
+          const String& type_name =
+              String::Handle(zone, type.UserVisibleName());
           ReportErrors(error, cls, field.token_pos(),
                        "error initializing static %s field '%s': "
                        "type '%s' is not a subtype of type '%s'",
-                       field.is_const() ? "const" : "final",
-                       name.ToCString(),
+                       field.is_const() ? "const" : "final", name.ToCString(),
                        const_value_type_name.ToCString(),
                        type_name.ToCString());
         } else {
@@ -1477,16 +1443,13 @@
           // we create an implicit static final getter and reset the field value
           // to the sentinel value.
           const Function& getter = Function::Handle(
-              zone,
-              Function::New(getter_name,
-                            RawFunction::kImplicitStaticFinalGetter,
-                            /* is_static = */ true,
-                            /* is_const = */ field.is_const(),
-                            /* is_abstract = */ false,
-                            /* is_external = */ false,
-                            /* is_native = */ false,
-                            cls,
-                            field.token_pos()));
+              zone, Function::New(
+                        getter_name, RawFunction::kImplicitStaticFinalGetter,
+                        /* is_static = */ true,
+                        /* is_const = */ field.is_const(),
+                        /* is_abstract = */ false,
+                        /* is_external = */ false,
+                        /* is_native = */ false, cls, field.token_pos()));
           getter.set_result_type(type);
           getter.set_is_debuggable(false);
           cls.AddFunction(getter);
@@ -1517,8 +1480,8 @@
     FinalizeSignature(cls, function);
     name = function.name();
     // Report signature conflicts only.
-    if (Isolate::Current()->error_on_bad_override() &&
-        !function.is_static() && !function.IsGenerativeConstructor()) {
+    if (Isolate::Current()->error_on_bad_override() && !function.is_static() &&
+        !function.IsGenerativeConstructor()) {
       // A constructor cannot override anything.
       for (intptr_t i = 0; i < interfaces.length(); i++) {
         const Class* super_class = interfaces.At(i);
@@ -1535,8 +1498,7 @@
           ReportErrors(error, cls, function.token_pos(),
                        "class '%s' overrides method '%s' of super "
                        "class '%s' with incompatible parameters",
-                       class_name.ToCString(),
-                       name.ToCString(),
+                       class_name.ToCString(), name.ToCString(),
                        super_cls_name.ToCString());
         }
       }
@@ -1551,10 +1513,8 @@
           ReportError(cls, function.token_pos(),
                       "static setter '%s=' of class '%s' conflicts with "
                       "instance setter '%s=' of super class '%s'",
-                      name.ToCString(),
-                      class_name.ToCString(),
-                      name.ToCString(),
-                      super_cls_name.ToCString());
+                      name.ToCString(), class_name.ToCString(),
+                      name.ToCString(), super_cls_name.ToCString());
         }
       }
       continue;
@@ -1570,15 +1530,15 @@
       if (!super_class.IsNull()) {
         const String& class_name = String::Handle(zone, cls.Name());
         const String& super_cls_name = String::Handle(zone, super_class.Name());
-        ReportError(cls, function.token_pos(),
-                    "static %s '%s' of class '%s' conflicts with "
-                    "instance member '%s' of super class '%s'",
-                    (function.IsGetterFunction() ||
-                     function.IsImplicitGetterFunction()) ? "getter" : "method",
-                    name.ToCString(),
-                    class_name.ToCString(),
-                    name.ToCString(),
-                    super_cls_name.ToCString());
+        ReportError(
+            cls, function.token_pos(),
+            "static %s '%s' of class '%s' conflicts with "
+            "instance member '%s' of super class '%s'",
+            (function.IsGetterFunction() || function.IsImplicitGetterFunction())
+                ? "getter"
+                : "method",
+            name.ToCString(), class_name.ToCString(), name.ToCString(),
+            super_cls_name.ToCString());
       }
       if (function.IsRedirectingFactory()) {
         // The function may be a still unresolved redirecting factory. Do not
@@ -1601,9 +1561,7 @@
         ReportError(cls, function.token_pos(),
                     "getter '%s' of class '%s' conflicts with "
                     "method '%s' of super class '%s'",
-                    name.ToCString(),
-                    class_name.ToCString(),
-                    name.ToCString(),
+                    name.ToCString(), class_name.ToCString(), name.ToCString(),
                     super_cls_name.ToCString());
       }
     } else if (!function.IsSetterFunction() &&
@@ -1617,9 +1575,7 @@
         ReportError(cls, function.token_pos(),
                     "method '%s' of class '%s' conflicts with "
                     "getter '%s' of super class '%s'",
-                    name.ToCString(),
-                    class_name.ToCString(),
-                    name.ToCString(),
+                    name.ToCString(), class_name.ToCString(), name.ToCString(),
                     super_cls_name.ToCString());
       }
     }
@@ -1649,8 +1605,8 @@
   ASSERT(mixin_app_class.type_parameters() == TypeArguments::null());
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
-  const AbstractType& super_type = AbstractType::Handle(zone,
-      mixin_app_class.super_type());
+  const AbstractType& super_type =
+      AbstractType::Handle(zone, mixin_app_class.super_type());
   ASSERT(super_type.IsResolved());
   const Class& super_class = Class::Handle(zone, super_type.type_class());
   const intptr_t num_super_type_params = super_class.NumTypeParameters();
@@ -1686,7 +1642,8 @@
       }
     }
 
-    const TypeArguments& cloned_type_params = TypeArguments::Handle(zone,
+    const TypeArguments& cloned_type_params = TypeArguments::Handle(
+        zone,
         TypeArguments::New((share_type_params ? 0 : num_super_type_params) +
                            num_mixin_type_params));
     TypeParameter& param = TypeParameter::Handle(zone);
@@ -1702,8 +1659,8 @@
     if (!share_type_params && (num_super_type_params > 0)) {
       const TypeArguments& super_type_params =
           TypeArguments::Handle(zone, super_class.type_parameters());
-      const TypeArguments& super_type_args = TypeArguments::Handle(zone,
-          TypeArguments::New(num_super_type_params));
+      const TypeArguments& super_type_args = TypeArguments::Handle(
+          zone, TypeArguments::New(num_super_type_params));
       // The cloned super class type parameters do not need to repeat their
       // bounds, since the bound checks will be performed at the super class
       // level. As a consequence, if this mixin application is used itself as a
@@ -1716,14 +1673,11 @@
       for (intptr_t i = 0; i < num_super_type_params; i++) {
         param ^= super_type_params.TypeAt(i);
         param_name = param.name();
-        param_name = Symbols::FromConcat(thread,
-                                         param_name, Symbols::Backtick());
-        cloned_param = TypeParameter::New(mixin_app_class,
-                                          null_function,
-                                          cloned_index,
-                                          param_name,
-                                          param_bound,
-                                          param.token_pos());
+        param_name =
+            Symbols::FromConcat(thread, param_name, Symbols::Backtick());
+        cloned_param =
+            TypeParameter::New(mixin_app_class, null_function, cloned_index,
+                               param_name, param_bound, param.token_pos());
         cloned_type_params.SetTypeAt(cloned_index, cloned_param);
         // Change the type arguments of the super type to refer to the
         // cloned type parameters of the mixin application class.
@@ -1746,8 +1700,8 @@
           TypeArguments::Handle(zone, mixin_class.type_parameters());
       const intptr_t offset =
           mixin_class.NumTypeArguments() - mixin_class.NumTypeParameters();
-      const TypeArguments& mixin_type_args = TypeArguments::Handle(zone,
-          TypeArguments::New(num_mixin_type_params));
+      const TypeArguments& mixin_type_args = TypeArguments::Handle(
+          zone, TypeArguments::New(num_mixin_type_params));
       instantiator ^= TypeArguments::New(offset + num_mixin_type_params);
       bool has_uninstantiated_bounds = false;
       for (intptr_t i = 0; i < num_mixin_type_params; i++) {
@@ -1757,12 +1711,10 @@
         if (!param_bound.IsInstantiated()) {
           has_uninstantiated_bounds = true;
         }
-        cloned_param = TypeParameter::New(mixin_app_class,
-                                          null_function,
-                                          cloned_index,  // Unfinalized index.
-                                          param_name,
-                                          param_bound,
-                                          param.token_pos());
+        cloned_param =
+            TypeParameter::New(mixin_app_class, null_function,
+                               cloned_index,  // Unfinalized index.
+                               param_name, param_bound, param.token_pos());
         cloned_type_params.SetTypeAt(cloned_index, cloned_param);
         mixin_type_args.SetTypeAt(i, cloned_param);  // Unfinalized length.
         instantiator.SetTypeAt(offset + i, cloned_param);  // Finalized length.
@@ -1785,8 +1737,7 @@
           param_bound = param.bound();
           if (!param_bound.IsInstantiated()) {
             // Make sure the bound is finalized before instantiating it.
-            if (!param_bound.IsFinalized() &&
-                !param_bound.IsBeingFinalized()) {
+            if (!param_bound.IsFinalized() && !param_bound.IsBeingFinalized()) {
               param_bound =
                   FinalizeType(mixin_app_class, param_bound, kCanonicalize);
               param.set_bound(param_bound);  // In case part of recursive type.
@@ -1902,34 +1853,34 @@
   // The mixin type may or may not be finalized yet.
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
-  AbstractType& super_type = AbstractType::Handle(zone,
-                                                  mixin_app_class.super_type());
+  AbstractType& super_type =
+      AbstractType::Handle(zone, mixin_app_class.super_type());
   const Type& mixin_type = Type::Handle(zone, mixin_app_class.mixin());
   const Class& mixin_class = Class::Handle(zone, mixin_type.type_class());
   ASSERT(mixin_class.is_mixin_app_alias());
-  const Class& aliased_mixin_app_class = Class::Handle(zone,
-      mixin_class.SuperClass());
+  const Class& aliased_mixin_app_class =
+      Class::Handle(zone, mixin_class.SuperClass());
   // Note that the super class of aliased_mixin_app_class can itself be a
   // mixin application class (this happens if the alias is mixing more than one
   // type). Instead of trying to recursively insert yet another class as the
   // super class of this inserted class, we apply the composition rules of the
   // spec and only mixin the members of aliased_mixin_app_class, not those of
   // its super class. In other words, we only mixin the last mixin of the alias.
-  const Type& aliased_mixin_type = Type::Handle(zone,
-      aliased_mixin_app_class.mixin());
+  const Type& aliased_mixin_type =
+      Type::Handle(zone, aliased_mixin_app_class.mixin());
   // The name of the inserted mixin application class is the name of mixin
   // class name with a backtick added.
   String& inserted_class_name = String::Handle(zone, mixin_app_class.Name());
-  inserted_class_name = String::Concat(inserted_class_name,
-                                       Symbols::Backtick());
+  inserted_class_name =
+      String::Concat(inserted_class_name, Symbols::Backtick());
   const Library& library = Library::Handle(zone, mixin_app_class.library());
-  Class& inserted_class = Class::Handle(zone,
-      library.LookupLocalClass(inserted_class_name));
+  Class& inserted_class =
+      Class::Handle(zone, library.LookupLocalClass(inserted_class_name));
   if (inserted_class.IsNull()) {
     inserted_class_name = Symbols::New(thread, inserted_class_name);
     const Script& script = Script::Handle(zone, mixin_app_class.script());
-    inserted_class = Class::New(
-        library, inserted_class_name, script, mixin_app_class.token_pos());
+    inserted_class = Class::New(library, inserted_class_name, script,
+                                mixin_app_class.token_pos());
     inserted_class.set_is_synthesized_class();
     library.AddClass(inserted_class);
 
@@ -1952,10 +1903,10 @@
     // After FinalizeTypesInClass, if the mixin type and interface type are
     // generic, their type arguments will refer to the type parameters of
     // inserted_class.
-    const Type& inserted_class_mixin_type = Type::Handle(zone,
-        Type::New(Class::Handle(zone, aliased_mixin_type.type_class()),
-                  Object::null_type_arguments(),
-                  aliased_mixin_type.token_pos()));
+    const Type& inserted_class_mixin_type = Type::Handle(
+        zone, Type::New(Class::Handle(zone, aliased_mixin_type.type_class()),
+                        Object::null_type_arguments(),
+                        aliased_mixin_type.token_pos()));
     inserted_class.set_mixin(inserted_class_mixin_type);
     // Add the mixin type to the list of interfaces that the mixin application
     // class implements. This is necessary so that cycle check work at
@@ -1995,8 +1946,8 @@
   // will finalize mixin_class_super_type.
   // The aliased_mixin_type does not need to be finalized, but only resolved.
   ASSERT(aliased_mixin_type.IsResolved());
-  const Class& aliased_mixin_type_class = Class::Handle(zone,
-      aliased_mixin_type.type_class());
+  const Class& aliased_mixin_type_class =
+      Class::Handle(zone, aliased_mixin_type.type_class());
   FinalizeTypesInClass(mixin_class);
   const intptr_t num_aliased_mixin_type_params =
       aliased_mixin_type_class.NumTypeParameters();
@@ -2032,15 +1983,15 @@
           // BoundedType objects, so no bound error may occur.
           ASSERT(bound_error.IsNull());
           upper_bound = BoundedType::Cast(type).bound();
-          upper_bound = upper_bound.InstantiateFrom(
-              instantiator, &bound_error, NULL, NULL, Heap::kOld);
+          upper_bound = upper_bound.InstantiateFrom(instantiator, &bound_error,
+                                                    NULL, NULL, Heap::kOld);
           ASSERT(bound_error.IsNull());
           type_parameter = BoundedType::Cast(type).type_parameter();
           // The type parameter that declared the bound does not change.
           type = BoundedType::New(bounded_type, upper_bound, type_parameter);
         } else {
-          type = type.InstantiateFrom(
-              instantiator, &bound_error, NULL, NULL, Heap::kOld);
+          type = type.InstantiateFrom(instantiator, &bound_error, NULL, NULL,
+                                      Heap::kOld);
           ASSERT(bound_error.IsNull());
         }
       }
@@ -2066,8 +2017,7 @@
       new_super_type_args.SetTypeAt(num_super_type_params + i, type);
     }
   }
-  super_type = Type::New(inserted_class,
-                         new_super_type_args,
+  super_type = Type::New(inserted_class, new_super_type_args,
                          mixin_app_class.token_pos());
   mixin_app_class.set_super_type(super_type);
 
@@ -2076,18 +2026,18 @@
   ASSERT(!mixin_app_class.is_type_finalized());
   ASSERT(!mixin_app_class.is_mixin_type_applied());
   if (FLAG_trace_class_finalization) {
-    THR_Print("Inserting class '%s' %s\n"
-              "  as super type '%s' with %" Pd " type args: %s\n"
-              "  of mixin application alias '%s' %s\n",
-              String::Handle(inserted_class.Name()).ToCString(),
-              TypeArguments::Handle(
-                  inserted_class.type_parameters()).ToCString(),
-              String::Handle(zone, super_type.Name()).ToCString(),
-              num_super_type_params + num_aliased_mixin_type_params,
-              super_type.ToCString(),
-              String::Handle(mixin_app_class.Name()).ToCString(),
-              TypeArguments::Handle(
-                  mixin_app_class.type_parameters()).ToCString());
+    THR_Print(
+        "Inserting class '%s' %s\n"
+        "  as super type '%s' with %" Pd
+        " type args: %s\n"
+        "  of mixin application alias '%s' %s\n",
+        String::Handle(inserted_class.Name()).ToCString(),
+        TypeArguments::Handle(inserted_class.type_parameters()).ToCString(),
+        String::Handle(zone, super_type.Name()).ToCString(),
+        num_super_type_params + num_aliased_mixin_type_params,
+        super_type.ToCString(),
+        String::Handle(mixin_app_class.Name()).ToCString(),
+        TypeArguments::Handle(mixin_app_class.type_parameters()).ToCString());
   }
 }
 
@@ -2127,12 +2077,12 @@
   ResolveSuperTypeAndInterfaces(mixin_app_class, &visited_interfaces);
 
   if (FLAG_trace_class_finalization) {
-    THR_Print("Done applying mixin type '%s' to class '%s' %s extending '%s'\n",
-              String::Handle(mixin_type.Name()).ToCString(),
-              String::Handle(mixin_app_class.Name()).ToCString(),
-              TypeArguments::Handle(
-                  mixin_app_class.type_parameters()).ToCString(),
-              AbstractType::Handle(mixin_app_class.super_type()).ToCString());
+    THR_Print(
+        "Done applying mixin type '%s' to class '%s' %s extending '%s'\n",
+        String::Handle(mixin_type.Name()).ToCString(),
+        String::Handle(mixin_app_class.Name()).ToCString(),
+        TypeArguments::Handle(mixin_app_class.type_parameters()).ToCString(),
+        AbstractType::Handle(mixin_app_class.super_type()).ToCString());
   }
   // Mark the application class as having been applied its mixin type in order
   // to avoid cycles while finalizing its mixin type.
@@ -2169,13 +2119,12 @@
       // Build constructor name from mixin application class name
       // and name of cloned super class constructor.
       const String& ctor_name = String::Handle(Z, func.name());
-      String& clone_name = String::Handle(Z,
-          String::SubString(ctor_name, super_name.Length()));
+      String& clone_name =
+          String::Handle(Z, String::SubString(ctor_name, super_name.Length()));
       clone_name = Symbols::FromConcat(T, mixin_name, clone_name);
 
       if (FLAG_trace_class_finalization) {
-        THR_Print("Cloning constructor '%s' as '%s'\n",
-                  ctor_name.ToCString(),
+        THR_Print("Cloning constructor '%s' as '%s'\n", ctor_name.ToCString(),
                   clone_name.ToCString());
       }
 
@@ -2185,16 +2134,13 @@
       const PatchClass& owner =
           PatchClass::Handle(Z, PatchClass::New(mixin_app, mixin_cls));
 
-      const Function& clone = Function::Handle(Z,
-          Function::New(clone_name,
-                        func.kind(),
-                        func.is_static(),
-                        false,  // Not const.
-                        false,  // Not abstract.
-                        false,  // Not external.
-                        false,  // Not native.
-                        owner,
-                        mixin_cls.token_pos()));
+      const Function& clone = Function::Handle(
+          Z, Function::New(clone_name, func.kind(), func.is_static(),
+                           false,  // Not const.
+                           false,  // Not abstract.
+                           false,  // Not external.
+                           false,  // Not native.
+                           owner, mixin_cls.token_pos()));
       clone.set_num_fixed_parameters(func.num_fixed_parameters());
       clone.SetNumOptionalParameters(func.NumOptionalParameters(),
                                      func.HasOptionalPositionalParameters());
@@ -2236,8 +2182,7 @@
 
   if (FLAG_trace_class_finalization) {
     THR_Print("Applying mixin members of %s to %s at pos %s\n",
-              mixin_cls.ToCString(),
-              cls.ToCString(),
+              mixin_cls.ToCString(), cls.ToCString(),
               cls.token_pos().ToCString());
   }
 
@@ -2259,13 +2204,12 @@
       // A mixin class must not have explicit constructors.
       if (!func.IsImplicitConstructor()) {
         const Script& script = Script::Handle(cls.script());
-        const Error& error = Error::Handle(
-            LanguageError::NewFormatted(Error::Handle(),
-                script, func.token_pos(), Report::AtLocation,
-                Report::kError, Heap::kNew,
-                "constructor '%s' is illegal in mixin class %s",
-                String::Handle(func.UserVisibleName()).ToCString(),
-                String::Handle(zone, mixin_cls.Name()).ToCString()));
+        const Error& error = Error::Handle(LanguageError::NewFormatted(
+            Error::Handle(), script, func.token_pos(), Report::AtLocation,
+            Report::kError, Heap::kNew,
+            "constructor '%s' is illegal in mixin class %s",
+            String::Handle(func.UserVisibleName()).ToCString(),
+            String::Handle(zone, mixin_cls.Name()).ToCString()));
 
         ReportErrors(error, cls, cls.token_pos(),
                      "mixin class '%s' must not have constructors",
@@ -2273,10 +2217,8 @@
       }
       continue;  // Skip the implicit constructor.
     }
-    if (!func.is_static() &&
-        !func.IsMethodExtractor() &&
-        !func.IsNoSuchMethodDispatcher() &&
-        !func.IsInvokeFieldDispatcher()) {
+    if (!func.is_static() && !func.IsMethodExtractor() &&
+        !func.IsNoSuchMethodDispatcher() && !func.IsInvokeFieldDispatcher()) {
       func = func.Clone(cls);
       cloned_funcs.Add(func);
     }
@@ -2304,8 +2246,7 @@
 
   if (FLAG_trace_class_finalization) {
     THR_Print("Done applying mixin members of %s to %s\n",
-              mixin_cls.ToCString(),
-              cls.ToCString());
+              mixin_cls.ToCString(), cls.ToCString());
   }
 }
 
@@ -2368,8 +2309,7 @@
     if (!IsTypedefCycleFree(cls, type, &visited_aliases)) {
       const String& name = String::Handle(cls.Name());
       ReportError(cls, cls.token_pos(),
-                  "typedef '%s' illegally refers to itself",
-                  name.ToCString());
+                  "typedef '%s' illegally refers to itself", name.ToCString());
     }
     cls.set_is_type_finalized();
 
@@ -2497,8 +2437,7 @@
   }
   // Every class should have at least a constructor, unless it is a top level
   // class or a typedef class.
-  ASSERT(cls.IsTopLevel() ||
-         cls.IsTypedefClass() ||
+  ASSERT(cls.IsTopLevel() || cls.IsTypedefClass() ||
          (Array::Handle(cls.functions()).Length() > 0));
   // Resolve and finalize all member types.
   ResolveAndFinalizeMemberTypes(cls);
@@ -2530,15 +2469,15 @@
   const Field& index_field =
       Field::Handle(zone, enum_cls.LookupInstanceField(Symbols::Index()));
   ASSERT(!index_field.IsNull());
-  const Field& name_field = Field::Handle(zone,
-        enum_cls.LookupInstanceFieldAllowPrivate(Symbols::_name()));
+  const Field& name_field = Field::Handle(
+      zone, enum_cls.LookupInstanceFieldAllowPrivate(Symbols::_name()));
   ASSERT(!name_field.IsNull());
   const Field& values_field =
       Field::Handle(zone, enum_cls.LookupStaticField(Symbols::Values()));
   ASSERT(!values_field.IsNull());
   ASSERT(Instance::Handle(zone, values_field.StaticValue()).IsArray());
-  Array& values_list = Array::Handle(
-      zone, Array::RawCast(values_field.StaticValue()));
+  Array& values_list =
+      Array::Handle(zone, Array::RawCast(values_field.StaticValue()));
 
   const Array& fields = Array::Handle(zone, enum_cls.fields());
   Field& field = Field::Handle(zone);
@@ -2592,8 +2531,8 @@
   Class& test2 = Class::Handle(cls.SuperClass());
   // A finalized class has been checked for cycles.
   // Using the hare and tortoise algorithm for locating cycles.
-  while (!test1.is_type_finalized() &&
-         !test2.IsNull() && !test2.is_type_finalized()) {
+  while (!test1.is_type_finalized() && !test2.IsNull() &&
+         !test2.is_type_finalized()) {
     if (test1.raw() == test2.raw()) {
       // Found a cycle.
       return false;
@@ -2626,8 +2565,7 @@
       // function used in a formal parameter type of the typedef signature, but
       // not the typedef signature function itself, thus not qualifying as an
       // illegal self reference.
-      if (!scope_class.is_type_finalized() &&
-          scope_class.IsTypedefClass() &&
+      if (!scope_class.is_type_finalized() && scope_class.IsTypedefClass() &&
           (scope_class.signature_function() == signature_function.raw())) {
         checking_typedef = true;
         const intptr_t scope_class_id = scope_class.id();
@@ -2775,8 +2713,7 @@
     ReportError(Error::Handle(zone, mixin_super_type.error()));
   }
   if (mixin_super_type.IsDynamicType()) {
-    ReportError(cls, cls.token_pos(),
-                "class '%s' may not extend 'dynamic'",
+    ReportError(cls, cls.token_pos(), "class '%s' may not extend 'dynamic'",
                 String::Handle(zone, cls.Name()).ToCString());
   }
   // The super type may have a BoundedType as type argument, but cannot be
@@ -2804,7 +2741,7 @@
     // thereby allowing for further optimizations, such as instantiator vector
     // reuse or sharing of type arguments with the super class.
     bool share_type_params = (num_super_type_args > 0) &&
-        (type_args.Length() == 2*num_super_type_args);
+                             (type_args.Length() == 2 * num_super_type_args);
     if (share_type_params) {
       for (intptr_t i = 0; i < num_super_type_args; i++) {
         super_type_arg ^= type_args.At(i);
@@ -2823,31 +2760,28 @@
     // The name of the mixin application class is a combination of
     // the super class name and mixin class name.
     mixin_app_class_name = mixin_super_type.ClassName();
-    mixin_app_class_name = String::Concat(mixin_app_class_name,
-                                          Symbols::Ampersand());
+    mixin_app_class_name =
+        String::Concat(mixin_app_class_name, Symbols::Ampersand());
     // If the type parameters are shared between the super type and the mixin
     // type, use two ampersand symbols, so that the class has a different name
     // and is not reused in a context where this optimization is not possible.
     if (share_type_params) {
-      mixin_app_class_name = String::Concat(mixin_app_class_name,
-                                            Symbols::Ampersand());
+      mixin_app_class_name =
+          String::Concat(mixin_app_class_name, Symbols::Ampersand());
     }
     mixin_type_class_name = mixin_type.ClassName();
-    mixin_app_class_name = String::Concat(mixin_app_class_name,
-                                          mixin_type_class_name);
+    mixin_app_class_name =
+        String::Concat(mixin_app_class_name, mixin_type_class_name);
     mixin_app_class = library.LookupLocalClass(mixin_app_class_name);
     if (mixin_app_class.IsNull()) {
       mixin_app_class_name = Symbols::New(thread, mixin_app_class_name);
-      mixin_app_class = Class::New(library,
-                                   mixin_app_class_name,
-                                   script,
+      mixin_app_class = Class::New(library, mixin_app_class_name, script,
                                    mixin_type.token_pos());
       mixin_app_class.set_super_type(mixin_super_type);
       mixin_type_class = mixin_type.type_class();
-      const Type& generic_mixin_type = Type::Handle(zone,
-          Type::New(mixin_type_class,
-                    Object::null_type_arguments(),
-                    mixin_type.token_pos()));
+      const Type& generic_mixin_type = Type::Handle(
+          zone, Type::New(mixin_type_class, Object::null_type_arguments(),
+                          mixin_type.token_pos()));
       mixin_app_class.set_mixin(generic_mixin_type);
       // Add the mixin type to the list of interfaces that the mixin application
       // class implements. This is necessary so that cycle check work at
@@ -2870,8 +2804,7 @@
     // This mixin application class becomes the type class of the super type of
     // the next mixin application class. It is however too early to provide the
     // correct super type arguments. We use the raw type for now.
-    mixin_super_type = Type::New(mixin_app_class,
-                                 Object::null_type_arguments(),
+    mixin_super_type = Type::New(mixin_app_class, Object::null_type_arguments(),
                                  mixin_type.token_pos());
   }
   TypeArguments& mixin_app_args = TypeArguments::Handle(zone);
@@ -2905,7 +2838,8 @@
 // graph. If we visit an interface a second time on a given path,
 // we found a loop.
 void ClassFinalizer::ResolveSuperTypeAndInterfaces(
-    const Class& cls, GrowableArray<intptr_t>* visited) {
+    const Class& cls,
+    GrowableArray<intptr_t>* visited) {
   if (cls.is_cycle_free()) {
     return;
   }
@@ -2919,8 +2853,7 @@
     if ((*visited)[i] == cls_index) {
       // We have already visited class 'cls'. We found a cycle.
       const String& class_name = String::Handle(zone, cls.Name());
-      ReportError(cls, cls.token_pos(),
-                  "cyclic reference found for class '%s'",
+      ReportError(cls, cls.token_pos(), "cyclic reference found for class '%s'",
                   class_name.ToCString());
     }
   }
@@ -2960,8 +2893,7 @@
     ReportError(Error::Handle(zone, super_type.error()));
   }
   if (super_type.IsDynamicType()) {
-    ReportError(cls, cls.token_pos(),
-                "class '%s' may not extend 'dynamic'",
+    ReportError(cls, cls.token_pos(), "class '%s' may not extend 'dynamic'",
                 String::Handle(zone, cls.Name()).ToCString());
   }
   interface_class = super_type.type_class();
@@ -2969,12 +2901,10 @@
     ReportError(cls, cls.token_pos(),
                 "class '%s' may not extend function type alias '%s'",
                 String::Handle(zone, cls.Name()).ToCString(),
-                String::Handle(zone,
-                               super_type.UserVisibleName()).ToCString());
+                String::Handle(zone, super_type.UserVisibleName()).ToCString());
   }
   if (interface_class.is_enum_class()) {
-    ReportError(cls, cls.token_pos(),
-                "class '%s' may not extend enum '%s'",
+    ReportError(cls, cls.token_pos(), "class '%s' may not extend enum '%s'",
                 String::Handle(zone, cls.Name()).ToCString(),
                 String::Handle(zone, interface_class.Name()).ToCString());
   }
@@ -3001,10 +2931,10 @@
       case kImmutableArrayCid:
       case kGrowableObjectArrayCid:
 #define DO_NOT_EXTEND_TYPED_DATA_CLASSES(clazz)                                \
-      case kTypedData##clazz##Cid:                                             \
-      case kTypedData##clazz##ViewCid:                                         \
-      case kExternalTypedData##clazz##Cid:
-      CLASS_LIST_TYPED_DATA(DO_NOT_EXTEND_TYPED_DATA_CLASSES)
+  case kTypedData##clazz##Cid:                                                 \
+  case kTypedData##clazz##ViewCid:                                             \
+  case kExternalTypedData##clazz##Cid:
+        CLASS_LIST_TYPED_DATA(DO_NOT_EXTEND_TYPED_DATA_CLASSES)
 #undef DO_NOT_EXTEND_TYPED_DATA_CLASSES
       case kByteDataViewCid:
       case kWeakPropertyCid:
@@ -3012,8 +2942,7 @@
         break;
       default: {
         // Special case: classes for which we don't have a known class id.
-        if (super_type.IsDoubleType() ||
-            super_type.IsIntType() ||
+        if (super_type.IsDoubleType() || super_type.IsIntType() ||
             super_type.IsStringType()) {
           is_error = true;
         }
@@ -3021,10 +2950,9 @@
       }
     }
     if (is_error) {
-      const String& interface_name = String::Handle(zone,
-                                                    interface_class.Name());
-      ReportError(cls, cls.token_pos(),
-                  "'%s' is not allowed to extend '%s'",
+      const String& interface_name =
+          String::Handle(zone, interface_class.Name());
+      ReportError(cls, cls.token_pos(), "'%s' is not allowed to extend '%s'",
                   String::Handle(zone, cls.Name()).ToCString(),
                   interface_name.ToCString());
     }
@@ -3047,15 +2975,15 @@
     }
     interface_class = interface.type_class();
     if (interface_class.IsTypedefClass()) {
-      const String& interface_name = String::Handle(zone,
-                                                    interface_class.Name());
+      const String& interface_name =
+          String::Handle(zone, interface_class.Name());
       ReportError(cls, cls.token_pos(),
                   "function type alias '%s' may not be used as interface",
                   interface_name.ToCString());
     }
     if (interface_class.is_enum_class()) {
-      const String& interface_name = String::Handle(zone,
-                                                    interface_class.Name());
+      const String& interface_name =
+          String::Handle(zone, interface_class.Name());
       ReportError(cls, cls.token_pos(),
                   "enum '%s' may not be used as interface",
                   interface_name.ToCString());
@@ -3063,18 +2991,14 @@
     // Verify that unless cls belongs to core lib, it cannot extend, implement,
     // or mixin any of Null, bool, num, int, double, String, dynamic.
     if (!cls_belongs_to_core_lib) {
-      if (interface.IsBoolType() ||
-          interface.IsNullType() ||
-          interface.IsNumberType() ||
-          interface.IsIntType() ||
-          interface.IsDoubleType() ||
-          interface.IsStringType() ||
+      if (interface.IsBoolType() || interface.IsNullType() ||
+          interface.IsNumberType() || interface.IsIntType() ||
+          interface.IsDoubleType() || interface.IsStringType() ||
           interface.IsDynamicType()) {
-        const String& interface_name = String::Handle(zone,
-                                                      interface_class.Name());
+        const String& interface_name =
+            String::Handle(zone, interface_class.Name());
         if (cls.IsMixinApplication()) {
-          ReportError(cls, cls.token_pos(),
-                      "illegal mixin of '%s'",
+          ReportError(cls, cls.token_pos(), "illegal mixin of '%s'",
                       interface_name.ToCString());
         } else {
           ReportError(cls, cls.token_pos(),
@@ -3121,8 +3045,7 @@
   THR_Print("class '%s'", class_name.ToCString());
   const Library& library = Library::Handle(cls.library());
   if (!library.IsNull()) {
-    THR_Print(" library '%s%s':\n",
-              String::Handle(library.url()).ToCString(),
+    THR_Print(" library '%s%s':\n", String::Handle(library.url()).ToCString(),
               String::Handle(library.private_key()).ToCString());
   } else {
     THR_Print(" (null library):\n");
@@ -3167,11 +3090,9 @@
                                        const Type& type,
                                        const char* format,
                                        va_list args) {
-  LanguageError& error = LanguageError::Handle(
-      LanguageError::NewFormattedV(
-          prev_error, script, type.token_pos(), Report::AtLocation,
-          Report::kMalformedType, Heap::kOld,
-          format, args));
+  LanguageError& error = LanguageError::Handle(LanguageError::NewFormattedV(
+      prev_error, script, type.token_pos(), Report::AtLocation,
+      Report::kMalformedType, Heap::kOld, format, args));
   if (Isolate::Current()->error_on_bad_type()) {
     ReportError(error);
   }
@@ -3194,13 +3115,13 @@
 RawType* ClassFinalizer::NewFinalizedMalformedType(const Error& prev_error,
                                                    const Script& script,
                                                    TokenPosition type_pos,
-                                                   const char* format, ...) {
+                                                   const char* format,
+                                                   ...) {
   va_list args;
   va_start(args, format);
-  const UnresolvedClass& unresolved_class = UnresolvedClass::Handle(
-      UnresolvedClass::New(LibraryPrefix::Handle(),
-                           Symbols::Empty(),
-                           type_pos));
+  const UnresolvedClass& unresolved_class =
+      UnresolvedClass::Handle(UnresolvedClass::New(LibraryPrefix::Handle(),
+                                                   Symbols::Empty(), type_pos));
   const Type& type = Type::Handle(
       Type::New(unresolved_class, TypeArguments::Handle(), type_pos));
   MarkTypeMalformed(prev_error, script, type, format, args);
@@ -3214,7 +3135,8 @@
 void ClassFinalizer::FinalizeMalformedType(const Error& prev_error,
                                            const Script& script,
                                            const Type& type,
-                                           const char* format, ...) {
+                                           const char* format,
+                                           ...) {
   va_list args;
   va_start(args, format);
   MarkTypeMalformed(prev_error, script, type, format, args);
@@ -3225,14 +3147,13 @@
 void ClassFinalizer::FinalizeMalboundedType(const Error& prev_error,
                                             const Script& script,
                                             const AbstractType& type,
-                                            const char* format, ...) {
+                                            const char* format,
+                                            ...) {
   va_list args;
   va_start(args, format);
-  LanguageError& error = LanguageError::Handle(
-      LanguageError::NewFormattedV(
-          prev_error, script, type.token_pos(), Report::AtLocation,
-          Report::kMalboundedType, Heap::kOld,
-          format, args));
+  LanguageError& error = LanguageError::Handle(LanguageError::NewFormattedV(
+      prev_error, script, type.token_pos(), Report::AtLocation,
+      Report::kMalboundedType, Heap::kOld, format, args));
   va_end(args);
   if (Isolate::Current()->error_on_bad_type()) {
     ReportError(error);
@@ -3254,7 +3175,8 @@
 void ClassFinalizer::ReportErrors(const Error& prev_error,
                                   const Class& cls,
                                   TokenPosition token_pos,
-                                  const char* format, ...) {
+                                  const char* format,
+                                  ...) {
   va_list args;
   va_start(args, format);
   const Script& script = Script::Handle(cls.script());
@@ -3266,12 +3188,13 @@
 
 void ClassFinalizer::ReportError(const Class& cls,
                                  TokenPosition token_pos,
-                                 const char* format, ...) {
+                                 const char* format,
+                                 ...) {
   va_list args;
   va_start(args, format);
   const Script& script = Script::Handle(cls.script());
-  Report::MessageV(Report::kError,
-                   script, token_pos, Report::AtLocation, format, args);
+  Report::MessageV(Report::kError, script, token_pos, Report::AtLocation,
+                   format, args);
   va_end(args);
   UNREACHABLE();
 }
@@ -3292,8 +3215,7 @@
 
   // First verify field offsets of all the TypedDataView classes.
   for (intptr_t cid = kTypedDataInt8ArrayViewCid;
-       cid <= kTypedDataFloat32x4ArrayViewCid;
-       cid++) {
+       cid <= kTypedDataFloat32x4ArrayViewCid; cid++) {
     cls = class_table.At(cid);  // Get the TypedDataView class.
     error = cls.EnsureIsFinalized(thread);
     ASSERT(error.IsNull());
diff --git a/runtime/vm/class_finalizer.h b/runtime/vm/class_finalizer.h
index 16a19f8..5bcfc6b 100644
--- a/runtime/vm/class_finalizer.h
+++ b/runtime/vm/class_finalizer.h
@@ -19,22 +19,21 @@
 
   // Modes for type resolution and finalization. The ordering is relevant.
   enum FinalizationKind {
-    kIgnore,                   // Type is ignored and replaced by dynamic.
-    kDoNotResolve,             // Type resolution is postponed.
-    kResolveTypeParameters,    // Resolve type parameters only.
-    kFinalize,                 // Type resolution and finalization are required.
-    kCanonicalize,             // Same as kFinalize, but with canonicalization.
-    kCanonicalizeWellFormed    // Error-free resolution, finalization, and
-                               // canonicalization are required.
+    kIgnore,                 // Type is ignored and replaced by dynamic.
+    kDoNotResolve,           // Type resolution is postponed.
+    kResolveTypeParameters,  // Resolve type parameters only.
+    kFinalize,               // Type resolution and finalization are required.
+    kCanonicalize,           // Same as kFinalize, but with canonicalization.
+    kCanonicalizeWellFormed  // Error-free resolution, finalization, and
+                             // canonicalization are required.
   };
 
   // Finalize given type while parsing class cls.
   // Also canonicalize type if applicable.
-  static RawAbstractType* FinalizeType(
-      const Class& cls,
-      const AbstractType& type,
-      FinalizationKind finalization,
-      PendingTypes* pending_types = NULL);
+  static RawAbstractType* FinalizeType(const Class& cls,
+                                       const AbstractType& type,
+                                       FinalizationKind finalization,
+                                       PendingTypes* pending_types = NULL);
 
   // Allocate, finalize, and return a new malformed type as if it was declared
   // in class cls at the given token position.
@@ -43,8 +42,8 @@
   static RawType* NewFinalizedMalformedType(const Error& prev_error,
                                             const Script& script,
                                             TokenPosition type_pos,
-                                            const char* format, ...)
-       PRINTF_ATTRIBUTE(4, 5);
+                                            const char* format,
+                                            ...) PRINTF_ATTRIBUTE(4, 5);
 
   // Mark the given type as malformed.
   // If not null, prepend prev_error to the error message built from the format
@@ -52,8 +51,8 @@
   static void FinalizeMalformedType(const Error& prev_error,
                                     const Script& script,
                                     const Type& type,
-                                    const char* format, ...)
-       PRINTF_ATTRIBUTE(4, 5);
+                                    const char* format,
+                                    ...) PRINTF_ATTRIBUTE(4, 5);
 
   // Mark the given type as malbounded.
   // If not null, prepend prev_error to the error message built from the format
@@ -61,8 +60,8 @@
   static void FinalizeMalboundedType(const Error& prev_error,
                                      const Script& script,
                                      const AbstractType& type,
-                                     const char* format, ...)
-       PRINTF_ATTRIBUTE(4, 5);
+                                     const char* format,
+                                     ...) PRINTF_ATTRIBUTE(4, 5);
 
   // Return false if we still have classes pending to be finalized.
   static bool AllClassesFinalized();
@@ -156,8 +155,8 @@
   static void FinalizeSignature(const Class& cls, const Function& function);
   static void ResolveAndFinalizeMemberTypes(const Class& cls);
   static void PrintClassInformation(const Class& cls);
-  static void CollectInterfaces(
-      const Class& cls, GrowableArray<const Class*>* collected);
+  static void CollectInterfaces(const Class& cls,
+                                GrowableArray<const Class*>* collected);
 
   static void MarkTypeMalformed(const Error& prev_error,
                                 const Script& script,
@@ -167,11 +166,13 @@
   static void ReportError(const Error& error);
   static void ReportError(const Class& cls,
                           TokenPosition token_pos,
-                          const char* format, ...) PRINTF_ATTRIBUTE(3, 4);
+                          const char* format,
+                          ...) PRINTF_ATTRIBUTE(3, 4);
   static void ReportErrors(const Error& prev_error,
                            const Class& cls,
                            TokenPosition token_pos,
-                           const char* format, ...) PRINTF_ATTRIBUTE(4, 5);
+                           const char* format,
+                           ...) PRINTF_ATTRIBUTE(4, 5);
 
   // Verify implicit offsets recorded in the VM for direct access to fields of
   // Dart instances (e.g: _TypedListView, _ByteDataView).
diff --git a/runtime/vm/class_finalizer_test.cc b/runtime/vm/class_finalizer_test.cc
index 8de73e5..d2acc4a 100644
--- a/runtime/vm/class_finalizer_test.cc
+++ b/runtime/vm/class_finalizer_test.cc
@@ -11,12 +11,11 @@
 
 
 static RawClass* CreateTestClass(const char* name) {
-  const String& class_name = String::Handle(Symbols::New(Thread::Current(),
-                                                         name));
+  const String& class_name =
+      String::Handle(Symbols::New(Thread::Current(), name));
   const Script& script = Script::Handle();
-  const Class& cls = Class::Handle(
-      Class::New(Library::Handle(), class_name, script,
-                 TokenPosition::kNoSource));
+  const Class& cls = Class::Handle(Class::New(
+      Library::Handle(), class_name, script, TokenPosition::kNoSource));
   cls.set_interfaces(Object::empty_array());
   cls.SetFunctions(Object::empty_array());
   cls.SetFields(Object::empty_array());
@@ -95,15 +94,13 @@
   lib.AddClass(rhb);
   lib.AddClass(sbb);
   const String& superclass_name = String::Handle(sbb.Name());
-  const UnresolvedClass& unresolved = UnresolvedClass::Handle(
-      UnresolvedClass::New(LibraryPrefix::Handle(),
-                           superclass_name,
-                           TokenPosition::kNoSource));
+  const UnresolvedClass& unresolved =
+      UnresolvedClass::Handle(UnresolvedClass::New(
+          LibraryPrefix::Handle(), superclass_name, TokenPosition::kNoSource));
   const TypeArguments& type_arguments = TypeArguments::Handle();
-  rhb.set_super_type(Type::Handle(
-      Type::New(Object::Handle(unresolved.raw()),
-                type_arguments,
-                TokenPosition::kNoSource)));
+  rhb.set_super_type(
+      Type::Handle(Type::New(Object::Handle(unresolved.raw()), type_arguments,
+                             TokenPosition::kNoSource)));
   EXPECT(ClassFinalizer::ProcessPendingClasses());
 }
 
diff --git a/runtime/vm/class_table.cc b/runtime/vm/class_table.cc
index 989bf9c..4ceeb60 100644
--- a/runtime/vm/class_table.cc
+++ b/runtime/vm/class_table.cc
@@ -18,7 +18,9 @@
 DEFINE_FLAG(bool, print_class_table, false, "Print initial class table.");
 
 ClassTable::ClassTable()
-    : top_(kNumPredefinedCids), capacity_(0), table_(NULL),
+    : top_(kNumPredefinedCids),
+      capacity_(0),
+      table_(NULL),
       old_tables_(new MallocGrowableArray<RawClass**>()) {
   NOT_IN_PRODUCT(class_heap_stats_table_ = NULL);
   NOT_IN_PRODUCT(predefined_class_heap_stats_table_ = NULL);
@@ -50,7 +52,7 @@
   }
 #ifndef PRODUCT
   predefined_class_heap_stats_table_ = reinterpret_cast<ClassHeapStats*>(
-        calloc(kNumPredefinedCids, sizeof(ClassHeapStats)));  // NOLINT
+      calloc(kNumPredefinedCids, sizeof(ClassHeapStats)));  // NOLINT
   for (intptr_t i = 0; i < kNumPredefinedCids; i++) {
     predefined_class_heap_stats_table_[i].Initialize();
   }
@@ -122,8 +124,8 @@
     // Add the vtable for this predefined class into the static vtable registry
     // if it has not been setup yet.
     cpp_vtable cls_vtable = cls.handle_vtable();
-    AtomicOperations::CompareAndSwapWord(
-        &(Object::builtin_vtables_[index]), 0, cls_vtable);
+    AtomicOperations::CompareAndSwapWord(&(Object::builtin_vtables_[index]), 0,
+                                         cls_vtable);
     ASSERT(Object::builtin_vtables_[index] == cls_vtable);
   } else {
     if (top_ == capacity_) {
@@ -436,10 +438,8 @@
 
 
 ClassHeapStats* ClassTable::StatsWithUpdatedSize(intptr_t cid) {
-  if (!HasValidClassAt(cid) ||
-      (cid == kFreeListElement) ||
-      (cid == kForwardingCorpse) ||
-      (cid == kSmiCid)) {
+  if (!HasValidClassAt(cid) || (cid == kFreeListElement) ||
+      (cid == kForwardingCorpse) || (cid == kSmiCid)) {
     return NULL;
   }
   Class& cls = Class::Handle(At(cid));
@@ -487,16 +487,15 @@
 
 
 ClassHeapStats** ClassTable::TableAddressFor(intptr_t cid) {
-  return (cid < kNumPredefinedCids)
-      ? &predefined_class_heap_stats_table_
-      : &class_heap_stats_table_;
+  return (cid < kNumPredefinedCids) ? &predefined_class_heap_stats_table_
+                                    : &class_heap_stats_table_;
 }
 
 
 intptr_t ClassTable::TableOffsetFor(intptr_t cid) {
   return (cid < kNumPredefinedCids)
-      ? OFFSET_OF(ClassTable, predefined_class_heap_stats_table_)
-      : OFFSET_OF(ClassTable, class_heap_stats_table_);
+             ? OFFSET_OF(ClassTable, predefined_class_heap_stats_table_)
+             : OFFSET_OF(ClassTable, class_heap_stats_table_);
 }
 
 
@@ -507,9 +506,9 @@
 
 intptr_t ClassTable::CounterOffsetFor(intptr_t cid, bool is_new_space) {
   const intptr_t class_offset = ClassOffsetFor(cid);
-  const intptr_t count_field_offset = is_new_space
-      ? ClassHeapStats::allocated_since_gc_new_space_offset()
-      : ClassHeapStats::allocated_since_gc_old_space_offset();
+  const intptr_t count_field_offset =
+      is_new_space ? ClassHeapStats::allocated_since_gc_new_space_offset()
+                   : ClassHeapStats::allocated_since_gc_old_space_offset();
   return class_offset + count_field_offset;
 }
 
@@ -521,9 +520,9 @@
 
 intptr_t ClassTable::SizeOffsetFor(intptr_t cid, bool is_new_space) {
   const uword class_offset = ClassOffsetFor(cid);
-  const uword size_field_offset = is_new_space
-      ? ClassHeapStats::allocated_size_since_gc_new_space_offset()
-      : ClassHeapStats::allocated_size_since_gc_old_space_offset();
+  const uword size_field_offset =
+      is_new_space ? ClassHeapStats::allocated_size_since_gc_new_space_offset()
+                   : ClassHeapStats::allocated_size_since_gc_old_space_offset();
   return class_offset + size_field_offset;
 }
 
@@ -540,25 +539,18 @@
   obj.AddProperty("type", "AllocationProfile");
   if (isolate->last_allocationprofile_accumulator_reset_timestamp() != 0) {
     obj.AddPropertyF(
-        "dateLastAccumulatorReset",
-        "%" Pd64 "",
+        "dateLastAccumulatorReset", "%" Pd64 "",
         isolate->last_allocationprofile_accumulator_reset_timestamp());
   }
   if (isolate->last_allocationprofile_gc_timestamp() != 0) {
-    obj.AddPropertyF(
-        "dateLastServiceGC",
-        "%" Pd64 "",
-        isolate->last_allocationprofile_gc_timestamp());
+    obj.AddPropertyF("dateLastServiceGC", "%" Pd64 "",
+                     isolate->last_allocationprofile_gc_timestamp());
   }
 
   {
     JSONObject heaps(&obj, "heaps");
-    {
-      heap->PrintToJSONObject(Heap::kNew, &heaps);
-    }
-    {
-      heap->PrintToJSONObject(Heap::kOld, &heaps);
-    }
+    { heap->PrintToJSONObject(Heap::kNew, &heaps); }
+    { heap->PrintToJSONObject(Heap::kOld, &heaps); }
   }
   {
     JSONArray arr(&obj, "members");
diff --git a/runtime/vm/class_table.h b/runtime/vm/class_table.h
index 1ffee71..b1721ed 100644
--- a/runtime/vm/class_table.h
+++ b/runtime/vm/class_table.h
@@ -16,12 +16,13 @@
 class JSONArray;
 class JSONObject;
 class JSONStream;
-template<typename T> class MallocGrowableArray;
+template <typename T>
+class MallocGrowableArray;
 class ObjectPointerVisitor;
 class RawClass;
 
 #ifndef PRODUCT
-template<typename T>
+template <typename T>
 class AllocStats {
  public:
   T new_count;
@@ -104,12 +105,8 @@
     return OFFSET_OF(ClassHeapStats, recent) +
            OFFSET_OF(AllocStats<intptr_t>, old_size);
   }
-  static intptr_t state_offset() {
-    return OFFSET_OF(ClassHeapStats, state_);
-  }
-  static intptr_t TraceAllocationMask() {
-    return (1 << kTraceAllocationBit);
-  }
+  static intptr_t state_offset() { return OFFSET_OF(ClassHeapStats, state_); }
+  static intptr_t TraceAllocationMask() { return (1 << kTraceAllocationBit); }
 
   void Initialize();
   void ResetAtNewGC();
@@ -122,9 +119,7 @@
 #endif
   void Verify();
 
-  bool trace_allocation() const {
-    return TraceAllocationBit::decode(state_);
-  }
+  bool trace_allocation() const { return TraceAllocationBit::decode(state_); }
 
   void set_trace_allocation(bool trace_allocation) {
     state_ = TraceAllocationBit::update(trace_allocation, state_);
@@ -135,8 +130,8 @@
     kTraceAllocationBit = 0,
   };
 
-  class TraceAllocationBit :
-      public BitField<intptr_t, bool, kTraceAllocationBit, 1> {};
+  class TraceAllocationBit
+      : public BitField<intptr_t, bool, kTraceAllocationBit, 1> {};
 
   // Recent old at start of last new GC (used to compute promoted_*).
   intptr_t old_pre_new_gc_count_;
@@ -160,9 +155,7 @@
     return table_[index];
   }
 
-  void SetAt(intptr_t index, RawClass* raw_cls) {
-    table_[index] = raw_cls;
-  }
+  void SetAt(intptr_t index, RawClass* raw_cls) { table_[index] = raw_cls; }
 
   bool IsValidIndex(intptr_t index) const {
     return (index > 0) && (index < top_);
@@ -202,9 +195,7 @@
   void Print();
 
   // Used by the generated code.
-  static intptr_t table_offset() {
-    return OFFSET_OF(ClassTable, table_);
-  }
+  static intptr_t table_offset() { return OFFSET_OF(ClassTable, table_); }
 
   // Used by the generated code.
   static intptr_t ClassOffsetFor(intptr_t cid);
diff --git a/runtime/vm/clustered_snapshot.cc b/runtime/vm/clustered_snapshot.cc
index baff543..396e6ad 100644
--- a/runtime/vm/clustered_snapshot.cc
+++ b/runtime/vm/clustered_snapshot.cc
@@ -25,8 +25,8 @@
 
 static RawObject* AllocateUninitialized(PageSpace* old_space, intptr_t size) {
   ASSERT(Utils::IsAligned(size, kObjectAlignment));
-  uword address = old_space->TryAllocateDataBumpLocked(size,
-                                                       PageSpace::kForceGrowth);
+  uword address =
+      old_space->TryAllocateDataBumpLocked(size, PageSpace::kForceGrowth);
   if (address == 0) {
     OUT_OF_MEMORY();
   }
@@ -52,9 +52,9 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 class ClassSerializationCluster : public SerializationCluster {
  public:
-  explicit ClassSerializationCluster(intptr_t num_cids) :
-      predefined_(kNumPredefinedCids), objects_(num_cids) { }
-  virtual ~ClassSerializationCluster() { }
+  explicit ClassSerializationCluster(intptr_t num_cids)
+      : predefined_(kNumPredefinedCids), objects_(num_cids) {}
+  virtual ~ClassSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawClass* cls = Class::RawCast(object);
@@ -134,8 +134,8 @@
 
 class ClassDeserializationCluster : public DeserializationCluster {
  public:
-  ClassDeserializationCluster() { }
-  virtual ~ClassDeserializationCluster() { }
+  ClassDeserializationCluster() {}
+  virtual ~ClassDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     predefined_start_index_ = d->next_index();
@@ -154,8 +154,7 @@
     start_index_ = d->next_index();
     count = d->Read<int32_t>();
     for (intptr_t i = 0; i < count; i++) {
-      d->AssignRef(AllocateUninitialized(old_space,
-                                         Class::InstanceSize()));
+      d->AssignRef(AllocateUninitialized(old_space, Class::InstanceSize()));
     }
     stop_index_ = d->next_index();
   }
@@ -165,8 +164,7 @@
     bool is_vm_object = d->isolate() == Dart::vm_isolate();
     ClassTable* table = d->isolate()->class_table();
 
-    for (intptr_t id = predefined_start_index_;
-         id < predefined_stop_index_;
+    for (intptr_t id = predefined_start_index_; id < predefined_stop_index_;
          id++) {
       RawClass* cls = reinterpret_cast<RawClass*>(d->Ref(id));
       RawObject** from = cls->from();
@@ -228,12 +226,11 @@
   }
 
   void PostLoad(const Array& refs, Snapshot::Kind kind, Zone* zone) {
-    NOT_IN_PRODUCT(TimelineDurationScope tds(Thread::Current(),
-        Timeline::GetIsolateStream(), "PostLoadClass"));
+    NOT_IN_PRODUCT(TimelineDurationScope tds(
+        Thread::Current(), Timeline::GetIsolateStream(), "PostLoadClass"));
 
     Class& cls = Class::Handle(zone);
-    for (intptr_t i = predefined_start_index_;
-         i < predefined_stop_index_;
+    for (intptr_t i = predefined_start_index_; i < predefined_stop_index_;
          i++) {
       cls ^= refs.At(i);
       cls.RehashConstants(zone);
@@ -253,8 +250,8 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 class UnresolvedClassSerializationCluster : public SerializationCluster {
  public:
-  UnresolvedClassSerializationCluster() { }
-  virtual ~UnresolvedClassSerializationCluster() { }
+  UnresolvedClassSerializationCluster() {}
+  virtual ~UnresolvedClassSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawUnresolvedClass* cls = UnresolvedClass::RawCast(object);
@@ -299,16 +296,16 @@
 
 class UnresolvedClassDeserializationCluster : public DeserializationCluster {
  public:
-  UnresolvedClassDeserializationCluster() { }
-  virtual ~UnresolvedClassDeserializationCluster() { }
+  UnresolvedClassDeserializationCluster() {}
+  virtual ~UnresolvedClassDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
     PageSpace* old_space = d->heap()->old_space();
     intptr_t count = d->Read<int32_t>();
     for (intptr_t i = 0; i < count; i++) {
-      d->AssignRef(AllocateUninitialized(old_space,
-                                         UnresolvedClass::InstanceSize()));
+      d->AssignRef(
+          AllocateUninitialized(old_space, UnresolvedClass::InstanceSize()));
     }
     stop_index_ = d->next_index();
   }
@@ -336,8 +333,8 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 class TypeArgumentsSerializationCluster : public SerializationCluster {
  public:
-  TypeArgumentsSerializationCluster() { }
-  virtual ~TypeArgumentsSerializationCluster() { }
+  TypeArgumentsSerializationCluster() {}
+  virtual ~TypeArgumentsSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawTypeArguments* type_args = TypeArguments::RawCast(object);
@@ -386,8 +383,8 @@
 
 class TypeArgumentsDeserializationCluster : public DeserializationCluster {
  public:
-  TypeArgumentsDeserializationCluster() { }
-  virtual ~TypeArgumentsDeserializationCluster() { }
+  TypeArgumentsDeserializationCluster() {}
+  virtual ~TypeArgumentsDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -428,8 +425,8 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 class PatchClassSerializationCluster : public SerializationCluster {
  public:
-  PatchClassSerializationCluster() { }
-  virtual ~PatchClassSerializationCluster() { }
+  PatchClassSerializationCluster() {}
+  virtual ~PatchClassSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawPatchClass* cls = PatchClass::RawCast(object);
@@ -472,16 +469,16 @@
 
 class PatchClassDeserializationCluster : public DeserializationCluster {
  public:
-  PatchClassDeserializationCluster() { }
-  virtual ~PatchClassDeserializationCluster() { }
+  PatchClassDeserializationCluster() {}
+  virtual ~PatchClassDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
     PageSpace* old_space = d->heap()->old_space();
     intptr_t count = d->Read<int32_t>();
     for (intptr_t i = 0; i < count; i++) {
-      d->AssignRef(AllocateUninitialized(old_space,
-                                         PatchClass::InstanceSize()));
+      d->AssignRef(
+          AllocateUninitialized(old_space, PatchClass::InstanceSize()));
     }
     stop_index_ = d->next_index();
   }
@@ -506,8 +503,8 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 class FunctionSerializationCluster : public SerializationCluster {
  public:
-  FunctionSerializationCluster() { }
-  virtual ~FunctionSerializationCluster() { }
+  FunctionSerializationCluster() {}
+  virtual ~FunctionSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawFunction* func = Function::RawCast(object);
@@ -590,16 +587,15 @@
 
 class FunctionDeserializationCluster : public DeserializationCluster {
  public:
-  FunctionDeserializationCluster() { }
-  virtual ~FunctionDeserializationCluster() { }
+  FunctionDeserializationCluster() {}
+  virtual ~FunctionDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
     PageSpace* old_space = d->heap()->old_space();
     intptr_t count = d->Read<int32_t>();
     for (intptr_t i = 0; i < count; i++) {
-      d->AssignRef(AllocateUninitialized(old_space,
-                                         Function::InstanceSize()));
+      d->AssignRef(AllocateUninitialized(old_space, Function::InstanceSize()));
     }
     stop_index_ = d->next_index();
   }
@@ -625,7 +621,7 @@
         func->ptr()->code_ = reinterpret_cast<RawCode*>(d->ReadRef());
       } else if (kind == Snapshot::kAppWithJIT) {
         NOT_IN_PRECOMPILED(func->ptr()->unoptimized_code_ =
-            reinterpret_cast<RawCode*>(d->ReadRef()));
+                               reinterpret_cast<RawCode*>(d->ReadRef()));
         func->ptr()->code_ = reinterpret_cast<RawCode*>(d->ReadRef());
         func->ptr()->ic_data_array_ = reinterpret_cast<RawArray*>(d->ReadRef());
       }
@@ -657,8 +653,8 @@
   }
 
   void PostLoad(const Array& refs, Snapshot::Kind kind, Zone* zone) {
-    NOT_IN_PRODUCT(TimelineDurationScope tds(Thread::Current(),
-        Timeline::GetIsolateStream(), "PostLoadFunction"));
+    NOT_IN_PRODUCT(TimelineDurationScope tds(
+        Thread::Current(), Timeline::GetIsolateStream(), "PostLoadFunction"));
 
     if (kind == Snapshot::kAppNoJIT) {
       Function& func = Function::Handle(zone);
@@ -699,8 +695,8 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 class ClosureDataSerializationCluster : public SerializationCluster {
  public:
-  ClosureDataSerializationCluster() { }
-  virtual ~ClosureDataSerializationCluster() { }
+  ClosureDataSerializationCluster() {}
+  virtual ~ClosureDataSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawClosureData* data = ClosureData::RawCast(object);
@@ -745,16 +741,16 @@
 
 class ClosureDataDeserializationCluster : public DeserializationCluster {
  public:
-  ClosureDataDeserializationCluster() { }
-  virtual ~ClosureDataDeserializationCluster() { }
+  ClosureDataDeserializationCluster() {}
+  virtual ~ClosureDataDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
     PageSpace* old_space = d->heap()->old_space();
     intptr_t count = d->Read<int32_t>();
     for (intptr_t i = 0; i < count; i++) {
-      d->AssignRef(AllocateUninitialized(old_space,
-                                         ClosureData::InstanceSize()));
+      d->AssignRef(
+          AllocateUninitialized(old_space, ClosureData::InstanceSize()));
     }
     stop_index_ = d->next_index();
   }
@@ -765,8 +761,7 @@
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawClosureData* data = reinterpret_cast<RawClosureData*>(d->Ref(id));
       Deserializer::InitializeHeader(data, kClosureDataCid,
-                                     ClosureData::InstanceSize(),
-                                     is_vm_object);
+                                     ClosureData::InstanceSize(), is_vm_object);
       if (d->kind() == Snapshot::kAppNoJIT) {
         data->ptr()->context_scope_ = ContextScope::null();
       } else {
@@ -784,8 +779,8 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 class RedirectionDataSerializationCluster : public SerializationCluster {
  public:
-  RedirectionDataSerializationCluster() { }
-  virtual ~RedirectionDataSerializationCluster() { }
+  RedirectionDataSerializationCluster() {}
+  virtual ~RedirectionDataSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawRedirectionData* data = RedirectionData::RawCast(object);
@@ -828,16 +823,16 @@
 
 class RedirectionDataDeserializationCluster : public DeserializationCluster {
  public:
-  RedirectionDataDeserializationCluster() { }
-  virtual ~RedirectionDataDeserializationCluster() { }
+  RedirectionDataDeserializationCluster() {}
+  virtual ~RedirectionDataDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
     PageSpace* old_space = d->heap()->old_space();
     intptr_t count = d->Read<int32_t>();
     for (intptr_t i = 0; i < count; i++) {
-      d->AssignRef(AllocateUninitialized(old_space,
-                                         RedirectionData::InstanceSize()));
+      d->AssignRef(
+          AllocateUninitialized(old_space, RedirectionData::InstanceSize()));
     }
     stop_index_ = d->next_index();
   }
@@ -864,8 +859,8 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 class FieldSerializationCluster : public SerializationCluster {
  public:
-  FieldSerializationCluster() { }
-  virtual ~FieldSerializationCluster() { }
+  FieldSerializationCluster() {}
+  virtual ~FieldSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawField* field = Field::RawCast(object);
@@ -973,8 +968,8 @@
 
 class FieldDeserializationCluster : public DeserializationCluster {
  public:
-  FieldDeserializationCluster() { }
-  virtual ~FieldDeserializationCluster() { }
+  FieldDeserializationCluster() {}
+  virtual ~FieldDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -992,8 +987,8 @@
 
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawField* field = reinterpret_cast<RawField*>(d->Ref(id));
-      Deserializer::InitializeHeader(field, kFieldCid,
-                                     Field::InstanceSize(), is_vm_object);
+      Deserializer::InitializeHeader(field, kFieldCid, Field::InstanceSize(),
+                                     is_vm_object);
       RawObject** from = field->from();
       RawObject** to_snapshot = field->to_snapshot(kind);
       RawObject** to = field->to();
@@ -1014,8 +1009,8 @@
   }
 
   void PostLoad(const Array& refs, Snapshot::Kind kind, Zone* zone) {
-    NOT_IN_PRODUCT(TimelineDurationScope tds(Thread::Current(),
-        Timeline::GetIsolateStream(), "PostLoadField"));
+    NOT_IN_PRODUCT(TimelineDurationScope tds(
+        Thread::Current(), Timeline::GetIsolateStream(), "PostLoadField"));
 
     Field& field = Field::Handle(zone);
     if (!FLAG_use_field_guards) {
@@ -1040,8 +1035,8 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 class LiteralTokenSerializationCluster : public SerializationCluster {
  public:
-  LiteralTokenSerializationCluster() { }
-  virtual ~LiteralTokenSerializationCluster() { }
+  LiteralTokenSerializationCluster() {}
+  virtual ~LiteralTokenSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawLiteralToken* token = LiteralToken::RawCast(object);
@@ -1085,16 +1080,16 @@
 
 class LiteralTokenDeserializationCluster : public DeserializationCluster {
  public:
-  LiteralTokenDeserializationCluster() { }
-  virtual ~LiteralTokenDeserializationCluster() { }
+  LiteralTokenDeserializationCluster() {}
+  virtual ~LiteralTokenDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
     PageSpace* old_space = d->heap()->old_space();
     intptr_t count = d->Read<int32_t>();
     for (intptr_t i = 0; i < count; i++) {
-      d->AssignRef(AllocateUninitialized(old_space,
-                                         LiteralToken::InstanceSize()));
+      d->AssignRef(
+          AllocateUninitialized(old_space, LiteralToken::InstanceSize()));
     }
     stop_index_ = d->next_index();
   }
@@ -1104,9 +1099,8 @@
 
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawLiteralToken* token = reinterpret_cast<RawLiteralToken*>(d->Ref(id));
-      Deserializer::InitializeHeader(token, kLiteralTokenCid,
-                                     LiteralToken::InstanceSize(),
-                                     is_vm_object);
+      Deserializer::InitializeHeader(
+          token, kLiteralTokenCid, LiteralToken::InstanceSize(), is_vm_object);
       RawObject** from = token->from();
       RawObject** to = token->to();
       for (RawObject** p = from; p <= to; p++) {
@@ -1121,8 +1115,8 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 class TokenStreamSerializationCluster : public SerializationCluster {
  public:
-  TokenStreamSerializationCluster() { }
-  virtual ~TokenStreamSerializationCluster() { }
+  TokenStreamSerializationCluster() {}
+  virtual ~TokenStreamSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawTokenStream* stream = TokenStream::RawCast(object);
@@ -1165,16 +1159,16 @@
 
 class TokenStreamDeserializationCluster : public DeserializationCluster {
  public:
-  TokenStreamDeserializationCluster() { }
-  virtual ~TokenStreamDeserializationCluster() { }
+  TokenStreamDeserializationCluster() {}
+  virtual ~TokenStreamDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
     PageSpace* old_space = d->heap()->old_space();
     intptr_t count = d->Read<int32_t>();
     for (intptr_t i = 0; i < count; i++) {
-      d->AssignRef(AllocateUninitialized(old_space,
-                                         TokenStream::InstanceSize()));
+      d->AssignRef(
+          AllocateUninitialized(old_space, TokenStream::InstanceSize()));
     }
     stop_index_ = d->next_index();
   }
@@ -1199,8 +1193,8 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 class ScriptSerializationCluster : public SerializationCluster {
  public:
-  ScriptSerializationCluster() { }
-  virtual ~ScriptSerializationCluster() { }
+  ScriptSerializationCluster() {}
+  virtual ~ScriptSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawScript* script = Script::RawCast(object);
@@ -1248,8 +1242,8 @@
 
 class ScriptDeserializationCluster : public DeserializationCluster {
  public:
-  ScriptDeserializationCluster() { }
-  virtual ~ScriptDeserializationCluster() { }
+  ScriptDeserializationCluster() {}
+  virtual ~ScriptDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -1267,8 +1261,8 @@
 
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawScript* script = reinterpret_cast<RawScript*>(d->Ref(id));
-      Deserializer::InitializeHeader(script, kScriptCid,
-                                     Script::InstanceSize(), is_vm_object);
+      Deserializer::InitializeHeader(script, kScriptCid, Script::InstanceSize(),
+                                     is_vm_object);
       RawObject** from = script->from();
       RawObject** to_snapshot = script->to_snapshot(kind);
       RawObject** to = script->to();
@@ -1291,8 +1285,8 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 class LibrarySerializationCluster : public SerializationCluster {
  public:
-  LibrarySerializationCluster() { }
-  virtual ~LibrarySerializationCluster() { }
+  LibrarySerializationCluster() {}
+  virtual ~LibrarySerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawLibrary* lib = Library::RawCast(object);
@@ -1342,8 +1336,8 @@
 
 class LibraryDeserializationCluster : public DeserializationCluster {
  public:
-  LibraryDeserializationCluster() { }
-  virtual ~LibraryDeserializationCluster() { }
+  LibraryDeserializationCluster() {}
+  virtual ~LibraryDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -1360,8 +1354,8 @@
 
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawLibrary* lib = reinterpret_cast<RawLibrary*>(d->Ref(id));
-      Deserializer::InitializeHeader(lib, kLibraryCid,
-                                     Library::InstanceSize(), is_vm_object);
+      Deserializer::InitializeHeader(lib, kLibraryCid, Library::InstanceSize(),
+                                     is_vm_object);
       RawObject** from = lib->from();
       RawObject** to_snapshot = lib->to_snapshot();
       RawObject** to = lib->to();
@@ -1388,8 +1382,8 @@
     // TODO(rmacnak): This is surprisingly slow, roughly 20% of deserialization
     // time for the JIT. Maybe make the lookups happy with a null?
 
-    NOT_IN_PRODUCT(TimelineDurationScope tds(Thread::Current(),
-        Timeline::GetIsolateStream(), "PostLoadLibrary"));
+    NOT_IN_PRODUCT(TimelineDurationScope tds(
+        Thread::Current(), Timeline::GetIsolateStream(), "PostLoadLibrary"));
 
     Library& lib = Library::Handle(zone);
     for (intptr_t i = start_index_; i < stop_index_; i++) {
@@ -1404,8 +1398,8 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 class NamespaceSerializationCluster : public SerializationCluster {
  public:
-  NamespaceSerializationCluster() { }
-  virtual ~NamespaceSerializationCluster() { }
+  NamespaceSerializationCluster() {}
+  virtual ~NamespaceSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawNamespace* ns = Namespace::RawCast(object);
@@ -1448,8 +1442,8 @@
 
 class NamespaceDeserializationCluster : public DeserializationCluster {
  public:
-  NamespaceDeserializationCluster() { }
-  virtual ~NamespaceDeserializationCluster() { }
+  NamespaceDeserializationCluster() {}
+  virtual ~NamespaceDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -1481,8 +1475,8 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 class CodeSerializationCluster : public SerializationCluster {
  public:
-  CodeSerializationCluster() { }
-  virtual ~CodeSerializationCluster() { }
+  CodeSerializationCluster() {}
+  virtual ~CodeSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawCode* code = Code::RawCast(object);
@@ -1525,8 +1519,8 @@
       }
       if (kind == Snapshot::kAppNoJIT) {
         // No disabled code in precompilation.
-        NOT_IN_PRECOMPILED(ASSERT(
-            code->ptr()->instructions_ == code->ptr()->active_instructions_));
+        NOT_IN_PRECOMPILED(ASSERT(code->ptr()->instructions_ ==
+                                  code->ptr()->active_instructions_));
       }
 
       RawInstructions* instr = code->ptr()->instructions_;
@@ -1566,8 +1560,8 @@
 
 class CodeDeserializationCluster : public DeserializationCluster {
  public:
-  CodeDeserializationCluster() { }
-  virtual ~CodeDeserializationCluster() { }
+  CodeDeserializationCluster() {}
+  virtual ~CodeDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -1584,8 +1578,8 @@
 
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawCode* code = reinterpret_cast<RawCode*>(d->Ref(id));
-      Deserializer::InitializeHeader(code, kCodeCid,
-                                     Code::InstanceSize(0), is_vm_object);
+      Deserializer::InitializeHeader(code, kCodeCid, Code::InstanceSize(0),
+                                     is_vm_object);
 
       int32_t text_offset = d->Read<int32_t>();
       RawInstructions* instr = reinterpret_cast<RawInstructions*>(
@@ -1616,8 +1610,7 @@
           reinterpret_cast<RawExceptionHandlers*>(d->ReadRef());
       code->ptr()->pc_descriptors_ =
           reinterpret_cast<RawPcDescriptors*>(d->ReadRef());
-      code->ptr()->stackmaps_ =
-          reinterpret_cast<RawArray*>(d->ReadRef());
+      code->ptr()->stackmaps_ = reinterpret_cast<RawArray*>(d->ReadRef());
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
       if (d->kind() == Snapshot::kAppWithJIT) {
@@ -1656,8 +1649,8 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 class ObjectPoolSerializationCluster : public SerializationCluster {
  public:
-  ObjectPoolSerializationCluster() { }
-  virtual ~ObjectPoolSerializationCluster() { }
+  ObjectPoolSerializationCluster() {}
+  virtual ~ObjectPoolSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawObjectPool* pool = ObjectPool::RawCast(object);
@@ -1713,22 +1706,22 @@
               break;
             }
 #endif
-          s->WriteRef(entry.raw_obj_);
-          break;
-        }
-        case ObjectPool::kImmediate: {
-          s->Write<intptr_t>(entry.raw_value_);
-          break;
-        }
-        case ObjectPool::kNativeEntry: {
-          // Write nothing. Will initialize with the lazy link entry.
+            s->WriteRef(entry.raw_obj_);
+            break;
+          }
+          case ObjectPool::kImmediate: {
+            s->Write<intptr_t>(entry.raw_value_);
+            break;
+          }
+          case ObjectPool::kNativeEntry: {
+// Write nothing. Will initialize with the lazy link entry.
 #if defined(TARGET_ARCH_DBC)
-          UNREACHABLE();   // DBC does not support lazy native call linking.
+            UNREACHABLE();  // DBC does not support lazy native call linking.
 #endif
-          break;
-        }
-        default:
-          UNREACHABLE();
+            break;
+          }
+          default:
+            UNREACHABLE();
         }
       }
     }
@@ -1742,8 +1735,8 @@
 
 class ObjectPoolDeserializationCluster : public DeserializationCluster {
  public:
-  ObjectPoolDeserializationCluster() { }
-  virtual ~ObjectPoolDeserializationCluster() { }
+  ObjectPoolDeserializationCluster() {}
+  virtual ~ObjectPoolDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -1751,8 +1744,8 @@
     intptr_t count = d->Read<int32_t>();
     for (intptr_t i = 0; i < count; i++) {
       intptr_t length = d->Read<int32_t>();
-      d->AssignRef(AllocateUninitialized(old_space,
-                                         ObjectPool::InstanceSize(length)));
+      d->AssignRef(
+          AllocateUninitialized(old_space, ObjectPool::InstanceSize(length)));
     }
     stop_index_ = d->next_index();
   }
@@ -1769,9 +1762,8 @@
                                      is_vm_object);
       info_array->ptr()->length_ = Smi::New(length);
       RawObjectPool* pool = reinterpret_cast<RawObjectPool*>(d->Ref(id + 0));
-      Deserializer::InitializeHeader(pool, kObjectPoolCid,
-                                     ObjectPool::InstanceSize(length),
-                                     is_vm_object);
+      Deserializer::InitializeHeader(
+          pool, kObjectPoolCid, ObjectPool::InstanceSize(length), is_vm_object);
       pool->ptr()->length_ = length;
       pool->ptr()->info_array_ = info_array;
       for (intptr_t j = 0; j < length; j++) {
@@ -1809,8 +1801,8 @@
 // PcDescriptor, Stackmap, OneByteString, TwoByteString
 class RODataSerializationCluster : public SerializationCluster {
  public:
-  explicit RODataSerializationCluster(intptr_t cid) : cid_(cid) { }
-  virtual ~RODataSerializationCluster() { }
+  explicit RODataSerializationCluster(intptr_t cid) : cid_(cid) {}
+  virtual ~RODataSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     objects_.Add(object);
@@ -1820,8 +1812,8 @@
     if (cid_ == kOneByteStringCid) {
       RawOneByteString* str = static_cast<RawOneByteString*>(object);
       if (str->ptr()->hash_ == Smi::New(0)) {
-        intptr_t hash = String::Hash(str->ptr()->data(),
-                                     Smi::Value(str->ptr()->length_));
+        intptr_t hash =
+            String::Hash(str->ptr()->data(), Smi::Value(str->ptr()->length_));
         str->ptr()->hash_ = Smi::New(hash);
       }
       ASSERT(str->ptr()->hash_ != Smi::New(0));
@@ -1861,8 +1853,8 @@
 
 class RODataDeserializationCluster : public DeserializationCluster {
  public:
-  RODataDeserializationCluster() { }
-  virtual ~RODataDeserializationCluster() { }
+  RODataDeserializationCluster() {}
+  virtual ~RODataDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     intptr_t count = d->Read<int32_t>();
@@ -1881,8 +1873,8 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 class ExceptionHandlersSerializationCluster : public SerializationCluster {
  public:
-  ExceptionHandlersSerializationCluster() { }
-  virtual ~ExceptionHandlersSerializationCluster() { }
+  ExceptionHandlersSerializationCluster() {}
+  virtual ~ExceptionHandlersSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawExceptionHandlers* handlers = ExceptionHandlers::RawCast(object);
@@ -1926,8 +1918,8 @@
 
 class ExceptionHandlersDeserializationCluster : public DeserializationCluster {
  public:
-  ExceptionHandlersDeserializationCluster() { }
-  virtual ~ExceptionHandlersDeserializationCluster() { }
+  ExceptionHandlersDeserializationCluster() {}
+  virtual ~ExceptionHandlersDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -1935,8 +1927,8 @@
     intptr_t count = d->Read<int32_t>();
     for (intptr_t i = 0; i < count; i++) {
       intptr_t length = d->Read<int32_t>();
-      d->AssignRef(AllocateUninitialized(old_space,
-          ExceptionHandlers::InstanceSize(length)));
+      d->AssignRef(AllocateUninitialized(
+          old_space, ExceptionHandlers::InstanceSize(length)));
     }
     stop_index_ = d->next_index();
   }
@@ -1966,8 +1958,8 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 class ContextSerializationCluster : public SerializationCluster {
  public:
-  ContextSerializationCluster() { }
-  virtual ~ContextSerializationCluster() { }
+  ContextSerializationCluster() {}
+  virtual ~ContextSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawContext* context = Context::RawCast(object);
@@ -2013,8 +2005,8 @@
 
 class ContextDeserializationCluster : public DeserializationCluster {
  public:
-  ContextDeserializationCluster() { }
-  virtual ~ContextDeserializationCluster() { }
+  ContextDeserializationCluster() {}
+  virtual ~ContextDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -2022,8 +2014,8 @@
     intptr_t count = d->Read<int32_t>();
     for (intptr_t i = 0; i < count; i++) {
       intptr_t length = d->Read<int32_t>();
-      d->AssignRef(AllocateUninitialized(old_space,
-                                         Context::InstanceSize(length)));
+      d->AssignRef(
+          AllocateUninitialized(old_space, Context::InstanceSize(length)));
     }
     stop_index_ = d->next_index();
   }
@@ -2034,9 +2026,8 @@
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawContext* context = reinterpret_cast<RawContext*>(d->Ref(id));
       intptr_t length = d->Read<int32_t>();
-      Deserializer::InitializeHeader(context, kContextCid,
-                                     Context::InstanceSize(length),
-                                     is_vm_object);
+      Deserializer::InitializeHeader(
+          context, kContextCid, Context::InstanceSize(length), is_vm_object);
       context->ptr()->num_variables_ = length;
       context->ptr()->parent_ = reinterpret_cast<RawContext*>(d->ReadRef());
       for (intptr_t j = 0; j < length; j++) {
@@ -2050,8 +2041,8 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 class ContextScopeSerializationCluster : public SerializationCluster {
  public:
-  ContextScopeSerializationCluster() { }
-  virtual ~ContextScopeSerializationCluster() { }
+  ContextScopeSerializationCluster() {}
+  virtual ~ContextScopeSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawContextScope* scope = ContextScope::RawCast(object);
@@ -2100,8 +2091,8 @@
 
 class ContextScopeDeserializationCluster : public DeserializationCluster {
  public:
-  ContextScopeDeserializationCluster() { }
-  virtual ~ContextScopeDeserializationCluster() { }
+  ContextScopeDeserializationCluster() {}
+  virtual ~ContextScopeDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -2109,8 +2100,8 @@
     intptr_t count = d->Read<int32_t>();
     for (intptr_t i = 0; i < count; i++) {
       intptr_t length = d->Read<int32_t>();
-      d->AssignRef(AllocateUninitialized(old_space,
-                                         ContextScope::InstanceSize(length)));
+      d->AssignRef(
+          AllocateUninitialized(old_space, ContextScope::InstanceSize(length)));
     }
     stop_index_ = d->next_index();
   }
@@ -2139,8 +2130,8 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 class UnlinkedCallSerializationCluster : public SerializationCluster {
  public:
-  UnlinkedCallSerializationCluster() { }
-  virtual ~UnlinkedCallSerializationCluster() { }
+  UnlinkedCallSerializationCluster() {}
+  virtual ~UnlinkedCallSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawUnlinkedCall* unlinked = UnlinkedCall::RawCast(object);
@@ -2183,16 +2174,16 @@
 
 class UnlinkedCallDeserializationCluster : public DeserializationCluster {
  public:
-  UnlinkedCallDeserializationCluster() { }
-  virtual ~UnlinkedCallDeserializationCluster() { }
+  UnlinkedCallDeserializationCluster() {}
+  virtual ~UnlinkedCallDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
     PageSpace* old_space = d->heap()->old_space();
     intptr_t count = d->Read<int32_t>();
     for (intptr_t i = 0; i < count; i++) {
-      d->AssignRef(AllocateUninitialized(old_space,
-                                         UnlinkedCall::InstanceSize()));
+      d->AssignRef(
+          AllocateUninitialized(old_space, UnlinkedCall::InstanceSize()));
     }
     stop_index_ = d->next_index();
   }
@@ -2219,8 +2210,8 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 class ICDataSerializationCluster : public SerializationCluster {
  public:
-  ICDataSerializationCluster() { }
-  virtual ~ICDataSerializationCluster() { }
+  ICDataSerializationCluster() {}
+  virtual ~ICDataSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawICData* ic = ICData::RawCast(object);
@@ -2271,8 +2262,8 @@
 
 class ICDataDeserializationCluster : public DeserializationCluster {
  public:
-  ICDataDeserializationCluster() { }
-  virtual ~ICDataDeserializationCluster() { }
+  ICDataDeserializationCluster() {}
+  virtual ~ICDataDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -2290,8 +2281,8 @@
 
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawICData* ic = reinterpret_cast<RawICData*>(d->Ref(id));
-      Deserializer::InitializeHeader(ic, kICDataCid,
-                                     ICData::InstanceSize(), is_vm_object);
+      Deserializer::InitializeHeader(ic, kICDataCid, ICData::InstanceSize(),
+                                     is_vm_object);
       RawObject** from = ic->from();
       RawObject** to_snapshot = ic->to_snapshot(kind);
       RawObject** to = ic->to();
@@ -2314,8 +2305,8 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 class MegamorphicCacheSerializationCluster : public SerializationCluster {
  public:
-  MegamorphicCacheSerializationCluster() { }
-  virtual ~MegamorphicCacheSerializationCluster() { }
+  MegamorphicCacheSerializationCluster() {}
+  virtual ~MegamorphicCacheSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawMegamorphicCache* cache = MegamorphicCache::RawCast(object);
@@ -2359,16 +2350,16 @@
 
 class MegamorphicCacheDeserializationCluster : public DeserializationCluster {
  public:
-  MegamorphicCacheDeserializationCluster() { }
-  virtual ~MegamorphicCacheDeserializationCluster() { }
+  MegamorphicCacheDeserializationCluster() {}
+  virtual ~MegamorphicCacheDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
     PageSpace* old_space = d->heap()->old_space();
     intptr_t count = d->Read<int32_t>();
     for (intptr_t i = 0; i < count; i++) {
-      d->AssignRef(AllocateUninitialized(old_space,
-                                         MegamorphicCache::InstanceSize()));
+      d->AssignRef(
+          AllocateUninitialized(old_space, MegamorphicCache::InstanceSize()));
     }
     stop_index_ = d->next_index();
   }
@@ -2378,7 +2369,7 @@
 
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawMegamorphicCache* cache =
-            reinterpret_cast<RawMegamorphicCache*>(d->Ref(id));
+          reinterpret_cast<RawMegamorphicCache*>(d->Ref(id));
       Deserializer::InitializeHeader(cache, kMegamorphicCacheCid,
                                      MegamorphicCache::InstanceSize(),
                                      is_vm_object);
@@ -2396,8 +2387,8 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 class SubtypeTestCacheSerializationCluster : public SerializationCluster {
  public:
-  SubtypeTestCacheSerializationCluster() { }
-  virtual ~SubtypeTestCacheSerializationCluster() { }
+  SubtypeTestCacheSerializationCluster() {}
+  virtual ~SubtypeTestCacheSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawSubtypeTestCache* cache = SubtypeTestCache::RawCast(object);
@@ -2431,16 +2422,16 @@
 
 class SubtypeTestCacheDeserializationCluster : public DeserializationCluster {
  public:
-  SubtypeTestCacheDeserializationCluster() { }
-  virtual ~SubtypeTestCacheDeserializationCluster() { }
+  SubtypeTestCacheDeserializationCluster() {}
+  virtual ~SubtypeTestCacheDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
     PageSpace* old_space = d->heap()->old_space();
     intptr_t count = d->Read<int32_t>();
     for (intptr_t i = 0; i < count; i++) {
-      d->AssignRef(AllocateUninitialized(old_space,
-                                         SubtypeTestCache::InstanceSize()));
+      d->AssignRef(
+          AllocateUninitialized(old_space, SubtypeTestCache::InstanceSize()));
     }
     stop_index_ = d->next_index();
   }
@@ -2463,8 +2454,8 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 class LanguageErrorSerializationCluster : public SerializationCluster {
  public:
-  LanguageErrorSerializationCluster() { }
-  virtual ~LanguageErrorSerializationCluster() { }
+  LanguageErrorSerializationCluster() {}
+  virtual ~LanguageErrorSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawLanguageError* error = LanguageError::RawCast(object);
@@ -2510,16 +2501,16 @@
 
 class LanguageErrorDeserializationCluster : public DeserializationCluster {
  public:
-  LanguageErrorDeserializationCluster() { }
-  virtual ~LanguageErrorDeserializationCluster() { }
+  LanguageErrorDeserializationCluster() {}
+  virtual ~LanguageErrorDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
     PageSpace* old_space = d->heap()->old_space();
     intptr_t count = d->Read<int32_t>();
     for (intptr_t i = 0; i < count; i++) {
-      d->AssignRef(AllocateUninitialized(old_space,
-                                         LanguageError::InstanceSize()));
+      d->AssignRef(
+          AllocateUninitialized(old_space, LanguageError::InstanceSize()));
     }
     stop_index_ = d->next_index();
   }
@@ -2548,8 +2539,8 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 class UnhandledExceptionSerializationCluster : public SerializationCluster {
  public:
-  UnhandledExceptionSerializationCluster() { }
-  virtual ~UnhandledExceptionSerializationCluster() { }
+  UnhandledExceptionSerializationCluster() {}
+  virtual ~UnhandledExceptionSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawUnhandledException* exception = UnhandledException::RawCast(object);
@@ -2592,16 +2583,16 @@
 
 class UnhandledExceptionDeserializationCluster : public DeserializationCluster {
  public:
-  UnhandledExceptionDeserializationCluster() { }
-  virtual ~UnhandledExceptionDeserializationCluster() { }
+  UnhandledExceptionDeserializationCluster() {}
+  virtual ~UnhandledExceptionDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
     PageSpace* old_space = d->heap()->old_space();
     intptr_t count = d->Read<int32_t>();
     for (intptr_t i = 0; i < count; i++) {
-      d->AssignRef(AllocateUninitialized(old_space,
-                                         UnhandledException::InstanceSize()));
+      d->AssignRef(
+          AllocateUninitialized(old_space, UnhandledException::InstanceSize()));
     }
     stop_index_ = d->next_index();
   }
@@ -2635,7 +2626,7 @@
     ASSERT(next_field_offset_in_words_ > 0);
     ASSERT(instance_size_in_words_ > 0);
   }
-  virtual ~InstanceSerializationCluster() { }
+  virtual ~InstanceSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawInstance* instance = Instance::RawCast(object);
@@ -2692,8 +2683,8 @@
 
 class InstanceDeserializationCluster : public DeserializationCluster {
  public:
-  explicit InstanceDeserializationCluster(intptr_t cid) : cid_(cid) { }
-  virtual ~InstanceDeserializationCluster() { }
+  explicit InstanceDeserializationCluster(intptr_t cid) : cid_(cid) {}
+  virtual ~InstanceDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -2718,8 +2709,7 @@
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawInstance* instance = reinterpret_cast<RawInstance*>(d->Ref(id));
       bool is_canonical = d->Read<bool>();
-      Deserializer::InitializeHeader(instance, cid_,
-                                     instance_size,
+      Deserializer::InitializeHeader(instance, cid_, instance_size,
                                      is_vm_object, is_canonical);
       intptr_t offset = Instance::NextFieldOffset();
       while (offset < next_field_offset) {
@@ -2748,8 +2738,8 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 class LibraryPrefixSerializationCluster : public SerializationCluster {
  public:
-  LibraryPrefixSerializationCluster() { }
-  virtual ~LibraryPrefixSerializationCluster() { }
+  LibraryPrefixSerializationCluster() {}
+  virtual ~LibraryPrefixSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawLibraryPrefix* prefix = LibraryPrefix::RawCast(object);
@@ -2794,16 +2784,16 @@
 
 class LibraryPrefixDeserializationCluster : public DeserializationCluster {
  public:
-  LibraryPrefixDeserializationCluster() { }
-  virtual ~LibraryPrefixDeserializationCluster() { }
+  LibraryPrefixDeserializationCluster() {}
+  virtual ~LibraryPrefixDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
     PageSpace* old_space = d->heap()->old_space();
     intptr_t count = d->Read<int32_t>();
     for (intptr_t i = 0; i < count; i++) {
-      d->AssignRef(AllocateUninitialized(old_space,
-                                         LibraryPrefix::InstanceSize()));
+      d->AssignRef(
+          AllocateUninitialized(old_space, LibraryPrefix::InstanceSize()));
     }
     stop_index_ = d->next_index();
   }
@@ -2833,8 +2823,8 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 class TypeSerializationCluster : public SerializationCluster {
  public:
-  TypeSerializationCluster() { }
-  virtual ~TypeSerializationCluster() { }
+  TypeSerializationCluster() {}
+  virtual ~TypeSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawType* type = Type::RawCast(object);
@@ -2911,8 +2901,8 @@
 
 class TypeDeserializationCluster : public DeserializationCluster {
  public:
-  TypeDeserializationCluster() { }
-  virtual ~TypeDeserializationCluster() { }
+  TypeDeserializationCluster() {}
+  virtual ~TypeDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     canonical_start_index_ = d->next_index();
@@ -2934,12 +2924,11 @@
   void ReadFill(Deserializer* d) {
     bool is_vm_object = d->isolate() == Dart::vm_isolate();
 
-    for (intptr_t id = canonical_start_index_;
-         id < canonical_stop_index_;
+    for (intptr_t id = canonical_start_index_; id < canonical_stop_index_;
          id++) {
       RawType* type = reinterpret_cast<RawType*>(d->Ref(id));
-      Deserializer::InitializeHeader(type, kTypeCid,
-                                     Type::InstanceSize(), is_vm_object, true);
+      Deserializer::InitializeHeader(type, kTypeCid, Type::InstanceSize(),
+                                     is_vm_object, true);
       RawObject** from = type->from();
       RawObject** to = type->to();
       for (RawObject** p = from; p <= to; p++) {
@@ -2951,8 +2940,8 @@
 
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawType* type = reinterpret_cast<RawType*>(d->Ref(id));
-      Deserializer::InitializeHeader(type, kTypeCid,
-                                     Type::InstanceSize(), is_vm_object);
+      Deserializer::InitializeHeader(type, kTypeCid, Type::InstanceSize(),
+                                     is_vm_object);
       RawObject** from = type->from();
       RawObject** to = type->to();
       for (RawObject** p = from; p <= to; p++) {
@@ -2972,8 +2961,8 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 class TypeRefSerializationCluster : public SerializationCluster {
  public:
-  TypeRefSerializationCluster() { }
-  virtual ~TypeRefSerializationCluster() { }
+  TypeRefSerializationCluster() {}
+  virtual ~TypeRefSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawTypeRef* type = TypeRef::RawCast(object);
@@ -3016,8 +3005,8 @@
 
 class TypeRefDeserializationCluster : public DeserializationCluster {
  public:
-  TypeRefDeserializationCluster() { }
-  virtual ~TypeRefDeserializationCluster() { }
+  TypeRefDeserializationCluster() {}
+  virtual ~TypeRefDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -3034,8 +3023,8 @@
 
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawTypeRef* type = reinterpret_cast<RawTypeRef*>(d->Ref(id));
-      Deserializer::InitializeHeader(type, kTypeRefCid,
-                                     TypeRef::InstanceSize(), is_vm_object);
+      Deserializer::InitializeHeader(type, kTypeRefCid, TypeRef::InstanceSize(),
+                                     is_vm_object);
       RawObject** from = type->from();
       RawObject** to = type->to();
       for (RawObject** p = from; p <= to; p++) {
@@ -3049,8 +3038,8 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 class TypeParameterSerializationCluster : public SerializationCluster {
  public:
-  TypeParameterSerializationCluster() { }
-  virtual ~TypeParameterSerializationCluster() { }
+  TypeParameterSerializationCluster() {}
+  virtual ~TypeParameterSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawTypeParameter* type = TypeParameter::RawCast(object);
@@ -3099,16 +3088,16 @@
 
 class TypeParameterDeserializationCluster : public DeserializationCluster {
  public:
-  TypeParameterDeserializationCluster() { }
-  virtual ~TypeParameterDeserializationCluster() { }
+  TypeParameterDeserializationCluster() {}
+  virtual ~TypeParameterDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
     PageSpace* old_space = d->heap()->old_space();
     intptr_t count = d->Read<int32_t>();
     for (intptr_t i = 0; i < count; i++) {
-      d->AssignRef(AllocateUninitialized(old_space,
-                                         TypeParameter::InstanceSize()));
+      d->AssignRef(
+          AllocateUninitialized(old_space, TypeParameter::InstanceSize()));
     }
     stop_index_ = d->next_index();
   }
@@ -3118,9 +3107,8 @@
 
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawTypeParameter* type = reinterpret_cast<RawTypeParameter*>(d->Ref(id));
-      Deserializer::InitializeHeader(type, kTypeParameterCid,
-                                     TypeParameter::InstanceSize(),
-                                     is_vm_object);
+      Deserializer::InitializeHeader(
+          type, kTypeParameterCid, TypeParameter::InstanceSize(), is_vm_object);
       RawObject** from = type->from();
       RawObject** to = type->to();
       for (RawObject** p = from; p <= to; p++) {
@@ -3139,8 +3127,8 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 class BoundedTypeSerializationCluster : public SerializationCluster {
  public:
-  BoundedTypeSerializationCluster() { }
-  virtual ~BoundedTypeSerializationCluster() { }
+  BoundedTypeSerializationCluster() {}
+  virtual ~BoundedTypeSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawBoundedType* type = BoundedType::RawCast(object);
@@ -3183,16 +3171,16 @@
 
 class BoundedTypeDeserializationCluster : public DeserializationCluster {
  public:
-  BoundedTypeDeserializationCluster() { }
-  virtual ~BoundedTypeDeserializationCluster() { }
+  BoundedTypeDeserializationCluster() {}
+  virtual ~BoundedTypeDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
     PageSpace* old_space = d->heap()->old_space();
     intptr_t count = d->Read<int32_t>();
     for (intptr_t i = 0; i < count; i++) {
-      d->AssignRef(AllocateUninitialized(old_space,
-                                         BoundedType::InstanceSize()));
+      d->AssignRef(
+          AllocateUninitialized(old_space, BoundedType::InstanceSize()));
     }
     stop_index_ = d->next_index();
   }
@@ -3217,8 +3205,8 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 class ClosureSerializationCluster : public SerializationCluster {
  public:
-  ClosureSerializationCluster() { }
-  virtual ~ClosureSerializationCluster() { }
+  ClosureSerializationCluster() {}
+  virtual ~ClosureSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawClosure* closure = Closure::RawCast(object);
@@ -3262,8 +3250,8 @@
 
 class ClosureDeserializationCluster : public DeserializationCluster {
  public:
-  ClosureDeserializationCluster() { }
-  virtual ~ClosureDeserializationCluster() { }
+  ClosureDeserializationCluster() {}
+  virtual ~ClosureDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -3282,8 +3270,8 @@
       RawClosure* closure = reinterpret_cast<RawClosure*>(d->Ref(id));
       bool is_canonical = d->Read<bool>();
       Deserializer::InitializeHeader(closure, kClosureCid,
-                                     Closure::InstanceSize(),
-                                     is_vm_object, is_canonical);
+                                     Closure::InstanceSize(), is_vm_object,
+                                     is_canonical);
       RawObject** from = closure->from();
       RawObject** to = closure->to();
       for (RawObject** p = from; p <= to; p++) {
@@ -3297,8 +3285,8 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 class MintSerializationCluster : public SerializationCluster {
  public:
-  MintSerializationCluster() { }
-  virtual ~MintSerializationCluster() { }
+  MintSerializationCluster() {}
+  virtual ~MintSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     if (!object->IsHeapObject()) {
@@ -3328,7 +3316,7 @@
     }
   }
 
-  void WriteFill(Serializer* s) { }
+  void WriteFill(Serializer* s) {}
 
  private:
   GrowableArray<RawSmi*> smis_;
@@ -3339,8 +3327,8 @@
 
 class MintDeserializationCluster : public DeserializationCluster {
  public:
-  MintDeserializationCluster() { }
-  virtual ~MintDeserializationCluster() { }
+  MintDeserializationCluster() {}
+  virtual ~MintDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     PageSpace* old_space = d->heap()->old_space();
@@ -3356,8 +3344,7 @@
       } else {
         RawMint* mint = static_cast<RawMint*>(
             AllocateUninitialized(old_space, Mint::InstanceSize()));
-        Deserializer::InitializeHeader(mint, kMintCid,
-                                       Mint::InstanceSize(),
+        Deserializer::InitializeHeader(mint, kMintCid, Mint::InstanceSize(),
                                        is_vm_object, is_canonical);
         mint->ptr()->value_ = value;
         d->AssignRef(mint);
@@ -3366,11 +3353,11 @@
     stop_index_ = d->next_index();
   }
 
-  void ReadFill(Deserializer* d) { }
+  void ReadFill(Deserializer* d) {}
 
   void PostLoad(const Array& refs, Snapshot::Kind kind, Zone* zone) {
-    NOT_IN_PRODUCT(TimelineDurationScope tds(Thread::Current(),
-        Timeline::GetIsolateStream(), "PostLoadMint"));
+    NOT_IN_PRODUCT(TimelineDurationScope tds(
+        Thread::Current(), Timeline::GetIsolateStream(), "PostLoadMint"));
 
     const GrowableObjectArray& new_constants =
         GrowableObjectArray::Handle(zone, GrowableObjectArray::New());
@@ -3383,8 +3370,8 @@
     }
     const Array& constants_array =
         Array::Handle(zone, Array::MakeArray(new_constants));
-    const Class& mint_cls = Class::Handle(zone,
-        Isolate::Current()->object_store()->mint_class());
+    const Class& mint_cls =
+        Class::Handle(zone, Isolate::Current()->object_store()->mint_class());
     mint_cls.set_constants(constants_array);
   }
 };
@@ -3393,8 +3380,8 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 class BigintSerializationCluster : public SerializationCluster {
  public:
-  BigintSerializationCluster() { }
-  virtual ~BigintSerializationCluster() { }
+  BigintSerializationCluster() {}
+  virtual ~BigintSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawBigint* bigint = Bigint::RawCast(object);
@@ -3438,8 +3425,8 @@
 
 class BigintDeserializationCluster : public DeserializationCluster {
  public:
-  BigintDeserializationCluster() { }
-  virtual ~BigintDeserializationCluster() { }
+  BigintDeserializationCluster() {}
+  virtual ~BigintDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -3457,8 +3444,7 @@
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawBigint* bigint = reinterpret_cast<RawBigint*>(d->Ref(id));
       bool is_canonical = d->Read<bool>();
-      Deserializer::InitializeHeader(bigint, kBigintCid,
-                                     Bigint::InstanceSize(),
+      Deserializer::InitializeHeader(bigint, kBigintCid, Bigint::InstanceSize(),
                                      is_vm_object, is_canonical);
       RawObject** from = bigint->from();
       RawObject** to = bigint->to();
@@ -3473,8 +3459,8 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 class DoubleSerializationCluster : public SerializationCluster {
  public:
-  DoubleSerializationCluster() { }
-  virtual ~DoubleSerializationCluster() { }
+  DoubleSerializationCluster() {}
+  virtual ~DoubleSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawDouble* dbl = Double::RawCast(object);
@@ -3508,8 +3494,8 @@
 
 class DoubleDeserializationCluster : public DeserializationCluster {
  public:
-  DoubleDeserializationCluster() { }
-  virtual ~DoubleDeserializationCluster() { }
+  DoubleDeserializationCluster() {}
+  virtual ~DoubleDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -3527,8 +3513,7 @@
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawDouble* dbl = reinterpret_cast<RawDouble*>(d->Ref(id));
       bool is_canonical = d->Read<bool>();
-      Deserializer::InitializeHeader(dbl, kDoubleCid,
-                                     Double::InstanceSize(),
+      Deserializer::InitializeHeader(dbl, kDoubleCid, Double::InstanceSize(),
                                      is_vm_object, is_canonical);
       dbl->ptr()->value_ = d->Read<double>();
     }
@@ -3539,8 +3524,8 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 class GrowableObjectArraySerializationCluster : public SerializationCluster {
  public:
-  GrowableObjectArraySerializationCluster() { }
-  virtual ~GrowableObjectArraySerializationCluster() { }
+  GrowableObjectArraySerializationCluster() {}
+  virtual ~GrowableObjectArraySerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawGrowableObjectArray* array = GrowableObjectArray::RawCast(object);
@@ -3585,8 +3570,8 @@
 class GrowableObjectArrayDeserializationCluster
     : public DeserializationCluster {
  public:
-  GrowableObjectArrayDeserializationCluster() { }
-  virtual ~GrowableObjectArrayDeserializationCluster() { }
+  GrowableObjectArrayDeserializationCluster() {}
+  virtual ~GrowableObjectArrayDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -3622,8 +3607,8 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 class TypedDataSerializationCluster : public SerializationCluster {
  public:
-  explicit TypedDataSerializationCluster(intptr_t cid) : cid_(cid) { }
-  virtual ~TypedDataSerializationCluster() { }
+  explicit TypedDataSerializationCluster(intptr_t cid) : cid_(cid) {}
+  virtual ~TypedDataSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawTypedData* data = TypedData::RawCast(object);
@@ -3664,8 +3649,8 @@
 
 class TypedDataDeserializationCluster : public DeserializationCluster {
  public:
-  explicit TypedDataDeserializationCluster(intptr_t cid) : cid_(cid) { }
-  virtual ~TypedDataDeserializationCluster() { }
+  explicit TypedDataDeserializationCluster(intptr_t cid) : cid_(cid) {}
+  virtual ~TypedDataDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -3674,8 +3659,8 @@
     intptr_t element_size = TypedData::ElementSizeInBytes(cid_);
     for (intptr_t i = 0; i < count; i++) {
       intptr_t length = d->Read<int32_t>();
-      d->AssignRef(AllocateUninitialized(old_space,
-          TypedData::InstanceSize(length * element_size)));
+      d->AssignRef(AllocateUninitialized(
+          old_space, TypedData::InstanceSize(length * element_size)));
     }
     stop_index_ = d->next_index();
   }
@@ -3706,8 +3691,8 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 class ExternalTypedDataSerializationCluster : public SerializationCluster {
  public:
-  explicit ExternalTypedDataSerializationCluster(intptr_t cid) : cid_(cid) { }
-  virtual ~ExternalTypedDataSerializationCluster() { }
+  explicit ExternalTypedDataSerializationCluster(intptr_t cid) : cid_(cid) {}
+  virtual ~ExternalTypedDataSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawExternalTypedData* data = ExternalTypedData::RawCast(object);
@@ -3746,16 +3731,16 @@
 
 class ExternalTypedDataDeserializationCluster : public DeserializationCluster {
  public:
-  explicit ExternalTypedDataDeserializationCluster(intptr_t cid) : cid_(cid) { }
-  virtual ~ExternalTypedDataDeserializationCluster() { }
+  explicit ExternalTypedDataDeserializationCluster(intptr_t cid) : cid_(cid) {}
+  virtual ~ExternalTypedDataDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
     PageSpace* old_space = d->heap()->old_space();
     intptr_t count = d->Read<int32_t>();
     for (intptr_t i = 0; i < count; i++) {
-      d->AssignRef(AllocateUninitialized(old_space,
-                                         ExternalTypedData::InstanceSize()));
+      d->AssignRef(
+          AllocateUninitialized(old_space, ExternalTypedData::InstanceSize()));
     }
     stop_index_ = d->next_index();
   }
@@ -3768,9 +3753,8 @@
       RawExternalTypedData* data =
           reinterpret_cast<RawExternalTypedData*>(d->Ref(id));
       intptr_t length = d->Read<int32_t>();
-      Deserializer::InitializeHeader(data, cid_,
-                                     ExternalTypedData::InstanceSize(),
-                                     is_vm_object);
+      Deserializer::InitializeHeader(
+          data, cid_, ExternalTypedData::InstanceSize(), is_vm_object);
       data->ptr()->length_ = Smi::New(length);
       data->ptr()->data_ = const_cast<uint8_t*>(d->CurrentBufferAddress());
       d->Advance(length * element_size);
@@ -3786,8 +3770,8 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 class StacktraceSerializationCluster : public SerializationCluster {
  public:
-  StacktraceSerializationCluster() { }
-  virtual ~StacktraceSerializationCluster() { }
+  StacktraceSerializationCluster() {}
+  virtual ~StacktraceSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawStacktrace* trace = Stacktrace::RawCast(object);
@@ -3830,16 +3814,16 @@
 
 class StacktraceDeserializationCluster : public DeserializationCluster {
  public:
-  StacktraceDeserializationCluster() { }
-  virtual ~StacktraceDeserializationCluster() { }
+  StacktraceDeserializationCluster() {}
+  virtual ~StacktraceDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
     PageSpace* old_space = d->heap()->old_space();
     intptr_t count = d->Read<int32_t>();
     for (intptr_t i = 0; i < count; i++) {
-      d->AssignRef(AllocateUninitialized(old_space,
-                                         Stacktrace::InstanceSize()));
+      d->AssignRef(
+          AllocateUninitialized(old_space, Stacktrace::InstanceSize()));
     }
     stop_index_ = d->next_index();
   }
@@ -3864,8 +3848,8 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 class RegExpSerializationCluster : public SerializationCluster {
  public:
-  RegExpSerializationCluster() { }
-  virtual ~RegExpSerializationCluster() { }
+  RegExpSerializationCluster() {}
+  virtual ~RegExpSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawRegExp* regexp = RegExp::RawCast(object);
@@ -3911,16 +3895,15 @@
 
 class RegExpDeserializationCluster : public DeserializationCluster {
  public:
-  RegExpDeserializationCluster() { }
-  virtual ~RegExpDeserializationCluster() { }
+  RegExpDeserializationCluster() {}
+  virtual ~RegExpDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
     PageSpace* old_space = d->heap()->old_space();
     intptr_t count = d->Read<int32_t>();
     for (intptr_t i = 0; i < count; i++) {
-      d->AssignRef(AllocateUninitialized(old_space,
-                                         RegExp::InstanceSize()));
+      d->AssignRef(AllocateUninitialized(old_space, RegExp::InstanceSize()));
     }
     stop_index_ = d->next_index();
   }
@@ -3930,8 +3913,8 @@
 
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawRegExp* regexp = reinterpret_cast<RawRegExp*>(d->Ref(id));
-      Deserializer::InitializeHeader(regexp, kRegExpCid,
-                                     RegExp::InstanceSize(), is_vm_object);
+      Deserializer::InitializeHeader(regexp, kRegExpCid, RegExp::InstanceSize(),
+                                     is_vm_object);
       RawObject** from = regexp->from();
       RawObject** to = regexp->to();
       for (RawObject** p = from; p <= to; p++) {
@@ -3948,8 +3931,8 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 class WeakPropertySerializationCluster : public SerializationCluster {
  public:
-  WeakPropertySerializationCluster() { }
-  virtual ~WeakPropertySerializationCluster() { }
+  WeakPropertySerializationCluster() {}
+  virtual ~WeakPropertySerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawWeakProperty* property = WeakProperty::RawCast(object);
@@ -3992,16 +3975,16 @@
 
 class WeakPropertyDeserializationCluster : public DeserializationCluster {
  public:
-  WeakPropertyDeserializationCluster() { }
-  virtual ~WeakPropertyDeserializationCluster() { }
+  WeakPropertyDeserializationCluster() {}
+  virtual ~WeakPropertyDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
     PageSpace* old_space = d->heap()->old_space();
     intptr_t count = d->Read<int32_t>();
     for (intptr_t i = 0; i < count; i++) {
-      d->AssignRef(AllocateUninitialized(old_space,
-                                         WeakProperty::InstanceSize()));
+      d->AssignRef(
+          AllocateUninitialized(old_space, WeakProperty::InstanceSize()));
     }
     stop_index_ = d->next_index();
   }
@@ -4028,8 +4011,8 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 class LinkedHashMapSerializationCluster : public SerializationCluster {
  public:
-  LinkedHashMapSerializationCluster() { }
-  virtual ~LinkedHashMapSerializationCluster() { }
+  LinkedHashMapSerializationCluster() {}
+  virtual ~LinkedHashMapSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawLinkedHashMap* map = LinkedHashMap::RawCast(object);
@@ -4096,16 +4079,16 @@
 
 class LinkedHashMapDeserializationCluster : public DeserializationCluster {
  public:
-  LinkedHashMapDeserializationCluster() { }
-  virtual ~LinkedHashMapDeserializationCluster() { }
+  LinkedHashMapDeserializationCluster() {}
+  virtual ~LinkedHashMapDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
     PageSpace* old_space = d->heap()->old_space();
     intptr_t count = d->Read<int32_t>();
     for (intptr_t i = 0; i < count; i++) {
-      d->AssignRef(AllocateUninitialized(old_space,
-                                         LinkedHashMap::InstanceSize()));
+      d->AssignRef(
+          AllocateUninitialized(old_space, LinkedHashMap::InstanceSize()));
     }
     stop_index_ = d->next_index();
   }
@@ -4156,8 +4139,8 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 class ArraySerializationCluster : public SerializationCluster {
  public:
-  explicit ArraySerializationCluster(intptr_t cid) : cid_(cid) { }
-  virtual ~ArraySerializationCluster() { }
+  explicit ArraySerializationCluster(intptr_t cid) : cid_(cid) {}
+  virtual ~ArraySerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawArray* array = Array::RawCast(object);
@@ -4205,8 +4188,8 @@
 
 class ArrayDeserializationCluster : public DeserializationCluster {
  public:
-  explicit ArrayDeserializationCluster(intptr_t cid) : cid_(cid) { }
-  virtual ~ArrayDeserializationCluster() { }
+  explicit ArrayDeserializationCluster(intptr_t cid) : cid_(cid) {}
+  virtual ~ArrayDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -4214,8 +4197,8 @@
     intptr_t count = d->Read<int32_t>();
     for (intptr_t i = 0; i < count; i++) {
       intptr_t length = d->Read<int32_t>();
-      d->AssignRef(AllocateUninitialized(old_space,
-                                         Array::InstanceSize(length)));
+      d->AssignRef(
+          AllocateUninitialized(old_space, Array::InstanceSize(length)));
     }
     stop_index_ = d->next_index();
   }
@@ -4227,8 +4210,7 @@
       RawArray* array = reinterpret_cast<RawArray*>(d->Ref(id));
       intptr_t length = d->Read<int32_t>();
       bool is_canonical = d->Read<bool>();
-      Deserializer::InitializeHeader(array, cid_,
-                                     Array::InstanceSize(length),
+      Deserializer::InitializeHeader(array, cid_, Array::InstanceSize(length),
                                      is_vm_object, is_canonical);
       array->ptr()->type_arguments_ =
           reinterpret_cast<RawTypeArguments*>(d->ReadRef());
@@ -4247,8 +4229,8 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 class OneByteStringSerializationCluster : public SerializationCluster {
  public:
-  OneByteStringSerializationCluster() { }
-  virtual ~OneByteStringSerializationCluster() { }
+  OneByteStringSerializationCluster() {}
+  virtual ~OneByteStringSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawOneByteString* str = reinterpret_cast<RawOneByteString*>(object);
@@ -4288,8 +4270,8 @@
 
 class OneByteStringDeserializationCluster : public DeserializationCluster {
  public:
-  OneByteStringDeserializationCluster() { }
-  virtual ~OneByteStringDeserializationCluster() { }
+  OneByteStringDeserializationCluster() {}
+  virtual ~OneByteStringDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -4326,8 +4308,8 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 class TwoByteStringSerializationCluster : public SerializationCluster {
  public:
-  TwoByteStringSerializationCluster() { }
-  virtual ~TwoByteStringSerializationCluster() { }
+  TwoByteStringSerializationCluster() {}
+  virtual ~TwoByteStringSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawTwoByteString* str = reinterpret_cast<RawTwoByteString*>(object);
@@ -4367,8 +4349,8 @@
 
 class TwoByteStringDeserializationCluster : public DeserializationCluster {
  public:
-  TwoByteStringDeserializationCluster() { }
-  virtual ~TwoByteStringDeserializationCluster() { }
+  TwoByteStringDeserializationCluster() {}
+  virtual ~TwoByteStringDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -4386,8 +4368,7 @@
     bool is_vm_object = d->isolate() == Dart::vm_isolate();
 
     for (intptr_t id = start_index_; id < stop_index_; id++) {
-      RawTwoByteString* str =
-          reinterpret_cast<RawTwoByteString*>(d->Ref(id));
+      RawTwoByteString* str = reinterpret_cast<RawTwoByteString*>(d->Ref(id));
       intptr_t length = d->Read<int32_t>();
       bool is_canonical = d->Read<bool>();
       Deserializer::InitializeHeader(str, kTwoByteStringCid,
@@ -4439,8 +4420,7 @@
   return NULL;
 #else
   Zone* Z = zone_;
-  if ((cid >= kNumPredefinedCids) ||
-      (cid == kInstanceCid) ||
+  if ((cid >= kNumPredefinedCids) || (cid == kInstanceCid) ||
       RawObject::IsTypedDataViewClassId(cid)) {
     Push(isolate()->class_table()->At(cid));
     return new (Z) InstanceSerializationCluster(cid);
@@ -4453,33 +4433,50 @@
   }
 
   switch (cid) {
-    case kClassCid: return new (Z) ClassSerializationCluster(num_cids_);
+    case kClassCid:
+      return new (Z) ClassSerializationCluster(num_cids_);
     case kUnresolvedClassCid:
       return new (Z) UnresolvedClassSerializationCluster();
-    case kTypeArgumentsCid: return new (Z) TypeArgumentsSerializationCluster();
-    case kPatchClassCid: return new (Z) PatchClassSerializationCluster();
-    case kFunctionCid: return new (Z) FunctionSerializationCluster();
-    case kClosureDataCid: return new (Z) ClosureDataSerializationCluster();
+    case kTypeArgumentsCid:
+      return new (Z) TypeArgumentsSerializationCluster();
+    case kPatchClassCid:
+      return new (Z) PatchClassSerializationCluster();
+    case kFunctionCid:
+      return new (Z) FunctionSerializationCluster();
+    case kClosureDataCid:
+      return new (Z) ClosureDataSerializationCluster();
     case kRedirectionDataCid:
       return new (Z) RedirectionDataSerializationCluster();
-    case kFieldCid: return new (Z) FieldSerializationCluster();
-    case kLiteralTokenCid: return new (Z) LiteralTokenSerializationCluster();
-    case kTokenStreamCid: return new (Z) TokenStreamSerializationCluster();
-    case kScriptCid: return new (Z) ScriptSerializationCluster();
-    case kLibraryCid: return new (Z) LibrarySerializationCluster();
-    case kNamespaceCid: return new (Z) NamespaceSerializationCluster();
-    case kCodeCid: return new (Z) CodeSerializationCluster();
-    case kObjectPoolCid: return new (Z) ObjectPoolSerializationCluster();
+    case kFieldCid:
+      return new (Z) FieldSerializationCluster();
+    case kLiteralTokenCid:
+      return new (Z) LiteralTokenSerializationCluster();
+    case kTokenStreamCid:
+      return new (Z) TokenStreamSerializationCluster();
+    case kScriptCid:
+      return new (Z) ScriptSerializationCluster();
+    case kLibraryCid:
+      return new (Z) LibrarySerializationCluster();
+    case kNamespaceCid:
+      return new (Z) NamespaceSerializationCluster();
+    case kCodeCid:
+      return new (Z) CodeSerializationCluster();
+    case kObjectPoolCid:
+      return new (Z) ObjectPoolSerializationCluster();
     case kPcDescriptorsCid:
       return new (Z) RODataSerializationCluster(kPcDescriptorsCid);
     case kStackmapCid:
       return new (Z) RODataSerializationCluster(kStackmapCid);
     case kExceptionHandlersCid:
       return new (Z) ExceptionHandlersSerializationCluster();
-    case kContextCid: return new (Z) ContextSerializationCluster();
-    case kContextScopeCid: return new (Z) ContextScopeSerializationCluster();
-    case kUnlinkedCallCid: return new (Z) UnlinkedCallSerializationCluster();
-    case kICDataCid: return new (Z) ICDataSerializationCluster();
+    case kContextCid:
+      return new (Z) ContextSerializationCluster();
+    case kContextScopeCid:
+      return new (Z) ContextScopeSerializationCluster();
+    case kUnlinkedCallCid:
+      return new (Z) UnlinkedCallSerializationCluster();
+    case kICDataCid:
+      return new (Z) ICDataSerializationCluster();
     case kMegamorphicCacheCid:
       return new (Z) MegamorphicCacheSerializationCluster();
     case kSubtypeTestCacheCid:
@@ -4488,21 +4485,34 @@
       return new (Z) LanguageErrorSerializationCluster();
     case kUnhandledExceptionCid:
       return new (Z) UnhandledExceptionSerializationCluster();
-    case kLibraryPrefixCid: return new (Z) LibraryPrefixSerializationCluster();
-    case kTypeCid: return new (Z) TypeSerializationCluster();
-    case kTypeRefCid: return new (Z) TypeRefSerializationCluster();
-    case kTypeParameterCid: return new (Z) TypeParameterSerializationCluster();
-    case kBoundedTypeCid: return new (Z) BoundedTypeSerializationCluster();
-    case kClosureCid: return new (Z) ClosureSerializationCluster();
-    case kMintCid: return new (Z) MintSerializationCluster();
-    case kBigintCid: return new (Z) BigintSerializationCluster();
-    case kDoubleCid: return new (Z) DoubleSerializationCluster();
+    case kLibraryPrefixCid:
+      return new (Z) LibraryPrefixSerializationCluster();
+    case kTypeCid:
+      return new (Z) TypeSerializationCluster();
+    case kTypeRefCid:
+      return new (Z) TypeRefSerializationCluster();
+    case kTypeParameterCid:
+      return new (Z) TypeParameterSerializationCluster();
+    case kBoundedTypeCid:
+      return new (Z) BoundedTypeSerializationCluster();
+    case kClosureCid:
+      return new (Z) ClosureSerializationCluster();
+    case kMintCid:
+      return new (Z) MintSerializationCluster();
+    case kBigintCid:
+      return new (Z) BigintSerializationCluster();
+    case kDoubleCid:
+      return new (Z) DoubleSerializationCluster();
     case kGrowableObjectArrayCid:
       return new (Z) GrowableObjectArraySerializationCluster();
-    case kStacktraceCid: return new (Z) StacktraceSerializationCluster();
-    case kRegExpCid: return new (Z) RegExpSerializationCluster();
-    case kWeakPropertyCid: return new (Z) WeakPropertySerializationCluster();
-    case kLinkedHashMapCid: return new (Z) LinkedHashMapSerializationCluster();
+    case kStacktraceCid:
+      return new (Z) StacktraceSerializationCluster();
+    case kRegExpCid:
+      return new (Z) RegExpSerializationCluster();
+    case kWeakPropertyCid:
+      return new (Z) WeakPropertySerializationCluster();
+    case kLinkedHashMapCid:
+      return new (Z) LinkedHashMapSerializationCluster();
     case kArrayCid:
       return new (Z) ArraySerializationCluster(kArrayCid);
     case kImmutableArrayCid:
@@ -4521,7 +4531,8 @@
         return new (Z) TwoByteStringSerializationCluster();
       }
     }
-    default: break;
+    default:
+      break;
   }
 
   FATAL1("No cluster defined for cid %" Pd, cid);
@@ -4764,8 +4775,7 @@
   intptr_t cid = ReadCid();
 
   Zone* Z = zone_;
-  if ((cid >= kNumPredefinedCids) ||
-      (cid == kInstanceCid) ||
+  if ((cid >= kNumPredefinedCids) || (cid == kInstanceCid) ||
       RawObject::IsTypedDataViewClassId(cid)) {
     return new (Z) InstanceDeserializationCluster(cid);
   }
@@ -4777,33 +4787,49 @@
   }
 
   switch (cid) {
-    case kClassCid: return new (Z) ClassDeserializationCluster();
+    case kClassCid:
+      return new (Z) ClassDeserializationCluster();
     case kUnresolvedClassCid:
       return new (Z) UnresolvedClassDeserializationCluster();
     case kTypeArgumentsCid:
       return new (Z) TypeArgumentsDeserializationCluster();
-    case kPatchClassCid: return new (Z) PatchClassDeserializationCluster();
-    case kFunctionCid: return new (Z) FunctionDeserializationCluster();
-    case kClosureDataCid: return new (Z) ClosureDataDeserializationCluster();
+    case kPatchClassCid:
+      return new (Z) PatchClassDeserializationCluster();
+    case kFunctionCid:
+      return new (Z) FunctionDeserializationCluster();
+    case kClosureDataCid:
+      return new (Z) ClosureDataDeserializationCluster();
     case kRedirectionDataCid:
       return new (Z) RedirectionDataDeserializationCluster();
-    case kFieldCid: return new (Z) FieldDeserializationCluster();
-    case kLiteralTokenCid: return new (Z) LiteralTokenDeserializationCluster();
-    case kTokenStreamCid: return new (Z) TokenStreamDeserializationCluster();
-    case kScriptCid: return new (Z) ScriptDeserializationCluster();
-    case kLibraryCid: return new (Z) LibraryDeserializationCluster();
-    case kNamespaceCid: return new (Z) NamespaceDeserializationCluster();
-    case kCodeCid: return new (Z) CodeDeserializationCluster();
-    case kObjectPoolCid: return new (Z) ObjectPoolDeserializationCluster();
+    case kFieldCid:
+      return new (Z) FieldDeserializationCluster();
+    case kLiteralTokenCid:
+      return new (Z) LiteralTokenDeserializationCluster();
+    case kTokenStreamCid:
+      return new (Z) TokenStreamDeserializationCluster();
+    case kScriptCid:
+      return new (Z) ScriptDeserializationCluster();
+    case kLibraryCid:
+      return new (Z) LibraryDeserializationCluster();
+    case kNamespaceCid:
+      return new (Z) NamespaceDeserializationCluster();
+    case kCodeCid:
+      return new (Z) CodeDeserializationCluster();
+    case kObjectPoolCid:
+      return new (Z) ObjectPoolDeserializationCluster();
     case kPcDescriptorsCid:
     case kStackmapCid:
       return new (Z) RODataDeserializationCluster();
     case kExceptionHandlersCid:
       return new (Z) ExceptionHandlersDeserializationCluster();
-    case kContextCid: return new (Z) ContextDeserializationCluster();
-    case kContextScopeCid: return new (Z) ContextScopeDeserializationCluster();
-    case kUnlinkedCallCid: return new (Z) UnlinkedCallDeserializationCluster();
-    case kICDataCid: return new (Z) ICDataDeserializationCluster();
+    case kContextCid:
+      return new (Z) ContextDeserializationCluster();
+    case kContextScopeCid:
+      return new (Z) ContextScopeDeserializationCluster();
+    case kUnlinkedCallCid:
+      return new (Z) UnlinkedCallDeserializationCluster();
+    case kICDataCid:
+      return new (Z) ICDataDeserializationCluster();
     case kMegamorphicCacheCid:
       return new (Z) MegamorphicCacheDeserializationCluster();
     case kSubtypeTestCacheCid:
@@ -4814,20 +4840,30 @@
       return new (Z) UnhandledExceptionDeserializationCluster();
     case kLibraryPrefixCid:
       return new (Z) LibraryPrefixDeserializationCluster();
-    case kTypeCid: return new (Z) TypeDeserializationCluster();
-    case kTypeRefCid: return new (Z) TypeRefDeserializationCluster();
+    case kTypeCid:
+      return new (Z) TypeDeserializationCluster();
+    case kTypeRefCid:
+      return new (Z) TypeRefDeserializationCluster();
     case kTypeParameterCid:
       return new (Z) TypeParameterDeserializationCluster();
-    case kBoundedTypeCid: return new (Z) BoundedTypeDeserializationCluster();
-    case kClosureCid: return new (Z) ClosureDeserializationCluster();
-    case kMintCid: return new (Z) MintDeserializationCluster();
-    case kBigintCid: return new (Z) BigintDeserializationCluster();
-    case kDoubleCid: return new (Z) DoubleDeserializationCluster();
+    case kBoundedTypeCid:
+      return new (Z) BoundedTypeDeserializationCluster();
+    case kClosureCid:
+      return new (Z) ClosureDeserializationCluster();
+    case kMintCid:
+      return new (Z) MintDeserializationCluster();
+    case kBigintCid:
+      return new (Z) BigintDeserializationCluster();
+    case kDoubleCid:
+      return new (Z) DoubleDeserializationCluster();
     case kGrowableObjectArrayCid:
       return new (Z) GrowableObjectArrayDeserializationCluster();
-    case kStacktraceCid: return new (Z) StacktraceDeserializationCluster();
-    case kRegExpCid: return new (Z) RegExpDeserializationCluster();
-    case kWeakPropertyCid: return new (Z) WeakPropertyDeserializationCluster();
+    case kStacktraceCid:
+      return new (Z) StacktraceDeserializationCluster();
+    case kRegExpCid:
+      return new (Z) RegExpDeserializationCluster();
+    case kWeakPropertyCid:
+      return new (Z) WeakPropertyDeserializationCluster();
     case kLinkedHashMapCid:
       return new (Z) LinkedHashMapDeserializationCluster();
     case kArrayCid:
@@ -4848,7 +4884,8 @@
         return new (Z) TwoByteStringDeserializationCluster();
       }
     }
-    default: break;
+    default:
+      break;
   }
   FATAL1("No cluster defined for cid %" Pd, cid);
   return NULL;
@@ -4865,8 +4902,7 @@
   if (PendingBytes() < version_len) {
     const intptr_t kMessageBufferSize = 128;
     char message_buffer[kMessageBufferSize];
-    OS::SNPrint(message_buffer,
-                kMessageBufferSize,
+    OS::SNPrint(message_buffer, kMessageBufferSize,
                 "No full snapshot version found, expected '%s'",
                 expected_version);
     // This can also fail while bringing up the VM isolate, so make sure to
@@ -4881,11 +4917,9 @@
     const intptr_t kMessageBufferSize = 256;
     char message_buffer[kMessageBufferSize];
     char* actual_version = OS::StrNDup(version, version_len);
-    OS::SNPrint(message_buffer,
-                kMessageBufferSize,
+    OS::SNPrint(message_buffer, kMessageBufferSize,
                 "Wrong %s snapshot version, expected '%s' found '%s'",
-                (Snapshot::IsFull(kind_)) ? "full" : "script",
-                expected_version,
+                (Snapshot::IsFull(kind_)) ? "full" : "script", expected_version,
                 actual_version);
     free(actual_version);
     // This can also fail while bringing up the VM isolate, so make sure to
@@ -4906,13 +4940,11 @@
       strncmp(features, expected_features, expected_len)) {
     const intptr_t kMessageBufferSize = 256;
     char message_buffer[kMessageBufferSize];
-    char* actual_features = OS::StrNDup(features, buffer_len < 128 ? buffer_len
-                                                                   : 128);
-    OS::SNPrint(message_buffer,
-                kMessageBufferSize,
+    char* actual_features =
+        OS::StrNDup(features, buffer_len < 128 ? buffer_len : 128);
+    OS::SNPrint(message_buffer, kMessageBufferSize,
                 "Wrong features in snapshot, expected '%s' found '%s'",
-                expected_features,
-                actual_features);
+                expected_features, actual_features);
     free(const_cast<char*>(expected_features));
     free(actual_features);
     // This can also fail while bringing up the VM isolate, so make sure to
@@ -4939,8 +4971,8 @@
   // TODO(rmacnak): Verify num of base objects.
 
   {
-    NOT_IN_PRODUCT(TimelineDurationScope tds(thread(),
-        Timeline::GetIsolateStream(), "ReadAlloc"));
+    NOT_IN_PRODUCT(TimelineDurationScope tds(
+        thread(), Timeline::GetIsolateStream(), "ReadAlloc"));
     for (intptr_t i = 0; i < num_clusters_; i++) {
       clusters_[i] = ReadCluster();
       clusters_[i]->ReadAlloc(this);
@@ -4955,8 +4987,8 @@
   ASSERT((next_ref_index_ - 1) == num_objects_);
 
   {
-    NOT_IN_PRODUCT(TimelineDurationScope tds(thread(),
-        Timeline::GetIsolateStream(), "ReadFill"));
+    NOT_IN_PRODUCT(TimelineDurationScope tds(
+        thread(), Timeline::GetIsolateStream(), "ReadFill"));
     for (intptr_t i = 0; i < num_clusters_; i++) {
       clusters_[i]->ReadFill(this);
 #if defined(DEBUG)
@@ -4971,11 +5003,9 @@
  public:
   HeapLocker(Thread* thread, PageSpace* page_space)
       : StackResource(thread), page_space_(page_space) {
-        page_space_->AcquireDataLock();
+    page_space_->AcquireDataLock();
   }
-  ~HeapLocker() {
-    page_space_->ReleaseDataLock();
-  }
+  ~HeapLocker() { page_space_->ReleaseDataLock(); }
 
  private:
   PageSpace* page_space_;
@@ -5100,8 +5130,8 @@
 #endif
 
   {
-    NOT_IN_PRODUCT(TimelineDurationScope tds(thread(),
-        Timeline::GetIsolateStream(), "PostLoad"));
+    NOT_IN_PRODUCT(TimelineDurationScope tds(
+        thread(), Timeline::GetIsolateStream(), "PostLoad"));
     for (intptr_t i = 0; i < num_clusters_; i++) {
       clusters_[i]->PostLoad(refs, kind_, zone_);
     }
@@ -5118,15 +5148,15 @@
 // they will be shared across all isolates.
 class SnapshotTokenStreamVisitor : public ObjectVisitor {
  public:
-  explicit SnapshotTokenStreamVisitor(Thread* thread) :
-      objHandle_(Object::Handle(thread->zone())),
-      count_(0),
-      token_streams_(NULL) {}
+  explicit SnapshotTokenStreamVisitor(Thread* thread)
+      : objHandle_(Object::Handle(thread->zone())),
+        count_(0),
+        token_streams_(NULL) {}
 
-  SnapshotTokenStreamVisitor(Thread* thread, const Array* token_streams) :
-      objHandle_(Object::Handle(thread->zone())),
-      count_(0),
-      token_streams_(token_streams) {}
+  SnapshotTokenStreamVisitor(Thread* thread, const Array* token_streams)
+      : objHandle_(Object::Handle(thread->zone())),
+        count_(0),
+        token_streams_(token_streams) {}
 
   void VisitObject(RawObject* obj) {
     if (obj->IsTokenStream()) {
@@ -5180,8 +5210,8 @@
   ASSERT(isolate()->background_compiler() == NULL);
 
   if (vm_isolate_snapshot_buffer != NULL) {
-    NOT_IN_PRODUCT(TimelineDurationScope tds(thread(),
-        Timeline::GetIsolateStream(), "PrepareNewVMIsolate"));
+    NOT_IN_PRODUCT(TimelineDurationScope tds(
+        thread(), Timeline::GetIsolateStream(), "PrepareNewVMIsolate"));
 
     // Collect all the token stream objects into an array so that we can write
     // it out as part of the VM isolate snapshot. We first count the number of
@@ -5224,16 +5254,12 @@
 
 
 intptr_t FullSnapshotWriter::WriteVmIsolateSnapshot() {
-  NOT_IN_PRODUCT(TimelineDurationScope tds(thread(),
-      Timeline::GetIsolateStream(), "WriteVmIsolateSnapshot"));
+  NOT_IN_PRODUCT(TimelineDurationScope tds(
+      thread(), Timeline::GetIsolateStream(), "WriteVmIsolateSnapshot"));
 
   ASSERT(vm_isolate_snapshot_buffer_ != NULL);
-  Serializer serializer(thread(),
-                        kind_,
-                        vm_isolate_snapshot_buffer_,
-                        alloc_,
-                        kInitialSize,
-                        instructions_writer_);
+  Serializer serializer(thread(), kind_, vm_isolate_snapshot_buffer_, alloc_,
+                        kInitialSize, instructions_writer_);
 
   serializer.ReserveHeader();
   serializer.WriteVersionAndFeatures();
@@ -5243,8 +5269,8 @@
    * - all the token streams
    * - the stub code (precompiled snapshots only)
    **/
-  intptr_t num_objects = serializer.WriteVMSnapshot(new_vm_symbol_table_,
-                                                    token_streams_);
+  intptr_t num_objects =
+      serializer.WriteVMSnapshot(new_vm_symbol_table_, token_streams_);
   serializer.FillHeader(serializer.kind());
 
   vm_isolate_snapshot_size_ = serializer.bytes_written();
@@ -5252,17 +5278,12 @@
 }
 
 
-void FullSnapshotWriter::WriteIsolateFullSnapshot(
-    intptr_t num_base_objects) {
-  NOT_IN_PRODUCT(TimelineDurationScope tds(thread(),
-      Timeline::GetIsolateStream(), "WriteIsolateFullSnapshot"));
+void FullSnapshotWriter::WriteIsolateFullSnapshot(intptr_t num_base_objects) {
+  NOT_IN_PRODUCT(TimelineDurationScope tds(
+      thread(), Timeline::GetIsolateStream(), "WriteIsolateFullSnapshot"));
 
-  Serializer serializer(thread(),
-                        kind_,
-                        isolate_snapshot_buffer_,
-                        alloc_,
-                        kInitialSize,
-                        instructions_writer_);
+  Serializer serializer(thread(), kind_, isolate_snapshot_buffer_, alloc_,
+                        kInitialSize, instructions_writer_);
   ObjectStore* object_store = isolate()->object_store();
   ASSERT(object_store != NULL);
 
@@ -5287,10 +5308,9 @@
   WriteIsolateFullSnapshot(num_base_objects);
 
   if (Snapshot::IncludesCode(kind_)) {
-    instructions_writer_->Write(*vm_isolate_snapshot_buffer_,
-                                vm_isolate_snapshot_size_,
-                                *isolate_snapshot_buffer_,
-                                isolate_snapshot_size_);
+    instructions_writer_->Write(
+        *vm_isolate_snapshot_buffer_, vm_isolate_snapshot_size_,
+        *isolate_snapshot_buffer_, isolate_snapshot_size_);
 
     OS::Print("VMIsolate(CodeSize): %" Pd "\n", VmIsolateSnapshotSize());
     OS::Print("Isolate(CodeSize): %" Pd "\n", IsolateSnapshotSize());
@@ -5298,8 +5318,7 @@
               instructions_writer_->data_size());
     OS::Print("Instructions(CodeSize): %" Pd "\n",
               instructions_writer_->text_size());
-    intptr_t total = VmIsolateSnapshotSize() +
-                     IsolateSnapshotSize() +
+    intptr_t total = VmIsolateSnapshotSize() + IsolateSnapshotSize() +
                      instructions_writer_->data_size() +
                      instructions_writer_->text_size();
     OS::Print("Total(CodeSize): %" Pd "\n", total);
@@ -5308,12 +5327,8 @@
 
 
 RawApiError* IsolateSnapshotReader::ReadFullSnapshot() {
-  Deserializer deserializer(thread_,
-                            kind_,
-                            buffer_,
-                            size_,
-                            instructions_buffer_,
-                            data_buffer_);
+  Deserializer deserializer(thread_, kind_, buffer_, size_,
+                            instructions_buffer_, data_buffer_);
 
   RawApiError* error = deserializer.VerifyVersionAndFeatures();
   if (error != ApiError::null()) {
@@ -5327,12 +5342,8 @@
 
 
 RawApiError* VmIsolateSnapshotReader::ReadVmIsolateSnapshot() {
-  Deserializer deserializer(thread_,
-                            kind_,
-                            buffer_,
-                            size_,
-                            instructions_buffer_,
-                            data_buffer_);
+  Deserializer deserializer(thread_, kind_, buffer_, size_,
+                            instructions_buffer_, data_buffer_);
 
   RawApiError* error = deserializer.VerifyVersionAndFeatures();
   if (error != ApiError::null()) {
diff --git a/runtime/vm/clustered_snapshot.h b/runtime/vm/clustered_snapshot.h
index 8aba9e1..21fc29c 100644
--- a/runtime/vm/clustered_snapshot.h
+++ b/runtime/vm/clustered_snapshot.h
@@ -46,7 +46,7 @@
 
 class SerializationCluster : public ZoneAllocated {
  public:
-  virtual ~SerializationCluster() { }
+  virtual ~SerializationCluster() {}
 
   // Add [object] to the cluster and push its outgoing references.
   virtual void Trace(Serializer* serializer, RawObject* object) = 0;
@@ -63,8 +63,8 @@
 
 class DeserializationCluster : public ZoneAllocated {
  public:
-  DeserializationCluster() : start_index_(-1), stop_index_(-1) { }
-  virtual ~DeserializationCluster() { }
+  DeserializationCluster() : start_index_(-1), stop_index_(-1) {}
+  virtual ~DeserializationCluster() {}
 
   // Allocate memory for all objects in the cluster and write their addresses
   // into the ref array. Do not touch this memory.
@@ -75,7 +75,7 @@
 
   // Complete any action that requires the full graph to be deserialized, such
   // as rehashing.
-  virtual void PostLoad(const Array& refs, Snapshot::Kind kind, Zone* zone) { }
+  virtual void PostLoad(const Array& refs, Snapshot::Kind kind, Zone* zone) {}
 
  protected:
   // The range of the ref array that belongs to this cluster.
@@ -86,7 +86,7 @@
 
 class SmiObjectIdPair {
  public:
-  SmiObjectIdPair() : smi_(NULL), id_(0) { }
+  SmiObjectIdPair() : smi_(NULL), id_(0) {}
   RawSmi* smi_;
   intptr_t id_;
 
@@ -186,9 +186,7 @@
     }
   }
 
-  void AddUntracedRef() {
-    num_written_objects_++;
-  }
+  void AddUntracedRef() { num_written_objects_++; }
 
   void Trace(RawObject* object);
 
@@ -314,25 +312,17 @@
     return ReadStream::Raw<sizeof(T), T>::Read(&stream_);
   }
 
-  void ReadBytes(uint8_t* addr, intptr_t len) {
-    stream_.ReadBytes(addr, len);
-  }
+  void ReadBytes(uint8_t* addr, intptr_t len) { stream_.ReadBytes(addr, len); }
 
   const uint8_t* CurrentBufferAddress() const {
     return stream_.AddressOfCurrentPosition();
   }
 
-  void Advance(intptr_t value) {
-    stream_.Advance(value);
-  }
+  void Advance(intptr_t value) { stream_.Advance(value); }
 
-  intptr_t PendingBytes() const {
-    return stream_.PendingBytes();
-  }
+  intptr_t PendingBytes() const { return stream_.PendingBytes(); }
 
-  void AddBaseObject(RawObject* base_object) {
-    AssignRef(base_object);
-  }
+  void AddBaseObject(RawObject* base_object) { AssignRef(base_object); }
 
   void AssignRef(RawObject* object) {
     ASSERT(next_ref_index_ <= num_objects_);
@@ -407,9 +397,7 @@
     return vm_isolate_snapshot_buffer_;
   }
 
-  uint8_t** isolate_snapshot_buffer() const {
-    return isolate_snapshot_buffer_;
-  }
+  uint8_t** isolate_snapshot_buffer() const { return isolate_snapshot_buffer_; }
 
   Thread* thread() const { return thread_; }
   Zone* zone() const { return thread_->zone(); }
@@ -419,12 +407,8 @@
   // Writes a full snapshot of the Isolate.
   void WriteFullSnapshot();
 
-  intptr_t VmIsolateSnapshotSize() const {
-    return vm_isolate_snapshot_size_;
-  }
-  intptr_t IsolateSnapshotSize() const {
-    return isolate_snapshot_size_;
-  }
+  intptr_t VmIsolateSnapshotSize() const { return vm_isolate_snapshot_size_; }
+  intptr_t IsolateSnapshotSize() const { return isolate_snapshot_size_; }
 
  private:
   // Writes a snapshot of the VM Isolate.
@@ -457,17 +441,17 @@
                           intptr_t size,
                           const uint8_t* instructions_buffer,
                           const uint8_t* data_buffer,
-                          Thread* thread) :
-      kind_(kind),
-      thread_(thread),
-      buffer_(buffer),
-      size_(size),
-      instructions_buffer_(instructions_buffer),
-      data_buffer_(data_buffer) {
+                          Thread* thread)
+      : kind_(kind),
+        thread_(thread),
+        buffer_(buffer),
+        size_(size),
+        instructions_buffer_(instructions_buffer),
+        data_buffer_(data_buffer) {
     thread->isolate()->set_compilation_allowed(kind != Snapshot::kAppNoJIT);
   }
 
-  ~VmIsolateSnapshotReader() { }
+  ~VmIsolateSnapshotReader() {}
 
   RawApiError* ReadVmIsolateSnapshot();
 
@@ -490,13 +474,13 @@
                         intptr_t size,
                         const uint8_t* instructions_buffer,
                         const uint8_t* data_buffer,
-                        Thread* thread) :
-      kind_(kind),
-      thread_(thread),
-      buffer_(buffer),
-      size_(size),
-      instructions_buffer_(instructions_buffer),
-      data_buffer_(data_buffer) {
+                        Thread* thread)
+      : kind_(kind),
+        thread_(thread),
+        buffer_(buffer),
+        size_(size),
+        instructions_buffer_(instructions_buffer),
+        data_buffer_(data_buffer) {
     thread->isolate()->set_compilation_allowed(kind != Snapshot::kAppNoJIT);
   }
 
diff --git a/runtime/vm/code_descriptors.cc b/runtime/vm/code_descriptors.cc
index b7b4326..ece0fd8 100644
--- a/runtime/vm/code_descriptors.cc
+++ b/runtime/vm/code_descriptors.cc
@@ -41,7 +41,6 @@
 }
 
 
-
 void CodeSourceMapBuilder::AddEntry(intptr_t pc_offset,
                                     TokenPosition token_pos) {
   // Require pc offset to monotonically increase.
@@ -119,19 +118,13 @@
       // Check it is uninitialized.
       ASSERT((list_[i].outer_try_index == -1) &&
              (list_[i].pc_offset == ExceptionHandlers::kInvalidPcOffset));
-      handlers.SetHandlerInfo(i,
-                              list_[i].outer_try_index,
-                              list_[i].pc_offset,
-                              list_[i].needs_stacktrace,
-                              has_catch_all);
+      handlers.SetHandlerInfo(i, list_[i].outer_try_index, list_[i].pc_offset,
+                              list_[i].needs_stacktrace, has_catch_all);
       handlers.SetHandledTypes(i, Array::empty_array());
     } else {
       const bool has_catch_all = ContainsDynamic(*list_[i].handler_types);
-      handlers.SetHandlerInfo(i,
-                              list_[i].outer_try_index,
-                              list_[i].pc_offset,
-                              list_[i].needs_stacktrace,
-                              has_catch_all);
+      handlers.SetHandlerInfo(i, list_[i].outer_try_index, list_[i].pc_offset,
+                              list_[i].needs_stacktrace, has_catch_all);
       handlers.SetHandledTypes(i, *list_[i].handler_types);
     }
   }
diff --git a/runtime/vm/code_descriptors.h b/runtime/vm/code_descriptors.h
index ef56938..58f1af7 100644
--- a/runtime/vm/code_descriptors.h
+++ b/runtime/vm/code_descriptors.h
@@ -16,12 +16,12 @@
 class DescriptorList : public ZoneAllocated {
  public:
   explicit DescriptorList(intptr_t initial_capacity)
-    : encoded_data_(initial_capacity),
-      prev_pc_offset(0),
-      prev_deopt_id(0),
-      prev_token_pos(0) {}
+      : encoded_data_(initial_capacity),
+        prev_pc_offset(0),
+        prev_deopt_id(0),
+        prev_token_pos(0) {}
 
-  ~DescriptorList() { }
+  ~DescriptorList() {}
 
   void AddDescriptor(RawPcDescriptors::Kind kind,
                      intptr_t pc_offset,
@@ -45,11 +45,9 @@
 class CodeSourceMapBuilder : public ZoneAllocated {
  public:
   explicit CodeSourceMapBuilder(intptr_t initial_capacity = 64)
-    : encoded_data_(initial_capacity),
-      prev_pc_offset(0),
-      prev_token_pos(0) {}
+      : encoded_data_(initial_capacity), prev_pc_offset(0), prev_token_pos(0) {}
 
-  ~CodeSourceMapBuilder() { }
+  ~CodeSourceMapBuilder() {}
 
   void AddEntry(intptr_t pc_offset, TokenPosition token_pos);
 
@@ -70,8 +68,8 @@
   StackmapTableBuilder()
       : stack_map_(Stackmap::ZoneHandle()),
         list_(GrowableObjectArray::ZoneHandle(
-            GrowableObjectArray::New(Heap::kOld))) { }
-  ~StackmapTableBuilder() { }
+            GrowableObjectArray::New(Heap::kOld))) {}
+  ~StackmapTableBuilder() {}
 
   void AddEntry(intptr_t pc_offset,
                 BitmapBuilder* bitmap,
@@ -94,17 +92,15 @@
 class ExceptionHandlerList : public ZoneAllocated {
  public:
   struct HandlerDesc {
-    intptr_t outer_try_index;  // Try block in which this try block is nested.
-    intptr_t pc_offset;        // Handler PC offset value.
-    const Array* handler_types;   // Catch clause guards.
+    intptr_t outer_try_index;    // Try block in which this try block is nested.
+    intptr_t pc_offset;          // Handler PC offset value.
+    const Array* handler_types;  // Catch clause guards.
     bool needs_stacktrace;
   };
 
   ExceptionHandlerList() : list_() {}
 
-  intptr_t Length() const {
-    return list_.length();
-  }
+  intptr_t Length() const { return list_.length(); }
 
   void AddPlaceHolder() {
     struct HandlerDesc data;
diff --git a/runtime/vm/code_descriptors_test.cc b/runtime/vm/code_descriptors_test.cc
index 99b5b57..ec481fb 100644
--- a/runtime/vm/code_descriptors_test.cc
+++ b/runtime/vm/code_descriptors_test.cc
@@ -56,7 +56,7 @@
     stack_bitmap->SetLength(kStackSlotCount);
     EXPECT_EQ(kStackSlotCount, stack_bitmap->Length());
 
-    bool expectation0[kStackSlotCount] = { true };
+    bool expectation0[kStackSlotCount] = {true};
     for (intptr_t i = 0; i < kStackSlotCount; ++i) {
       EXPECT_EQ(expectation0[i], stack_bitmap->Get(i));
     }
@@ -73,7 +73,7 @@
     stack_bitmap->SetLength(kStackSlotCount);
     EXPECT_EQ(kStackSlotCount, stack_bitmap->Length());
 
-    bool expectation1[kStackSlotCount] = { true, false, true };
+    bool expectation1[kStackSlotCount] = {true, false, true};
     for (intptr_t i = 0; i < kStackSlotCount; ++i) {
       EXPECT_EQ(expectation1[i], stack_bitmap->Get(i));
     }
@@ -91,8 +91,7 @@
     stack_bitmap->SetLength(kStackSlotCount);
     EXPECT_EQ(kStackSlotCount, stack_bitmap->Length());
 
-    bool expectation2[kStackSlotCount] =
-        { true, false, true, true, true, true };
+    bool expectation2[kStackSlotCount] = {true, false, true, true, true, true};
     for (intptr_t i = 0; i < kStackSlotCount; ++i) {
       EXPECT_EQ(expectation2[i], stack_bitmap->Get(i));
     }
@@ -112,9 +111,8 @@
     stack_bitmap->SetLength(kStackSlotCount);
     EXPECT_EQ(kStackSlotCount, stack_bitmap->Length());
 
-    bool expectation3[kStackSlotCount] =
-        { true, false, true, true, true, true, false, false,
-          false, false, true };
+    bool expectation3[kStackSlotCount] = {
+        true, false, true, true, true, true, false, false, false, false, true};
     for (intptr_t i = 0; i < kStackSlotCount; ++i) {
       EXPECT_EQ(expectation3[i], stack_bitmap->Get(i));
     }
@@ -220,8 +218,8 @@
   const String& name = String::Handle(String::New(TestCase::url()));
   const Library& lib = Library::Handle(Library::LookupLibrary(thread, name));
   EXPECT(!lib.IsNull());
-  Class& cls = Class::Handle(
-      lib.LookupClass(String::Handle(Symbols::New(thread, "A"))));
+  Class& cls =
+      Class::Handle(lib.LookupClass(String::Handle(Symbols::New(thread, "A"))));
   EXPECT(!cls.IsNull());
 
   // Now compile the two functions 'A.foo' and 'A.moo'
@@ -244,17 +242,16 @@
   BitmapBuilder* stack_bitmap = new BitmapBuilder();
   EXPECT(stack_bitmap != NULL);
   stack_bitmap->Set(0, false);  // var i.
-  stack_bitmap->Set(1, true);  // var s1.
+  stack_bitmap->Set(1, true);   // var s1.
   stack_bitmap->Set(2, false);  // var k.
-  stack_bitmap->Set(3, true);  // var s2.
-  stack_bitmap->Set(4, true);  // var s3.
+  stack_bitmap->Set(3, true);   // var s2.
+  stack_bitmap->Set(4, true);   // var s3.
   const Code& code = Code::Handle(function_foo.unoptimized_code());
   // Search for the pc of the call to 'func'.
   const PcDescriptors& descriptors =
       PcDescriptors::Handle(code.pc_descriptors());
   int call_count = 0;
-  PcDescriptors::Iterator iter(descriptors,
-                               RawPcDescriptors::kUnoptStaticCall);
+  PcDescriptors::Iterator iter(descriptors, RawPcDescriptors::kUnoptStaticCall);
   while (iter.MoveNext()) {
     stackmap_table_builder->AddEntry(iter.PcOffset(), stack_bitmap, 0);
     ++call_count;
@@ -279,22 +276,22 @@
   DescriptorList* descriptors = new DescriptorList(64);
   ASSERT(descriptors != NULL);
   const intptr_t token_positions[] = {
-    kMinInt32,
-    5,
-    13,
-    13,
-    13,
-    13,
-    31,
-    23,
-    23,
-    23,
-    33,
-    33,
-    5,
-    5,
-    TokenPosition::kMinSourcePos,
-    TokenPosition::kMaxSourcePos,
+      kMinInt32,
+      5,
+      13,
+      13,
+      13,
+      13,
+      31,
+      23,
+      23,
+      23,
+      33,
+      33,
+      5,
+      5,
+      TokenPosition::kMinSourcePos,
+      TokenPosition::kMaxSourcePos,
   };
   const intptr_t num_token_positions =
       sizeof(token_positions) / sizeof(token_positions[0]);
@@ -314,8 +311,8 @@
   intptr_t i = 0;
   while (it.MoveNext()) {
     if (token_positions[i] != it.TokenPos().value()) {
-      OS::Print("[%" Pd "]: Expected: %" Pd " != %" Pd "\n",
-                i, token_positions[i], it.TokenPos().value());
+      OS::Print("[%" Pd "]: Expected: %" Pd " != %" Pd "\n", i,
+                token_positions[i], it.TokenPos().value());
     }
     EXPECT(token_positions[i] == it.TokenPos().value());
     i++;
@@ -325,22 +322,22 @@
 
 TEST_CASE(CodeSourceMap_TokenPositions) {
   const intptr_t token_positions[] = {
-    kMinInt32,
-    5,
-    13,
-    13,
-    13,
-    13,
-    31,
-    23,
-    23,
-    23,
-    33,
-    33,
-    5,
-    5,
-    TokenPosition::kMinSourcePos,
-    TokenPosition::kMaxSourcePos,
+      kMinInt32,
+      5,
+      13,
+      13,
+      13,
+      13,
+      31,
+      23,
+      23,
+      23,
+      33,
+      33,
+      5,
+      5,
+      TokenPosition::kMinSourcePos,
+      TokenPosition::kMaxSourcePos,
   };
   const intptr_t num_token_positions =
       sizeof(token_positions) / sizeof(token_positions[0]);
@@ -362,8 +359,8 @@
   while (it.MoveNext()) {
     EXPECT(it.PcOffset() == i);
     if (token_positions[i] != it.TokenPos().value()) {
-      OS::Print("[%" Pd "]: Expected: %" Pd " != %" Pd "\n",
-                i, token_positions[i], it.TokenPos().value());
+      OS::Print("[%" Pd "]: Expected: %" Pd " != %" Pd "\n", i,
+                token_positions[i], it.TokenPos().value());
     }
     EXPECT(token_positions[i] == it.TokenPos().value());
     i++;
diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc
index 0c3b3a1..ef90b54 100644
--- a/runtime/vm/code_generator.cc
+++ b/runtime/vm/code_generator.cc
@@ -28,20 +28,34 @@
 
 namespace dart {
 
-DEFINE_FLAG(int, max_subtype_cache_entries, 100,
+DEFINE_FLAG(
+    int,
+    max_subtype_cache_entries,
+    100,
     "Maximum number of subtype cache entries (number of checks cached).");
-DEFINE_FLAG(int, regexp_optimization_counter_threshold, 1000,
+DEFINE_FLAG(
+    int,
+    regexp_optimization_counter_threshold,
+    1000,
     "RegExp's usage-counter value before it is optimized, -1 means never");
-DEFINE_FLAG(int, reoptimization_counter_threshold, 4000,
-    "Counter threshold before a function gets reoptimized.");
+DEFINE_FLAG(int,
+            reoptimization_counter_threshold,
+            4000,
+            "Counter threshold before a function gets reoptimized.");
 DEFINE_FLAG(bool, trace_deoptimization, false, "Trace deoptimization");
-DEFINE_FLAG(bool, trace_deoptimization_verbose, false,
-    "Trace deoptimization verbose");
+DEFINE_FLAG(bool,
+            trace_deoptimization_verbose,
+            false,
+            "Trace deoptimization verbose");
 DEFINE_FLAG(bool, trace_ic, false, "Trace IC handling");
-DEFINE_FLAG(bool, trace_ic_miss_in_optimized, false,
-    "Trace IC miss in optimized code");
-DEFINE_FLAG(bool, trace_optimized_ic_calls, false,
-    "Trace IC calls in optimized code.");
+DEFINE_FLAG(bool,
+            trace_ic_miss_in_optimized,
+            false,
+            "Trace IC miss in optimized code");
+DEFINE_FLAG(bool,
+            trace_optimized_ic_calls,
+            false,
+            "Trace IC calls in optimized code.");
 DEFINE_FLAG(bool, trace_patching, false, "Trace patching of code.");
 DEFINE_FLAG(bool, trace_runtime_calls, false, "Trace runtime calls");
 DEFINE_FLAG(bool, trace_type_checks, false, "Trace runtime type checks.");
@@ -54,11 +68,17 @@
 
 DEFINE_FLAG(bool, trace_osr, false, "Trace attempts at on-stack replacement.");
 
-DEFINE_FLAG(int, stacktrace_every, 0,
+DEFINE_FLAG(int,
+            stacktrace_every,
+            0,
             "Compute debugger stacktrace on every N stack overflow checks");
-DEFINE_FLAG(charp, stacktrace_filter, NULL,
+DEFINE_FLAG(charp,
+            stacktrace_filter,
+            NULL,
             "Compute stacktrace in named function on stack overflow checks");
-DEFINE_FLAG(charp, deoptimize_filter, NULL,
+DEFINE_FLAG(charp,
+            deoptimize_filter,
+            NULL,
             "Deoptimize in named function on stack overflow checks");
 
 DECLARE_FLAG(int, reload_every);
@@ -66,7 +86,9 @@
 DECLARE_FLAG(bool, reload_every_back_off);
 
 #ifdef DEBUG
-DEFINE_FLAG(charp, gc_at_instance_allocation, NULL,
+DEFINE_FLAG(charp,
+            gc_at_instance_allocation,
+            NULL,
             "Perform a GC before allocation of instances of "
             "the specified class");
 #endif
@@ -76,8 +98,8 @@
   const String& function_name = String::Handle(function.name());
   const String& class_name =
       String::Handle(Class::Handle(function.Owner()).Name());
-  OS::PrintErr("> Entering '%s.%s'\n",
-      class_name.ToCString(), function_name.ToCString());
+  OS::PrintErr("> Entering '%s.%s'\n", class_name.ToCString(),
+               function_name.ToCString());
 }
 
 
@@ -86,8 +108,8 @@
   const String& function_name = String::Handle(function.name());
   const String& class_name =
       String::Handle(Class::Handle(function.Owner()).Name());
-  OS::PrintErr("< Exiting '%s.%s'\n",
-      class_name.ToCString(), function_name.ToCString());
+  OS::PrintErr("< Exiting '%s.%s'\n", class_name.ToCString(),
+               function_name.ToCString());
 }
 
 
@@ -225,11 +247,11 @@
   if (!bound_error.IsNull()) {
     // Throw a dynamic type error.
     const TokenPosition location = GetCallerLocation();
-    String& bound_error_message =  String::Handle(
-        zone, String::New(bound_error.ToErrorCString()));
-    Exceptions::CreateAndThrowTypeError(
-        location, AbstractType::Handle(zone), AbstractType::Handle(zone),
-        Symbols::Empty(), bound_error_message);
+    String& bound_error_message =
+        String::Handle(zone, String::New(bound_error.ToErrorCString()));
+    Exceptions::CreateAndThrowTypeError(location, AbstractType::Handle(zone),
+                                        AbstractType::Handle(zone),
+                                        Symbols::Empty(), bound_error_message);
     UNREACHABLE();
   }
   if (type.IsTypeRef()) {
@@ -258,14 +280,13 @@
   ASSERT(instantiator.IsNull() || !type_arguments.IsUninstantiatedIdentity());
   if (isolate->type_checks()) {
     Error& bound_error = Error::Handle(zone);
-    type_arguments =
-        type_arguments.InstantiateAndCanonicalizeFrom(instantiator,
-                                                      &bound_error);
+    type_arguments = type_arguments.InstantiateAndCanonicalizeFrom(
+        instantiator, &bound_error);
     if (!bound_error.IsNull()) {
       // Throw a dynamic type error.
       const TokenPosition location = GetCallerLocation();
-      String& bound_error_message =  String::Handle(
-          zone, String::New(bound_error.ToErrorCString()));
+      String& bound_error_message =
+          String::Handle(zone, String::New(bound_error.ToErrorCString()));
       Exceptions::CreateAndThrowTypeError(
           location, AbstractType::Handle(zone), AbstractType::Handle(zone),
           Symbols::Empty(), bound_error_message);
@@ -308,12 +329,11 @@
 
 
 // Helper routine for tracing a type check.
-static void PrintTypeCheck(
-    const char* message,
-    const Instance& instance,
-    const AbstractType& type,
-    const TypeArguments& instantiator_type_arguments,
-    const Bool& result) {
+static void PrintTypeCheck(const char* message,
+                           const Instance& instance,
+                           const AbstractType& type,
+                           const TypeArguments& instantiator_type_arguments,
+                           const Bool& result) {
   DartFrameIterator iterator;
   StackFrame* caller_frame = iterator.NextFrame();
   ASSERT(caller_frame != NULL);
@@ -321,33 +341,29 @@
   const AbstractType& instance_type = AbstractType::Handle(instance.GetType());
   ASSERT(instance_type.IsInstantiated());
   if (type.IsInstantiated()) {
-    OS::PrintErr("%s: '%s' %" Pd " %s '%s' %" Pd " (pc: %#" Px ").\n",
-                 message,
+    OS::PrintErr("%s: '%s' %" Pd " %s '%s' %" Pd " (pc: %#" Px ").\n", message,
                  String::Handle(instance_type.Name()).ToCString(),
                  Class::Handle(instance_type.type_class()).id(),
                  (result.raw() == Bool::True().raw()) ? "is" : "is !",
                  String::Handle(type.Name()).ToCString(),
-                 Class::Handle(type.type_class()).id(),
-                 caller_frame->pc());
+                 Class::Handle(type.type_class()).id(), caller_frame->pc());
   } else {
     // Instantiate type before printing.
     Error& bound_error = Error::Handle();
-    const AbstractType& instantiated_type = AbstractType::Handle(
-        type.InstantiateFrom(instantiator_type_arguments, &bound_error,
-                             NULL, NULL, Heap::kOld));
+    const AbstractType& instantiated_type =
+        AbstractType::Handle(type.InstantiateFrom(
+            instantiator_type_arguments, &bound_error, NULL, NULL, Heap::kOld));
     OS::PrintErr("%s: '%s' %s '%s' instantiated from '%s' (pc: %#" Px ").\n",
-                 message,
-                 String::Handle(instance_type.Name()).ToCString(),
+                 message, String::Handle(instance_type.Name()).ToCString(),
                  (result.raw() == Bool::True().raw()) ? "is" : "is !",
                  String::Handle(instantiated_type.Name()).ToCString(),
-                 String::Handle(type.Name()).ToCString(),
-                 caller_frame->pc());
+                 String::Handle(type.Name()).ToCString(), caller_frame->pc());
     if (!bound_error.IsNull()) {
       OS::Print("  bound error: %s\n", bound_error.ToErrorCString());
     }
   }
-  const Function& function = Function::Handle(
-      caller_frame->LookupDartFunction());
+  const Function& function =
+      Function::Handle(caller_frame->LookupDartFunction());
   OS::PrintErr(" -> Function %s\n", function.ToFullyQualifiedCString());
 }
 
@@ -406,12 +422,9 @@
   TypeArguments& last_instantiator_type_arguments = TypeArguments::Handle();
   Bool& last_result = Bool::Handle();
   for (intptr_t i = 0; i < len; ++i) {
-    new_cache.GetCheck(
-        i,
-        &last_instance_class_id_or_function,
-        &last_instance_type_arguments,
-        &last_instantiator_type_arguments,
-        &last_result);
+    new_cache.GetCheck(i, &last_instance_class_id_or_function,
+                       &last_instance_type_arguments,
+                       &last_instantiator_type_arguments, &last_result);
     if ((last_instance_class_id_or_function.raw() ==
          instance_class_id_or_function.raw()) &&
         (last_instance_type_arguments.raw() == instance_type_arguments.raw()) &&
@@ -419,46 +432,41 @@
          instantiator_type_arguments.raw())) {
       OS::PrintErr("  Error in test cache %p ix: %" Pd ",", new_cache.raw(), i);
       PrintTypeCheck(" duplicate cache entry", instance, type,
-          instantiator_type_arguments, result);
+                     instantiator_type_arguments, result);
       UNREACHABLE();
       return;
     }
   }
 #endif
-  new_cache.AddCheck(instance_class_id_or_function,
-                     instance_type_arguments,
-                     instantiator_type_arguments,
-                     result);
+  new_cache.AddCheck(instance_class_id_or_function, instance_type_arguments,
+                     instantiator_type_arguments, result);
   if (FLAG_trace_type_checks) {
     AbstractType& test_type = AbstractType::Handle(type.raw());
     if (!test_type.IsInstantiated()) {
       Error& bound_error = Error::Handle();
       test_type = type.InstantiateFrom(instantiator_type_arguments,
-                                       &bound_error,
-                                       NULL, NULL, Heap::kNew);
+                                       &bound_error, NULL, NULL, Heap::kNew);
       ASSERT(bound_error.IsNull());  // Malbounded types are not optimized.
     }
-    OS::PrintErr("  Updated test cache %p ix: %" Pd " with "
+    OS::PrintErr(
+        "  Updated test cache %p ix: %" Pd
+        " with "
         "(cid-or-fun: %p, type-args: %p, instantiator: %p, result: %s)\n"
-        "    instance  [class: (%p '%s' cid: %" Pd "),    type-args: %p %s]\n"
+        "    instance  [class: (%p '%s' cid: %" Pd
+        "),    type-args: %p %s]\n"
         "    test-type [class: (%p '%s' cid: %" Pd "), in-type-args: %p %s]\n",
-        new_cache.raw(),
-        len,
+        new_cache.raw(), len,
 
-        instance_class_id_or_function.raw(),
-        instance_type_arguments.raw(),
-        instantiator_type_arguments.raw(),
-        result.ToCString(),
+        instance_class_id_or_function.raw(), instance_type_arguments.raw(),
+        instantiator_type_arguments.raw(), result.ToCString(),
 
-        instance_class.raw(),
-        String::Handle(instance_class.Name()).ToCString(),
-        instance_class.id(),
-        instance_type_arguments.raw(),
+        instance_class.raw(), String::Handle(instance_class.Name()).ToCString(),
+        instance_class.id(), instance_type_arguments.raw(),
         instance_type_arguments.ToCString(),
 
         test_type.type_class(),
-        String::Handle(Class::Handle(test_type.type_class()).Name()).
-            ToCString(),
+        String::Handle(Class::Handle(test_type.type_class()).Name())
+            .ToCString(),
         Class::Handle(test_type.type_class()).id(),
         instantiator_type_arguments.raw(),
         instantiator_type_arguments.ToCString());
@@ -482,30 +490,28 @@
   const SubtypeTestCache& cache =
       SubtypeTestCache::CheckedHandle(zone, arguments.ArgAt(3));
   ASSERT(type.IsFinalized());
-  ASSERT(!type.IsMalformed());  // Already checked in code generator.
-  ASSERT(!type.IsMalbounded());  // Already checked in code generator.
+  ASSERT(!type.IsMalformed());    // Already checked in code generator.
+  ASSERT(!type.IsMalbounded());   // Already checked in code generator.
   ASSERT(!type.IsDynamicType());  // No need to check assignment.
   Error& bound_error = Error::Handle(zone);
-  const Bool& result =
-      Bool::Get(instance.IsInstanceOf(type,
-                                      instantiator_type_arguments,
-                                      &bound_error));
+  const Bool& result = Bool::Get(
+      instance.IsInstanceOf(type, instantiator_type_arguments, &bound_error));
   if (FLAG_trace_type_checks) {
-    PrintTypeCheck("InstanceOf",
-        instance, type, instantiator_type_arguments, result);
+    PrintTypeCheck("InstanceOf", instance, type, instantiator_type_arguments,
+                   result);
   }
   if (!result.value() && !bound_error.IsNull()) {
     // Throw a dynamic type error only if the instanceof test fails.
     const TokenPosition location = GetCallerLocation();
-    String& bound_error_message =  String::Handle(
-        zone, String::New(bound_error.ToErrorCString()));
-    Exceptions::CreateAndThrowTypeError(
-        location, AbstractType::Handle(zone), AbstractType::Handle(zone),
-        Symbols::Empty(), bound_error_message);
+    String& bound_error_message =
+        String::Handle(zone, String::New(bound_error.ToErrorCString()));
+    Exceptions::CreateAndThrowTypeError(location, AbstractType::Handle(zone),
+                                        AbstractType::Handle(zone),
+                                        Symbols::Empty(), bound_error_message);
     UNREACHABLE();
   }
-  UpdateTypeTestCache(
-      instance, type, instantiator_type_arguments, result, cache);
+  UpdateTypeTestCache(instance, type, instantiator_type_arguments, result,
+                      cache);
   arguments.SetReturn(result);
 }
 
@@ -528,19 +534,18 @@
   const String& dst_name = String::CheckedHandle(zone, arguments.ArgAt(3));
   const SubtypeTestCache& cache =
       SubtypeTestCache::CheckedHandle(zone, arguments.ArgAt(4));
-  ASSERT(!dst_type.IsMalformed());  // Already checked in code generator.
-  ASSERT(!dst_type.IsMalbounded());  // Already checked in code generator.
+  ASSERT(!dst_type.IsMalformed());    // Already checked in code generator.
+  ASSERT(!dst_type.IsMalbounded());   // Already checked in code generator.
   ASSERT(!dst_type.IsDynamicType());  // No need to check assignment.
-  ASSERT(!src_instance.IsNull());  // Already checked in inlined code.
+  ASSERT(!src_instance.IsNull());     // Already checked in inlined code.
 
   Error& bound_error = Error::Handle(zone);
   const bool is_instance_of = src_instance.IsInstanceOf(
       dst_type, instantiator_type_arguments, &bound_error);
 
   if (FLAG_trace_type_checks) {
-    PrintTypeCheck("TypeCheck",
-                   src_instance, dst_type, instantiator_type_arguments,
-                   Bool::Get(is_instance_of));
+    PrintTypeCheck("TypeCheck", src_instance, dst_type,
+                   instantiator_type_arguments, Bool::Get(is_instance_of));
   }
   if (!is_instance_of) {
     // Throw a dynamic type error.
@@ -553,17 +558,17 @@
                                           NULL, NULL, Heap::kNew);
       // Note that instantiated dst_type may be malbounded.
     }
-    String& bound_error_message =  String::Handle(zone);
+    String& bound_error_message = String::Handle(zone);
     if (!bound_error.IsNull()) {
       ASSERT(isolate->type_checks());
       bound_error_message = String::New(bound_error.ToErrorCString());
     }
-    Exceptions::CreateAndThrowTypeError(location, src_type, dst_type,
-                                        dst_name, bound_error_message);
+    Exceptions::CreateAndThrowTypeError(location, src_type, dst_type, dst_name,
+                                        bound_error_message);
     UNREACHABLE();
   }
-  UpdateTypeTestCache(
-      src_instance, dst_type, instantiator_type_arguments, Bool::True(), cache);
+  UpdateTypeTestCache(src_instance, dst_type, instantiator_type_arguments,
+                      Bool::True(), cache);
   arguments.SetReturn(src_instance);
 }
 
@@ -580,8 +585,11 @@
 
   if (src_instance.IsNull()) {
     const Array& args = Array::Handle(zone, Array::New(4));
-    args.SetAt(0, String::Handle(zone,
-        String::New("Failed assertion: boolean expression must not be null")));
+    args.SetAt(
+        0, String::Handle(
+               zone,
+               String::New(
+                   "Failed assertion: boolean expression must not be null")));
 
     // No source code for this assertion, set url to null.
     args.SetAt(1, String::Handle(zone, String::null()));
@@ -617,22 +625,20 @@
       AbstractType::CheckedHandle(zone, arguments.ArgAt(2));
   const AbstractType& src_type =
       AbstractType::Handle(zone, src_value.GetType());
-  Exceptions::CreateAndThrowTypeError(
-      location, src_type, dst_type, dst_name, String::Handle(zone));
+  Exceptions::CreateAndThrowTypeError(location, src_type, dst_type, dst_name,
+                                      String::Handle(zone));
   UNREACHABLE();
 }
 
 
 DEFINE_RUNTIME_ENTRY(Throw, 1) {
-  const Instance& exception =
-      Instance::CheckedHandle(zone, arguments.ArgAt(0));
+  const Instance& exception = Instance::CheckedHandle(zone, arguments.ArgAt(0));
   Exceptions::Throw(thread, exception);
 }
 
 
 DEFINE_RUNTIME_ENTRY(ReThrow, 2) {
-  const Instance& exception =
-      Instance::CheckedHandle(zone, arguments.ArgAt(0));
+  const Instance& exception = Instance::CheckedHandle(zone, arguments.ArgAt(0));
   const Instance& stacktrace =
       Instance::CheckedHandle(zone, arguments.ArgAt(1));
   Exceptions::ReThrow(thread, exception, stacktrace);
@@ -662,17 +668,15 @@
   // target.
   ASSERT(target_code.raw() !=
          CodePatcher::GetStaticCallTargetAt(caller_frame->pc(), caller_code));
-  CodePatcher::PatchStaticCallAt(caller_frame->pc(),
-                                 caller_code,
-                                 target_code);
+  CodePatcher::PatchStaticCallAt(caller_frame->pc(), caller_code, target_code);
   caller_code.SetStaticCallTargetCodeAt(caller_frame->pc(), target_code);
   if (FLAG_trace_patching) {
-    THR_Print("PatchStaticCall: patching caller pc %#" Px ""
-        " to '%s' new entry point %#" Px " (%s)\n",
-        caller_frame->pc(),
-        target_function.ToFullyQualifiedCString(),
-        target_code.UncheckedEntryPoint(),
-        target_code.is_optimized() ? "optimized" : "unoptimized");
+    THR_Print("PatchStaticCall: patching caller pc %#" Px
+              ""
+              " to '%s' new entry point %#" Px " (%s)\n",
+              caller_frame->pc(), target_function.ToFullyQualifiedCString(),
+              target_code.UncheckedEntryPoint(),
+              target_code.is_optimized() ? "optimized" : "unoptimized");
   }
   arguments.SetReturn(target_code);
 }
@@ -752,24 +756,21 @@
   const int kNumArguments = 1;
   ArgumentsDescriptor args_desc(
       Array::Handle(ArgumentsDescriptor::New(kNumArguments)));
-  const Function& getter = Function::Handle(
-      Resolver::ResolveDynamicForReceiverClass(receiver_class,
-                                               getter_name,
-                                               args_desc));
+  const Function& getter =
+      Function::Handle(Resolver::ResolveDynamicForReceiverClass(
+          receiver_class, getter_name, args_desc));
   if (getter.IsNull() || getter.IsMethodExtractor()) {
     return false;
   }
   const Function& target_function =
       Function::Handle(receiver_class.GetInvocationDispatcher(
-          target_name,
-          arguments_descriptor,
-          RawFunction::kInvokeFieldDispatcher,
-          FLAG_lazy_dispatchers));
+          target_name, arguments_descriptor,
+          RawFunction::kInvokeFieldDispatcher, FLAG_lazy_dispatchers));
   ASSERT(!target_function.IsNull() || !FLAG_lazy_dispatchers);
   if (FLAG_trace_ic) {
-    OS::PrintErr("InvokeField IC miss: adding <%s> id:%" Pd " -> <%s>\n",
-        Class::Handle(receiver.clazz()).ToCString(),
-        receiver.GetClassId(),
+    OS::PrintErr(
+        "InvokeField IC miss: adding <%s> id:%" Pd " -> <%s>\n",
+        Class::Handle(receiver.clazz()).ToCString(), receiver.GetClassId(),
         target_function.IsNull() ? "null" : target_function.ToCString());
   }
   *result = target_function.raw();
@@ -778,29 +779,23 @@
 
 
 // Handle other invocations (implicit closures, noSuchMethod).
-RawFunction* InlineCacheMissHelper(
-    const Instance& receiver,
-    const Array& args_descriptor,
-    const String& target_name) {
+RawFunction* InlineCacheMissHelper(const Instance& receiver,
+                                   const Array& args_descriptor,
+                                   const String& target_name) {
   const Class& receiver_class = Class::Handle(receiver.clazz());
 
   Function& result = Function::Handle();
-  if (!ResolveCallThroughGetter(receiver,
-                                receiver_class,
-                                target_name,
-                                args_descriptor,
-                                &result)) {
+  if (!ResolveCallThroughGetter(receiver, receiver_class, target_name,
+                                args_descriptor, &result)) {
     ArgumentsDescriptor desc(args_descriptor);
     const Function& target_function =
         Function::Handle(receiver_class.GetInvocationDispatcher(
-            target_name,
-            args_descriptor,
-            RawFunction::kNoSuchMethodDispatcher,
+            target_name, args_descriptor, RawFunction::kNoSuchMethodDispatcher,
             FLAG_lazy_dispatchers));
     if (FLAG_trace_ic) {
-      OS::PrintErr("NoSuchMethod IC miss: adding <%s> id:%" Pd " -> <%s>\n",
-          Class::Handle(receiver.clazz()).ToCString(),
-          receiver.GetClassId(),
+      OS::PrintErr(
+          "NoSuchMethod IC miss: adding <%s> id:%" Pd " -> <%s>\n",
+          Class::Handle(receiver.clazz()).ToCString(), receiver.GetClassId(),
           target_function.IsNull() ? "null" : target_function.ToCString());
     }
     result = target_function.raw();
@@ -821,10 +816,9 @@
   bool result = receiver.IsInstanceOf(type, checked_type_arguments, &error);
   ASSERT(error.IsNull());
   ObjectStore* store = Isolate::Current()->object_store();
-  const Function& target
-      = Function::Handle(result
-                         ? store->simple_instance_of_true_function()
-                         : store->simple_instance_of_false_function());
+  const Function& target =
+      Function::Handle(result ? store->simple_instance_of_true_function()
+                              : store->simple_instance_of_false_function());
   ASSERT(!target.IsNull());
   return target.raw();
 }
@@ -834,8 +828,8 @@
     const GrowableArray<const Instance*>& args,
     const ICData& ic_data) {
   const Instance& receiver = *args[0];
-  ArgumentsDescriptor
-      arguments_descriptor(Array::Handle(ic_data.arguments_descriptor()));
+  ArgumentsDescriptor arguments_descriptor(
+      Array::Handle(ic_data.arguments_descriptor()));
   String& function_name = String::Handle(ic_data.target_name());
   ASSERT(function_name.IsSymbol());
 
@@ -846,8 +840,8 @@
   if (target_function.raw() == store->simple_instance_of_function()) {
     // Replace the target function with constant function.
     const AbstractType& type = AbstractType::Cast(*args[1]);
-    target_function
-        = ComputeTypeCheckTarget(receiver, type, arguments_descriptor);
+    target_function =
+        ComputeTypeCheckTarget(receiver, type, arguments_descriptor);
   }
   if (target_function.IsNull()) {
     if (FLAG_trace_ic) {
@@ -858,9 +852,8 @@
     const Array& args_descriptor =
         Array::Handle(ic_data.arguments_descriptor());
     const String& target_name = String::Handle(ic_data.target_name());
-    target_function = InlineCacheMissHelper(receiver,
-                                            args_descriptor,
-                                            target_name);
+    target_function =
+        InlineCacheMissHelper(receiver, args_descriptor, target_name);
   }
   if (target_function.IsNull()) {
     ASSERT(!FLAG_lazy_dispatchers);
@@ -884,18 +877,17 @@
       const Code& caller = Code::Handle(Code::LookupCode(caller_frame->pc()));
       if (caller.is_optimized()) {
         OS::PrintErr("IC miss in optimized code; call %s -> %s\n",
-            Function::Handle(caller.function()).ToCString(),
-            target_function.ToCString());
+                     Function::Handle(caller.function()).ToCString(),
+                     target_function.ToCString());
       }
     }
     if (FLAG_trace_ic) {
-      OS::PrintErr("InlineCacheMissHandler %" Pd " call at %#" Px "' "
+      OS::PrintErr("InlineCacheMissHandler %" Pd " call at %#" Px
+                   "' "
                    "adding <%s> id:%" Pd " -> <%s>\n",
-          args.length(),
-          caller_frame->pc(),
-          Class::Handle(receiver.clazz()).ToCString(),
-          receiver.GetClassId(),
-          target_function.ToCString());
+                   args.length(), caller_frame->pc(),
+                   Class::Handle(receiver.clazz()).ToCString(),
+                   receiver.GetClassId(), target_function.ToCString());
     }
   }
   return target_function.raw();
@@ -970,8 +962,8 @@
   ASSERT(ic_data.NumberOfChecks() == 1);
   const Function& target = Function::Handle(ic_data.GetTargetAt(0));
   if (!target.HasCode()) {
-    const Error& error = Error::Handle(Compiler::CompileFunction(thread,
-                                                                 target));
+    const Error& error =
+        Error::Handle(Compiler::CompileFunction(thread, target));
     if (!error.IsNull()) {
       Exceptions::PropagateError(error);
     }
@@ -982,8 +974,7 @@
     DartFrameIterator iterator;
     StackFrame* caller_frame = iterator.NextFrame();
     ASSERT(caller_frame != NULL);
-    OS::PrintErr("StaticCallMissHandler at %#" Px
-                 " target %s (%" Pd ")\n",
+    OS::PrintErr("StaticCallMissHandler at %#" Px " target %s (%" Pd ")\n",
                  caller_frame->pc(), target.ToCString(), arg.GetClassId());
   }
   arguments.SetReturn(target);
@@ -1003,8 +994,8 @@
   ASSERT(ic_data.NumberOfChecks() > 0);
   const Function& target = Function::Handle(ic_data.GetTargetAt(0));
   if (!target.HasCode()) {
-    const Error& error = Error::Handle(Compiler::CompileFunction(thread,
-                                                                 target));
+    const Error& error =
+        Error::Handle(Compiler::CompileFunction(thread, target));
     if (!error.IsNull()) {
       Exceptions::PropagateError(error);
     }
@@ -1018,8 +1009,8 @@
     DartFrameIterator iterator;
     StackFrame* caller_frame = iterator.NextFrame();
     ASSERT(caller_frame != NULL);
-    OS::PrintErr("StaticCallMissHandler at %#" Px
-                 " target %s (%" Pd ", %" Pd ")\n",
+    OS::PrintErr("StaticCallMissHandler at %#" Px " target %s (%" Pd ", %" Pd
+                 ")\n",
                  caller_frame->pc(), target.ToCString(), cids[0], cids[1]);
   }
   arguments.SetReturn(target);
@@ -1041,8 +1032,8 @@
     cls = table->At(cid);
     if (cls.is_abstract()) continue;
     if (!cls.is_allocated()) continue;
-    other_target = Resolver::ResolveDynamicAnyArgs(zone, cls, name,
-                                                   false /* allow_add */);
+    other_target =
+        Resolver::ResolveDynamicAnyArgs(zone, cls, name, false /* allow_add */);
     if (other_target.raw() != target.raw()) {
       return false;
     }
@@ -1070,8 +1061,8 @@
       Function::Handle(zone, caller_frame->LookupDartFunction());
 
   SingleTargetCache& cache = SingleTargetCache::Handle(zone);
-  cache ^= CodePatcher::GetSwitchableCallDataAt(caller_frame->pc(),
-                                                caller_code);
+  cache ^=
+      CodePatcher::GetSwitchableCallDataAt(caller_frame->pc(), caller_code);
   Code& old_target_code = Code::Handle(zone, cache.target());
   Function& old_target = Function::Handle(zone);
   old_target ^= old_target_code.owner();
@@ -1079,23 +1070,18 @@
   // We lost the original ICData when we patched to the monomorphic case.
   const String& name = String::Handle(zone, old_target.name());
   ASSERT(!old_target.HasOptionalParameters());
-  const Array& descriptor = Array::Handle(zone,
-      ArgumentsDescriptor::New(old_target.num_fixed_parameters()));
+  const Array& descriptor = Array::Handle(
+      zone, ArgumentsDescriptor::New(old_target.num_fixed_parameters()));
   const ICData& ic_data =
-      ICData::Handle(zone, ICData::New(caller_function,
-                                       name,
-                                       descriptor,
-                                       Thread::kNoDeoptId,
-                                       1, /* args_tested */
+      ICData::Handle(zone, ICData::New(caller_function, name, descriptor,
+                                       Thread::kNoDeoptId, 1, /* args_tested */
                                        false /* static_call */));
 
   // Maybe add the new target.
   Class& cls = Class::Handle(zone, receiver.clazz());
   ArgumentsDescriptor args_desc(descriptor);
-  Function& target_function = Function::Handle(zone,
-      Resolver::ResolveDynamicForReceiverClass(cls,
-                                               name,
-                                               args_desc));
+  Function& target_function = Function::Handle(
+      zone, Resolver::ResolveDynamicForReceiverClass(cls, name, args_desc));
   if (target_function.IsNull()) {
     target_function = InlineCacheMissHelper(receiver, descriptor, name);
   }
@@ -1134,9 +1120,7 @@
   const Code& stub =
       Code::Handle(zone, StubCode::ICCallThroughCode_entry()->code());
   ASSERT(!Isolate::Current()->compilation_allowed());
-  CodePatcher::PatchSwitchableCallAt(caller_frame->pc(),
-                                     caller_code,
-                                     ic_data,
+  CodePatcher::PatchSwitchableCallAt(caller_frame->pc(), caller_code, ic_data,
                                      stub);
 
   // Return the ICData. The single target stub will jump to continue in the
@@ -1158,27 +1142,21 @@
   DartFrameIterator iterator;
   StackFrame* caller_frame = iterator.NextFrame();
   ASSERT(caller_frame->IsDartFrame());
-  const Code& caller_code =
-      Code::Handle(zone, caller_frame->LookupDartCode());
+  const Code& caller_code = Code::Handle(zone, caller_frame->LookupDartCode());
   const Function& caller_function =
       Function::Handle(zone, caller_frame->LookupDartFunction());
 
   const String& name = String::Handle(zone, unlinked.target_name());
   const Array& descriptor = Array::Handle(zone, unlinked.args_descriptor());
   const ICData& ic_data =
-      ICData::Handle(zone, ICData::New(caller_function,
-                                       name,
-                                       descriptor,
-                                       Thread::kNoDeoptId,
-                                       1, /* args_tested */
+      ICData::Handle(zone, ICData::New(caller_function, name, descriptor,
+                                       Thread::kNoDeoptId, 1, /* args_tested */
                                        false /* static_call */));
 
   Class& cls = Class::Handle(zone, receiver.clazz());
   ArgumentsDescriptor args_desc(descriptor);
-  Function& target_function = Function::Handle(zone,
-      Resolver::ResolveDynamicForReceiverClass(cls,
-                                               name,
-                                               args_desc));
+  Function& target_function = Function::Handle(
+      zone, Resolver::ResolveDynamicForReceiverClass(cls, name, args_desc));
   if (target_function.IsNull()) {
     target_function = InlineCacheMissHelper(receiver, descriptor, name);
   }
@@ -1188,12 +1166,10 @@
     ic_data.AddReceiverCheck(receiver.GetClassId(), target_function);
   }
 
-  if (!target_function.IsNull() &&
-      !target_function.HasOptionalParameters()) {
+  if (!target_function.IsNull() && !target_function.HasOptionalParameters()) {
     // Patch to monomorphic call.
     ASSERT(target_function.HasCode());
-    const Code& target_code =
-        Code::Handle(zone, target_function.CurrentCode());
+    const Code& target_code = Code::Handle(zone, target_function.CurrentCode());
     const Smi& expected_cid =
         Smi::Handle(zone, Smi::New(receiver.GetClassId()));
     CodePatcher::PatchSwitchableCallAt(caller_frame->pc(), caller_code,
@@ -1209,9 +1185,7 @@
   const Code& stub =
       Code::Handle(zone, StubCode::ICCallThroughCode_entry()->code());
   ASSERT(!Isolate::Current()->compilation_allowed());
-  CodePatcher::PatchSwitchableCallAt(caller_frame->pc(),
-                                     caller_code,
-                                     ic_data,
+  CodePatcher::PatchSwitchableCallAt(caller_frame->pc(), caller_code, ic_data,
                                      stub);
 
   // Return the ICData. The miss stub will jump to continue in the IC lookup
@@ -1239,25 +1213,21 @@
       Function::Handle(zone, caller_frame->LookupDartFunction());
 
   Smi& old_expected_cid = Smi::Handle(zone);
-  old_expected_cid ^= CodePatcher::GetSwitchableCallDataAt(caller_frame->pc(),
-                                                          caller_code);
-  const Code& old_target_code =
-      Code::Handle(CodePatcher::GetSwitchableCallTargetAt(caller_frame->pc(),
-                                                          caller_code));
+  old_expected_cid ^=
+      CodePatcher::GetSwitchableCallDataAt(caller_frame->pc(), caller_code);
+  const Code& old_target_code = Code::Handle(
+      CodePatcher::GetSwitchableCallTargetAt(caller_frame->pc(), caller_code));
   Function& old_target = Function::Handle(zone);
   old_target ^= old_target_code.owner();
 
   // We lost the original ICData when we patched to the monomorphic case.
   const String& name = String::Handle(zone, old_target.name());
   ASSERT(!old_target.HasOptionalParameters());
-  const Array& descriptor = Array::Handle(zone,
-      ArgumentsDescriptor::New(old_target.num_fixed_parameters()));
+  const Array& descriptor = Array::Handle(
+      zone, ArgumentsDescriptor::New(old_target.num_fixed_parameters()));
   const ICData& ic_data =
-      ICData::Handle(zone, ICData::New(caller_function,
-                                       name,
-                                       descriptor,
-                                       Thread::kNoDeoptId,
-                                       1, /* args_tested */
+      ICData::Handle(zone, ICData::New(caller_function, name, descriptor,
+                                       Thread::kNoDeoptId, 1, /* args_tested */
                                        false /* static_call */));
 
   // Add the first target.
@@ -1266,10 +1236,8 @@
   // Maybe add the new target.
   Class& cls = Class::Handle(zone, receiver.clazz());
   ArgumentsDescriptor args_desc(descriptor);
-  Function& target_function = Function::Handle(zone,
-      Resolver::ResolveDynamicForReceiverClass(cls,
-                                               name,
-                                               args_desc));
+  Function& target_function = Function::Handle(
+      zone, Resolver::ResolveDynamicForReceiverClass(cls, name, args_desc));
   if (target_function.IsNull()) {
     target_function = InlineCacheMissHelper(receiver, descriptor, name);
   }
@@ -1297,11 +1265,9 @@
       cache.set_entry_point(code.UncheckedEntryPoint());
       cache.set_lower_limit(lower);
       cache.set_upper_limit(upper);
-      const Code& stub = Code::Handle(zone,
-          StubCode::SingleTargetCall_entry()->code());
-      CodePatcher::PatchSwitchableCallAt(caller_frame->pc(),
-                                         caller_code,
-                                         cache,
+      const Code& stub =
+          Code::Handle(zone, StubCode::SingleTargetCall_entry()->code());
+      CodePatcher::PatchSwitchableCallAt(caller_frame->pc(), caller_code, cache,
                                          stub);
       // Return the ICData. The miss stub will jump to continue in the IC call
       // stub.
@@ -1314,9 +1280,7 @@
   const Code& stub =
       Code::Handle(zone, StubCode::ICCallThroughCode_entry()->code());
   ASSERT(!Isolate::Current()->compilation_allowed());
-  CodePatcher::PatchSwitchableCallAt(caller_frame->pc(),
-                                     caller_code,
-                                     ic_data,
+  CodePatcher::PatchSwitchableCallAt(caller_frame->pc(), caller_code, ic_data,
                                      stub);
 
   // Return the ICData. The miss stub will jump to continue in the IC lookup
@@ -1354,10 +1318,8 @@
   }
 
   ArgumentsDescriptor args_desc(descriptor);
-  Function& target_function = Function::Handle(zone,
-      Resolver::ResolveDynamicForReceiverClass(cls,
-                                               name,
-                                               args_desc));
+  Function& target_function = Function::Handle(
+      zone, Resolver::ResolveDynamicForReceiverClass(cls, name, args_desc));
   if (target_function.IsNull()) {
     target_function = InlineCacheMissHelper(receiver, descriptor, name);
   }
@@ -1382,7 +1344,7 @@
 
       if (!target_function.HasCode()) {
         const Error& error =
-          Error::Handle(Compiler::CompileFunction(thread, target_function));
+            Error::Handle(Compiler::CompileFunction(thread, target_function));
         if (!error.IsNull()) {
           Exceptions::PropagateError(error);
         }
@@ -1406,8 +1368,8 @@
       ic_data.AddReceiverCheck(receiver.GetClassId(), target_function);
       if (ic_data.NumberOfChecks() > FLAG_max_polymorphic_checks) {
         // Switch to megamorphic call.
-        const MegamorphicCache& cache = MegamorphicCache::Handle(zone,
-            MegamorphicCacheTable::Lookup(isolate, name, descriptor));
+        const MegamorphicCache& cache = MegamorphicCache::Handle(
+            zone, MegamorphicCacheTable::Lookup(isolate, name, descriptor));
         DartFrameIterator iterator;
         StackFrame* miss_function_frame = iterator.NextFrame();
         ASSERT(miss_function_frame->IsDartFrame());
@@ -1457,26 +1419,24 @@
   Class& cls = Class::Handle(zone, receiver.clazz());
   Function& function = Function::Handle(zone);
 
-  // Dart distinguishes getters and regular methods and allows their calls
-  // to mix with conversions, and its selectors are independent of arity. So do
-  // a zigzagged lookup to see if this call failed because of an arity mismatch,
-  // need for conversion, or there really is no such method.
+// Dart distinguishes getters and regular methods and allows their calls
+// to mix with conversions, and its selectors are independent of arity. So do
+// a zigzagged lookup to see if this call failed because of an arity mismatch,
+// need for conversion, or there really is no such method.
 
 #define NO_SUCH_METHOD()                                                       \
-  const Object& result = Object::Handle(zone,                                  \
-      DartEntry::InvokeNoSuchMethod(receiver,                                  \
-                                    target_name,                               \
-                                    orig_arguments,                            \
-                                    orig_arguments_desc));                     \
+  const Object& result = Object::Handle(                                       \
+      zone, DartEntry::InvokeNoSuchMethod(                                     \
+                receiver, target_name, orig_arguments, orig_arguments_desc));  \
   CheckResultError(result);                                                    \
-  arguments.SetReturn(result);                                                 \
+  arguments.SetReturn(result);
 
 #define CLOSURIZE(some_function)                                               \
   const Function& closure_function =                                           \
       Function::Handle(zone, some_function.ImplicitClosureFunction());         \
-  const Object& result =                                                       \
-      Object::Handle(zone, closure_function.ImplicitInstanceClosure(receiver));\
-  arguments.SetReturn(result);                                                 \
+  const Object& result = Object::Handle(                                       \
+      zone, closure_function.ImplicitInstanceClosure(receiver));               \
+  arguments.SetReturn(result);
 
   const bool is_getter = Field::IsGetterName(target_name);
   if (is_getter) {
@@ -1536,9 +1496,8 @@
       // Special case: closures are implemented with a call getter instead of a
       // call method and with lazy dispatchers the field-invocation-dispatcher
       // would perform the closure call.
-      const Object& result =
-        Object::Handle(zone, DartEntry::InvokeClosure(orig_arguments,
-                                                      orig_arguments_desc));
+      const Object& result = Object::Handle(
+          zone, DartEntry::InvokeClosure(orig_arguments, orig_arguments_desc));
       CheckResultError(result);
       arguments.SetReturn(result);
       return;
@@ -1557,16 +1516,15 @@
       if (!function.IsNull()) {
         const Array& getter_arguments = Array::Handle(Array::New(1));
         getter_arguments.SetAt(0, receiver);
-        const Object& getter_result =
-          Object::Handle(zone, DartEntry::InvokeFunction(function,
-                                                         getter_arguments));
+        const Object& getter_result = Object::Handle(
+            zone, DartEntry::InvokeFunction(function, getter_arguments));
         CheckResultError(getter_result);
         ASSERT(getter_result.IsNull() || getter_result.IsInstance());
 
         orig_arguments.SetAt(0, getter_result);
-        const Object& call_result =
-          Object::Handle(zone, DartEntry::InvokeClosure(orig_arguments,
-                                                        orig_arguments_desc));
+        const Object& call_result = Object::Handle(
+            zone,
+            DartEntry::InvokeClosure(orig_arguments, orig_arguments_desc));
         CheckResultError(call_result);
         arguments.SetReturn(call_result);
         return;
@@ -1582,7 +1540,6 @@
 }
 
 
-
 // Invoke appropriate noSuchMethod function.
 // Arg0: receiver (closure object)
 // Arg1: arguments descriptor array.
@@ -1598,11 +1555,8 @@
   const Function& function = Function::Handle(receiver.function());
   const String& original_function_name =
       String::Handle(function.QualifiedUserVisibleName());
-  const Object& result = Object::Handle(
-      DartEntry::InvokeNoSuchMethod(receiver,
-                                    original_function_name,
-                                    orig_arguments,
-                                    orig_arguments_desc));
+  const Object& result = Object::Handle(DartEntry::InvokeNoSuchMethod(
+      receiver, original_function_name, orig_arguments, orig_arguments_desc));
   CheckResultError(result);
   arguments.SetReturn(result);
 }
@@ -1638,29 +1592,24 @@
   bool do_reload = false;
   const intptr_t isolate_reload_every =
       isolate->reload_every_n_stack_overflow_checks();
-  if ((FLAG_deoptimize_every > 0) ||
-      (FLAG_stacktrace_every > 0) ||
+  if ((FLAG_deoptimize_every > 0) || (FLAG_stacktrace_every > 0) ||
       (isolate_reload_every > 0)) {
     // TODO(turnidge): To make --deoptimize_every and
     // --stacktrace-every faster we could move this increment/test to
     // the generated code.
     int32_t count = thread->IncrementAndGetStackOverflowCount();
-    if (FLAG_deoptimize_every > 0 &&
-        (count % FLAG_deoptimize_every) == 0) {
+    if (FLAG_deoptimize_every > 0 && (count % FLAG_deoptimize_every) == 0) {
       do_deopt = true;
     }
-    if (FLAG_stacktrace_every > 0 &&
-        (count % FLAG_stacktrace_every) == 0) {
+    if (FLAG_stacktrace_every > 0 && (count % FLAG_stacktrace_every) == 0) {
       do_stacktrace = true;
     }
-    if ((isolate_reload_every > 0) &&
-        (count % isolate_reload_every) == 0) {
+    if ((isolate_reload_every > 0) && (count % isolate_reload_every) == 0) {
       do_reload = isolate->CanReload();
     }
   }
-  if ((FLAG_deoptimize_filter != NULL) ||
-      (FLAG_stacktrace_filter != NULL) ||
-       FLAG_reload_every_optimized) {
+  if ((FLAG_deoptimize_filter != NULL) || (FLAG_stacktrace_filter != NULL) ||
+      FLAG_reload_every_optimized) {
     DartFrameIterator iterator;
     StackFrame* frame = iterator.NextFrame();
     ASSERT(frame != NULL);
@@ -1674,8 +1623,7 @@
       // Don't do the reload if we aren't inside optimized code.
       do_reload = false;
     }
-    if (code.is_optimized() &&
-        FLAG_deoptimize_filter != NULL &&
+    if (code.is_optimized() && FLAG_deoptimize_filter != NULL &&
         strstr(function_name, FLAG_deoptimize_filter) != NULL) {
       OS::PrintErr("*** Forcing deoptimization (%s)\n",
                    function.ToFullyQualifiedCString());
@@ -1725,7 +1673,7 @@
 #endif
       // Variable locations and number are unknown when precompiling.
       const int num_vars =
-         FLAG_precompiled_runtime ? 0 : frame->NumLocalVariables();
+          FLAG_precompiled_runtime ? 0 : frame->NumLocalVariables();
       TokenPosition unused = TokenPosition::kNoSource;
       for (intptr_t v = 0; v < num_vars; v++) {
         frame->VariableAt(v, &var_name, &unused, &unused, &unused, &var_value);
@@ -1775,8 +1723,7 @@
     ASSERT(osr_id != Compiler::kNoOSRDeoptId);
     if (FLAG_trace_osr) {
       OS::Print("Attempting OSR for %s at id=%" Pd ", count=%" Pd "\n",
-                function.ToFullyQualifiedCString(),
-                osr_id,
+                function.ToFullyQualifiedCString(), osr_id,
                 function.usage_counter());
     }
 
@@ -1784,8 +1731,8 @@
     // Since the code is referenced from the frame and the ZoneHandle,
     // it cannot have been removed from the function.
     ASSERT(!original_code.IsNull());
-    const Error& error = Error::Handle(Compiler::CompileOptimizedFunction(
-        thread, function, osr_id));
+    const Error& error = Error::Handle(
+        Compiler::CompileOptimizedFunction(thread, function, osr_id));
     if (!error.IsNull()) {
       Exceptions::PropagateError(error);
     }
@@ -1814,12 +1761,9 @@
   StackFrame* frame = iterator.NextFrame();
   ASSERT(frame != NULL);
   OS::PrintErr("IC call @%#" Px ": ICData: %p cnt:%" Pd " nchecks: %" Pd
-      " %s\n",
-      frame->pc(),
-      ic_data.raw(),
-      function.usage_counter(),
-      ic_data.NumberOfChecks(),
-      function.ToFullyQualifiedCString());
+               " %s\n",
+               frame->pc(), ic_data.raw(), function.usage_counter(),
+               ic_data.NumberOfChecks(), function.ToFullyQualifiedCString());
 }
 
 
@@ -1828,8 +1772,7 @@
 // Returns the Code object where to continue execution.
 DEFINE_RUNTIME_ENTRY(OptimizeInvokedFunction, 1) {
 #if !defined(DART_PRECOMPILED_RUNTIME)
-  const Function& function = Function::CheckedHandle(zone,
-                                                     arguments.ArgAt(0));
+  const Function& function = Function::CheckedHandle(zone, arguments.ArgAt(0));
   ASSERT(!function.IsNull());
   ASSERT(function.HasCode());
 
@@ -1914,25 +1857,23 @@
   const Function& target_function = Function::Handle(
       zone, caller_code.GetStaticCallTargetFunctionAt(frame->pc()));
   if (!target_function.HasCode()) {
-    const Error& error = Error::Handle(
-        zone, Compiler::CompileFunction(thread, target_function));
+    const Error& error =
+        Error::Handle(zone, Compiler::CompileFunction(thread, target_function));
     if (!error.IsNull()) {
       Exceptions::PropagateError(error);
     }
   }
   ASSERT(target_function.HasCode());
 
-  const Code& current_target_code = Code::Handle(
-      zone, target_function.CurrentCode());
-  CodePatcher::PatchStaticCallAt(frame->pc(),
-                                 caller_code,
-                                 current_target_code);
+  const Code& current_target_code =
+      Code::Handle(zone, target_function.CurrentCode());
+  CodePatcher::PatchStaticCallAt(frame->pc(), caller_code, current_target_code);
   caller_code.SetStaticCallTargetCodeAt(frame->pc(), current_target_code);
   if (FLAG_trace_patching) {
-    OS::PrintErr("FixCallersTarget: caller %#" Px " "
+    OS::PrintErr("FixCallersTarget: caller %#" Px
+                 " "
                  "target '%s' -> %#" Px "\n",
-                 frame->pc(),
-                 target_function.ToFullyQualifiedCString(),
+                 frame->pc(), target_function.ToFullyQualifiedCString(),
                  current_target_code.UncheckedEntryPoint());
   }
   ASSERT(!current_target_code.IsDisabled());
@@ -1967,16 +1908,14 @@
     alloc_stub = StubCode::GetAllocationStubForClass(alloc_class);
     ASSERT(!alloc_stub.IsDisabled());
   }
-  CodePatcher::PatchStaticCallAt(frame->pc(),
-                                 caller_code,
-                                 alloc_stub);
+  CodePatcher::PatchStaticCallAt(frame->pc(), caller_code, alloc_stub);
   caller_code.SetStubCallTargetCodeAt(frame->pc(), alloc_stub);
   if (FLAG_trace_patching) {
-    OS::PrintErr("FixAllocationStubTarget: caller %#" Px " alloc-class %s "
-        " -> %#" Px "\n",
-        frame->pc(),
-        alloc_class.ToCString(),
-        alloc_stub.UncheckedEntryPoint());
+    OS::PrintErr("FixAllocationStubTarget: caller %#" Px
+                 " alloc-class %s "
+                 " -> %#" Px "\n",
+                 frame->pc(), alloc_class.ToCString(),
+                 alloc_stub.UncheckedEntryPoint());
   }
   arguments.SetReturn(alloc_stub);
 #else
@@ -1987,8 +1926,10 @@
 
 const char* DeoptReasonToCString(ICData::DeoptReasonId deopt_reason) {
   switch (deopt_reason) {
-#define DEOPT_REASON_TO_TEXT(name) case ICData::kDeopt##name: return #name;
-DEOPT_REASONS(DEOPT_REASON_TO_TEXT)
+#define DEOPT_REASON_TO_TEXT(name)                                             \
+  case ICData::kDeopt##name:                                                   \
+    return #name;
+    DEOPT_REASONS(DEOPT_REASON_TO_TEXT)
 #undef DEOPT_REASON_TO_TEXT
     default:
       UNREACHABLE();
@@ -2019,13 +1960,12 @@
   const Instructions& instrs =
       Instructions::Handle(zone, optimized_code.instructions());
   {
-    WritableInstructionsScope writable(instrs.PayloadStart(), instrs.size());
+    WritableInstructionsScope writable(instrs.PayloadStart(), instrs.Size());
     CodePatcher::InsertDeoptimizationCallAt(frame->pc());
     if (FLAG_trace_patching) {
       const String& name = String::Handle(function.name());
-      OS::PrintErr(
-          "InsertDeoptimizationCallAt: 0x%" Px " for %s\n",
-          frame->pc(), name.ToCString());
+      OS::PrintErr("InsertDeoptimizationCallAt: 0x%" Px " for %s\n",
+                   frame->pc(), name.ToCString());
     }
     const ExceptionHandlers& handlers =
         ExceptionHandlers::Handle(zone, optimized_code.exception_handlers());
@@ -2126,7 +2066,8 @@
 // The calling code must be optimized, but its function may not have
 // have optimized code if the code is OSR code, or if the code was invalidated
 // through class loading/finalization or field guard.
-DEFINE_LEAF_RUNTIME_ENTRY(intptr_t, DeoptimizeCopyFrame,
+DEFINE_LEAF_RUNTIME_ENTRY(intptr_t,
+                          DeoptimizeCopyFrame,
                           2,
                           uword saved_registers_address,
                           uword is_lazy_deopt) {
@@ -2137,10 +2078,10 @@
   HANDLESCOPE(thread);
 
   // All registers have been saved below last-fp as if they were locals.
-  const uword last_fp = saved_registers_address
-                        + (kNumberOfSavedCpuRegisters * kWordSize)
-                        + (kNumberOfSavedFpuRegisters * kFpuRegisterSize)
-                        - ((kFirstLocalSlotFromFp + 1) * kWordSize);
+  const uword last_fp = saved_registers_address +
+                        (kNumberOfSavedCpuRegisters * kWordSize) +
+                        (kNumberOfSavedFpuRegisters * kFpuRegisterSize) -
+                        ((kFirstLocalSlotFromFp + 1) * kWordSize);
 
   // Get optimized code and frame that need to be deoptimized.
   DartFrameIterator iterator(last_fp);
@@ -2155,17 +2096,17 @@
   if (FLAG_trace_deoptimization) {
     const Function& function = Function::Handle(optimized_code.function());
     THR_Print("== Deoptimizing code for '%s', %s, %s\n",
-       function.ToFullyQualifiedCString(),
-       deoptimizing_code ? "code & frame" : "frame",
-       is_lazy_deopt ? "lazy-deopt" : "");
+              function.ToFullyQualifiedCString(),
+              deoptimizing_code ? "code & frame" : "frame",
+              is_lazy_deopt ? "lazy-deopt" : "");
   }
 
 #if !defined(TARGET_ARCH_DBC)
   if (is_lazy_deopt) {
     uword deopt_pc = isolate->FindPendingDeopt(caller_frame->fp());
     if (FLAG_trace_deoptimization) {
-      THR_Print("Lazy deopt fp=%" Pp " pc=%" Pp "\n",
-                caller_frame->fp(), deopt_pc);
+      THR_Print("Lazy deopt fp=%" Pp " pc=%" Pp "\n", caller_frame->fp(),
+                deopt_pc);
     }
 
     // N.B.: Update frame before updating pending deopt table. The profiler
@@ -2176,8 +2117,8 @@
     isolate->ClearPendingDeoptsAtOrBelow(caller_frame->fp());
   } else {
     if (FLAG_trace_deoptimization) {
-      THR_Print("Eager deopt fp=%" Pp " pc=%" Pp "\n",
-                caller_frame->fp(), caller_frame->pc());
+      THR_Print("Eager deopt fp=%" Pp " pc=%" Pp "\n", caller_frame->fp(),
+                caller_frame->pc());
     }
   }
 #endif  // !DBC
@@ -2188,14 +2129,9 @@
   CopySavedRegisters(saved_registers_address, &fpu_registers, &cpu_registers);
 
   // Create the DeoptContext.
-  DeoptContext* deopt_context =
-      new DeoptContext(caller_frame,
-                       optimized_code,
-                       DeoptContext::kDestIsOriginalFrame,
-                       fpu_registers,
-                       cpu_registers,
-                       is_lazy_deopt != 0,
-                       deoptimizing_code);
+  DeoptContext* deopt_context = new DeoptContext(
+      caller_frame, optimized_code, DeoptContext::kDestIsOriginalFrame,
+      fpu_registers, cpu_registers, is_lazy_deopt != 0, deoptimizing_code);
   isolate->set_deopt_context(deopt_context);
 
   // Stack size (FP - SP) in bytes.
diff --git a/runtime/vm/code_generator.h b/runtime/vm/code_generator.h
index d188504..65b8ca1 100644
--- a/runtime/vm/code_generator.h
+++ b/runtime/vm/code_generator.h
@@ -11,7 +11,8 @@
 namespace dart {
 
 class Array;
-template <typename T> class GrowableArray;
+template <typename T>
+class GrowableArray;
 class ICData;
 class Instance;
 
diff --git a/runtime/vm/code_generator_test.cc b/runtime/vm/code_generator_test.cc
index df97482..609debf 100644
--- a/runtime/vm/code_generator_test.cc
+++ b/runtime/vm/code_generator_test.cc
@@ -47,8 +47,8 @@
 
 // Helper to allocate and return a LocalVariable.
 static LocalVariable* NewTestLocalVariable(const char* name) {
-  const String& variable_name = String::ZoneHandle(
-      Symbols::New(Thread::Current(), name));
+  const String& variable_name =
+      String::ZoneHandle(Symbols::New(Thread::Current(), name));
   const Type& variable_type = Type::ZoneHandle(Type::DynamicType());
   return new LocalVariable(kPos, kPos, variable_name, variable_type);
 }
@@ -73,8 +73,8 @@
   SequenceNode* node_seq = test->node_sequence();
   ArgumentListNode* arguments = new ArgumentListNode(kPos);
   arguments->Add(new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(3))));
-  node_seq->Add(new ReturnNode(kPos,
-                               new StaticCallNode(kPos, function, arguments)));
+  node_seq->Add(
+      new ReturnNode(kPos, new StaticCallNode(kPos, function, arguments)));
 }
 CODEGEN_TEST2_RUN(StaticCallReturnParameterCodegen,
                   ReturnParameterCodegen,
@@ -96,10 +96,9 @@
   const Function& function = test->function();
   function.set_num_fixed_parameters(num_params);
   ASSERT(!function.HasOptionalParameters());
-  BinaryOpNode* add = new BinaryOpNode(kPos,
-                                       Token::kADD,
-                                       new LoadLocalNode(kPos, param1),
-                                       new LoadLocalNode(kPos, param2));
+  BinaryOpNode* add =
+      new BinaryOpNode(kPos, Token::kADD, new LoadLocalNode(kPos, param1),
+                       new LoadLocalNode(kPos, param2));
   node_seq->Add(new StoreLocalNode(kPos, sum, add));
   node_seq->Add(new ReturnNode(kPos, new LoadLocalNode(kPos, sum)));
 }
@@ -111,12 +110,10 @@
   ArgumentListNode* arguments = new ArgumentListNode(kPos);
   arguments->Add(new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(3))));
   arguments->Add(new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(2))));
-  node_seq->Add(new ReturnNode(kPos,
-                               new StaticCallNode(kPos, function, arguments)));
+  node_seq->Add(
+      new ReturnNode(kPos, new StaticCallNode(kPos, function, arguments)));
 }
-CODEGEN_TEST2_RUN(StaticCallSmiParamSumCodegen,
-                  SmiParamSumCodegen,
-                  Smi::New(5))
+CODEGEN_TEST2_RUN(StaticCallSmiParamSumCodegen, SmiParamSumCodegen, Smi::New(5))
 
 
 CODEGEN_TEST_GENERATE(SmiAddCodegen, test) {
@@ -221,16 +218,16 @@
   lib.Register(thread);
   Library& core_lib = Library::Handle(zone, Library::CoreLibrary());
   ASSERT(!core_lib.IsNull());
-  const Namespace& core_ns = Namespace::Handle(zone,
-      Namespace::New(core_lib, Array::Handle(zone), Array::Handle(zone)));
+  const Namespace& core_ns = Namespace::Handle(
+      zone, Namespace::New(core_lib, Array::Handle(zone), Array::Handle(zone)));
   lib.AddImport(core_ns);
   return lib;
 }
 
 
 static RawClass* LookupClass(const Library& lib, const char* name) {
-  const String& cls_name = String::ZoneHandle(Symbols::New(Thread::Current(),
-                                                           name));
+  const String& cls_name =
+      String::ZoneHandle(Symbols::New(Thread::Current(), name));
   return lib.LookupClass(cls_name);
 }
 
@@ -244,9 +241,8 @@
 
   String& url = String::Handle(String::New("dart-test:CompileScript"));
   String& source = String::Handle(String::New(kScriptChars));
-  Script& script = Script::Handle(Script::New(url,
-                                              source,
-                                              RawScript::kScriptTag));
+  Script& script =
+      Script::Handle(Script::New(url, source, RawScript::kScriptTag));
   Library& lib = MakeTestLibrary("TestLib");
   EXPECT(CompilerTest::TestCompileScript(lib, script));
   EXPECT(ClassFinalizer::ProcessPendingClasses());
@@ -291,9 +287,8 @@
 
   String& url = String::Handle(String::New("dart-test:CompileScript"));
   String& source = String::Handle(String::New(kScriptChars));
-  Script& script = Script::Handle(Script::New(url,
-                                              source,
-                                              RawScript::kScriptTag));
+  Script& script =
+      Script::Handle(Script::New(url, source, RawScript::kScriptTag));
   Library& lib = MakeTestLibrary("TestLib");
   EXPECT(CompilerTest::TestCompileScript(lib, script));
   EXPECT(ClassFinalizer::ProcessPendingClasses());
@@ -306,16 +301,14 @@
   EXPECT(!constructor.IsNull());
 
   // The unit test creates an instance of class A and calls function 'bar'.
-  String& function_bar_name = String::ZoneHandle(Symbols::New(Thread::Current(),
-                                                              "bar"));
+  String& function_bar_name =
+      String::ZoneHandle(Symbols::New(Thread::Current(), "bar"));
   ArgumentListNode* no_arguments = new ArgumentListNode(kPos);
   const TypeArguments& no_type_arguments = TypeArguments::ZoneHandle();
   InstanceCallNode* call_bar = new InstanceCallNode(
-      kPos,
-      new ConstructorCallNode(
-          kPos, no_type_arguments, constructor, no_arguments),
-      function_bar_name,
-      no_arguments);
+      kPos, new ConstructorCallNode(kPos, no_type_arguments, constructor,
+                                    no_arguments),
+      function_bar_name, no_arguments);
 
   test->node_sequence()->Add(new ReturnNode(kPos, call_bar));
 }
@@ -332,9 +325,8 @@
 
   String& url = String::Handle(String::New("dart-test:CompileScript"));
   String& source = String::Handle(String::New(kScriptChars));
-  Script& script = Script::Handle(Script::New(url,
-                                              source,
-                                              RawScript::kScriptTag));
+  Script& script =
+      Script::Handle(Script::New(url, source, RawScript::kScriptTag));
   Library& lib = MakeTestLibrary("TestLib");
   EXPECT(CompilerTest::TestCompileScript(lib, script));
   EXPECT(ClassFinalizer::ProcessPendingClasses());
@@ -348,8 +340,9 @@
 
   const TypeArguments& no_type_arguments = TypeArguments::ZoneHandle();
   ArgumentListNode* no_arguments = new ArgumentListNode(kPos);
-  test->node_sequence()->Add(new ReturnNode(kPos, new ConstructorCallNode(
-      kPos, no_type_arguments, constructor, no_arguments)));
+  test->node_sequence()->Add(
+      new ReturnNode(kPos, new ConstructorCallNode(kPos, no_type_arguments,
+                                                   constructor, no_arguments)));
 }
 
 
@@ -357,7 +350,7 @@
   const Object& result = Object::Handle(
       DartEntry::InvokeFunction(function, Object::empty_array()));
   EXPECT(!result.IsError());
-  const GrowableObjectArray& libs =  GrowableObjectArray::Handle(
+  const GrowableObjectArray& libs = GrowableObjectArray::Handle(
       Isolate::Current()->object_store()->libraries());
   ASSERT(!libs.IsNull());
   // App lib is the last one that was loaded.
@@ -365,9 +358,8 @@
   Library& app_lib = Library::Handle();
   app_lib ^= libs.At(num_libs - 1);
   ASSERT(!app_lib.IsNull());
-  const Class& cls = Class::Handle(
-      app_lib.LookupClass(String::Handle(Symbols::New(Thread::Current(),
-                                                      "A"))));
+  const Class& cls = Class::Handle(app_lib.LookupClass(
+      String::Handle(Symbols::New(Thread::Current(), "A"))));
   EXPECT_EQ(cls.raw(), result.clazz());
 }
 
diff --git a/runtime/vm/code_observers.h b/runtime/vm/code_observers.h
index 66794d9..1718d39 100644
--- a/runtime/vm/code_observers.h
+++ b/runtime/vm/code_observers.h
@@ -18,9 +18,9 @@
 // debuggers to map address ranges to function names.
 class CodeObserver {
  public:
-  CodeObserver() { }
+  CodeObserver() {}
 
-  virtual ~CodeObserver() { }
+  virtual ~CodeObserver() {}
 
   // Returns true if this observer is active and should be notified
   // about newly created code objects.
@@ -57,9 +57,7 @@
 
   static void DeleteAll();
 
-  static Mutex* mutex() {
-    return mutex_;
-  }
+  static Mutex* mutex() { return mutex_; }
 
  private:
   static Mutex* mutex_;
diff --git a/runtime/vm/code_patcher.cc b/runtime/vm/code_patcher.cc
index c62be00..0c46d74 100644
--- a/runtime/vm/code_patcher.cc
+++ b/runtime/vm/code_patcher.cc
@@ -17,8 +17,7 @@
                                                      intptr_t size)
     : address_(address), size_(size) {
   if (FLAG_write_protect_code) {
-    bool status = VirtualMemory::Protect(reinterpret_cast<void*>(address),
-                                         size,
+    bool status = VirtualMemory::Protect(reinterpret_cast<void*>(address), size,
                                          VirtualMemory::kReadWrite);
     ASSERT(status);
   }
@@ -28,8 +27,7 @@
 WritableInstructionsScope::~WritableInstructionsScope() {
   if (FLAG_write_protect_code) {
     bool status = VirtualMemory::Protect(reinterpret_cast<void*>(address_),
-                                         size_,
-                                         VirtualMemory::kReadExecute);
+                                         size_, VirtualMemory::kReadExecute);
     ASSERT(status);
   }
 }
diff --git a/runtime/vm/code_patcher_arm.cc b/runtime/vm/code_patcher_arm.cc
index 7640a5f..70507f8 100644
--- a/runtime/vm/code_patcher_arm.cc
+++ b/runtime/vm/code_patcher_arm.cc
@@ -54,8 +54,9 @@
 }
 
 
-RawFunction* CodePatcher::GetUnoptimizedStaticCallAt(
-    uword return_address, const Code& code, ICData* ic_data_result) {
+RawFunction* CodePatcher::GetUnoptimizedStaticCallAt(uword return_address,
+                                                     const Code& code,
+                                                     ICData* ic_data_result) {
   ASSERT(code.ContainsInstructionAt(return_address));
   CallPattern static_call(return_address, code);
   ICData& ic_data = ICData::Handle();
@@ -106,8 +107,8 @@
 
 
 RawCode* CodePatcher::GetNativeCallAt(uword return_address,
-                                     const Code& code,
-                                     NativeFunction* target) {
+                                      const Code& code,
+                                      NativeFunction* target) {
   ASSERT(code.ContainsInstructionAt(return_address));
   NativeCallPattern call(return_address, code);
   *target = call.native_function();
diff --git a/runtime/vm/code_patcher_arm64.cc b/runtime/vm/code_patcher_arm64.cc
index 658f406..b64b21d 100644
--- a/runtime/vm/code_patcher_arm64.cc
+++ b/runtime/vm/code_patcher_arm64.cc
@@ -15,17 +15,14 @@
 class PoolPointerCall : public ValueObject {
  public:
   PoolPointerCall(uword pc, const Code& code)
-      : end_(pc),
-        object_pool_(ObjectPool::Handle(code.GetObjectPool())) {
+      : end_(pc), object_pool_(ObjectPool::Handle(code.GetObjectPool())) {
     // Last instruction: blr ip0.
     ASSERT(*(reinterpret_cast<uint32_t*>(end_) - 1) == 0xd63f0200);
-    InstructionPattern::DecodeLoadWordFromPool(
-        end_ - 2 * Instr::kInstrSize, &reg_, &index_);
+    InstructionPattern::DecodeLoadWordFromPool(end_ - 2 * Instr::kInstrSize,
+                                               &reg_, &index_);
   }
 
-  intptr_t pp_index() const {
-    return index_;
-  }
+  intptr_t pp_index() const { return index_; }
 
   RawCode* Target() const {
     return reinterpret_cast<RawCode*>(object_pool_.ObjectAt(pp_index()));
@@ -94,8 +91,9 @@
 }
 
 
-RawFunction* CodePatcher::GetUnoptimizedStaticCallAt(
-    uword return_address, const Code& code, ICData* ic_data_result) {
+RawFunction* CodePatcher::GetUnoptimizedStaticCallAt(uword return_address,
+                                                     const Code& code,
+                                                     ICData* ic_data_result) {
   ASSERT(code.ContainsInstructionAt(return_address));
   CallPattern static_call(return_address, code);
   ICData& ic_data = ICData::Handle();
diff --git a/runtime/vm/code_patcher_arm64_test.cc b/runtime/vm/code_patcher_arm64_test.cc
index af3417f..ce077b6 100644
--- a/runtime/vm/code_patcher_arm64_test.cc
+++ b/runtime/vm/code_patcher_arm64_test.cc
@@ -26,22 +26,17 @@
   const Script& script = Script::Handle();
   const Class& owner_class = Class::Handle(Class::New(
       Library::Handle(), class_name, script, TokenPosition::kNoSource));
-  const String& function_name = String::Handle(Symbols::New(thread,
-                                                            "callerFunction"));
-  const Function& function = Function::Handle(
-      Function::New(function_name, RawFunction::kRegularFunction,
-                    true, false, false, false, false, owner_class,
-                    TokenPosition::kNoSource));
+  const String& function_name =
+      String::Handle(Symbols::New(thread, "callerFunction"));
+  const Function& function = Function::Handle(Function::New(
+      function_name, RawFunction::kRegularFunction, true, false, false, false,
+      false, owner_class, TokenPosition::kNoSource));
 
   const String& target_name = String::Handle(String::New("targetFunction"));
   const Array& args_descriptor =
       Array::Handle(ArgumentsDescriptor::New(1, Object::null_array()));
-  const ICData& ic_data = ICData::ZoneHandle(ICData::New(function,
-                                                         target_name,
-                                                         args_descriptor,
-                                                         15,
-                                                         1,
-                                                         false));
+  const ICData& ic_data = ICData::ZoneHandle(
+      ICData::New(function, target_name, args_descriptor, 15, 1, false));
 
   // Code accessing pp is generated, but not executed. Uninitialized pp is OK.
   __ set_constant_pool_allowed(true);
@@ -58,7 +53,7 @@
   ICData& ic_data = ICData::Handle();
   CodePatcher::GetInstanceCallAt(return_address, test->code(), &ic_data);
   EXPECT_STREQ("targetFunction",
-      String::Handle(ic_data.target_name()).ToCString());
+               String::Handle(ic_data.target_name()).ToCString());
   EXPECT_EQ(1, ic_data.NumArgsTested());
   EXPECT_EQ(0, ic_data.NumberOfChecks());
 }
diff --git a/runtime/vm/code_patcher_arm_test.cc b/runtime/vm/code_patcher_arm_test.cc
index f63c546..c3dce93 100644
--- a/runtime/vm/code_patcher_arm_test.cc
+++ b/runtime/vm/code_patcher_arm_test.cc
@@ -26,22 +26,17 @@
   const Script& script = Script::Handle();
   const Class& owner_class = Class::Handle(Class::New(
       Library::Handle(), class_name, script, TokenPosition::kNoSource));
-  const String& function_name = String::Handle(Symbols::New(thread,
-                                                            "callerFunction"));
-  const Function& function = Function::Handle(
-      Function::New(function_name, RawFunction::kRegularFunction,
-                    true, false, false, false, false, owner_class,
-                    TokenPosition::kNoSource));
+  const String& function_name =
+      String::Handle(Symbols::New(thread, "callerFunction"));
+  const Function& function = Function::Handle(Function::New(
+      function_name, RawFunction::kRegularFunction, true, false, false, false,
+      false, owner_class, TokenPosition::kNoSource));
 
   const String& target_name = String::Handle(String::New("targetFunction"));
   const Array& args_descriptor =
       Array::Handle(ArgumentsDescriptor::New(1, Object::null_array()));
-  const ICData& ic_data = ICData::ZoneHandle(ICData::New(function,
-                                                         target_name,
-                                                         args_descriptor,
-                                                         15,
-                                                         1,
-                                                         false));
+  const ICData& ic_data = ICData::ZoneHandle(
+      ICData::New(function, target_name, args_descriptor, 15, 1, false));
 
   // Code accessing pp is generated, but not executed. Uninitialized pp is OK.
   __ set_constant_pool_allowed(true);
@@ -58,7 +53,7 @@
   ICData& ic_data = ICData::Handle();
   CodePatcher::GetInstanceCallAt(return_address, test->code(), &ic_data);
   EXPECT_STREQ("targetFunction",
-      String::Handle(ic_data.target_name()).ToCString());
+               String::Handle(ic_data.target_name()).ToCString());
   EXPECT_EQ(1, ic_data.NumArgsTested());
   EXPECT_EQ(0, ic_data.NumberOfChecks());
 }
diff --git a/runtime/vm/code_patcher_dbc.cc b/runtime/vm/code_patcher_dbc.cc
index b24c32f..60cc9d6 100644
--- a/runtime/vm/code_patcher_dbc.cc
+++ b/runtime/vm/code_patcher_dbc.cc
@@ -53,8 +53,9 @@
 }
 
 
-RawFunction* CodePatcher::GetUnoptimizedStaticCallAt(
-    uword return_address, const Code& code, ICData* ic_data_result) {
+RawFunction* CodePatcher::GetUnoptimizedStaticCallAt(uword return_address,
+                                                     const Code& code,
+                                                     ICData* ic_data_result) {
   ASSERT(code.ContainsInstructionAt(return_address));
   CallPattern static_call(return_address, code);
   ICData& ic_data = ICData::Handle();
@@ -105,8 +106,8 @@
 
 
 RawCode* CodePatcher::GetNativeCallAt(uword return_address,
-                                     const Code& code,
-                                     NativeFunction* target) {
+                                      const Code& code,
+                                      NativeFunction* target) {
   ASSERT(code.ContainsInstructionAt(return_address));
   NativeCallPattern call(return_address, code);
   *target = call.native_function();
diff --git a/runtime/vm/code_patcher_ia32.cc b/runtime/vm/code_patcher_ia32.cc
index de3f74c..d0b0a3e 100644
--- a/runtime/vm/code_patcher_ia32.cc
+++ b/runtime/vm/code_patcher_ia32.cc
@@ -44,13 +44,9 @@
            (code_bytes[2 * kMovInstructionSize] == 0xFF);
   }
 
-  uword return_address() const {
-    return start_ + kPatternSize;
-  }
+  uword return_address() const { return start_ + kPatternSize; }
 
-  uword call_address() const {
-    return start_ + 2 * kMovInstructionSize;
-  }
+  uword call_address() const { return start_ + 2 * kMovInstructionSize; }
 
  protected:
   uword start_;
@@ -62,8 +58,7 @@
 
 class NativeCall : public UnoptimizedCall {
  public:
-  explicit NativeCall(uword return_address) : UnoptimizedCall(return_address) {
-  }
+  explicit NativeCall(uword return_address) : UnoptimizedCall(return_address) {}
 
   NativeFunction native_function() const {
     return *reinterpret_cast<NativeFunction*>(start_ + 1);
@@ -145,12 +140,10 @@
 
  private:
   uword return_address() const {
-    return start_ + kMovInstructionSize +  kCallInstructionSize;
+    return start_ + kMovInstructionSize + kCallInstructionSize;
   }
 
-  uword call_address() const {
-    return start_ + kMovInstructionSize;
-  }
+  uword call_address() const { return start_ + kMovInstructionSize; }
 
   uword start_;
 
@@ -170,7 +163,7 @@
                                     const Code& code,
                                     const Code& new_target) {
   const Instructions& instrs = Instructions::Handle(code.instructions());
-  WritableInstructionsScope writable(instrs.PayloadStart(), instrs.size());
+  WritableInstructionsScope writable(instrs.PayloadStart(), instrs.Size());
   ASSERT(code.ContainsInstructionAt(return_address));
   StaticCall call(return_address);
   call.set_target(new_target);
@@ -182,8 +175,9 @@
 }
 
 
-RawCode* CodePatcher::GetInstanceCallAt(
-    uword return_address, const Code& code, ICData* ic_data) {
+RawCode* CodePatcher::GetInstanceCallAt(uword return_address,
+                                        const Code& code,
+                                        ICData* ic_data) {
   ASSERT(code.ContainsInstructionAt(return_address));
   InstanceCall call(return_address);
   if (ic_data != NULL) {
@@ -193,8 +187,9 @@
 }
 
 
-RawFunction* CodePatcher::GetUnoptimizedStaticCallAt(
-    uword return_address, const Code& code, ICData* ic_data_result) {
+RawFunction* CodePatcher::GetUnoptimizedStaticCallAt(uword return_address,
+                                                     const Code& code,
+                                                     ICData* ic_data_result) {
   ASSERT(code.ContainsInstructionAt(return_address));
   UnoptimizedStaticCall static_call(return_address);
   ICData& ic_data = ICData::Handle();
@@ -247,7 +242,6 @@
 }
 
 
-
 intptr_t CodePatcher::InstanceCallSizeInBytes() {
   return InstanceCall::kPatternSize;
 }
diff --git a/runtime/vm/code_patcher_ia32_test.cc b/runtime/vm/code_patcher_ia32_test.cc
index e7a6fab..b3cf0cf 100644
--- a/runtime/vm/code_patcher_ia32_test.cc
+++ b/runtime/vm/code_patcher_ia32_test.cc
@@ -26,22 +26,17 @@
   const Script& script = Script::Handle();
   const Class& owner_class = Class::Handle(Class::New(
       Library::Handle(), class_name, script, TokenPosition::kNoSource));
-  const String& function_name = String::Handle(Symbols::New(thread,
-                                                            "callerFunction"));
-  const Function& function = Function::Handle(
-      Function::New(function_name, RawFunction::kRegularFunction,
-                    true, false, false, false, false, owner_class,
-                    TokenPosition::kNoSource));
+  const String& function_name =
+      String::Handle(Symbols::New(thread, "callerFunction"));
+  const Function& function = Function::Handle(Function::New(
+      function_name, RawFunction::kRegularFunction, true, false, false, false,
+      false, owner_class, TokenPosition::kNoSource));
 
   const String& target_name = String::Handle(String::New("targetFunction"));
   const Array& args_descriptor =
       Array::Handle(ArgumentsDescriptor::New(1, Object::null_array()));
-  const ICData& ic_data = ICData::ZoneHandle(ICData::New(function,
-                                                         target_name,
-                                                         args_descriptor,
-                                                         15,
-                                                         1,
-                                                         false));
+  const ICData& ic_data = ICData::ZoneHandle(
+      ICData::New(function, target_name, args_descriptor, 15, 1, false));
 
   __ LoadObject(ECX, ic_data);
   __ Call(*StubCode::OneArgCheckInlineCache_entry());
@@ -54,7 +49,7 @@
   ICData& ic_data = ICData::Handle();
   CodePatcher::GetInstanceCallAt(return_address, test->code(), &ic_data);
   EXPECT_STREQ("targetFunction",
-      String::Handle(ic_data.target_name()).ToCString());
+               String::Handle(ic_data.target_name()).ToCString());
   EXPECT_EQ(1, ic_data.NumArgsTested());
   EXPECT_EQ(0, ic_data.NumberOfChecks());
 }
diff --git a/runtime/vm/code_patcher_mips.cc b/runtime/vm/code_patcher_mips.cc
index 3ed9af3..a6dab70 100644
--- a/runtime/vm/code_patcher_mips.cc
+++ b/runtime/vm/code_patcher_mips.cc
@@ -53,8 +53,9 @@
 }
 
 
-RawFunction* CodePatcher::GetUnoptimizedStaticCallAt(
-    uword return_address, const Code& code, ICData* ic_data_result) {
+RawFunction* CodePatcher::GetUnoptimizedStaticCallAt(uword return_address,
+                                                     const Code& code,
+                                                     ICData* ic_data_result) {
   ASSERT(code.ContainsInstructionAt(return_address));
   CallPattern static_call(return_address, code);
   ICData& ic_data = ICData::Handle();
diff --git a/runtime/vm/code_patcher_mips_test.cc b/runtime/vm/code_patcher_mips_test.cc
index 8e07b77..61bba69 100644
--- a/runtime/vm/code_patcher_mips_test.cc
+++ b/runtime/vm/code_patcher_mips_test.cc
@@ -26,22 +26,17 @@
   const Script& script = Script::Handle();
   const Class& owner_class = Class::Handle(Class::New(
       Library::Handle(), class_name, script, TokenPosition::kNoSource));
-  const String& function_name = String::Handle(Symbols::New(thread,
-                                                            "callerFunction"));
-  const Function& function = Function::Handle(
-      Function::New(function_name, RawFunction::kRegularFunction,
-                    true, false, false, false, false, owner_class,
-                    TokenPosition::kNoSource));
+  const String& function_name =
+      String::Handle(Symbols::New(thread, "callerFunction"));
+  const Function& function = Function::Handle(Function::New(
+      function_name, RawFunction::kRegularFunction, true, false, false, false,
+      false, owner_class, TokenPosition::kNoSource));
 
   const String& target_name = String::Handle(String::New("targetFunction"));
   const Array& args_descriptor =
       Array::Handle(ArgumentsDescriptor::New(1, Object::null_array()));
-  const ICData& ic_data = ICData::ZoneHandle(ICData::New(function,
-                                                         target_name,
-                                                         args_descriptor,
-                                                         15,
-                                                         1,
-                                                         false));
+  const ICData& ic_data = ICData::ZoneHandle(
+      ICData::New(function, target_name, args_descriptor, 15, 1, false));
 
   __ LoadObject(S5, ic_data);
   __ BranchLinkPatchable(*StubCode::OneArgCheckInlineCache_entry());
@@ -55,7 +50,7 @@
   ICData& ic_data = ICData::Handle();
   CodePatcher::GetInstanceCallAt(return_address, test->code(), &ic_data);
   EXPECT_STREQ("targetFunction",
-      String::Handle(ic_data.target_name()).ToCString());
+               String::Handle(ic_data.target_name()).ToCString());
   EXPECT_EQ(1, ic_data.NumArgsTested());
   EXPECT_EQ(0, ic_data.NumberOfChecks());
 }
diff --git a/runtime/vm/code_patcher_x64.cc b/runtime/vm/code_patcher_x64.cc
index 0426ae7..4b79751 100644
--- a/runtime/vm/code_patcher_x64.cc
+++ b/runtime/vm/code_patcher_x64.cc
@@ -54,21 +54,17 @@
 
   bool IsValid() const {
     static int16_t pattern[kCallPatternSize] = {
-      0x49, 0x8b, 0x9f, -1, -1, -1, -1,  // movq RBX, [PP + offs]
-      0x4d, 0x8b, 0xa7, -1, -1, -1, -1,  // movq CR, [PP + offs]
-      0x4d, 0x8b, 0x5c, 0x24, 0x07,      // movq TMP, [CR + entry_point_offs]
-      0x41, 0xff, 0xd3                   // callq TMP
+        0x49, 0x8b, 0x9f, -1,   -1,   -1, -1,  // movq RBX, [PP + offs]
+        0x4d, 0x8b, 0xa7, -1,   -1,   -1, -1,  // movq CR, [PP + offs]
+        0x4d, 0x8b, 0x5c, 0x24, 0x07,  // movq TMP, [CR + entry_point_offs]
+        0x41, 0xff, 0xd3               // callq TMP
     };
     return MatchesPattern(start_, pattern, kCallPatternSize);
   }
 
-  intptr_t argument_index() const {
-    return IndexFromPPLoad(start_ + 3);
-  }
+  intptr_t argument_index() const { return IndexFromPPLoad(start_ + 3); }
 
-  RawObject* ic_data() const {
-    return object_pool_.ObjectAt(argument_index());
-  }
+  RawObject* ic_data() const { return object_pool_.ObjectAt(argument_index()); }
 
   RawCode* target() const {
     intptr_t index = IndexFromPPLoad(start_ + 10);
@@ -95,8 +91,7 @@
 class NativeCall : public UnoptimizedCall {
  public:
   NativeCall(uword return_address, const Code& code)
-      : UnoptimizedCall(return_address, code) {
-  }
+      : UnoptimizedCall(return_address, code) {}
 
   NativeFunction native_function() const {
     return reinterpret_cast<NativeFunction>(
@@ -104,8 +99,7 @@
   }
 
   void set_native_function(NativeFunction func) const {
-    object_pool_.SetRawValueAt(argument_index(),
-        reinterpret_cast<uword>(func));
+    object_pool_.SetRawValueAt(argument_index(), reinterpret_cast<uword>(func));
   }
 
  private:
@@ -159,16 +153,14 @@
 
   bool IsValid() const {
     static int16_t pattern[kCallPatternSize] = {
-      0x4d, 0x8b, 0xa7,   -1,   -1, -1, -1,  // movq CR, [PP + offs]
-      0x4d, 0x8b, 0x5c, 0x24, 0x07,          // movq TMP, [CR + entry_point_off]
-      0x41, 0xff, 0xd3                       // callq TMP
+        0x4d, 0x8b, 0xa7, -1,   -1,   -1, -1,  // movq CR, [PP + offs]
+        0x4d, 0x8b, 0x5c, 0x24, 0x07,  // movq TMP, [CR + entry_point_off]
+        0x41, 0xff, 0xd3               // callq TMP
     };
     return MatchesPattern(start_, pattern, kCallPatternSize);
   }
 
-  intptr_t pp_index() const {
-    return IndexFromPPLoad(start_ + 3);
-  }
+  intptr_t pp_index() const { return IndexFromPPLoad(start_ + 3); }
 
   RawCode* Target() const {
     Code& code = Code::Handle();
@@ -207,25 +199,19 @@
 
   bool IsValid() const {
     static int16_t pattern[kCallPatternSize] = {
-      0x4d, 0x8b, 0xa7, -1, -1, -1, -1,  // movq r12, [PP + code_offs]
-      0x49, 0x8b, 0x4c, 0x24, 0x0f,      // movq rcx, [r12 + entrypoint_off]
-      0x49, 0x8b, 0x9f, -1, -1, -1, -1,  // movq rbx, [PP + cache_offs]
-      0xff, 0xd1,                        // call rcx
+        0x4d, 0x8b, 0xa7, -1,   -1,   -1, -1,  // movq r12, [PP + code_offs]
+        0x49, 0x8b, 0x4c, 0x24, 0x0f,  // movq rcx, [r12 + entrypoint_off]
+        0x49, 0x8b, 0x9f, -1,   -1,   -1, -1,  // movq rbx, [PP + cache_offs]
+        0xff, 0xd1,                            // call rcx
     };
     ASSERT(ARRAY_SIZE(pattern) == kCallPatternSize);
     return MatchesPattern(start_, pattern, kCallPatternSize);
   }
 
-  intptr_t data_index() const {
-    return IndexFromPPLoad(start_ + 15);
-  }
-  intptr_t target_index() const {
-    return IndexFromPPLoad(start_ + 3);
-  }
+  intptr_t data_index() const { return IndexFromPPLoad(start_ + 15); }
+  intptr_t target_index() const { return IndexFromPPLoad(start_ + 3); }
 
-  RawObject* data() const {
-    return object_pool_.ObjectAt(data_index());
-  }
+  RawObject* data() const { return object_pool_.ObjectAt(data_index()); }
   RawCode* target() const {
     return reinterpret_cast<RawCode*>(object_pool_.ObjectAt(target_index()));
   }
@@ -251,7 +237,6 @@
 };
 
 
-
 RawCode* CodePatcher::GetStaticCallTargetAt(uword return_address,
                                             const Code& code) {
   ASSERT(code.ContainsInstructionAt(return_address));
@@ -298,8 +283,9 @@
 }
 
 
-RawFunction* CodePatcher::GetUnoptimizedStaticCallAt(
-    uword return_address, const Code& code, ICData* ic_data_result) {
+RawFunction* CodePatcher::GetUnoptimizedStaticCallAt(uword return_address,
+                                                     const Code& code,
+                                                     ICData* ic_data_result) {
   ASSERT(code.ContainsInstructionAt(return_address));
   UnoptimizedStaticCall static_call(return_address, code);
   ICData& ic_data = ICData::Handle();
diff --git a/runtime/vm/code_patcher_x64_test.cc b/runtime/vm/code_patcher_x64_test.cc
index c6e88c2..c82dc7e 100644
--- a/runtime/vm/code_patcher_x64_test.cc
+++ b/runtime/vm/code_patcher_x64_test.cc
@@ -26,21 +26,17 @@
   const Script& script = Script::Handle();
   const Class& owner_class = Class::Handle(Class::New(
       Library::Handle(), class_name, script, TokenPosition::kNoSource));
-  const String& function_name = String::Handle(Symbols::New(thread,
-                                                            "callerFunction"));
-  const Function& function = Function::Handle(
-      Function::New(function_name, RawFunction::kRegularFunction,
-                    true, false, false, false, false, owner_class,
-                    TokenPosition::kNoSource));
+  const String& function_name =
+      String::Handle(Symbols::New(thread, "callerFunction"));
+  const Function& function = Function::Handle(Function::New(
+      function_name, RawFunction::kRegularFunction, true, false, false, false,
+      false, owner_class, TokenPosition::kNoSource));
 
   const String& target_name = String::Handle(String::New("targetFunction"));
   const Array& args_descriptor =
       Array::Handle(ArgumentsDescriptor::New(1, Object::null_array()));
-  const ICData& ic_data = ICData::ZoneHandle(ICData::New(function,
-                                                         target_name,
-                                                         args_descriptor,
-                                                         15,
-                                                         1, false));
+  const ICData& ic_data = ICData::ZoneHandle(
+      ICData::New(function, target_name, args_descriptor, 15, 1, false));
 
   // Code accessing pp is generated, but not executed. Uninitialized pp is OK.
   __ set_constant_pool_allowed(true);
@@ -56,7 +52,7 @@
   ICData& ic_data = ICData::Handle();
   CodePatcher::GetInstanceCallAt(return_address, test->code(), &ic_data);
   EXPECT_STREQ("targetFunction",
-      String::Handle(ic_data.target_name()).ToCString());
+               String::Handle(ic_data.target_name()).ToCString());
   EXPECT_EQ(1, ic_data.NumArgsTested());
   EXPECT_EQ(0, ic_data.NumberOfChecks());
 }
diff --git a/runtime/vm/compiler.cc b/runtime/vm/compiler.cc
index 298fac3..545e001 100644
--- a/runtime/vm/compiler.cc
+++ b/runtime/vm/compiler.cc
@@ -47,37 +47,63 @@
 
 namespace dart {
 
-DEFINE_FLAG(bool, allocation_sinking, true,
-    "Attempt to sink temporary allocations to side exits");
-DEFINE_FLAG(bool, common_subexpression_elimination, true,
-    "Do common subexpression elimination.");
-DEFINE_FLAG(bool, constant_propagation, true,
+DEFINE_FLAG(bool,
+            allocation_sinking,
+            true,
+            "Attempt to sink temporary allocations to side exits");
+DEFINE_FLAG(bool,
+            common_subexpression_elimination,
+            true,
+            "Do common subexpression elimination.");
+DEFINE_FLAG(
+    bool,
+    constant_propagation,
+    true,
     "Do conditional constant propagation/unreachable code elimination.");
-DEFINE_FLAG(int, max_deoptimization_counter_threshold, 16,
+DEFINE_FLAG(
+    int,
+    max_deoptimization_counter_threshold,
+    16,
     "How many times we allow deoptimization before we disallow optimization.");
-DEFINE_FLAG(bool, loop_invariant_code_motion, true,
-    "Do loop invariant code motion.");
+DEFINE_FLAG(bool,
+            loop_invariant_code_motion,
+            true,
+            "Do loop invariant code motion.");
 DEFINE_FLAG(charp, optimization_filter, NULL, "Optimize only named function");
 DEFINE_FLAG(bool, print_flow_graph, false, "Print the IR flow graph.");
-DEFINE_FLAG(bool, print_flow_graph_optimized, false,
-    "Print the IR flow graph when optimizing.");
-DEFINE_FLAG(bool, print_ic_data_map, false,
-    "Print the deopt-id to ICData map in optimizing compiler.");
+DEFINE_FLAG(bool,
+            print_flow_graph_optimized,
+            false,
+            "Print the IR flow graph when optimizing.");
+DEFINE_FLAG(bool,
+            print_ic_data_map,
+            false,
+            "Print the deopt-id to ICData map in optimizing compiler.");
 DEFINE_FLAG(bool, print_code_source_map, false, "Print code source map.");
 DEFINE_FLAG(bool, range_analysis, true, "Enable range analysis");
-DEFINE_FLAG(bool, stress_test_background_compilation, false,
-    "Keep background compiler running all the time");
-DEFINE_FLAG(bool, stop_on_excessive_deoptimization, false,
-    "Debugging: stops program if deoptimizing same function too often");
+DEFINE_FLAG(bool,
+            stress_test_background_compilation,
+            false,
+            "Keep background compiler running all the time");
+DEFINE_FLAG(bool,
+            stop_on_excessive_deoptimization,
+            false,
+            "Debugging: stops program if deoptimizing same function too often");
 DEFINE_FLAG(bool, trace_compiler, false, "Trace compiler operations.");
-DEFINE_FLAG(bool, trace_failed_optimization_attempts, false,
-    "Traces all failed optimization attempts");
-DEFINE_FLAG(bool, trace_optimizing_compiler, false,
-    "Trace only optimizing compiler operations.");
+DEFINE_FLAG(bool,
+            trace_failed_optimization_attempts,
+            false,
+            "Traces all failed optimization attempts");
+DEFINE_FLAG(bool,
+            trace_optimizing_compiler,
+            false,
+            "Trace only optimizing compiler operations.");
 DEFINE_FLAG(bool, trace_bailout, false, "Print bailout from ssa compiler.");
 DEFINE_FLAG(bool, use_inlining, true, "Enable call-site inlining");
-DEFINE_FLAG(bool, verify_compiler, false,
-    "Enable compiler verification assertions");
+DEFINE_FLAG(bool,
+            verify_compiler,
+            false,
+            "Enable compiler verification assertions");
 
 DECLARE_FLAG(bool, huge_method_cutoff_in_code_size);
 DECLARE_FLAG(bool, trace_failed_optimization_attempts);
@@ -111,14 +137,13 @@
   if (UseKernelFrontEndFor(parsed_function)) {
     kernel::TreeNode* node = static_cast<kernel::TreeNode*>(
         parsed_function->function().kernel_function());
-    kernel::FlowGraphBuilder builder(
-        node, parsed_function, ic_data_array, NULL, osr_id);
+    kernel::FlowGraphBuilder builder(node, parsed_function, ic_data_array, NULL,
+                                     osr_id);
     FlowGraph* graph = builder.BuildGraph();
     ASSERT(graph != NULL);
     return graph;
   }
-  FlowGraphBuilder builder(*parsed_function,
-                           ic_data_array,
+  FlowGraphBuilder builder(*parsed_function, ic_data_array,
                            NULL,  // NULL = not inlining.
                            osr_id);
 
@@ -126,7 +151,7 @@
 }
 
 
-void DartCompilationPipeline::FinalizeCompilation(FlowGraph* flow_graph) { }
+void DartCompilationPipeline::FinalizeCompilation(FlowGraph* flow_graph) {}
 
 
 void IrregexpCompilationPipeline::ParseFunction(
@@ -142,24 +167,20 @@
     const ZoneGrowableArray<const ICData*>& ic_data_array,
     intptr_t osr_id) {
   // Compile to the dart IR.
-  RegExpEngine::CompilationResult result =
-      RegExpEngine::CompileIR(parsed_function->regexp_compile_data(),
-                              parsed_function,
-                              ic_data_array);
+  RegExpEngine::CompilationResult result = RegExpEngine::CompileIR(
+      parsed_function->regexp_compile_data(), parsed_function, ic_data_array);
   backtrack_goto_ = result.backtrack_goto;
 
   // Allocate variables now that we know the number of locals.
   parsed_function->AllocateIrregexpVariables(result.num_stack_locals);
 
   // Build the flow graph.
-  FlowGraphBuilder builder(*parsed_function,
-                           ic_data_array,
+  FlowGraphBuilder builder(*parsed_function, ic_data_array,
                            NULL,  // NULL = not inlining.
                            osr_id);
 
-  return new(zone) FlowGraph(*parsed_function,
-                             result.graph_entry,
-                             result.num_blocks);
+  return new (zone)
+      FlowGraph(*parsed_function, result.graph_entry, result.num_blocks);
 }
 
 
@@ -171,9 +192,9 @@
 CompilationPipeline* CompilationPipeline::New(Zone* zone,
                                               const Function& function) {
   if (function.IsIrregexpFunction()) {
-    return new(zone) IrregexpCompilationPipeline();
+    return new (zone) IrregexpCompilationPipeline();
   } else {
-    return new(zone) DartCompilationPipeline();
+    return new (zone) DartCompilationPipeline();
   }
 }
 
@@ -211,7 +232,7 @@
     if (FLAG_trace_failed_optimization_attempts ||
         FLAG_stop_on_excessive_deoptimization) {
       THR_Print("Too many deoptimizations: %s\n",
-          function.ToFullyQualifiedCString());
+                function.ToFullyQualifiedCString());
       if (FLAG_stop_on_excessive_deoptimization) {
         FATAL("Stop on excessive deoptimization");
       }
@@ -352,8 +373,8 @@
   // compile it. Just finalize it directly.
   if (cls.IsTypedefClass()) {
 #if defined(DEBUG)
-    const Class& closure_cls = Class::Handle(
-        Isolate::Current()->object_store()->closure_class());
+    const Class& closure_cls =
+        Class::Handle(Isolate::Current()->object_store()->closure_class());
     ASSERT(closure_cls.is_finalized());
 #endif
     LongJumpScope jump;
@@ -371,16 +392,15 @@
 
   Thread* const thread = Thread::Current();
   StackZone zone(thread);
-NOT_IN_PRODUCT(
+#if !defined(PRODUCT)
   VMTagScope tagScope(thread, VMTag::kCompileClassTagId);
-  TimelineDurationScope tds(thread,
-                            Timeline::GetCompilerStream(),
+  TimelineDurationScope tds(thread, Timeline::GetCompilerStream(),
                             "CompileClass");
   if (tds.enabled()) {
     tds.SetNumArguments(1);
     tds.CopyArgument(0, "class", cls.ToCString());
   }
-)  // !PRODUCT
+#endif  // !defined(PRODUCT)
 
   // We remember all the classes that are being compiled in these lists. This
   // also allows us to reset the marked_for_parsing state in case we see an
@@ -412,7 +432,7 @@
     }
 
     // Parse all the classes that have been added above.
-    for (intptr_t i = (parse_list.length() - 1); i >=0 ; i--) {
+    for (intptr_t i = (parse_list.length() - 1); i >= 0; i--) {
       const Class& parse_class = parse_list.At(i);
       ASSERT(!parse_class.IsNull());
       Parser::ParseClass(parse_class);
@@ -426,13 +446,13 @@
     }
 
     // Finalize these classes.
-    for (intptr_t i = (parse_list.length() - 1); i >=0 ; i--) {
+    for (intptr_t i = (parse_list.length() - 1); i >= 0; i--) {
       const Class& parse_class = parse_list.At(i);
       ASSERT(!parse_class.IsNull());
       ClassFinalizer::FinalizeClass(parse_class);
       parse_class.reset_is_marked_for_parsing();
     }
-    for (intptr_t i = (patch_list.length() - 1); i >=0 ; i--) {
+    for (intptr_t i = (patch_list.length() - 1); i >= 0; i--) {
       const Class& parse_class = patch_list.At(i);
       ASSERT(!parse_class.IsNull());
       ClassFinalizer::FinalizeClass(parse_class);
@@ -474,8 +494,7 @@
         osr_id_(osr_id),
         thread_(Thread::Current()),
         loading_invalidation_gen_at_start_(
-            isolate()->loading_invalidation_gen()) {
-  }
+            isolate()->loading_invalidation_gen()) {}
 
   bool Compile(CompilationPipeline* pipeline);
 
@@ -520,8 +539,8 @@
            deopt_info_array.Length() * sizeof(uword));
   // Allocates instruction object. Since this occurs only at safepoint,
   // there can be no concurrent access to the instruction page.
-  const Code& code = Code::Handle(
-      Code::FinalizeCode(function, assembler, optimized()));
+  const Code& code =
+      Code::Handle(Code::FinalizeCode(function, assembler, optimized()));
   code.set_is_optimized(optimized());
   code.set_owner(function);
   if (!function.IsOptimizable()) {
@@ -531,8 +550,7 @@
   }
 
   const Array& intervals = graph_compiler->inlined_code_intervals();
-  INC_STAT(thread(), total_code_size,
-           intervals.Length() * sizeof(uword));
+  INC_STAT(thread(), total_code_size, intervals.Length() * sizeof(uword));
   code.SetInlinedIntervals(intervals);
 
   const Array& inlined_id_array =
@@ -561,18 +579,17 @@
   graph_compiler->FinalizeExceptionHandlers(code);
   graph_compiler->FinalizeStaticCallTargetsTable(code);
 
-NOT_IN_PRODUCT(
+#if !defined(PRODUCT)
   // Set the code source map after setting the inlined information because
   // we use the inlined information when printing.
-  const CodeSourceMap& code_source_map =
-      CodeSourceMap::Handle(
-          zone,
-          graph_compiler->code_source_map_builder()->Finalize());
+  const CodeSourceMap& code_source_map = CodeSourceMap::Handle(
+      zone, graph_compiler->code_source_map_builder()->Finalize());
   code.set_code_source_map(code_source_map);
   if (FLAG_print_code_source_map) {
     CodeSourceMap::Dump(code_source_map, code, function);
   }
-);
+#endif  // !defined(PRODUCT)
+
   if (optimized()) {
     bool code_was_installed = false;
     // Installs code while at safepoint.
@@ -675,8 +692,8 @@
   ASSERT(Compiler::IsBackgroundCompilation());
   if (!isolate()->background_compiler()->is_running()) {
     // The background compiler is being stopped.
-    Compiler::AbortBackgroundCompilation(Thread::kNoDeoptId,
-        "Background compilation is being stopped");
+    Compiler::AbortBackgroundCompilation(
+        Thread::kNoDeoptId, "Background compilation is being stopped");
   }
 }
 
@@ -692,8 +709,8 @@
   }
   bool is_compiled = false;
   Zone* const zone = thread()->zone();
-  NOT_IN_PRODUCT(
-      TimelineStream* compiler_timeline = Timeline::GetCompilerStream());
+  NOT_IN_PRODUCT(TimelineStream* compiler_timeline =
+                     Timeline::GetCompilerStream());
   CSTAT_TIMER_SCOPE(thread(), codegen_timer);
   HANDLESCOPE(thread());
 
@@ -725,7 +742,7 @@
       {
         CSTAT_TIMER_SCOPE(thread(), graphbuilder_timer);
         ZoneGrowableArray<const ICData*>* ic_data_array =
-            new(zone) ZoneGrowableArray<const ICData*>();
+            new (zone) ZoneGrowableArray<const ICData*>();
         if (optimized()) {
           // Extract type feedback before the graph is built, as the graph
           // builder uses it to attach it to nodes.
@@ -734,7 +751,7 @@
           // already reached the limit.
           ASSERT(Compiler::IsBackgroundCompilation() ||
                  (function.deoptimization_counter() <
-                     FLAG_max_deoptimization_counter_threshold));
+                  FLAG_max_deoptimization_counter_threshold));
 
           // 'Freeze' ICData in background compilation so that it does not
           // change while compiling.
@@ -743,8 +760,8 @@
 
           if (Compiler::IsBackgroundCompilation() &&
               (function.ic_data_array() == Array::null())) {
-            Compiler::AbortBackgroundCompilation(Thread::kNoDeoptId,
-                "RestoreICDataMap: ICData array cleared.");
+            Compiler::AbortBackgroundCompilation(
+                Thread::kNoDeoptId, "RestoreICDataMap: ICData array cleared.");
           }
           if (FLAG_print_ic_data_map) {
             for (intptr_t i = 0; i < ic_data_array->length(); i++) {
@@ -756,13 +773,10 @@
           }
         }
 
-        NOT_IN_PRODUCT(TimelineDurationScope tds(thread(),
-                                                 compiler_timeline,
-                                                 "BuildFlowGraph");)
-        flow_graph = pipeline->BuildFlowGraph(zone,
-                                              parsed_function(),
-                                              *ic_data_array,
-                                              osr_id());
+        NOT_IN_PRODUCT(TimelineDurationScope tds(thread(), compiler_timeline,
+                                                 "BuildFlowGraph"));
+        flow_graph = pipeline->BuildFlowGraph(zone, parsed_function(),
+                                              *ic_data_array, osr_id());
       }
 
       const bool print_flow_graph =
@@ -788,8 +802,7 @@
       }
 
       if (optimized()) {
-        NOT_IN_PRODUCT(TimelineDurationScope tds(thread(),
-                                                 compiler_timeline,
+        NOT_IN_PRODUCT(TimelineDurationScope tds(thread(), compiler_timeline,
                                                  "ComputeSSA"));
         CSTAT_TIMER_SCOPE(thread(), ssa_timer);
         // Transform to SSA (virtual register 0 and no inlining arguments).
@@ -811,8 +824,7 @@
       // have non-generic type feedback attached to them that can
       // potentially affect optimizations.
       if (optimized()) {
-        NOT_IN_PRODUCT(TimelineDurationScope tds(thread(),
-                                                 compiler_timeline,
+        NOT_IN_PRODUCT(TimelineDurationScope tds(thread(), compiler_timeline,
                                                  "OptimizationPasses"));
         inline_id_to_function.Add(&function);
         // We do not add the token position now because we don't know the
@@ -838,8 +850,7 @@
 
         // Inlining (mutates the flow graph)
         if (FLAG_use_inlining) {
-          NOT_IN_PRODUCT(TimelineDurationScope tds2(thread(),
-                                                    compiler_timeline,
+          NOT_IN_PRODUCT(TimelineDurationScope tds2(thread(), compiler_timeline,
                                                     "Inlining"));
           CSTAT_TIMER_SCOPE(thread(), graphinliner_timer);
           // Propagate types to create more inlining opportunities.
@@ -850,13 +861,11 @@
           optimizer.ApplyClassIds();
           DEBUG_ASSERT(flow_graph->VerifyUseLists());
 
-          FlowGraphInliner inliner(flow_graph,
-                                   &inline_id_to_function,
-                                   &inline_id_to_token_pos,
-                                   &caller_inline_id,
+          FlowGraphInliner inliner(flow_graph, &inline_id_to_function,
+                                   &inline_id_to_token_pos, &caller_inline_id,
                                    use_speculative_inlining,
-                                   /*inlining_black_list=*/ NULL,
-                                   /*precompiler=*/ NULL);
+                                   /*inlining_black_list=*/NULL,
+                                   /*precompiler=*/NULL);
           inliner.Inline();
           // Use lists are maintained and validated by the inliner.
           DEBUG_ASSERT(flow_graph->VerifyUseLists());
@@ -867,8 +876,7 @@
         DEBUG_ASSERT(flow_graph->VerifyUseLists());
 
         {
-          NOT_IN_PRODUCT(TimelineDurationScope tds2(thread(),
-                                                    compiler_timeline,
+          NOT_IN_PRODUCT(TimelineDurationScope tds2(thread(), compiler_timeline,
                                                     "ApplyClassIds"));
           // Use propagated class-ids to optimize further.
           optimizer.ApplyClassIds();
@@ -889,8 +897,7 @@
         DEBUG_ASSERT(flow_graph->VerifyUseLists());
 
         {
-          NOT_IN_PRODUCT(TimelineDurationScope tds2(thread(),
-                                                    compiler_timeline,
+          NOT_IN_PRODUCT(TimelineDurationScope tds2(thread(), compiler_timeline,
                                                     "BranchSimplifier"));
           BranchSimplifier::Simplify(flow_graph);
           DEBUG_ASSERT(flow_graph->VerifyUseLists());
@@ -900,10 +907,9 @@
         }
 
         if (FLAG_constant_propagation) {
-          NOT_IN_PRODUCT(TimelineDurationScope tds2(thread(),
-                                                    compiler_timeline,
+          NOT_IN_PRODUCT(TimelineDurationScope tds2(thread(), compiler_timeline,
                                                     "ConstantPropagation");
-          ConstantPropagator::Optimize(flow_graph));
+                         ConstantPropagator::Optimize(flow_graph));
           DEBUG_ASSERT(flow_graph->VerifyUseLists());
           // A canonicalization pass to remove e.g. smi checks on smi constants.
           flow_graph->Canonicalize();
@@ -929,8 +935,7 @@
         DEBUG_ASSERT(flow_graph->VerifyUseLists());
 
         {
-          NOT_IN_PRODUCT(TimelineDurationScope tds2(thread(),
-                                                    compiler_timeline,
+          NOT_IN_PRODUCT(TimelineDurationScope tds2(thread(), compiler_timeline,
                                                     "SelectRepresentations"));
           // Where beneficial convert Smi operations into Int32 operations.
           // Only meanigful for 32bit platforms right now.
@@ -983,15 +988,13 @@
         DEBUG_ASSERT(flow_graph->VerifyUseLists());
 
         {
-          NOT_IN_PRODUCT(TimelineDurationScope tds2(thread(),
-                                                    compiler_timeline,
+          NOT_IN_PRODUCT(TimelineDurationScope tds2(thread(), compiler_timeline,
                                                     "DeadStoreElimination"));
           DeadStoreElimination::Optimize(flow_graph);
         }
 
         if (FLAG_range_analysis) {
-          NOT_IN_PRODUCT(TimelineDurationScope tds2(thread(),
-                                                    compiler_timeline,
+          NOT_IN_PRODUCT(TimelineDurationScope tds2(thread(), compiler_timeline,
                                                     "RangeAnalysis"));
           // Propagate types after store-load-forwarding. Some phis may have
           // become smi phis that can be processed by range analysis.
@@ -1035,8 +1038,7 @@
         flow_graph->EliminateEnvironments();
 
         {
-          NOT_IN_PRODUCT(TimelineDurationScope tds2(thread(),
-                                                    compiler_timeline,
+          NOT_IN_PRODUCT(TimelineDurationScope tds2(thread(), compiler_timeline,
                                                     "EliminateDeadPhis"));
           DeadCodeElimination::EliminateDeadPhis(flow_graph);
           DEBUG_ASSERT(flow_graph->VerifyUseLists());
@@ -1066,8 +1068,7 @@
         DEBUG_ASSERT(flow_graph->VerifyUseLists());
 
         {
-          NOT_IN_PRODUCT(TimelineDurationScope tds2(thread(),
-                                                    compiler_timeline,
+          NOT_IN_PRODUCT(TimelineDurationScope tds2(thread(), compiler_timeline,
                                                     "SelectRepresentations"));
           // Ensure that all phis inserted by optimization passes have
           // consistent representations.
@@ -1100,8 +1101,7 @@
         FlowGraphInliner::CollectGraphInfo(flow_graph, true);
 
         {
-          NOT_IN_PRODUCT(TimelineDurationScope tds2(thread(),
-                                                    compiler_timeline,
+          NOT_IN_PRODUCT(TimelineDurationScope tds2(thread(), compiler_timeline,
                                                     "AllocateRegisters"));
           // Perform register allocation on the SSA graph.
           FlowGraphAllocator allocator(*flow_graph);
@@ -1121,22 +1121,18 @@
 
       ASSERT(inline_id_to_function.length() == caller_inline_id.length());
       Assembler assembler(use_far_branches);
-      FlowGraphCompiler graph_compiler(&assembler, flow_graph,
-                                       *parsed_function(), optimized(),
-                                       inline_id_to_function,
-                                       inline_id_to_token_pos,
-                                       caller_inline_id);
+      FlowGraphCompiler graph_compiler(
+          &assembler, flow_graph, *parsed_function(), optimized(),
+          inline_id_to_function, inline_id_to_token_pos, caller_inline_id);
       {
         CSTAT_TIMER_SCOPE(thread(), graphcompiler_timer);
-        NOT_IN_PRODUCT(TimelineDurationScope tds(thread(),
-                                                 compiler_timeline,
+        NOT_IN_PRODUCT(TimelineDurationScope tds(thread(), compiler_timeline,
                                                  "CompileGraph"));
         graph_compiler.CompileGraph();
         pipeline->FinalizeCompilation(flow_graph);
       }
       {
-        NOT_IN_PRODUCT(TimelineDurationScope tds(thread(),
-                                                 compiler_timeline,
+        NOT_IN_PRODUCT(TimelineDurationScope tds(thread(), compiler_timeline,
                                                  "FinalizeCompilation"));
         if (thread()->IsMutatorThread()) {
           FinalizeCompilation(&assembler, &graph_compiler, flow_graph);
@@ -1209,7 +1205,7 @@
 }
 
 
-DEBUG_ONLY(
+#if defined(DEBUG)
 // Verifies that the inliner is always in the list of inlined functions.
 // If this fails run with --trace-inlining-intervals to get more information.
 static void CheckInliningIntervals(const Function& function) {
@@ -1227,7 +1223,7 @@
            function.raw());
   }
 }
-)
+#endif  // defined(DEBUG)
 
 static RawError* CompileFunctionHelper(CompilationPipeline* pipeline,
                                        const Function& function,
@@ -1242,23 +1238,21 @@
     StackZone stack_zone(thread);
     Zone* const zone = stack_zone.GetZone();
     const bool trace_compiler =
-        FLAG_trace_compiler ||
-        (FLAG_trace_optimizing_compiler && optimized);
+        FLAG_trace_compiler || (FLAG_trace_optimizing_compiler && optimized);
     Timer per_compile_timer(trace_compiler, "Compilation time");
     per_compile_timer.Start();
 
-    ParsedFunction* parsed_function = new(zone) ParsedFunction(
-        thread, Function::ZoneHandle(zone, function.raw()));
+    ParsedFunction* parsed_function = new (zone)
+        ParsedFunction(thread, Function::ZoneHandle(zone, function.raw()));
     if (trace_compiler) {
-      const intptr_t token_size = function.end_token_pos().Pos() -
-                                  function.token_pos().Pos();
+      const intptr_t token_size =
+          function.end_token_pos().Pos() - function.token_pos().Pos();
       THR_Print("Compiling %s%sfunction %s: '%s' @ token %s, size %" Pd "\n",
                 (osr_id == Compiler::kNoOSRDeoptId ? "" : "osr "),
                 (optimized ? "optimized " : ""),
                 (Compiler::IsBackgroundCompilation() ? "(background)" : ""),
                 function.ToFullyQualifiedCString(),
-                function.token_pos().ToCString(),
-                token_size);
+                function.token_pos().ToCString(), token_size);
     }
     INC_STAT(thread, num_functions_compiled, 1);
     if (optimized) {
@@ -1272,8 +1266,7 @@
       const int64_t num_tokens_before = STAT_VALUE(thread, num_tokens_consumed);
       pipeline->ParseFunction(parsed_function);
       const int64_t num_tokens_after = STAT_VALUE(thread, num_tokens_consumed);
-      INC_STAT(thread,
-               num_func_tokens_compiled,
+      INC_STAT(thread, num_func_tokens_compiled,
                num_tokens_after - num_tokens_before);
     }
 
@@ -1281,11 +1274,12 @@
 
     if (Compiler::IsBackgroundCompilation()) {
       if (isolate->IsTopLevelParsing() ||
-              (loading_invalidation_gen_at_start !=
-               isolate->loading_invalidation_gen())) {
+          (loading_invalidation_gen_at_start !=
+           isolate->loading_invalidation_gen())) {
         // Loading occured while parsing. We need to abort here because state
         // changed while compiling.
-        Compiler::AbortBackgroundCompilation(Thread::kNoDeoptId,
+        Compiler::AbortBackgroundCompilation(
+            Thread::kNoDeoptId,
             "Invalidated state during parsing because of script loading");
       }
     }
@@ -1302,7 +1296,7 @@
           // state change during compilation.
           if (FLAG_trace_compiler) {
             THR_Print("Aborted background compilation: %s\n",
-                function.ToFullyQualifiedCString());
+                      function.ToFullyQualifiedCString());
           }
           {
             // If it was a bailout, then disable optimization.
@@ -1364,8 +1358,7 @@
 
     if (FLAG_disassemble && FlowGraphPrinter::ShouldPrint(function)) {
       Disassembler::DisassembleCode(function, optimized);
-    } else if (FLAG_disassemble_optimized &&
-               optimized &&
+    } else if (FLAG_disassemble_optimized && optimized &&
                FlowGraphPrinter::ShouldPrint(function)) {
       Disassembler::DisassembleCode(function, true);
     }
@@ -1384,7 +1377,7 @@
       // Exit compilation, retry it later.
       if (FLAG_trace_bailout) {
         THR_Print("Aborted background compilation: %s\n",
-            function.ToFullyQualifiedCString());
+                  function.ToFullyQualifiedCString());
       }
       return Error::null();
     }
@@ -1409,26 +1402,24 @@
     StackZone stack_zone(thread);
     Zone* const zone = stack_zone.GetZone();
     const bool trace_compiler =
-        FLAG_trace_compiler ||
-        (FLAG_trace_optimizing_compiler && optimized);
+        FLAG_trace_compiler || (FLAG_trace_optimizing_compiler && optimized);
 
     if (trace_compiler) {
-      const intptr_t token_size = function.end_token_pos().Pos() -
-                                  function.token_pos().Pos();
+      const intptr_t token_size =
+          function.end_token_pos().Pos() - function.token_pos().Pos();
       THR_Print("Parsing %s%sfunction %s: '%s' @ token %s, size %" Pd "\n",
                 (osr_id == Compiler::kNoOSRDeoptId ? "" : "osr "),
                 (optimized ? "optimized " : ""),
                 (Compiler::IsBackgroundCompilation() ? "(background)" : ""),
                 function.ToFullyQualifiedCString(),
-                function.token_pos().ToCString(),
-                token_size);
+                function.token_pos().ToCString(), token_size);
     }
-    ParsedFunction* parsed_function = new(zone) ParsedFunction(
-        thread, Function::ZoneHandle(zone, function.raw()));
+    ParsedFunction* parsed_function = new (zone)
+        ParsedFunction(thread, Function::ZoneHandle(zone, function.raw()));
     pipeline->ParseFunction(parsed_function);
-    // For now we just walk thru the AST nodes and in DEBUG mode we print
-    // them otherwise just skip through them, this will be need to be
-    // wired to generate the IR format.
+// For now we just walk thru the AST nodes and in DEBUG mode we print
+// them otherwise just skip through them, this will be need to be
+// wired to generate the IR format.
 #if !defined(PRODUCT)
 #if defined(DEBUG)
     AstPrinter ast_printer(true);
@@ -1456,19 +1447,20 @@
 }
 
 
-RawError* Compiler::CompileFunction(Thread* thread,
-                                    const Function& function) {
+RawError* Compiler::CompileFunction(Thread* thread, const Function& function) {
 #ifdef DART_PRECOMPILER
   if (FLAG_precompiled_mode) {
     return Precompiler::CompileFunction(
         /* precompiler = */ NULL, thread, thread->zone(), function);
   }
 #endif
+
   Isolate* isolate = thread->isolate();
-NOT_IN_PRODUCT(
+
+#if !defined(PRODUCT)
   VMTagScope tagScope(thread, VMTag::kCompileUnoptimizedTagId);
   TIMELINE_FUNCTION_COMPILATION_DURATION(thread, "CompileFunction", function);
-)  // !PRODUCT
+#endif  // !defined(PRODUCT)
 
   if (!isolate->compilation_allowed()) {
     FATAL3("Precompilation missed function %s (%s, %s)\n",
@@ -1480,20 +1472,17 @@
   CompilationPipeline* pipeline =
       CompilationPipeline::New(thread->zone(), function);
 
-  return CompileFunctionHelper(pipeline,
-                               function,
-                               /* optimized = */ false,
-                               kNoOSRDeoptId);
+  return CompileFunctionHelper(pipeline, function,
+                               /* optimized = */ false, kNoOSRDeoptId);
 }
 
 
-RawError* Compiler::ParseFunction(Thread* thread,
-                                  const Function& function) {
+RawError* Compiler::ParseFunction(Thread* thread, const Function& function) {
   Isolate* isolate = thread->isolate();
-NOT_IN_PRODUCT(
+#if !defined(PRODUCT)
   VMTagScope tagScope(thread, VMTag::kCompileUnoptimizedTagId);
   TIMELINE_FUNCTION_COMPILATION_DURATION(thread, "ParseFunction", function);
-)  // !PRODUCT
+#endif  // !defined(PRODUCT)
 
   if (!isolate->compilation_allowed()) {
     FATAL3("Precompilation missed function %s (%s, %s)\n",
@@ -1505,10 +1494,8 @@
   CompilationPipeline* pipeline =
       CompilationPipeline::New(thread->zone(), function);
 
-  return ParseFunctionHelper(pipeline,
-                             function,
-                             /* optimized = */ false,
-                             kNoOSRDeoptId);
+  return ParseFunctionHelper(pipeline, function,
+                             /* optimized = */ false, kNoOSRDeoptId);
 }
 
 
@@ -1524,9 +1511,7 @@
   CompilationPipeline* pipeline =
       CompilationPipeline::New(thread->zone(), function);
   const Error& error = Error::Handle(
-      CompileFunctionHelper(pipeline,
-                            function,
-                            false,  /* not optimized */
+      CompileFunctionHelper(pipeline, function, false, /* not optimized */
                             kNoOSRDeoptId));
   if (!error.IsNull()) {
     return error.raw();
@@ -1548,7 +1533,7 @@
 RawError* Compiler::CompileOptimizedFunction(Thread* thread,
                                              const Function& function,
                                              intptr_t osr_id) {
-NOT_IN_PRODUCT(
+#if !defined(PRODUCT)
   VMTagScope tagScope(thread, VMTag::kCompileOptimizedTagId);
   const char* event_name;
   if (osr_id != kNoOSRDeoptId) {
@@ -1559,26 +1544,22 @@
     event_name = "CompileFunctionOptimized";
   }
   TIMELINE_FUNCTION_COMPILATION_DURATION(thread, event_name, function);
-)  // !PRODUCT
+#endif  // !defined(PRODUCT)
 
   // If we are in the optimizing in the mutator/Dart thread, then
   // this is either an OSR compilation or background compilation is
   // not currently allowed.
-  ASSERT(!thread->IsMutatorThread() ||
-         (osr_id != kNoOSRDeoptId) ||
+  ASSERT(!thread->IsMutatorThread() || (osr_id != kNoOSRDeoptId) ||
          !FLAG_background_compilation || BackgroundCompiler::IsDisabled());
   CompilationPipeline* pipeline =
       CompilationPipeline::New(thread->zone(), function);
-  return CompileFunctionHelper(pipeline,
-                               function,
-                               true,  /* optimized */
+  return CompileFunctionHelper(pipeline, function, true, /* optimized */
                                osr_id);
 }
 
 
 // This is only used from unit tests.
-RawError* Compiler::CompileParsedFunction(
-    ParsedFunction* parsed_function) {
+RawError* Compiler::CompileParsedFunction(ParsedFunction* parsed_function) {
   LongJumpScope jump;
   if (setjmp(*jump.Set()) == 0) {
     // Non-optimized code generator.
@@ -1643,8 +1624,7 @@
   for (int i = 0; i < functions.Length(); i++) {
     func ^= functions.At(i);
     ASSERT(!func.IsNull());
-    if (!func.HasCode() &&
-        !func.is_abstract() &&
+    if (!func.HasCode() && !func.is_abstract() &&
         !func.IsRedirectingFactory()) {
       if ((cls.is_mixin_app_alias() || cls.IsMixinApplication()) &&
           func.HasOptionalParameters()) {
@@ -1717,15 +1697,15 @@
     ASSERT(!field.HasPrecompiledInitializer());
     Function& initializer = Function::Handle(thread->zone());
     {
-      NOT_IN_PRODUCT(
-        VMTagScope tagScope(thread, VMTag::kCompileUnoptimizedTagId);
-        TimelineDurationScope tds(thread, Timeline::GetCompilerStream(),
-                                  "CompileStaticInitializer");
-        if (tds.enabled()) {
-          tds.SetNumArguments(1);
-          tds.CopyArgument(0, "field", field.ToCString());
-        }
-      )
+#if !defined(PRODUCT)
+      VMTagScope tagScope(thread, VMTag::kCompileUnoptimizedTagId);
+      TimelineDurationScope tds(thread, Timeline::GetCompilerStream(),
+                                "CompileStaticInitializer");
+      if (tds.enabled()) {
+        tds.SetNumArguments(1);
+        tds.CopyArgument(0, "field", field.ToCString());
+      }
+#endif  // !defined(PRODUCT)
 
       StackZone stack_zone(thread);
       Zone* zone = stack_zone.GetZone();
@@ -1737,28 +1717,26 @@
         // kImplicitStaticFinalGetter is used for both implicit static getters
         // and static initializers.  The Kernel graph builder will tell the
         // difference by pattern matching on the name.
-        const String& name = String::Handle(zone,
-            Symbols::FromConcat(thread,
-                Symbols::InitPrefix(), String::Handle(zone, field.name())));
+        const String& name = String::Handle(
+            zone, Symbols::FromConcat(thread, Symbols::InitPrefix(),
+                                      String::Handle(zone, field.name())));
         const Script& script = Script::Handle(zone, field.Script());
         Object& owner = Object::Handle(zone, field.Owner());
         owner = PatchClass::New(Class::Cast(owner), script);
-        const Function& function = Function::ZoneHandle(zone,
-            Function::New(name,
-                          RawFunction::kImplicitStaticFinalGetter,
-                          true,  // is_static
-                          false,  // is_const
-                          false,  // is_abstract
-                          false,  // is_external
-                          false,  // is_native
-                          owner,
-                          TokenPosition::kNoSource));
+        const Function& function = Function::ZoneHandle(
+            zone, Function::New(name, RawFunction::kImplicitStaticFinalGetter,
+                                true,   // is_static
+                                false,  // is_const
+                                false,  // is_abstract
+                                false,  // is_external
+                                false,  // is_native
+                                owner, TokenPosition::kNoSource));
         function.set_kernel_function(field.kernel_field());
         function.set_result_type(AbstractType::Handle(zone, field.type()));
         function.set_is_reflectable(false);
         function.set_is_debuggable(false);
         function.set_is_inlinable(false);
-        parsed_function = new(zone) ParsedFunction(thread, function);
+        parsed_function = new (zone) ParsedFunction(thread, function);
       } else {
         parsed_function = Parser::ParseStaticFieldInitializer(field);
         parsed_function->AllocateVariables();
@@ -1769,8 +1747,8 @@
       CompileParsedFunctionHelper helper(parsed_function, false, kNoOSRDeoptId);
       helper.Compile(&pipeline);
       initializer = parsed_function->function().raw();
-      Code::Handle(initializer.unoptimized_code()).set_var_descriptors(
-          Object::empty_var_descriptors());
+      Code::Handle(initializer.unoptimized_code())
+          .set_var_descriptors(Object::empty_var_descriptors());
     }
     // Invoke the function to evaluate the expression.
     return DartEntry::InvokeFunction(initializer, Object::empty_array());
@@ -1786,7 +1764,6 @@
 }
 
 
-
 RawObject* Compiler::ExecuteOnce(SequenceNode* fragment) {
 #ifdef DART_PRECOMPILER
   if (FLAG_precompiled_mode) {
@@ -1819,7 +1796,7 @@
     const Function& func = Function::ZoneHandle(Function::New(
         String::Handle(Symbols::New(thread, kEvalConst)),
         RawFunction::kRegularFunction,
-        true,  // static function
+        true,   // static function
         false,  // not const function
         false,  // not abstract
         false,  // not external
@@ -1840,16 +1817,15 @@
     ParsedFunction* parsed_function = new ParsedFunction(thread, func);
     parsed_function->SetNodeSequence(fragment);
     fragment->scope()->AddVariable(parsed_function->EnsureExpressionTemp());
-    fragment->scope()->AddVariable(
-        parsed_function->current_context_var());
+    fragment->scope()->AddVariable(parsed_function->current_context_var());
     parsed_function->AllocateVariables();
 
     // Non-optimized code generator.
     DartCompilationPipeline pipeline;
     CompileParsedFunctionHelper helper(parsed_function, false, kNoOSRDeoptId);
     helper.Compile(&pipeline);
-    Code::Handle(func.unoptimized_code()).set_var_descriptors(
-        Object::empty_var_descriptors());
+    Code::Handle(func.unoptimized_code())
+        .set_var_descriptors(Object::empty_var_descriptors());
 
     const Object& result = PassiveObject::Handle(
         DartEntry::InvokeFunction(func, Object::empty_array()));
@@ -1869,7 +1845,7 @@
   if (FLAG_trace_compiler) {
     THR_Print("ABORT background compilation: %s\n", msg);
   }
-NOT_IN_PRODUCT(
+#if !defined(PRODUCT)
   TimelineStream* stream = Timeline::GetCompilerStream();
   ASSERT(stream != NULL);
   TimelineEvent* event = stream->StartEvent();
@@ -1879,7 +1855,7 @@
     event->CopyArgument(0, "reason", msg);
     event->Complete();
   }
-)  // !PRODUCT
+#endif  // !defined(PRODUCT)
   ASSERT(Compiler::IsBackgroundCompilation());
   Thread::Current()->long_jump_base()->Jump(
       deopt_id, Object::background_compilation_error());
@@ -1890,9 +1866,7 @@
 class QueueElement {
  public:
   explicit QueueElement(const Function& function)
-      : next_(NULL),
-        function_(function.raw()) {
-  }
+      : next_(NULL), function_(function.raw()) {}
 
   virtual ~QueueElement() {
     next_ = NULL;
@@ -1923,9 +1897,7 @@
 class BackgroundCompilationQueue {
  public:
   BackgroundCompilationQueue() : first_(NULL), last_(NULL) {}
-  virtual ~BackgroundCompilationQueue() {
-    Clear();
-  }
+  virtual ~BackgroundCompilationQueue() { Clear(); }
 
   void VisitObjectPointers(ObjectPointerVisitor* visitor) {
     ASSERT(visitor != NULL);
@@ -1952,9 +1924,7 @@
     ASSERT(first_ != NULL && last_ != NULL);
   }
 
-  QueueElement* Peek() const {
-    return first_;
-  }
+  QueueElement* Peek() const { return first_; }
 
   RawFunction* PeekFunction() const {
     QueueElement* e = Peek();
@@ -2003,8 +1973,11 @@
 
 
 BackgroundCompiler::BackgroundCompiler(Isolate* isolate)
-    : isolate_(isolate), running_(true), done_(new bool()),
-      queue_monitor_(new Monitor()), done_monitor_(new Monitor()),
+    : isolate_(isolate),
+      running_(true),
+      done_(new bool()),
+      queue_monitor_(new Monitor()),
+      done_monitor_(new Monitor()),
       function_queue_(new BackgroundCompilationQueue()) {
   *done_ = false;
 }
@@ -2033,14 +2006,14 @@
       Zone* zone = stack_zone.GetZone();
       HANDLESCOPE(thread);
       Function& function = Function::Handle(zone);
-      { MonitorLocker ml(queue_monitor_);
+      {
+        MonitorLocker ml(queue_monitor_);
         function = function_queue()->PeekFunction();
       }
       while (running_ && !function.IsNull() && !isolate_->IsTopLevelParsing()) {
         // Check that we have aggregated and cleared the stats.
         ASSERT(thread->compiler_stats()->IsCleared());
-        Compiler::CompileOptimizedFunction(thread,
-                                           function,
+        Compiler::CompileOptimizedFunction(thread, function,
                                            Compiler::kNoOSRDeoptId);
 #ifndef PRODUCT
         Isolate* isolate = thread->isolate();
@@ -2049,7 +2022,8 @@
 #endif  // PRODUCT
 
         QueueElement* qelem = NULL;
-        { MonitorLocker ml(queue_monitor_);
+        {
+          MonitorLocker ml(queue_monitor_);
           if (function_queue()->IsEmpty()) {
             // We are shutting down, queue was cleared.
             function = Function::null();
@@ -2057,7 +2031,7 @@
             qelem = function_queue()->Remove();
             const Function& old = Function::Handle(qelem->Function());
             if ((!old.HasOptimizedCode() && old.IsOptimizable()) ||
-                 FLAG_stress_test_background_compilation) {
+                FLAG_stress_test_background_compilation) {
               if (Compiler::CanOptimizeFunction(thread, old)) {
                 QueueElement* repeat_qelem = new QueueElement(old);
                 function_queue()->Add(repeat_qelem);
@@ -2075,8 +2049,8 @@
     {
       // Wait to be notified when the work queue is not empty.
       MonitorLocker ml(queue_monitor_);
-      while ((function_queue()->IsEmpty() || isolate_->IsTopLevelParsing())
-              && running_) {
+      while ((function_queue()->IsEmpty() || isolate_->IsTopLevelParsing()) &&
+             running_) {
         ml.Wait();
       }
     }
@@ -2134,7 +2108,7 @@
     function_queue->Clear();
     // 'task' will be deleted by thread pool.
     task = NULL;
-    ml.Notify();   // Stop waiting for the queue.
+    ml.Notify();  // Stop waiting for the queue.
   }
 
   {
@@ -2190,11 +2164,10 @@
   ASSERT(thread->IsMutatorThread());
   // Finalize NoSuchMethodError, _Mint; occasionally needed in optimized
   // compilation.
-  Class& cls = Class::Handle(thread->zone(),
-      Library::LookupCoreClass(Symbols::NoSuchMethodError()));
+  Class& cls = Class::Handle(
+      thread->zone(), Library::LookupCoreClass(Symbols::NoSuchMethodError()));
   ASSERT(!cls.IsNull());
-  Error& error = Error::Handle(thread->zone(),
-      cls.EnsureIsFinalized(thread));
+  Error& error = Error::Handle(thread->zone(), cls.EnsureIsFinalized(thread));
   ASSERT(error.IsNull());
   cls = Library::LookupCoreClass(Symbols::_Mint());
   ASSERT(!cls.IsNull());
@@ -2265,15 +2238,13 @@
 }
 
 
-RawError* Compiler::CompileFunction(Thread* thread,
-                                    const Function& function) {
+RawError* Compiler::CompileFunction(Thread* thread, const Function& function) {
   UNREACHABLE();
   return Error::null();
 }
 
 
-RawError* Compiler::ParseFunction(Thread* thread,
-                                  const Function& function) {
+RawError* Compiler::ParseFunction(Thread* thread, const Function& function) {
   UNREACHABLE();
   return Error::null();
 }
@@ -2294,8 +2265,7 @@
 }
 
 
-RawError* Compiler::CompileParsedFunction(
-    ParsedFunction* parsed_function) {
+RawError* Compiler::CompileParsedFunction(ParsedFunction* parsed_function) {
   UNREACHABLE();
   return Error::null();
 }
diff --git a/runtime/vm/compiler.h b/runtime/vm/compiler.h
index 5182364..e278a57 100644
--- a/runtime/vm/compiler.h
+++ b/runtime/vm/compiler.h
@@ -40,7 +40,7 @@
       const ZoneGrowableArray<const ICData*>& ic_data_array,
       intptr_t osr_id) = 0;
   virtual void FinalizeCompilation(FlowGraph* flow_graph) = 0;
-  virtual ~CompilationPipeline() { }
+  virtual ~CompilationPipeline() {}
 };
 
 
@@ -60,7 +60,7 @@
 
 class IrregexpCompilationPipeline : public CompilationPipeline {
  public:
-  IrregexpCompilationPipeline() : backtrack_goto_(NULL) { }
+  IrregexpCompilationPipeline() : backtrack_goto_(NULL) {}
 
   virtual void ParseFunction(ParsedFunction* parsed_function);
 
@@ -112,10 +112,9 @@
   // Returns Error::null() if there is no compilation error.
   // If 'result_code' is not NULL, then the generated code is returned but
   // not installed.
-  static RawError* CompileOptimizedFunction(
-      Thread* thread,
-      const Function& function,
-      intptr_t osr_id = kNoOSRDeoptId);
+  static RawError* CompileOptimizedFunction(Thread* thread,
+                                            const Function& function,
+                                            intptr_t osr_id = kNoOSRDeoptId);
 
   // Generates code for given parsed function (without parsing it again) and
   // sets its code field.
@@ -190,8 +189,8 @@
   virtual void Run();
 
   Isolate* isolate_;
-  bool running_;       // While true, will try to read queue and compile.
-  bool* done_;         // True if the thread is done.
+  bool running_;            // While true, will try to read queue and compile.
+  bool* done_;              // True if the thread is done.
   Monitor* queue_monitor_;  // Controls access to the queue.
   Monitor* done_monitor_;   // Notify/wait that the thread is done.
 
diff --git a/runtime/vm/compiler_stats.cc b/runtime/vm/compiler_stats.cc
index 38afef2..6448c44 100644
--- a/runtime/vm/compiler_stats.cc
+++ b/runtime/vm/compiler_stats.cc
@@ -14,16 +14,16 @@
 namespace dart {
 
 DEFINE_FLAG(bool, compiler_stats, false, "Compiler stat counters.");
-DEFINE_FLAG(bool, compiler_benchmark, false,
+DEFINE_FLAG(bool,
+            compiler_benchmark,
+            false,
             "Compiler stat counters for benchmark.");
 
 
 class TokenStreamVisitor : public ObjectVisitor {
  public:
   explicit TokenStreamVisitor(CompilerStats* compiler_stats)
-      : obj_(Object::Handle()),
-        stats_(compiler_stats) {
-  }
+      : obj_(Object::Handle()), stats_(compiler_stats) {}
 
   void VisitObject(RawObject* raw_obj) {
     if (raw_obj->IsPseudoObject()) {
@@ -31,10 +31,9 @@
     }
     obj_ = raw_obj;
     if (obj_.GetClassId() == TokenStream::kClassId) {
-      TokenStream::Iterator tkit(Thread::Current()->zone(),
-                                 TokenStream::Cast(obj_),
-                                 TokenPosition::kMinSource,
-                                 TokenStream::Iterator::kNoNewlines);
+      TokenStream::Iterator tkit(
+          Thread::Current()->zone(), TokenStream::Cast(obj_),
+          TokenPosition::kMinSource, TokenStream::Iterator::kNoNewlines);
       Token::Kind kind = tkit.CurrentTokenKind();
       while (kind != Token::kEOS) {
         ++stats_->num_tokens_total;
@@ -52,16 +51,14 @@
 
 CompilerStats::CompilerStats(Isolate* isolate)
     : isolate_(isolate),
-#define INITIALIZE_TIMER(timer_name, description)                              \
-      timer_name(true, description),
-STAT_TIMERS(INITIALIZE_TIMER)
+#define INITIALIZE_TIMER(timer_name, description) timer_name(true, description),
+      STAT_TIMERS(INITIALIZE_TIMER)
 #undef INITIALIZE_TIMER
 
-#define INITIALIZE_COUNTERS(counter_name)                                      \
-      counter_name(0),
-STAT_COUNTERS(INITIALIZE_COUNTERS)
+#define INITIALIZE_COUNTERS(counter_name) counter_name(0),
+          STAT_COUNTERS(INITIALIZE_COUNTERS)
 #undef INITIALIZE_COUNTERS
-      text(NULL),
+              text(NULL),
       use_benchmark_output(false) {
 }
 
@@ -71,8 +68,7 @@
 
 // Used to aggregate stats. Must be atomic.
 void CompilerStats::Add(const CompilerStats& other) {
-#define ADD_TOTAL(timer_name, literal)                                         \
-  timer_name.AddTotal(other.timer_name);
+#define ADD_TOTAL(timer_name, literal) timer_name.AddTotal(other.timer_name);
 
   STAT_TIMERS(ADD_TOTAL)
 #undef ADD_TOTAL
@@ -86,14 +82,12 @@
 
 
 void CompilerStats::Clear() {
-#define CLEAR_TIMER(timer_name, literal)                                       \
-  timer_name.Reset();
+#define CLEAR_TIMER(timer_name, literal) timer_name.Reset();
 
   STAT_TIMERS(CLEAR_TIMER)
 #undef CLEAR_TIMER
 
-#define CLEAR_COUNTER(counter_name)                                            \
-  counter_name = 0;
+#define CLEAR_COUNTER(counter_name) counter_name = 0;
 
   STAT_COUNTERS(CLEAR_COUNTER)
 #undef CLEAR_COUNTER
@@ -191,8 +185,10 @@
 
   log.Print("CompilerSpeed: %" Pd64 " tokens/ms\n", compile_speed);
   log.Print("CodeSize: %" Pd64 " KB\n", total_code_size / 1024);
-  int64_t code_density = total_instr_size > 0 ?
-      (num_func_tokens_compiled * 1024) / total_instr_size : 0;
+  int64_t code_density =
+      total_instr_size > 0
+          ? (num_func_tokens_compiled * 1024) / total_instr_size
+          : 0;
 
   log.Print("CodeDensity: %" Pd64 " tokens/KB\n", code_density);
   log.Print("InstrSize: %" Pd64 " KB\n", total_instr_size / 1024);
@@ -221,8 +217,9 @@
   log.Print("Source length:           %" Pd64 " characters\n", src_length);
   log.Print("Number of source tokens: %" Pd64 "\n", num_tokens_scanned);
 
-  int64_t num_local_functions = GrowableObjectArray::Handle(
-      isolate_->object_store()->closure_functions()).Length();
+  int64_t num_local_functions =
+      GrowableObjectArray::Handle(isolate_->object_store()->closure_functions())
+          .Length();
 
   log.Print("==== Parser stats:\n");
   log.Print("Total tokens consumed:   %" Pd64 "\n", num_tokens_consumed);
@@ -246,8 +243,7 @@
   int64_t parse_speed =
       parse_usecs > 0 ? 1000 * num_tokens_consumed / parse_usecs : 0;
   log.Print("Parser time:             %" Pd64 " ms\n", parse_usecs / 1000);
-  log.Print("Parser speed:            %" Pd64 " tokens/ms\n",
-             parse_speed);
+  log.Print("Parser speed:            %" Pd64 " tokens/ms\n", parse_speed);
 
   int64_t codegen_usecs = codegen_timer.TotalElapsedTime();
 
@@ -292,20 +288,21 @@
 
   log.Print("==== Compiled code stats:\n");
   int64_t compile_usecs = scan_usecs + parse_usecs + codegen_usecs;
-  int64_t compile_speed = compile_usecs > 0 ?
-      (1000 * num_func_tokens_compiled / compile_usecs) : 0;
+  int64_t compile_speed =
+      compile_usecs > 0 ? (1000 * num_func_tokens_compiled / compile_usecs) : 0;
   log.Print("Functions parsed:        %" Pd64 "\n", num_functions_parsed);
   log.Print("Functions compiled:      %" Pd64 "\n", num_functions_compiled);
   log.Print("  optimized:             %" Pd64 "\n", num_functions_optimized);
   log.Print("Compiler time:           %" Pd64 " ms\n", compile_usecs / 1000);
   log.Print("Tokens compiled:         %" Pd64 "\n", num_func_tokens_compiled);
   log.Print("Compilation speed:       %" Pd64 " tokens/ms\n", compile_speed);
-  int64_t code_density = total_instr_size > 0 ?
-      (num_func_tokens_compiled * 1024) / total_instr_size : 0;
+  int64_t code_density =
+      total_instr_size > 0
+          ? (num_func_tokens_compiled * 1024) / total_instr_size
+          : 0;
   log.Print("Code density:            %" Pd64 " tokens per KB\n", code_density);
   log.Print("Code size:               %" Pd64 " KB\n", total_code_size / 1024);
-  log.Print("  Instr size:            %" Pd64 " KB\n",
-            total_instr_size / 1024);
+  log.Print("  Instr size:            %" Pd64 " KB\n", total_instr_size / 1024);
   log.Print("  Pc Desc size:          %" Pd64 " KB\n", pc_desc_size / 1024);
   log.Print("  VarDesc size:          %" Pd64 " KB\n", vardesc_size / 1024);
   log.Flush();
diff --git a/runtime/vm/compiler_stats.h b/runtime/vm/compiler_stats.h
index 7c1f39f..6575133 100644
--- a/runtime/vm/compiler_stats.h
+++ b/runtime/vm/compiler_stats.h
@@ -32,7 +32,7 @@
   V(graphinliner_subst_timer, "inliner substitution timer")                    \
   V(graphoptimizer_timer, "flow graph optimizer timer")                        \
   V(graphcompiler_timer, "flow graph compiler timer")                          \
-  V(codefinalizer_timer, "code finalization timer")                            \
+  V(codefinalizer_timer, "code finalization timer")
 
 
 #define STAT_COUNTERS(V)                                                       \
@@ -54,23 +54,23 @@
   V(total_code_size)                                                           \
   V(total_instr_size)                                                          \
   V(pc_desc_size)                                                              \
-  V(vardesc_size)                                                              \
+  V(vardesc_size)
 
 class CompilerStats {
  public:
   explicit CompilerStats(Isolate* isolate);
-  ~CompilerStats() { }
+  ~CompilerStats() {}
 
   Isolate* isolate_;
 
   // We could use STAT_TIMERS and STAT_COUNTERS to declare fields, but then
   // we would be losing the comments.
-  Timer parser_timer;         // Cumulative runtime of parser.
-  Timer scanner_timer;        // Cumulative runtime of scanner.
-  Timer codegen_timer;        // Cumulative runtime of code generator.
-  Timer graphbuilder_timer;   // Included in codegen_timer.
-  Timer ssa_timer;            // Included in codegen_timer.
-  Timer graphinliner_timer;   // Included in codegen_timer.
+  Timer parser_timer;              // Cumulative runtime of parser.
+  Timer scanner_timer;             // Cumulative runtime of scanner.
+  Timer codegen_timer;             // Cumulative runtime of code generator.
+  Timer graphbuilder_timer;        // Included in codegen_timer.
+  Timer ssa_timer;                 // Included in codegen_timer.
+  Timer graphinliner_timer;        // Included in codegen_timer.
   Timer graphinliner_parse_timer;  // Included in codegen_timer.
   Timer graphinliner_build_timer;  // Included in codegen_timer.
   Timer graphinliner_ssa_timer;    // Included in codegen_timer.
@@ -81,7 +81,7 @@
   Timer graphcompiler_timer;   // Included in codegen_timer.
   Timer codefinalizer_timer;   // Included in codegen_timer.
 
-  int64_t num_tokens_total;    // Isolate + VM isolate
+  int64_t num_tokens_total;  // Isolate + VM isolate
   int64_t num_tokens_scanned;
   int64_t num_tokens_consumed;
   int64_t num_cached_consts;
@@ -90,16 +90,16 @@
 
   int64_t num_classes_parsed;
   int64_t num_class_tokens;
-  int64_t num_functions_parsed;      // Num parsed functions.
-  int64_t num_functions_compiled;    // Num unoptimized compilations.
-  int64_t num_functions_optimized;   // Num optimized compilations.
+  int64_t num_functions_parsed;     // Num parsed functions.
+  int64_t num_functions_compiled;   // Num unoptimized compilations.
+  int64_t num_functions_optimized;  // Num optimized compilations.
   int64_t num_func_tokens_compiled;
   int64_t num_implicit_final_getters;
   int64_t num_method_extractors;
 
-  int64_t src_length;          // Total number of characters in source.
-  int64_t total_code_size;     // Bytes allocated for code and meta info.
-  int64_t total_instr_size;    // Total size of generated code in bytes.
+  int64_t src_length;        // Total number of characters in source.
+  int64_t total_code_size;   // Bytes allocated for code and meta info.
+  int64_t total_instr_size;  // Total size of generated code in bytes.
   int64_t pc_desc_size;
   int64_t vardesc_size;
   char* text;
@@ -125,19 +125,21 @@
 // other thread.
 #define INC_STAT(thread, counter, incr)                                        \
   if (FLAG_support_compiler_stats && FLAG_compiler_stats) {                    \
-    AtomicOperations::IncrementInt64By(                                        \
-        &(thread)->compiler_stats()->counter, (incr));                         \
+    AtomicOperations::IncrementInt64By(&(thread)->compiler_stats()->counter,   \
+                                       (incr));                                \
   }
 
 #define STAT_VALUE(thread, counter)                                            \
-  ((FLAG_support_compiler_stats && FLAG_compiler_stats) ?                      \
-      (thread)->compiler_stats()->counter : 0)
+  ((FLAG_support_compiler_stats && FLAG_compiler_stats)                        \
+       ? (thread)->compiler_stats()->counter                                   \
+       : 0)
 
 #define CSTAT_TIMER_SCOPE(thr, t)                                              \
-  TimerScope timer(FLAG_support_compiler_stats && FLAG_compiler_stats,         \
-      (FLAG_support_compiler_stats && FLAG_compiler_stats) ?                   \
-      &((thr)->compiler_stats()->t) : NULL,                                    \
-      thr);
+  TimerScope timer(FLAG_support_compiler_stats&& FLAG_compiler_stats,          \
+                   (FLAG_support_compiler_stats && FLAG_compiler_stats)        \
+                       ? &((thr)->compiler_stats()->t)                         \
+                       : NULL,                                                 \
+                   thr);
 
 
 }  // namespace dart
diff --git a/runtime/vm/compiler_test.cc b/runtime/vm/compiler_test.cc
index f2e138c..5225c53 100644
--- a/runtime/vm/compiler_test.cc
+++ b/runtime/vm/compiler_test.cc
@@ -22,9 +22,8 @@
       "}\n";
   String& url = String::Handle(String::New("dart-test:CompileScript"));
   String& source = String::Handle(String::New(kScriptChars));
-  Script& script = Script::Handle(Script::New(url,
-                                              source,
-                                              RawScript::kScriptTag));
+  Script& script =
+      Script::Handle(Script::New(url, source, RawScript::kScriptTag));
   Library& lib = Library::Handle(Library::CoreLibrary());
   EXPECT(CompilerTest::TestCompileScript(lib, script));
 }
@@ -32,22 +31,21 @@
 
 VM_TEST_CASE(CompileFunction) {
   const char* kScriptChars =
-            "class A {\n"
-            "  static foo() { return 42; }\n"
-            "  static moo() {\n"
-            "    // A.foo();\n"
-            "  }\n"
-            "}\n";
+      "class A {\n"
+      "  static foo() { return 42; }\n"
+      "  static moo() {\n"
+      "    // A.foo();\n"
+      "  }\n"
+      "}\n";
   String& url = String::Handle(String::New("dart-test:CompileFunction"));
   String& source = String::Handle(String::New(kScriptChars));
-  Script& script = Script::Handle(Script::New(url,
-                                              source,
-                                              RawScript::kScriptTag));
+  Script& script =
+      Script::Handle(Script::New(url, source, RawScript::kScriptTag));
   Library& lib = Library::Handle(Library::CoreLibrary());
   EXPECT(CompilerTest::TestCompileScript(lib, script));
   EXPECT(ClassFinalizer::ProcessPendingClasses());
-  Class& cls = Class::Handle(
-      lib.LookupClass(String::Handle(Symbols::New(thread, "A"))));
+  Class& cls =
+      Class::Handle(lib.LookupClass(String::Handle(Symbols::New(thread, "A"))));
   EXPECT(!cls.IsNull());
   String& function_foo_name = String::Handle(String::New("foo"));
   Function& function_foo =
@@ -74,20 +72,19 @@
 VM_TEST_CASE(CompileFunctionOnHelperThread) {
   // Create a simple function and compile it without optimization.
   const char* kScriptChars =
-            "class A {\n"
-            "  static foo() { return 42; }\n"
-            "}\n";
+      "class A {\n"
+      "  static foo() { return 42; }\n"
+      "}\n";
   String& url =
       String::Handle(String::New("dart-test:CompileFunctionOnHelperThread"));
   String& source = String::Handle(String::New(kScriptChars));
-  Script& script = Script::Handle(Script::New(url,
-                                              source,
-                                              RawScript::kScriptTag));
+  Script& script =
+      Script::Handle(Script::New(url, source, RawScript::kScriptTag));
   Library& lib = Library::Handle(Library::CoreLibrary());
   EXPECT(CompilerTest::TestCompileScript(lib, script));
   EXPECT(ClassFinalizer::ProcessPendingClasses());
-  Class& cls = Class::Handle(
-      lib.LookupClass(String::Handle(Symbols::New(thread, "A"))));
+  Class& cls =
+      Class::Handle(lib.LookupClass(String::Handle(Symbols::New(thread, "A"))));
   EXPECT(!cls.IsNull());
   String& function_foo_name = String::Handle(String::New("foo"));
   Function& func =
@@ -115,13 +112,13 @@
 
 TEST_CASE(RegenerateAllocStubs) {
   const char* kScriptChars =
-            "class A {\n"
-            "}\n"
-            "unOpt() => new A(); \n"
-            "optIt() => new A(); \n"
-            "A main() {\n"
-            "  return unOpt();\n"
-            "}\n";
+      "class A {\n"
+      "}\n"
+      "unOpt() => new A(); \n"
+      "optIt() => new A(); \n"
+      "A main() {\n"
+      "  return unOpt();\n"
+      "}\n";
 
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
   Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
@@ -133,8 +130,8 @@
   EXPECT(!cls.IsNull());
 
   Zone* zone = thread->zone();
-  const Code& stub = Code::Handle(zone,
-                                  StubCode::GetAllocationStubForClass(cls));
+  const Code& stub =
+      Code::Handle(zone, StubCode::GetAllocationStubForClass(cls));
   Class& owner = Class::Handle();
   owner ^= stub.owner();
   owner.DisableAllocationStub();
@@ -163,7 +160,7 @@
 
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
   Dart_Handle obj_handle =
-      Dart_Invoke(lib, Dart_NewStringFromCString("makeObj"), 0,  NULL);
+      Dart_Invoke(lib, Dart_NewStringFromCString("makeObj"), 0, NULL);
   EXPECT(!Dart_IsNull(obj_handle));
   EXPECT(!Dart_IsError(obj_handle));
   TransitionNativeToVM transition(thread);
@@ -175,10 +172,8 @@
   expr_text = String::New("apa + ' ${calc(10)}' + dot");
   Object& val = Object::Handle();
   const Class& receiver_cls = Class::Handle(obj.clazz());
-  val = Instance::Cast(obj).Evaluate(receiver_cls,
-                                     expr_text,
-                                     Array::empty_array(),
-                                     Array::empty_array());
+  val = Instance::Cast(obj).Evaluate(
+      receiver_cls, expr_text, Array::empty_array(), Array::empty_array());
   EXPECT(!val.IsNull());
   EXPECT(!val.IsError());
   EXPECT(val.IsString());
@@ -189,8 +184,8 @@
 VM_TEST_CASE(EvalExpressionWithLazyCompile) {
   Library& lib = Library::Handle(Library::CoreLibrary());
 
-  const String& expression = String::Handle(String::New(
-      "(){ return (){ return (){ return 3 + 4; }(); }(); }()"));
+  const String& expression = String::Handle(
+      String::New("(){ return (){ return (){ return 3 + 4; }(); }(); }()"));
   Object& val = Object::Handle();
   val = lib.Evaluate(expression, Array::empty_array(), Array::empty_array());
 
diff --git a/runtime/vm/constant_propagator.cc b/runtime/vm/constant_propagator.cc
index b63f849..9d2bc11 100644
--- a/runtime/vm/constant_propagator.cc
+++ b/runtime/vm/constant_propagator.cc
@@ -16,8 +16,10 @@
 namespace dart {
 
 DEFINE_FLAG(bool, remove_redundant_phis, true, "Remove redundant phis.");
-DEFINE_FLAG(bool, trace_constant_propagation, false,
-    "Print constant propagation and useless code elimination.");
+DEFINE_FLAG(bool,
+            trace_constant_propagation,
+            false,
+            "Print constant propagation and useless code elimination.");
 
 // Quick access to the current zone and isolate.
 #define I (isolate())
@@ -31,10 +33,8 @@
       graph_(graph),
       unknown_(Object::unknown_constant()),
       non_constant_(Object::non_constant()),
-      reachable_(new(Z) BitVector(
-          Z, graph->preorder().length())),
-      marked_phis_(new(Z) BitVector(
-          Z, graph->max_virtual_register_number())),
+      reachable_(new (Z) BitVector(Z, graph->preorder().length())),
+      marked_phis_(new (Z) BitVector(Z, graph->max_virtual_register_number())),
       block_worklist_(),
       definition_worklist_(graph, 10) {}
 
@@ -235,40 +235,40 @@
 // Analysis of non-definition instructions.  They do not have values so they
 // cannot have constant values.
 void ConstantPropagator::VisitCheckStackOverflow(
-    CheckStackOverflowInstr* instr) { }
+    CheckStackOverflowInstr* instr) {}
 
 
-void ConstantPropagator::VisitCheckClass(CheckClassInstr* instr) { }
+void ConstantPropagator::VisitCheckClass(CheckClassInstr* instr) {}
 
 
-void ConstantPropagator::VisitCheckClassId(CheckClassIdInstr* instr) { }
+void ConstantPropagator::VisitCheckClassId(CheckClassIdInstr* instr) {}
 
 
-void ConstantPropagator::VisitGuardFieldClass(GuardFieldClassInstr* instr) { }
+void ConstantPropagator::VisitGuardFieldClass(GuardFieldClassInstr* instr) {}
 
 
-void ConstantPropagator::VisitGuardFieldLength(GuardFieldLengthInstr* instr) { }
+void ConstantPropagator::VisitGuardFieldLength(GuardFieldLengthInstr* instr) {}
 
 
-void ConstantPropagator::VisitCheckSmi(CheckSmiInstr* instr) { }
+void ConstantPropagator::VisitCheckSmi(CheckSmiInstr* instr) {}
 
 
 void ConstantPropagator::VisitGenericCheckBound(GenericCheckBoundInstr* instr) {
 }
 
 
-void ConstantPropagator::VisitCheckEitherNonSmi(
-    CheckEitherNonSmiInstr* instr) { }
+void ConstantPropagator::VisitCheckEitherNonSmi(CheckEitherNonSmiInstr* instr) {
+}
 
 
-void ConstantPropagator::VisitCheckArrayBound(CheckArrayBoundInstr* instr) { }
+void ConstantPropagator::VisitCheckArrayBound(CheckArrayBoundInstr* instr) {}
 
 
 void ConstantPropagator::VisitDeoptimize(DeoptimizeInstr* instr) {
   // TODO(vegorov) remove all code after DeoptimizeInstr as dead.
 }
 
-void ConstantPropagator::VisitGrowRegExpStack(GrowRegExpStackInstr* instr) { }
+void ConstantPropagator::VisitGrowRegExpStack(GrowRegExpStackInstr* instr) {}
 
 Definition* ConstantPropagator::UnwrapPhi(Definition* defn) {
   if (defn->IsPhi()) {
@@ -309,8 +309,7 @@
   for (intptr_t pred_idx = 0; pred_idx < instr->InputCount(); ++pred_idx) {
     if (reachable_->Contains(
             block->PredecessorAt(pred_idx)->preorder_number())) {
-      Join(&value,
-           instr->InputAt(pred_idx)->definition()->constant_value());
+      Join(&value, instr->InputAt(pred_idx)->definition()->constant_value());
     }
   }
   if (!SetValue(instr, value) &&
@@ -326,8 +325,7 @@
   // are guaranteed to fold away code paths that correspond to non-matching
   // class ids. Otherwise LICM might potentially hoist incorrect code.
   const Object& value = instr->value()->definition()->constant_value();
-  if (IsConstant(value) &&
-      !Field::IsExternalizableCid(value.GetClassId())) {
+  if (IsConstant(value) && !Field::IsExternalizableCid(value.GetClassId())) {
     SetValue(instr, value);
   } else {
     SetValue(instr, non_constant_);
@@ -428,9 +426,8 @@
     ASSERT(!value.IsNull());
     ASSERT(value.IsBool());
     bool result = Bool::Cast(value).value();
-    SetValue(instr,
-             Smi::Handle(Z, Smi::New(
-                 result ? instr->if_true() : instr->if_false())));
+    SetValue(instr, Smi::Handle(Z, Smi::New(result ? instr->if_true()
+                                                   : instr->if_false())));
   }
 }
 
@@ -493,12 +490,18 @@
                             const Integer& right) {
   const int result = left.CompareWith(right);
   switch (kind) {
-    case Token::kEQ: return (result == 0);
-    case Token::kNE: return (result != 0);
-    case Token::kLT: return (result < 0);
-    case Token::kGT: return (result > 0);
-    case Token::kLTE: return (result <= 0);
-    case Token::kGTE: return (result >= 0);
+    case Token::kEQ:
+      return (result == 0);
+    case Token::kNE:
+      return (result != 0);
+    case Token::kLT:
+      return (result < 0);
+    case Token::kGT:
+      return (result > 0);
+    case Token::kLTE:
+      return (result <= 0);
+    case Token::kGTE:
+      return (result >= 0);
     default:
       UNREACHABLE();
       return false;
@@ -515,8 +518,8 @@
     SetValue(instr, non_constant_);
   } else if (IsConstant(left) && IsConstant(right)) {
     // BitOp does not work on Bigints.
-    if (left.IsInteger() && right.IsInteger() &&
-        !left.IsBigint() && !right.IsBigint()) {
+    if (left.IsInteger() && right.IsInteger() && !left.IsBigint() &&
+        !right.IsBigint()) {
       const bool result = CompareIntegers(
           instr->kind(),
           Integer::Handle(Z, Integer::Cast(left).BitOp(Token::kBIT_AND,
@@ -563,8 +566,7 @@
     SetValue(instr, non_constant_);
   } else if (IsConstant(left) && IsConstant(right)) {
     if (left.IsInteger() && right.IsInteger()) {
-      const bool result = CompareIntegers(instr->kind(),
-                                          Integer::Cast(left),
+      const bool result = CompareIntegers(instr->kind(), Integer::Cast(left),
                                           Integer::Cast(right));
       SetValue(instr, Bool::Get(result));
     } else if (left.IsString() && right.IsString()) {
@@ -584,8 +586,7 @@
     SetValue(instr, non_constant_);
   } else if (IsConstant(left) && IsConstant(right)) {
     if (left.IsInteger() && right.IsInteger()) {
-      const bool result = CompareIntegers(instr->kind(),
-                                          Integer::Cast(left),
+      const bool result = CompareIntegers(instr->kind(), Integer::Cast(left),
                                           Integer::Cast(right));
       SetValue(instr, Bool::Get(result));
     } else if (left.IsDouble() && right.IsDouble()) {
@@ -661,8 +662,9 @@
       if (array_obj.IsString()) {
         const String& str = String::Cast(array_obj);
         if (str.Length() > index) {
-          SetValue(instr, Smi::Handle(Z,
-              Smi::New(static_cast<intptr_t>(str.CharAt(index)))));
+          SetValue(instr,
+                   Smi::Handle(
+                       Z, Smi::New(static_cast<intptr_t>(str.CharAt(index)))));
           return;
         }
       } else if (array_obj.IsArray()) {
@@ -764,13 +766,12 @@
       if (instr->instantiator_type_arguments()->BindsToConstantNull()) {
         const TypeArguments& checked_type_arguments = TypeArguments::Handle();
         Error& bound_error = Error::Handle();
-        bool is_instance = instance.IsInstanceOf(checked_type,
-                                                 checked_type_arguments,
-                                                 &bound_error);
+        bool is_instance = instance.IsInstanceOf(
+            checked_type, checked_type_arguments, &bound_error);
         // Can only have bound error with generics.
         ASSERT(bound_error.IsNull());
-        SetValue(instr, Bool::Get(instr->negate_result()
-                                  ? !is_instance : is_instance));
+        SetValue(instr, Bool::Get(instr->negate_result() ? !is_instance
+                                                         : is_instance));
         return;
       }
     }
@@ -817,8 +818,10 @@
   Value* instance = instr->instance();
   if ((instr->recognized_kind() == MethodRecognizer::kObjectArrayLength) &&
       instance->definition()->OriginalDefinition()->IsCreateArray()) {
-    Value* num_elements = instance->definition()->OriginalDefinition()
-        ->AsCreateArray()->num_elements();
+    Value* num_elements = instance->definition()
+                              ->OriginalDefinition()
+                              ->AsCreateArray()
+                              ->num_elements();
     if (num_elements->BindsToConstant() &&
         num_elements->BoundConstant().IsSmi()) {
       intptr_t length = Smi::Cast(num_elements->BoundConstant()).Value();
@@ -833,18 +836,21 @@
         instance->definition()->OriginalDefinition()->AsConstant();
     if (constant != NULL) {
       if (constant->value().IsString()) {
-        SetValue(instr, Smi::ZoneHandle(Z,
-            Smi::New(String::Cast(constant->value()).Length())));
+        SetValue(instr,
+                 Smi::ZoneHandle(
+                     Z, Smi::New(String::Cast(constant->value()).Length())));
         return;
       }
       if (constant->value().IsArray()) {
-        SetValue(instr, Smi::ZoneHandle(Z,
-            Smi::New(Array::Cast(constant->value()).Length())));
+        SetValue(instr,
+                 Smi::ZoneHandle(
+                     Z, Smi::New(Array::Cast(constant->value()).Length())));
         return;
       }
       if (constant->value().IsTypedData()) {
-        SetValue(instr, Smi::ZoneHandle(Z,
-            Smi::New(TypedData::Cast(constant->value()).Length())));
+        SetValue(instr,
+                 Smi::ZoneHandle(
+                     Z, Smi::New(TypedData::Cast(constant->value()).Length())));
         return;
       }
     }
@@ -854,8 +860,7 @@
 
 
 void ConstantPropagator::VisitInstantiateType(InstantiateTypeInstr* instr) {
-  const Object& object =
-      instr->instantiator()->definition()->constant_value();
+  const Object& object = instr->instantiator()->definition()->constant_value();
   if (IsNonConstant(object)) {
     SetValue(instr, non_constant_);
     return;
@@ -876,16 +881,14 @@
 
 void ConstantPropagator::VisitInstantiateTypeArguments(
     InstantiateTypeArgumentsInstr* instr) {
-  const Object& object =
-      instr->instantiator()->definition()->constant_value();
+  const Object& object = instr->instantiator()->definition()->constant_value();
   if (IsNonConstant(object)) {
     SetValue(instr, non_constant_);
     return;
   }
   if (IsConstant(object)) {
     const intptr_t len = instr->type_arguments().Length();
-    if (instr->type_arguments().IsRawInstantiatedRaw(len) &&
-        object.IsNull()) {
+    if (instr->type_arguments().IsRawInstantiatedRaw(len) && object.IsNull()) {
       SetValue(instr, object);
       return;
     }
@@ -993,8 +996,7 @@
   const Object& value = unary_op->value()->definition()->constant_value();
   if (IsConstant(value) && value.IsInteger()) {
     const Integer& value_int = Integer::Cast(value);
-    const Integer& result =
-        Integer::Handle(Z, unary_op->Evaluate(value_int));
+    const Integer& result = Integer::Handle(Z, unary_op->Evaluate(value_int));
     if (!result.IsNull()) {
       SetValue(unary_op, Integer::ZoneHandle(Z, result.raw()));
       return;
@@ -1029,8 +1031,9 @@
 void ConstantPropagator::VisitSmiToDouble(SmiToDoubleInstr* instr) {
   const Object& value = instr->value()->definition()->constant_value();
   if (IsConstant(value) && value.IsInteger()) {
-    SetValue(instr, Double::Handle(Z,
-        Double::New(Integer::Cast(value).AsDoubleValue(), Heap::kOld)));
+    SetValue(instr,
+             Double::Handle(Z, Double::New(Integer::Cast(value).AsDoubleValue(),
+                                           Heap::kOld)));
   } else if (!IsUnknown(value)) {
     SetValue(instr, non_constant_);
   }
@@ -1040,8 +1043,9 @@
 void ConstantPropagator::VisitMintToDouble(MintToDoubleInstr* instr) {
   const Object& value = instr->value()->definition()->constant_value();
   if (IsConstant(value) && value.IsInteger()) {
-    SetValue(instr, Double::Handle(Z,
-        Double::New(Integer::Cast(value).AsDoubleValue(), Heap::kOld)));
+    SetValue(instr,
+             Double::Handle(Z, Double::New(Integer::Cast(value).AsDoubleValue(),
+                                           Heap::kOld)));
   } else if (!IsUnknown(value)) {
     SetValue(instr, non_constant_);
   }
@@ -1051,8 +1055,9 @@
 void ConstantPropagator::VisitInt32ToDouble(Int32ToDoubleInstr* instr) {
   const Object& value = instr->value()->definition()->constant_value();
   if (IsConstant(value) && value.IsInteger()) {
-    SetValue(instr, Double::Handle(Z,
-        Double::New(Integer::Cast(value).AsDoubleValue(), Heap::kOld)));
+    SetValue(instr,
+             Double::Handle(Z, Double::New(Integer::Cast(value).AsDoubleValue(),
+                                           Heap::kOld)));
   } else if (!IsUnknown(value)) {
     SetValue(instr, non_constant_);
   }
@@ -1140,8 +1145,7 @@
 }
 
 
-void ConstantPropagator::VisitBinaryDoubleOp(
-    BinaryDoubleOpInstr* instr) {
+void ConstantPropagator::VisitBinaryDoubleOp(BinaryDoubleOpInstr* instr) {
   const Object& left = instr->left()->definition()->constant_value();
   const Object& right = instr->right()->definition()->constant_value();
   if (IsNonConstant(left) || IsNonConstant(right)) {
@@ -1200,8 +1204,7 @@
 }
 
 
-void ConstantPropagator::VisitBinaryFloat32x4Op(
-    BinaryFloat32x4OpInstr* instr) {
+void ConstantPropagator::VisitBinaryFloat32x4Op(BinaryFloat32x4OpInstr* instr) {
   const Object& left = instr->left()->definition()->constant_value();
   const Object& right = instr->right()->definition()->constant_value();
   if (IsNonConstant(left) || IsNonConstant(right)) {
@@ -1348,14 +1351,12 @@
 }
 
 
-void ConstantPropagator::VisitFloat64x2Zero(
-    Float64x2ZeroInstr* instr) {
+void ConstantPropagator::VisitFloat64x2Zero(Float64x2ZeroInstr* instr) {
   SetValue(instr, non_constant_);
 }
 
 
-void ConstantPropagator::VisitFloat64x2Splat(
-    Float64x2SplatInstr* instr) {
+void ConstantPropagator::VisitFloat64x2Splat(Float64x2SplatInstr* instr) {
   SetValue(instr, non_constant_);
 }
 
@@ -1402,7 +1403,7 @@
 
 
 void ConstantPropagator::VisitCaseInsensitiveCompareUC16(
-    CaseInsensitiveCompareUC16Instr *instr) {
+    CaseInsensitiveCompareUC16Instr* instr) {
   SetValue(instr, non_constant_);
 }
 
@@ -1489,17 +1490,16 @@
 
 static bool IsEmptyBlock(BlockEntryInstr* block) {
   return block->next()->IsGoto() &&
-      (!block->IsJoinEntry() || (block->AsJoinEntry()->phis() == NULL)) &&
-      !block->IsIndirectEntry();
+         (!block->IsJoinEntry() || (block->AsJoinEntry()->phis() == NULL)) &&
+         !block->IsIndirectEntry();
 }
 
 
 // Traverses a chain of empty blocks and returns the first reachable non-empty
 // block that is not dominated by the start block. The empty blocks are added
 // to the supplied bit vector.
-static BlockEntryInstr* FindFirstNonEmptySuccessor(
-    TargetEntryInstr* block,
-    BitVector* empty_blocks) {
+static BlockEntryInstr* FindFirstNonEmptySuccessor(TargetEntryInstr* block,
+                                                   BitVector* empty_blocks) {
   BlockEntryInstr* current = block;
   while (IsEmptyBlock(current) && block->Dominates(current)) {
     ASSERT(!block->IsJoinEntry() || (block->AsJoinEntry()->phis() == NULL));
@@ -1514,11 +1514,8 @@
   // Canonicalize branches that have no side-effects and where true- and
   // false-targets are the same.
   bool changed = false;
-  BitVector* empty_blocks = new(Z) BitVector(Z,
-      graph_->preorder().length());
-  for (BlockIterator b = graph_->postorder_iterator();
-       !b.Done();
-       b.Advance()) {
+  BitVector* empty_blocks = new (Z) BitVector(Z, graph_->preorder().length());
+  for (BlockIterator b = graph_->postorder_iterator(); !b.Done(); b.Advance()) {
     BlockEntryInstr* block = b.Current();
     BranchInstr* branch = block->last_instruction()->AsBranch();
     empty_blocks->Clear();
@@ -1533,7 +1530,7 @@
         // Drop the comparison, which does not have side effects
         JoinEntryInstr* join = if_true->AsJoinEntry();
         if (join->phis() == NULL) {
-          GotoInstr* jump = new(Z) GotoInstr(if_true->AsJoinEntry());
+          GotoInstr* jump = new (Z) GotoInstr(if_true->AsJoinEntry());
           jump->InheritDeoptTarget(Z, branch);
 
           Instruction* previous = branch->previous();
@@ -1579,8 +1576,7 @@
   // instructions, previous pointers, predecessors, etc. after eliminating
   // unreachable code.  We do not maintain those properties during the
   // transformation.
-  for (BlockIterator b = graph_->reverse_postorder_iterator();
-       !b.Done();
+  for (BlockIterator b = graph_->reverse_postorder_iterator(); !b.Done();
        b.Advance()) {
     BlockEntryInstr* block = b.Current();
     if (!reachable_->Contains(block->preorder_number())) {
@@ -1649,18 +1645,14 @@
       // Replace constant-valued instructions without observable side
       // effects.  Do this for smis only to avoid having to copy other
       // objects into the heap's old generation.
-      if ((defn != NULL) &&
-          IsConstant(defn->constant_value()) &&
+      if ((defn != NULL) && IsConstant(defn->constant_value()) &&
           (defn->constant_value().IsSmi() || defn->constant_value().IsOld()) &&
-          !defn->IsConstant() &&
-          !defn->IsPushArgument() &&
-          !defn->IsStoreIndexed() &&
-          !defn->IsStoreInstanceField() &&
+          !defn->IsConstant() && !defn->IsPushArgument() &&
+          !defn->IsStoreIndexed() && !defn->IsStoreInstanceField() &&
           !defn->IsStoreStaticField()) {
         if (FLAG_trace_constant_propagation &&
             FlowGraphPrinter::ShouldPrint(graph_->function())) {
-          THR_Print("Constant v%" Pd " = %s\n",
-                    defn->ssa_temp_index(),
+          THR_Print("Constant v%" Pd " = %s\n", defn->ssa_temp_index(),
                     defn->constant_value().ToCString());
         }
         ConstantInstr* constant = graph_->GetConstant(defn->constant_value());
@@ -1681,16 +1673,16 @@
         ASSERT(reachable_->Contains(if_false->preorder_number()));
         ASSERT(if_false->parallel_move() == NULL);
         ASSERT(if_false->loop_info() == NULL);
-        join = new(Z) JoinEntryInstr(if_false->block_id(),
-                                     if_false->try_index());
+        join =
+            new (Z) JoinEntryInstr(if_false->block_id(), if_false->try_index());
         join->InheritDeoptTarget(Z, if_false);
         if_false->UnuseAllInputs();
         next = if_false->next();
       } else if (!reachable_->Contains(if_false->preorder_number())) {
         ASSERT(if_true->parallel_move() == NULL);
         ASSERT(if_true->loop_info() == NULL);
-        join = new(Z) JoinEntryInstr(if_true->block_id(),
-                                     if_true->try_index());
+        join =
+            new (Z) JoinEntryInstr(if_true->block_id(), if_true->try_index());
         join->InheritDeoptTarget(Z, if_true);
         if_true->UnuseAllInputs();
         next = if_true->next();
@@ -1701,7 +1693,7 @@
         // Drop the comparison, which does not have side effects as long
         // as it is a strict compare (the only one we can determine is
         // constant with the current analysis).
-        GotoInstr* jump = new(Z) GotoInstr(join);
+        GotoInstr* jump = new (Z) GotoInstr(join);
         jump->InheritDeoptTarget(Z, branch);
 
         Instruction* previous = branch->previous();
diff --git a/runtime/vm/constant_propagator.h b/runtime/vm/constant_propagator.h
index 191c6b8..23f5fe9 100644
--- a/runtime/vm/constant_propagator.h
+++ b/runtime/vm/constant_propagator.h
@@ -49,9 +49,7 @@
   // first one.
   void Join(Object* left, const Object& right);
 
-  bool IsUnknown(const Object& value) {
-    return value.raw() == unknown_.raw();
-  }
+  bool IsUnknown(const Object& value) { return value.raw() == unknown_.raw(); }
   bool IsNonConstant(const Object& value) {
     return value.raw() == non_constant_.raw();
   }
diff --git a/runtime/vm/constants_arm.h b/runtime/vm/constants_arm.h
index 764e541..c4213ad 100644
--- a/runtime/vm/constants_arm.h
+++ b/runtime/vm/constants_arm.h
@@ -61,16 +61,16 @@
 
 
 enum Register {
-  R0  =  0,
-  R1  =  1,
-  R2  =  2,
-  R3  =  3,
-  R4  =  4,
-  R5  =  5,  // PP
-  R6  =  6,  // CTX
-  R7  =  7,  // iOS FP
-  R8  =  8,
-  R9  =  9,
+  R0 = 0,
+  R1 = 1,
+  R2 = 2,
+  R3 = 3,
+  R4 = 4,
+  R5 = 5,  // PP
+  R6 = 6,  // CTX
+  R7 = 7,  // iOS FP
+  R8 = 8,
+  R9 = 9,
   R10 = 10,  // THR
   R11 = 11,  // Linux FP
   R12 = 12,  // IP aka TMP
@@ -80,36 +80,36 @@
   kNumberOfCpuRegisters = 16,
   kNoRegister = -1,  // Signals an illegal register.
 
-  // Aliases.
+// Aliases.
 #if defined(TARGET_ABI_IOS)
-  FP   = R7,
+  FP = R7,
   NOTFP = R11,
 #elif defined(TARGET_ABI_EABI)
-  FP   = R11,
+  FP = R11,
   NOTFP = R7,
 #else
 #error Unknown ABI
 #endif
-  IP  = R12,
-  SP  = R13,
-  LR  = R14,
-  PC  = R15,
+  IP = R12,
+  SP = R13,
+  LR = R14,
+  PC = R15,
 };
 
 
 // Values for single-precision floating point registers.
 enum SRegister {
   kNoSRegister = -1,
-  S0  =  0,
-  S1  =  1,
-  S2  =  2,
-  S3  =  3,
-  S4  =  4,
-  S5  =  5,
-  S6  =  6,
-  S7  =  7,
-  S8  =  8,
-  S9  =  9,
+  S0 = 0,
+  S1 = 1,
+  S2 = 2,
+  S3 = 3,
+  S4 = 4,
+  S5 = 5,
+  S6 = 6,
+  S7 = 7,
+  S8 = 8,
+  S9 = 9,
   S10 = 10,
   S11 = 11,
   S12 = 12,
@@ -139,16 +139,16 @@
 // Values for double-precision floating point registers.
 enum DRegister {
   kNoDRegister = -1,
-  D0  =  0,
-  D1  =  1,
-  D2  =  2,
-  D3  =  3,
-  D4  =  4,
-  D5  =  5,
-  D6  =  6,
-  D7  =  7,
-  D8  =  8,
-  D9  =  9,
+  D0 = 0,
+  D1 = 1,
+  D2 = 2,
+  D3 = 3,
+  D4 = 4,
+  D5 = 5,
+  D6 = 6,
+  D7 = 7,
+  D8 = 8,
+  D9 = 9,
   D10 = 10,
   D11 = 11,
   D12 = 12,
@@ -201,18 +201,18 @@
 
 enum QRegister {
   kNoQRegister = -1,
-  Q0  =  0,
-  Q1  =  1,
-  Q2  =  2,
-  Q3  =  3,
-  Q4  =  4,
-  Q5  =  5,
-  Q6  =  6,
-  Q7  =  7,
+  Q0 = 0,
+  Q1 = 1,
+  Q2 = 2,
+  Q3 = 3,
+  Q4 = 4,
+  Q5 = 5,
+  Q6 = 6,
+  Q7 = 7,
 #if defined(VFPv3_D16)
   kNumberOfQRegisters = 8,
-  Q8  = kNoQRegister,
-  Q9  = kNoQRegister,
+  Q8 = kNoQRegister,
+  Q9 = kNoQRegister,
   Q10 = kNoQRegister,
   Q11 = kNoQRegister,
   Q12 = kNoQRegister,
@@ -220,8 +220,8 @@
   Q14 = kNoQRegister,
   Q15 = kNoQRegister,
 #else
-  Q8  =  8,
-  Q9  =  9,
+  Q8 = 8,
+  Q9 = 9,
   Q10 = 10,
   Q11 = 11,
   Q12 = 12,
@@ -260,7 +260,7 @@
 
 
 // Register aliases for floating point scratch registers.
-const QRegister QTMP = Q7;  // Overlaps with DTMP, STMP.
+const QRegister QTMP = Q7;                     // Overlaps with DTMP, STMP.
 const DRegister DTMP = EvenDRegisterOf(QTMP);  // Overlaps with STMP.
 const SRegister STMP = EvenSRegisterOf(DTMP);
 
@@ -272,10 +272,10 @@
 const FpuRegister kNoFpuRegister = kNoQRegister;
 
 // Register aliases.
-const Register TMP = IP;  // Used as scratch register by assembler.
+const Register TMP = IP;            // Used as scratch register by assembler.
 const Register TMP2 = kNoRegister;  // There is no second assembler temporary.
-const Register CTX = R6;  // Location of current context at method entry.
-const Register PP = R5;  // Caches object pool pointer in generated code.
+const Register CTX = R6;    // Location of current context at method entry.
+const Register PP = R5;     // Caches object pool pointer in generated code.
 const Register SPREG = SP;  // Stack pointer register.
 const Register FPREG = FP;  // Frame pointer register.
 const Register LRREG = LR;  // Link register.
@@ -307,13 +307,12 @@
     (1 << R0) | (1 << R1) | (1 << R2) | (1 << R3);
 #if defined(TARGET_ABI_IOS)
 const RegList kAbiPreservedCpuRegs =
-    (1 << R4)  | (1 << R5) | (1 << R6) | (1 << R8) |
-    (1 << R10) | (1 << R11);
+    (1 << R4) | (1 << R5) | (1 << R6) | (1 << R8) | (1 << R10) | (1 << R11);
 const int kAbiPreservedCpuRegCount = 6;
 #elif defined(TARGET_ABI_EABI)
-const RegList kAbiPreservedCpuRegs =
-    (1 << R4) | (1 << R5) | (1 << R6) | (1 << R7) |
-    (1 << R8) | (1 << R9) | (1 << R10);
+const RegList kAbiPreservedCpuRegs = (1 << R4) | (1 << R5) | (1 << R6) |
+                                     (1 << R7) | (1 << R8) | (1 << R9) |
+                                     (1 << R10);
 const int kAbiPreservedCpuRegCount = 7;
 #else
 #error Unknown ABI
@@ -322,13 +321,8 @@
 const QRegister kAbiLastPreservedFpuReg = Q7;
 const int kAbiPreservedFpuRegCount = 4;
 
-const RegList kReservedCpuRegisters =
-    (1 << SPREG) |
-    (1 << FPREG) |
-    (1 << TMP)   |
-    (1 << PP)    |
-    (1 << THR)   |
-    (1 << PC);
+const RegList kReservedCpuRegisters = (1 << SPREG) | (1 << FPREG) | (1 << TMP) |
+                                      (1 << PP) | (1 << THR) | (1 << PC);
 // CPU registers available to Dart allocator.
 const RegList kDartAvailableCpuRegs =
     kAllCpuRegistersList & ~kReservedCpuRegisters;
@@ -348,21 +342,21 @@
 // Values for the condition field as defined in section A3.2.
 enum Condition {
   kNoCondition = -1,
-  EQ =  0,  // equal
-  NE =  1,  // not equal
-  CS =  2,  // carry set/unsigned higher or same
-  CC =  3,  // carry clear/unsigned lower
-  MI =  4,  // minus/negative
-  PL =  5,  // plus/positive or zero
-  VS =  6,  // overflow
-  VC =  7,  // no overflow
-  HI =  8,  // unsigned higher
-  LS =  9,  // unsigned lower or same
-  GE = 10,  // signed greater than or equal
-  LT = 11,  // signed less than
-  GT = 12,  // signed greater than
-  LE = 13,  // signed less than or equal
-  AL = 14,  // always (unconditional)
+  EQ = 0,                  // equal
+  NE = 1,                  // not equal
+  CS = 2,                  // carry set/unsigned higher or same
+  CC = 3,                  // carry clear/unsigned lower
+  MI = 4,                  // minus/negative
+  PL = 5,                  // plus/positive or zero
+  VS = 6,                  // overflow
+  VC = 7,                  // no overflow
+  HI = 8,                  // unsigned higher
+  LS = 9,                  // unsigned lower or same
+  GE = 10,                 // signed greater than or equal
+  LT = 11,                 // signed less than
+  GT = 12,                 // signed greater than
+  LE = 13,                 // signed less than or equal
+  AL = 14,                 // always (unconditional)
   kSpecialCondition = 15,  // special condition (refer to section A3.2.1)
   kMaxCondition = 16,
 };
@@ -372,16 +366,16 @@
 // as defined in section A3.4
 enum Opcode {
   kNoOperand = -1,
-  AND =  0,  // Logical AND
-  EOR =  1,  // Logical Exclusive OR
-  SUB =  2,  // Subtract
-  RSB =  3,  // Reverse Subtract
-  ADD =  4,  // Add
-  ADC =  5,  // Add with Carry
-  SBC =  6,  // Subtract with Carry
-  RSC =  7,  // Reverse Subtract with Carry
-  TST =  8,  // Test
-  TEQ =  9,  // Test Equivalence
+  AND = 0,   // Logical AND
+  EOR = 1,   // Logical Exclusive OR
+  SUB = 2,   // Subtract
+  RSB = 3,   // Reverse Subtract
+  ADD = 4,   // Add
+  ADC = 5,   // Add with Carry
+  SBC = 6,   // Subtract with Carry
+  RSC = 7,   // Reverse Subtract with Carry
+  TST = 8,   // Test
+  TEQ = 9,   // Test Equivalence
   CMP = 10,  // Compare
   CMN = 11,  // Compare Negated
   ORR = 12,  // Logical (inclusive) OR
@@ -495,17 +489,13 @@
 //
 class Instr {
  public:
-  enum {
-    kInstrSize = 4,
-    kInstrSizeLog2 = 2,
-    kPCReadOffset = 8
-  };
+  enum { kInstrSize = 4, kInstrSizeLog2 = 2, kPCReadOffset = 8 };
 
   static const int32_t kNopInstruction =  // nop
       ((AL << kConditionShift) | (0x32 << 20) | (0xf << 12));
 
-  static const int32_t kBreakPointCode = 0xdeb0;  // For breakpoint.
-  static const int32_t kStopMessageCode = 0xdeb1;  // For Stop(message).
+  static const int32_t kBreakPointCode = 0xdeb0;      // For breakpoint.
+  static const int32_t kStopMessageCode = 0xdeb1;     // For Stop(message).
   static const int32_t kSimulatorBreakCode = 0xdeb2;  // For breakpoint in sim.
   static const int32_t kSimulatorRedirectCode = 0xca11;  // For redirection.
 
@@ -535,9 +525,7 @@
   }
 
   // Read one particular bit out of the instruction bits.
-  inline int Bit(int nr) const {
-    return (InstructionBits() >> nr) & 1;
-  }
+  inline int Bit(int nr) const { return (InstructionBits() >> nr) & 1; }
 
   // Read a bit field out of the instruction bits.
   inline int Bits(int shift, int count) const {
@@ -553,10 +541,12 @@
   }
   inline int TypeField() const { return Bits(kTypeShift, kTypeBits); }
 
-  inline Register RnField() const { return static_cast<Register>(
-                                        Bits(kRnShift, kRnBits)); }
-  inline Register RdField() const { return static_cast<Register>(
-                                        Bits(kRdShift, kRdBits)); }
+  inline Register RnField() const {
+    return static_cast<Register>(Bits(kRnShift, kRnBits));
+  }
+  inline Register RdField() const {
+    return static_cast<Register>(Bits(kRdShift, kRdBits));
+  }
 
   // Fields used in Data processing instructions
   inline Opcode OpcodeField() const {
@@ -567,27 +557,30 @@
   inline Register RmField() const {
     return static_cast<Register>(Bits(kRmShift, kRmBits));
   }
-  inline Shift ShiftField() const { return static_cast<Shift>(
-                                        Bits(kShiftShift, kShiftBits)); }
+  inline Shift ShiftField() const {
+    return static_cast<Shift>(Bits(kShiftShift, kShiftBits));
+  }
   inline int RegShiftField() const { return Bit(4); }
   inline Register RsField() const {
     return static_cast<Register>(Bits(kRsShift, kRsBits));
   }
-  inline int ShiftAmountField() const { return Bits(kShiftImmShift,
-                                                    kShiftImmBits); }
+  inline int ShiftAmountField() const {
+    return Bits(kShiftImmShift, kShiftImmBits);
+  }
   // with immediate
   inline int RotateField() const { return Bits(kRotateShift, kRotateBits); }
   inline int Immed8Field() const { return Bits(kImmed8Shift, kImmed8Bits); }
 
   // Fields used in Load/Store instructions
   inline int PUField() const { return Bits(23, 2); }
-  inline int  BField() const { return Bit(22); }
-  inline int  WField() const { return Bit(21); }
-  inline int  LField() const { return Bit(20); }
+  inline int BField() const { return Bit(22); }
+  inline int WField() const { return Bit(21); }
+  inline int LField() const { return Bit(20); }
   // with register uses same fields as Data processing instructions above
   // with immediate
-  inline int Offset12Field() const { return Bits(kOffset12Shift,
-                                                 kOffset12Bits); }
+  inline int Offset12Field() const {
+    return Bits(kOffset12Shift, kOffset12Bits);
+  }
   // multiple
   inline int RlistField() const { return Bits(0, 16); }
   // extra loads and stores
@@ -622,8 +615,8 @@
 
   // Field used in VFP double immediate move instruction
   inline double ImmDoubleField() const {
-    uint64_t imm64 = (Bit(19)*(1LL << 63)) | (((1LL << 8) - Bit(18)) << 54) |
-                     (Bits(16, 2)*(1LL << 52)) | (Bits(0, 4)*(1LL << 48));
+    uint64_t imm64 = (Bit(19) * (1LL << 63)) | (((1LL << 8) - Bit(18)) << 54) |
+                     (Bits(16, 2) * (1LL << 52)) | (Bits(0, 4) * (1LL << 48));
     return bit_cast<double, uint64_t>(imm64);
   }
 
@@ -644,9 +637,9 @@
     ASSERT(ConditionField() != kSpecialCondition);
     ASSERT(Bits(26, 2) == 0);  // Type 0 or 1.
     return ((Bits(20, 5) & 0x19) != 0x10) &&
-      ((Bit(25) == 1) ||  // Data processing immediate.
-       (Bit(4) == 0) ||  // Data processing register.
-       (Bit(7) == 0));  // Data processing register-shifted register.
+           ((Bit(25) == 1) ||  // Data processing immediate.
+            (Bit(4) == 0) ||   // Data processing register.
+            (Bit(7) == 0));    // Data processing register-shifted register.
   }
 
   // Tests for special encodings of type 0 instructions (extra loads and stores,
@@ -706,8 +699,8 @@
   inline bool IsDivision() const {
     ASSERT(ConditionField() != kSpecialCondition);
     ASSERT(TypeField() == 3);
-    return ((Bit(4) == 1) && (Bits(5, 3) == 0) &&
-            (Bit(20) == 1) && (Bits(22, 3) == 4));
+    return ((Bit(4) == 1) && (Bits(5, 3) == 0) && (Bit(20) == 1) &&
+            (Bits(22, 3) == 4));
   }
 
   // Test for VFP data processing or single transfer instructions of type 7.
@@ -753,12 +746,12 @@
   }
 
   // Special accessors that test for existence of a value.
-  inline bool HasS()    const { return SField() == 1; }
-  inline bool HasB()    const { return BField() == 1; }
-  inline bool HasW()    const { return WField() == 1; }
-  inline bool HasL()    const { return LField() == 1; }
+  inline bool HasS() const { return SField() == 1; }
+  inline bool HasB() const { return BField() == 1; }
+  inline bool HasW() const { return WField() == 1; }
+  inline bool HasL() const { return LField() == 1; }
   inline bool HasSign() const { return SignField() == 1; }
-  inline bool HasH()    const { return HField() == 1; }
+  inline bool HasH() const { return HField() == 1; }
   inline bool HasLink() const { return LinkField() == 1; }
 
   // Instructions are read out of a code stream. The only way to get a
diff --git a/runtime/vm/constants_arm64.h b/runtime/vm/constants_arm64.h
index c2d6981..542fd52 100644
--- a/runtime/vm/constants_arm64.h
+++ b/runtime/vm/constants_arm64.h
@@ -10,16 +10,16 @@
 namespace dart {
 
 enum Register {
-  R0  =  0,
-  R1  =  1,
-  R2  =  2,
-  R3  =  3,
-  R4  =  4,
-  R5  =  5,
-  R6  =  6,
-  R7  =  7,
-  R8  =  8,
-  R9  =  9,
+  R0 = 0,
+  R1 = 1,
+  R2 = 2,
+  R3 = 3,
+  R4 = 4,
+  R5 = 5,
+  R6 = 6,
+  R7 = 7,
+  R8 = 8,
+  R9 = 9,
   R10 = 10,
   R11 = 11,
   R12 = 12,
@@ -60,16 +60,16 @@
 
 
 enum VRegister {
-  V0  =  0,
-  V1  =  1,
-  V2  =  2,
-  V3  =  3,
-  V4  =  4,
-  V5  =  5,
-  V6  =  6,
-  V7  =  7,
-  V8  =  8,
-  V9  =  9,
+  V0 = 0,
+  V1 = 1,
+  V2 = 2,
+  V3 = 3,
+  V4 = 4,
+  V5 = 5,
+  V6 = 6,
+  V7 = 7,
+  V8 = 8,
+  V9 = 9,
   V10 = 10,
   V11 = 11,
   V12 = 12,
@@ -109,14 +109,14 @@
 const Register TMP = R16;  // Used as scratch register by assembler.
 const Register TMP2 = R17;
 const Register CTX = R28;  // Location of current context at method entry.
-const Register PP = R27;  // Caches object pool pointer in generated code.
+const Register PP = R27;   // Caches object pool pointer in generated code.
 const Register CODE_REG = R24;
-const Register FPREG = FP;  // Frame pointer register.
-const Register SPREG = R15;  // Stack pointer register.
-const Register LRREG = LR;  // Link register.
-const Register ICREG = R5;  // IC data register.
+const Register FPREG = FP;          // Frame pointer register.
+const Register SPREG = R15;         // Stack pointer register.
+const Register LRREG = LR;          // Link register.
+const Register ICREG = R5;          // IC data register.
 const Register ARGS_DESC_REG = R4;  // Arguments descriptor register.
-const Register THR = R26;  // Caches current thread in generated code.
+const Register THR = R26;           // Caches current thread in generated code.
 const Register CALLEE_SAVED_TEMP = R19;
 const Register CALLEE_SAVED_TEMP2 = R20;
 
@@ -140,13 +140,12 @@
 
 
 // C++ ABI call registers.
-const RegList kAbiArgumentCpuRegs =
-    (1 << R0) | (1 << R1) | (1 << R2) | (1 << R3) |
-    (1 << R4) | (1 << R5) | (1 << R6) | (1 << R7);
+const RegList kAbiArgumentCpuRegs = (1 << R0) | (1 << R1) | (1 << R2) |
+                                    (1 << R3) | (1 << R4) | (1 << R5) |
+                                    (1 << R6) | (1 << R7);
 const RegList kAbiPreservedCpuRegs =
-    (1 << R19) | (1 << R20) | (1 << R21) | (1 << R22) |
-    (1 << R23) | (1 << R24) | (1 << R25) | (1 << R26) |
-    (1 << R27) | (1 << R28);
+    (1 << R19) | (1 << R20) | (1 << R21) | (1 << R22) | (1 << R23) |
+    (1 << R24) | (1 << R25) | (1 << R26) | (1 << R27) | (1 << R28);
 const Register kAbiFirstPreservedCpuReg = R19;
 const Register kAbiLastPreservedCpuReg = R28;
 const int kAbiPreservedCpuRegCount = 10;
@@ -156,16 +155,10 @@
 
 const intptr_t kReservedCpuRegisters =
     (1 << SPREG) |  // Dart SP
-    (1 << FPREG) |
-    (1 << TMP)   |
-    (1 << TMP2)  |
-    (1 << PP)    |
-    (1 << THR)   |
-    (1 << LR)    |
-    (1 << R31)   |  // C++ SP
-    (1 << CTX)   |
-    (1 << R18);     // iOS platform register.
-                    // TODO(rmacnak): Only reserve on Mac & iOS.
+    (1 << FPREG) | (1 << TMP) | (1 << TMP2) | (1 << PP) | (1 << THR) |
+    (1 << LR) | (1 << R31) |  // C++ SP
+    (1 << CTX) | (1 << R18);  // iOS platform register.
+                              // TODO(rmacnak): Only reserve on Mac & iOS.
 // CPU registers available to Dart allocator.
 const RegList kDartAvailableCpuRegs =
     kAllCpuRegistersList & ~kReservedCpuRegisters;
@@ -184,16 +177,16 @@
 // Values for the condition field as defined in section A3.2.
 enum Condition {
   kNoCondition = -1,
-  EQ =  0,  // equal
-  NE =  1,  // not equal
-  CS =  2,  // carry set/unsigned higher or same
-  CC =  3,  // carry clear/unsigned lower
-  MI =  4,  // minus/negative
-  PL =  5,  // plus/positive or zero
-  VS =  6,  // overflow
-  VC =  7,  // no overflow
-  HI =  8,  // unsigned higher
-  LS =  9,  // unsigned lower or same
+  EQ = 0,   // equal
+  NE = 1,   // not equal
+  CS = 2,   // carry set/unsigned higher or same
+  CC = 3,   // carry clear/unsigned lower
+  MI = 4,   // minus/negative
+  PL = 5,   // plus/positive or zero
+  VS = 6,   // overflow
+  VC = 7,   // no overflow
+  HI = 8,   // unsigned higher
+  LS = 9,   // unsigned lower or same
   GE = 10,  // signed greater than or equal
   LT = 11,  // signed less than
   GT = 12,  // signed greater than
@@ -209,14 +202,38 @@
 }
 
 enum Bits {
-  B0  =  (1 << 0), B1  =  (1 << 1), B2  =  (1 << 2), B3  =  (1 << 3),
-  B4  =  (1 << 4), B5  =  (1 << 5), B6  =  (1 << 6), B7  =  (1 << 7),
-  B8  =  (1 << 8), B9  =  (1 << 9), B10 = (1 << 10), B11 = (1 << 11),
-  B12 = (1 << 12), B13 = (1 << 13), B14 = (1 << 14), B15 = (1 << 15),
-  B16 = (1 << 16), B17 = (1 << 17), B18 = (1 << 18), B19 = (1 << 19),
-  B20 = (1 << 20), B21 = (1 << 21), B22 = (1 << 22), B23 = (1 << 23),
-  B24 = (1 << 24), B25 = (1 << 25), B26 = (1 << 26), B27 = (1 << 27),
-  B28 = (1 << 28), B29 = (1 << 29), B30 = (1 << 30), B31 = (1 << 31),
+  B0 = (1 << 0),
+  B1 = (1 << 1),
+  B2 = (1 << 2),
+  B3 = (1 << 3),
+  B4 = (1 << 4),
+  B5 = (1 << 5),
+  B6 = (1 << 6),
+  B7 = (1 << 7),
+  B8 = (1 << 8),
+  B9 = (1 << 9),
+  B10 = (1 << 10),
+  B11 = (1 << 11),
+  B12 = (1 << 12),
+  B13 = (1 << 13),
+  B14 = (1 << 14),
+  B15 = (1 << 15),
+  B16 = (1 << 16),
+  B17 = (1 << 17),
+  B18 = (1 << 18),
+  B19 = (1 << 19),
+  B20 = (1 << 20),
+  B21 = (1 << 21),
+  B22 = (1 << 22),
+  B23 = (1 << 23),
+  B24 = (1 << 24),
+  B25 = (1 << 25),
+  B26 = (1 << 26),
+  B27 = (1 << 27),
+  B28 = (1 << 28),
+  B29 = (1 << 29),
+  B30 = (1 << 30),
+  B31 = (1 << 31),
 };
 
 enum OperandSize {
@@ -331,8 +348,11 @@
   SystemMask = 0xffc00000,
   SystemFixed = CompareBranchFixed | B31 | B30 | B24,
   HINT = SystemFixed | B17 | B16 | B13 | B4 | B3 | B2 | B1 | B0,
-  CLREX = SystemFixed | B17 | B16 | B13 | B12 | B11 | B10 | B9 | B8 |
-      B6 | B4 | B3 | B2 | B1 | B0,
+  CLREX = SystemFixed | B17 | B16 | B13 | B12 | B11 | B10 | B9 | B8 | B6 | B4 |
+          B3 |
+          B2 |
+          B1 |
+          B0,
 };
 
 // C3.2.5
@@ -554,8 +574,8 @@
   VABSD = SIMDTwoRegFixed | B30 | B23 | B22 | B15 | B14 | B13 | B12,
   VNEGD = SIMDTwoRegFixed | B30 | B29 | B23 | B22 | B15 | B14 | B13 | B12,
   VSQRTS = SIMDTwoRegFixed | B30 | B29 | B23 | B16 | B15 | B14 | B13 | B12,
-  VSQRTD = SIMDTwoRegFixed | B30 | B29 | B23 | B22
-                           | B16 | B15 | B14 | B13 | B12,
+  VSQRTD =
+      SIMDTwoRegFixed | B30 | B29 | B23 | B22 | B16 | B15 | B14 | B13 | B12,
   VRECPES = SIMDTwoRegFixed | B30 | B23 | B16 | B15 | B14 | B12,
   VRSQRTES = SIMDTwoRegFixed | B30 | B29 | B23 | B16 | B15 | B14 | B12,
 };
@@ -605,48 +625,48 @@
   FMOVRD = FPIntCvtFixed | B22 | B18 | B17,
   FMOVDR = FPIntCvtFixed | B22 | B18 | B17 | B16,
   FCVTZDS = FPIntCvtFixed | B22 | B20 | B19,
-  SCVTFD = FPIntCvtFixed |  B22 | B17,
+  SCVTFD = FPIntCvtFixed | B22 | B17,
 };
 
 
 #define APPLY_OP_LIST(_V)                                                      \
-_V(DPImmediate)                                                                \
-_V(CompareBranch)                                                              \
-_V(LoadStore)                                                                  \
-_V(DPRegister)                                                                 \
-_V(DPSimd1)                                                                    \
-_V(DPSimd2)                                                                    \
-_V(FP)                                                                         \
-_V(CompareAndBranch)                                                           \
-_V(ConditionalBranch)                                                          \
-_V(ExceptionGen)                                                               \
-_V(System)                                                                     \
-_V(TestAndBranch)                                                              \
-_V(UnconditionalBranch)                                                        \
-_V(UnconditionalBranchReg)                                                     \
-_V(LoadStoreReg)                                                               \
-_V(LoadStoreRegPair)                                                           \
-_V(LoadRegLiteral)                                                             \
-_V(LoadStoreExclusive)                                                         \
-_V(AddSubImm)                                                                  \
-_V(LogicalImm)                                                                 \
-_V(MoveWide)                                                                   \
-_V(PCRel)                                                                      \
-_V(AddSubShiftExt)                                                             \
-_V(AddSubWithCarry)                                                            \
-_V(ConditionalSelect)                                                          \
-_V(MiscDP1Source)                                                              \
-_V(MiscDP2Source)                                                              \
-_V(MiscDP3Source)                                                              \
-_V(LogicalShift)                                                               \
-_V(SIMDCopy)                                                                   \
-_V(SIMDThreeSame)                                                              \
-_V(SIMDTwoReg)                                                                 \
-_V(FPCompare)                                                                  \
-_V(FPOneSource)                                                                \
-_V(FPTwoSource)                                                                \
-_V(FPImm)                                                                      \
-_V(FPIntCvt)                                                                   \
+  _V(DPImmediate)                                                              \
+  _V(CompareBranch)                                                            \
+  _V(LoadStore)                                                                \
+  _V(DPRegister)                                                               \
+  _V(DPSimd1)                                                                  \
+  _V(DPSimd2)                                                                  \
+  _V(FP)                                                                       \
+  _V(CompareAndBranch)                                                         \
+  _V(ConditionalBranch)                                                        \
+  _V(ExceptionGen)                                                             \
+  _V(System)                                                                   \
+  _V(TestAndBranch)                                                            \
+  _V(UnconditionalBranch)                                                      \
+  _V(UnconditionalBranchReg)                                                   \
+  _V(LoadStoreReg)                                                             \
+  _V(LoadStoreRegPair)                                                         \
+  _V(LoadRegLiteral)                                                           \
+  _V(LoadStoreExclusive)                                                       \
+  _V(AddSubImm)                                                                \
+  _V(LogicalImm)                                                               \
+  _V(MoveWide)                                                                 \
+  _V(PCRel)                                                                    \
+  _V(AddSubShiftExt)                                                           \
+  _V(AddSubWithCarry)                                                          \
+  _V(ConditionalSelect)                                                        \
+  _V(MiscDP1Source)                                                            \
+  _V(MiscDP2Source)                                                            \
+  _V(MiscDP3Source)                                                            \
+  _V(LogicalShift)                                                             \
+  _V(SIMDCopy)                                                                 \
+  _V(SIMDThreeSame)                                                            \
+  _V(SIMDTwoReg)                                                               \
+  _V(FPCompare)                                                                \
+  _V(FPOneSource)                                                              \
+  _V(FPTwoSource)                                                              \
+  _V(FPImm)                                                                    \
+  _V(FPIntCvt)
 
 
 enum Shift {
@@ -785,16 +805,18 @@
 
 
 // Helper functions for decoding logical immediates.
-static inline uint64_t RotateRight(
-    uint64_t value, uint8_t rotate, uint8_t width) {
+static inline uint64_t RotateRight(uint64_t value,
+                                   uint8_t rotate,
+                                   uint8_t width) {
   ASSERT(width <= 64);
   rotate &= 63;
   return ((value & ((1UL << rotate) - 1UL)) << (width - rotate)) |
          (value >> rotate);
 }
 
-static inline uint64_t RepeatBitsAcrossReg(
-    uint8_t reg_size, uint64_t value, uint8_t width) {
+static inline uint64_t RepeatBitsAcrossReg(uint8_t reg_size,
+                                           uint64_t value,
+                                           uint8_t width) {
   ASSERT((width == 2) || (width == 4) || (width == 8) || (width == 16) ||
          (width == 32));
   ASSERT((reg_size == kWRegSizeInBits) || (reg_size == kXRegSizeInBits));
@@ -818,17 +840,13 @@
 //
 class Instr {
  public:
-  enum {
-    kInstrSize = 4,
-    kInstrSizeLog2 = 2,
-    kPCReadOffset = 8
-  };
+  enum { kInstrSize = 4, kInstrSizeLog2 = 2, kPCReadOffset = 8 };
 
   static const int32_t kNopInstruction = HINT;  // hint #0 === nop.
 
   // Reserved brk and hlt instruction codes.
-  static const int32_t kBreakPointCode = 0xdeb0;  // For breakpoint.
-  static const int32_t kStopMessageCode = 0xdeb1;  // For Stop(message).
+  static const int32_t kBreakPointCode = 0xdeb0;      // For breakpoint.
+  static const int32_t kStopMessageCode = 0xdeb1;     // For Stop(message).
   static const int32_t kSimulatorBreakCode = 0xdeb2;  // For breakpoint in sim.
   static const int32_t kSimulatorRedirectCode = 0xca11;  // For redirection.
 
@@ -847,9 +865,7 @@
       HLT | (kSimulatorRedirectCode << kImm16Shift);
 
   // Read one particular bit out of the instruction bits.
-  inline int Bit(int nr) const {
-    return (InstructionBits() >> nr) & 1;
-  }
+  inline int Bit(int nr) const { return (InstructionBits() >> nr) & 1; }
 
   // Read a bit field out of the instruction bits.
   inline int Bits(int shift, int count) const {
@@ -866,23 +882,22 @@
     *reinterpret_cast<int32_t*>(this) = value;
   }
 
-  inline void SetMoveWideBits(
-      MoveWideOp op, Register rd, uint16_t imm, int hw, OperandSize sz) {
+  inline void SetMoveWideBits(MoveWideOp op,
+                              Register rd,
+                              uint16_t imm,
+                              int hw,
+                              OperandSize sz) {
     ASSERT((hw >= 0) && (hw <= 3));
     ASSERT((sz == kDoubleWord) || (sz == kWord));
     const int32_t size = (sz == kDoubleWord) ? B31 : 0;
-    SetInstructionBits(
-        op | size |
-        (static_cast<int32_t>(rd) << kRdShift) |
-        (static_cast<int32_t>(hw) << kHWShift) |
-        (static_cast<int32_t>(imm) << kImm16Shift));
+    SetInstructionBits(op | size | (static_cast<int32_t>(rd) << kRdShift) |
+                       (static_cast<int32_t>(hw) << kHWShift) |
+                       (static_cast<int32_t>(imm) << kImm16Shift));
   }
 
-  inline void SetUnconditionalBranchRegBits(
-      UnconditionalBranchRegOp op, Register rn) {
-    SetInstructionBits(
-        op |
-        (static_cast<int32_t>(rn) << kRnShift));
+  inline void SetUnconditionalBranchRegBits(UnconditionalBranchRegOp op,
+                                            Register rn) {
+    SetInstructionBits(op | (static_cast<int32_t>(rn) << kRnShift));
   }
 
   inline void SetImm12Bits(int32_t orig, int32_t imm12) {
@@ -894,29 +909,40 @@
   inline int SField() const { return Bit(kSShift); }
   inline int SFField() const { return Bit(kSFShift); }
   inline int SzField() const { return Bits(kSzShift, kSzBits); }
-  inline Register RdField() const { return static_cast<Register>(
-                                        Bits(kRdShift, kRdBits)); }
-  inline Register RnField() const { return static_cast<Register>(
-                                        Bits(kRnShift, kRnBits)); }
-  inline Register RaField() const { return static_cast<Register>(
-                                        Bits(kRaShift, kRaBits)); }
-  inline Register RmField() const { return static_cast<Register>(
-                                        Bits(kRmShift, kRmBits)); }
-  inline Register RtField() const { return static_cast<Register>(
-                                        Bits(kRtShift, kRtBits)); }
-  inline Register Rt2Field() const { return static_cast<Register>(
-                                        Bits(kRt2Shift, kRt2Bits)); }
-  inline Register RsField() const { return static_cast<Register>(
-                                        Bits(kRsShift, kRsBits)); }
+  inline Register RdField() const {
+    return static_cast<Register>(Bits(kRdShift, kRdBits));
+  }
+  inline Register RnField() const {
+    return static_cast<Register>(Bits(kRnShift, kRnBits));
+  }
+  inline Register RaField() const {
+    return static_cast<Register>(Bits(kRaShift, kRaBits));
+  }
+  inline Register RmField() const {
+    return static_cast<Register>(Bits(kRmShift, kRmBits));
+  }
+  inline Register RtField() const {
+    return static_cast<Register>(Bits(kRtShift, kRtBits));
+  }
+  inline Register Rt2Field() const {
+    return static_cast<Register>(Bits(kRt2Shift, kRt2Bits));
+  }
+  inline Register RsField() const {
+    return static_cast<Register>(Bits(kRsShift, kRsBits));
+  }
 
-  inline VRegister VdField() const { return static_cast<VRegister>(
-                                        Bits(kVdShift, kVdBits)); }
-  inline VRegister VnField() const { return static_cast<VRegister>(
-                                        Bits(kVnShift, kVnBits)); }
-  inline VRegister VmField() const { return static_cast<VRegister>(
-                                        Bits(kVmShift, kVmBits)); }
-  inline VRegister VtField() const { return static_cast<VRegister>(
-                                        Bits(kVtShift, kVtBits)); }
+  inline VRegister VdField() const {
+    return static_cast<VRegister>(Bits(kVdShift, kVdBits));
+  }
+  inline VRegister VnField() const {
+    return static_cast<VRegister>(Bits(kVnShift, kVnBits));
+  }
+  inline VRegister VmField() const {
+    return static_cast<VRegister>(Bits(kVmShift, kVmBits));
+  }
+  inline VRegister VtField() const {
+    return static_cast<VRegister>(Bits(kVtShift, kVtBits));
+  }
 
   // Immediates
   inline int Imm3Field() const { return Bits(kImm3Shift, kImm3Bits); }
@@ -924,16 +950,19 @@
   inline int Imm7Field() const { return Bits(kImm7Shift, kImm7Bits); }
   // Sign-extended Imm7Field()
   inline int64_t SImm7Field() const {
-      return (static_cast<int32_t>(Imm7Field()) << 25) >> 25; }
+    return (static_cast<int32_t>(Imm7Field()) << 25) >> 25;
+  }
   inline int Imm8Field() const { return Bits(kImm8Shift, kImm8Bits); }
   inline int Imm9Field() const { return Bits(kImm9Shift, kImm9Bits); }
   // Sign-extended Imm9Field()
   inline int64_t SImm9Field() const {
-      return (static_cast<int32_t>(Imm9Field()) << 23) >> 23; }
+    return (static_cast<int32_t>(Imm9Field()) << 23) >> 23;
+  }
 
   inline int Imm12Field() const { return Bits(kImm12Shift, kImm12Bits); }
   inline int Imm12ShiftField() const {
-    return Bits(kImm12ShiftShift, kImm12ShiftBits); }
+    return Bits(kImm12ShiftShift, kImm12ShiftBits);
+  }
 
   inline int Imm16Field() const { return Bits(kImm16Shift, kImm16Bits); }
   inline int HWField() const { return Bits(kHWShift, kHWBits); }
@@ -943,13 +972,16 @@
 
   inline int Imm14Field() const { return Bits(kImm14Shift, kImm14Bits); }
   inline int64_t SImm14Field() const {
-      return (static_cast<int32_t>(Imm14Field()) << 18) >> 18; }
+    return (static_cast<int32_t>(Imm14Field()) << 18) >> 18;
+  }
   inline int Imm19Field() const { return Bits(kImm19Shift, kImm19Bits); }
   inline int64_t SImm19Field() const {
-      return (static_cast<int32_t>(Imm19Field()) << 13) >> 13; }
+    return (static_cast<int32_t>(Imm19Field()) << 13) >> 13;
+  }
   inline int Imm26Field() const { return Bits(kImm26Shift, kImm26Bits); }
   inline int64_t SImm26Field() const {
-      return (static_cast<int32_t>(Imm26Field()) << 6) >> 6; }
+    return (static_cast<int32_t>(Imm26Field()) << 6) >> 6;
+  }
 
   inline Condition ConditionField() const {
     return static_cast<Condition>(Bits(kCondShift, kCondBits));
@@ -966,18 +998,21 @@
     return !IsLogicalShiftOp() && (Bit(kAddShiftExtendShift) == 1);
   }
   inline Shift ShiftTypeField() const {
-      return static_cast<Shift>(Bits(kShiftTypeShift, kShiftTypeBits)); }
+    return static_cast<Shift>(Bits(kShiftTypeShift, kShiftTypeBits));
+  }
   inline Extend ExtendTypeField() const {
-      return static_cast<Extend>(Bits(kExtendTypeShift, kExtendTypeBits)); }
+    return static_cast<Extend>(Bits(kExtendTypeShift, kExtendTypeBits));
+  }
   inline int ShiftAmountField() const { return Imm6Field(); }
   inline int ExtShiftAmountField() const { return Imm3Field(); }
 
-  // Instruction identification.
-  #define IS_OP(op)                                                            \
-    inline bool Is##op##Op() const {                                           \
-      return ((InstructionBits() & op##Mask) == (op##Fixed & op##Mask)); }
+// Instruction identification.
+#define IS_OP(op)                                                              \
+  inline bool Is##op##Op() const {                                             \
+    return ((InstructionBits() & op##Mask) == (op##Fixed & op##Mask));         \
+  }
   APPLY_OP_LIST(IS_OP)
-  #undef IS_OP
+#undef IS_OP
 
   inline bool HasS() const { return (SField() == 1); }
 
@@ -1016,8 +1051,7 @@
     //  Add/sub (immediate).
     //  Add/sub (extended).
     // Otherwise, r31 is ZR.
-    if (IsLoadStoreOp() ||
-        IsAddSubImmOp() ||
+    if (IsLoadStoreOp() || IsAddSubImmOp() ||
         (IsAddSubShiftExtOp() && IsExtend())) {
       return R31IsSP;
     }
@@ -1028,8 +1062,7 @@
   // indicate a failure case. Specifically, where the constraints on imm_s are
   // not met.
   uint64_t ImmLogical() {
-    const uint8_t reg_size =
-        SFField() == 1 ? kXRegSizeInBits : kWRegSizeInBits;
+    const uint8_t reg_size = SFField() == 1 ? kXRegSizeInBits : kWRegSizeInBits;
     const int64_t n = NField();
     const int64_t imm_s = ImmSField();
     const int64_t imm_r = ImmRField();
@@ -1067,9 +1100,8 @@
             return 0;
           }
           uint64_t bits = (1UL << ((imm_s & mask) + 1)) - 1;
-          return RepeatBitsAcrossReg(reg_size,
-                                     RotateRight(bits, imm_r & mask, width),
-                                     width);
+          return RepeatBitsAcrossReg(
+              reg_size, RotateRight(bits, imm_r & mask, width), width);
         }
       }
     }
@@ -1078,16 +1110,11 @@
   }
 
   static int64_t VFPExpandImm(uint8_t imm8) {
-    const int64_t sign =
-        static_cast<int64_t>((imm8 & 0x80) >> 7) << 63;
-    const int64_t hi_exp =
-        static_cast<int64_t>(!((imm8 & 0x40) >> 6)) << 62;
-    const int64_t mid_exp =
-        (((imm8 & 0x40) >> 6) == 0) ? 0 : (0xffLL << 54);
-    const int64_t low_exp =
-        static_cast<int64_t>((imm8 & 0x30) >> 4) << 52;
-    const int64_t frac =
-        static_cast<int64_t>(imm8 & 0x0f) << 48;
+    const int64_t sign = static_cast<int64_t>((imm8 & 0x80) >> 7) << 63;
+    const int64_t hi_exp = static_cast<int64_t>(!((imm8 & 0x40) >> 6)) << 62;
+    const int64_t mid_exp = (((imm8 & 0x40) >> 6) == 0) ? 0 : (0xffLL << 54);
+    const int64_t low_exp = static_cast<int64_t>((imm8 & 0x30) >> 4) << 52;
+    const int64_t frac = static_cast<int64_t>(imm8 & 0x0f) << 48;
     return sign | hi_exp | mid_exp | low_exp | frac;
   }
 
diff --git a/runtime/vm/constants_dbc.h b/runtime/vm/constants_dbc.h
index 1c0d1be..cf14318 100644
--- a/runtime/vm/constants_dbc.h
+++ b/runtime/vm/constants_dbc.h
@@ -12,6 +12,7 @@
 
 namespace dart {
 
+// clang-format off
 // List of Dart Bytecode instructions.
 //
 // INTERPRETER STATE
@@ -822,7 +823,9 @@
   V(CheckStack,                      0, ___, ___, ___) \
   V(DebugStep,                       0, ___, ___, ___) \
   V(DebugBreak,                      A, num, ___, ___) \
-  V(Deopt,                         A_D, num, num, ___) \
+  V(Deopt,                         A_D, num, num, ___)
+
+// clang-format on
 
 typedef uint32_t Instr;
 
@@ -830,7 +833,7 @@
  public:
   enum Opcode {
 #define DECLARE_BYTECODE(name, encoding, op1, op2, op3) k##name,
-BYTECODES_LIST(DECLARE_BYTECODE)
+    BYTECODES_LIST(DECLARE_BYTECODE)
 #undef DECLARE_BYTECODE
   };
 
@@ -868,9 +871,7 @@
     return op | (x << kAShift);
   }
 
-  static Instr Encode(Opcode op) {
-    return op;
-  }
+  static Instr Encode(Opcode op) { return op; }
 
   DART_FORCE_INLINE static uint8_t DecodeA(Instr bc) {
     return (bc >> kAShift) & kAMask;
diff --git a/runtime/vm/constants_ia32.h b/runtime/vm/constants_ia32.h
index 5d61a9a..ca449d8 100644
--- a/runtime/vm/constants_ia32.h
+++ b/runtime/vm/constants_ia32.h
@@ -58,16 +58,16 @@
 
 
 // Register aliases.
-const Register TMP = kNoRegister;  // No scratch register used by assembler.
+const Register TMP = kNoRegister;   // No scratch register used by assembler.
 const Register TMP2 = kNoRegister;  // No second assembler scratch register.
 const Register CTX = EDI;  // Location of current context at method entry.
 const Register CODE_REG = EDI;
-const Register PP = kNoRegister;  // No object pool pointer.
-const Register SPREG = ESP;  // Stack pointer register.
-const Register FPREG = EBP;  // Frame pointer register.
-const Register ICREG = ECX;  // IC data register.
+const Register PP = kNoRegister;     // No object pool pointer.
+const Register SPREG = ESP;          // Stack pointer register.
+const Register FPREG = EBP;          // Frame pointer register.
+const Register ICREG = ECX;          // IC data register.
 const Register ARGS_DESC_REG = EDX;  // Arguments descriptor register.
-const Register THR = ESI;  // Caches current thread in generated code.
+const Register THR = ESI;            // Caches current thread in generated code.
 const Register CALLEE_SAVED_TEMP = EBX;
 const Register CALLEE_SAVED_TEMP2 = EDI;
 
@@ -83,10 +83,7 @@
 typedef uint32_t RegList;
 const RegList kAllCpuRegistersList = 0xFF;
 
-const intptr_t kReservedCpuRegisters =
-    (1 << SPREG) |
-    (1 << FPREG) |
-    (1 << THR);
+const intptr_t kReservedCpuRegisters = (1 << SPREG) | (1 << FPREG) | (1 << THR);
 // CPU registers available to Dart allocator.
 const RegList kDartAvailableCpuRegs =
     kAllCpuRegistersList & ~kReservedCpuRegisters;
@@ -103,29 +100,29 @@
 
 
 enum Condition {
-  OVERFLOW      =  0,
-  NO_OVERFLOW   =  1,
-  BELOW         =  2,
-  ABOVE_EQUAL   =  3,
-  EQUAL         =  4,
-  NOT_EQUAL     =  5,
-  BELOW_EQUAL   =  6,
-  ABOVE         =  7,
-  SIGN          =  8,
-  NOT_SIGN      =  9,
-  PARITY_EVEN   = 10,
-  PARITY_ODD    = 11,
-  LESS          = 12,
+  OVERFLOW = 0,
+  NO_OVERFLOW = 1,
+  BELOW = 2,
+  ABOVE_EQUAL = 3,
+  EQUAL = 4,
+  NOT_EQUAL = 5,
+  BELOW_EQUAL = 6,
+  ABOVE = 7,
+  SIGN = 8,
+  NOT_SIGN = 9,
+  PARITY_EVEN = 10,
+  PARITY_ODD = 11,
+  LESS = 12,
   GREATER_EQUAL = 13,
-  LESS_EQUAL    = 14,
-  GREATER       = 15,
+  LESS_EQUAL = 14,
+  GREATER = 15,
 
-  ZERO          = EQUAL,
-  NOT_ZERO      = NOT_EQUAL,
-  NEGATIVE      = SIGN,
-  POSITIVE      = NOT_SIGN,
-  CARRY         = BELOW,
-  NOT_CARRY     = ABOVE_EQUAL
+  ZERO = EQUAL,
+  NOT_ZERO = NOT_EQUAL,
+  NEGATIVE = SIGN,
+  POSITIVE = NOT_SIGN,
+  CARRY = BELOW,
+  NOT_CARRY = ABOVE_EQUAL
 };
 
 
diff --git a/runtime/vm/constants_mips.h b/runtime/vm/constants_mips.h
index 7f53e40..355681d 100644
--- a/runtime/vm/constants_mips.h
+++ b/runtime/vm/constants_mips.h
@@ -10,16 +10,16 @@
 namespace dart {
 
 enum Register {
-  R0  =  0,
-  R1  =  1,  // AT aka TMP
-  R2  =  2,
-  R3  =  3,
-  R4  =  4,
-  R5  =  5,
-  R6  =  6,
-  R7  =  7,
-  R8  =  8,
-  R9  =  9,
+  R0 = 0,
+  R1 = 1,  // AT aka TMP
+  R2 = 2,
+  R3 = 3,
+  R4 = 4,
+  R5 = 5,
+  R6 = 6,
+  R7 = 7,
+  R8 = 8,
+  R9 = 9,
   R10 = 10,
   R11 = 11,
   R12 = 12,
@@ -93,16 +93,16 @@
 // Values for floating point registers.
 // Double-precision values use register pairs.
 enum FRegister {
-  F0  =  0,
-  F1  =  1,
-  F2  =  2,
-  F3  =  3,
-  F4  =  4,
-  F5  =  5,
-  F6  =  6,
-  F7  =  7,
-  F8  =  8,
-  F9  =  9,
+  F0 = 0,
+  F1 = 1,
+  F2 = 2,
+  F3 = 3,
+  F4 = 4,
+  F5 = 5,
+  F6 = 6,
+  F7 = 7,
+  F8 = 8,
+  F9 = 9,
   F10 = 10,
   F11 = 11,
   F12 = 12,
@@ -135,16 +135,16 @@
 // convert to the single precision registers when needed in the mips-specific
 // code.
 enum DRegister {
-  D0  =  0,  // Function return value 1.
-  D1  =  1,  // Function return value 2.
-  D2  =  2,  // Not preserved.
-  D3  =  3,  // Not preserved.
-  D4  =  4,  // Not preserved.
-  D5  =  5,  // Not preserved.
-  D6  =  6,  // Argument 1.
-  D7  =  7,  // Argument 2.
-  D8  =  8,  // Not preserved.
-  D9  =  9,  // Not preserved.
+  D0 = 0,    // Function return value 1.
+  D1 = 1,    // Function return value 2.
+  D2 = 2,    // Not preserved.
+  D3 = 3,    // Not preserved.
+  D4 = 4,    // Not preserved.
+  D5 = 5,    // Not preserved.
+  D6 = 6,    // Argument 1.
+  D7 = 7,    // Argument 2.
+  D8 = 8,    // Not preserved.
+  D9 = 9,    // Not preserved.
   D10 = 10,  // Preserved.
   D11 = 11,  // Preserved.
   D12 = 12,  // Preserved.
@@ -175,11 +175,11 @@
 
 
 // Register aliases.
-const Register TMP = AT;  // Used as scratch register by assembler.
+const Register TMP = AT;            // Used as scratch register by assembler.
 const Register TMP2 = kNoRegister;  // No second assembler scratch register.
 const Register CTX = S6;  // Location of current context at method entry.
 const Register CODE_REG = S6;
-const Register PP = S7;  // Caches object pool pointer in generated code.
+const Register PP = S7;     // Caches object pool pointer in generated code.
 const Register SPREG = SP;  // Stack pointer register.
 const Register FPREG = FP;  // Frame pointer register.
 const Register LRREG = RA;  // Link register.
@@ -209,9 +209,9 @@
 
 const RegList kAbiArgumentCpuRegs =
     (1 << A0) | (1 << A1) | (1 << A2) | (1 << A3);
-const RegList kAbiPreservedCpuRegs =
-    (1 << S0) | (1 << S1) | (1 << S2) | (1 << S3) |
-    (1 << S4) | (1 << S5) | (1 << S6) | (1 << S7);
+const RegList kAbiPreservedCpuRegs = (1 << S0) | (1 << S1) | (1 << S2) |
+                                     (1 << S3) | (1 << S4) | (1 << S5) |
+                                     (1 << S6) | (1 << S7);
 const int kAbiPreservedCpuRegCount = 8;
 
 // FPU registers 20 - 31 are preserved across calls.
@@ -221,19 +221,9 @@
 const int kAbiPreservedFpuRegCount = 12;
 
 const RegList kReservedCpuRegisters =
-    (1 << SPREG)   |
-    (1 << FPREG)   |
-    (1 << TMP)     |
-    (1 << PP)      |
-    (1 << THR)     |
-    (1 << CTX)     |
-    (1 << ZR)      |
-    (1 << CMPRES1) |
-    (1 << CMPRES2) |
-    (1 << K0)      |
-    (1 << K1)      |
-    (1 << GP)      |
-    (1 << RA);
+    (1 << SPREG) | (1 << FPREG) | (1 << TMP) | (1 << PP) | (1 << THR) |
+    (1 << CTX) | (1 << ZR) | (1 << CMPRES1) | (1 << CMPRES2) | (1 << K0) |
+    (1 << K1) | (1 << GP) | (1 << RA);
 // CPU registers available to Dart allocator.
 const RegList kDartAvailableCpuRegs =
     kAllCpuRegistersList & ~kReservedCpuRegisters;
@@ -254,14 +244,14 @@
 // code, type Condition (see assembler_mips.h) represents a pair of operands and
 // a relation operator between them.
 enum RelationOperator {
-  AL,  // always
-  NV,  // never
-  EQ,  // equal
-  NE,  // not equal
-  GT,  // greater than
-  GE,  // greater equal
-  LT,  // less than
-  LE,  // less equal
+  AL,   // always
+  NV,   // never
+  EQ,   // equal
+  NE,   // not equal
+  GT,   // greater than
+  GE,   // greater equal
+  LT,   // less than
+  LE,   // less equal
   UGT,  // unsigned greater than
   UGE,  // unsigned greater equal
   ULT,  // unsigned less than
@@ -479,8 +469,8 @@
   static const int32_t kNopInstruction = 0;
 
   // Reserved break instruction codes.
-  static const int32_t kBreakPointCode = 0xdeb0;  // For breakpoint.
-  static const int32_t kStopMessageCode = 0xdeb1;  // For Stop(message).
+  static const int32_t kBreakPointCode = 0xdeb0;      // For breakpoint.
+  static const int32_t kStopMessageCode = 0xdeb1;     // For Stop(message).
   static const int32_t kSimulatorBreakCode = 0xdeb2;  // For breakpoint in sim.
   static const int32_t kSimulatorRedirectCode = 0xca11;  // For redirection.
 
@@ -511,29 +501,24 @@
     *reinterpret_cast<int32_t*>(this) = value;
   }
 
-  inline void SetImmInstrBits(Opcode op, Register rs, Register rt,
+  inline void SetImmInstrBits(Opcode op,
+                              Register rs,
+                              Register rt,
                               uint16_t imm) {
-    SetInstructionBits(
-        op << kOpcodeShift |
-        rs << kRsShift |
-        rt << kRtShift |
-        imm << kImmShift);
+    SetInstructionBits(op << kOpcodeShift | rs << kRsShift | rt << kRtShift |
+                       imm << kImmShift);
   }
 
   inline void SetSpecialInstrBits(SpecialFunction f,
-                                  Register rs, Register rt, Register rd) {
-    SetInstructionBits(
-        SPECIAL << kOpcodeShift |
-        f << kFunctionShift |
-        rs << kRsShift |
-        rt << kRtShift |
-        rd << kRdShift);
+                                  Register rs,
+                                  Register rt,
+                                  Register rd) {
+    SetInstructionBits(SPECIAL << kOpcodeShift | f << kFunctionShift |
+                       rs << kRsShift | rt << kRtShift | rd << kRdShift);
   }
 
   // Read one particular bit out of the instruction bits.
-  inline int32_t Bit(int nr) const {
-    return (InstructionBits() >> nr) & 1;
-  }
+  inline int32_t Bit(int nr) const { return (InstructionBits() >> nr) & 1; }
 
   // Read a bit field out of the instruction bits.
   inline int32_t Bits(int shift, int count) const {
@@ -575,13 +560,9 @@
     return static_cast<FRegister>(Bits(kFdShift, kFdBits));
   }
 
-  inline int SaField() const {
-    return Bits(kSaShift, kSaBits);
-  }
+  inline int SaField() const { return Bits(kSaShift, kSaBits); }
 
-  inline int32_t UImmField() const {
-    return Bits(kImmShift, kImmBits);
-  }
+  inline int32_t UImmField() const { return Bits(kImmShift, kImmBits); }
 
   inline int32_t SImmField() const {
     // Sign-extend the imm field.
@@ -626,9 +607,7 @@
     return static_cast<Format>(Bits(kFmtShift, kFmtBits));
   }
 
-  inline int32_t FpuCCField() const {
-    return Bits(kFpuCCShift, kFpuCCBits);
-  }
+  inline int32_t FpuCCField() const { return Bits(kFpuCCShift, kFpuCCBits); }
 
   // Instructions are read out of a code stream. The only way to get a
   // reference to an instruction is to convert a pc. There is no way
@@ -637,17 +616,20 @@
   static Instr* At(uword pc) { return reinterpret_cast<Instr*>(pc); }
 
 #if defined(DEBUG)
-  inline void AssertIsImmInstr(Opcode op, Register rs, Register rt,
-                              int32_t imm) {
+  inline void AssertIsImmInstr(Opcode op,
+                               Register rs,
+                               Register rt,
+                               int32_t imm) {
     ASSERT((OpcodeField() == op) && (RsField() == rs) && (RtField() == rt) &&
            (SImmField() == imm));
   }
 
-  inline void AssertIsSpecialInstr(SpecialFunction f, Register rs, Register rt,
+  inline void AssertIsSpecialInstr(SpecialFunction f,
+                                   Register rs,
+                                   Register rt,
                                    Register rd) {
     ASSERT((OpcodeField() == SPECIAL) && (FunctionField() == f) &&
-           (RsField() == rs) && (RtField() == rt) &&
-           (RdField() == rd));
+           (RsField() == rs) && (RtField() == rt) && (RdField() == rd));
   }
 #endif  // defined(DEBUG)
 
diff --git a/runtime/vm/constants_x64.h b/runtime/vm/constants_x64.h
index a40dd03..3c24e0b 100644
--- a/runtime/vm/constants_x64.h
+++ b/runtime/vm/constants_x64.h
@@ -16,8 +16,8 @@
   RBP = 5,
   RSI = 6,
   RDI = 7,
-  R8  = 8,
-  R9  = 9,
+  R8 = 8,
+  R9 = 9,
   R10 = 10,
   R11 = 11,
   R12 = 12,
@@ -72,11 +72,11 @@
 
 
 enum RexBits {
-  REX_NONE   = 0,
-  REX_B      = 1 << 0,
-  REX_X      = 1 << 1,
-  REX_R      = 1 << 2,
-  REX_W      = 1 << 3,
+  REX_NONE = 0,
+  REX_B = 1 << 0,
+  REX_X = 1 << 1,
+  REX_R = 1 << 2,
+  REX_W = 1 << 3,
   REX_PREFIX = 1 << 6
 };
 
@@ -87,9 +87,9 @@
 const Register CTX = R12;  // Location of current context at method entry.
 // Caches object pool pointer in generated code.
 const Register PP = R15;
-const Register SPREG = RSP;  // Stack pointer register.
-const Register FPREG = RBP;  // Frame pointer register.
-const Register ICREG = RBX;  // IC data register.
+const Register SPREG = RSP;          // Stack pointer register.
+const Register FPREG = RBP;          // Frame pointer register.
+const Register ICREG = RBX;          // IC data register.
 const Register ARGS_DESC_REG = R10;  // Arguments descriptor register.
 const Register CODE_REG = R12;
 const Register THR = R14;  // Caches current thread in generated code.
@@ -108,11 +108,7 @@
 const RegList kAllCpuRegistersList = 0xFFFF;
 
 const RegList kReservedCpuRegisters =
-    (1 << SPREG) |
-    (1 << FPREG) |
-    (1 << TMP)   |
-    (1 << PP)    |
-    (1 << THR);
+    (1 << SPREG) | (1 << FPREG) | (1 << TMP) | (1 << PP) | (1 << THR);
 // CPU registers available to Dart allocator.
 const RegList kDartAvailableCpuRegs =
     kAllCpuRegistersList & ~kReservedCpuRegisters;
@@ -129,29 +125,29 @@
 
 
 enum Condition {
-  OVERFLOW      =  0,
-  NO_OVERFLOW   =  1,
-  BELOW         =  2,
-  ABOVE_EQUAL   =  3,
-  EQUAL         =  4,
-  NOT_EQUAL     =  5,
-  BELOW_EQUAL   =  6,
-  ABOVE         =  7,
-  SIGN          =  8,
-  NOT_SIGN      =  9,
-  PARITY_EVEN   = 10,
-  PARITY_ODD    = 11,
-  LESS          = 12,
+  OVERFLOW = 0,
+  NO_OVERFLOW = 1,
+  BELOW = 2,
+  ABOVE_EQUAL = 3,
+  EQUAL = 4,
+  NOT_EQUAL = 5,
+  BELOW_EQUAL = 6,
+  ABOVE = 7,
+  SIGN = 8,
+  NOT_SIGN = 9,
+  PARITY_EVEN = 10,
+  PARITY_ODD = 11,
+  LESS = 12,
   GREATER_EQUAL = 13,
-  LESS_EQUAL    = 14,
-  GREATER       = 15,
+  LESS_EQUAL = 14,
+  GREATER = 15,
 
-  ZERO          = EQUAL,
-  NOT_ZERO      = NOT_EQUAL,
-  NEGATIVE      = SIGN,
-  POSITIVE      = NOT_SIGN,
-  CARRY         = BELOW,
-  NOT_CARRY     = ABOVE_EQUAL
+  ZERO = EQUAL,
+  NOT_ZERO = NOT_EQUAL,
+  NEGATIVE = SIGN,
+  POSITIVE = NOT_SIGN,
+  CARRY = BELOW,
+  NOT_CARRY = ABOVE_EQUAL
 };
 
 #define R(reg) (1 << (reg))
@@ -193,14 +189,14 @@
   static const Register kArg6Reg = R9;
   static const intptr_t kShadowSpaceBytes = 0;
 
-  static const intptr_t kVolatileCpuRegisters =
-      R(RAX) | R(RCX) | R(RDX) | R(RSI) | R(RDI) |
-      R(R8) | R(R9) | R(R10) | R(R11);
+  static const intptr_t kVolatileCpuRegisters = R(RAX) | R(RCX) | R(RDX) |
+                                                R(RSI) | R(RDI) | R(R8) |
+                                                R(R9) | R(R10) | R(R11);
 
   static const intptr_t kVolatileXmmRegisters =
-      R(XMM0) | R(XMM1) | R(XMM2) | R(XMM3) | R(XMM4) |
-      R(XMM5) | R(XMM6) | R(XMM7) | R(XMM8) | R(XMM9) |
-      R(XMM10) | R(XMM11) | R(XMM12) | R(XMM13) | R(XMM14) | R(XMM15);
+      R(XMM0) | R(XMM1) | R(XMM2) | R(XMM3) | R(XMM4) | R(XMM5) | R(XMM6) |
+      R(XMM7) | R(XMM8) | R(XMM9) | R(XMM10) | R(XMM11) | R(XMM12) | R(XMM13) |
+      R(XMM14) | R(XMM15);
 
   static const intptr_t kCalleeSaveCpuRegisters =
       R(RBX) | R(R12) | R(R13) | R(R14) | R(R15);
diff --git a/runtime/vm/cpu_arm.cc b/runtime/vm/cpu_arm.cc
index a0e31a9..c2b7e76 100644
--- a/runtime/vm/cpu_arm.cc
+++ b/runtime/vm/cpu_arm.cc
@@ -16,8 +16,8 @@
 #include "vm/simulator.h"
 
 #if !defined(USING_SIMULATOR)
-#include <sys/syscall.h>  /* NOLINT */
-#include <unistd.h>  /* NOLINT */
+#include <sys/syscall.h> /* NOLINT */
+#include <unistd.h>      /* NOLINT */
 #endif
 
 // ARM version differences.
@@ -61,17 +61,23 @@
 #if defined(TARGET_ARCH_ARM_5TE)
 DEFINE_FLAG(bool, use_vfp, false, "Use vfp instructions if supported");
 DEFINE_FLAG(bool, use_neon, false, "Use neon instructions if supported");
-DEFINE_FLAG(bool, use_integer_division, false,
+DEFINE_FLAG(bool,
+            use_integer_division,
+            false,
             "Use integer division instruction if supported");
 #elif defined(TARGET_ARCH_ARM_6)
 DEFINE_FLAG(bool, use_vfp, true, "Use vfp instructions if supported");
 DEFINE_FLAG(bool, use_neon, false, "Use neon instructions if supported");
-DEFINE_FLAG(bool, use_integer_division, false,
+DEFINE_FLAG(bool,
+            use_integer_division,
+            false,
             "Use integer division instruction if supported");
 #else
 DEFINE_FLAG(bool, use_vfp, true, "Use vfp instructions if supported");
 DEFINE_FLAG(bool, use_neon, true, "Use neon instructions if supported");
-DEFINE_FLAG(bool, use_integer_division, true,
+DEFINE_FLAG(bool,
+            use_integer_division,
+            true,
             "Use integer division instruction if supported");
 #endif
 
@@ -95,19 +101,19 @@
     return;
   }
 
-  // ARM recommends using the gcc intrinsic __clear_cache on Linux, and the
-  // library call cacheflush from unistd.h on Android:
-  // blogs.arm.com/software-enablement/141-caches-and-self-modifying-code/
-  #if defined(__linux__) && !defined(ANDROID)
-    extern void __clear_cache(char*, char*);
-    char* beg = reinterpret_cast<char*>(start);
-    char* end = reinterpret_cast<char*>(start + size);
-    ::__clear_cache(beg, end);
-  #elif defined(ANDROID)
-    cacheflush(start, start + size, 0);
-  #else
-    #error FlushICache only tested/supported on Linux and Android
-  #endif
+// ARM recommends using the gcc intrinsic __clear_cache on Linux, and the
+// library call cacheflush from unistd.h on Android:
+// blogs.arm.com/software-enablement/141-caches-and-self-modifying-code/
+#if defined(__linux__) && !defined(ANDROID)
+  extern void __clear_cache(char*, char*);
+  char* beg = reinterpret_cast<char*>(start);
+  char* end = reinterpret_cast<char*>(start + size);
+  ::__clear_cache(beg, end);
+#elif defined(ANDROID)
+  cacheflush(start, start + size, 0);
+#else
+#error FlushICache only tested/supported on Linux and Android
+#endif
 #endif
 }
 
@@ -115,9 +121,9 @@
 const char* CPU::Id() {
   return
 #if defined(USING_SIMULATOR)
-  "sim"
+      "sim"
 #endif  // defined(USING_SIMULATOR)
-  "arm";
+      "arm";
 }
 
 
@@ -203,8 +209,7 @@
   bool is_krait = CpuInfo::FieldContains(kCpuInfoHardware, "QCT APQ8064");
   bool is_armada_370xp =
       CpuInfo::FieldContains(kCpuInfoHardware, "Marvell Armada 370/XP");
-  bool is_pixel =
-      CpuInfo::FieldContains(kCpuInfoHardware, "MSM8996pro");
+  bool is_pixel = CpuInfo::FieldContains(kCpuInfoHardware, "MSM8996pro");
   if (is_krait) {
     integer_division_supported_ = FLAG_use_integer_division;
   } else if (is_armada_370xp || is_pixel) {
@@ -218,8 +223,8 @@
       (CpuInfo::FieldContains(kCpuInfoFeatures, "neon") || is_arm64) &&
       FLAG_use_vfp && FLAG_use_neon;
 
-  // Use the cross-compiler's predefined macros to determine whether we should
-  // use the hard or soft float ABI.
+// Use the cross-compiler's predefined macros to determine whether we should
+// use the hard or soft float ABI.
 #if defined(__ARM_PCS_VFP)
   hardfp_supported_ = true;
 #else
diff --git a/runtime/vm/cpu_arm.h b/runtime/vm/cpu_arm.h
index b0e43f7..8e7c4aad 100644
--- a/runtime/vm/cpu_arm.h
+++ b/runtime/vm/cpu_arm.h
@@ -25,7 +25,7 @@
   ARMvUnknown,
 };
 
-class HostCPUFeatures: public AllStatic {
+class HostCPUFeatures : public AllStatic {
  public:
   static void InitOnce();
   static void Cleanup();
@@ -92,36 +92,20 @@
 
 class TargetCPUFeatures : public AllStatic {
  public:
-  static void InitOnce() {
-    HostCPUFeatures::InitOnce();
-  }
-  static void Cleanup() {
-    HostCPUFeatures::Cleanup();
-  }
-  static bool double_truncate_round_supported() {
-    return false;
-  }
+  static void InitOnce() { HostCPUFeatures::InitOnce(); }
+  static void Cleanup() { HostCPUFeatures::Cleanup(); }
+  static bool double_truncate_round_supported() { return false; }
   static bool integer_division_supported() {
     return HostCPUFeatures::integer_division_supported();
   }
-  static bool vfp_supported() {
-    return HostCPUFeatures::vfp_supported();
-  }
+  static bool vfp_supported() { return HostCPUFeatures::vfp_supported(); }
   static bool can_divide() {
     return integer_division_supported() || vfp_supported();
   }
-  static bool neon_supported() {
-    return HostCPUFeatures::neon_supported();
-  }
-  static bool hardfp_supported() {
-    return HostCPUFeatures::hardfp_supported();
-  }
-  static const char* hardware() {
-    return HostCPUFeatures::hardware();
-  }
-  static ARMVersion arm_version() {
-    return HostCPUFeatures::arm_version();
-  }
+  static bool neon_supported() { return HostCPUFeatures::neon_supported(); }
+  static bool hardfp_supported() { return HostCPUFeatures::hardfp_supported(); }
+  static const char* hardware() { return HostCPUFeatures::hardware(); }
+  static ARMVersion arm_version() { return HostCPUFeatures::arm_version(); }
   static intptr_t store_pc_read_offset() {
     return HostCPUFeatures::store_pc_read_offset();
   }
diff --git a/runtime/vm/cpu_arm64.cc b/runtime/vm/cpu_arm64.cc
index e612cce..a5e3049 100644
--- a/runtime/vm/cpu_arm64.cc
+++ b/runtime/vm/cpu_arm64.cc
@@ -12,8 +12,8 @@
 #include "vm/simulator.h"
 
 #if !defined(USING_SIMULATOR)
-#include <sys/syscall.h>  /* NOLINT */
-#include <unistd.h>  /* NOLINT */
+#include <sys/syscall.h> /* NOLINT */
+#include <unistd.h>      /* NOLINT */
 #endif
 
 namespace dart {
@@ -30,18 +30,17 @@
     return;
   }
 
-  // ARM recommends using the gcc intrinsic __clear_cache on Linux and Android.
-  // blogs.arm.com/software-enablement/141-caches-and-self-modifying-code/
-  #if defined(TARGET_OS_ANDROID) || \
-      defined(TARGET_OS_FUCHSIA) || \
-      defined(TARGET_OS_LINUX)
-    extern void __clear_cache(char*, char*);
-    char* beg = reinterpret_cast<char*>(start);
-    char* end = reinterpret_cast<char*>(start + size);
-    ::__clear_cache(beg, end);
-  #else
-    #error FlushICache only tested/supported on Android, Fuchsia, and Linux
-  #endif
+// ARM recommends using the gcc intrinsic __clear_cache on Linux and Android.
+// blogs.arm.com/software-enablement/141-caches-and-self-modifying-code/
+#if defined(TARGET_OS_ANDROID) || defined(TARGET_OS_FUCHSIA) ||                \
+    defined(TARGET_OS_LINUX)
+  extern void __clear_cache(char*, char*);
+  char* beg = reinterpret_cast<char*>(start);
+  char* end = reinterpret_cast<char*>(start + size);
+  ::__clear_cache(beg, end);
+#else
+#error FlushICache only tested/supported on Android, Fuchsia, and Linux
+#endif
 
 #endif
 }
@@ -50,9 +49,9 @@
 const char* CPU::Id() {
   return
 #if defined(USING_SIMULATOR)
-  "sim"
+      "sim"
 #endif  // !defined(HOST_ARCH_ARM64)
-  "arm64";
+      "arm64";
 }
 
 
diff --git a/runtime/vm/cpu_arm64.h b/runtime/vm/cpu_arm64.h
index 89799ea..df920d3 100644
--- a/runtime/vm/cpu_arm64.h
+++ b/runtime/vm/cpu_arm64.h
@@ -18,7 +18,7 @@
 // additionally mock the options needed for the target architecture so that
 // they may be altered for testing.
 
-class HostCPUFeatures: public AllStatic {
+class HostCPUFeatures : public AllStatic {
  public:
   static void InitOnce();
   static void Cleanup();
@@ -36,18 +36,10 @@
 
 class TargetCPUFeatures : public AllStatic {
  public:
-  static void InitOnce() {
-    HostCPUFeatures::InitOnce();
-  }
-  static void Cleanup() {
-    HostCPUFeatures::Cleanup();
-  }
-  static const char* hardware() {
-    return HostCPUFeatures::hardware();
-  }
-  static bool double_truncate_round_supported() {
-    return false;
-  }
+  static void InitOnce() { HostCPUFeatures::InitOnce(); }
+  static void Cleanup() { HostCPUFeatures::Cleanup(); }
+  static const char* hardware() { return HostCPUFeatures::hardware(); }
+  static bool double_truncate_round_supported() { return false; }
 };
 
 }  // namespace dart
diff --git a/runtime/vm/cpu_dbc.h b/runtime/vm/cpu_dbc.h
index e42cc1c..a5cf4ee 100644
--- a/runtime/vm/cpu_dbc.h
+++ b/runtime/vm/cpu_dbc.h
@@ -10,7 +10,7 @@
 
 namespace dart {
 
-class HostCPUFeatures: public AllStatic {
+class HostCPUFeatures : public AllStatic {
  public:
   static void InitOnce();
   static void Cleanup();
@@ -29,20 +29,12 @@
 
 class TargetCPUFeatures : public AllStatic {
  public:
-  static void InitOnce() {
-    HostCPUFeatures::InitOnce();
-  }
-  static void Cleanup() {
-    HostCPUFeatures::Cleanup();
-  }
+  static void InitOnce() { HostCPUFeatures::InitOnce(); }
+  static void Cleanup() { HostCPUFeatures::Cleanup(); }
 
-  static const char* hardware() {
-    return CPU::Id();
-  }
+  static const char* hardware() { return CPU::Id(); }
 
-  static bool double_truncate_round_supported() {
-    return true;
-  }
+  static bool double_truncate_round_supported() { return true; }
 };
 
 }  // namespace dart
diff --git a/runtime/vm/cpu_ia32.cc b/runtime/vm/cpu_ia32.cc
index 441a8ad..a5f02c2 100644
--- a/runtime/vm/cpu_ia32.cc
+++ b/runtime/vm/cpu_ia32.cc
@@ -41,9 +41,8 @@
 
   hardware_ = CpuInfo::GetCpuModel();
   sse2_supported_ = CpuInfo::FieldContains(kCpuInfoFeatures, "sse2");
-  sse4_1_supported_ =
-      CpuInfo::FieldContains(kCpuInfoFeatures, "sse4_1") ||
-      CpuInfo::FieldContains(kCpuInfoFeatures, "sse4.1");
+  sse4_1_supported_ = CpuInfo::FieldContains(kCpuInfoFeatures, "sse4_1") ||
+                      CpuInfo::FieldContains(kCpuInfoFeatures, "sse4.1");
 
 #if defined(DEBUG)
   initialized_ = true;
diff --git a/runtime/vm/cpu_ia32.h b/runtime/vm/cpu_ia32.h
index 3c3d836..3c8d7af 100644
--- a/runtime/vm/cpu_ia32.h
+++ b/runtime/vm/cpu_ia32.h
@@ -42,24 +42,12 @@
 
 class TargetCPUFeatures : public AllStatic {
  public:
-  static void InitOnce() {
-    HostCPUFeatures::InitOnce();
-  }
-  static void Cleanup() {
-    HostCPUFeatures::Cleanup();
-  }
-  static const char* hardware() {
-    return HostCPUFeatures::hardware();
-  }
-  static bool sse2_supported() {
-    return HostCPUFeatures::sse2_supported();
-  }
-  static bool sse4_1_supported() {
-    return HostCPUFeatures::sse4_1_supported();
-  }
-  static bool double_truncate_round_supported() {
-    return sse4_1_supported();
-  }
+  static void InitOnce() { HostCPUFeatures::InitOnce(); }
+  static void Cleanup() { HostCPUFeatures::Cleanup(); }
+  static const char* hardware() { return HostCPUFeatures::hardware(); }
+  static bool sse2_supported() { return HostCPUFeatures::sse2_supported(); }
+  static bool sse4_1_supported() { return HostCPUFeatures::sse4_1_supported(); }
+  static bool double_truncate_round_supported() { return sse4_1_supported(); }
 };
 
 }  // namespace dart
diff --git a/runtime/vm/cpu_mips.cc b/runtime/vm/cpu_mips.cc
index f220706..902f59c 100644
--- a/runtime/vm/cpu_mips.cc
+++ b/runtime/vm/cpu_mips.cc
@@ -14,7 +14,7 @@
 #if !defined(USING_SIMULATOR)
 #include <asm/cachectl.h> /* NOLINT */
 #include <sys/syscall.h>  /* NOLINT */
-#include <unistd.h>  /* NOLINT */
+#include <unistd.h>       /* NOLINT */
 #endif
 
 namespace dart {
@@ -25,9 +25,9 @@
   // See http://www.linux-mips.org/wiki/Cacheflush_Syscall.
   res = syscall(__NR_cacheflush, start, size, ICACHE);
   ASSERT(res == 0);
-#else  // defined(HOST_ARCH_MIPS)
-  // When running in simulated mode we do not need to flush the ICache because
-  // we are not running on the actual hardware.
+#else   // defined(HOST_ARCH_MIPS)
+// When running in simulated mode we do not need to flush the ICache because
+// we are not running on the actual hardware.
 #endif  // defined(HOST_ARCH_MIPS)
 }
 
@@ -35,9 +35,9 @@
 const char* CPU::Id() {
   return
 #if defined(USING_SIMULATOR)
-  "sim"
+      "sim"
 #endif  // !defined(HOST_ARCH_MIPS)
-  "mips";
+      "mips";
 }
 
 
@@ -55,8 +55,8 @@
   // Has a floating point unit.
   ASSERT(CpuInfo::FieldContains(kCpuInfoModel, "FPU"));
 
-  // We want to know the ISA version, but on MIPS, CpuInfo can't tell us, so
-  // we use the same ISA version that Dart's C++ compiler targeted.
+// We want to know the ISA version, but on MIPS, CpuInfo can't tell us, so
+// we use the same ISA version that Dart's C++ compiler targeted.
 #if defined(_MIPS_ARCH_MIPS32R2)
   mips_version_ = MIPS32r2;
 #elif defined(_MIPS_ARCH_MIPS32)
diff --git a/runtime/vm/cpu_mips.h b/runtime/vm/cpu_mips.h
index b9dde4d..8af35b8 100644
--- a/runtime/vm/cpu_mips.h
+++ b/runtime/vm/cpu_mips.h
@@ -23,7 +23,7 @@
   MIPSvUnknown,
 };
 
-class HostCPUFeatures: public AllStatic {
+class HostCPUFeatures : public AllStatic {
  public:
   static void InitOnce();
   static void Cleanup();
@@ -46,21 +46,11 @@
 
 class TargetCPUFeatures : public AllStatic {
  public:
-  static void InitOnce() {
-    HostCPUFeatures::InitOnce();
-  }
-  static void Cleanup() {
-    HostCPUFeatures::Cleanup();
-  }
-  static const char* hardware() {
-    return HostCPUFeatures::hardware();
-  }
-  static bool double_truncate_round_supported() {
-    return false;
-  }
-  static MIPSVersion mips_version() {
-    return HostCPUFeatures::mips_version();
-  }
+  static void InitOnce() { HostCPUFeatures::InitOnce(); }
+  static void Cleanup() { HostCPUFeatures::Cleanup(); }
+  static const char* hardware() { return HostCPUFeatures::hardware(); }
+  static bool double_truncate_round_supported() { return false; }
+  static MIPSVersion mips_version() { return HostCPUFeatures::mips_version(); }
 };
 
 }  // namespace dart
diff --git a/runtime/vm/cpu_test.cc b/runtime/vm/cpu_test.cc
index 7ffbe6f..3b13c0f 100644
--- a/runtime/vm/cpu_test.cc
+++ b/runtime/vm/cpu_test.cc
@@ -17,19 +17,19 @@
 #elif defined(TARGET_ARCH_ARM)
 #if defined(HOST_ARCH_ARM)
   EXPECT_STREQ("arm", CPU::Id());
-#else  // defined(HOST_ARCH_ARM)
+#else   // defined(HOST_ARCH_ARM)
   EXPECT_STREQ("simarm", CPU::Id());
 #endif  // defined(HOST_ARCH_ARM)
 #elif defined(TARGET_ARCH_ARM64)
 #if defined(HOST_ARCH_ARM64)
   EXPECT_STREQ("arm64", CPU::Id());
-#else  // defined(HOST_ARCH_ARM64)
+#else   // defined(HOST_ARCH_ARM64)
   EXPECT_STREQ("simarm64", CPU::Id());
 #endif  // defined(HOST_ARCH_ARM64)
 #elif defined(TARGET_ARCH_MIPS)
 #if defined(HOST_ARCH_MIPS)
   EXPECT_STREQ("mips", CPU::Id());
-#else  // defined(HOST_ARCH_MIPS)
+#else   // defined(HOST_ARCH_MIPS)
   EXPECT_STREQ("simmips", CPU::Id());
 #endif  // defined(HOST_ARCH_MIPS)
 #elif defined(TARGET_ARCH_DBC)
diff --git a/runtime/vm/cpu_x64.cc b/runtime/vm/cpu_x64.cc
index 3ad20d7..72b3478 100644
--- a/runtime/vm/cpu_x64.cc
+++ b/runtime/vm/cpu_x64.cc
@@ -40,9 +40,8 @@
 void HostCPUFeatures::InitOnce() {
   CpuInfo::InitOnce();
   hardware_ = CpuInfo::GetCpuModel();
-  sse4_1_supported_ =
-      CpuInfo::FieldContains(kCpuInfoFeatures, "sse4_1") ||
-      CpuInfo::FieldContains(kCpuInfoFeatures, "sse4.1");
+  sse4_1_supported_ = CpuInfo::FieldContains(kCpuInfoFeatures, "sse4_1") ||
+                      CpuInfo::FieldContains(kCpuInfoFeatures, "sse4.1");
 
 #if defined(DEBUG)
   initialized_ = true;
diff --git a/runtime/vm/cpu_x64.h b/runtime/vm/cpu_x64.h
index c56ee64..3e70fce 100644
--- a/runtime/vm/cpu_x64.h
+++ b/runtime/vm/cpu_x64.h
@@ -42,24 +42,12 @@
 
 class TargetCPUFeatures : public AllStatic {
  public:
-  static void InitOnce() {
-    HostCPUFeatures::InitOnce();
-  }
-  static void Cleanup() {
-    HostCPUFeatures::Cleanup();
-  }
-  static const char* hardware() {
-    return HostCPUFeatures::hardware();
-  }
-  static bool sse2_supported() {
-    return HostCPUFeatures::sse2_supported();
-  }
-  static bool sse4_1_supported() {
-    return HostCPUFeatures::sse4_1_supported();
-  }
-  static bool double_truncate_round_supported() {
-    return false;
-  }
+  static void InitOnce() { HostCPUFeatures::InitOnce(); }
+  static void Cleanup() { HostCPUFeatures::Cleanup(); }
+  static const char* hardware() { return HostCPUFeatures::hardware(); }
+  static bool sse2_supported() { return HostCPUFeatures::sse2_supported(); }
+  static bool sse4_1_supported() { return HostCPUFeatures::sse4_1_supported(); }
+  static bool double_truncate_round_supported() { return false; }
 };
 
 }  // namespace dart
diff --git a/runtime/vm/cpuinfo_fuchsia.cc b/runtime/vm/cpuinfo_fuchsia.cc
index ad9e990..899223e 100644
--- a/runtime/vm/cpuinfo_fuchsia.cc
+++ b/runtime/vm/cpuinfo_fuchsia.cc
@@ -16,7 +16,7 @@
 const char* CpuInfo::fields_[kCpuInfoMax] = {0};
 
 void CpuInfo::InitOnce() {
-  // TODO(zra): Add support for HOST_ARCH_ARM64
+// TODO(zra): Add support for HOST_ARCH_ARM64
 #if defined(HOST_ARCH_IA32) || defined(HOST_ARCH_X64)
   method_ = kCpuInfoCpuId;
 
diff --git a/runtime/vm/cpuinfo_macos.cc b/runtime/vm/cpuinfo_macos.cc
index eef06d9..64e46f3 100644
--- a/runtime/vm/cpuinfo_macos.cc
+++ b/runtime/vm/cpuinfo_macos.cc
@@ -7,8 +7,8 @@
 
 #include "vm/cpuinfo.h"
 
-#include <errno.h>  // NOLINT
-#include <sys/types.h>  // NOLINT
+#include <errno.h>       // NOLINT
+#include <sys/types.h>   // NOLINT
 #include <sys/sysctl.h>  // NOLINT
 
 #include "platform/assert.h"
diff --git a/runtime/vm/custom_isolate_test.cc b/runtime/vm/custom_isolate_test.cc
index 1995ee6..cf4c8fa 100644
--- a/runtime/vm/custom_isolate_test.cc
+++ b/runtime/vm/custom_isolate_test.cc
@@ -99,9 +99,7 @@
 // A simple event queue for our test.
 class EventQueue {
  public:
-  EventQueue() {
-    head_ = NULL;
-  }
+  EventQueue() { head_ = NULL; }
 
   void Add(Event* event) {
     if (head_ == NULL) {
@@ -163,6 +161,7 @@
       : Event(isolate), main_(main) {}
 
   virtual void Process();
+
  private:
   const char* main_;
 };
@@ -193,8 +192,7 @@
  public:
   explicit MessageEvent(Dart_Isolate isolate) : Event(isolate) {}
 
-  ~MessageEvent() {
-  }
+  ~MessageEvent() {}
 
   virtual void Process();
 };
@@ -289,8 +287,8 @@
   // Reload all the test classes here.
   //
   // TODO(turnidge): Use the create isolate callback instead?
-  Dart_Handle lib = TestCase::LoadTestScript(kCustomIsolateScriptChars,
-                                             NativeLookup);
+  Dart_Handle lib =
+      TestCase::LoadTestScript(kCustomIsolateScriptChars, NativeLookup);
   EXPECT_VALID(lib);
 
   Dart_Handle main_send_port = Dart_GetField(lib, NewString("mainSendPort"));
@@ -333,8 +331,8 @@
   Dart_Handle result;
 
   // Create a test library.
-  Dart_Handle lib = TestCase::LoadTestScript(kCustomIsolateScriptChars,
-                                             NativeLookup);
+  Dart_Handle lib =
+      TestCase::LoadTestScript(kCustomIsolateScriptChars, NativeLookup);
   EXPECT_VALID(lib);
 
   // Run main.
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index 579691e..bf490bf 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -39,8 +39,7 @@
 
 DECLARE_FLAG(bool, print_class_table);
 DECLARE_FLAG(bool, trace_time_all);
-DEFINE_FLAG(bool, keep_code, false,
-            "Keep deoptimized code for profiling.");
+DEFINE_FLAG(bool, keep_code, false, "Keep deoptimized code for profiling.");
 DEFINE_FLAG(bool, trace_shutdown, false, "Trace VM shutdown on stderr");
 
 Isolate* Dart::vm_isolate_ = NULL;
@@ -71,7 +70,7 @@
 // have unintended consequences.
 class ReadOnlyHandles {
  public:
-  ReadOnlyHandles() { }
+  ReadOnlyHandles() {}
 
  private:
   VMHandles handles_;
@@ -86,7 +85,7 @@
 #define CHECK_OFFSET(expr, offset)                                             \
   if ((expr) != (offset)) {                                                    \
     FATAL2("%s == %" Pd, #expr, (expr));                                       \
-  }                                                                            \
+  }
 
 #if defined(TARGET_ARCH_ARM)
   // These offsets are embedded in precompiled instructions. We need simarm
@@ -148,8 +147,8 @@
   if (FLAG_support_timeline) {
     Timeline::InitOnce();
   }
-  NOT_IN_PRODUCT(TimelineDurationScope tds(Timeline::GetVMStream(),
-                                           "Dart::InitOnce"));
+  NOT_IN_PRODUCT(
+      TimelineDurationScope tds(Timeline::GetVMStream(), "Dart::InitOnce"));
   Isolate::InitOnce();
   PortMap::InitOnce();
   FreeListElement::InitOnce();
@@ -241,24 +240,23 @@
       } else {
         return strdup("Invalid vm isolate snapshot seen");
       }
-      VmIsolateSnapshotReader reader(snapshot->kind(),
-                                     snapshot->content(),
-                                     snapshot->length(),
-                                     instructions_snapshot,
-                                     data_snapshot,
-                                     T);
+      VmIsolateSnapshotReader reader(snapshot->kind(), snapshot->content(),
+                                     snapshot->length(), instructions_snapshot,
+                                     data_snapshot, T);
       const Error& error = Error::Handle(reader.ReadVmIsolateSnapshot());
       if (!error.IsNull()) {
         // Must copy before leaving the zone.
         return strdup(error.ToErrorCString());
       }
-      NOT_IN_PRODUCT(if (tds.enabled()) {
+#if !defined(PRODUCT)
+      if (tds.enabled()) {
         tds.SetNumArguments(2);
         tds.FormatArgument(0, "snapshotSize", "%" Pd, snapshot->length());
-        tds.FormatArgument(1, "heapSize", "%" Pd64,
-                           vm_isolate_->heap()->UsedInWords(Heap::kOld) *
-                           kWordSize);
-      });
+        tds.FormatArgument(
+            1, "heapSize", "%" Pd64,
+            vm_isolate_->heap()->UsedInWords(Heap::kOld) * kWordSize);
+      }
+#endif  // !defined(PRODUCT)
       if (FLAG_trace_isolates) {
         OS::Print("Size of vm isolate snapshot = %" Pd "\n",
                   snapshot->length());
@@ -355,8 +353,7 @@
   }
 
   if (FLAG_trace_shutdown) {
-    OS::PrintErr("[+%" Pd64 "ms] SHUTDOWN: Starting shutdown\n",
-                 timestamp());
+    OS::PrintErr("[+%" Pd64 "ms] SHUTDOWN: Starting shutdown\n", timestamp());
   }
 
   if (FLAG_profiler) {
@@ -463,8 +460,7 @@
   OSThread::SetCurrent(NULL);
   delete os_thread;
   if (FLAG_trace_shutdown) {
-    OS::PrintErr("[+%" Pd64 "ms] SHUTDOWN: Deleted os_thread\n",
-                 timestamp());
+    OS::PrintErr("[+%" Pd64 "ms] SHUTDOWN: Deleted os_thread\n", timestamp());
   }
 
   if (FLAG_trace_shutdown) {
@@ -499,19 +495,16 @@
   // Initialize the new isolate.
   Thread* T = Thread::Current();
   Isolate* I = T->isolate();
-  NOT_IN_PRODUCT(
-    TimelineDurationScope tds(T,
-                              Timeline::GetIsolateStream(),
-                              "InitializeIsolate");
-    tds.SetNumArguments(1);
-    tds.CopyArgument(0, "isolateName", I->name());
-  )
+  NOT_IN_PRODUCT(TimelineDurationScope tds(T, Timeline::GetIsolateStream(),
+                                           "InitializeIsolate");
+                 tds.SetNumArguments(1);
+                 tds.CopyArgument(0, "isolateName", I->name());)
   ASSERT(I != NULL);
   StackZone zone(T);
   HandleScope handle_scope(T);
   {
-    NOT_IN_PRODUCT(TimelineDurationScope tds(T,
-        Timeline::GetIsolateStream(), "ObjectStore::Init"));
+    NOT_IN_PRODUCT(TimelineDurationScope tds(T, Timeline::GetIsolateStream(),
+                                             "ObjectStore::Init"));
     ObjectStore::Init(I);
   }
 
@@ -521,44 +514,48 @@
   }
   if (snapshot_buffer != NULL) {
     // Read the snapshot and setup the initial state.
-    NOT_IN_PRODUCT(TimelineDurationScope tds(T,
-        Timeline::GetIsolateStream(), "IsolateSnapshotReader"));
+    NOT_IN_PRODUCT(TimelineDurationScope tds(T, Timeline::GetIsolateStream(),
+                                             "IsolateSnapshotReader"));
     // TODO(turnidge): Remove once length is not part of the snapshot.
     const Snapshot* snapshot = Snapshot::SetupFromBuffer(snapshot_buffer);
     if (snapshot == NULL) {
+      const String& message = String::Handle(String::New("Invalid snapshot"));
+      return ApiError::New(message);
+    }
+    if (snapshot->kind() != snapshot_kind_) {
       const String& message = String::Handle(
-          String::New("Invalid snapshot"));
+          String::NewFormatted("Invalid snapshot kind: got '%s', expected '%s'",
+                               Snapshot::KindToCString(snapshot->kind()),
+                               Snapshot::KindToCString(snapshot_kind_)));
       return ApiError::New(message);
     }
     ASSERT(Snapshot::IsFull(snapshot->kind()));
-    ASSERT(snapshot->kind() == snapshot_kind_);
     if (FLAG_trace_isolates) {
       OS::Print("Size of isolate snapshot = %" Pd "\n", snapshot->length());
     }
-    IsolateSnapshotReader reader(snapshot->kind(),
-                                 snapshot->content(),
-                                 snapshot->length(),
-                                 Dart::instructions_snapshot_buffer(),
-                                 Dart::data_snapshot_buffer(),
-                                 T);
+    IsolateSnapshotReader reader(
+        snapshot->kind(), snapshot->content(), snapshot->length(),
+        Dart::instructions_snapshot_buffer(), Dart::data_snapshot_buffer(), T);
     const Error& error = Error::Handle(reader.ReadFullSnapshot());
     if (!error.IsNull()) {
       return error.raw();
     }
-    NOT_IN_PRODUCT(if (tds.enabled()) {
+#if !defined(PRODUCT)
+    if (tds.enabled()) {
       tds.SetNumArguments(2);
       tds.FormatArgument(0, "snapshotSize", "%" Pd, snapshot->length());
       tds.FormatArgument(1, "heapSize", "%" Pd64,
                          I->heap()->UsedInWords(Heap::kOld) * kWordSize);
-    });
+    }
+#endif  // !defined(PRODUCT)
     if (FLAG_trace_isolates) {
       I->heap()->PrintSizes();
       MegamorphicCacheTable::PrintSizes(I);
     }
   } else {
     if (snapshot_kind_ != Snapshot::kNone) {
-      const String& message = String::Handle(
-          String::New("Missing isolate snapshot"));
+      const String& message =
+          String::Handle(String::New("Missing isolate snapshot"));
       return ApiError::New(message);
     }
   }
@@ -567,8 +564,8 @@
   DEBUG_ONLY(I->heap()->Verify(kForbidMarked));
 
   {
-    NOT_IN_PRODUCT(TimelineDurationScope tds(T,
-        Timeline::GetIsolateStream(), "StubCode::Init"));
+    NOT_IN_PRODUCT(TimelineDurationScope tds(T, Timeline::GetIsolateStream(),
+                                             "StubCode::Init"));
     StubCode::Init(I);
   }
 
@@ -602,8 +599,7 @@
   if (!ServiceIsolate::IsServiceIsolate(I)) {
     I->message_handler()->set_should_pause_on_start(
         FLAG_pause_isolates_on_start);
-    I->message_handler()->set_should_pause_on_exit(
-        FLAG_pause_isolates_on_exit);
+    I->message_handler()->set_should_pause_on_exit(FLAG_pause_isolates_on_exit);
   }
   ServiceIsolate::SendIsolateStartupMessage();
   if (FLAG_support_debugger) {
@@ -626,7 +622,7 @@
 const char* Dart::FeaturesString(Snapshot::Kind kind) {
   TextBuffer buffer(64);
 
-  // Different fields are included for DEBUG/RELEASE/PRODUCT.
+// Different fields are included for DEBUG/RELEASE/PRODUCT.
 #if defined(DEBUG)
   buffer.AddString("debug");
 #elif defined(PRODUCT)
@@ -641,7 +637,7 @@
     buffer.AddString(FLAG_enable_type_checks ? " type-checks"
                                              : " no-type-checks");
 
-    // Generated code must match the host architecture and ABI.
+// Generated code must match the host architecture and ABI.
 #if defined(TARGET_ARCH_ARM)
 #if defined(TARGET_ABI_IOS)
     buffer.AddString(" arm-ios");
diff --git a/runtime/vm/dart.h b/runtime/vm/dart.h
index f4e4386..df31995 100644
--- a/runtime/vm/dart.h
+++ b/runtime/vm/dart.h
@@ -21,19 +21,18 @@
 
 class Dart : public AllStatic {
  public:
-  static char* InitOnce(
-      const uint8_t* vm_isolate_snapshot,
-      const uint8_t* instructions_snapshot,
-      const uint8_t* data_snapshot,
-      Dart_IsolateCreateCallback create,
-      Dart_IsolateShutdownCallback shutdown,
-      Dart_ThreadExitCallback thread_exit,
-      Dart_FileOpenCallback file_open,
-      Dart_FileReadCallback file_read,
-      Dart_FileWriteCallback file_write,
-      Dart_FileCloseCallback file_close,
-      Dart_EntropySource entropy_source,
-      Dart_GetVMServiceAssetsArchive get_service_assets);
+  static char* InitOnce(const uint8_t* vm_isolate_snapshot,
+                        const uint8_t* instructions_snapshot,
+                        const uint8_t* data_snapshot,
+                        Dart_IsolateCreateCallback create,
+                        Dart_IsolateShutdownCallback shutdown,
+                        Dart_ThreadExitCallback thread_exit,
+                        Dart_FileOpenCallback file_open,
+                        Dart_FileReadCallback file_read,
+                        Dart_FileWriteCallback file_write,
+                        Dart_FileCloseCallback file_close,
+                        Dart_EntropySource entropy_source,
+                        Dart_GetVMServiceAssetsArchive get_service_assets);
   static const char* Cleanup();
 
   static Isolate* CreateIsolate(const char* name_prefix,
@@ -63,18 +62,14 @@
 
   static const char* FeaturesString(Snapshot::Kind kind);
 
-  static Snapshot::Kind snapshot_kind() {
-    return snapshot_kind_;
-  }
+  static Snapshot::Kind snapshot_kind() { return snapshot_kind_; }
   static const uint8_t* instructions_snapshot_buffer() {
     return instructions_snapshot_buffer_;
   }
   static void set_instructions_snapshot_buffer(const uint8_t* buffer) {
     instructions_snapshot_buffer_ = buffer;
   }
-  static const uint8_t* data_snapshot_buffer() {
-    return data_snapshot_buffer_;
-  }
+  static const uint8_t* data_snapshot_buffer() { return data_snapshot_buffer_; }
   static void set_data_snapshot_buffer(const uint8_t* buffer) {
     data_snapshot_buffer_ = buffer;
   }
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index e1c2aca..0992611 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -60,12 +60,18 @@
 DECLARE_FLAG(bool, print_class_table);
 DECLARE_FLAG(bool, verify_handles);
 #if defined(DART_NO_SNAPSHOT)
-DEFINE_FLAG(bool, check_function_fingerprints, true,
+DEFINE_FLAG(bool,
+            check_function_fingerprints,
+            true,
             "Check function fingerprints");
 #endif  // defined(DART_NO_SNAPSHOT).
-DEFINE_FLAG(bool, verify_acquired_data, false,
+DEFINE_FLAG(bool,
+            verify_acquired_data,
+            false,
             "Verify correct API acquire/release of typed data.");
-DEFINE_FLAG(bool, support_externalizable_strings, false,
+DEFINE_FLAG(bool,
+            support_externalizable_strings,
+            false,
             "Support Dart_MakeExternalString.");
 
 
@@ -86,17 +92,19 @@
 
 #ifndef PRODUCT
 #define API_TIMELINE_DURATION                                                  \
-  TimelineDurationScope tds(Thread::Current(),                                 \
-                            Timeline::GetAPIStream(),                          \
+  TimelineDurationScope tds(Thread::Current(), Timeline::GetAPIStream(),       \
                             CURRENT_FUNC)
 
 #define API_TIMELINE_BEGIN_END                                                 \
-  TimelineBeginEndScope tbes(Thread::Current(),                                \
-                             Timeline::GetAPIStream(),                         \
+  TimelineBeginEndScope tbes(Thread::Current(), Timeline::GetAPIStream(),      \
                              CURRENT_FUNC)
 #else
-#define API_TIMELINE_DURATION do { } while (false)
-#define API_TIMELINE_BEGIN_END do { } while (false)
+#define API_TIMELINE_DURATION                                                  \
+  do {                                                                         \
+  } while (false)
+#define API_TIMELINE_BEGIN_END                                                 \
+  do {                                                                         \
+  } while (false)
 #endif  // !PRODUCT
 
 #if defined(DEBUG)
@@ -105,36 +113,27 @@
 // or not. An assertion is raised if a type is not canonicalized.
 class FunctionVisitor : public ObjectVisitor {
  public:
-  explicit FunctionVisitor(Thread* thread) :
-      classHandle_(Class::Handle(thread->zone())),
-      funcHandle_(Function::Handle(thread->zone())),
-      typeHandle_(AbstractType::Handle(thread->zone())) {}
+  explicit FunctionVisitor(Thread* thread)
+      : classHandle_(Class::Handle(thread->zone())),
+        funcHandle_(Function::Handle(thread->zone())),
+        typeHandle_(AbstractType::Handle(thread->zone())) {}
 
   void VisitObject(RawObject* obj) {
     if (obj->IsFunction()) {
       funcHandle_ ^= obj;
-      if (funcHandle_.IsSignatureFunction()) {
-        // TODO(27606): Remove signature function case.
-        return;
-      }
-
       classHandle_ ^= funcHandle_.Owner();
       // Verify that the result type of a function is canonical or a
       // TypeParameter.
       typeHandle_ ^= funcHandle_.result_type();
-      ASSERT(typeHandle_.IsMalformed() ||
-             !typeHandle_.IsResolved() ||
-             typeHandle_.IsTypeParameter() ||
-             typeHandle_.IsCanonical());
+      ASSERT(typeHandle_.IsMalformed() || !typeHandle_.IsResolved() ||
+             typeHandle_.IsTypeParameter() || typeHandle_.IsCanonical());
       // Verify that the types in the function signature are all canonical or
       // a TypeParameter.
       const intptr_t num_parameters = funcHandle_.NumParameters();
       for (intptr_t i = 0; i < num_parameters; i++) {
         typeHandle_ = funcHandle_.ParameterTypeAt(i);
-        ASSERT(typeHandle_.IsMalformed() ||
-               !typeHandle_.IsResolved() ||
-               typeHandle_.IsTypeParameter() ||
-               typeHandle_.IsCanonical());
+        ASSERT(typeHandle_.IsMalformed() || !typeHandle_.IsResolved() ||
+               typeHandle_.IsTypeParameter() || typeHandle_.IsCanonical());
       }
     }
   }
@@ -156,12 +155,9 @@
     const Instance& instance = Instance::Cast(obj);
     const Class& obj_class = Class::Handle(zone, obj.clazz());
     Error& malformed_type_error = Error::Handle(zone);
-    if (obj_class.IsSubtypeOf(Object::null_type_arguments(),
-                              list_class,
+    if (obj_class.IsSubtypeOf(Object::null_type_arguments(), list_class,
                               Object::null_type_arguments(),
-                              &malformed_type_error,
-                              NULL,
-                              Heap::kNew)) {
+                              &malformed_type_error, NULL, Heap::kNew)) {
       ASSERT(malformed_type_error.IsNull());  // Type is a raw List.
       return instance.raw();
     }
@@ -178,12 +174,9 @@
     const Instance& instance = Instance::Cast(obj);
     const Class& obj_class = Class::Handle(zone, obj.clazz());
     Error& malformed_type_error = Error::Handle(zone);
-    if (obj_class.IsSubtypeOf(Object::null_type_arguments(),
-                              map_class,
+    if (obj_class.IsSubtypeOf(Object::null_type_arguments(), map_class,
                               Object::null_type_arguments(),
-                              &malformed_type_error,
-                              NULL,
-                              Heap::kNew)) {
+                              &malformed_type_error, NULL, Heap::kNew)) {
       ASSERT(malformed_type_error.IsNull());  // Type is a raw Map.
       return instance.raw();
     }
@@ -312,9 +305,7 @@
                                              intptr_t* field_values,
                                              const char* current_func) {
   ASSERT(field_values != NULL);
-  if (Api::GetNativeFieldsOfArgument(arguments,
-                                     arg_index,
-                                     num_fields,
+  if (Api::GetNativeFieldsOfArgument(arguments, arg_index, num_fields,
                                      field_values)) {
     return Api::Success();
   }
@@ -330,15 +321,16 @@
   // We did not succeed in extracting the native fields report the
   // appropriate error.
   if (!obj.IsInstance()) {
-    return Api::NewError("%s expects argument at index '%d' to be of"
-                         " type Instance.", current_func, arg_index);
+    return Api::NewError(
+        "%s expects argument at index '%d' to be of"
+        " type Instance.",
+        current_func, arg_index);
   }
   const Instance& instance = Instance::Cast(obj);
   int field_count = instance.NumNativeFields();
   ASSERT(num_fields != field_count);
-  return Api::NewError(
-      "%s: expected %d 'num_fields' but was passed in %d.",
-      current_func, field_count, num_fields);
+  return Api::NewError("%s: expected %d 'num_fields' but was passed in %d.",
+                       current_func, field_count, num_fields);
 }
 
 
@@ -354,13 +346,12 @@
 }
 
 
-static RawObject* Send0Arg(const Instance& receiver,
-                           const String& selector) {
+static RawObject* Send0Arg(const Instance& receiver, const String& selector) {
   const intptr_t kNumArgs = 1;
   ArgumentsDescriptor args_desc(
       Array::Handle(ArgumentsDescriptor::New(kNumArgs)));
-  const Function& function = Function::Handle(
-      Resolver::ResolveDynamic(receiver, selector, args_desc));
+  const Function& function =
+      Function::Handle(Resolver::ResolveDynamic(receiver, selector, args_desc));
   if (function.IsNull()) {
     return ApiError::New(String::Handle(String::New("")));
   }
@@ -376,8 +367,8 @@
   const intptr_t kNumArgs = 2;
   ArgumentsDescriptor args_desc(
       Array::Handle(ArgumentsDescriptor::New(kNumArgs)));
-  const Function& function = Function::Handle(
-      Resolver::ResolveDynamic(receiver, selector, args_desc));
+  const Function& function =
+      Function::Handle(Resolver::ResolveDynamic(receiver, selector, args_desc));
   if (function.IsNull()) {
     return ApiError::New(String::Handle(String::New("")));
   }
@@ -436,25 +427,22 @@
   Thread* thread = Thread::Current();
   ASSERT(thread->IsMutatorThread());
   ASSERT(thread->isolate() != NULL);
-  ASSERT(!FLAG_verify_handles ||
-         thread->IsValidLocalHandle(object) ||
+  ASSERT(!FLAG_verify_handles || thread->IsValidLocalHandle(object) ||
          Dart::IsReadOnlyApiHandle(object));
   ASSERT(FinalizablePersistentHandle::raw_offset() == 0 &&
-         PersistentHandle::raw_offset() == 0 &&
-         LocalHandle::raw_offset() == 0);
+         PersistentHandle::raw_offset() == 0 && LocalHandle::raw_offset() == 0);
 #endif
   return (reinterpret_cast<LocalHandle*>(object))->raw();
 }
 
 
 #define DEFINE_UNWRAP(type)                                                    \
-  const type& Api::Unwrap##type##Handle(Zone* zone,                            \
-                                        Dart_Handle dart_handle) {             \
+  const type& Api::Unwrap##type##Handle(Zone* zone, Dart_Handle dart_handle) { \
     const Object& obj = Object::Handle(zone, Api::UnwrapHandle(dart_handle));  \
     if (obj.Is##type()) {                                                      \
       return type::Cast(obj);                                                  \
     }                                                                          \
-    return type::Handle(zone  );                                               \
+    return type::Handle(zone);                                                 \
   }
 CLASS_LIST_FOR_HANDLES(DEFINE_UNWRAP)
 #undef DEFINE_UNWRAP
@@ -472,7 +460,8 @@
 
 
 const Instance& Api::UnwrapInstanceHandle(
-    const ReusableObjectHandleScope& reuse, Dart_Handle dart_handle) {
+    const ReusableObjectHandleScope& reuse,
+    Dart_Handle dart_handle) {
   Object& ref = reuse.Handle();
   ref = Api::UnwrapHandle(dart_handle);
   if (ref.IsInstance()) {
@@ -646,15 +635,15 @@
   NoSafepointScope no_safepoint_scope;
   RawObject* raw_obj = arguments->NativeArgAt(arg_index);
   if (raw_obj->IsHeapObject()) {
-      intptr_t cid = raw_obj->GetClassId();
-      if (cid == kBoolCid) {
-        *value = (raw_obj == Object::bool_true().raw());
-        return true;
-      }
-      if (cid == kNullCid) {
-        *value = false;
-        return true;
-      }
+    intptr_t cid = raw_obj->GetClassId();
+    if (cid == kBoolCid) {
+      *value = (raw_obj == Object::bool_true().raw());
+      return true;
+    }
+    if (cid == kNullCid) {
+      *value = false;
+      return true;
+    }
   }
   return false;
 }
@@ -717,8 +706,7 @@
       } else if (num_fields == Smi::Value(native_fields->ptr()->length_)) {
         intptr_t* native_values =
             bit_cast<intptr_t*, uint8_t*>(native_fields->ptr()->data());
-        memmove(field_values,
-                native_values,
+        memmove(field_values, native_values,
                 (num_fields * sizeof(field_values[0])));
       }
       return true;
@@ -751,7 +739,8 @@
 
 
 void FinalizablePersistentHandle::Finalize(
-    Isolate* isolate, FinalizablePersistentHandle* handle) {
+    Isolate* isolate,
+    FinalizablePersistentHandle* handle) {
   if (!handle->raw()->IsHeapObject()) {
     return;  // Free handle.
   }
@@ -884,8 +873,7 @@
 DART_EXPORT Dart_Handle Dart_PropagateError(Dart_Handle handle) {
   Thread* thread = Thread::Current();
   TransitionNativeToVM transition(thread);
-  const Object& obj = Object::Handle(thread->zone(),
-                                     Api::UnwrapHandle(handle));
+  const Object& obj = Object::Handle(thread->zone(), Api::UnwrapHandle(handle));
   if (!obj.IsError()) {
     return Api::NewError(
         "%s expects argument 'handle' to be an error handle.  "
@@ -921,8 +909,8 @@
                                          int line,
                                          const char* handle,
                                          const char* message) {
-  fprintf(stderr, "%s:%d: error handle: '%s':\n    '%s'\n",
-          file, line, handle, message);
+  fprintf(stderr, "%s:%d: error handle: '%s':\n    '%s'\n", file, line, handle,
+          message);
   OS::Abort();
 }
 
@@ -970,8 +958,8 @@
   }
 
   const Library& libcore = Library::Handle(Z, Library::CoreLibrary());
-  const String& function_name = String::Handle(Z,
-                                               String::New("identityHashCode"));
+  const String& function_name =
+      String::Handle(Z, String::New("identityHashCode"));
   const Function& function =
       Function::Handle(Z, libcore.LookupFunctionAllowPrivate(function_name));
   if (function.IsNull()) {
@@ -1003,8 +991,8 @@
 }
 
 
-DART_EXPORT Dart_Handle Dart_HandleFromPersistent(
-    Dart_PersistentHandle object) {
+DART_EXPORT Dart_Handle
+Dart_HandleFromPersistent(Dart_PersistentHandle object) {
   Thread* thread = Thread::Current();
   Isolate* isolate = thread->isolate();
   CHECK_ISOLATE(isolate);
@@ -1016,8 +1004,8 @@
 }
 
 
-DART_EXPORT Dart_Handle Dart_HandleFromWeakPersistent(
-    Dart_WeakPersistentHandle object) {
+DART_EXPORT Dart_Handle
+Dart_HandleFromWeakPersistent(Dart_WeakPersistentHandle object) {
   Thread* thread = Thread::Current();
   Isolate* isolate = thread->isolate();
   CHECK_ISOLATE(isolate);
@@ -1068,31 +1056,25 @@
     return NULL;
   }
   FinalizablePersistentHandle* finalizable_ref =
-      FinalizablePersistentHandle::New(thread->isolate(),
-                                       ref,
-                                       peer,
-                                       callback,
+      FinalizablePersistentHandle::New(thread->isolate(), ref, peer, callback,
                                        external_allocation_size);
   return finalizable_ref->apiHandle();
 }
 
 
-DART_EXPORT Dart_WeakPersistentHandle Dart_NewWeakPersistentHandle(
-    Dart_Handle object,
-    void* peer,
-    intptr_t external_allocation_size,
-    Dart_WeakPersistentHandleFinalizer callback) {
+DART_EXPORT Dart_WeakPersistentHandle
+Dart_NewWeakPersistentHandle(Dart_Handle object,
+                             void* peer,
+                             intptr_t external_allocation_size,
+                             Dart_WeakPersistentHandleFinalizer callback) {
   Thread* thread = Thread::Current();
   CHECK_ISOLATE(thread->isolate());
   if (callback == NULL) {
     return NULL;
   }
   TransitionNativeToVM transition(thread);
-  return AllocateFinalizableHandle(thread,
-                                   object,
-                                   peer,
-                                   external_allocation_size,
-                                   callback);
+  return AllocateFinalizableHandle(thread, object, peer,
+                                   external_allocation_size, callback);
 }
 
 
@@ -1128,9 +1110,9 @@
 
 // --- Garbage Collection Callbacks --
 
-DART_EXPORT Dart_Handle Dart_SetGcCallbacks(
-    Dart_GcPrologueCallback prologue_callback,
-    Dart_GcEpilogueCallback epilogue_callback) {
+DART_EXPORT Dart_Handle
+Dart_SetGcCallbacks(Dart_GcPrologueCallback prologue_callback,
+                    Dart_GcEpilogueCallback epilogue_callback) {
   Thread* thread = Thread::Current();
   Isolate* isolate = thread->isolate();
   CHECK_ISOLATE(isolate);
@@ -1177,27 +1159,23 @@
 
 DART_EXPORT char* Dart_Initialize(Dart_InitializeParams* params) {
   if (params == NULL) {
-    return strdup("Dart_Initialize: "
-                  "Dart_InitializeParams is null.");
+    return strdup(
+        "Dart_Initialize: "
+        "Dart_InitializeParams is null.");
   }
 
   if (params->version != DART_INITIALIZE_PARAMS_CURRENT_VERSION) {
-    return strdup("Dart_Initialize: "
-                  "Invalid Dart_InitializeParams version.");
+    return strdup(
+        "Dart_Initialize: "
+        "Invalid Dart_InitializeParams version.");
   }
 
   return Dart::InitOnce(params->vm_isolate_snapshot,
-                        params->instructions_snapshot,
-                        params->data_snapshot,
-                        params->create,
-                        params->shutdown,
-                        params->thread_exit,
-                        params->file_open,
-                        params->file_read,
-                        params->file_write,
-                        params->file_close,
-                        params->entropy_source,
-                        params->get_service_assets);
+                        params->instructions_snapshot, params->data_snapshot,
+                        params->create, params->shutdown, params->thread_exit,
+                        params->file_open, params->file_read,
+                        params->file_write, params->file_close,
+                        params->entropy_source, params->get_service_assets);
 }
 
 
@@ -1223,8 +1201,7 @@
 
 // --- Isolates ---
 
-static char* BuildIsolateName(const char* script_uri,
-                              const char* main) {
+static char* BuildIsolateName(const char* script_uri, const char* main) {
   if (script_uri == NULL) {
     // Just use the main as the name.
     if (main == NULL) {
@@ -1291,11 +1268,11 @@
     const Error& error_obj =
         Error::Handle(Z, Dart::InitializeIsolate(snapshot, callback_data));
     if (error_obj.IsNull()) {
-  #if defined(DART_NO_SNAPSHOT) && !defined(PRODUCT)
+#if defined(DART_NO_SNAPSHOT) && !defined(PRODUCT)
       if (FLAG_check_function_fingerprints) {
         Library::CheckFunctionFingerprints();
       }
-  #endif  // defined(DART_NO_SNAPSHOT) && !defined(PRODUCT).
+#endif  // defined(DART_NO_SNAPSHOT) && !defined(PRODUCT).
       // We exit the API scope entered above.
       Dart_ExitScope();
       // A Thread structure has been associated to the thread, we do the
@@ -1371,9 +1348,10 @@
   // TODO(16615): Validate isolate parameter.
   Isolate* iso = reinterpret_cast<Isolate*>(isolate);
   if (!Thread::EnterIsolate(iso)) {
-    FATAL("Unable to Enter Isolate : "
-          "Multiple mutators entering an isolate / "
-          "Dart VM is shutting down");
+    FATAL(
+        "Unable to Enter Isolate : "
+        "Multiple mutators entering an isolate / "
+        "Dart VM is shutting down");
   }
   // A Thread structure has been associated to the thread, we do the
   // safepoint transition explicity here instead of using the
@@ -1486,10 +1464,9 @@
   }
   if (!::Dart_IsUnhandledExceptionError(error) && !::Dart_IsNull(error)) {
     FATAL1("%s expects the error to be an unhandled exception error or null.",
-            CURRENT_FUNC);
+           CURRENT_FUNC);
   }
-  isolate->SetStickyError(
-      Api::UnwrapErrorHandle(Z, error).raw());
+  isolate->SetStickyError(Api::UnwrapErrorHandle(Z, error).raw());
 }
 
 
@@ -1508,8 +1485,7 @@
   CHECK_ISOLATE(I);
   NoSafepointScope no_safepoint_scope;
   if (I->sticky_error() != Error::null()) {
-    Dart_Handle error =
-        Api::NewHandle(T, I->sticky_error());
+    Dart_Handle error = Api::NewHandle(T, I->sticky_error());
     return error;
   }
   return Dart_Null();
@@ -1533,16 +1509,17 @@
 static uint8_t* ApiReallocate(uint8_t* ptr,
                               intptr_t old_size,
                               intptr_t new_size) {
-  return Api::TopScope(Thread::Current())->zone()->Realloc<uint8_t>(
-      ptr, old_size, new_size);
+  return Api::TopScope(Thread::Current())
+      ->zone()
+      ->Realloc<uint8_t>(ptr, old_size, new_size);
 }
 
 
-DART_EXPORT Dart_Handle Dart_CreateSnapshot(
-    uint8_t** vm_isolate_snapshot_buffer,
-    intptr_t* vm_isolate_snapshot_size,
-    uint8_t** isolate_snapshot_buffer,
-    intptr_t* isolate_snapshot_size) {
+DART_EXPORT Dart_Handle
+Dart_CreateSnapshot(uint8_t** vm_isolate_snapshot_buffer,
+                    intptr_t* vm_isolate_snapshot_size,
+                    uint8_t** isolate_snapshot_buffer,
+                    intptr_t* isolate_snapshot_size) {
   DARTSCOPE(Thread::Current());
   API_TIMELINE_DURATION;
   Isolate* I = T->isolate();
@@ -1550,8 +1527,7 @@
     return Api::NewError(
         "Creating full snapshots requires --load_deferred_eagerly");
   }
-  if (vm_isolate_snapshot_buffer != NULL &&
-      vm_isolate_snapshot_size == NULL) {
+  if (vm_isolate_snapshot_buffer != NULL && vm_isolate_snapshot_size == NULL) {
     RETURN_NULL_ERROR(vm_isolate_snapshot_size);
   }
   if (isolate_snapshot_buffer == NULL) {
@@ -1573,10 +1549,8 @@
   I->heap()->IterateObjects(&check_canonical);
 #endif  // #if defined(DEBUG)
 
-  FullSnapshotWriter writer(Snapshot::kCore,
-                            vm_isolate_snapshot_buffer,
-                            isolate_snapshot_buffer,
-                            ApiReallocate,
+  FullSnapshotWriter writer(Snapshot::kCore, vm_isolate_snapshot_buffer,
+                            isolate_snapshot_buffer, ApiReallocate,
                             NULL /* instructions_writer */);
   writer.WriteFullSnapshot();
   *vm_isolate_snapshot_size = writer.VmIsolateSnapshotSize();
@@ -1638,7 +1612,7 @@
 
 DART_EXPORT void Dart_InterruptIsolate(Dart_Isolate isolate) {
   if (isolate == NULL) {
-    FATAL1("%s expects argument 'isolate' to be non-null.",  CURRENT_FUNC);
+    FATAL1("%s expects argument 'isolate' to be non-null.", CURRENT_FUNC);
   }
   // TODO(16615): Validate isolate parameter.
   TransitionNativeToVM transition(Thread::Current());
@@ -1651,7 +1625,7 @@
   CHECK_NO_ISOLATE(Isolate::Current());
   API_TIMELINE_DURATION;
   if (isolate == NULL) {
-    FATAL1("%s expects argument 'isolate' to be non-null.",  CURRENT_FUNC);
+    FATAL1("%s expects argument 'isolate' to be non-null.", CURRENT_FUNC);
   }
   // TODO(16615): Validate isolate parameter.
   Isolate* iso = reinterpret_cast<Isolate*>(isolate);
@@ -1715,17 +1689,15 @@
     RunLoopData data;
     data.monitor = &monitor;
     data.done = false;
-    I->message_handler()->Run(
-        Dart::thread_pool(),
-        NULL, RunLoopDone, reinterpret_cast<uword>(&data));
+    I->message_handler()->Run(Dart::thread_pool(), NULL, RunLoopDone,
+                              reinterpret_cast<uword>(&data));
     while (!data.done) {
       ml.Wait();
     }
   }
   ::Dart_EnterIsolate(Api::CastIsolate(I));
   if (I->sticky_error() != Object::null()) {
-    Dart_Handle error =
-        Api::NewHandle(Thread::Current(), I->sticky_error());
+    Dart_Handle error = Api::NewHandle(Thread::Current(), I->sticky_error());
     I->clear_sticky_error();
     return error;
   }
@@ -1817,8 +1789,8 @@
   // Smis and null can be sent without serialization.
   RawObject* raw_obj = Api::UnwrapHandle(handle);
   if (ApiObjectConverter::CanConvert(raw_obj)) {
-    return PortMap::PostMessage(new Message(
-        port_id, raw_obj, Message::kNormalPriority));
+    return PortMap::PostMessage(
+        new Message(port_id, raw_obj, Message::kNormalPriority));
   }
 
   const Object& object = Object::Handle(Z, raw_obj);
@@ -1826,8 +1798,8 @@
   MessageWriter writer(&data, &allocator, false);
   writer.WriteMessage(object);
   intptr_t len = writer.BytesWritten();
-  return PortMap::PostMessage(new Message(
-      port_id, data, len, Message::kNormalPriority));
+  return PortMap::PostMessage(
+      new Message(port_id, data, len, Message::kNormalPriority));
 }
 
 
@@ -1835,8 +1807,7 @@
   DARTSCOPE(Thread::Current());
   CHECK_CALLBACK_STATE(T);
   if (port_id == ILLEGAL_PORT) {
-    return Api::NewError("%s: illegal port_id %" Pd64 ".",
-                         CURRENT_FUNC,
+    return Api::NewError("%s: illegal port_id %" Pd64 ".", CURRENT_FUNC,
                          port_id);
   }
   return Api::NewHandle(T, SendPort::New(port_id));
@@ -1880,8 +1851,7 @@
                                   thread->top_exit_frame_info());
     ASSERT(new_scope != NULL);
   } else {
-    new_scope->Reinit(thread,
-                      thread->api_top_scope(),
+    new_scope->Reinit(thread, thread->api_top_scope(),
                       thread->top_exit_frame_info());
     thread->set_api_reusable_scope(NULL);
   }
@@ -1940,14 +1910,14 @@
 }
 
 
-DART_EXPORT Dart_Handle Dart_ObjectEquals(Dart_Handle obj1, Dart_Handle obj2,
+DART_EXPORT Dart_Handle Dart_ObjectEquals(Dart_Handle obj1,
+                                          Dart_Handle obj2,
                                           bool* value) {
   DARTSCOPE(Thread::Current());
   CHECK_CALLBACK_STATE(T);
   const Instance& expected =
       Instance::CheckedHandle(Z, Api::UnwrapHandle(obj1));
-  const Instance& actual =
-      Instance::CheckedHandle(Z, Api::UnwrapHandle(obj2));
+  const Instance& actual = Instance::CheckedHandle(Z, Api::UnwrapHandle(obj2));
   const Object& result =
       Object::Handle(Z, DartLibraryCalls::Equals(expected, actual));
   if (result.IsBool()) {
@@ -1990,8 +1960,7 @@
   }
   CHECK_CALLBACK_STATE(T);
   Error& malformed_type_error = Error::Handle(Z);
-  *value = instance.IsInstanceOf(type_obj,
-                                 Object::null_type_arguments(),
+  *value = instance.IsInstanceOf(type_obj, Object::null_type_arguments(),
                                  &malformed_type_error);
   ASSERT(malformed_type_error.IsNull());  // Type was created from a class.
   return Api::Success();
@@ -2115,12 +2084,9 @@
     ASSERT(!future_class.IsNull());
     const Class& obj_class = Class::Handle(Z, obj.clazz());
     Error& malformed_type_error = Error::Handle(Z);
-    bool is_future = obj_class.IsSubtypeOf(Object::null_type_arguments(),
-                                           future_class,
-                                           Object::null_type_arguments(),
-                                           &malformed_type_error,
-                                           NULL,
-                                           Heap::kNew);
+    bool is_future = obj_class.IsSubtypeOf(
+        Object::null_type_arguments(), future_class,
+        Object::null_type_arguments(), &malformed_type_error, NULL, Heap::kNew);
     ASSERT(malformed_type_error.IsNull());  // Type is a raw Future.
     return is_future;
   }
@@ -2312,8 +2278,8 @@
   }
   Zone* scope_zone = Api::TopScope(Thread::Current())->zone();
   if (int_obj.IsSmi() || int_obj.IsMint()) {
-    const Bigint& bigint = Bigint::Handle(Z,
-        Bigint::NewFromInt64(int_obj.AsInt64Value()));
+    const Bigint& bigint =
+        Bigint::Handle(Z, Bigint::NewFromInt64(int_obj.AsInt64Value()));
     *value = bigint.ToHexCString(scope_zone);
   } else {
     *value = Bigint::Cast(int_obj).ToHexCString(scope_zone);
@@ -2443,11 +2409,11 @@
 }
 
 
-DART_EXPORT Dart_Handle Dart_NewExternalLatin1String(
-    const uint8_t* latin1_array,
-    intptr_t length,
-    void* peer,
-    Dart_PeerFinalizer cback) {
+DART_EXPORT Dart_Handle
+Dart_NewExternalLatin1String(const uint8_t* latin1_array,
+                             intptr_t length,
+                             void* peer,
+                             Dart_PeerFinalizer cback) {
   API_TIMELINE_DURATION;
   DARTSCOPE(Thread::Current());
   if (latin1_array == NULL && length != 0) {
@@ -2455,11 +2421,9 @@
   }
   CHECK_LENGTH(length, String::kMaxElements);
   CHECK_CALLBACK_STATE(T);
-  return Api::NewHandle(T, String::NewExternal(latin1_array,
-                                               length,
-                                               peer,
-                                               cback,
-                                               SpaceForExternal(T, length)));
+  return Api::NewHandle(T,
+                        String::NewExternal(latin1_array, length, peer, cback,
+                                            SpaceForExternal(T, length)));
 }
 
 
@@ -2474,10 +2438,7 @@
   CHECK_LENGTH(length, String::kMaxElements);
   CHECK_CALLBACK_STATE(T);
   intptr_t bytes = length * sizeof(*utf16_array);
-  return Api::NewHandle(T, String::NewExternal(utf16_array,
-                                               length,
-                                               peer,
-                                               cback,
+  return Api::NewHandle(T, String::NewExternal(utf16_array, length, peer, cback,
                                                SpaceForExternal(T, bytes)));
 }
 
@@ -2603,8 +2564,9 @@
                                                 Dart_PeerFinalizer cback) {
   DARTSCOPE(Thread::Current());
   if (!FLAG_support_externalizable_strings) {
-    return Api::NewError("Dart_MakeExternalString with "
-                         "--support_externalizable_strings=false");
+    return Api::NewError(
+        "Dart_MakeExternalString with "
+        "--support_externalizable_strings=false");
   }
   const String& str_obj = Api::UnwrapStringHandle(Z, str);
   if (str_obj.IsExternal()) {
@@ -2618,10 +2580,11 @@
   }
   intptr_t str_size = (str_obj.Length() * str_obj.CharSize());
   if ((external_size < str_size) || (external_size > String::kMaxElements)) {
-    return Api::NewError("Dart_MakeExternalString "
-                         "expects argument external_size to be in the range"
-                         "[%" Pd "..%" Pd "].",
-                         str_size, String::kMaxElements);
+    return Api::NewError(
+        "Dart_MakeExternalString "
+        "expects argument external_size to be in the range"
+        "[%" Pd "..%" Pd "].",
+        str_size, String::kMaxElements);
   }
   if (str_obj.InVMHeap()) {
     // Since the string object is read only we do not externalize
@@ -2648,8 +2611,8 @@
     }
     return str;
   }
-  return Api::NewHandle(T, str_obj.MakeExternal(array, external_size,
-                                                peer, cback));
+  return Api::NewHandle(
+      T, str_obj.MakeExternal(array, external_size, peer, cback));
 }
 
 
@@ -2691,7 +2654,7 @@
   type& array = type::Handle(zone);                                            \
   array ^= obj.raw();                                                          \
   *len = array.Length();                                                       \
-  return Api::Success();                                                       \
+  return Api::Success();
 
 
 DART_EXPORT Dart_Handle Dart_ListLength(Dart_Handle list, intptr_t* len) {
@@ -2733,7 +2696,7 @@
   const Array& args = Array::Handle(Z, Array::New(kNumArgs));
   args.SetAt(0, instance);  // Set up the receiver as the first argument.
   const Object& retval =
-    Object::Handle(Z, DartEntry::InvokeFunction(function, args));
+      Object::Handle(Z, DartEntry::InvokeFunction(function, args));
   if (retval.IsSmi()) {
     *len = Smi::Cast(retval).Value();
     return Api::Success();
@@ -2754,8 +2717,9 @@
         }
       }
     }
-    return Api::NewError("Length of List object is greater than the "
-                         "maximum value that 'len' parameter can hold");
+    return Api::NewError(
+        "Length of List object is greater than the "
+        "maximum value that 'len' parameter can hold");
   } else if (retval.IsError()) {
     return Api::NewHandle(T, retval.raw());
   } else {
@@ -2769,7 +2733,7 @@
   if ((index >= 0) && (index < array_obj.Length())) {                          \
     return Api::NewHandle(thread, array_obj.At(index));                        \
   }                                                                            \
-  return Api::NewError("Invalid index passed in to access list element");      \
+  return Api::NewError("Invalid index passed in to access list element");
 
 
 DART_EXPORT Dart_Handle Dart_ListGetAt(Dart_Handle list, intptr_t index) {
@@ -2786,10 +2750,9 @@
     // Check and handle a dart object that implements the List interface.
     const Instance& instance = Instance::Handle(Z, GetListInstance(Z, obj));
     if (!instance.IsNull()) {
-      return Api::NewHandle(T, Send1Arg(
-          instance,
-          Symbols::IndexToken(),
-          Instance::Handle(Z, Integer::New(index))));
+      return Api::NewHandle(T,
+                            Send1Arg(instance, Symbols::IndexToken(),
+                                     Instance::Handle(Z, Integer::New(index))));
     }
     return Api::NewError("Object does not implement the 'List' interface");
   }
@@ -2804,7 +2767,7 @@
     }                                                                          \
     return Api::Success();                                                     \
   }                                                                            \
-  return Api::NewError("Invalid offset/length passed in to access list");      \
+  return Api::NewError("Invalid offset/length passed in to access list");
 
 
 DART_EXPORT Dart_Handle Dart_ListGetRange(Dart_Handle list,
@@ -2830,10 +2793,9 @@
       const intptr_t kNumArgs = 2;
       ArgumentsDescriptor args_desc(
           Array::Handle(ArgumentsDescriptor::New(kNumArgs)));
-      const Function& function = Function::Handle(Z,
-          Resolver::ResolveDynamic(instance,
-                                   Symbols::AssignIndexToken(),
-                                   args_desc));
+      const Function& function = Function::Handle(
+          Z, Resolver::ResolveDynamic(instance, Symbols::AssignIndexToken(),
+                                      args_desc));
       if (!function.IsNull()) {
         const Array& args = Array::Handle(Array::New(kNumArgs));
         args.SetAt(0, instance);
@@ -2841,10 +2803,9 @@
         for (intptr_t i = 0; i < length; ++i) {
           index = Integer::New(i);
           args.SetAt(1, index);
-          Dart_Handle value = Api::NewHandle(
-              T, DartEntry::InvokeFunction(function, args));
-          if (::Dart_IsError(value))
-            return value;
+          Dart_Handle value =
+              Api::NewHandle(T, DartEntry::InvokeFunction(function, args));
+          if (::Dart_IsError(value)) return value;
           result[i] = value;
         }
         return Api::Success();
@@ -2865,7 +2826,7 @@
     array.SetAt(index, value_obj);                                             \
     return Api::Success();                                                     \
   }                                                                            \
-  return Api::NewError("Invalid index passed in to set list element");         \
+  return Api::NewError("Invalid index passed in to set list element");
 
 
 DART_EXPORT Dart_Handle Dart_ListSetAt(Dart_Handle list,
@@ -2890,10 +2851,9 @@
       const intptr_t kNumArgs = 3;
       ArgumentsDescriptor args_desc(
           Array::Handle(ArgumentsDescriptor::New(kNumArgs)));
-      const Function& function = Function::Handle(Z,
-          Resolver::ResolveDynamic(instance,
-                                   Symbols::AssignIndexToken(),
-                                   args_desc));
+      const Function& function = Function::Handle(
+          Z, Resolver::ResolveDynamic(instance, Symbols::AssignIndexToken(),
+                                      args_desc));
       if (!function.IsNull()) {
         const Integer& index_obj = Integer::Handle(Z, Integer::New(index));
         const Object& value_obj = Object::Handle(Z, Api::UnwrapHandle(value));
@@ -2904,8 +2864,7 @@
         args.SetAt(0, instance);
         args.SetAt(1, index_obj);
         args.SetAt(2, value_obj);
-        return Api::NewHandle(
-            T, DartEntry::InvokeFunction(function, args));
+        return Api::NewHandle(T, DartEntry::InvokeFunction(function, args));
       }
     }
     return Api::NewError("Object does not implement the 'List' interface");
@@ -2926,16 +2885,15 @@
   // Lookup the class ArgumentError in dart:core.
   const String& lib_url = String::Handle(String::New("dart:core"));
   const String& class_name = String::Handle(String::New("ArgumentError"));
-  const Library& lib = Library::Handle(zone,
-      Library::LookupLibrary(thread, lib_url));
+  const Library& lib =
+      Library::Handle(zone, Library::LookupLibrary(thread, lib_url));
   if (lib.IsNull()) {
-    const String& message = String::Handle(
-        String::NewFormatted("%s: library '%s' not found.",
-                             CURRENT_FUNC, lib_url.ToCString()));
+    const String& message = String::Handle(String::NewFormatted(
+        "%s: library '%s' not found.", CURRENT_FUNC, lib_url.ToCString()));
     return ApiError::New(message);
   }
-  const Class& cls = Class::Handle(
-      zone, lib.LookupClassAllowPrivate(class_name));
+  const Class& cls =
+      Class::Handle(zone, lib.LookupClassAllowPrivate(class_name));
   ASSERT(!cls.IsNull());
   Object& result = Object::Handle(zone);
   String& dot_name = String::Handle(String::New("."));
@@ -2964,7 +2922,7 @@
     // There are no dart frames on the stack so it would be illegal to
     // throw an exception here.
     const String& message = String::Handle(
-            String::New("No Dart frames on stack, cannot throw exception"));
+        String::New("No Dart frames on stack, cannot throw exception"));
     return ApiError::New(message);
   }
   // Unwind all the API scopes till the exit frame before throwing an
@@ -2977,8 +2935,8 @@
     saved_exception = &Instance::Handle(raw_exception);
   }
   Exceptions::Throw(thread, *saved_exception);
-  const String& message = String::Handle(
-          String::New("Exception was not thrown, internal error"));
+  const String& message =
+      String::Handle(String::New("Exception was not thrown, internal error"));
   return ApiError::New(message);
 }
 
@@ -2992,7 +2950,6 @@
       if (!element.IsInteger()) {                                              \
         return Api::NewHandle(                                                 \
             T, ThrowArgumentError("List contains non-int elements"));          \
-                                                                               \
       }                                                                        \
       const Integer& integer = Integer::Cast(element);                         \
       native_array[i] = static_cast<uint8_t>(integer.AsInt64Value() & 0xff);   \
@@ -3000,17 +2957,16 @@
     }                                                                          \
     return Api::Success();                                                     \
   }                                                                            \
-  return Api::NewError("Invalid length passed in to access array elements");   \
+  return Api::NewError("Invalid length passed in to access array elements");
 
-template<typename T>
+template <typename T>
 static Dart_Handle CopyBytes(const T& array,
                              intptr_t offset,
                              uint8_t* native_array,
                              intptr_t length) {
   ASSERT(array.ElementSizeInBytes() == 1);
   NoSafepointScope no_safepoint;
-  memmove(native_array,
-          reinterpret_cast<uint8_t*>(array.DataAddr(offset)),
+  memmove(native_array, reinterpret_cast<uint8_t*>(array.DataAddr(offset)),
           length);
   return Api::Success();
 }
@@ -3067,8 +3023,8 @@
     GET_LIST_ELEMENT_AS_BYTES(Array, obj, native_array, offset, length);
   }
   if (obj.IsGrowableObjectArray()) {
-    GET_LIST_ELEMENT_AS_BYTES(
-        GrowableObjectArray, obj, native_array, offset, length);
+    GET_LIST_ELEMENT_AS_BYTES(GrowableObjectArray, obj, native_array, offset,
+                              length);
   }
   if (obj.IsError()) {
     return list;
@@ -3076,13 +3032,13 @@
   CHECK_CALLBACK_STATE(T);
 
   // Check and handle a dart object that implements the List interface.
-  const Instance& instance =
-      Instance::Handle(Z, GetListInstance(Z, obj));
+  const Instance& instance = Instance::Handle(Z, GetListInstance(Z, obj));
   if (!instance.IsNull()) {
     const int kNumArgs = 2;
     ArgumentsDescriptor args_desc(
         Array::Handle(ArgumentsDescriptor::New(kNumArgs)));
-    const Function& function = Function::Handle(Z,
+    const Function& function = Function::Handle(
+        Z,
         Resolver::ResolveDynamic(instance, Symbols::IndexToken(), args_desc));
     if (!function.IsNull()) {
       Object& result = Object::Handle(Z);
@@ -3098,8 +3054,10 @@
           return Api::NewHandle(T, result.raw());
         }
         if (!result.IsInteger()) {
-          return Api::NewError("%s expects the argument 'list' to be "
-                               "a List of int", CURRENT_FUNC);
+          return Api::NewError(
+              "%s expects the argument 'list' to be "
+              "a List of int",
+              CURRENT_FUNC);
         }
         const Integer& integer_result = Integer::Cast(result);
         ASSERT(integer_result.AsInt64Value() <= 0xff);
@@ -3125,7 +3083,7 @@
     }                                                                          \
     return Api::Success();                                                     \
   }                                                                            \
-  return Api::NewError("Invalid length passed in to set array elements");      \
+  return Api::NewError("Invalid length passed in to set array elements");
 
 
 DART_EXPORT Dart_Handle Dart_ListSetAsBytes(Dart_Handle list,
@@ -3140,8 +3098,7 @@
       if (Utils::RangeCheck(offset, length, array.Length())) {
         NoSafepointScope no_safepoint;
         memmove(reinterpret_cast<uint8_t*>(array.DataAddr(offset)),
-                native_array,
-                length);
+                native_array, length);
         return Api::Success();
       }
       return Api::NewError("Invalid length passed in to access list elements");
@@ -3153,8 +3110,8 @@
     SET_LIST_ELEMENT_AS_BYTES(Array, obj, native_array, offset, length);
   }
   if (obj.IsGrowableObjectArray()) {
-    SET_LIST_ELEMENT_AS_BYTES(
-        GrowableObjectArray, obj, native_array, offset, length);
+    SET_LIST_ELEMENT_AS_BYTES(GrowableObjectArray, obj, native_array, offset,
+                              length);
   }
   if (obj.IsError()) {
     return list;
@@ -3167,10 +3124,9 @@
     const int kNumArgs = 3;
     ArgumentsDescriptor args_desc(
         Array::Handle(ArgumentsDescriptor::New(kNumArgs)));
-    const Function& function = Function::Handle(Z,
-        Resolver::ResolveDynamic(instance,
-                                 Symbols::AssignIndexToken(),
-                                 args_desc));
+    const Function& function = Function::Handle(
+        Z, Resolver::ResolveDynamic(instance, Symbols::AssignIndexToken(),
+                                    args_desc));
     if (!function.IsNull()) {
       Integer& indexobj = Integer::Handle(Z);
       Integer& valueobj = Integer::Handle(Z);
@@ -3181,8 +3137,8 @@
         valueobj = Integer::New(native_array[i]);
         args.SetAt(1, indexobj);
         args.SetAt(2, valueobj);
-        const Object& result = Object::Handle(Z,
-            DartEntry::InvokeFunction(function, args));
+        const Object& result =
+            Object::Handle(Z, DartEntry::InvokeFunction(function, args));
         if (result.IsError()) {
           return Api::NewHandle(T, result.raw());
         }
@@ -3223,10 +3179,9 @@
     if (!(key_obj.IsInstance() || key_obj.IsNull())) {
       return Api::NewError("Key is not an instance");
     }
-    return Api::NewHandle(T, Send1Arg(
-       instance,
-       String::Handle(Z, String::New("containsKey")),
-       Instance::Cast(key_obj)));
+    return Api::NewHandle(
+        T, Send1Arg(instance, String::Handle(Z, String::New("containsKey")),
+                    Instance::Cast(key_obj)));
   }
   return Api::NewError("Object does not implement the 'Map' interface");
 }
@@ -3238,14 +3193,13 @@
   Object& obj = Object::Handle(Z, Api::UnwrapHandle(map));
   Instance& instance = Instance::Handle(Z, GetMapInstance(Z, obj));
   if (!instance.IsNull()) {
-    const Object& iterator = Object::Handle(Send0Arg(
-        instance, String::Handle(Z, String::New("get:keys"))));
+    const Object& iterator = Object::Handle(
+        Send0Arg(instance, String::Handle(Z, String::New("get:keys"))));
     if (!iterator.IsInstance()) {
       return Api::NewHandle(T, iterator.raw());
     }
-    return Api::NewHandle(T, Send0Arg(
-        Instance::Cast(iterator),
-        String::Handle(String::New("toList"))));
+    return Api::NewHandle(T, Send0Arg(Instance::Cast(iterator),
+                                      String::Handle(String::New("toList"))));
   }
   return Api::NewError("Object does not implement the 'Map' interface");
 }
@@ -3257,67 +3211,67 @@
 static Dart_TypedData_Type GetType(intptr_t class_id) {
   Dart_TypedData_Type type;
   switch (class_id) {
-    case kByteDataViewCid :
+    case kByteDataViewCid:
       type = Dart_TypedData_kByteData;
       break;
-    case kTypedDataInt8ArrayCid :
-    case kTypedDataInt8ArrayViewCid :
-    case kExternalTypedDataInt8ArrayCid :
+    case kTypedDataInt8ArrayCid:
+    case kTypedDataInt8ArrayViewCid:
+    case kExternalTypedDataInt8ArrayCid:
       type = Dart_TypedData_kInt8;
       break;
-    case kTypedDataUint8ArrayCid :
-    case kTypedDataUint8ArrayViewCid :
-    case kExternalTypedDataUint8ArrayCid :
+    case kTypedDataUint8ArrayCid:
+    case kTypedDataUint8ArrayViewCid:
+    case kExternalTypedDataUint8ArrayCid:
       type = Dart_TypedData_kUint8;
       break;
-    case kTypedDataUint8ClampedArrayCid :
-    case kTypedDataUint8ClampedArrayViewCid :
-    case kExternalTypedDataUint8ClampedArrayCid :
+    case kTypedDataUint8ClampedArrayCid:
+    case kTypedDataUint8ClampedArrayViewCid:
+    case kExternalTypedDataUint8ClampedArrayCid:
       type = Dart_TypedData_kUint8Clamped;
       break;
-    case kTypedDataInt16ArrayCid :
-    case kTypedDataInt16ArrayViewCid :
-    case kExternalTypedDataInt16ArrayCid :
+    case kTypedDataInt16ArrayCid:
+    case kTypedDataInt16ArrayViewCid:
+    case kExternalTypedDataInt16ArrayCid:
       type = Dart_TypedData_kInt16;
       break;
-    case kTypedDataUint16ArrayCid :
-    case kTypedDataUint16ArrayViewCid :
-    case kExternalTypedDataUint16ArrayCid :
+    case kTypedDataUint16ArrayCid:
+    case kTypedDataUint16ArrayViewCid:
+    case kExternalTypedDataUint16ArrayCid:
       type = Dart_TypedData_kUint16;
       break;
-    case kTypedDataInt32ArrayCid :
-    case kTypedDataInt32ArrayViewCid :
-    case kExternalTypedDataInt32ArrayCid :
+    case kTypedDataInt32ArrayCid:
+    case kTypedDataInt32ArrayViewCid:
+    case kExternalTypedDataInt32ArrayCid:
       type = Dart_TypedData_kInt32;
       break;
-    case kTypedDataUint32ArrayCid :
-    case kTypedDataUint32ArrayViewCid :
-    case kExternalTypedDataUint32ArrayCid :
+    case kTypedDataUint32ArrayCid:
+    case kTypedDataUint32ArrayViewCid:
+    case kExternalTypedDataUint32ArrayCid:
       type = Dart_TypedData_kUint32;
       break;
-    case kTypedDataInt64ArrayCid :
-    case kTypedDataInt64ArrayViewCid :
-    case kExternalTypedDataInt64ArrayCid :
+    case kTypedDataInt64ArrayCid:
+    case kTypedDataInt64ArrayViewCid:
+    case kExternalTypedDataInt64ArrayCid:
       type = Dart_TypedData_kInt64;
       break;
-    case kTypedDataUint64ArrayCid :
-    case kTypedDataUint64ArrayViewCid :
-    case kExternalTypedDataUint64ArrayCid :
+    case kTypedDataUint64ArrayCid:
+    case kTypedDataUint64ArrayViewCid:
+    case kExternalTypedDataUint64ArrayCid:
       type = Dart_TypedData_kUint64;
       break;
-    case kTypedDataFloat32ArrayCid :
-    case kTypedDataFloat32ArrayViewCid :
-    case kExternalTypedDataFloat32ArrayCid :
+    case kTypedDataFloat32ArrayCid:
+    case kTypedDataFloat32ArrayViewCid:
+    case kExternalTypedDataFloat32ArrayCid:
       type = Dart_TypedData_kFloat32;
       break;
-    case kTypedDataFloat64ArrayCid :
-    case kTypedDataFloat64ArrayViewCid :
-    case kExternalTypedDataFloat64ArrayCid :
+    case kTypedDataFloat64ArrayCid:
+    case kTypedDataFloat64ArrayViewCid:
+    case kExternalTypedDataFloat64ArrayCid:
       type = Dart_TypedData_kFloat64;
       break;
-    case kTypedDataFloat32x4ArrayCid :
-    case kTypedDataFloat32x4ArrayViewCid :
-    case kExternalTypedDataFloat32x4ArrayCid :
+    case kTypedDataFloat32x4ArrayCid:
+    case kTypedDataFloat32x4ArrayViewCid:
+    case kExternalTypedDataFloat32x4ArrayCid:
       type = Dart_TypedData_kFloat32x4;
       break;
     default:
@@ -3339,8 +3293,8 @@
 }
 
 
-DART_EXPORT Dart_TypedData_Type Dart_GetTypeOfExternalTypedData(
-    Dart_Handle object) {
+DART_EXPORT Dart_TypedData_Type
+Dart_GetTypeOfExternalTypedData(Dart_Handle object) {
   API_TIMELINE_DURATION;
   intptr_t class_id = Api::ClassId(object);
   if (RawObject::IsExternalTypedDataClassId(class_id)) {
@@ -3370,11 +3324,8 @@
   const Class& cls = Class::Handle(
       thread->zone(), lib.LookupClassAllowPrivate(Symbols::ByteData()));
   ASSERT(!cls.IsNull());
-  return ResolveConstructor(CURRENT_FUNC,
-                            cls,
-                            Symbols::ByteData(),
-                            constructor_name,
-                            num_args);
+  return ResolveConstructor(CURRENT_FUNC, cls, Symbols::ByteData(),
+                            constructor_name, num_args);
 }
 
 
@@ -3401,31 +3352,29 @@
 }
 
 
-static Dart_Handle NewTypedData(Thread* thread,
-                                intptr_t cid,
-                                intptr_t length) {
+static Dart_Handle NewTypedData(Thread* thread, intptr_t cid, intptr_t length) {
   CHECK_LENGTH(length, TypedData::MaxElements(cid));
   return Api::NewHandle(thread, TypedData::New(cid, length));
 }
 
 
-static Dart_Handle NewExternalTypedData(
-    Thread* thread, intptr_t cid, void* data, intptr_t length) {
+static Dart_Handle NewExternalTypedData(Thread* thread,
+                                        intptr_t cid,
+                                        void* data,
+                                        intptr_t length) {
   CHECK_LENGTH(length, ExternalTypedData::MaxElements(cid));
   Zone* zone = thread->zone();
   intptr_t bytes = length * ExternalTypedData::ElementSizeInBytes(cid);
   const ExternalTypedData& result = ExternalTypedData::Handle(
-      zone,
-      ExternalTypedData::New(cid,
-                             reinterpret_cast<uint8_t*>(data),
-                             length,
-                             SpaceForExternal(thread, bytes)));
+      zone, ExternalTypedData::New(cid, reinterpret_cast<uint8_t*>(data),
+                                   length, SpaceForExternal(thread, bytes)));
   return Api::NewHandle(thread, result.raw());
 }
 
 
-static Dart_Handle NewExternalByteData(
-    Thread* thread, void* data, intptr_t length) {
+static Dart_Handle NewExternalByteData(Thread* thread,
+                                       void* data,
+                                       intptr_t length) {
   Zone* zone = thread->zone();
   Dart_Handle ext_data = NewExternalTypedData(
       thread, kExternalTypedDataUint8ArrayCid, data, length);
@@ -3465,29 +3414,29 @@
   DARTSCOPE(Thread::Current());
   CHECK_CALLBACK_STATE(T);
   switch (type) {
-    case Dart_TypedData_kByteData :
+    case Dart_TypedData_kByteData:
       return NewByteData(T, length);
-    case Dart_TypedData_kInt8 :
+    case Dart_TypedData_kInt8:
       return NewTypedData(T, kTypedDataInt8ArrayCid, length);
-    case Dart_TypedData_kUint8 :
+    case Dart_TypedData_kUint8:
       return NewTypedData(T, kTypedDataUint8ArrayCid, length);
-    case Dart_TypedData_kUint8Clamped :
+    case Dart_TypedData_kUint8Clamped:
       return NewTypedData(T, kTypedDataUint8ClampedArrayCid, length);
-    case Dart_TypedData_kInt16 :
+    case Dart_TypedData_kInt16:
       return NewTypedData(T, kTypedDataInt16ArrayCid, length);
-    case Dart_TypedData_kUint16 :
+    case Dart_TypedData_kUint16:
       return NewTypedData(T, kTypedDataUint16ArrayCid, length);
-    case Dart_TypedData_kInt32 :
+    case Dart_TypedData_kInt32:
       return NewTypedData(T, kTypedDataInt32ArrayCid, length);
-    case Dart_TypedData_kUint32 :
+    case Dart_TypedData_kUint32:
       return NewTypedData(T, kTypedDataUint32ArrayCid, length);
-    case Dart_TypedData_kInt64 :
+    case Dart_TypedData_kInt64:
       return NewTypedData(T, kTypedDataInt64ArrayCid, length);
-    case Dart_TypedData_kUint64 :
+    case Dart_TypedData_kUint64:
       return NewTypedData(T, kTypedDataUint64ArrayCid, length);
-    case Dart_TypedData_kFloat32 :
-      return NewTypedData(T, kTypedDataFloat32ArrayCid,  length);
-    case Dart_TypedData_kFloat64 :
+    case Dart_TypedData_kFloat32:
+      return NewTypedData(T, kTypedDataFloat32ArrayCid, length);
+    case Dart_TypedData_kFloat64:
       return NewTypedData(T, kTypedDataFloat64ArrayCid, length);
     case Dart_TypedData_kFloat32x4:
       return NewTypedData(T, kTypedDataFloat32x4ArrayCid, length);
@@ -3500,10 +3449,9 @@
 }
 
 
-DART_EXPORT Dart_Handle Dart_NewExternalTypedData(
-    Dart_TypedData_Type type,
-    void* data,
-    intptr_t length) {
+DART_EXPORT Dart_Handle Dart_NewExternalTypedData(Dart_TypedData_Type type,
+                                                  void* data,
+                                                  intptr_t length) {
   DARTSCOPE(Thread::Current());
   if (data == NULL && length != 0) {
     RETURN_NULL_ERROR(data);
@@ -3513,44 +3461,46 @@
     case Dart_TypedData_kByteData:
       return NewExternalByteData(T, data, length);
     case Dart_TypedData_kInt8:
-      return NewExternalTypedData(
-          T, kExternalTypedDataInt8ArrayCid, data, length);
+      return NewExternalTypedData(T, kExternalTypedDataInt8ArrayCid, data,
+                                  length);
     case Dart_TypedData_kUint8:
-      return NewExternalTypedData(
-          T, kExternalTypedDataUint8ArrayCid, data, length);
+      return NewExternalTypedData(T, kExternalTypedDataUint8ArrayCid, data,
+                                  length);
     case Dart_TypedData_kUint8Clamped:
-      return NewExternalTypedData(
-          T, kExternalTypedDataUint8ClampedArrayCid, data, length);
+      return NewExternalTypedData(T, kExternalTypedDataUint8ClampedArrayCid,
+                                  data, length);
     case Dart_TypedData_kInt16:
-      return NewExternalTypedData(
-          T, kExternalTypedDataInt16ArrayCid, data, length);
+      return NewExternalTypedData(T, kExternalTypedDataInt16ArrayCid, data,
+                                  length);
     case Dart_TypedData_kUint16:
-      return NewExternalTypedData(
-          T, kExternalTypedDataUint16ArrayCid, data, length);
+      return NewExternalTypedData(T, kExternalTypedDataUint16ArrayCid, data,
+                                  length);
     case Dart_TypedData_kInt32:
-      return NewExternalTypedData(
-          T, kExternalTypedDataInt32ArrayCid, data, length);
+      return NewExternalTypedData(T, kExternalTypedDataInt32ArrayCid, data,
+                                  length);
     case Dart_TypedData_kUint32:
-      return NewExternalTypedData(
-          T, kExternalTypedDataUint32ArrayCid, data, length);
+      return NewExternalTypedData(T, kExternalTypedDataUint32ArrayCid, data,
+                                  length);
     case Dart_TypedData_kInt64:
-      return NewExternalTypedData(
-          T, kExternalTypedDataInt64ArrayCid, data, length);
+      return NewExternalTypedData(T, kExternalTypedDataInt64ArrayCid, data,
+                                  length);
     case Dart_TypedData_kUint64:
-      return NewExternalTypedData(
-          T, kExternalTypedDataUint64ArrayCid, data, length);
+      return NewExternalTypedData(T, kExternalTypedDataUint64ArrayCid, data,
+                                  length);
     case Dart_TypedData_kFloat32:
-      return NewExternalTypedData(
-          T, kExternalTypedDataFloat32ArrayCid, data, length);
+      return NewExternalTypedData(T, kExternalTypedDataFloat32ArrayCid, data,
+                                  length);
     case Dart_TypedData_kFloat64:
-      return NewExternalTypedData(
-          T, kExternalTypedDataFloat64ArrayCid, data, length);
+      return NewExternalTypedData(T, kExternalTypedDataFloat64ArrayCid, data,
+                                  length);
     case Dart_TypedData_kFloat32x4:
-      return NewExternalTypedData(
-          T, kExternalTypedDataFloat32x4ArrayCid, data, length);
+      return NewExternalTypedData(T, kExternalTypedDataFloat32x4ArrayCid, data,
+                                  length);
     default:
-      return Api::NewError("%s expects argument 'type' to be of"
-                           " 'external TypedData'", CURRENT_FUNC);
+      return Api::NewError(
+          "%s expects argument 'type' to be of"
+          " 'external TypedData'",
+          CURRENT_FUNC);
   }
   UNREACHABLE();
   return Api::Null();
@@ -3564,13 +3514,10 @@
   const Library& lib =
       Library::Handle(thread->isolate()->object_store()->typed_data_library());
   ASSERT(!lib.IsNull());
-  const Class& cls = Class::Handle(
-      thread->zone(), lib.LookupClassAllowPrivate(class_name));
+  const Class& cls =
+      Class::Handle(thread->zone(), lib.LookupClassAllowPrivate(class_name));
   ASSERT(!cls.IsNull());
-  return ResolveConstructor(CURRENT_FUNC,
-                            cls,
-                            class_name,
-                            constructor_name,
+  return ResolveConstructor(CURRENT_FUNC, cls, class_name, constructor_name,
                             num_args);
 }
 
@@ -3584,10 +3531,8 @@
     RETURN_TYPE_ERROR(Z, typed_data, 'TypedData');
   }
   Object& result = Object::Handle(Z);
-  result = GetByteBufferConstructor(T,
-                                    Symbols::ByteBuffer(),
-                                    Symbols::ByteBufferDot_New(),
-                                    1);
+  result = GetByteBufferConstructor(T, Symbols::ByteBuffer(),
+                                    Symbols::ByteBufferDot_New(), 1);
   ASSERT(!result.IsNull());
   ASSERT(result.IsFunction());
   const Function& factory = Function::Cast(result);
@@ -3795,12 +3740,9 @@
       // the lookup, it can be confusing to the user to figure out
       // what's going on.  Be a little more explicit for these error
       // messages.
-      const String& message = String::Handle(
-          String::NewFormatted(
-              "%s: could not find factory '%s' in class '%s'.",
-              current_func,
-              constr_name.ToCString(),
-              lookup_class_name.ToCString()));
+      const String& message = String::Handle(String::NewFormatted(
+          "%s: could not find factory '%s' in class '%s'.", current_func,
+          constr_name.ToCString(), lookup_class_name.ToCString()));
       return ApiError::New(message);
     } else {
       const String& message = String::Handle(
@@ -3811,15 +3753,12 @@
   }
   int extra_args = 1;
   String& error_message = String::Handle();
-  if (!constructor.AreValidArgumentCounts(num_args + extra_args,
-                                          0,
+  if (!constructor.AreValidArgumentCounts(num_args + extra_args, 0,
                                           &error_message)) {
-    const String& message = String::Handle(
-        String::NewFormatted("%s: wrong argument count for "
-                             "constructor '%s': %s.",
-                             current_func,
-                             constr_name.ToCString(),
-                             error_message.ToCString()));
+    const String& message = String::Handle(String::NewFormatted(
+        "%s: wrong argument count for "
+        "constructor '%s': %s.",
+        current_func, constr_name.ToCString(), error_message.ToCString()));
     return ApiError::New(message);
   }
   return constructor.raw();
@@ -3872,11 +3811,8 @@
   // Resolve the constructor.
   String& constr_name =
       String::Handle(String::Concat(base_constructor_name, dot_name));
-  result = ResolveConstructor("Dart_New",
-                              cls,
-                              base_constructor_name,
-                              constr_name,
-                              number_of_arguments);
+  result = ResolveConstructor("Dart_New", cls, base_constructor_name,
+                              constr_name, number_of_arguments);
   if (result.IsError()) {
     return Api::NewHandle(T, result.raw());
   }
@@ -3898,9 +3834,8 @@
       // The type arguments of the redirection type are instantiated from the
       // type arguments of the type argument.
       Error& bound_error = Error::Handle();
-      redirect_type ^= redirect_type.InstantiateFrom(type_arguments,
-                                                     &bound_error,
-                                                     NULL, NULL, Heap::kNew);
+      redirect_type ^= redirect_type.InstantiateFrom(
+          type_arguments, &bound_error, NULL, NULL, Heap::kNew);
       if (!bound_error.IsNull()) {
         return Api::NewHandle(T, bound_error.raw());
       }
@@ -3948,8 +3883,8 @@
         return Api::NewHandle(T, argument.raw());
       } else {
         return Api::NewError(
-            "%s expects arguments[%d] to be an Instance handle.",
-            CURRENT_FUNC, i);
+            "%s expects arguments[%d] to be an Instance handle.", CURRENT_FUNC,
+            i);
       }
     }
     args.SetAt(arg_index++, argument);
@@ -4022,10 +3957,10 @@
 }
 
 
-DART_EXPORT Dart_Handle Dart_AllocateWithNativeFields(
-    Dart_Handle type,
-    intptr_t num_native_fields,
-    const intptr_t* native_fields) {
+DART_EXPORT Dart_Handle
+Dart_AllocateWithNativeFields(Dart_Handle type,
+                              intptr_t num_native_fields,
+                              const intptr_t* native_fields) {
   DARTSCOPE(Thread::Current());
   CHECK_CALLBACK_STATE(T);
 
@@ -4076,8 +4011,8 @@
         return Api::NewHandle(thread, arg.raw());
       } else {
         return Api::NewError(
-            "%s expects arguments[%d] to be an Instance handle.",
-            "Dart_Invoke", i);
+            "%s expects arguments[%d] to be an Instance handle.", "Dart_Invoke",
+            i);
       }
     }
     args->SetAt((i + extra_args), arg);
@@ -4128,10 +4063,8 @@
   const Function& constructor =
       Function::Handle(Z, cls.LookupFunctionAllowPrivate(dot_name));
   const int extra_args = 1;
-  if (!constructor.IsNull() &&
-      constructor.IsGenerativeConstructor() &&
-      constructor.AreValidArgumentCounts(number_of_arguments + extra_args,
-                                         0,
+  if (!constructor.IsNull() && constructor.IsGenerativeConstructor() &&
+      constructor.AreValidArgumentCounts(number_of_arguments + extra_args, 0,
                                          NULL)) {
     // Create the argument list.
     // Constructors get the uninitialized object.
@@ -4144,12 +4077,12 @@
     }
     Dart_Handle result;
     Array& args = Array::Handle(Z);
-    result = SetupArguments(
-        T, number_of_arguments, arguments, extra_args, &args);
+    result =
+        SetupArguments(T, number_of_arguments, arguments, extra_args, &args);
     if (!::Dart_IsError(result)) {
       args.SetAt(0, instance);
-      const Object& retval = Object::Handle(Z,
-          DartEntry::InvokeFunction(constructor, args));
+      const Object& retval =
+          Object::Handle(Z, DartEntry::InvokeFunction(constructor, args));
       if (retval.IsError()) {
         result = Api::NewHandle(T, retval.raw());
       } else {
@@ -4158,9 +4091,8 @@
     }
     return result;
   }
-  return Api::NewError(
-      "%s expects argument 'name' to be a valid constructor.",
-      CURRENT_FUNC);
+  return Api::NewError("%s expects argument 'name' to be a valid constructor.",
+                       CURRENT_FUNC);
 }
 
 
@@ -4195,27 +4127,23 @@
     }
 
     const Class& cls = Class::Handle(Z, Type::Cast(obj).type_class());
-    const Function& function = Function::Handle(Z,
-        Resolver::ResolveStaticAllowPrivate(cls,
-                                            function_name,
-                                            number_of_arguments,
-                                            Object::empty_array()));
+    const Function& function = Function::Handle(
+        Z, Resolver::ResolveStaticAllowPrivate(
+               cls, function_name, number_of_arguments, Object::empty_array()));
     if (function.IsNull()) {
       const String& cls_name = String::Handle(Z, cls.Name());
       return Api::NewError("%s: did not find static method '%s.%s'.",
-                           CURRENT_FUNC,
-                           cls_name.ToCString(),
+                           CURRENT_FUNC, cls_name.ToCString(),
                            function_name.ToCString());
     }
-    NOT_IN_PRODUCT(if (tds.enabled()) {
+#if !defined(PRODUCT)
+    if (tds.enabled()) {
       const String& cls_name = String::Handle(Z, cls.Name());
       tds.SetNumArguments(1);
-      tds.FormatArgument(0,
-                         "name",
-                         "%s.%s",
-                         cls_name.ToCString(),
+      tds.FormatArgument(0, "name", "%s.%s", cls_name.ToCString(),
                          function_name.ToCString());
-    });
+    }
+#endif  // !defined(PRODUCT)
     // Setup args and check for malformed arguments in the arguments list.
     result = SetupArguments(T, number_of_arguments, arguments, 0, &args);
     if (!::Dart_IsError(result)) {
@@ -4230,38 +4158,31 @@
     instance ^= obj.raw();
     ArgumentsDescriptor args_desc(
         Array::Handle(Z, ArgumentsDescriptor::New(number_of_arguments + 1)));
-    const Function& function = Function::Handle(Z,
-        Resolver::ResolveDynamic(instance, function_name, args_desc));
+    const Function& function = Function::Handle(
+        Z, Resolver::ResolveDynamic(instance, function_name, args_desc));
     if (function.IsNull()) {
       // Setup args and check for malformed arguments in the arguments list.
-      result = SetupArguments(T,
-                              number_of_arguments,
-                              arguments,
-                              1,
-                              &args);
+      result = SetupArguments(T, number_of_arguments, arguments, 1, &args);
       if (!::Dart_IsError(result)) {
         args.SetAt(0, instance);
         const Array& args_descriptor =
-          Array::Handle(Z, ArgumentsDescriptor::New(args.Length()));
-        result = Api::NewHandle(T,
-                                DartEntry::InvokeNoSuchMethod(instance,
-                                                              function_name,
-                                                              args,
-                                                              args_descriptor));
+            Array::Handle(Z, ArgumentsDescriptor::New(args.Length()));
+        result = Api::NewHandle(
+            T, DartEntry::InvokeNoSuchMethod(instance, function_name, args,
+                                             args_descriptor));
       }
       return result;
     }
-    NOT_IN_PRODUCT(if (tds.enabled()) {
+#if !defined(PRODUCT)
+    if (tds.enabled()) {
       const Class& cls = Class::Handle(Z, instance.clazz());
       ASSERT(!cls.IsNull());
       const String& cls_name = String::Handle(Z, cls.Name());
       tds.SetNumArguments(1);
-      tds.FormatArgument(0,
-                         "name",
-                         "%s.%s",
-                         cls_name.ToCString(),
+      tds.FormatArgument(0, "name", "%s.%s", cls_name.ToCString(),
                          function_name.ToCString());
-    });
+    }
+#endif  // !defined(PRODUCT)
     // Setup args and check for malformed arguments in the arguments list.
     result = SetupArguments(T, number_of_arguments, arguments, 1, &args);
     if (!::Dart_IsError(result)) {
@@ -4275,38 +4196,33 @@
 
     // Check that the library is loaded.
     if (!lib.Loaded()) {
-      return Api::NewError(
-          "%s expects library argument 'target' to be loaded.",
-          CURRENT_FUNC);
+      return Api::NewError("%s expects library argument 'target' to be loaded.",
+                           CURRENT_FUNC);
     }
 
     const Function& function =
         Function::Handle(Z, lib.LookupFunctionAllowPrivate(function_name));
     if (function.IsNull()) {
       return Api::NewError("%s: did not find top-level function '%s'.",
-                           CURRENT_FUNC,
-                           function_name.ToCString());
+                           CURRENT_FUNC, function_name.ToCString());
     }
 
-    NOT_IN_PRODUCT(if (tds.enabled()) {
+#if !defined(PRODUCT)
+    if (tds.enabled()) {
       const String& lib_name = String::Handle(Z, lib.url());
       tds.SetNumArguments(1);
-      tds.FormatArgument(0,
-                         "name",
-                         "%s.%s",
-                         lib_name.ToCString(),
+      tds.FormatArgument(0, "name", "%s.%s", lib_name.ToCString(),
                          function_name.ToCString());
-    });
+    }
+#endif  // !defined(PRODUCT)
 
     // LookupFunctionAllowPrivate does not check argument arity, so we
     // do it here.
     String& error_message = String::Handle(Z);
-    if (!function.AreValidArgumentCounts(number_of_arguments,
-                                         0,
+    if (!function.AreValidArgumentCounts(number_of_arguments, 0,
                                          &error_message)) {
       return Api::NewError("%s: wrong argument count for function '%s': %s.",
-                           CURRENT_FUNC,
-                           function_name.ToCString(),
+                           CURRENT_FUNC, function_name.ToCString(),
                            error_message.ToCString());
     }
     // Setup args and check for malformed arguments in the arguments list.
@@ -4388,14 +4304,14 @@
       getter = cls.LookupStaticFunctionAllowPrivate(getter_name);
     }
 
-    NOT_IN_PRODUCT(if (tds.enabled()) {
+#if !defined(PRODUCT)
+    if (tds.enabled()) {
       const String& cls_name = String::Handle(cls.Name());
       tds.SetNumArguments(1);
-      tds.FormatArgument(0,
-                         "name",
-                         "%s.%s",
-                         cls_name.ToCString(), field_name.ToCString());
-    });
+      tds.FormatArgument(0, "name", "%s.%s", cls_name.ToCString(),
+                         field_name.ToCString());
+    }
+#endif  // !defined(PRODUCT)
 
     if (!getter.IsNull()) {
       // Invoke the getter and return the result.
@@ -4404,8 +4320,8 @@
     } else if (!field.IsNull()) {
       return Api::NewHandle(T, field.StaticValue());
     } else {
-      return Api::NewError("%s: did not find static field '%s'.",
-                           CURRENT_FUNC, field_name.ToCString());
+      return Api::NewError("%s: did not find static field '%s'.", CURRENT_FUNC,
+                           field_name.ToCString());
     }
 
   } else if (obj.IsInstance()) {
@@ -4423,14 +4339,14 @@
       cls = cls.SuperClass();
     }
 
-    NOT_IN_PRODUCT(if (tds.enabled()) {
+#if !defined(PRODUCT)
+    if (tds.enabled()) {
       const String& cls_name = String::Handle(cls.Name());
       tds.SetNumArguments(1);
-      tds.FormatArgument(0,
-                         "name",
-                         "%s.%s",
-                         cls_name.ToCString(), field_name.ToCString());
-    });
+      tds.FormatArgument(0, "name", "%s.%s", cls_name.ToCString(),
+                         field_name.ToCString());
+    }
+#endif  // !defined(PRODUCT)
 
     // Invoke the getter and return the result.
     const int kNumArgs = 1;
@@ -4439,10 +4355,9 @@
     if (getter.IsNull()) {
       const Array& args_descriptor =
           Array::Handle(Z, ArgumentsDescriptor::New(args.Length()));
-      return Api::NewHandle(T, DartEntry::InvokeNoSuchMethod(instance,
-                                                             getter_name,
-                                                             args,
-                                                             args_descriptor));
+      return Api::NewHandle(
+          T, DartEntry::InvokeNoSuchMethod(instance, getter_name, args,
+                                           args_descriptor));
     }
     return Api::NewHandle(T, DartEntry::InvokeFunction(getter, args));
 
@@ -4466,19 +4381,19 @@
     } else if (!field.IsNull() && field.IsUninitialized()) {
       // A field was found.  Check for a getter in the field's owner classs.
       const Class& cls = Class::Handle(Z, field.Owner());
-      const String& getter_name = String::Handle(Z,
-          Field::GetterName(field_name));
+      const String& getter_name =
+          String::Handle(Z, Field::GetterName(field_name));
       getter = cls.LookupStaticFunctionAllowPrivate(getter_name);
     }
 
-    NOT_IN_PRODUCT(if (tds.enabled()) {
+#if !defined(PRODUCT)
+    if (tds.enabled()) {
       const String& lib_name = String::Handle(lib.url());
       tds.SetNumArguments(1);
-      tds.FormatArgument(0,
-                         "name",
-                         "%s.%s",
-                         lib_name.ToCString(), field_name.ToCString());
-    });
+      tds.FormatArgument(0, "name", "%s.%s", lib_name.ToCString(),
+                         field_name.ToCString());
+    }
+#endif  // !defined(PRODUCT)
 
     if (!getter.IsNull()) {
       // Invoke the getter and return the result.
@@ -4492,7 +4407,7 @@
                          CURRENT_FUNC, field_name.ToCString());
 
   } else if (obj.IsError()) {
-      return container;
+    return container;
   } else {
     return Api::NewError(
         "%s expects argument 'container' to be an object, type, or library.",
@@ -4549,8 +4464,8 @@
       const int kNumArgs = 1;
       const Array& args = Array::Handle(Z, Array::New(kNumArgs));
       args.SetAt(0, value_instance);
-      const Object& result = Object::Handle(Z,
-          DartEntry::InvokeFunction(setter, args));
+      const Object& result =
+          Object::Handle(Z, DartEntry::InvokeFunction(setter, args));
       if (result.IsError()) {
         return Api::NewHandle(T, result.raw());
       } else {
@@ -4558,15 +4473,15 @@
       }
     } else if (!field.IsNull()) {
       if (field.is_final()) {
-        return Api::NewError("%s: cannot set final field '%s'.",
-                             CURRENT_FUNC, field_name.ToCString());
+        return Api::NewError("%s: cannot set final field '%s'.", CURRENT_FUNC,
+                             field_name.ToCString());
       } else {
         field.SetStaticValue(value_instance);
         return Api::Success();
       }
     } else {
-      return Api::NewError("%s: did not find static field '%s'.",
-                           CURRENT_FUNC, field_name.ToCString());
+      return Api::NewError("%s: did not find static field '%s'.", CURRENT_FUNC,
+                           field_name.ToCString());
     }
 
   } else if (obj.IsInstance()) {
@@ -4579,8 +4494,8 @@
     while (!cls.IsNull()) {
       field = cls.LookupInstanceFieldAllowPrivate(field_name);
       if (!field.IsNull() && field.is_final()) {
-        return Api::NewError("%s: cannot set final field '%s'.",
-                             CURRENT_FUNC, field_name.ToCString());
+        return Api::NewError("%s: cannot set final field '%s'.", CURRENT_FUNC,
+                             field_name.ToCString());
       }
       setter = cls.LookupDynamicFunctionAllowPrivate(setter_name);
       if (!setter.IsNull()) {
@@ -4597,10 +4512,9 @@
     if (setter.IsNull()) {
       const Array& args_descriptor =
           Array::Handle(Z, ArgumentsDescriptor::New(args.Length()));
-      return Api::NewHandle(T, DartEntry::InvokeNoSuchMethod(instance,
-                                                             setter_name,
-                                                             args,
-                                                             args_descriptor));
+      return Api::NewHandle(
+          T, DartEntry::InvokeNoSuchMethod(instance, setter_name, args,
+                                           args_descriptor));
     }
     return Api::NewHandle(T, DartEntry::InvokeFunction(setter, args));
 
@@ -4753,8 +4667,8 @@
   CHECK_CALLBACK_STATE(T);
 
   String& cls_symbol = String::Handle(Z, Symbols::New(T, cls_name));
-  const Class& cls = Class::Handle(Z,
-      Class::NewNativeWrapper(lib, cls_symbol, field_count));
+  const Class& cls =
+      Class::Handle(Z, Class::NewNativeWrapper(lib, cls_symbol, field_count));
   if (cls.IsNull()) {
     return Api::NewError(
         "Unable to create native wrapper class : already exists");
@@ -4835,28 +4749,29 @@
   }
   for (int i = 0; i < num_arguments; i++) {
     Dart_NativeArgument_Descriptor desc = argument_descriptors[i];
-    Dart_NativeArgument_Type arg_type = static_cast<Dart_NativeArgument_Type>(
-        desc.type);
+    Dart_NativeArgument_Type arg_type =
+        static_cast<Dart_NativeArgument_Type>(desc.type);
     int arg_index = desc.index;
     ASSERT(arg_index >= 0 && arg_index < arguments->NativeArgCount());
     Dart_NativeArgument_Value* native_value = &(arg_values[i]);
     switch (arg_type) {
       case Dart_NativeArgument_kBool:
-        if (!Api::GetNativeBooleanArgument(arguments,
-                                           arg_index,
+        if (!Api::GetNativeBooleanArgument(arguments, arg_index,
                                            &(native_value->as_bool))) {
-          return Api::NewError("%s: expects argument at index %d to be of"
-                               " type Boolean.", CURRENT_FUNC, i);
+          return Api::NewError(
+              "%s: expects argument at index %d to be of"
+              " type Boolean.",
+              CURRENT_FUNC, i);
         }
         break;
 
       case Dart_NativeArgument_kInt32: {
         int64_t value = 0;
-        if (!GetNativeIntegerArgument(arguments,
-                                      arg_index,
-                                      &value)) {
-          return Api::NewError("%s: expects argument at index %d to be of"
-                               " type Integer.", CURRENT_FUNC, i);
+        if (!GetNativeIntegerArgument(arguments, arg_index, &value)) {
+          return Api::NewError(
+              "%s: expects argument at index %d to be of"
+              " type Integer.",
+              CURRENT_FUNC, i);
         }
         if (value < INT_MIN || value > INT_MAX) {
           return Api::NewError("%s: argument value at index %d is out of range",
@@ -4868,11 +4783,11 @@
 
       case Dart_NativeArgument_kUint32: {
         int64_t value = 0;
-        if (!GetNativeIntegerArgument(arguments,
-                                      arg_index,
-                                      &value)) {
-          return Api::NewError("%s: expects argument at index %d to be of"
-                               " type Integer.", CURRENT_FUNC, i);
+        if (!GetNativeIntegerArgument(arguments, arg_index, &value)) {
+          return Api::NewError(
+              "%s: expects argument at index %d to be of"
+              " type Integer.",
+              CURRENT_FUNC, i);
         }
         if (value < 0 || value > UINT_MAX) {
           return Api::NewError("%s: argument value at index %d is out of range",
@@ -4884,11 +4799,11 @@
 
       case Dart_NativeArgument_kInt64: {
         int64_t value = 0;
-        if (!GetNativeIntegerArgument(arguments,
-                                      arg_index,
-                                      &value)) {
-          return Api::NewError("%s: expects argument at index %d to be of"
-                               " type Integer.", CURRENT_FUNC, i);
+        if (!GetNativeIntegerArgument(arguments, arg_index, &value)) {
+          return Api::NewError(
+              "%s: expects argument at index %d to be of"
+              " type Integer.",
+              CURRENT_FUNC, i);
         }
         native_value->as_int64 = value;
         break;
@@ -4896,42 +4811,41 @@
 
       case Dart_NativeArgument_kUint64: {
         uint64_t value = 0;
-        if (!GetNativeUnsignedIntegerArgument(arguments,
-                                              arg_index,
-                                              &value)) {
-          return Api::NewError("%s: expects argument at index %d to be of"
-                               " type Integer.", CURRENT_FUNC, i);
+        if (!GetNativeUnsignedIntegerArgument(arguments, arg_index, &value)) {
+          return Api::NewError(
+              "%s: expects argument at index %d to be of"
+              " type Integer.",
+              CURRENT_FUNC, i);
         }
         native_value->as_uint64 = value;
         break;
       }
 
       case Dart_NativeArgument_kDouble:
-        if (!GetNativeDoubleArgument(arguments,
-                                     arg_index,
+        if (!GetNativeDoubleArgument(arguments, arg_index,
                                      &(native_value->as_double))) {
-          return Api::NewError("%s: expects argument at index %d to be of"
-                               " type Double.", CURRENT_FUNC, i);
+          return Api::NewError(
+              "%s: expects argument at index %d to be of"
+              " type Double.",
+              CURRENT_FUNC, i);
         }
         break;
 
       case Dart_NativeArgument_kString:
-        if (!GetNativeStringArgument(arguments,
-                                     arg_index,
+        if (!GetNativeStringArgument(arguments, arg_index,
                                      &(native_value->as_string.dart_str),
                                      &(native_value->as_string.peer))) {
-          return Api::NewError("%s: expects argument at index %d to be of"
-                               " type String.", CURRENT_FUNC, i);
+          return Api::NewError(
+              "%s: expects argument at index %d to be of"
+              " type String.",
+              CURRENT_FUNC, i);
         }
         break;
 
       case Dart_NativeArgument_kNativeFields: {
         Dart_Handle result = GetNativeFieldsOfArgument(
-            arguments,
-            arg_index,
-            native_value->as_native_fields.num_fields,
-            native_value->as_native_fields.values,
-            CURRENT_FUNC);
+            arguments, arg_index, native_value->as_native_fields.num_fields,
+            native_value->as_native_fields.values, CURRENT_FUNC);
         if (result != Api::Success()) {
           return result;
         }
@@ -4947,8 +4861,8 @@
       }
 
       default:
-        return Api::NewError("%s: invalid argument type %d.",
-                             CURRENT_FUNC, arg_type);
+        return Api::NewError("%s: invalid argument type %d.", CURRENT_FUNC,
+                             arg_type);
     }
   }
   return Api::Success();
@@ -4963,8 +4877,7 @@
         "%s: argument 'index' out of range. Expected 0..%d but saw %d.",
         CURRENT_FUNC, arguments->NativeArgCount() - 1, index);
   }
-  return Api::NewHandle(arguments->thread(),
-                        arguments->NativeArgAt(index));
+  return Api::NewHandle(arguments->thread(), arguments->NativeArgAt(index));
 }
 
 
@@ -4974,11 +4887,11 @@
 }
 
 
-DART_EXPORT Dart_Handle Dart_GetNativeFieldsOfArgument(
-    Dart_NativeArguments args,
-    int arg_index,
-    int num_fields,
-    intptr_t* field_values) {
+DART_EXPORT Dart_Handle
+Dart_GetNativeFieldsOfArgument(Dart_NativeArguments args,
+                               int arg_index,
+                               int num_fields,
+                               intptr_t* field_values) {
   NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
   if ((arg_index < 0) || (arg_index >= arguments->NativeArgCount())) {
     return Api::NewError(
@@ -4988,11 +4901,8 @@
   if (field_values == NULL) {
     RETURN_NULL_ERROR(field_values);
   }
-  return GetNativeFieldsOfArgument(arguments,
-                                   arg_index,
-                                   num_fields,
-                                   field_values,
-                                   CURRENT_FUNC);
+  return GetNativeFieldsOfArgument(arguments, arg_index, num_fields,
+                                   field_values, CURRENT_FUNC);
 }
 
 
@@ -5006,8 +4916,10 @@
   if (Api::GetNativeReceiver(arguments, value)) {
     return Api::Success();
   }
-  return Api::NewError("%s expects receiver argument to be non-null and of"
-                       " type Instance.", CURRENT_FUNC);
+  return Api::NewError(
+      "%s expects receiver argument to be non-null and of"
+      " type Instance.",
+      CURRENT_FUNC);
 }
 
 
@@ -5017,8 +4929,10 @@
   NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
   Dart_Handle result = Api::Null();
   if (!GetNativeStringArgument(arguments, arg_index, &result, peer)) {
-    return Api::NewError("%s expects argument at %d to be of"
-                         " type String.", CURRENT_FUNC, arg_index);
+    return Api::NewError(
+        "%s expects argument at %d to be of"
+        " type String.",
+        CURRENT_FUNC, arg_index);
   }
   return result;
 }
@@ -5034,8 +4948,10 @@
         CURRENT_FUNC, arguments->NativeArgCount() - 1, index);
   }
   if (!GetNativeIntegerArgument(arguments, index, value)) {
-    return Api::NewError("%s: expects argument at %d to be of"
-                         " type Integer.", CURRENT_FUNC, index);
+    return Api::NewError(
+        "%s: expects argument at %d to be of"
+        " type Integer.",
+        CURRENT_FUNC, index);
   }
   return Api::Success();
 }
@@ -5068,8 +4984,10 @@
         CURRENT_FUNC, arguments->NativeArgCount() - 1, index);
   }
   if (!GetNativeDoubleArgument(arguments, index, value)) {
-    return Api::NewError("%s: expects argument at %d to be of"
-                         " type Double.", CURRENT_FUNC, index);
+    return Api::NewError(
+        "%s: expects argument at %d to be of"
+        " type Double.",
+        CURRENT_FUNC, index);
   }
   return Api::Success();
 }
@@ -5079,8 +4997,7 @@
                                      Dart_Handle retval) {
   NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
   ASSERT(arguments->thread()->isolate() == Isolate::Current());
-  if ((retval != Api::Null()) &&
-      !Api::IsInstance(retval) &&
+  if ((retval != Api::Null()) && !Api::IsInstance(retval) &&
       !Api::IsError(retval)) {
     // Print the current stack trace to make the problematic caller
     // easier to find.
@@ -5088,8 +5005,10 @@
     OS::PrintErr("=== Current Trace:\n%s===\n", stacktrace.ToCString());
 
     const Object& ret_obj = Object::Handle(Api::UnwrapHandle(retval));
-    FATAL1("Return value check failed: saw '%s' expected a dart Instance or "
-           "an Error.", ret_obj.ToCString());
+    FATAL1(
+        "Return value check failed: saw '%s' expected a dart Instance or "
+        "an Error.",
+        ret_obj.ToCString());
   }
   ASSERT(retval != 0);
   Api::SetReturnValue(arguments, retval);
@@ -5167,8 +5086,8 @@
     if (::Dart_IsString(response)) {
       result ^= Api::UnwrapHandle(response);
     } else if (::Dart_IsError(response)) {
-      const Object& error = Object::Handle(
-          thread->zone(), Api::UnwrapHandle(response));
+      const Object& error =
+          Object::Handle(thread->zone(), Api::UnwrapHandle(response));
       Exceptions::ThrowArgumentError(
           String::Handle(String::New(Error::Cast(error).ToErrorCString())));
     } else if (!::Dart_IsNull(response)) {
@@ -5181,8 +5100,8 @@
 }
 
 
-DART_EXPORT Dart_Handle Dart_SetEnvironmentCallback(
-    Dart_EnvironmentCallback callback) {
+DART_EXPORT Dart_Handle
+Dart_SetEnvironmentCallback(Dart_EnvironmentCallback callback) {
   Isolate* isolate = Isolate::Current();
   CHECK_ISOLATE(isolate);
   isolate->set_environment_callback(callback);
@@ -5224,8 +5143,8 @@
 
 // --- Scripts and Libraries ---
 
-DART_EXPORT Dart_Handle Dart_SetLibraryTagHandler(
-    Dart_LibraryTagHandler handler) {
+DART_EXPORT Dart_Handle
+Dart_SetLibraryTagHandler(Dart_LibraryTagHandler handler) {
   Isolate* isolate = Isolate::Current();
   CHECK_ISOLATE(isolate);
   isolate->set_library_tag_handler(handler);
@@ -5250,8 +5169,8 @@
 
   const char* resolved_uri;
   if (!ResolveUri(uri.ToCString(), base_uri.ToCString(), &resolved_uri)) {
-    return Api::NewError("%s: Unable to canonicalize uri '%s'.",
-                         CURRENT_FUNC, uri.ToCString());
+    return Api::NewError("%s: Unable to canonicalize uri '%s'.", CURRENT_FUNC,
+                         uri.ToCString());
   }
   return Api::NewHandle(T, String::New(resolved_uri));
 }
@@ -5353,12 +5272,16 @@
 
   const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer);
   if (snapshot == NULL) {
-    return Api::NewError("%s expects parameter 'buffer' to be a script type"
-                         " snapshot with a valid length.", CURRENT_FUNC);
+    return Api::NewError(
+        "%s expects parameter 'buffer' to be a script type"
+        " snapshot with a valid length.",
+        CURRENT_FUNC);
   }
   if (snapshot->kind() != Snapshot::kScript) {
-    return Api::NewError("%s expects parameter 'buffer' to be a script type"
-                         " snapshot.", CURRENT_FUNC);
+    return Api::NewError(
+        "%s expects parameter 'buffer' to be a script type"
+        " snapshot.",
+        CURRENT_FUNC);
   }
   if (snapshot->length() != buffer_len) {
     return Api::NewError("%s: 'buffer_len' of %" Pd " is not equal to %" Pd
@@ -5375,20 +5298,22 @@
   CHECK_COMPILATION_ALLOWED(I);
 
   ASSERT(snapshot->kind() == Snapshot::kScript);
-  NOT_IN_PRODUCT(TimelineDurationScope tds2(T,
-      Timeline::GetIsolateStream(), "ScriptSnapshotReader"));
+  NOT_IN_PRODUCT(TimelineDurationScope tds2(T, Timeline::GetIsolateStream(),
+                                            "ScriptSnapshotReader"));
 
   ScriptSnapshotReader reader(snapshot->content(), snapshot->length(), T);
   const Object& tmp = Object::Handle(Z, reader.ReadScriptSnapshot());
   if (tmp.IsError()) {
     return Api::NewHandle(T, tmp.raw());
   }
-  NOT_IN_PRODUCT(if (tds2.enabled()) {
+#if !defined(PRODUCT)
+  if (tds2.enabled()) {
     tds2.SetNumArguments(2);
     tds2.FormatArgument(0, "snapshotSize", "%" Pd, snapshot->length());
     tds2.FormatArgument(1, "heapSize", "%" Pd64,
                         I->heap()->UsedInWords(Heap::kOld) * kWordSize);
-  });
+  }
+#endif  // !defined(PRODUCT)
   library ^= tmp.raw();
   library.set_debuggable(true);
   I->object_store()->set_root_library(library);
@@ -5486,9 +5411,8 @@
     RETURN_TYPE_ERROR(Z, library, Library);
   }
   if (!lib.Loaded()) {
-    return Api::NewError(
-        "%s expects library argument 'library' to be loaded.",
-        CURRENT_FUNC);
+    return Api::NewError("%s expects library argument 'library' to be loaded.",
+                         CURRENT_FUNC);
   }
   const String& name_str = Api::UnwrapStringHandle(Z, class_name);
   if (name_str.IsNull()) {
@@ -5502,8 +5426,10 @@
   }
   if (cls.NumTypeArguments() == 0) {
     if (number_of_type_arguments != 0) {
-      return Api::NewError("Invalid number of type arguments specified, "
-                           "got %" Pd " expected 0", number_of_type_arguments);
+      return Api::NewError(
+          "Invalid number of type arguments specified, "
+          "got %" Pd " expected 0",
+          number_of_type_arguments);
     }
     return Api::NewHandle(T, Type::NewNonParameterizedType(cls));
   }
@@ -5514,20 +5440,20 @@
       RETURN_NULL_ERROR(type_arguments);
     }
     if (num_expected_type_arguments != number_of_type_arguments) {
-      return Api::NewError("Invalid number of type arguments specified, "
-                           "got %" Pd " expected %" Pd,
-                           number_of_type_arguments,
-                           num_expected_type_arguments);
+      return Api::NewError(
+          "Invalid number of type arguments specified, "
+          "got %" Pd " expected %" Pd,
+          number_of_type_arguments, num_expected_type_arguments);
     }
     const Array& array = Api::UnwrapArrayHandle(Z, *type_arguments);
     if (array.IsNull()) {
       RETURN_TYPE_ERROR(Z, *type_arguments, Array);
     }
     if (array.Length() != num_expected_type_arguments) {
-      return Api::NewError("Invalid type arguments specified, expected an "
-                           "array of len %" Pd " but got an array of len %" Pd,
-                           number_of_type_arguments,
-                           array.Length());
+      return Api::NewError(
+          "Invalid type arguments specified, expected an "
+          "array of len %" Pd " but got an array of len %" Pd,
+          number_of_type_arguments, array.Length());
     }
     // Set up the type arguments array.
     type_args_obj ^= TypeArguments::New(num_expected_type_arguments);
@@ -5539,8 +5465,8 @@
   }
 
   // Construct the type object, canonicalize it and return.
-  Type& instantiated_type = Type::Handle(
-      Type::New(cls, type_args_obj, TokenPosition::kNoSource));
+  Type& instantiated_type =
+      Type::Handle(Type::New(cls, type_args_obj, TokenPosition::kNoSource));
   instantiated_type ^= ClassFinalizer::FinalizeType(
       cls, instantiated_type, ClassFinalizer::kCanonicalize);
   return Api::NewHandle(T, instantiated_type.raw());
@@ -5565,11 +5491,11 @@
   if (url_str.IsNull()) {
     RETURN_TYPE_ERROR(Z, url, String);
   }
-  const Library& library = Library::Handle(Z,
-      Library::LookupLibrary(T, url_str));
+  const Library& library =
+      Library::Handle(Z, Library::LookupLibrary(T, url_str));
   if (library.IsNull()) {
-    return Api::NewError("%s: library '%s' not found.",
-                         CURRENT_FUNC, url_str.ToCString());
+    return Api::NewError("%s: library '%s' not found.", CURRENT_FUNC,
+                         url_str.ToCString());
   } else {
     return Api::NewHandle(T, library.raw());
   }
@@ -5593,7 +5519,7 @@
 
   const GrowableObjectArray& pending_deferred_loads =
       GrowableObjectArray::Handle(Z,
-          I->object_store()->pending_deferred_loads());
+                                  I->object_store()->pending_deferred_loads());
   for (intptr_t i = 0; i < pending_deferred_loads.Length(); i++) {
     if (pending_deferred_loads.At(i) == lib.raw()) {
       lib.SetLoadError(err);
@@ -5644,9 +5570,8 @@
   if (library.IsNull()) {
     library = Library::New(url_str);
     library.Register(T);
-  } else if (library.LoadInProgress() ||
-      library.Loaded() ||
-      library.LoadFailed()) {
+  } else if (library.LoadInProgress() || library.Loaded() ||
+             library.LoadFailed()) {
     // The source for this library has either been loaded or is in the
     // process of loading.  Return an error.
     return Api::NewError("%s: library '%s' has already been loaded.",
@@ -5689,9 +5614,8 @@
     RETURN_TYPE_ERROR(Z, import, Library);
   }
   const Object& prefix_object = Object::Handle(Z, Api::UnwrapHandle(prefix));
-  const String& prefix_vm = prefix_object.IsNull()
-      ? Symbols::Empty()
-      : String::Cast(prefix_object);
+  const String& prefix_vm =
+      prefix_object.IsNull() ? Symbols::Empty() : String::Cast(prefix_object);
   if (prefix_vm.IsNull()) {
     RETURN_TYPE_ERROR(Z, prefix, String);
   }
@@ -5699,8 +5623,8 @@
   CHECK_COMPILATION_ALLOWED(I);
 
   const String& prefix_symbol = String::Handle(Z, Symbols::New(T, prefix_vm));
-  const Namespace& import_ns = Namespace::Handle(Z,
-      Namespace::New(import_vm, Object::null_array(), Object::null_array()));
+  const Namespace& import_ns = Namespace::Handle(
+      Z, Namespace::New(import_vm, Object::null_array(), Object::null_array()));
   if (prefix_vm.Length() == 0) {
     library_vm.AddImport(import_ns);
   } else {
@@ -5828,9 +5752,8 @@
 
   NoHeapGrowthControlScope no_growth_control;
 
-  const Script& script =
-      Script::Handle(Z, Script::New(url_str, url_str, source_str,
-                                    RawScript::kPatchTag));
+  const Script& script = Script::Handle(
+      Z, Script::New(url_str, url_str, source_str, RawScript::kPatchTag));
   Dart_Handle result;
   CompileSource(T, lib, script, &result);
   return result;
@@ -5867,21 +5790,23 @@
     I->debugger()->NotifyDoneLoading();
   }
 
+#if !defined(PRODUCT)
   if (FLAG_enable_mirrors) {
     // Notify mirrors that MirrorSystem.libraries needs to be recomputed.
     const Library& libmirrors = Library::Handle(Z, Library::MirrorsLibrary());
-    const Field& dirty_bit = Field::Handle(Z,
-        libmirrors.LookupLocalField(String::Handle(String::New("dirty"))));
+    const Field& dirty_bit = Field::Handle(
+        Z, libmirrors.LookupLocalField(String::Handle(String::New("dirty"))));
     ASSERT(!dirty_bit.IsNull() && dirty_bit.is_static());
     dirty_bit.SetStaticValue(Bool::True());
   }
+#endif
 
   if (complete_futures) {
     const Library& corelib = Library::Handle(Z, Library::CoreLibrary());
     const String& function_name =
         String::Handle(Z, String::New("_completeDeferredLoads"));
-    const Function& function = Function::Handle(Z,
-        corelib.LookupFunctionAllowPrivate(function_name));
+    const Function& function =
+        Function::Handle(Z, corelib.LookupFunctionAllowPrivate(function_name));
     ASSERT(!function.IsNull());
     const Array& args = Array::empty_array();
 
@@ -5896,10 +5821,10 @@
 }
 
 
-DART_EXPORT Dart_Handle Dart_SetNativeResolver(
-    Dart_Handle library,
-    Dart_NativeEntryResolver resolver,
-    Dart_NativeEntrySymbol symbol) {
+DART_EXPORT Dart_Handle
+Dart_SetNativeResolver(Dart_Handle library,
+                       Dart_NativeEntryResolver resolver,
+                       Dart_NativeEntrySymbol symbol) {
   DARTSCOPE(Thread::Current());
   const Library& lib = Api::UnwrapLibraryHandle(Z, library);
   if (lib.IsNull()) {
@@ -6006,8 +5931,8 @@
 }
 
 
-DART_EXPORT Dart_Handle Dart_SetFileModifiedCallback(
-    Dart_FileModifiedCallback file_mod_callback) {
+DART_EXPORT Dart_Handle
+Dart_SetFileModifiedCallback(Dart_FileModifiedCallback file_mod_callback) {
   return Api::Success();
 }
 
@@ -6039,7 +5964,7 @@
                                     const char** argument_values) {
   return;
 }
-#else  // defined(PRODUCT)
+#else   // defined(PRODUCT)
 DART_EXPORT void Dart_RegisterIsolateServiceRequestCallback(
     const char* name,
     Dart_ServiceRequestCallback callback,
@@ -6118,14 +6043,13 @@
     return Api::NewError("%s expects argument 'bytes_length' to be >= 0.",
                          CURRENT_FUNC);
   }
-  Service::SendEmbedderEvent(I, stream_id, event_kind,
-                             bytes, bytes_length);
+  Service::SendEmbedderEvent(I, stream_id, event_kind, bytes, bytes_length);
   return Api::Success();
 }
 
 
-DART_EXPORT Dart_Handle Dart_SetFileModifiedCallback(
-    Dart_FileModifiedCallback file_modified_callback) {
+DART_EXPORT Dart_Handle
+Dart_SetFileModifiedCallback(Dart_FileModifiedCallback file_modified_callback) {
   if (!FLAG_support_service) {
     return Api::Success();
   }
@@ -6155,8 +6079,7 @@
   const bool api_enabled = (stream_mask & DART_TIMELINE_STREAM_API) != 0;
   const bool compiler_enabled =
       (stream_mask & DART_TIMELINE_STREAM_COMPILER) != 0;
-  const bool dart_enabled =
-      (stream_mask & DART_TIMELINE_STREAM_DART) != 0;
+  const bool dart_enabled = (stream_mask & DART_TIMELINE_STREAM_DART) != 0;
   const bool debugger_enabled =
       (stream_mask & DART_TIMELINE_STREAM_DEBUGGER) != 0;
   const bool embedder_enabled =
@@ -6164,8 +6087,7 @@
   const bool gc_enabled = (stream_mask & DART_TIMELINE_STREAM_GC) != 0;
   const bool isolate_enabled =
       (stream_mask & DART_TIMELINE_STREAM_ISOLATE) != 0;
-  const bool vm_enabled =
-      (stream_mask & DART_TIMELINE_STREAM_VM) != 0;
+  const bool vm_enabled = (stream_mask & DART_TIMELINE_STREAM_VM) != 0;
   Timeline::SetStreamAPIEnabled(api_enabled);
   Timeline::SetStreamCompilerEnabled(compiler_enabled);
   Timeline::SetStreamDartEnabled(dart_enabled);
@@ -6181,11 +6103,7 @@
                                   void* user_data,
                                   const char* stream_name) {
   // Start stream.
-  consumer(Dart_StreamConsumer_kStart,
-           stream_name,
-           NULL,
-           0,
-           user_data);
+  consumer(Dart_StreamConsumer_kStart, stream_name, NULL, 0, user_data);
 }
 
 
@@ -6193,11 +6111,7 @@
                                    void* user_data,
                                    const char* stream_name) {
   // Finish stream.
-  consumer(Dart_StreamConsumer_kFinish,
-           stream_name,
-           NULL,
-           0,
-           user_data);
+  consumer(Dart_StreamConsumer_kFinish, stream_name, NULL, 0, user_data);
 }
 
 
@@ -6213,20 +6127,16 @@
   intptr_t cursor = 0;
   intptr_t remaining = output_length;
   while (remaining >= kDataSize) {
-    consumer(Dart_StreamConsumer_kData,
-             stream_name,
-             reinterpret_cast<const uint8_t*>(&output[cursor]),
-             kDataSize,
+    consumer(Dart_StreamConsumer_kData, stream_name,
+             reinterpret_cast<const uint8_t*>(&output[cursor]), kDataSize,
              user_data);
     cursor += kDataSize;
     remaining -= kDataSize;
   }
   if (remaining > 0) {
     ASSERT(remaining < kDataSize);
-    consumer(Dart_StreamConsumer_kData,
-             stream_name,
-             reinterpret_cast<const uint8_t*>(&output[cursor]),
-             remaining,
+    consumer(Dart_StreamConsumer_kData, stream_name,
+             reinterpret_cast<const uint8_t*>(&output[cursor]), remaining,
              user_data);
     cursor += remaining;
     remaining -= remaining;
@@ -6259,11 +6169,7 @@
   // We are skipping the '['.
   output_length -= 1;
 
-  DataStreamToConsumer(consumer,
-                       user_data,
-                       start,
-                       output_length,
-                       "timeline");
+  DataStreamToConsumer(consumer, user_data, start, output_length, "timeline");
 
   // We stole the JSONStream's output buffer, free it.
   free(output);
@@ -6340,28 +6246,28 @@
   switch (type) {
     case Dart_Timeline_Event_Begin:
       event->Begin(label, timestamp0);
-    break;
+      break;
     case Dart_Timeline_Event_End:
       event->End(label, timestamp0);
-    break;
+      break;
     case Dart_Timeline_Event_Instant:
       event->Instant(label, timestamp0);
-    break;
+      break;
     case Dart_Timeline_Event_Duration:
       event->Duration(label, timestamp0, timestamp1_or_async_id);
-    break;
+      break;
     case Dart_Timeline_Event_Async_Begin:
       event->AsyncBegin(label, timestamp1_or_async_id, timestamp0);
-    break;
+      break;
     case Dart_Timeline_Event_Async_End:
       event->AsyncEnd(label, timestamp1_or_async_id, timestamp0);
-    break;
+      break;
     case Dart_Timeline_Event_Async_Instant:
       event->AsyncInstant(label, timestamp1_or_async_id, timestamp0);
-    break;
+      break;
     case Dart_Timeline_Event_Counter:
       event->Counter(label, timestamp0);
-    break;
+      break;
     default:
       FATAL("Unknown Dart_Timeline_Event_Type");
   }
@@ -6389,40 +6295,38 @@
 // excluded from dart and dart_precompiled_runtime.
 #if !defined(DART_PRECOMPILER)
 
-DART_EXPORT Dart_Handle Dart_Precompile(
-    Dart_QualifiedFunctionName entry_points[],
-    bool reset_fields) {
+DART_EXPORT Dart_Handle
+Dart_Precompile(Dart_QualifiedFunctionName entry_points[], bool reset_fields) {
   UNREACHABLE();
   return 0;
 }
 
 
-DART_EXPORT Dart_Handle Dart_CreatePrecompiledSnapshotAssembly(
-    uint8_t** assembly_buffer,
-    intptr_t* assembly_size) {
+DART_EXPORT Dart_Handle
+Dart_CreatePrecompiledSnapshotAssembly(uint8_t** assembly_buffer,
+                                       intptr_t* assembly_size) {
   UNREACHABLE();
   return 0;
 }
 
 
-DART_EXPORT Dart_Handle Dart_CreatePrecompiledSnapshotBlob(
-    uint8_t** vm_isolate_snapshot_buffer,
-    intptr_t* vm_isolate_snapshot_size,
-    uint8_t** isolate_snapshot_buffer,
-    intptr_t* isolate_snapshot_size,
-    uint8_t** instructions_blob_buffer,
-    intptr_t* instructions_blob_size,
-    uint8_t** rodata_blob_buffer,
-    intptr_t* rodata_blob_size) {
+DART_EXPORT Dart_Handle
+Dart_CreatePrecompiledSnapshotBlob(uint8_t** vm_isolate_snapshot_buffer,
+                                   intptr_t* vm_isolate_snapshot_size,
+                                   uint8_t** isolate_snapshot_buffer,
+                                   intptr_t* isolate_snapshot_size,
+                                   uint8_t** instructions_blob_buffer,
+                                   intptr_t* instructions_blob_size,
+                                   uint8_t** rodata_blob_buffer,
+                                   intptr_t* rodata_blob_size) {
   UNREACHABLE();
   return 0;
 }
 
 #else  // DART_PRECOMPILER
 
-DART_EXPORT Dart_Handle Dart_Precompile(
-    Dart_QualifiedFunctionName entry_points[],
-    bool reset_fields) {
+DART_EXPORT Dart_Handle
+Dart_Precompile(Dart_QualifiedFunctionName entry_points[], bool reset_fields) {
 #if defined(TARGET_ARCH_IA32)
   return Api::NewError("Precompilation is not supported on IA32.");
 #elif defined(TARGET_ARCH_DBC)
@@ -6438,8 +6342,8 @@
     return result;
   }
   CHECK_CALLBACK_STATE(T);
-  const Error& error = Error::Handle(Precompiler::CompileAll(entry_points,
-                                                             reset_fields));
+  const Error& error =
+      Error::Handle(Precompiler::CompileAll(entry_points, reset_fields));
   if (!error.IsNull()) {
     return Api::NewHandle(T, error.raw());
   }
@@ -6448,9 +6352,9 @@
 }
 
 
-DART_EXPORT Dart_Handle Dart_CreatePrecompiledSnapshotAssembly(
-    uint8_t** assembly_buffer,
-    intptr_t* assembly_size) {
+DART_EXPORT Dart_Handle
+Dart_CreatePrecompiledSnapshotAssembly(uint8_t** assembly_buffer,
+                                       intptr_t* assembly_size) {
 #if defined(TARGET_ARCH_IA32)
   return Api::NewError("Precompilation is not supported on IA32.");
 #elif defined(TARGET_ARCH_DBC)
@@ -6460,8 +6364,9 @@
   DARTSCOPE(Thread::Current());
   Isolate* I = T->isolate();
   if (I->compilation_allowed()) {
-    return Api::NewError("Isolate is not precompiled. "
-                         "Did you forget to call Dart_Precompile?");
+    return Api::NewError(
+        "Isolate is not precompiled. "
+        "Did you forget to call Dart_Precompile?");
   }
   ASSERT(FLAG_load_deferred_eagerly);
   if (assembly_buffer == NULL) {
@@ -6473,15 +6378,12 @@
 
   NOT_IN_PRODUCT(TimelineDurationScope tds2(T, Timeline::GetIsolateStream(),
                                             "WriteAppAOTSnapshot"));
-  AssemblyInstructionsWriter instructions_writer(assembly_buffer,
-                                                 ApiReallocate,
+  AssemblyInstructionsWriter instructions_writer(assembly_buffer, ApiReallocate,
                                                  2 * MB /* initial_size */);
   uint8_t* vm_isolate_snapshot_buffer = NULL;
   uint8_t* isolate_snapshot_buffer = NULL;
-  FullSnapshotWriter writer(Snapshot::kAppNoJIT,
-                            &vm_isolate_snapshot_buffer,
-                            &isolate_snapshot_buffer,
-                            ApiReallocate,
+  FullSnapshotWriter writer(Snapshot::kAppNoJIT, &vm_isolate_snapshot_buffer,
+                            &isolate_snapshot_buffer, ApiReallocate,
                             &instructions_writer);
 
   writer.WriteFullSnapshot();
@@ -6492,15 +6394,15 @@
 }
 
 
-DART_EXPORT Dart_Handle Dart_CreatePrecompiledSnapshotBlob(
-    uint8_t** vm_isolate_snapshot_buffer,
-    intptr_t* vm_isolate_snapshot_size,
-    uint8_t** isolate_snapshot_buffer,
-    intptr_t* isolate_snapshot_size,
-    uint8_t** instructions_blob_buffer,
-    intptr_t* instructions_blob_size,
-    uint8_t** rodata_blob_buffer,
-    intptr_t* rodata_blob_size) {
+DART_EXPORT Dart_Handle
+Dart_CreatePrecompiledSnapshotBlob(uint8_t** vm_isolate_snapshot_buffer,
+                                   intptr_t* vm_isolate_snapshot_size,
+                                   uint8_t** isolate_snapshot_buffer,
+                                   intptr_t* isolate_snapshot_size,
+                                   uint8_t** instructions_blob_buffer,
+                                   intptr_t* instructions_blob_size,
+                                   uint8_t** rodata_blob_buffer,
+                                   intptr_t* rodata_blob_size) {
 #if defined(TARGET_ARCH_IA32)
   return Api::NewError("Precompilation is not supported on IA32.");
 #elif defined(TARGET_ARCH_DBC)
@@ -6510,8 +6412,9 @@
   DARTSCOPE(Thread::Current());
   Isolate* I = T->isolate();
   if (I->compilation_allowed()) {
-    return Api::NewError("Isolate is not precompiled. "
-                         "Did you forget to call Dart_Precompile?");
+    return Api::NewError(
+        "Isolate is not precompiled. "
+        "Did you forget to call Dart_Precompile?");
   }
   ASSERT(FLAG_load_deferred_eagerly);
   if (vm_isolate_snapshot_buffer == NULL) {
@@ -6542,13 +6445,10 @@
   NOT_IN_PRODUCT(TimelineDurationScope tds2(T, Timeline::GetIsolateStream(),
                                             "WriteAppAOTSnapshot"));
   BlobInstructionsWriter instructions_writer(instructions_blob_buffer,
-                                             rodata_blob_buffer,
-                                             ApiReallocate,
+                                             rodata_blob_buffer, ApiReallocate,
                                              2 * MB /* initial_size */);
-  FullSnapshotWriter writer(Snapshot::kAppNoJIT,
-                            vm_isolate_snapshot_buffer,
-                            isolate_snapshot_buffer,
-                            ApiReallocate,
+  FullSnapshotWriter writer(Snapshot::kAppNoJIT, vm_isolate_snapshot_buffer,
+                            isolate_snapshot_buffer, ApiReallocate,
                             &instructions_writer);
 
   writer.WriteFullSnapshot();
@@ -6595,15 +6495,15 @@
 }
 
 
-DART_EXPORT Dart_Handle Dart_CreateAppJITSnapshot(
-    uint8_t** vm_isolate_snapshot_buffer,
-    intptr_t* vm_isolate_snapshot_size,
-    uint8_t** isolate_snapshot_buffer,
-    intptr_t* isolate_snapshot_size,
-    uint8_t** instructions_blob_buffer,
-    intptr_t* instructions_blob_size,
-    uint8_t** rodata_blob_buffer,
-    intptr_t* rodata_blob_size) {
+DART_EXPORT Dart_Handle
+Dart_CreateAppJITSnapshot(uint8_t** vm_isolate_snapshot_buffer,
+                          intptr_t* vm_isolate_snapshot_size,
+                          uint8_t** isolate_snapshot_buffer,
+                          intptr_t* isolate_snapshot_size,
+                          uint8_t** instructions_blob_buffer,
+                          intptr_t* instructions_blob_size,
+                          uint8_t** rodata_blob_buffer,
+                          intptr_t* rodata_blob_size) {
 #if defined(TARGET_ARCH_IA32)
   return Api::NewError("Snapshots with code are not supported on IA32.");
 #elif defined(TARGET_ARCH_DBC)
@@ -6650,13 +6550,10 @@
   NOT_IN_PRODUCT(TimelineDurationScope tds2(T, Timeline::GetIsolateStream(),
                                             "WriteAppJITSnapshot"));
   BlobInstructionsWriter instructions_writer(instructions_blob_buffer,
-                                             rodata_blob_buffer,
-                                             ApiReallocate,
+                                             rodata_blob_buffer, ApiReallocate,
                                              2 * MB /* initial_size */);
-  FullSnapshotWriter writer(Snapshot::kAppWithJIT,
-                            vm_isolate_snapshot_buffer,
-                            isolate_snapshot_buffer,
-                            ApiReallocate,
+  FullSnapshotWriter writer(Snapshot::kAppWithJIT, vm_isolate_snapshot_buffer,
+                            isolate_snapshot_buffer, ApiReallocate,
                             &instructions_writer);
   writer.WriteFullSnapshot();
   *vm_isolate_snapshot_size = writer.VmIsolateSnapshotSize();
diff --git a/runtime/vm/dart_api_impl.h b/runtime/vm/dart_api_impl.h
index 0629b2d..f597ca2 100644
--- a/runtime/vm/dart_api_impl.h
+++ b/runtime/vm/dart_api_impl.h
@@ -27,9 +27,10 @@
 #define CHECK_ISOLATE(isolate)                                                 \
   do {                                                                         \
     if ((isolate) == NULL) {                                                   \
-      FATAL1("%s expects there to be a current isolate. Did you "              \
-             "forget to call Dart_CreateIsolate or Dart_EnterIsolate?",        \
-             CURRENT_FUNC);                                                    \
+      FATAL1(                                                                  \
+          "%s expects there to be a current isolate. Did you "                 \
+          "forget to call Dart_CreateIsolate or Dart_EnterIsolate?",           \
+          CURRENT_FUNC);                                                       \
     }                                                                          \
   } while (0)
 
@@ -37,8 +38,10 @@
 #define CHECK_NO_ISOLATE(isolate)                                              \
   do {                                                                         \
     if ((isolate) != NULL) {                                                   \
-      FATAL1("%s expects there to be no current isolate. Did you "             \
-             "forget to call Dart_ExitIsolate?", CURRENT_FUNC);                \
+      FATAL1(                                                                  \
+          "%s expects there to be no current isolate. Did you "                \
+          "forget to call Dart_ExitIsolate?",                                  \
+          CURRENT_FUNC);                                                       \
     }                                                                          \
   } while (0)
 
@@ -49,10 +52,12 @@
     Isolate* tmpI = tmpT->isolate();                                           \
     CHECK_ISOLATE(tmpI);                                                       \
     if (tmpT->api_top_scope() == NULL) {                                       \
-      FATAL1("%s expects to find a current scope. Did you forget to call "     \
-           "Dart_EnterScope?", CURRENT_FUNC);                                  \
+      FATAL1(                                                                  \
+          "%s expects to find a current scope. Did you forget to call "        \
+          "Dart_EnterScope?",                                                  \
+          CURRENT_FUNC);                                                       \
     }                                                                          \
-  } while (0);                                                                 \
+  } while (0);
 
 #define DARTSCOPE(thread)                                                      \
   Thread* T = (thread);                                                        \
@@ -101,9 +106,7 @@
     explicit Scope(Thread* thread) : StackResource(thread) {
       Dart_EnterScope();
     }
-    ~Scope() {
-      Dart_ExitScope();
-    }
+    ~Scope() { Dart_ExitScope(); }
 
    private:
     DISALLOW_COPY_AND_ASSIGN(Scope);
@@ -115,24 +118,25 @@
   // Unwraps the raw object from the handle.
   static RawObject* UnwrapHandle(Dart_Handle object);
 
-  // Unwraps a raw Type from the handle.  The handle will be null if
-  // the object was not of the requested Type.
+// Unwraps a raw Type from the handle.  The handle will be null if
+// the object was not of the requested Type.
 #define DECLARE_UNWRAP(Type)                                                   \
-  static const Type& Unwrap##Type##Handle(Zone* zone,                          \
-                                          Dart_Handle object);
+  static const Type& Unwrap##Type##Handle(Zone* zone, Dart_Handle object);
   CLASS_LIST_FOR_HANDLES(DECLARE_UNWRAP)
 #undef DECLARE_UNWRAP
 
   // Unwraps the raw object from the handle using a reused handle.
   static const String& UnwrapStringHandle(
-      const ReusableObjectHandleScope& reused, Dart_Handle object);
+      const ReusableObjectHandleScope& reused,
+      Dart_Handle object);
   static const Instance& UnwrapInstanceHandle(
-      const ReusableObjectHandleScope& reused, Dart_Handle object);
+      const ReusableObjectHandleScope& reused,
+      Dart_Handle object);
 
   // Returns an Error handle if isolate is in an inconsistent state
   // or there was an error while finalizing classes.
   // Returns a Success handle when no error condition exists.
-  static Dart_Handle CheckAndFinalizePendingClasses(Thread *thread);
+  static Dart_Handle CheckAndFinalizePendingClasses(Thread* thread);
 
   // Casts the internal Isolate* type to the external Dart_Isolate type.
   static Dart_Isolate CastIsolate(Isolate* isolate);
@@ -187,24 +191,16 @@
   static Dart_Handle NewError(const char* format, ...) PRINTF_ATTRIBUTE(1, 2);
 
   // Gets a handle to Null.
-  static Dart_Handle Null() {
-    return null_handle_;
-  }
+  static Dart_Handle Null() { return null_handle_; }
 
   // Gets a handle to True.
-  static Dart_Handle True() {
-    return true_handle_;
-  }
+  static Dart_Handle True() { return true_handle_; }
 
   // Gets a handle to False.
-  static Dart_Handle False() {
-    return false_handle_;
-  }
+  static Dart_Handle False() { return false_handle_; }
 
   // Gets a handle to EmptyString.
-  static Dart_Handle EmptyString() {
-    return empty_string_handle_;
-  }
+  static Dart_Handle EmptyString() { return empty_string_handle_; }
 
   // Retrieves the top ApiLocalScope.
   static ApiLocalScope* TopScope(Thread* thread);
@@ -279,26 +275,24 @@
 };
 
 // Start a scope in which no Dart API call backs are allowed.
-#define START_NO_CALLBACK_SCOPE(thread)                                        \
-  thread->IncrementNoCallbackScopeDepth()
+#define START_NO_CALLBACK_SCOPE(thread) thread->IncrementNoCallbackScopeDepth()
 
 // End a no Dart API call backs Scope.
-#define END_NO_CALLBACK_SCOPE(thread)                                          \
-  thread->DecrementNoCallbackScopeDepth()
+#define END_NO_CALLBACK_SCOPE(thread) thread->DecrementNoCallbackScopeDepth()
 
 #define CHECK_CALLBACK_STATE(thread)                                           \
   if (thread->no_callback_scope_depth() != 0) {                                \
     return reinterpret_cast<Dart_Handle>(                                      \
         Api::AcquiredError(thread->isolate()));                                \
-  }                                                                            \
+  }
 
 #define CHECK_COMPILATION_ALLOWED(isolate)                                     \
   if (!isolate->compilation_allowed()) {                                       \
     return Api::NewError("%s: Cannot load after Dart_Precompile",              \
                          CURRENT_FUNC);                                        \
-  }                                                                            \
+  }
 
-#define ASSERT_CALLBACK_STATE(thread)                                         \
+#define ASSERT_CALLBACK_STATE(thread)                                          \
   ASSERT(thread->no_callback_scope_depth() == 0)
 
 }  // namespace dart.
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index d3245c9..7ee03f7 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -37,10 +37,7 @@
 
   Dart_Handle instance = Dart_True();
   Dart_Handle error = Api::NewError("myerror");
-  Dart_Handle exception = Dart_Invoke(lib,
-                                      NewString("testMain"),
-                                      0,
-                                      NULL);
+  Dart_Handle exception = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
 
   EXPECT_VALID(instance);
   EXPECT(Dart_IsError(error));
@@ -97,8 +94,8 @@
   Dart_ActivationFrame frame;
   result = Dart_GetActivationFrame(stacktrace, 0, &frame);
   EXPECT_VALID(result);
-  result = Dart_ActivationFrameInfo(
-      frame, &function_name, &script_url, &line_number, &column_number);
+  result = Dart_ActivationFrameInfo(frame, &function_name, &script_url,
+                                    &line_number, &column_number);
   EXPECT_VALID(result);
   Dart_StringToCString(function_name, &cstr);
   EXPECT_STREQ("bar", cstr);
@@ -109,8 +106,8 @@
 
   result = Dart_GetActivationFrame(stacktrace, 1, &frame);
   EXPECT_VALID(result);
-  result = Dart_ActivationFrameInfo(
-      frame, &function_name, &script_url, &line_number, &column_number);
+  result = Dart_ActivationFrameInfo(frame, &function_name, &script_url,
+                                    &line_number, &column_number);
   EXPECT_VALID(result);
   Dart_StringToCString(function_name, &cstr);
   EXPECT_STREQ("foo", cstr);
@@ -121,8 +118,8 @@
 
   result = Dart_GetActivationFrame(stacktrace, 2, &frame);
   EXPECT_VALID(result);
-  result = Dart_ActivationFrameInfo(
-      frame, &function_name, &script_url, &line_number, &column_number);
+  result = Dart_ActivationFrameInfo(frame, &function_name, &script_url,
+                                    &line_number, &column_number);
   EXPECT_VALID(result);
   Dart_StringToCString(function_name, &cstr);
   EXPECT_STREQ("testMain", cstr);
@@ -171,8 +168,8 @@
   Dart_ActivationFrame frame;
   result = Dart_GetActivationFrame(stacktrace, 0, &frame);
   EXPECT_VALID(result);
-  result = Dart_ActivationFrameInfo(
-      frame, &function_name, &script_url, &line_number, &column_number);
+  result = Dart_ActivationFrameInfo(frame, &function_name, &script_url,
+                                    &line_number, &column_number);
   EXPECT_VALID(result);
   Dart_StringToCString(function_name, &cstr);
   EXPECT_STREQ("foo", cstr);
@@ -182,13 +179,12 @@
   EXPECT_EQ(20, column_number);
 
   // Middle frames positioned at the recursive call.
-  for (intptr_t frame_index = 1;
-       frame_index < (frame_count - 1);
+  for (intptr_t frame_index = 1; frame_index < (frame_count - 1);
        frame_index++) {
     result = Dart_GetActivationFrame(stacktrace, frame_index, &frame);
     EXPECT_VALID(result);
-    result = Dart_ActivationFrameInfo(
-        frame, &function_name, &script_url, &line_number, &column_number);
+    result = Dart_ActivationFrameInfo(frame, &function_name, &script_url,
+                                      &line_number, &column_number);
     EXPECT_VALID(result);
     Dart_StringToCString(function_name, &cstr);
     EXPECT_STREQ("foo", cstr);
@@ -201,8 +197,8 @@
   // Bottom frame positioned at testMain().
   result = Dart_GetActivationFrame(stacktrace, frame_count - 1, &frame);
   EXPECT_VALID(result);
-  result = Dart_ActivationFrameInfo(
-      frame, &function_name, &script_url, &line_number, &column_number);
+  result = Dart_ActivationFrameInfo(frame, &function_name, &script_url,
+                                    &line_number, &column_number);
   EXPECT_VALID(result);
   Dart_StringToCString(function_name, &cstr);
   EXPECT_STREQ("testMain", cstr);
@@ -250,8 +246,8 @@
   Dart_ActivationFrame frame;
   result = Dart_GetActivationFrame(stacktrace, 0, &frame);
   EXPECT_VALID(result);
-  result = Dart_ActivationFrameInfo(
-      frame, &function_name, &script_url, &line_number, &column_number);
+  result = Dart_ActivationFrameInfo(frame, &function_name, &script_url,
+                                    &line_number, &column_number);
   EXPECT_VALID(result);
   Dart_StringToCString(function_name, &cstr);
   EXPECT_STREQ("C.foo", cstr);
@@ -311,8 +307,8 @@
   Dart_ActivationFrame frame;
   result = Dart_GetActivationFrame(stacktrace, 0, &frame);
   EXPECT_VALID(result);
-  result = Dart_ActivationFrameInfo(
-      frame, &function_name, &script_url, &line_number, &column_number);
+  result = Dart_ActivationFrameInfo(frame, &function_name, &script_url,
+                                    &line_number, &column_number);
   EXPECT_VALID(result);
   Dart_StringToCString(function_name, &cstr);
   EXPECT_STREQ("inspectStack", cstr);
@@ -324,8 +320,8 @@
   // Second frame is foo() positioned at call to inspectStack().
   result = Dart_GetActivationFrame(stacktrace, 1, &frame);
   EXPECT_VALID(result);
-  result = Dart_ActivationFrameInfo(
-      frame, &function_name, &script_url, &line_number, &column_number);
+  result = Dart_ActivationFrameInfo(frame, &function_name, &script_url,
+                                    &line_number, &column_number);
   EXPECT_VALID(result);
   Dart_StringToCString(function_name, &cstr);
   EXPECT_STREQ("foo", cstr);
@@ -335,13 +331,12 @@
   EXPECT_EQ(20, column_number);
 
   // Middle frames positioned at the recursive call.
-  for (intptr_t frame_index = 2;
-       frame_index < (frame_count - 1);
+  for (intptr_t frame_index = 2; frame_index < (frame_count - 1);
        frame_index++) {
     result = Dart_GetActivationFrame(stacktrace, frame_index, &frame);
     EXPECT_VALID(result);
-    result = Dart_ActivationFrameInfo(
-        frame, &function_name, &script_url, &line_number, &column_number);
+    result = Dart_ActivationFrameInfo(frame, &function_name, &script_url,
+                                      &line_number, &column_number);
     EXPECT_VALID(result);
     Dart_StringToCString(function_name, &cstr);
     EXPECT_STREQ("foo", cstr);
@@ -354,8 +349,8 @@
   // Bottom frame positioned at testMain().
   result = Dart_GetActivationFrame(stacktrace, frame_count - 1, &frame);
   EXPECT_VALID(result);
-  result = Dart_ActivationFrameInfo(
-      frame, &function_name, &script_url, &line_number, &column_number);
+  result = Dart_ActivationFrameInfo(frame, &function_name, &script_url,
+                                    &line_number, &column_number);
   EXPECT_VALID(result);
   Dart_StringToCString(function_name, &cstr);
   EXPECT_STREQ("testMain", cstr);
@@ -376,7 +371,9 @@
 
 
 static Dart_NativeFunction CurrentStackTraceNativeLookup(
-    Dart_Handle name, int argument_count, bool* auto_setup_scope) {
+    Dart_Handle name,
+    int argument_count,
+    bool* auto_setup_scope) {
   ASSERT(auto_setup_scope != NULL);
   *auto_setup_scope = true;
   return reinterpret_cast<Dart_NativeFunction>(&CurrentStackTraceNative);
@@ -389,8 +386,8 @@
       "foo(n) => n == 1 ? inspectStack() : foo(n-1);\n"
       "testMain() => foo(50);\n";
 
-  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars,
-                                             &CurrentStackTraceNativeLookup);
+  Dart_Handle lib =
+      TestCase::LoadTestScript(kScriptChars, &CurrentStackTraceNativeLookup);
   Dart_Handle result = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
   EXPECT_VALID(result);
   EXPECT(Dart_IsInteger(result));
@@ -461,8 +458,7 @@
   // Test with an API Error.
   const char* kApiError = "Api Error Exception Test.";
   Dart_Handle api_error = Api::NewHandle(
-      thread,
-      ApiError::New(String::Handle(String::New(kApiError))));
+      thread, ApiError::New(String::Handle(String::New(kApiError))));
   Dart_Handle exception_error = Dart_NewUnhandledExceptionError(api_error);
   EXPECT(!Dart_IsApiError(exception_error));
   EXPECT(Dart_IsUnhandledExceptionError(exception_error));
@@ -473,8 +469,7 @@
 
   // Test with a Compilation Error.
   const char* kCompileError = "CompileError Exception Test.";
-  const String& compile_message =
-      String::Handle(String::New(kCompileError));
+  const String& compile_message = String::Handle(String::New(kCompileError));
   Dart_Handle compile_error =
       Api::NewHandle(thread, LanguageError::New(compile_message));
   exception_error = Dart_NewUnhandledExceptionError(compile_error);
@@ -534,7 +529,9 @@
 
 
 static Dart_NativeFunction PropagateError_native_lookup(
-    Dart_Handle name, int argument_count, bool* auto_setup_scope) {
+    Dart_Handle name,
+    int argument_count,
+    bool* auto_setup_scope) {
   ASSERT(auto_setup_scope != NULL);
   *auto_setup_scope = true;
   return reinterpret_cast<Dart_NativeFunction>(&PropagateErrorNative);
@@ -560,8 +557,8 @@
       "void Func2() {\n"
       "  nativeFunc(() => throwException());\n"
       "}\n";
-  Dart_Handle lib = TestCase::LoadTestScript(
-      kScriptChars, &PropagateError_native_lookup);
+  Dart_Handle lib =
+      TestCase::LoadTestScript(kScriptChars, &PropagateError_native_lookup);
   Dart_Handle result;
 
   // Use Dart_PropagateError to propagate the error.
@@ -1046,7 +1043,7 @@
 
 
 TEST_CASE(IsString) {
-  uint8_t latin1[] = { 'o', 'n', 'e', 0xC2, 0xA2 };
+  uint8_t latin1[] = {'o', 'n', 'e', 0xC2, 0xA2};
 
   Dart_Handle latin1str = Dart_NewStringFromUTF8(latin1, ARRAY_SIZE(latin1));
   EXPECT_VALID(latin1str);
@@ -1059,15 +1056,13 @@
   intptr_t char_size;
   intptr_t str_len;
   void* peer;
-  EXPECT_VALID(Dart_StringGetProperties(latin1str,
-                                        &char_size,
-                                        &str_len,
-                                        &peer));
+  EXPECT_VALID(
+      Dart_StringGetProperties(latin1str, &char_size, &str_len, &peer));
   EXPECT_EQ(1, char_size);
   EXPECT_EQ(4, str_len);
   EXPECT(!peer);
 
-  uint8_t data8[] = { 'o', 'n', 'e', 0x7F };
+  uint8_t data8[] = {'o', 'n', 'e', 0x7F};
 
   Dart_Handle str8 = Dart_NewStringFromUTF8(data8, ARRAY_SIZE(data8));
   EXPECT_VALID(str8);
@@ -1085,48 +1080,39 @@
     EXPECT_EQ(data8[i], latin1_array[i]);
   }
 
-  Dart_Handle ext8 = Dart_NewExternalLatin1String(data8, ARRAY_SIZE(data8),
-                                                  data8, NULL);
+  Dart_Handle ext8 =
+      Dart_NewExternalLatin1String(data8, ARRAY_SIZE(data8), data8, NULL);
   EXPECT_VALID(ext8);
   EXPECT(Dart_IsString(ext8));
   EXPECT(Dart_IsExternalString(ext8));
-  EXPECT_VALID(Dart_StringGetProperties(ext8,
-                                        &char_size,
-                                        &str_len,
-                                        &peer));
+  EXPECT_VALID(Dart_StringGetProperties(ext8, &char_size, &str_len, &peer));
   EXPECT_EQ(1, char_size);
   EXPECT_EQ(4, str_len);
   EXPECT_EQ(data8, peer);
 
-  uint16_t data16[] = { 't', 'w', 'o', 0xFFFF };
+  uint16_t data16[] = {'t', 'w', 'o', 0xFFFF};
 
   Dart_Handle str16 = Dart_NewStringFromUTF16(data16, ARRAY_SIZE(data16));
   EXPECT_VALID(str16);
   EXPECT(Dart_IsString(str16));
   EXPECT(!Dart_IsStringLatin1(str16));
   EXPECT(!Dart_IsExternalString(str16));
-  EXPECT_VALID(Dart_StringGetProperties(str16,
-                                        &char_size,
-                                        &str_len,
-                                        &peer));
+  EXPECT_VALID(Dart_StringGetProperties(str16, &char_size, &str_len, &peer));
   EXPECT_EQ(2, char_size);
   EXPECT_EQ(4, str_len);
   EXPECT(!peer);
 
-  Dart_Handle ext16 = Dart_NewExternalUTF16String(data16, ARRAY_SIZE(data16),
-                                                  data16, NULL);
+  Dart_Handle ext16 =
+      Dart_NewExternalUTF16String(data16, ARRAY_SIZE(data16), data16, NULL);
   EXPECT_VALID(ext16);
   EXPECT(Dart_IsString(ext16));
   EXPECT(Dart_IsExternalString(ext16));
-  EXPECT_VALID(Dart_StringGetProperties(ext16,
-                                        &char_size,
-                                        &str_len,
-                                        &peer));
+  EXPECT_VALID(Dart_StringGetProperties(ext16, &char_size, &str_len, &peer));
   EXPECT_EQ(2, char_size);
   EXPECT_EQ(4, str_len);
   EXPECT_EQ(data16, peer);
 
-  int32_t data32[] = { 'f', 'o', 'u', 'r', 0x10FFFF };
+  int32_t data32[] = {'f', 'o', 'u', 'r', 0x10FFFF};
 
   Dart_Handle str32 = Dart_NewStringFromUTF32(data32, ARRAY_SIZE(data32));
   EXPECT_VALID(str32);
@@ -1145,14 +1131,14 @@
   Dart_Handle null_str = NewString(null);
   EXPECT(Dart_IsError(null_str));
 
-  uint8_t data[] = { 0xE4, 0xBA, 0x8c };  // U+4E8C.
+  uint8_t data[] = {0xE4, 0xBA, 0x8c};  // U+4E8C.
   Dart_Handle utf8_str = Dart_NewStringFromUTF8(data, ARRAY_SIZE(data));
   EXPECT_VALID(utf8_str);
   EXPECT(Dart_IsString(utf8_str));
 
-  uint8_t invalid[] = { 0xE4, 0xBA };  // underflow.
-  Dart_Handle invalid_str = Dart_NewStringFromUTF8(invalid,
-                                                   ARRAY_SIZE(invalid));
+  uint8_t invalid[] = {0xE4, 0xBA};  // underflow.
+  Dart_Handle invalid_str =
+      Dart_NewStringFromUTF8(invalid, ARRAY_SIZE(invalid));
   EXPECT(Dart_IsError(invalid_str));
 }
 
@@ -1192,8 +1178,8 @@
   EXPECT_VALID(reversed);  // This is also allowed.
   uint8_t* utf8_encoded_reversed = NULL;
   intptr_t utf8_length_reversed = 0;
-  result = Dart_StringToUTF8(reversed,
-      &utf8_encoded_reversed, &utf8_length_reversed);
+  result = Dart_StringToUTF8(reversed, &utf8_encoded_reversed,
+                             &utf8_length_reversed);
   EXPECT_VALID(result);
   EXPECT_EQ(6, utf8_length_reversed);
   uint8_t expected[6] = {237, 180, 158, 237, 160, 180};
@@ -1237,20 +1223,14 @@
   {
     Dart_EnterScope();
 
-    uint8_t data8[] = { 'h', 'e', 'l', 'l', 'o' };
+    uint8_t data8[] = {'h', 'e', 'l', 'l', 'o'};
     Dart_Handle obj8 = Dart_NewExternalLatin1String(
-        data8,
-        ARRAY_SIZE(data8),
-        &peer8,
-        ExternalStringCallbackFinalizer);
+        data8, ARRAY_SIZE(data8), &peer8, ExternalStringCallbackFinalizer);
     EXPECT_VALID(obj8);
 
-    uint16_t data16[] = { 'h', 'e', 'l', 'l', 'o' };
+    uint16_t data16[] = {'h', 'e', 'l', 'l', 'o'};
     Dart_Handle obj16 = Dart_NewExternalUTF16String(
-        data16,
-        ARRAY_SIZE(data16),
-        &peer16,
-        ExternalStringCallbackFinalizer);
+        data16, ARRAY_SIZE(data16), &peer16, ExternalStringCallbackFinalizer);
     EXPECT_VALID(obj16);
 
     Dart_ExitScope();
@@ -1275,32 +1255,24 @@
 TEST_CASE(ExternalStringPretenure) {
   {
     Dart_EnterScope();
-    static const uint8_t big_data8[16*MB] = {0, };
+    static const uint8_t big_data8[16 * MB] = {
+        0,
+    };
     Dart_Handle big8 = Dart_NewExternalLatin1String(
-        big_data8,
-        ARRAY_SIZE(big_data8),
-        NULL,
-        NULL);
+        big_data8, ARRAY_SIZE(big_data8), NULL, NULL);
     EXPECT_VALID(big8);
-    static const uint16_t big_data16[16*MB/2] = {0, };
+    static const uint16_t big_data16[16 * MB / 2] = {
+        0,
+    };
     Dart_Handle big16 = Dart_NewExternalUTF16String(
-        big_data16,
-        ARRAY_SIZE(big_data16),
-        NULL,
-        NULL);
+        big_data16, ARRAY_SIZE(big_data16), NULL, NULL);
     static const uint8_t small_data8[] = {'f', 'o', 'o'};
     Dart_Handle small8 = Dart_NewExternalLatin1String(
-        small_data8,
-        ARRAY_SIZE(small_data8),
-        NULL,
-        NULL);
+        small_data8, ARRAY_SIZE(small_data8), NULL, NULL);
     EXPECT_VALID(small8);
     static const uint16_t small_data16[] = {'b', 'a', 'r'};
     Dart_Handle small16 = Dart_NewExternalUTF16String(
-        small_data16,
-        ARRAY_SIZE(small_data16),
-        NULL,
-        NULL);
+        small_data16, ARRAY_SIZE(small_data16), NULL, NULL);
     EXPECT_VALID(small16);
     {
       CHECK_API_SCOPE(thread);
@@ -1323,19 +1295,15 @@
 TEST_CASE(ExternalTypedDataPretenure) {
   {
     Dart_EnterScope();
-    static const int kBigLength = 16*MB/8;
+    static const int kBigLength = 16 * MB / 8;
     int64_t* big_data = new int64_t[kBigLength]();
-    Dart_Handle big = Dart_NewExternalTypedData(
-        Dart_TypedData_kInt64,
-        big_data,
-        kBigLength);
+    Dart_Handle big =
+        Dart_NewExternalTypedData(Dart_TypedData_kInt64, big_data, kBigLength);
     EXPECT_VALID(big);
-    static const int kSmallLength = 16*KB/8;
+    static const int kSmallLength = 16 * KB / 8;
     int64_t* small_data = new int64_t[kSmallLength]();
-    Dart_Handle small = Dart_NewExternalTypedData(
-        Dart_TypedData_kInt64,
-        small_data,
-        kSmallLength);
+    Dart_Handle small = Dart_NewExternalTypedData(Dart_TypedData_kInt64,
+                                                  small_data, kSmallLength);
     EXPECT_VALID(small);
     {
       CHECK_API_SCOPE(thread);
@@ -1476,8 +1444,8 @@
   result = Dart_ListGetRange(list_access_test_obj, 8, 4, values);
   EXPECT(Dart_IsError(result));
 
-  result = Dart_ListGetRange(
-      list_access_test_obj, kRangeOffset, kRangeLength, values);
+  result = Dart_ListGetRange(list_access_test_obj, kRangeOffset, kRangeLength,
+                             values);
   EXPECT_VALID(result);
 
   result = Dart_IntegerToInt64(values[0], &value);
@@ -1679,14 +1647,12 @@
 
 
 TEST_CASE(TypedDataAccess) {
-  EXPECT_EQ(Dart_TypedData_kInvalid,
-            Dart_GetTypeOfTypedData(Dart_True()));
+  EXPECT_EQ(Dart_TypedData_kInvalid, Dart_GetTypeOfTypedData(Dart_True()));
   EXPECT_EQ(Dart_TypedData_kInvalid,
             Dart_GetTypeOfExternalTypedData(Dart_False()));
   Dart_Handle byte_array1 = Dart_NewTypedData(Dart_TypedData_kUint8, 10);
   EXPECT_VALID(byte_array1);
-  EXPECT_EQ(Dart_TypedData_kUint8,
-            Dart_GetTypeOfTypedData(byte_array1));
+  EXPECT_EQ(Dart_TypedData_kUint8, Dart_GetTypeOfTypedData(byte_array1));
   EXPECT_EQ(Dart_TypedData_kInvalid,
             Dart_GetTypeOfExternalTypedData(byte_array1));
   EXPECT(Dart_IsList(byte_array1));
@@ -1739,7 +1705,7 @@
     EXPECT(is_equal);
   }
 
-  uint8_t data[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
+  uint8_t data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
   for (intptr_t i = 0; i < 10; ++i) {
     EXPECT_VALID(Dart_ListSetAt(byte_array1, i, Dart_NewInteger(10 - i)));
   }
@@ -1856,15 +1822,15 @@
 
 
 static const intptr_t kExtLength = 16;
-static int8_t data[kExtLength] = { 0x41, 0x42, 0x41, 0x42,
-                                   0x41, 0x42, 0x41, 0x42,
-                                   0x41, 0x42, 0x41, 0x42,
-                                   0x41, 0x42, 0x41, 0x42, };
+static int8_t data[kExtLength] = {
+    0x41, 0x42, 0x41, 0x42, 0x41, 0x42, 0x41, 0x42,
+    0x41, 0x42, 0x41, 0x42, 0x41, 0x42, 0x41, 0x42,
+};
 
 static void ExternalByteDataNativeFunction(Dart_NativeArguments args) {
   Dart_EnterScope();
-  Dart_Handle external_byte_data = Dart_NewExternalTypedData(
-      Dart_TypedData_kByteData, data, 16);
+  Dart_Handle external_byte_data =
+      Dart_NewExternalTypedData(Dart_TypedData_kByteData, data, 16);
   EXPECT_VALID(external_byte_data);
   EXPECT_EQ(Dart_TypedData_kByteData,
             Dart_GetTypeOfTypedData(external_byte_data));
@@ -1874,7 +1840,9 @@
 
 
 static Dart_NativeFunction ExternalByteDataNativeResolver(
-    Dart_Handle name, int arg_count, bool* auto_setup_scope) {
+    Dart_Handle name,
+    int arg_count,
+    bool* auto_setup_scope) {
   ASSERT(auto_setup_scope != NULL);
   *auto_setup_scope = true;
   return &ExternalByteDataNativeFunction;
@@ -1913,18 +1881,17 @@
   // Create a test library and Load up a test script in it.
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
 
-  Dart_Handle result = Dart_SetNativeResolver(lib,
-                                              &ExternalByteDataNativeResolver,
-                                              NULL);
+  Dart_Handle result =
+      Dart_SetNativeResolver(lib, &ExternalByteDataNativeResolver, NULL);
   EXPECT_VALID(result);
 
   // Invoke 'main' function.
   result = Dart_Invoke(lib, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
 
-  for (intptr_t i = 0; i < kExtLength; i+=2) {
+  for (intptr_t i = 0; i < kExtLength; i += 2) {
     EXPECT_EQ(0x24, data[i]);
-    EXPECT_EQ(0x28, data[i+1]);
+    EXPECT_EQ(0x28, data[i + 1]);
   }
 }
 
@@ -1933,15 +1900,15 @@
 
 
 static const intptr_t kOptExtLength = 16;
-static int8_t opt_data[kOptExtLength] = { 0x01, 0x02, 0x03, 0x04,
-                                          0x05, 0x06, 0x07, 0x08,
-                                          0x09, 0x0a, 0x0b, 0x0c,
-                                          0x0d, 0x0e, 0x0f, 0x10, };
+static int8_t opt_data[kOptExtLength] = {
+    0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
+    0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
+};
 
 static void OptExternalByteDataNativeFunction(Dart_NativeArguments args) {
   Dart_EnterScope();
-  Dart_Handle external_byte_data = Dart_NewExternalTypedData(
-      Dart_TypedData_kByteData, opt_data, 16);
+  Dart_Handle external_byte_data =
+      Dart_NewExternalTypedData(Dart_TypedData_kByteData, opt_data, 16);
   EXPECT_VALID(external_byte_data);
   EXPECT_EQ(Dart_TypedData_kByteData,
             Dart_GetTypeOfTypedData(external_byte_data));
@@ -1951,7 +1918,9 @@
 
 
 static Dart_NativeFunction OptExternalByteDataNativeResolver(
-    Dart_Handle name, int arg_count, bool* auto_setup_scope) {
+    Dart_Handle name,
+    int arg_count,
+    bool* auto_setup_scope) {
   ASSERT(auto_setup_scope != NULL);
   *auto_setup_scope = true;
   return &OptExternalByteDataNativeFunction;
@@ -1987,8 +1956,8 @@
   // Create a test library and Load up a test script in it.
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
 
-  Dart_Handle result = Dart_SetNativeResolver(
-      lib, &OptExternalByteDataNativeResolver, NULL);
+  Dart_Handle result =
+      Dart_SetNativeResolver(lib, &OptExternalByteDataNativeResolver, NULL);
   EXPECT_VALID(result);
 
   // Invoke 'main' function.
@@ -2009,30 +1978,37 @@
   EXPECT_VALID(byte_array);
   Dart_Handle result;
   result = Dart_TypedDataAcquireData(byte_array, NULL, NULL, NULL);
-  EXPECT_ERROR(result, "Dart_TypedDataAcquireData expects argument 'type'"
-                       " to be non-null.");
+  EXPECT_ERROR(result,
+               "Dart_TypedDataAcquireData expects argument 'type'"
+               " to be non-null.");
   Dart_TypedData_Type type;
   result = Dart_TypedDataAcquireData(byte_array, &type, NULL, NULL);
-  EXPECT_ERROR(result, "Dart_TypedDataAcquireData expects argument 'data'"
-                       " to be non-null.");
+  EXPECT_ERROR(result,
+               "Dart_TypedDataAcquireData expects argument 'data'"
+               " to be non-null.");
   void* data;
   result = Dart_TypedDataAcquireData(byte_array, &type, &data, NULL);
-  EXPECT_ERROR(result, "Dart_TypedDataAcquireData expects argument 'len'"
-                       " to be non-null.");
+  EXPECT_ERROR(result,
+               "Dart_TypedDataAcquireData expects argument 'len'"
+               " to be non-null.");
   intptr_t len;
   result = Dart_TypedDataAcquireData(Dart_Null(), &type, &data, &len);
-  EXPECT_ERROR(result, "Dart_TypedDataAcquireData expects argument 'object'"
-                       " to be non-null.");
+  EXPECT_ERROR(result,
+               "Dart_TypedDataAcquireData expects argument 'object'"
+               " to be non-null.");
   result = Dart_TypedDataAcquireData(str, &type, &data, &len);
-  EXPECT_ERROR(result, "Dart_TypedDataAcquireData expects argument 'object'"
-                       " to be of type 'TypedData'.");
+  EXPECT_ERROR(result,
+               "Dart_TypedDataAcquireData expects argument 'object'"
+               " to be of type 'TypedData'.");
 
   result = Dart_TypedDataReleaseData(Dart_Null());
-  EXPECT_ERROR(result, "Dart_TypedDataReleaseData expects argument 'object'"
-                       " to be non-null.");
+  EXPECT_ERROR(result,
+               "Dart_TypedDataReleaseData expects argument 'object'"
+               " to be non-null.");
   result = Dart_TypedDataReleaseData(str);
-  EXPECT_ERROR(result, "Dart_TypedDataReleaseData expects argument 'object'"
-                       " to be of type 'TypedData'.");
+  EXPECT_ERROR(result,
+               "Dart_TypedDataReleaseData expects argument 'object'"
+               " to be of type 'TypedData'.");
 }
 
 
@@ -2134,11 +2110,11 @@
   TestDirectAccess(lib, list_access_test_obj, Dart_TypedData_kInt8, false);
 
   // Test with an external typed data object.
-  uint8_t data[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+  uint8_t data[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
   intptr_t data_length = ARRAY_SIZE(data);
   Dart_Handle ext_list_access_test_obj;
-  ext_list_access_test_obj = Dart_NewExternalTypedData(Dart_TypedData_kUint8,
-                                                       data, data_length);
+  ext_list_access_test_obj =
+      Dart_NewExternalTypedData(Dart_TypedData_kUint8, data, data_length);
   EXPECT_VALID(ext_list_access_test_obj);
   TestDirectAccess(lib, ext_list_access_test_obj, Dart_TypedData_kUint8, true);
 }
@@ -2316,28 +2292,28 @@
 
 
 TEST_CASE(ExternalTypedDataAccess) {
-  uint8_t data[] = { 0, 11, 22, 33, 44, 55, 66, 77 };
+  uint8_t data[] = {0, 11, 22, 33, 44, 55, 66, 77};
   intptr_t data_length = ARRAY_SIZE(data);
 
-  Dart_Handle obj = Dart_NewExternalTypedData(
-      Dart_TypedData_kUint8, data, data_length);
+  Dart_Handle obj =
+      Dart_NewExternalTypedData(Dart_TypedData_kUint8, data, data_length);
   ExternalTypedDataAccessTests(obj, Dart_TypedData_kUint8, data, data_length);
 }
 
 
 TEST_CASE(ExternalClampedTypedDataAccess) {
-  uint8_t data[] = { 0, 11, 22, 33, 44, 55, 66, 77 };
+  uint8_t data[] = {0, 11, 22, 33, 44, 55, 66, 77};
   intptr_t data_length = ARRAY_SIZE(data);
 
-  Dart_Handle obj = Dart_NewExternalTypedData(
-      Dart_TypedData_kUint8Clamped, data, data_length);
-  ExternalTypedDataAccessTests(obj, Dart_TypedData_kUint8Clamped,
-                               data, data_length);
+  Dart_Handle obj = Dart_NewExternalTypedData(Dart_TypedData_kUint8Clamped,
+                                              data, data_length);
+  ExternalTypedDataAccessTests(obj, Dart_TypedData_kUint8Clamped, data,
+                               data_length);
 }
 
 
 TEST_CASE(ExternalUint8ClampedArrayAccess) {
-    const char* kScriptChars =
+  const char* kScriptChars =
       "testClamped(List a) {\n"
       "  if (a[1] != 11) return false;\n"
       "  a[1] = 3;\n"
@@ -2349,7 +2325,7 @@
       "  return true;\n"
       "}\n";
 
-  uint8_t data[] = { 0, 11, 22, 33, 44, 55, 66, 77 };
+  uint8_t data[] = {0, 11, 22, 33, 44, 55, 66, 77};
   intptr_t data_length = ARRAY_SIZE(data);
   Dart_Handle obj = Dart_NewExternalTypedData(Dart_TypedData_kUint8Clamped,
                                               data, data_length);
@@ -2373,8 +2349,7 @@
 
 static void NopCallback(void* isolate_callback_data,
                         Dart_WeakPersistentHandle handle,
-                        void* peer) {
-}
+                        void* peer) {}
 
 
 static void UnreachedCallback(void* isolate_callback_data,
@@ -2395,13 +2370,11 @@
   int peer = 0;
   {
     Dart_EnterScope();
-    uint8_t data[] = { 1, 2, 3, 4 };
-    Dart_Handle obj = Dart_NewExternalTypedData(
-        Dart_TypedData_kUint8,
-        data,
-        ARRAY_SIZE(data));
-    Dart_NewWeakPersistentHandle(
-        obj, &peer, sizeof(data), ExternalTypedDataFinalizer);
+    uint8_t data[] = {1, 2, 3, 4};
+    Dart_Handle obj = Dart_NewExternalTypedData(Dart_TypedData_kUint8, data,
+                                                ARRAY_SIZE(data));
+    Dart_NewWeakPersistentHandle(obj, &peer, sizeof(data),
+                                 ExternalTypedDataFinalizer);
     EXPECT_VALID(obj);
     Dart_ExitScope();
   }
@@ -2468,7 +2441,7 @@
 
 
 TEST_CASE(Float32x4List) {
-    const char* kScriptChars =
+  const char* kScriptChars =
       "import 'dart:typed_data';\n"
       "Float32x4List float32x4() {\n"
       "  return new Float32x4List(10);\n"
@@ -2485,18 +2458,18 @@
   CheckFloat32x4Data(obj);
 
   int peer = 0;
-  float data[] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
-                   0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
-                   0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
-                   0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
+  float data[] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+                  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+                  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+                  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
   // Push a scope so that we can collect the local handle created as part of
   // Dart_NewExternalTypedData.
   Dart_EnterScope();
   {
-    Dart_Handle lcl = Dart_NewExternalTypedData(
-        Dart_TypedData_kFloat32x4, data, 10);
-    Dart_NewWeakPersistentHandle(
-        lcl, &peer, sizeof(data), ExternalTypedDataFinalizer);
+    Dart_Handle lcl =
+        Dart_NewExternalTypedData(Dart_TypedData_kFloat32x4, data, 10);
+    Dart_NewWeakPersistentHandle(lcl, &peer, sizeof(data),
+                                 ExternalTypedDataFinalizer);
     CheckFloat32x4Data(lcl);
   }
   Dart_ExitScope();
@@ -2693,12 +2666,12 @@
 
 TEST_CASE(WeakPersistentHandle) {
   Dart_Handle local_new_ref = Dart_Null();
-  weak_new_ref = Dart_NewWeakPersistentHandle(
-      local_new_ref, NULL, 0, WeakPersistentHandleCallback);
+  weak_new_ref = Dart_NewWeakPersistentHandle(local_new_ref, NULL, 0,
+                                              WeakPersistentHandleCallback);
 
   Dart_Handle local_old_ref = Dart_Null();
-  weak_old_ref = Dart_NewWeakPersistentHandle(
-      local_old_ref, NULL, 0, WeakPersistentHandleCallback);
+  weak_old_ref = Dart_NewWeakPersistentHandle(local_old_ref, NULL, 0,
+                                              WeakPersistentHandleCallback);
 
   {
     Dart_EnterScope();
@@ -2717,17 +2690,13 @@
     }
 
     // Create a weak ref to the new space object.
-    weak_new_ref = Dart_NewWeakPersistentHandle(new_ref,
-                                                NULL,
-                                                0,
+    weak_new_ref = Dart_NewWeakPersistentHandle(new_ref, NULL, 0,
                                                 WeakPersistentHandleCallback);
     EXPECT_VALID(AsHandle(weak_new_ref));
     EXPECT(!Dart_IsNull(AsHandle(weak_new_ref)));
 
     // Create a weak ref to the old space object.
-    weak_old_ref = Dart_NewWeakPersistentHandle(old_ref,
-                                                NULL,
-                                                0,
+    weak_old_ref = Dart_NewWeakPersistentHandle(old_ref, NULL, 0,
                                                 WeakPersistentHandleCallback);
     EXPECT_VALID(AsHandle(weak_old_ref));
     EXPECT(!Dart_IsNull(AsHandle(weak_old_ref)));
@@ -2822,15 +2791,15 @@
   // NULL callback.
   Dart_Handle obj1 = NewString("new string");
   EXPECT_VALID(obj1);
-  Dart_WeakPersistentHandle ref1 = Dart_NewWeakPersistentHandle(
-      obj1, NULL, 0, NULL);
+  Dart_WeakPersistentHandle ref1 =
+      Dart_NewWeakPersistentHandle(obj1, NULL, 0, NULL);
   EXPECT_EQ(ref1, static_cast<void*>(NULL));
 
   // Immediate object.
   Dart_Handle obj2 = Dart_NewInteger(0);
   EXPECT_VALID(obj2);
-  Dart_WeakPersistentHandle ref2 = Dart_NewWeakPersistentHandle(
-      obj2, NULL, 0, WeakPersistentHandleCallback);
+  Dart_WeakPersistentHandle ref2 =
+      Dart_NewWeakPersistentHandle(obj2, NULL, 0, WeakPersistentHandleCallback);
   EXPECT_EQ(ref2, static_cast<void*>(NULL));
 
   Dart_ExitScope();
@@ -2900,9 +2869,7 @@
   Dart_EnterScope();
   Dart_Handle ref = Dart_True();
   int peer = 1234;
-  Dart_NewWeakPersistentHandle(ref,
-                               &peer,
-                               0,
+  Dart_NewWeakPersistentHandle(ref, &peer, 0,
                                WeakPersistentHandlePeerFinalizer);
   Dart_ExitScope();
   Dart_ShutdownIsolate();
@@ -2920,9 +2887,7 @@
     Dart_EnterScope();
     Dart_Handle obj = NewString("weakly referenced string");
     EXPECT_VALID(obj);
-    weak1 = Dart_NewWeakPersistentHandle(obj,
-                                         NULL,
-                                         kWeak1ExternalSize,
+    weak1 = Dart_NewWeakPersistentHandle(obj, NULL, kWeak1ExternalSize,
                                          NopCallback);
     EXPECT_VALID(AsHandle(weak1));
     Dart_ExitScope();
@@ -2935,9 +2900,7 @@
     Dart_Handle obj = NewString("strongly referenced string");
     EXPECT_VALID(obj);
     strong_ref = Dart_NewPersistentHandle(obj);
-    weak2 = Dart_NewWeakPersistentHandle(obj,
-                                         NULL,
-                                         kWeak2ExternalSize,
+    weak2 = Dart_NewWeakPersistentHandle(obj, NULL, kWeak2ExternalSize,
                                          NopCallback);
     EXPECT_VALID(AsHandle(strong_ref));
     Dart_ExitScope();
@@ -2978,16 +2941,14 @@
     Dart_Handle obj = NewString("weakly referenced string");
     EXPECT_VALID(obj);
     // Triggers a scavenge immediately, since kWeak1ExternalSize is above limit.
-    weak1 = Dart_NewWeakPersistentHandle(obj,
-                                         NULL,
-                                         kWeak1ExternalSize,
+    weak1 = Dart_NewWeakPersistentHandle(obj, NULL, kWeak1ExternalSize,
                                          NopCallback);
     EXPECT_VALID(AsHandle(weak1));
     // ... but the object is still alive and not yet promoted, so external size
     // in new space is still above the limit. Thus, even the following tiny
     // external allocation will trigger another scavenge.
     Dart_WeakPersistentHandle trigger =
-      Dart_NewWeakPersistentHandle(obj, NULL, 1, NopCallback);
+        Dart_NewWeakPersistentHandle(obj, NULL, 1, NopCallback);
     EXPECT_VALID(AsHandle(trigger));
     Dart_DeleteWeakPersistentHandle(isolate, trigger);
     // After the two scavenges above, 'obj' should now be promoted, hence its
@@ -3026,9 +2987,7 @@
     Dart_EnterScope();
     Dart_Handle dead = Api::NewHandle(thread, String::New("dead", Heap::kOld));
     EXPECT_VALID(dead);
-    weak = Dart_NewWeakPersistentHandle(dead,
-                                        NULL,
-                                        kSmallExternalSize,
+    weak = Dart_NewWeakPersistentHandle(dead, NULL, kSmallExternalSize,
                                         NopCallback);
     EXPECT_VALID(AsHandle(weak));
     Dart_ExitScope();
@@ -3037,10 +2996,7 @@
             isolate->heap()->ExternalInWords(Heap::kOld) * kWordSize);
   // Large enough to trigger GC in old space. Not actually allocated.
   const intptr_t kHugeExternalSize = (kWordSize == 4) ? 513 * MB : 1025 * MB;
-  Dart_NewWeakPersistentHandle(live,
-                               NULL,
-                               kHugeExternalSize,
-                               NopCallback);
+  Dart_NewWeakPersistentHandle(live, NULL, kHugeExternalSize, NopCallback);
   // Expect small garbage to be collected.
   EXPECT_EQ(kHugeExternalSize,
             isolate->heap()->ExternalInWords(Heap::kOld) * kWordSize);
@@ -3059,13 +3015,13 @@
     Dart_EnterScope();
     Dart_Handle dart_true = Dart_True();  // VM heap object.
     EXPECT_VALID(dart_true);
-    weak1 = Dart_NewWeakPersistentHandle(
-        dart_true, NULL, kWeak1ExternalSize, UnreachedCallback);
+    weak1 = Dart_NewWeakPersistentHandle(dart_true, NULL, kWeak1ExternalSize,
+                                         UnreachedCallback);
     EXPECT_VALID(AsHandle(weak1));
     Dart_Handle zero = Dart_False();  // VM heap object.
     EXPECT_VALID(zero);
-    weak2 = Dart_NewWeakPersistentHandle(
-        zero, NULL, kWeak2ExternalSize, UnreachedCallback);
+    weak2 = Dart_NewWeakPersistentHandle(zero, NULL, kWeak2ExternalSize,
+                                         UnreachedCallback);
     EXPECT_VALID(AsHandle(weak2));
     // Both should be charged to old space.
     EXPECT(heap->ExternalInWords(Heap::kOld) ==
@@ -3111,8 +3067,8 @@
     CHECK_API_SCOPE(thread);
     HANDLESCOPE(thread);
 
-    Dart_Handle local = Api::NewHandle(
-        thread, String::New("strongly reachable", Heap::kOld));
+    Dart_Handle local =
+        Api::NewHandle(thread, String::New("strongly reachable", Heap::kOld));
     strong = Dart_NewPersistentHandle(local);
     strong_weak = Dart_NewWeakPersistentHandle(local, NULL, 0, NopCallback);
 
@@ -3178,8 +3134,8 @@
     CHECK_API_SCOPE(thread);
     HANDLESCOPE(thread);
 
-    Dart_Handle local = Api::NewHandle(
-        thread, String::New("strongly reachable", Heap::kOld));
+    Dart_Handle local =
+        Api::NewHandle(thread, String::New("strongly reachable", Heap::kOld));
     strong = Dart_NewPersistentHandle(local);
     strong_weak = Dart_NewWeakPersistentHandle(local, NULL, 0, NopCallback);
 
@@ -3250,8 +3206,7 @@
 static int global_epilogue_callback_status;
 
 
-static void EpilogueCallbackNOP() {
-}
+static void EpilogueCallbackNOP() {}
 
 
 static void EpilogueCallbackTimes4() {
@@ -3268,16 +3223,16 @@
   // GC callback addition testing.
 
   // Add GC callbacks.
-  EXPECT_VALID(Dart_SetGcCallbacks(&PrologueCallbackTimes2,
-                                   &EpilogueCallbackTimes4));
+  EXPECT_VALID(
+      Dart_SetGcCallbacks(&PrologueCallbackTimes2, &EpilogueCallbackTimes4));
 
   // Add the same callbacks again.  This is an error.
-  EXPECT(Dart_IsError(Dart_SetGcCallbacks(&PrologueCallbackTimes2,
-                                          &EpilogueCallbackTimes4)));
+  EXPECT(Dart_IsError(
+      Dart_SetGcCallbacks(&PrologueCallbackTimes2, &EpilogueCallbackTimes4)));
 
   // Add another callback. This is an error.
-  EXPECT(Dart_IsError(Dart_SetGcCallbacks(&PrologueCallbackTimes3,
-                                          &EpilogueCallbackTimes5)));
+  EXPECT(Dart_IsError(
+      Dart_SetGcCallbacks(&PrologueCallbackTimes3, &EpilogueCallbackTimes5)));
 
   // GC callback removal testing.
 
@@ -3287,8 +3242,8 @@
   // Remove GC callbacks whennone exist.  This is an error.
   EXPECT(Dart_IsError(Dart_SetGcCallbacks(NULL, NULL)));
 
-  EXPECT_VALID(Dart_SetGcCallbacks(&PrologueCallbackTimes2,
-                                   &EpilogueCallbackTimes4));
+  EXPECT_VALID(
+      Dart_SetGcCallbacks(&PrologueCallbackTimes2, &EpilogueCallbackTimes4));
   EXPECT(Dart_IsError(Dart_SetGcCallbacks(&PrologueCallbackTimes2, NULL)));
   EXPECT(Dart_IsError(Dart_SetGcCallbacks(NULL, &EpilogueCallbackTimes4)));
 }
@@ -3296,8 +3251,8 @@
 
 TEST_CASE(SingleGarbageCollectionCallback) {
   // Add a prologue callback.
-  EXPECT_VALID(Dart_SetGcCallbacks(&PrologueCallbackTimes2,
-                                   &EpilogueCallbackNOP));
+  EXPECT_VALID(
+      Dart_SetGcCallbacks(&PrologueCallbackTimes2, &EpilogueCallbackNOP));
 
   {
     TransitionNativeToVM transition(thread);
@@ -3318,13 +3273,12 @@
     EXPECT_EQ(6, global_prologue_callback_status);
     EXPECT_EQ(7, global_epilogue_callback_status);
 
-  // Garbage collect old space ignoring callbacks.  This should invoke
-  // the prologue callback.  The prologue status value should change.
+    // Garbage collect old space ignoring callbacks.  This should invoke
+    // the prologue callback.  The prologue status value should change.
     global_prologue_callback_status = 3;
     global_epilogue_callback_status = 7;
-    Isolate::Current()->heap()->CollectGarbage(Heap::kOld,
-                                               Heap::kIgnoreApiCallbacks,
-                                               Heap::kGCTestCase);
+    Isolate::Current()->heap()->CollectGarbage(
+        Heap::kOld, Heap::kIgnoreApiCallbacks, Heap::kGCTestCase);
     EXPECT_EQ(3, global_prologue_callback_status);
     EXPECT_EQ(7, global_epilogue_callback_status);
 
@@ -3345,8 +3299,8 @@
 
   // Add an epilogue callback.
   EXPECT_VALID(Dart_SetGcCallbacks(NULL, NULL));
-  EXPECT_VALID(Dart_SetGcCallbacks(&PrologueCallbackTimes2,
-                                   &EpilogueCallbackTimes4));
+  EXPECT_VALID(
+      Dart_SetGcCallbacks(&PrologueCallbackTimes2, &EpilogueCallbackTimes4));
 
   {
     TransitionNativeToVM transition(thread);
@@ -3376,9 +3330,8 @@
 
     // Garbage collect old space again without invoking callbacks.
     // Nothing should change.
-    Isolate::Current()->heap()->CollectGarbage(Heap::kOld,
-                                               Heap::kIgnoreApiCallbacks,
-                                               Heap::kGCTestCase);
+    Isolate::Current()->heap()->CollectGarbage(
+        Heap::kOld, Heap::kIgnoreApiCallbacks, Heap::kGCTestCase);
     EXPECT_EQ(6, global_prologue_callback_status);
     EXPECT_EQ(28, global_epilogue_callback_status);
 
@@ -3543,8 +3496,7 @@
   char* err;
   Dart_Isolate isolate =
       Dart_CreateIsolate(NULL, NULL, bin::isolate_snapshot_buffer, NULL,
-                         reinterpret_cast<void*>(mydata),
-                         &err);
+                         reinterpret_cast<void*>(mydata), &err);
   EXPECT(isolate != NULL);
   EXPECT_EQ(mydata, reinterpret_cast<intptr_t>(Dart_CurrentIsolateData()));
   EXPECT_EQ(mydata, reinterpret_cast<intptr_t>(Dart_IsolateData(isolate)));
@@ -3573,10 +3525,8 @@
   api_flags.enable_error_on_bad_override = true;
 
   char* err;
-  Dart_Isolate isolate = Dart_CreateIsolate(NULL, NULL,
-                                            bin::isolate_snapshot_buffer,
-                                            &api_flags,
-                                            NULL, &err);
+  Dart_Isolate isolate = Dart_CreateIsolate(
+      NULL, NULL, bin::isolate_snapshot_buffer, &api_flags, NULL, &err);
   if (isolate == NULL) {
     OS::Print("Creation of isolate failed '%s'\n", err);
     free(err);
@@ -3594,8 +3544,9 @@
     result = Dart_FinalizeLoading(false);
     EXPECT_VALID(result);
     result = Dart_Invoke(lib, NewString("bad1"), 0, NULL);
-    EXPECT_ERROR(result, "Unhandled exception:\n"
-        "type 'String' is not a subtype of type 'int' of 'foo'");
+    EXPECT_ERROR(result,
+                 "Unhandled exception:\n"
+                 "type 'String' is not a subtype of type 'int' of 'foo'");
 
     result = Dart_Invoke(lib, NewString("good1"), 0, NULL);
     EXPECT_VALID(result);
@@ -3616,8 +3567,7 @@
 }
 
 
-static void MyMessageNotifyCallback(Dart_Isolate dest_isolate) {
-}
+static void MyMessageNotifyCallback(Dart_Isolate dest_isolate) {}
 
 
 UNIT_TEST_CASE(SetMessageCallbacks) {
@@ -3630,8 +3580,7 @@
 
 
 TEST_CASE(SetStickyError) {
-    const char* kScriptChars =
-      "main() => throw 'HI';";
+  const char* kScriptChars = "main() => throw 'HI';";
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
   Dart_Handle retobj = Dart_Invoke(lib, NewString("main"), 0, NULL);
   EXPECT(Dart_IsError(retobj));
@@ -3670,7 +3619,7 @@
       "Type getMyClass1Type() { return new MyClass1().runtimeType; }\n"
       "Type getMyClass2Type() { return new MyClass2().runtimeType; }\n";
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
-  bool instanceof = false;
+  bool instanceOf = false;
 
   // First get the type objects of these non parameterized types.
   Dart_Handle type0 = Dart_GetType(lib, NewString("MyClass0"), 0, NULL);
@@ -3689,16 +3638,16 @@
   // MyClass0 type.
   Dart_Handle type0_obj = Dart_Invoke(lib, NewString("getMyClass0"), 0, NULL);
   EXPECT_VALID(type0_obj);
-  EXPECT_VALID(Dart_ObjectIsType(type0_obj, type0, &instanceof));
-  EXPECT(instanceof);
-  EXPECT_VALID(Dart_ObjectIsType(type0_obj, type1, &instanceof));
-  EXPECT(!instanceof);
-  EXPECT_VALID(Dart_ObjectIsType(type0_obj, type2, &instanceof));
-  EXPECT(!instanceof);
-  EXPECT_VALID(Dart_ObjectIsType(type0_obj, type3, &instanceof));
-  EXPECT(!instanceof);
-  EXPECT_VALID(Dart_ObjectIsType(type0_obj, type4, &instanceof));
-  EXPECT(!instanceof);
+  EXPECT_VALID(Dart_ObjectIsType(type0_obj, type0, &instanceOf));
+  EXPECT(instanceOf);
+  EXPECT_VALID(Dart_ObjectIsType(type0_obj, type1, &instanceOf));
+  EXPECT(!instanceOf);
+  EXPECT_VALID(Dart_ObjectIsType(type0_obj, type2, &instanceOf));
+  EXPECT(!instanceOf);
+  EXPECT_VALID(Dart_ObjectIsType(type0_obj, type3, &instanceOf));
+  EXPECT(!instanceOf);
+  EXPECT_VALID(Dart_ObjectIsType(type0_obj, type4, &instanceOf));
+  EXPECT(!instanceOf);
   type0_obj = Dart_Invoke(lib, NewString("getMyClass0Type"), 0, NULL);
   EXPECT_VALID(type0_obj);
   EXPECT(Dart_IdentityEquals(type0, type0_obj));
@@ -3706,16 +3655,16 @@
   // MyClass1 type.
   Dart_Handle type1_obj = Dart_Invoke(lib, NewString("getMyClass1"), 0, NULL);
   EXPECT_VALID(type1_obj);
-  EXPECT_VALID(Dart_ObjectIsType(type1_obj, type1, &instanceof));
-  EXPECT(instanceof);
-  EXPECT_VALID(Dart_ObjectIsType(type1_obj, type0, &instanceof));
-  EXPECT(!instanceof);
-  EXPECT_VALID(Dart_ObjectIsType(type1_obj, type2, &instanceof));
-  EXPECT(!instanceof);
-  EXPECT_VALID(Dart_ObjectIsType(type1_obj, type3, &instanceof));
-  EXPECT(instanceof);
-  EXPECT_VALID(Dart_ObjectIsType(type1_obj, type4, &instanceof));
-  EXPECT(instanceof);
+  EXPECT_VALID(Dart_ObjectIsType(type1_obj, type1, &instanceOf));
+  EXPECT(instanceOf);
+  EXPECT_VALID(Dart_ObjectIsType(type1_obj, type0, &instanceOf));
+  EXPECT(!instanceOf);
+  EXPECT_VALID(Dart_ObjectIsType(type1_obj, type2, &instanceOf));
+  EXPECT(!instanceOf);
+  EXPECT_VALID(Dart_ObjectIsType(type1_obj, type3, &instanceOf));
+  EXPECT(instanceOf);
+  EXPECT_VALID(Dart_ObjectIsType(type1_obj, type4, &instanceOf));
+  EXPECT(instanceOf);
   type1_obj = Dart_Invoke(lib, NewString("getMyClass1Type"), 0, NULL);
   EXPECT_VALID(type1_obj);
   EXPECT(Dart_IdentityEquals(type1, type1_obj));
@@ -3723,16 +3672,16 @@
   // MyClass2 type.
   Dart_Handle type2_obj = Dart_Invoke(lib, NewString("getMyClass2"), 0, NULL);
   EXPECT_VALID(type2_obj);
-  EXPECT_VALID(Dart_ObjectIsType(type2_obj, type2, &instanceof));
-  EXPECT(instanceof);
-  EXPECT_VALID(Dart_ObjectIsType(type2_obj, type0, &instanceof));
-  EXPECT(!instanceof);
-  EXPECT_VALID(Dart_ObjectIsType(type2_obj, type1, &instanceof));
-  EXPECT(!instanceof);
-  EXPECT_VALID(Dart_ObjectIsType(type2_obj, type3, &instanceof));
-  EXPECT(instanceof);
-  EXPECT_VALID(Dart_ObjectIsType(type2_obj, type4, &instanceof));
-  EXPECT(instanceof);
+  EXPECT_VALID(Dart_ObjectIsType(type2_obj, type2, &instanceOf));
+  EXPECT(instanceOf);
+  EXPECT_VALID(Dart_ObjectIsType(type2_obj, type0, &instanceOf));
+  EXPECT(!instanceOf);
+  EXPECT_VALID(Dart_ObjectIsType(type2_obj, type1, &instanceOf));
+  EXPECT(!instanceOf);
+  EXPECT_VALID(Dart_ObjectIsType(type2_obj, type3, &instanceOf));
+  EXPECT(instanceOf);
+  EXPECT_VALID(Dart_ObjectIsType(type2_obj, type4, &instanceOf));
+  EXPECT(instanceOf);
   type2_obj = Dart_Invoke(lib, NewString("getMyClass2Type"), 0, NULL);
   EXPECT_VALID(type2_obj);
   EXPECT(Dart_IdentityEquals(type2, type2_obj));
@@ -3771,7 +3720,7 @@
       "  return new MyClass1<List<int>, List<double>>().runtimeType;\n"
       "}\n";
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
-  bool instanceof = false;
+  bool instanceOf = false;
 
   // First get type objects of some of the basic types used in the test.
   Dart_Handle int_type = Dart_GetType(lib, NewString("int"), 0, NULL);
@@ -3782,10 +3731,8 @@
   EXPECT_VALID(list_type);
   Dart_Handle type_args = Dart_NewList(1);
   EXPECT_VALID(Dart_ListSetAt(type_args, 0, int_type));
-  Dart_Handle list_int_type = Dart_GetType(lib,
-                                           NewString("List"),
-                                           1,
-                                           &type_args);
+  Dart_Handle list_int_type =
+      Dart_GetType(lib, NewString("List"), 1, &type_args);
   EXPECT_VALID(list_int_type);
 
   // Now instantiate MyClass0 and MyClass1 types with the same type arguments
@@ -3793,19 +3740,15 @@
   type_args = Dart_NewList(2);
   EXPECT_VALID(Dart_ListSetAt(type_args, 0, int_type));
   EXPECT_VALID(Dart_ListSetAt(type_args, 1, double_type));
-  Dart_Handle myclass0_type = Dart_GetType(lib,
-                                           NewString("MyClass0"),
-                                           2,
-                                           &type_args);
+  Dart_Handle myclass0_type =
+      Dart_GetType(lib, NewString("MyClass0"), 2, &type_args);
   EXPECT_VALID(myclass0_type);
 
   type_args = Dart_NewList(2);
   EXPECT_VALID(Dart_ListSetAt(type_args, 0, list_int_type));
   EXPECT_VALID(Dart_ListSetAt(type_args, 1, list_type));
-  Dart_Handle myclass1_type = Dart_GetType(lib,
-                                           NewString("MyClass1"),
-                                           2,
-                                           &type_args);
+  Dart_Handle myclass1_type =
+      Dart_GetType(lib, NewString("MyClass1"), 2, &type_args);
   EXPECT_VALID(myclass1_type);
 
   // Now create objects of the type and validate the object type matches
@@ -3814,8 +3757,8 @@
   // MyClass0<int, double> type.
   Dart_Handle type0_obj = Dart_Invoke(lib, NewString("getMyClass0"), 0, NULL);
   EXPECT_VALID(type0_obj);
-  EXPECT_VALID(Dart_ObjectIsType(type0_obj, myclass0_type, &instanceof));
-  EXPECT(instanceof);
+  EXPECT_VALID(Dart_ObjectIsType(type0_obj, myclass0_type, &instanceOf));
+  EXPECT(instanceOf);
   type0_obj = Dart_Invoke(lib, NewString("getMyClass0Type"), 0, NULL);
   EXPECT_VALID(type0_obj);
   EXPECT(Dart_IdentityEquals(type0_obj, myclass0_type));
@@ -3823,8 +3766,8 @@
   // MyClass1<List<int>, List> type.
   Dart_Handle type1_obj = Dart_Invoke(lib, NewString("getMyClass1"), 0, NULL);
   EXPECT_VALID(type1_obj);
-  EXPECT_VALID(Dart_ObjectIsType(type1_obj, myclass1_type, &instanceof));
-  EXPECT(instanceof);
+  EXPECT_VALID(Dart_ObjectIsType(type1_obj, myclass1_type, &instanceOf));
+  EXPECT(instanceOf);
   type1_obj = Dart_Invoke(lib, NewString("getMyClass1Type"), 0, NULL);
   EXPECT_VALID(type1_obj);
   EXPECT(Dart_IdentityEquals(type1_obj, myclass1_type));
@@ -3832,8 +3775,8 @@
   // MyClass0<double, int> type.
   type0_obj = Dart_Invoke(lib, NewString("getMyClass0_1"), 0, NULL);
   EXPECT_VALID(type0_obj);
-  EXPECT_VALID(Dart_ObjectIsType(type0_obj, myclass0_type, &instanceof));
-  EXPECT(!instanceof);
+  EXPECT_VALID(Dart_ObjectIsType(type0_obj, myclass0_type, &instanceOf));
+  EXPECT(!instanceOf);
   type0_obj = Dart_Invoke(lib, NewString("getMyClass0_1Type"), 0, NULL);
   EXPECT_VALID(type0_obj);
   EXPECT(!Dart_IdentityEquals(type0_obj, myclass0_type));
@@ -3841,8 +3784,8 @@
   // MyClass1<List<int>, List<double>> type.
   type1_obj = Dart_Invoke(lib, NewString("getMyClass1_1"), 0, NULL);
   EXPECT_VALID(type1_obj);
-  EXPECT_VALID(Dart_ObjectIsType(type1_obj, myclass1_type, &instanceof));
-  EXPECT(instanceof);
+  EXPECT_VALID(Dart_ObjectIsType(type1_obj, myclass1_type, &instanceOf));
+  EXPECT(instanceOf);
   type1_obj = Dart_Invoke(lib, NewString("getMyClass1_1Type"), 0, NULL);
   EXPECT_VALID(type1_obj);
   EXPECT(!Dart_IdentityEquals(type1_obj, myclass1_type));
@@ -3887,8 +3830,7 @@
 }
 
 
-static void TestFieldNotFound(Dart_Handle container,
-                              Dart_Handle name) {
+static void TestFieldNotFound(Dart_Handle container, Dart_Handle name) {
   EXPECT(Dart_IsError(Dart_GetField(container, name)));
   EXPECT(Dart_IsError(Dart_SetField(container, name, Dart_Null())));
 }
@@ -4147,8 +4089,7 @@
 
 
 TEST_CASE(SetField_FunnyValue) {
-  const char* kScriptChars =
-      "var top;\n";
+  const char* kScriptChars = "var top;\n";
 
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
   Dart_Handle name = NewString("top");
@@ -4213,14 +4154,12 @@
   const int kNumNativeFields = 4;
 
   // Create a test library.
-  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL,
-                                             USER_TEST_URI, false);
+  Dart_Handle lib =
+      TestCase::LoadTestScript(kScriptChars, NULL, USER_TEST_URI, false);
 
   // Create a native wrapper class with native fields.
-  result = Dart_CreateNativeWrapperClass(
-      lib,
-      NewString("NativeFieldsWrapper"),
-      kNumNativeFields);
+  result = Dart_CreateNativeWrapperClass(lib, NewString("NativeFieldsWrapper"),
+                                         kNumNativeFields);
   EXPECT_VALID(result);
   result = Dart_FinalizeLoading(false);
   EXPECT_VALID(result);
@@ -4242,9 +4181,9 @@
   // We check to make sure the instance size computed by the VM matches
   // our expectations.
   intptr_t header_size = sizeof(RawObject);
-  EXPECT_EQ(Utils::RoundUp(((1 + 2) * kWordSize) + header_size,
-                           kObjectAlignment),
-            cls.instance_size());
+  EXPECT_EQ(
+      Utils::RoundUp(((1 + 2) * kWordSize) + header_size, kObjectAlignment),
+      cls.instance_size());
   EXPECT_EQ(kNumNativeFields, cls.num_native_fields());
 }
 
@@ -4264,8 +4203,8 @@
       "}\n";
   Dart_Handle result;
   // Create a test library and Load up a test script in it.
-  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL,
-                                             USER_TEST_URI, false);
+  Dart_Handle lib =
+      TestCase::LoadTestScript(kScriptChars, NULL, USER_TEST_URI, false);
 
   // Invoke a function which returns an object of type NativeFields.
   result = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
@@ -4295,8 +4234,7 @@
   const int kNumNativeFields = 2;
 
   // Load up a test script in the test library.
-  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars,
-                                             native_field_lookup);
+  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, native_field_lookup);
 
   // Invoke a function which returns an object of type NativeFields.
   result = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
@@ -4313,9 +4251,9 @@
   // We check to make sure the instance size computed by the VM matches
   // our expectations.
   intptr_t header_size = sizeof(RawObject);
-  EXPECT_EQ(Utils::RoundUp(((1 + 2) * kWordSize) + header_size,
-                           kObjectAlignment),
-            cls.instance_size());
+  EXPECT_EQ(
+      Utils::RoundUp(((1 + 2) * kWordSize) + header_size, kObjectAlignment),
+      cls.instance_size());
   EXPECT_EQ(kNumNativeFields, cls.num_native_fields());
 }
 
@@ -4369,16 +4307,12 @@
 
 void TestNativeFieldsAccess_access(Dart_NativeArguments args) {
   intptr_t field_values[kTestNumNativeFields];
-  Dart_Handle result = Dart_GetNativeFieldsOfArgument(args,
-                                                      0,
-                                                      kTestNumNativeFields,
-                                                      field_values);
+  Dart_Handle result = Dart_GetNativeFieldsOfArgument(
+      args, 0, kTestNumNativeFields, field_values);
   EXPECT_VALID(result);
   EXPECT_EQ(kNativeField1Value, field_values[0]);
   EXPECT_EQ(kNativeField2Value, field_values[1]);
-  result = Dart_GetNativeFieldsOfArgument(args,
-                                          1,
-                                          kTestNumNativeFields,
+  result = Dart_GetNativeFieldsOfArgument(args, 1, kTestNumNativeFields,
                                           field_values);
   EXPECT_VALID(result);
   EXPECT_EQ(0, field_values[0]);
@@ -4428,8 +4362,8 @@
       "}\n";
 
   // Load up a test script in the test library.
-  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars,
-                                             TestNativeFieldsAccess_lookup);
+  Dart_Handle lib =
+      TestCase::LoadTestScript(kScriptChars, TestNativeFieldsAccess_lookup);
 
   // Invoke a function which returns an object of type NativeFields.
   Dart_Handle result = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
@@ -4483,13 +4417,9 @@
   EXPECT_VALID(result);
   result = Dart_IntegerToInt64(result, &value);
   EXPECT_EQ(20, value);
-  result = Dart_SetField(retobj,
-                         NewString("fld2"),
-                         Dart_NewInteger(40));
+  result = Dart_SetField(retobj, NewString("fld2"), Dart_NewInteger(40));
   EXPECT(Dart_IsError(result));
-  result = Dart_SetField(retobj,
-                         NewString("fld1"),
-                         Dart_NewInteger(40));
+  result = Dart_SetField(retobj, NewString("fld1"), Dart_NewInteger(40));
   EXPECT_VALID(result);
   result = Dart_GetField(retobj, NewString("fld1"));
   EXPECT_VALID(result);
@@ -4564,16 +4494,12 @@
   const int kNumNativeFields = 4;
 
   // Create a test library.
-  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars,
-                                             native_field_lookup,
-                                             USER_TEST_URI,
-                                             false);
+  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, native_field_lookup,
+                                             USER_TEST_URI, false);
 
   // Create a native wrapper class with native fields.
   Dart_Handle result = Dart_CreateNativeWrapperClass(
-      lib,
-      NewString("NativeFieldsWrapper"),
-      kNumNativeFields);
+      lib, NewString("NativeFieldsWrapper"), kNumNativeFields);
   EXPECT_VALID(result);
   result = Dart_FinalizeLoading(false);
   EXPECT_VALID(result);
@@ -4617,8 +4543,7 @@
       "  return obj;\n"
       "}\n";
   // Load up a test script in the test library.
-  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars,
-                                             native_field_lookup);
+  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, native_field_lookup);
 
   // Invoke a function which returns an object of type NativeFields.
   Dart_Handle retobj = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
@@ -4770,9 +4695,7 @@
   EXPECT_EQ(11, value);
 
   // Overwrite fld2
-  result = Dart_SetField(type,
-                         NewString("fld2"),
-                         Dart_NewInteger(13));
+  result = Dart_SetField(type, NewString("fld2"), Dart_NewInteger(13));
   EXPECT_VALID(result);
 
   // We now get the new value for fld2, not the initializer
@@ -4871,9 +4794,9 @@
   // Allocate and Invoke the unnamed constructor passing in Dart_Null.
   Dart_Handle result = Dart_New(type, Dart_Null(), 0, NULL);
   EXPECT_VALID(result);
-  bool instanceof = false;
-  EXPECT_VALID(Dart_ObjectIsType(result, type, &instanceof));
-  EXPECT(instanceof);
+  bool instanceOf = false;
+  EXPECT_VALID(Dart_ObjectIsType(result, type, &instanceOf));
+  EXPECT(instanceOf);
   int64_t int_value = 0;
   Dart_Handle foo = Dart_GetField(result, NewString("foo"));
   EXPECT_VALID(Dart_IntegerToInt64(foo, &int_value));
@@ -4882,18 +4805,18 @@
   // Allocate without a constructor.
   Dart_Handle obj = Dart_Allocate(type);
   EXPECT_VALID(obj);
-  instanceof = false;
-  EXPECT_VALID(Dart_ObjectIsType(obj, type, &instanceof));
-  EXPECT(instanceof);
+  instanceOf = false;
+  EXPECT_VALID(Dart_ObjectIsType(obj, type, &instanceOf));
+  EXPECT(instanceOf);
   foo = Dart_GetField(obj, NewString("foo"));
   EXPECT(Dart_IsNull(foo));
 
   // Allocate and Invoke the unnamed constructor passing in an empty string.
   result = Dart_New(type, Dart_EmptyString(), 0, NULL);
   EXPECT_VALID(result);
-  instanceof = false;
-  EXPECT_VALID(Dart_ObjectIsType(result, type, &instanceof));
-  EXPECT(instanceof);
+  instanceOf = false;
+  EXPECT_VALID(Dart_ObjectIsType(result, type, &instanceOf));
+  EXPECT(instanceOf);
   int_value = 0;
   foo = Dart_GetField(result, NewString("foo"));
   EXPECT_VALID(Dart_IntegerToInt64(foo, &int_value));
@@ -4902,9 +4825,9 @@
   // Allocate object and invoke the unnamed constructor with an empty string.
   obj = Dart_Allocate(type);
   EXPECT_VALID(obj);
-  instanceof = false;
-  EXPECT_VALID(Dart_ObjectIsType(obj, type, &instanceof));
-  EXPECT(instanceof);
+  instanceOf = false;
+  EXPECT_VALID(Dart_ObjectIsType(obj, type, &instanceOf));
+  EXPECT(instanceOf);
   // Use the empty string to invoke the unnamed constructor.
   result = Dart_InvokeConstructor(obj, Dart_EmptyString(), 0, NULL);
   EXPECT_VALID(result);
@@ -4923,8 +4846,8 @@
   // Invoke a named constructor.
   result = Dart_New(type, NewString("named"), 1, args);
   EXPECT_VALID(result);
-  EXPECT_VALID(Dart_ObjectIsType(result, type, &instanceof));
-  EXPECT(instanceof);
+  EXPECT_VALID(Dart_ObjectIsType(result, type, &instanceOf));
+  EXPECT(instanceOf);
   int_value = 0;
   foo = Dart_GetField(result, NewString("foo"));
   EXPECT_VALID(Dart_IntegerToInt64(foo, &int_value));
@@ -4933,9 +4856,9 @@
   // Allocate object and invoke a named constructor.
   obj = Dart_Allocate(type);
   EXPECT_VALID(obj);
-  instanceof = false;
-  EXPECT_VALID(Dart_ObjectIsType(obj, type, &instanceof));
-  EXPECT(instanceof);
+  instanceOf = false;
+  EXPECT_VALID(Dart_ObjectIsType(obj, type, &instanceOf));
+  EXPECT(instanceOf);
   result = Dart_InvokeConstructor(obj, NewString("named"), 1, args);
   EXPECT_VALID(result);
   int_value = 0;
@@ -4946,8 +4869,8 @@
   // Invoke a hidden named constructor.
   result = Dart_New(type, NewString("_hidden"), 1, args);
   EXPECT_VALID(result);
-  EXPECT_VALID(Dart_ObjectIsType(result, type, &instanceof));
-  EXPECT(instanceof);
+  EXPECT_VALID(Dart_ObjectIsType(result, type, &instanceOf));
+  EXPECT(instanceOf);
   int_value = 0;
   foo = Dart_GetField(result, NewString("foo"));
   EXPECT_VALID(Dart_IntegerToInt64(foo, &int_value));
@@ -4956,9 +4879,9 @@
   // Allocate object and invoke a hidden named constructor.
   obj = Dart_Allocate(type);
   EXPECT_VALID(obj);
-  instanceof = false;
-  EXPECT_VALID(Dart_ObjectIsType(obj, type, &instanceof));
-  EXPECT(instanceof);
+  instanceOf = false;
+  EXPECT_VALID(Dart_ObjectIsType(obj, type, &instanceOf));
+  EXPECT(instanceOf);
   result = Dart_InvokeConstructor(obj, NewString("_hidden"), 1, args);
   EXPECT_VALID(result);
   int_value = 0;
@@ -4969,17 +4892,17 @@
   // Allocate object and Invoke a constructor which throws an exception.
   obj = Dart_Allocate(type);
   EXPECT_VALID(obj);
-  instanceof = false;
-  EXPECT_VALID(Dart_ObjectIsType(obj, type, &instanceof));
-  EXPECT(instanceof);
+  instanceOf = false;
+  EXPECT_VALID(Dart_ObjectIsType(obj, type, &instanceOf));
+  EXPECT(instanceOf);
   result = Dart_InvokeConstructor(obj, NewString("exception"), 1, args);
   EXPECT_ERROR(result, "ConstructorDeath");
 
   // Invoke a factory constructor.
   result = Dart_New(type, NewString("multiply"), 1, args);
   EXPECT_VALID(result);
-  EXPECT_VALID(Dart_ObjectIsType(result, type, &instanceof));
-  EXPECT(instanceof);
+  EXPECT_VALID(Dart_ObjectIsType(result, type, &instanceOf));
+  EXPECT(instanceOf);
   int_value = 0;
   foo = Dart_GetField(result, NewString("foo"));
   EXPECT_VALID(Dart_IntegerToInt64(foo, &int_value));
@@ -5033,8 +4956,8 @@
   // Invoke two-hop redirecting factory constructor.
   result = Dart_New(intf, NewString("named"), 1, args);
   EXPECT_VALID(result);
-  EXPECT_VALID(Dart_ObjectIsType(result, type, &instanceof));
-  EXPECT(instanceof);
+  EXPECT_VALID(Dart_ObjectIsType(result, type, &instanceOf));
+  EXPECT(instanceOf);
   int_value = 0;
   foo = Dart_GetField(result, NewString("foo"));
   EXPECT_VALID(Dart_IntegerToInt64(foo, &int_value));
@@ -5043,8 +4966,8 @@
   // Invoke one-hop redirecting factory constructor.
   result = Dart_New(intf, NewString("multiply"), 1, args);
   EXPECT_VALID(result);
-  EXPECT_VALID(Dart_ObjectIsType(result, type, &instanceof));
-  EXPECT(instanceof);
+  EXPECT_VALID(Dart_ObjectIsType(result, type, &instanceOf));
+  EXPECT(instanceOf);
   int_value = 0;
   foo = Dart_GetField(result, NewString("foo"));
   EXPECT_VALID(Dart_IntegerToInt64(foo, &int_value));
@@ -5052,14 +4975,13 @@
 
   // Invoke a constructor that is missing in the interface.
   result = Dart_New(intf, Dart_Null(), 0, NULL);
-  EXPECT_ERROR(result,
-               "Dart_New: could not find constructor 'MyInterface.'.");
+  EXPECT_ERROR(result, "Dart_New: could not find constructor 'MyInterface.'.");
 
   // Invoke abstract constructor that is present in the interface.
   result = Dart_New(intf, NewString("notfound"), 1, args);
   EXPECT_VALID(result);
-  EXPECT_VALID(Dart_ObjectIsType(result, type, &instanceof));
-  EXPECT(!instanceof);
+  EXPECT_VALID(Dart_ObjectIsType(result, type, &instanceOf));
+  EXPECT(!instanceOf);
 }
 
 
@@ -5237,8 +5159,7 @@
 
 
 TEST_CASE(Invoke_FunnyArgs) {
-  const char* kScriptChars =
-      "test(arg) => 'hello $arg';\n";
+  const char* kScriptChars = "test(arg) => 'hello $arg';\n";
 
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
   Dart_Handle func_name = NewString("test");
@@ -5260,8 +5181,7 @@
   EXPECT_STREQ("hello null", str);
 
   // Pass an error handle as the target.  The error is propagated.
-  result = Dart_Invoke(Api::NewError("myerror"),
-                       func_name, 1, args);
+  result = Dart_Invoke(Api::NewError("myerror"), func_name, 1, args);
   EXPECT(Dart_IsError(result));
   EXPECT_STREQ("myerror", Dart_GetError(result));
 
@@ -5286,10 +5206,7 @@
 
 
 TEST_CASE(Invoke_Null) {
-  Dart_Handle result = Dart_Invoke(Dart_Null(),
-                                   NewString("toString"),
-                                   0,
-                                   NULL);
+  Dart_Handle result = Dart_Invoke(Dart_Null(), NewString("toString"), 0, NULL);
   EXPECT_VALID(result);
   EXPECT(Dart_IsString(result));
 
@@ -5298,10 +5215,7 @@
   EXPECT_STREQ("null", value);
 
   Dart_Handle function_name = NewString("NoNoNo");
-  result = Dart_Invoke(Dart_Null(),
-                       function_name,
-                       0,
-                       NULL);
+  result = Dart_Invoke(Dart_Null(), function_name, 0, NULL);
   EXPECT(Dart_IsError(result));
   EXPECT(Dart_ErrorHasException(result));
 }
@@ -5495,16 +5409,14 @@
 
 
 TEST_CASE(ThrowException) {
-  const char* kScriptChars =
-      "int test() native \"ThrowException_native\";";
+  const char* kScriptChars = "int test() native \"ThrowException_native\";";
   Dart_Handle result;
   intptr_t size = thread->ZoneSizeInBytes();
   Dart_EnterScope();  // Start a Dart API scope for invoking API functions.
 
   // Load up a test script which extends the native wrapper class.
   Dart_Handle lib = TestCase::LoadTestScript(
-      kScriptChars,
-      reinterpret_cast<Dart_NativeEntryResolver>(native_lookup));
+      kScriptChars, reinterpret_cast<Dart_NativeEntryResolver>(native_lookup));
 
   // Throwing an exception here should result in an error.
   result = Dart_ThrowException(NewString("This doesn't work"));
@@ -5531,14 +5443,11 @@
 
   // Allocate without a constructor.
   const int num_native_fields = 2;
-  const intptr_t native_fields[] = {
-    kNativeArgumentNativeField1Value,
-    kNativeArgumentNativeField2Value
-  };
+  const intptr_t native_fields[] = {kNativeArgumentNativeField1Value,
+                                    kNativeArgumentNativeField2Value};
   // Allocate and Setup native fields.
-  Dart_Handle obj = Dart_AllocateWithNativeFields(type,
-                                                  num_native_fields,
-                                                  native_fields);
+  Dart_Handle obj =
+      Dart_AllocateWithNativeFields(type, num_native_fields, native_fields);
   EXPECT_VALID(obj);
 
   kNativeArgumentNativeField1Value *= 2;
@@ -5556,25 +5465,23 @@
     intptr_t native_fields1[kNumNativeFields];
     intptr_t native_fields2[kNumNativeFields];
     const Dart_NativeArgument_Descriptor arg_descriptors[9] = {
-      { Dart_NativeArgument_kNativeFields, 0 },
-      { Dart_NativeArgument_kInt32, 1 },
-      { Dart_NativeArgument_kUint64, 2 },
-      { Dart_NativeArgument_kBool, 3 },
-      { Dart_NativeArgument_kDouble, 4 },
-      { Dart_NativeArgument_kString, 5 },
-      { Dart_NativeArgument_kString, 6 },
-      { Dart_NativeArgument_kNativeFields, 7 },
-      { Dart_NativeArgument_kInstance, 7 },
+        {Dart_NativeArgument_kNativeFields, 0},
+        {Dart_NativeArgument_kInt32, 1},
+        {Dart_NativeArgument_kUint64, 2},
+        {Dart_NativeArgument_kBool, 3},
+        {Dart_NativeArgument_kDouble, 4},
+        {Dart_NativeArgument_kString, 5},
+        {Dart_NativeArgument_kString, 6},
+        {Dart_NativeArgument_kNativeFields, 7},
+        {Dart_NativeArgument_kInstance, 7},
     };
     Dart_NativeArgument_Value arg_values[9];
     arg_values[0].as_native_fields.num_fields = kNumNativeFields;
     arg_values[0].as_native_fields.values = native_fields1;
     arg_values[7].as_native_fields.num_fields = kNumNativeFields;
     arg_values[7].as_native_fields.values = native_fields2;
-    Dart_Handle result = Dart_GetNativeArguments(args,
-                                                 9,
-                                                 arg_descriptors,
-                                                 arg_values);
+    Dart_Handle result =
+        Dart_GetNativeArguments(args, 9, arg_descriptors, arg_values);
     EXPECT_VALID(result);
 
     EXPECT(arg_values[0].as_native_fields.values[0] == 30);
@@ -5604,48 +5511,44 @@
     EXPECT_VALID(arg_values[8].as_instance);
     EXPECT(Dart_IsInstance(arg_values[8].as_instance));
     int field_count = 0;
-    EXPECT_VALID(Dart_GetNativeInstanceFieldCount(
-        arg_values[8].as_instance, &field_count));
+    EXPECT_VALID(Dart_GetNativeInstanceFieldCount(arg_values[8].as_instance,
+                                                  &field_count));
     EXPECT(field_count == 2);
   }
 
   // Test with an invalid descriptor set (invalid type).
   {
     const Dart_NativeArgument_Descriptor arg_descriptors[8] = {
-      { Dart_NativeArgument_kInt32, 1 },
-      { Dart_NativeArgument_kUint64, 2 },
-      { Dart_NativeArgument_kString, 3 },
-      { Dart_NativeArgument_kDouble, 4 },
-      { Dart_NativeArgument_kString, 5 },
-      { Dart_NativeArgument_kString, 6 },
-      { Dart_NativeArgument_kNativeFields, 0 },
-      { Dart_NativeArgument_kNativeFields, 7 },
+        {Dart_NativeArgument_kInt32, 1},
+        {Dart_NativeArgument_kUint64, 2},
+        {Dart_NativeArgument_kString, 3},
+        {Dart_NativeArgument_kDouble, 4},
+        {Dart_NativeArgument_kString, 5},
+        {Dart_NativeArgument_kString, 6},
+        {Dart_NativeArgument_kNativeFields, 0},
+        {Dart_NativeArgument_kNativeFields, 7},
     };
     Dart_NativeArgument_Value arg_values[8];
-    Dart_Handle result = Dart_GetNativeArguments(args,
-                                                 8,
-                                                 arg_descriptors,
-                                                 arg_values);
+    Dart_Handle result =
+        Dart_GetNativeArguments(args, 8, arg_descriptors, arg_values);
     EXPECT(Dart_IsError(result));
   }
 
   // Test with an invalid range error.
   {
     const Dart_NativeArgument_Descriptor arg_descriptors[8] = {
-      { Dart_NativeArgument_kInt32, 2 },
-      { Dart_NativeArgument_kUint64, 2 },
-      { Dart_NativeArgument_kBool, 3 },
-      { Dart_NativeArgument_kDouble, 4 },
-      { Dart_NativeArgument_kString, 5 },
-      { Dart_NativeArgument_kString, 6 },
-      { Dart_NativeArgument_kNativeFields, 0 },
-      { Dart_NativeArgument_kNativeFields, 7 },
+        {Dart_NativeArgument_kInt32, 2},
+        {Dart_NativeArgument_kUint64, 2},
+        {Dart_NativeArgument_kBool, 3},
+        {Dart_NativeArgument_kDouble, 4},
+        {Dart_NativeArgument_kString, 5},
+        {Dart_NativeArgument_kString, 6},
+        {Dart_NativeArgument_kNativeFields, 0},
+        {Dart_NativeArgument_kNativeFields, 7},
     };
     Dart_NativeArgument_Value arg_values[8];
-    Dart_Handle result = Dart_GetNativeArguments(args,
-                                                 8,
-                                                 arg_descriptors,
-                                                 arg_values);
+    Dart_Handle result =
+        Dart_GetNativeArguments(args, 8, arg_descriptors, arg_values);
     EXPECT(Dart_IsError(result));
   }
 
@@ -5712,11 +5615,8 @@
   EXPECT_VALID(Dart_StringStorageSize(ascii_str, &size));
   uint8_t ext_ascii_str[10];
   Dart_Handle extstr = Dart_MakeExternalString(
-      ascii_str,
-      ext_ascii_str,
-      size,
-      reinterpret_cast<void*>(&native_arg_str_peer),
-      NULL);
+      ascii_str, ext_ascii_str, size,
+      reinterpret_cast<void*>(&native_arg_str_peer), NULL);
 
   Dart_Handle args[1];
   args[0] = extstr;
@@ -5756,8 +5656,7 @@
       "}";
 
   Dart_Handle lib = TestCase::LoadTestScript(
-      kScriptChars,
-      reinterpret_cast<Dart_NativeEntryResolver>(gnac_lookup));
+      kScriptChars, reinterpret_cast<Dart_NativeEntryResolver>(gnac_lookup));
 
   Dart_Handle result = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
   EXPECT_VALID(result);
@@ -5859,8 +5758,7 @@
   EXPECT(!is_instance);
 
   // Check that primitives are not instances of InstanceOfTest class.
-  result = Dart_ObjectIsType(NewString("a string"), otherType,
-                             &is_instance);
+  result = Dart_ObjectIsType(NewString("a string"), otherType, &is_instance);
   EXPECT_VALID(result);
   EXPECT(!is_instance);
 
@@ -5873,10 +5771,7 @@
   EXPECT(!is_instance);
 
   // Check that null is not an instance of InstanceOfTest class.
-  Dart_Handle null = Dart_Invoke(otherType,
-                                 NewString("returnNull"),
-                                 0,
-                                 NULL);
+  Dart_Handle null = Dart_Invoke(otherType, NewString("returnNull"), 0, NULL);
   EXPECT_VALID(null);
 
   result = Dart_ObjectIsType(null, otherType, &is_instance);
@@ -5966,9 +5861,10 @@
   // Further calls to LoadScript are errors.
   result = Dart_LoadScript(url, Dart_Null(), source, 0, 0);
   EXPECT(Dart_IsError(result));
-  EXPECT_STREQ("Dart_LoadScript: "
-               "A script has already been loaded from 'test-lib'.",
-               Dart_GetError(result));
+  EXPECT_STREQ(
+      "Dart_LoadScript: "
+      "A script has already been loaded from 'test-lib'.",
+      Dart_GetError(result));
 }
 
 
@@ -6068,8 +5964,7 @@
 
 
 TEST_CASE(LoadScript_CompileError) {
-  const char* kScriptChars =
-      ")";
+  const char* kScriptChars = ")";
   Dart_Handle url = NewString(TestCase::url());
   Dart_Handle source = NewString(kScriptChars);
   Dart_Handle result = Dart_SetLibraryTagHandler(import_library_handler);
@@ -6128,8 +6023,7 @@
 
 
 TEST_CASE(LibraryName) {
-  const char* kLibrary1Chars =
-      "library library1_name;";
+  const char* kLibrary1Chars = "library library1_name;";
   Dart_Handle url = NewString("library1_url");
   Dart_Handle source = NewString(kLibrary1Chars);
   Dart_Handle lib = Dart_LoadLibrary(url, Dart_Null(), source, 0, 0);
@@ -6164,8 +6058,7 @@
 
 
 TEST_CASE(LibraryId) {
-  const char* kLibrary1Chars =
-      "library library1_name;";
+  const char* kLibrary1Chars = "library library1_name;";
   Dart_Handle url = NewString("library1_url");
   Dart_Handle source = NewString(kLibrary1Chars);
   Dart_Handle lib = Dart_LoadLibrary(url, Dart_Null(), source, 0, 0);
@@ -6204,8 +6097,7 @@
 
 
 TEST_CASE(LibraryUrl) {
-  const char* kLibrary1Chars =
-      "library library1_name;";
+  const char* kLibrary1Chars = "library library1_name;";
   Dart_Handle url = NewString("library1_url");
   Dart_Handle source = NewString(kLibrary1Chars);
   Dart_Handle lib = Dart_LoadLibrary(url, Dart_Null(), source, 0, 0);
@@ -6348,10 +6240,8 @@
 
 
 TEST_CASE(LibraryImportLibrary) {
-  const char* kLibrary1Chars =
-      "library library1_name;";
-  const char* kLibrary2Chars =
-      "library library2_name;";
+  const char* kLibrary1Chars = "library library1_name;";
+  const char* kLibrary2Chars = "library library2_name;";
   Dart_Handle error = Dart_NewApiError("incoming error");
   Dart_Handle result;
 
@@ -6373,9 +6263,10 @@
 
   result = Dart_LibraryImportLibrary(Dart_True(), lib2, Dart_Null());
   EXPECT(Dart_IsError(result));
-  EXPECT_STREQ("Dart_LibraryImportLibrary expects argument 'library' to be of "
-               "type Library.",
-               Dart_GetError(result));
+  EXPECT_STREQ(
+      "Dart_LibraryImportLibrary expects argument 'library' to be of "
+      "type Library.",
+      Dart_GetError(result));
 
   result = Dart_LibraryImportLibrary(error, lib2, Dart_Null());
   EXPECT(Dart_IsError(result));
@@ -6389,9 +6280,10 @@
 
   result = Dart_LibraryImportLibrary(lib1, Dart_True(), Dart_Null());
   EXPECT(Dart_IsError(result));
-  EXPECT_STREQ("Dart_LibraryImportLibrary expects argument 'import' to be of "
-               "type Library.",
-               Dart_GetError(result));
+  EXPECT_STREQ(
+      "Dart_LibraryImportLibrary expects argument 'import' to be of "
+      "type Library.",
+      Dart_GetError(result));
 
   result = Dart_LibraryImportLibrary(lib1, error, Dart_Null());
   EXPECT(Dart_IsError(result));
@@ -6444,10 +6336,8 @@
 }
 
 
-
 TEST_CASE(LoadLibrary) {
-  const char* kLibrary1Chars =
-      "library library1_name;";
+  const char* kLibrary1Chars = "library library1_name;";
   Dart_Handle error = Dart_NewApiError("incoming error");
   Dart_Handle result;
 
@@ -6520,12 +6410,9 @@
 
 
 TEST_CASE(LoadSource) {
-  const char* kLibrary1Chars =
-      "library library1_name;";
-  const char* kSourceChars =
-      "part of library1_name;\n// Something innocuous";
-  const char* kBadSourceChars =
-      ")";
+  const char* kLibrary1Chars = "library library1_name;";
+  const char* kSourceChars = "part of library1_name;\n// Something innocuous";
+  const char* kBadSourceChars = ")";
   Dart_Handle error = Dart_NewApiError("incoming error");
   Dart_Handle result;
 
@@ -6663,13 +6550,11 @@
 
 
 TEST_CASE(LoadPatch) {
-  const char* kLibrary1Chars =
-      "library library1_name;";
+  const char* kLibrary1Chars = "library library1_name;";
   const char* kSourceChars =
       "part of library1_name;\n"
       "external int foo();";
-  const char* kPatchChars =
-      "@patch int foo() => 42;";
+  const char* kPatchChars = "@patch int foo() => 42;";
 
   // Load up a library.
   Dart_Handle url = NewString("library1_url");
@@ -6704,8 +6589,7 @@
   // This tests the sort of APIs with intentional signature mismatches we need
   // for typed Dart-JavaScript interop where we emulated JavaScript semantics
   // for optional arguments.
-  const char* kLibrary1Chars =
-      "library library1_name;";
+  const char* kLibrary1Chars = "library library1_name;";
   const char* kSourceChars =
       "part of library1_name;\n"
       "external int foo([int x]);\n"
@@ -6834,84 +6718,80 @@
 
 TEST_CASE(ParsePatchLibrary) {
   const char* kLibraryChars =
-  "library patched_library;\n"
-  "class A {\n"
-  "  final fvalue;\n"
-  "  var _f;\n"
-  "  callFunc(x, y) => x(y);\n"
-  "  external void method(var value);\n"
-  "  get field => _field;\n"
-  "}\n"
-  "class B {\n"
-  "  var val;\n"
-  "  external B.named(x);\n"
-  "  external B(v);\n"
-  "}\n"
-  "class C {\n"
-  "  external int method();\n"
-  "}\n"
-  "\n"
-  "external int unpatched();\n"
-  "external int topLevel(var value);\n"
-  "external int topLevel2(var value);\n"
-  "external int get topLevelGetter;\n"
-  "external void set topLevelSetter(int value);\n";
+      "library patched_library;\n"
+      "class A {\n"
+      "  final fvalue;\n"
+      "  var _f;\n"
+      "  callFunc(x, y) => x(y);\n"
+      "  external void method(var value);\n"
+      "  get field => _field;\n"
+      "}\n"
+      "class B {\n"
+      "  var val;\n"
+      "  external B.named(x);\n"
+      "  external B(v);\n"
+      "}\n"
+      "class C {\n"
+      "  external int method();\n"
+      "}\n"
+      "\n"
+      "external int unpatched();\n"
+      "external int topLevel(var value);\n"
+      "external int topLevel2(var value);\n"
+      "external int get topLevelGetter;\n"
+      "external void set topLevelSetter(int value);\n";
 
   const char* kPatchChars =
-  "@patch class A {\n"
-  "  var _g;\n"
-  "  A() : fvalue = 13;\n"
-  "  get _field => _g;\n"
-  "  @patch void method(var value) {\n"
-  "    int closeYourEyes(var eggs) { return eggs * -1; }\n"
-  "    value = callFunc(closeYourEyes, value);\n"
-  "    _g = value * 5;\n"
-  "  }\n"
-  "}\n"
-  "@patch class B {\n"
-  "  B._internal(x) : val = x;\n"
-  "  @patch factory B.named(x) { return new B._internal(x); }\n"
-  "  @patch factory B(v) native \"const_B_factory\";\n"
-  "}\n"
-  "var _topLevelValue = -1;\n"
-  "@patch int topLevel(var value) => value * value;\n"
-  "@patch int set topLevelSetter(value) { _topLevelValue = value; }\n"
-  "@patch int get topLevelGetter => 2 * _topLevelValue;\n"
-  // Allow top level methods named patch.
-  "patch(x) => x*3;\n"
-  ;  // NOLINT
+      "@patch class A {\n"
+      "  var _g;\n"
+      "  A() : fvalue = 13;\n"
+      "  get _field => _g;\n"
+      "  @patch void method(var value) {\n"
+      "    int closeYourEyes(var eggs) { return eggs * -1; }\n"
+      "    value = callFunc(closeYourEyes, value);\n"
+      "    _g = value * 5;\n"
+      "  }\n"
+      "}\n"
+      "@patch class B {\n"
+      "  B._internal(x) : val = x;\n"
+      "  @patch factory B.named(x) { return new B._internal(x); }\n"
+      "  @patch factory B(v) native \"const_B_factory\";\n"
+      "}\n"
+      "var _topLevelValue = -1;\n"
+      "@patch int topLevel(var value) => value * value;\n"
+      "@patch int set topLevelSetter(value) { _topLevelValue = value; }\n"
+      "@patch int get topLevelGetter => 2 * _topLevelValue;\n"
+      // Allow top level methods named patch.
+      "patch(x) => x*3;\n";  // NOLINT
 
   const char* kPatchClassOnlyChars =
-  "@patch class C {\n"
-  "  @patch int method() {\n"
-  "    return 42;\n"
-  "  }\n"
-  "}\n"
-  ;  // NOLINT
+      "@patch class C {\n"
+      "  @patch int method() {\n"
+      "    return 42;\n"
+      "  }\n"
+      "}\n";  // NOLINT
 
-  const char* kPatchNoClassChars =
-  "@patch topLevel2(x) => x * 2;\n";
+  const char* kPatchNoClassChars = "@patch topLevel2(x) => x * 2;\n";
 
   const char* kScriptChars =
-  "import 'theLibrary';\n"
-  "e1() => unpatched();\n"
-  "m1() => topLevel(2);\n"
-  "m2() {\n"
-  "  topLevelSetter = 20;\n"
-  "  return topLevelGetter;\n"
-  "}\n"
-  "m3() => patch(7);\n"
-  "m4() {\n"
-  "  var a = new A();\n"
-  "  a.method(5);\n"
-  "  return a.field;\n"
-  "}\n"
-  "m5() => new B(3);\n"
-  "m6() {\n"
-  "  var b = new B.named(8);\n"
-  "  return b.val;\n"
-  "}\n"
-  ;  // NOLINT
+      "import 'theLibrary';\n"
+      "e1() => unpatched();\n"
+      "m1() => topLevel(2);\n"
+      "m2() {\n"
+      "  topLevelSetter = 20;\n"
+      "  return topLevelGetter;\n"
+      "}\n"
+      "m3() => patch(7);\n"
+      "m4() {\n"
+      "  var a = new A();\n"
+      "  a.method(5);\n"
+      "  return a.field;\n"
+      "}\n"
+      "m5() => new B(3);\n"
+      "m6() {\n"
+      "  var b = new B.named(8);\n"
+      "  return b.val;\n"
+      "}\n";  // NOLINT
 
   bin::Builtin::SetNativeResolver(bin::Builtin::kBuiltinLibrary);
   bin::Builtin::SetNativeResolver(bin::Builtin::kIOLibrary);
@@ -6924,12 +6804,10 @@
   result = Dart_LoadLibrary(url, Dart_Null(), source, 0, 0);
   EXPECT_VALID(result);
 
-  const char* patchNames[] = { "main library patch",
-                               "patch class only",
-                               "patch no class" };
-  const char* patches[] = { kPatchChars,
-                            kPatchClassOnlyChars,
-                            kPatchNoClassChars };
+  const char* patchNames[] = {"main library patch", "patch class only",
+                              "patch no class"};
+  const char* patches[] = {kPatchChars, kPatchClassOnlyChars,
+                           kPatchNoClassChars};
   const String& lib_url = String::Handle(String::New("theLibrary"));
 
   const Library& lib = Library::Handle(Library::LookupLibrary(thread, lib_url));
@@ -6937,8 +6815,8 @@
   for (int i = 0; i < 3; i++) {
     const String& patch_url = String::Handle(String::New(patchNames[i]));
     const String& patch_source = String::Handle(String::New(patches[i]));
-    const Script& patch_script = Script::Handle(Script::New(
-        patch_url, patch_source, RawScript::kPatchTag));
+    const Script& patch_script = Script::Handle(
+        Script::New(patch_url, patch_source, RawScript::kPatchTag));
 
     const Error& err = Error::Handle(lib.Patch(patch_script));
     if (!err.IsNull()) {
@@ -7072,9 +6950,10 @@
 
   result = Dart_SetNativeResolver(Dart_True(), &MyNativeResolver1, NULL);
   EXPECT(Dart_IsError(result));
-  EXPECT_STREQ("Dart_SetNativeResolver expects argument 'library' to be of "
-               "type Library.",
-               Dart_GetError(result));
+  EXPECT_STREQ(
+      "Dart_SetNativeResolver expects argument 'library' to be of "
+      "type Library.",
+      Dart_GetError(result));
 
   result = Dart_SetNativeResolver(error, &MyNativeResolver1, NULL);
   EXPECT(Dart_IsError(result));
@@ -7267,8 +7146,7 @@
 }
 
 
-void NewNativePort_send123(Dart_Port dest_port_id,
-                           Dart_CObject *message) {
+void NewNativePort_send123(Dart_Port dest_port_id, Dart_CObject* message) {
   // Gets a send port message.
   EXPECT_NOTNULL(message);
   EXPECT_EQ(Dart_CObject_kArray, message->type);
@@ -7279,13 +7157,12 @@
       reinterpret_cast<Dart_CObject*>(Dart_ScopeAllocate(sizeof(Dart_CObject)));
   response->type = Dart_CObject_kInt32;
   response->value.as_int32 = 123;
-  Dart_PostCObject(
-      message->value.as_array.values[0]->value.as_send_port.id, response);
+  Dart_PostCObject(message->value.as_array.values[0]->value.as_send_port.id,
+                   response);
 }
 
 
-void NewNativePort_send321(Dart_Port dest_port_id,
-                           Dart_CObject* message) {
+void NewNativePort_send321(Dart_Port dest_port_id, Dart_CObject* message) {
   // Gets a null message.
   EXPECT_NOTNULL(message);
   EXPECT_EQ(Dart_CObject_kArray, message->type);
@@ -7296,8 +7173,8 @@
       reinterpret_cast<Dart_CObject*>(Dart_ScopeAllocate(sizeof(Dart_CObject)));
   response->type = Dart_CObject_kInt32;
   response->value.as_int32 = 321;
-  Dart_PostCObject(
-      message->value.as_array.values[0]->value.as_send_port.id, response);
+  Dart_PostCObject(message->value.as_array.values[0]->value.as_send_port.id,
+                   response);
 }
 
 
@@ -7351,8 +7228,7 @@
   // Test first port.
   Dart_Handle dart_args[1];
   dart_args[0] = send_port1;
-  Dart_Handle result =
-      Dart_Invoke(lib, NewString("callPort"), 1, dart_args);
+  Dart_Handle result = Dart_Invoke(lib, NewString("callPort"), 1, dart_args);
   EXPECT_VALID(result);
   result = Dart_RunLoop();
   EXPECT(Dart_IsError(result));
@@ -7377,15 +7253,15 @@
 
 
 void NewNativePort_sendInteger123(Dart_Port dest_port_id,
-                                  Dart_CObject *message) {
+                                  Dart_CObject* message) {
   // Gets a send port message.
   EXPECT_NOTNULL(message);
   EXPECT_EQ(Dart_CObject_kArray, message->type);
   EXPECT_EQ(Dart_CObject_kSendPort, message->value.as_array.values[0]->type);
 
   // Post integer value.
-  Dart_PostInteger(
-      message->value.as_array.values[0]->value.as_send_port.id, 123);
+  Dart_PostInteger(message->value.as_array.values[0]->value.as_send_port.id,
+                   123);
 }
 
 
@@ -7397,8 +7273,8 @@
   EXPECT_EQ(Dart_CObject_kSendPort, message->value.as_array.values[0]->type);
 
   // Post integer value.
-  Dart_PostInteger(
-      message->value.as_array.values[0]->value.as_send_port.id, 321);
+  Dart_PostInteger(message->value.as_array.values[0]->value.as_send_port.id,
+                   321);
 }
 
 
@@ -7430,8 +7306,7 @@
   // Test first port.
   Dart_Handle dart_args[1];
   dart_args[0] = send_port1;
-  Dart_Handle result =
-      Dart_Invoke(lib, NewString("callPort"), 1, dart_args);
+  Dart_Handle result = Dart_Invoke(lib, NewString("callPort"), 1, dart_args);
   EXPECT_VALID(result);
   result = Dart_RunLoop();
   EXPECT(Dart_IsError(result));
@@ -7456,14 +7331,14 @@
 
 
 void NewNativePort_nativeReceiveNull(Dart_Port dest_port_id,
-                                     Dart_CObject *message) {
+                                     Dart_CObject* message) {
   EXPECT_NOTNULL(message);
 
   if ((message->type == Dart_CObject_kArray) &&
       (message->value.as_array.values[0]->type == Dart_CObject_kSendPort)) {
     // Post integer value.
-    Dart_PostInteger(
-        message->value.as_array.values[0]->value.as_send_port.id, 123);
+    Dart_PostInteger(message->value.as_array.values[0]->value.as_send_port.id,
+                     123);
   } else {
     EXPECT_EQ(message->type, Dart_CObject_kNull);
   }
@@ -7494,8 +7369,7 @@
   // Test first port.
   Dart_Handle dart_args[1];
   dart_args[0] = send_port1;
-  Dart_Handle result =
-      Dart_Invoke(lib, NewString("callPort"), 1, dart_args);
+  Dart_Handle result = Dart_Invoke(lib, NewString("callPort"), 1, dart_args);
   EXPECT_VALID(result);
   result = Dart_RunLoop();
   EXPECT(Dart_IsError(result));
@@ -7510,14 +7384,14 @@
 
 
 void NewNativePort_nativeReceiveInteger(Dart_Port dest_port_id,
-                                        Dart_CObject *message) {
+                                        Dart_CObject* message) {
   EXPECT_NOTNULL(message);
 
   if ((message->type == Dart_CObject_kArray) &&
       (message->value.as_array.values[0]->type == Dart_CObject_kSendPort)) {
     // Post integer value.
-    Dart_PostInteger(
-        message->value.as_array.values[0]->value.as_send_port.id, 123);
+    Dart_PostInteger(message->value.as_array.values[0]->value.as_send_port.id,
+                     123);
   } else {
     EXPECT_EQ(message->type, Dart_CObject_kInt32);
     EXPECT_EQ(message->value.as_int32, 321);
@@ -7549,8 +7423,7 @@
   // Test first port.
   Dart_Handle dart_args[1];
   dart_args[0] = send_port1;
-  Dart_Handle result =
-      Dart_Invoke(lib, NewString("callPort"), 1, dart_args);
+  Dart_Handle result = Dart_Invoke(lib, NewString("callPort"), 1, dart_args);
   EXPECT_VALID(result);
   result = Dart_RunLoop();
   EXPECT(Dart_IsError(result));
@@ -7614,8 +7487,8 @@
 static void RunLoopTest(bool throw_exception) {
   Dart_IsolateCreateCallback saved = Isolate::CreateCallback();
   Isolate::SetCreateCallback(RunLoopTestCallback);
-  Dart_Isolate isolate = RunLoopTestCallback(
-      NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+  Dart_Isolate isolate =
+      RunLoopTestCallback(NULL, NULL, NULL, NULL, NULL, NULL, NULL);
 
   Dart_EnterIsolate(isolate);
   Dart_EnterScope();
@@ -7671,7 +7544,9 @@
 
 
 static Dart_NativeFunction IsolateInterruptTestNativeLookup(
-    Dart_Handle name, int argument_count, bool* auto_setup_scope) {
+    Dart_Handle name,
+    int argument_count,
+    bool* auto_setup_scope) {
   ASSERT(auto_setup_scope != NULL);
   *auto_setup_scope = false;
   return reinterpret_cast<Dart_NativeFunction>(&MarkMainEntered);
@@ -7695,10 +7570,8 @@
   {
     MonitorLocker ml(sync);
     char* error = NULL;
-    shared_isolate = Dart_CreateIsolate(NULL, NULL,
-                                        bin::isolate_snapshot_buffer,
-                                        NULL,
-                                        NULL, &error);
+    shared_isolate = Dart_CreateIsolate(
+        NULL, NULL, bin::isolate_snapshot_buffer, NULL, NULL, &error);
     EXPECT(shared_isolate != NULL);
     Dart_EnterScope();
     Dart_Handle url = NewString(TestCase::url());
@@ -7719,8 +7592,7 @@
   Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
   EXPECT(Dart_IsError(result));
   EXPECT(Dart_ErrorHasException(result));
-  EXPECT_SUBSTRING("Unhandled exception:\nfoo\n",
-                   Dart_GetError(result));
+  EXPECT_SUBSTRING("Unhandled exception:\nfoo\n", Dart_GetError(result));
 
   Dart_ExitScope();
   Dart_ShutdownIsolate();
@@ -7749,10 +7621,8 @@
 
   // Create an isolate.
   char* err;
-  Dart_Isolate isolate = Dart_CreateIsolate(NULL, NULL,
-                                            bin::isolate_snapshot_buffer,
-                                            NULL,
-                                            my_data, &err);
+  Dart_Isolate isolate = Dart_CreateIsolate(
+      NULL, NULL, bin::isolate_snapshot_buffer, NULL, my_data, &err);
   if (isolate == NULL) {
     OS::Print("Creation of isolate failed '%s'\n", err);
     free(err);
@@ -7780,7 +7650,7 @@
   EXPECT_VALID(arg1);
   Dart_Handle arg2 = Dart_NewInteger(9);
   EXPECT_VALID(arg2);
-  Dart_Handle dart_args[2] = { arg1, arg2 };
+  Dart_Handle dart_args[2] = {arg1, arg2};
   Dart_Handle result = Dart_Invoke(lib, NewString("add"), 2, dart_args);
   EXPECT_VALID(result);
   result = Dart_IntegerToInt64(result, &add_result);
@@ -7800,10 +7670,8 @@
 
   // Create an isolate.
   char* err;
-  Dart_Isolate isolate = Dart_CreateIsolate(NULL, NULL,
-                                            bin::isolate_snapshot_buffer,
-                                            NULL,
-                                            NULL, &err);
+  Dart_Isolate isolate = Dart_CreateIsolate(
+      NULL, NULL, bin::isolate_snapshot_buffer, NULL, NULL, &err);
   if (isolate == NULL) {
     OS::Print("Creation of isolate failed '%s'\n", err);
     free(err);
@@ -7868,9 +7736,7 @@
   int64_t value = 0;
   EXPECT_VALID(Dart_IntegerToInt64(arg1, &value));
   int64_t integer_value = 0;
-  Dart_Handle result = Dart_GetNativeIntegerArgument(args,
-                                                     1,
-                                                     &integer_value);
+  Dart_Handle result = Dart_GetNativeIntegerArgument(args, 1, &integer_value);
   EXPECT_VALID(result);
   EXPECT_EQ(value, integer_value);
   double double_value;
@@ -7902,9 +7768,8 @@
   Dart_Handle arg1 = Dart_GetNativeArgument(args, 1);
   Dart_Handle arg2 = Dart_GetNativeArgument(args, 2);
   Dart_Handle arg3 = Dart_GetNativeArgument(args, 3);
-  Dart_SetReturnValue(args, Dart_NewInteger(GetValue(arg1) +
-                                            GetValue(arg2) +
-                                            GetValue(arg3)));
+  Dart_SetReturnValue(
+      args, Dart_NewInteger(GetValue(arg1) + GetValue(arg2) + GetValue(arg3)));
   Dart_ExitScope();
 }
 
@@ -8051,15 +7916,16 @@
   Dart_Handle arg1 = Dart_GetNativeArgument(args, 0);
   Dart_Handle arg2 = Dart_GetNativeArgument(args, 1);
   Dart_Handle arg3 = Dart_GetNativeArgument(args, 2);
-  Dart_SetReturnValue(args, Dart_NewInteger(GetValue(arg1) +
-                                            GetValue(arg2) +
-                                            GetValue(arg3)));
+  Dart_SetReturnValue(
+      args, Dart_NewInteger(GetValue(arg1) + GetValue(arg2) + GetValue(arg3)));
   Dart_ExitScope();
 }
 
 
 static Dart_NativeFunction MyStaticNativeClosureResolver(
-    Dart_Handle name, int arg_count, bool* auto_setup_scope) {
+    Dart_Handle name,
+    int arg_count,
+    bool* auto_setup_scope) {
   ASSERT(auto_setup_scope != NULL);
   *auto_setup_scope = false;
   const Object& obj = Object::Handle(Api::UnwrapHandle(name));
@@ -8092,9 +7958,9 @@
       "  static int foo1() native \"StaticNativeFoo1\";\n"
       "  static int foo2(int i) native \"StaticNativeFoo2\";\n"
       "  static int foo3([int k = 10000, int l = 1])"
-            " native \"StaticNativeFoo3\";\n"
+      " native \"StaticNativeFoo3\";\n"
       "  static int foo4(int i, [int j = 10, int k = 1])"
-            " native \"StaticNativeFoo4\";\n"
+      " native \"StaticNativeFoo4\";\n"
       "  int bar1() { var func = foo1; return func(); }\n"
       "  int bar2(int i) { var func = foo2; return func(i); }\n"
       "  int bar30() { var func = foo3; return func(); }\n"
@@ -8170,20 +8036,22 @@
 
   EXPECT_ERROR(Dart_NewList(-1),
                "expects argument 'length' to be in the range");
-  EXPECT_ERROR(Dart_NewList(Array::kMaxElements+1),
+  EXPECT_ERROR(Dart_NewList(Array::kMaxElements + 1),
                "expects argument 'length' to be in the range");
   EXPECT_ERROR(Dart_NewStringFromUTF8(chars8, -1),
                "expects argument 'length' to be in the range");
-  EXPECT_ERROR(Dart_NewStringFromUTF8(chars8, OneByteString::kMaxElements+1),
+  EXPECT_ERROR(Dart_NewStringFromUTF8(chars8, OneByteString::kMaxElements + 1),
                "expects argument 'length' to be in the range");
   EXPECT_ERROR(Dart_NewStringFromUTF16(chars16, -1),
                "expects argument 'length' to be in the range");
-  EXPECT_ERROR(Dart_NewStringFromUTF16(chars16, TwoByteString::kMaxElements+1),
-               "expects argument 'length' to be in the range");
+  EXPECT_ERROR(
+      Dart_NewStringFromUTF16(chars16, TwoByteString::kMaxElements + 1),
+      "expects argument 'length' to be in the range");
   EXPECT_ERROR(Dart_NewStringFromUTF32(chars32, -1),
                "expects argument 'length' to be in the range");
-  EXPECT_ERROR(Dart_NewStringFromUTF32(chars32, TwoByteString::kMaxElements+1),
-               "expects argument 'length' to be in the range");
+  EXPECT_ERROR(
+      Dart_NewStringFromUTF32(chars32, TwoByteString::kMaxElements + 1),
+      "expects argument 'length' to be in the range");
 }
 
 
@@ -8649,39 +8517,26 @@
     Dart_EnterScope();
 
     // First test some negative conditions.
-    uint8_t data8[] = { 'h', 'e', 'l', 'l', 'o' };
+    uint8_t data8[] = {'h', 'e', 'l', 'l', 'o'};
     const char* err = "string";
     Dart_Handle err_str = NewString(err);
-    Dart_Handle ext_err_str = Dart_NewExternalLatin1String(
-        data8, ARRAY_SIZE(data8), NULL, NULL);
-    Dart_Handle result = Dart_MakeExternalString(Dart_Null(),
-                                                 data8,
-                                                 ARRAY_SIZE(data8),
-                                                 NULL,
-                                                 NULL);
+    Dart_Handle ext_err_str =
+        Dart_NewExternalLatin1String(data8, ARRAY_SIZE(data8), NULL, NULL);
+    Dart_Handle result = Dart_MakeExternalString(Dart_Null(), data8,
+                                                 ARRAY_SIZE(data8), NULL, NULL);
     EXPECT(Dart_IsError(result));  // Null string object passed in.
-    result = Dart_MakeExternalString(err_str,
-                                     NULL,
-                                     ARRAY_SIZE(data8),
-                                     NULL,
-                                     NULL);
+    result =
+        Dart_MakeExternalString(err_str, NULL, ARRAY_SIZE(data8), NULL, NULL);
     EXPECT(Dart_IsError(result));  // Null array pointer passed in.
-    result = Dart_MakeExternalString(err_str,
-                                     data8,
-                                     1,
-                                     NULL,
-                                     NULL);
+    result = Dart_MakeExternalString(err_str, data8, 1, NULL, NULL);
     EXPECT(Dart_IsError(result));  // Invalid length passed in.
 
     const intptr_t kLength = 10;
     intptr_t size = 0;
 
     // Test with an external string.
-    result = Dart_MakeExternalString(ext_err_str,
-                                     data8,
-                                     ARRAY_SIZE(data8),
-                                     NULL,
-                                     NULL);
+    result = Dart_MakeExternalString(ext_err_str, data8, ARRAY_SIZE(data8),
+                                     NULL, NULL);
     EXPECT(Dart_IsString(result));
     EXPECT(Dart_IsExternalString(result));
 
@@ -8690,11 +8545,8 @@
     EXPECT(Dart_IsString(empty_str));
     EXPECT(!Dart_IsExternalString(empty_str));
     uint8_t ext_empty_str[kLength];
-    Dart_Handle str = Dart_MakeExternalString(empty_str,
-                                              ext_empty_str,
-                                              kLength,
-                                              NULL,
-                                              NULL);
+    Dart_Handle str =
+        Dart_MakeExternalString(empty_str, ext_empty_str, kLength, NULL, NULL);
     EXPECT(Dart_IsString(str));
     EXPECT(Dart_IsString(empty_str));
     EXPECT(Dart_IsStringLatin1(str));
@@ -8706,16 +8558,13 @@
 
     // Test with single character canonical string, it should not become
     // external string but the peer should be setup for it.
-    Dart_Handle canonical_str = Api::NewHandle(thread, Symbols::New(thread,
-                                                                    "*"));
+    Dart_Handle canonical_str =
+        Api::NewHandle(thread, Symbols::New(thread, "*"));
     EXPECT(Dart_IsString(canonical_str));
     EXPECT(!Dart_IsExternalString(canonical_str));
     uint8_t ext_canonical_str[kLength];
-    str = Dart_MakeExternalString(canonical_str,
-                                  ext_canonical_str,
-                                  kLength,
-                                  &canonical_str_peer,
-                                  MakeExternalCback);
+    str = Dart_MakeExternalString(canonical_str, ext_canonical_str, kLength,
+                                  &canonical_str_peer, MakeExternalCback);
     EXPECT(Dart_IsString(str));
     EXPECT(!Dart_IsExternalString(canonical_str));
     EXPECT_EQ(canonical_str, str);
@@ -8740,10 +8589,7 @@
 
     uint8_t ext_ascii_str[kLength];
     EXPECT_VALID(Dart_StringStorageSize(ascii_str, &size));
-    str = Dart_MakeExternalString(ascii_str,
-                                  ext_ascii_str,
-                                  size,
-                                  &peer8,
+    str = Dart_MakeExternalString(ascii_str, ext_ascii_str, size, &peer8,
                                   MakeExternalCback);
     EXPECT(Dart_IsString(str));
     EXPECT(Dart_IsString(ascii_str));
@@ -8760,7 +8606,7 @@
       EXPECT_EQ(ascii[i], ext_ascii_str[i]);
     }
 
-    uint8_t data[] = { 0xE4, 0xBA, 0x8c };  // U+4E8C.
+    uint8_t data[] = {0xE4, 0xBA, 0x8c};  // U+4E8C.
     expected_length = 1;
     Dart_Handle utf16_str = Dart_NewStringFromUTF8(data, ARRAY_SIZE(data));
     EXPECT_VALID(utf16_str);
@@ -8773,10 +8619,7 @@
     // Test with a two byte string.
     uint16_t ext_utf16_str[kLength];
     EXPECT_VALID(Dart_StringStorageSize(utf16_str, &size));
-    str = Dart_MakeExternalString(utf16_str,
-                                  ext_utf16_str,
-                                  size,
-                                  &peer16,
+    str = Dart_MakeExternalString(utf16_str, ext_utf16_str, size, &peer16,
                                   MakeExternalCback);
     EXPECT(Dart_IsString(str));
     EXPECT(Dart_IsString(utf16_str));
@@ -8797,8 +8640,8 @@
     // Test with a symbol (hash value should be preserved on externalization).
     const char* symbol_ascii = "?unseen";
     expected_length = strlen(symbol_ascii);
-    Dart_Handle symbol_str = Api::NewHandle(thread,
-        Symbols::New(thread, symbol_ascii, expected_length));
+    Dart_Handle symbol_str = Api::NewHandle(
+        thread, Symbols::New(thread, symbol_ascii, expected_length));
     EXPECT_VALID(symbol_str);
     EXPECT(Dart_IsString(symbol_str));
     EXPECT(Dart_IsStringLatin1(symbol_str));
@@ -8809,10 +8652,7 @@
 
     uint8_t ext_symbol_ascii[kLength];
     EXPECT_VALID(Dart_StringStorageSize(symbol_str, &size));
-    str = Dart_MakeExternalString(symbol_str,
-                                  ext_symbol_ascii,
-                                  size,
-                                  &peer8,
+    str = Dart_MakeExternalString(symbol_str, ext_symbol_ascii, size, &peer8,
                                   MakeExternalCback);
     EXPECT(Api::UnwrapStringHandle(zone, str).HasHash());
     EXPECT(Api::UnwrapStringHandle(zone, str).Hash() ==
@@ -8860,18 +8700,12 @@
       "}\n";
 
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
-  Dart_Handle result = Dart_Invoke(lib,
-                                   NewString("testMain"),
-                                   0,
-                                   NULL);
+  Dart_Handle result = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
   const char* expected_str = "constant string";
   const intptr_t kExpectedLen = 15;
   uint8_t ext_str[kExpectedLen];
-  Dart_Handle str = Dart_MakeExternalString(result,
-                                            ext_str,
-                                            kExpectedLen,
-                                            NULL,
-                                            NULL);
+  Dart_Handle str =
+      Dart_MakeExternalString(result, ext_str, kExpectedLen, NULL, NULL);
 
   EXPECT(Dart_IsExternalString(str));
   for (intptr_t i = 0; i < kExpectedLen; i++) {
@@ -8945,12 +8779,8 @@
   EXPECT_VALID(Dart_StringStorageSize(str_arg, &arg_size));
   EXPECT_EQ(size, arg_size);
   char* str_data = new char[size];
-  Dart_Handle result =
-      Dart_MakeExternalString(str,
-                              str_data,
-                              size,
-                              str_data,
-                              &ExternalStringDeoptimize_Finalize);
+  Dart_Handle result = Dart_MakeExternalString(
+      str, str_data, size, str_data, &ExternalStringDeoptimize_Finalize);
   EXPECT_VALID(result);
   EXPECT(Dart_IsExternalString(result));
   Dart_ExitScope();
@@ -8958,7 +8788,9 @@
 
 
 static Dart_NativeFunction ExternalStringDeoptimize_native_lookup(
-    Dart_Handle name, int argument_count, bool* auto_setup_scope) {
+    Dart_Handle name,
+    int argument_count,
+    bool* auto_setup_scope) {
   ASSERT(auto_setup_scope != NULL);
   *auto_setup_scope = true;
   return reinterpret_cast<Dart_NativeFunction>(&A_change_str_native);
@@ -8995,13 +8827,9 @@
       "}\n"
       "change_str(String s) native 'A_change_str';\n"
       "";
-  Dart_Handle lib =
-      TestCase::LoadTestScript(kScriptChars,
-                               &ExternalStringDeoptimize_native_lookup);
-  Dart_Handle result = Dart_Invoke(lib,
-                                   NewString("main"),
-                                   0,
-                                   NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(
+      kScriptChars, &ExternalStringDeoptimize_native_lookup);
+  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
   int64_t value = 0;
   result = Dart_IntegerToInt64(result, &value);
   EXPECT_VALID(result);
@@ -9035,13 +8863,9 @@
       "  var y = sum_chars(str, true);\n"
       "  return x + y;\n"
       "}\n";
-  Dart_Handle lib =
-      TestCase::LoadTestScript(kScriptChars,
-                               &ExternalStringDeoptimize_native_lookup);
-  Dart_Handle result = Dart_Invoke(lib,
-                                   NewString("main"),
-                                   0,
-                                   NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(
+      kScriptChars, &ExternalStringDeoptimize_native_lookup);
+  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
   int64_t value = 0;
   result = Dart_IntegerToInt64(result, &value);
   EXPECT_VALID(result);
@@ -9075,13 +8899,9 @@
       "  A.change_str(strA);\n"
       "  return compareA('AA' + 'AA');\n"
       "}\n";
-  Dart_Handle lib =
-      TestCase::LoadTestScript(kScriptChars,
-                               &ExternalStringDeoptimize_native_lookup);
-  Dart_Handle result = Dart_Invoke(lib,
-                                   NewString("main"),
-                                   0,
-                                   NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(
+      kScriptChars, &ExternalStringDeoptimize_native_lookup);
+  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
   bool value = false;
   result = Dart_BooleanValue(result, &value);
@@ -9110,13 +8930,9 @@
       "  var result = double_char0(externalA);\n"
       "  return result == 130;\n"
       "}\n";
-  Dart_Handle lib =
-      TestCase::LoadTestScript(kScriptChars,
-                               &ExternalStringDeoptimize_native_lookup);
-  Dart_Handle result = Dart_Invoke(lib,
-                                   NewString("main"),
-                                   0,
-                                   NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(
+      kScriptChars, &ExternalStringDeoptimize_native_lookup);
+  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
   bool value = false;
   result = Dart_BooleanValue(result, &value);
@@ -9156,13 +8972,9 @@
       "  shouldExternalize = true;\n"
       "  return compareA('AA' + 'AA');\n"
       "}\n";
-  Dart_Handle lib =
-      TestCase::LoadTestScript(kScriptChars,
-                               &ExternalStringDeoptimize_native_lookup);
-  Dart_Handle result = Dart_Invoke(lib,
-                                   NewString("main"),
-                                   0,
-                                   NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(
+      kScriptChars, &ExternalStringDeoptimize_native_lookup);
+  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
   bool value = false;
   result = Dart_BooleanValue(result, &value);
@@ -9197,13 +9009,9 @@
       "  A.change_str(G.f);"
       "  return compareA('AA' + 'AA');\n"
       "}\n";
-  Dart_Handle lib =
-      TestCase::LoadTestScript(kScriptChars,
-                               &ExternalStringDeoptimize_native_lookup);
-  Dart_Handle result = Dart_Invoke(lib,
-                                   NewString("main"),
-                                   0,
-                                   NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(
+      kScriptChars, &ExternalStringDeoptimize_native_lookup);
+  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
   bool value = false;
   result = Dart_BooleanValue(result, &value);
@@ -9232,13 +9040,9 @@
       "  var y = double.parse(externalTwoByteString);\n"
       "  return ((x + y) * 10).toInt();\n"
       "}\n";
-  Dart_Handle lib =
-      TestCase::LoadTestScript(kScriptChars,
-                               &ExternalStringDeoptimize_native_lookup);
-  Dart_Handle result = Dart_Invoke(lib,
-                                   NewString("main"),
-                                   0,
-                                   NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(
+      kScriptChars, &ExternalStringDeoptimize_native_lookup);
+  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
   int64_t value = 0;
   result = Dart_IntegerToInt64(result, &value);
   EXPECT_VALID(result);
@@ -9266,13 +9070,9 @@
       "  var y = double.parse(externalTwoByteString);\n"
       "  return ((x + y) * 10).toInt();\n"
       "}\n";
-  Dart_Handle lib =
-      TestCase::LoadTestScript(kScriptChars,
-                               &ExternalStringDeoptimize_native_lookup);
-  Dart_Handle result = Dart_Invoke(lib,
-                                   NewString("main"),
-                                   0,
-                                   NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(
+      kScriptChars, &ExternalStringDeoptimize_native_lookup);
+  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
   int64_t value = 0;
   result = Dart_IntegerToInt64(result, &value);
   EXPECT_VALID(result);
@@ -9288,22 +9088,18 @@
       "  var str = 'Hello World';\n"
       "  return str.indexOf(pattern);\n"
       "}\n";
-  Dart_Handle lib =
-      TestCase::LoadTestScript(kScriptChars, NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
 
-  uint8_t data8[] = { 'W' };
-  Dart_Handle ext8 = Dart_NewExternalLatin1String(data8, ARRAY_SIZE(data8),
-                                                  data8, NULL);
+  uint8_t data8[] = {'W'};
+  Dart_Handle ext8 =
+      Dart_NewExternalLatin1String(data8, ARRAY_SIZE(data8), data8, NULL);
   EXPECT_VALID(ext8);
   EXPECT(Dart_IsString(ext8));
   EXPECT(Dart_IsExternalString(ext8));
 
   Dart_Handle dart_args[1];
   dart_args[0] = ext8;
-  Dart_Handle result = Dart_Invoke(lib,
-                                   NewString("main"),
-                                   1,
-                                   dart_args);
+  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 1, dart_args);
   int64_t value = 0;
   result = Dart_IntegerToInt64(result, &value);
   EXPECT_VALID(result);
@@ -9313,20 +9109,19 @@
 
 TEST_CASE(StringFromExternalTypedData) {
   const char* kScriptChars =
-    "test(external) {\n"
-    "  var str1 = new String.fromCharCodes(external);\n"
-    "  var str2 = new String.fromCharCodes(new List.from(external));\n"
-    "  if (str2 != str1) throw 'FAIL';\n"
-    "  return str1;\n"
-    "}\n"
-    "testView8(external) {\n"
-    "  return test(external.buffer.asUint8List());\n"
-    "}\n"
-    "testView16(external) {\n"
-    "  return test(external.buffer.asUint16List());\n"
-    "}\n";
-  Dart_Handle lib =
-      TestCase::LoadTestScript(kScriptChars, NULL);
+      "test(external) {\n"
+      "  var str1 = new String.fromCharCodes(external);\n"
+      "  var str2 = new String.fromCharCodes(new List.from(external));\n"
+      "  if (str2 != str1) throw 'FAIL';\n"
+      "  return str1;\n"
+      "}\n"
+      "testView8(external) {\n"
+      "  return test(external.buffer.asUint8List());\n"
+      "}\n"
+      "testView16(external) {\n"
+      "  return test(external.buffer.asUint16List());\n"
+      "}\n";
+  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
 
   {
     uint8_t data[64];
@@ -9334,22 +9129,16 @@
       data[i] = i * 4;
     }
     // LATIN-1 in external Uint8List.
-    Dart_Handle external = Dart_NewExternalTypedData(
-        Dart_TypedData_kUint8, data, 64);
+    Dart_Handle external =
+        Dart_NewExternalTypedData(Dart_TypedData_kUint8, data, 64);
     EXPECT_VALID(external);
     Dart_Handle dart_args[1];
     dart_args[0] = external;
-    Dart_Handle result = Dart_Invoke(lib,
-                                     NewString("test"),
-                                     1,
-                                     dart_args);
+    Dart_Handle result = Dart_Invoke(lib, NewString("test"), 1, dart_args);
     EXPECT_VALID(result);
     EXPECT(Dart_IsString(result));
 
-    result = Dart_Invoke(lib,
-                         NewString("testView8"),
-                         1,
-                         dart_args);
+    result = Dart_Invoke(lib, NewString("testView8"), 1, dart_args);
     EXPECT_VALID(result);
     EXPECT(Dart_IsString(result));
   }
@@ -9360,22 +9149,16 @@
       data[i] = i * 4;
     }
     // LATIN-1 in external Uint16List.
-    Dart_Handle external = Dart_NewExternalTypedData(
-        Dart_TypedData_kUint16, data, 64);
+    Dart_Handle external =
+        Dart_NewExternalTypedData(Dart_TypedData_kUint16, data, 64);
     EXPECT_VALID(external);
     Dart_Handle dart_args[1];
     dart_args[0] = external;
-    Dart_Handle result = Dart_Invoke(lib,
-                                     NewString("test"),
-                                     1,
-                                     dart_args);
+    Dart_Handle result = Dart_Invoke(lib, NewString("test"), 1, dart_args);
     EXPECT_VALID(result);
     EXPECT(Dart_IsString(result));
 
-    result = Dart_Invoke(lib,
-                         NewString("testView16"),
-                         1,
-                         dart_args);
+    result = Dart_Invoke(lib, NewString("testView16"), 1, dart_args);
     EXPECT_VALID(result);
     EXPECT(Dart_IsString(result));
   }
@@ -9386,22 +9169,16 @@
       data[i] = 0x2000 + i * 4;
     }
     // Non-LATIN-1 in external Uint16List.
-    Dart_Handle external = Dart_NewExternalTypedData(
-        Dart_TypedData_kUint16, data, 64);
+    Dart_Handle external =
+        Dart_NewExternalTypedData(Dart_TypedData_kUint16, data, 64);
     EXPECT_VALID(external);
     Dart_Handle dart_args[1];
     dart_args[0] = external;
-    Dart_Handle result = Dart_Invoke(lib,
-                                     NewString("test"),
-                                     1,
-                                     dart_args);
+    Dart_Handle result = Dart_Invoke(lib, NewString("test"), 1, dart_args);
     EXPECT_VALID(result);
     EXPECT(Dart_IsString(result));
 
-    result = Dart_Invoke(lib,
-                         NewString("testView16"),
-                         1,
-                         dart_args);
+    result = Dart_Invoke(lib, NewString("testView16"), 1, dart_args);
     EXPECT_VALID(result);
     EXPECT(Dart_IsString(result));
   }
@@ -9418,11 +9195,8 @@
   // Make sure it is enabled.
   stream->set_enabled(true);
   // Add a duration event.
-  Dart_TimelineEvent("testDurationEvent",
-                     0,
-                     1,
-                     Dart_Timeline_Event_Duration,
-                     0, NULL, NULL);
+  Dart_TimelineEvent("testDurationEvent", 0, 1, Dart_Timeline_Event_Duration, 0,
+                     NULL, NULL);
   // Check that it is in the output.
   TimelineEventRecorder* recorder = Timeline::recorder();
   Timeline::ReclaimCachedBlocksFromThreads();
@@ -9439,11 +9213,8 @@
   TimelineStream* stream = Timeline::GetEmbedderStream();
   // Make sure it is enabled.
   stream->set_enabled(true);
-  Dart_TimelineEvent("testInstantEvent",
-                     0,
-                     1,
-                     Dart_Timeline_Event_Instant,
-                     0, NULL, NULL);
+  Dart_TimelineEvent("testInstantEvent", 0, 1, Dart_Timeline_Event_Instant, 0,
+                     NULL, NULL);
   // Check that it is in the output.
   TimelineEventRecorder* recorder = Timeline::recorder();
   Timeline::ReclaimCachedBlocksFromThreads();
@@ -9460,11 +9231,8 @@
   // Make sure it is disabled.
   stream->set_enabled(false);
   int64_t async_id = 99;
-  Dart_TimelineEvent("testAsyncEvent",
-                     0,
-                     async_id,
-                     Dart_Timeline_Event_Async_Begin,
-                     0, NULL, NULL);
+  Dart_TimelineEvent("testAsyncEvent", 0, async_id,
+                     Dart_Timeline_Event_Async_Begin, 0, NULL, NULL);
   // Check that testAsync is not in the output.
   TimelineEventRecorder* recorder = Timeline::recorder();
   Timeline::ReclaimCachedBlocksFromThreads();
@@ -9482,11 +9250,8 @@
   // Make sure it is enabled.
   stream->set_enabled(true);
   int64_t async_id = 99;
-  Dart_TimelineEvent("testAsyncEvent",
-                     0,
-                     async_id,
-                     Dart_Timeline_Event_Async_Begin,
-                     0, NULL, NULL);
+  Dart_TimelineEvent("testAsyncEvent", 0, async_id,
+                     Dart_Timeline_Event_Async_Begin, 0, NULL, NULL);
 
   // Check that it is in the output.
   TimelineEventRecorder* recorder = Timeline::recorder();
@@ -9525,9 +9290,7 @@
   data->buffer = reinterpret_cast<uint8_t*>(
       realloc(data->buffer, data->buffer_length + buffer_length));
   // Copy new data.
-  memmove(&data->buffer[data->buffer_length],
-          buffer,
-          buffer_length);
+  memmove(&data->buffer[data->buffer_length], buffer, buffer_length);
   // Update length.
   data->buffer_length += buffer_length;
 }
@@ -9535,11 +9298,10 @@
 
 TEST_CASE(Timeline_Dart_TimelineGetTrace) {
   const char* kScriptChars =
-    "foo() => 'a';\n"
-    "main() => foo();\n";
+      "foo() => 'a';\n"
+      "main() => foo();\n";
 
-  Dart_Handle lib =
-      TestCase::LoadTestScript(kScriptChars, NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
 
   const char* buffer = NULL;
   intptr_t buffer_length = 0;
@@ -9550,10 +9312,7 @@
 
   // Invoke main, which will be compiled resulting in a compiler event in
   // the timeline.
-  Dart_Handle result = Dart_Invoke(lib,
-                                   NewString("main"),
-                                   0,
-                                   NULL);
+  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
 
   // Grab the trace.
@@ -9583,15 +9342,14 @@
 
 TEST_CASE(Timeline_Dart_TimelineGetTraceOnlyDartEvents) {
   const char* kScriptChars =
-    "import 'dart:developer';\n"
-    ""
-    "main() {\n"
-    "  Timeline.startSync('DART_NAME');\n"
-    "  Timeline.finishSync();\n"
-    "}\n";
+      "import 'dart:developer';\n"
+      ""
+      "main() {\n"
+      "  Timeline.startSync('DART_NAME');\n"
+      "  Timeline.finishSync();\n"
+      "}\n";
 
-  Dart_Handle lib =
-      TestCase::LoadTestScript(kScriptChars, NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
 
   const char* buffer = NULL;
   intptr_t buffer_length = 0;
@@ -9601,10 +9359,7 @@
   Dart_GlobalTimelineSetRecordedStreams(DART_TIMELINE_STREAM_DART);
 
   // Invoke main, which will add a new timeline event from Dart.
-  Dart_Handle result = Dart_Invoke(lib,
-                                   NewString("main"),
-                                   0,
-                                   NULL);
+  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
 
   // Grab the trace.
@@ -9635,15 +9390,14 @@
 
 TEST_CASE(Timeline_Dart_TimelineGetTraceWithDartEvents) {
   const char* kScriptChars =
-    "import 'dart:developer';\n"
-    "\n"
-    "main() {\n"
-    "  Timeline.startSync('DART_NAME');\n"
-    "  Timeline.finishSync();\n"
-    "}\n";
+      "import 'dart:developer';\n"
+      "\n"
+      "main() {\n"
+      "  Timeline.startSync('DART_NAME');\n"
+      "  Timeline.finishSync();\n"
+      "}\n";
 
-  Dart_Handle lib =
-      TestCase::LoadTestScript(kScriptChars, NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
 
   const char* buffer = NULL;
   intptr_t buffer_length = 0;
@@ -9654,10 +9408,7 @@
 
   // Invoke main, which will be compiled resulting in a compiler event in
   // the timeline.
-  Dart_Handle result = Dart_Invoke(lib,
-                                   NewString("main"),
-                                   0,
-                                   NULL);
+  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
 
   // Grab the trace.
@@ -9688,11 +9439,10 @@
 
 TEST_CASE(Timeline_Dart_TimelineGetTraceGlobalOverride) {
   const char* kScriptChars =
-    "foo() => 'a';\n"
-    "main() => foo();\n";
+      "foo() => 'a';\n"
+      "main() => foo();\n";
 
-  Dart_Handle lib =
-      TestCase::LoadTestScript(kScriptChars, NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
 
   const char* buffer = NULL;
   intptr_t buffer_length = 0;
@@ -9703,10 +9453,7 @@
 
   // Invoke main, which will be compiled resulting in a compiler event in
   // the timeline.
-  Dart_Handle result = Dart_Invoke(lib,
-                                   NewString("main"),
-                                   0,
-                                   NULL);
+  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
 
   // Grab the trace.
@@ -9734,21 +9481,17 @@
 }
 
 
-static const char* arg_names[] = {
-  "arg0"
-};
+static const char* arg_names[] = {"arg0"};
 
 
-static const char* arg_values[] = {
-  "value0"
-};
+static const char* arg_values[] = {"value0"};
 
 
 TEST_CASE(Timeline_Dart_GlobalTimelineGetTrace) {
   const char* kScriptChars =
-    "bar() => 'z';\n"
-    "foo() => 'a';\n"
-    "main() => foo();\n";
+      "bar() => 'z';\n"
+      "foo() => 'a';\n"
+      "main() => foo();\n";
 
   // Enable all streams.
   Dart_GlobalTimelineSetRecordedStreams(DART_TIMELINE_STREAM_ALL |
@@ -9756,37 +9499,24 @@
   Dart_Handle lib;
   {
     // Add something to the VM stream.
-    TimelineDurationScope tds(Timeline::GetVMStream(),
-                              "TestVMDuration");
+    TimelineDurationScope tds(Timeline::GetVMStream(), "TestVMDuration");
     lib = TestCase::LoadTestScript(kScriptChars, NULL);
   }
 
   {
     // Add something to the embedder stream.
-    Dart_TimelineEvent("TRACE_EVENT",
-                       Dart_TimelineGetMicros(),
-                       0,
-                       Dart_Timeline_Event_Begin,
-                       1,
-                       &arg_names[0],
+    Dart_TimelineEvent("TRACE_EVENT", Dart_TimelineGetMicros(), 0,
+                       Dart_Timeline_Event_Begin, 1, &arg_names[0],
                        &arg_values[0]);
     // Add counter to the embedder stream.
-    Dart_TimelineEvent("COUNTER_EVENT",
-                       Dart_TimelineGetMicros(),
-                       0,
-                       Dart_Timeline_Event_Counter,
-                       0,
-                       NULL,
-                       NULL);
+    Dart_TimelineEvent("COUNTER_EVENT", Dart_TimelineGetMicros(), 0,
+                       Dart_Timeline_Event_Counter, 0, NULL, NULL);
     Dart_SetThreadName("CUSTOM THREAD NAME");
   }
 
   // Invoke main, which will be compiled resulting in a compiler event in
   // the timeline.
-  Dart_Handle result = Dart_Invoke(lib,
-                                   NewString("main"),
-                                   0,
-                                   NULL);
+  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
 
   const char* buffer = NULL;
@@ -9836,14 +9566,10 @@
   // in the resulting trace.
   {
     // Add something to the VM stream.
-    TimelineDurationScope tds(Timeline::GetVMStream(),
-                              "TestVMDuration2");
+    TimelineDurationScope tds(Timeline::GetVMStream(), "TestVMDuration2");
     // Invoke bar, which will be compiled resulting in a compiler event in
     // the timeline.
-    result = Dart_Invoke(lib,
-                         NewString("bar"),
-                         0,
-                         NULL);
+    result = Dart_Invoke(lib, NewString("bar"), 0, NULL);
   }
 
   // Grab the global trace.
@@ -9882,10 +9608,7 @@
 class GlobalTimelineThreadData {
  public:
   GlobalTimelineThreadData()
-      : monitor_(new Monitor()),
-        data_(new AppendData()),
-        running_(true) {
-  }
+      : monitor_(new Monitor()), data_(new AppendData()), running_(true) {}
 
   ~GlobalTimelineThreadData() {
     delete monitor_;
@@ -9935,9 +9658,9 @@
 // Thread object.
 TEST_CASE(Timeline_Dart_GlobalTimelineGetTrace_Threaded) {
   const char* kScriptChars =
-    "bar() => 'z';\n"
-    "foo() => 'a';\n"
-    "main() => foo();\n";
+      "bar() => 'z';\n"
+      "foo() => 'a';\n"
+      "main() => foo();\n";
 
   // Enable all streams.
   Dart_GlobalTimelineSetRecordedStreams(DART_TIMELINE_STREAM_ALL |
@@ -9945,8 +9668,7 @@
   Dart_Handle lib;
   {
     // Add something to the VM stream.
-    TimelineDurationScope tds(Timeline::GetVMStream(),
-                              "TestVMDuration");
+    TimelineDurationScope tds(Timeline::GetVMStream(), "TestVMDuration");
     lib = TestCase::LoadTestScript(kScriptChars, NULL);
   }
 
@@ -9960,8 +9682,8 @@
 
   // Run Dart_GlobalTimelineGetTrace on a fresh thread.
   GlobalTimelineThreadData data;
-  int err = OSThread::Start("Timeline test thread",
-      GlobalTimelineThread, reinterpret_cast<uword>(&data));
+  int err = OSThread::Start("Timeline test thread", GlobalTimelineThread,
+                            reinterpret_cast<uword>(&data));
   EXPECT(err == 0);
   {
     MonitorLocker ml(data.monitor());
@@ -9992,8 +9714,7 @@
   // in the resulting trace.
   {
     // Add something to the VM stream.
-    TimelineDurationScope tds(Timeline::GetVMStream(),
-                              "TestVMDuration2");
+    TimelineDurationScope tds(Timeline::GetVMStream(), "TestVMDuration2");
     // Invoke bar, which will be compiled resulting in a compiler event in
     // the timeline.
     result = Dart_Invoke(lib, NewString("bar"), 0, NULL);
@@ -10001,8 +9722,8 @@
 
   // Grab the global trace.
   GlobalTimelineThreadData data2;
-  err = OSThread::Start("Timeline test thread",
-      GlobalTimelineThread, reinterpret_cast<uword>(&data2));
+  err = OSThread::Start("Timeline test thread", GlobalTimelineThread,
+                        reinterpret_cast<uword>(&data2));
   EXPECT(err == 0);
   {
     MonitorLocker ml(data2.monitor());
@@ -10081,10 +9802,7 @@
       "}\n";
 
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars1, NULL);
-  Dart_Handle result = Dart_Invoke(lib,
-                                   NewString("main"),
-                                   0,
-                                   NULL);
+  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
   Dart_Handle url = NewString("test-lib-patch");
   Dart_Handle source = NewString(kScriptChars2);
@@ -10092,15 +9810,9 @@
   EXPECT_VALID(result);
   result = Dart_FinalizeLoading(false);
   EXPECT_VALID(result);
-  result = Dart_Invoke(lib,
-                       NewString("foozoo"),
-                       0,
-                       NULL);
+  result = Dart_Invoke(lib, NewString("foozoo"), 0, NULL);
   EXPECT_VALID(result);
-  result = Dart_Invoke(lib,
-                       NewString("foomoo"),
-                       0,
-                       NULL);
+  result = Dart_Invoke(lib, NewString("foomoo"), 0, NULL);
   EXPECT_VALID(result);
 }
 
@@ -10121,10 +9833,7 @@
       "}\n";
 
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars1, NULL);
-  Dart_Handle result = Dart_Invoke(lib,
-                                   NewString("main"),
-                                   0,
-                                   NULL);
+  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
   Dart_Handle url = NewString("test-lib-patch");
   Dart_Handle source = NewString(kScriptChars2);
@@ -10134,10 +9843,7 @@
   EXPECT_VALID(result);
   result = Dart_FinalizeLoading(false);
   EXPECT_VALID(result);
-  result = Dart_Invoke(lib,
-                       NewString("foozoo"),
-                       0,
-                       NULL);
+  result = Dart_Invoke(lib, NewString("foozoo"), 0, NULL);
   EXPECT(Dart_IsError(result));
 }
 
@@ -10157,10 +9863,7 @@
       "}\n";
 
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars1, NULL);
-  Dart_Handle result = Dart_Invoke(lib,
-                                   NewString("main"),
-                                   0,
-                                   NULL);
+  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
   Dart_Handle url = NewString("test-lib-patch");
   Dart_Handle source = NewString(kScriptChars2);
@@ -10170,10 +9873,7 @@
   EXPECT_VALID(result);
   result = Dart_FinalizeLoading(false);
   EXPECT_VALID(result);
-  result = Dart_Invoke(lib,
-                       NewString("foozoo"),
-                       0,
-                       NULL);
+  result = Dart_Invoke(lib, NewString("foozoo"), 0, NULL);
   EXPECT(Dart_IsError(result));
   OS::Print("Patched class executed\n");
 }
@@ -10194,16 +9894,10 @@
       "}\n";
 
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars1, NULL);
-  Dart_Handle result = Dart_Invoke(lib,
-                                   NewString("main"),
-                                   0,
-                                   NULL);
+  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
   // We invoke the foozoo method to ensure that code for 'zoo' is generated
   // which throws NoSuchMethod.
-  result = Dart_Invoke(lib,
-                       NewString("foozoo"),
-                       0,
-                       NULL);
+  result = Dart_Invoke(lib, NewString("foozoo"), 0, NULL);
   EXPECT(Dart_IsError(result));
   Dart_Handle url = NewString("test-lib-patch");
   Dart_Handle source = NewString(kScriptChars2);
@@ -10213,10 +9907,7 @@
   EXPECT_VALID(result);
   result = Dart_FinalizeLoading(false);
   EXPECT_VALID(result);
-  result = Dart_Invoke(lib,
-                       NewString("foozoo"),
-                       0,
-                       NULL);
+  result = Dart_Invoke(lib, NewString("foozoo"), 0, NULL);
   EXPECT(Dart_IsError(result));
 }
 
diff --git a/runtime/vm/dart_api_message.cc b/runtime/vm/dart_api_message.cc
index 18fee76..4d3687f3 100644
--- a/runtime/vm/dart_api_message.cc
+++ b/runtime/vm/dart_api_message.cc
@@ -17,8 +17,7 @@
       zone_(NULL),
       backward_references_(kNumInitialReferences),
       vm_isolate_references_(kNumInitialReferences),
-      vm_symbol_references_(NULL) {
-}
+      vm_symbol_references_(NULL) {}
 
 
 ApiMessageReader::ApiMessageReader(Message* msg)
@@ -28,8 +27,7 @@
       zone_(NULL),
       backward_references_(kNumInitialReferences),
       vm_isolate_references_(kNumInitialReferences),
-      vm_symbol_references_(NULL) {
-}
+      vm_symbol_references_(NULL) {}
 
 
 void ApiMessageReader::Init() {
@@ -60,7 +58,7 @@
         reinterpret_cast<const RawObject*>(CurrentBufferAddress());
     ASSERT(ApiObjectConverter::CanConvert(raw_obj));
     Dart_CObject* cobj =
-      reinterpret_cast<Dart_CObject*>(allocator(sizeof(Dart_CObject)));
+        reinterpret_cast<Dart_CObject*>(allocator(sizeof(Dart_CObject)));
     ApiObjectConverter::Convert(raw_obj, cobj);
     return cobj;
   }
@@ -143,9 +141,8 @@
   // Allocate a Dart_CObject structure followed by an array of chars
   // for the string content. The pointer to the string content is set
   // up to this area.
-  Dart_CObject* value =
-      reinterpret_cast<Dart_CObject*>(
-          allocator(sizeof(Dart_CObject) + length + 1));
+  Dart_CObject* value = reinterpret_cast<Dart_CObject*>(
+      allocator(sizeof(Dart_CObject) + length + 1));
   ASSERT(value != NULL);
   value->value.as_string = reinterpret_cast<char*>(value) + sizeof(*value);
   value->type = Dart_CObject_kString;
@@ -179,14 +176,14 @@
 
 
 Dart_CObject* ApiMessageReader::AllocateDartCObjectTypedData(
-    Dart_TypedData_Type type, intptr_t length) {
+    Dart_TypedData_Type type,
+    intptr_t length) {
   // Allocate a Dart_CObject structure followed by an array of bytes
   // for the byte array content. The pointer to the byte array content
   // is set up to this area.
   intptr_t length_in_bytes = GetTypedDataSizeInBytes(type) * length;
-  Dart_CObject* value =
-      reinterpret_cast<Dart_CObject*>(
-          allocator(sizeof(Dart_CObject) + length_in_bytes));
+  Dart_CObject* value = reinterpret_cast<Dart_CObject*>(
+      allocator(sizeof(Dart_CObject) + length_in_bytes));
   ASSERT(value != NULL);
   value->type = Dart_CObject_kTypedData;
   value->value.as_typed_data.type = type;
@@ -205,9 +202,8 @@
   // Allocate a Dart_CObject structure followed by an array of
   // pointers to Dart_CObject structures. The pointer to the array
   // content is set up to this area.
-  Dart_CObject* value =
-      reinterpret_cast<Dart_CObject*>(
-          allocator(sizeof(Dart_CObject) + length * sizeof(value)));
+  Dart_CObject* value = reinterpret_cast<Dart_CObject*>(
+      allocator(sizeof(Dart_CObject) + length * sizeof(value)));
   ASSERT(value != NULL);
   value->type = Dart_CObject_kArray;
   value->value.as_array.length = length;
@@ -261,9 +257,8 @@
 
 Dart_CObject_Internal* ApiMessageReader::AllocateDartCObjectInternal(
     Dart_CObject_Internal::Type type) {
-  Dart_CObject_Internal* value =
-      reinterpret_cast<Dart_CObject_Internal*>(
-          allocator(sizeof(Dart_CObject_Internal)));
+  Dart_CObject_Internal* value = reinterpret_cast<Dart_CObject_Internal*>(
+      allocator(sizeof(Dart_CObject_Internal)));
   ASSERT(value != NULL);
   value->type = static_cast<Dart_CObject_Type>(type);
   return value;
@@ -293,25 +288,24 @@
     const char* name;
     Dart_TypedData_Type type;
   } view_class_names[] = {
-    { "_Int8ArrayView", Dart_TypedData_kInt8 },
-    { "_Uint8ArrayView", Dart_TypedData_kUint8 },
-    { "_Uint8ClampedArrayView", Dart_TypedData_kUint8Clamped },
-    { "_Int16ArrayView", Dart_TypedData_kInt16 },
-    { "_Uint16ArrayView", Dart_TypedData_kUint16 },
-    { "_Int32ArrayView", Dart_TypedData_kInt32 },
-    { "_Uint32ArrayView", Dart_TypedData_kUint32 },
-    { "_Int64ArrayView", Dart_TypedData_kInt64 },
-    { "_Uint64ArrayView", Dart_TypedData_kUint64 },
-    { "_ByteDataView", Dart_TypedData_kUint8 },
-    { "_Float32ArrayView", Dart_TypedData_kFloat32 },
-    { "_Float64ArrayView", Dart_TypedData_kFloat64 },
-    { NULL, Dart_TypedData_kInvalid },
+      {"_Int8ArrayView", Dart_TypedData_kInt8},
+      {"_Uint8ArrayView", Dart_TypedData_kUint8},
+      {"_Uint8ClampedArrayView", Dart_TypedData_kUint8Clamped},
+      {"_Int16ArrayView", Dart_TypedData_kInt16},
+      {"_Uint16ArrayView", Dart_TypedData_kUint16},
+      {"_Int32ArrayView", Dart_TypedData_kInt32},
+      {"_Uint32ArrayView", Dart_TypedData_kUint32},
+      {"_Int64ArrayView", Dart_TypedData_kInt64},
+      {"_Uint64ArrayView", Dart_TypedData_kUint64},
+      {"_ByteDataView", Dart_TypedData_kUint8},
+      {"_Float32ArrayView", Dart_TypedData_kFloat32},
+      {"_Float64ArrayView", Dart_TypedData_kFloat64},
+      {NULL, Dart_TypedData_kInvalid},
   };
 
   int i = 0;
   while (view_class_names[i].name != NULL) {
-    if (strncmp(view_class_names[i].name,
-                class_name,
+    if (strncmp(view_class_names[i].name, class_name,
                 strlen(view_class_names[i].name)) == 0) {
       return view_class_names[i].type;
     }
@@ -342,9 +336,8 @@
       ASSERT(object->cls->type ==
              static_cast<Dart_CObject_Type>(Dart_CObject_Internal::kClass));
     }
-    ASSERT(object->type ==
-           static_cast<Dart_CObject_Type>(
-               Dart_CObject_Internal::kUninitialized));
+    ASSERT(object->type == static_cast<Dart_CObject_Type>(
+                               Dart_CObject_Internal::kUninitialized));
 
     char* library_uri =
         object->cls->internal.as_class.library_url->value.as_string;
@@ -373,8 +366,7 @@
         object->type = Dart_CObject_kTypedData;
         object->value.as_typed_data.type = type;
         object->value.as_typed_data.length =
-            object->internal.as_view.length *
-            GetTypedDataSizeInBytes(type);
+            object->internal.as_view.length * GetTypedDataSizeInBytes(type);
         object->value.as_typed_data.values =
             buffer->value.as_typed_data.values +
             object->internal.as_view.offset_in_bytes;
@@ -428,8 +420,7 @@
   if (vm_symbol_references_ == NULL) {
     intptr_t size =
         (sizeof(*vm_symbol_references_) * Symbols::kMaxPredefinedId);
-    vm_symbol_references_ =
-        reinterpret_cast<Dart_CObject**>(allocator(size));
+    vm_symbol_references_ = reinterpret_cast<Dart_CObject**>(allocator(size));
     memset(vm_symbol_references_, 0, size);
   }
 
@@ -628,7 +619,7 @@
       Dart_CObject* digits = ReadObjectImpl();
       ASSERT(digits->type == Dart_CObject_kTypedData);
       ASSERT(digits->value.as_typed_data.type == Dart_TypedData_kUint32);
-      ASSERT(digits->value.as_typed_data.length >= 4*used);
+      ASSERT(digits->value.as_typed_data.length >= 4 * used);
       // Update the bigint object.
       object->value.as_bigint.neg = neg;
       object->value.as_bigint.used = used;
@@ -642,7 +633,7 @@
     }
     case kOneByteStringCid: {
       intptr_t len = ReadSmiValue();
-      uint8_t *latin1 =
+      uint8_t* latin1 =
           reinterpret_cast<uint8_t*>(allocator(len * sizeof(uint8_t)));
       intptr_t utf8_len = 0;
       for (intptr_t i = 0; i < len; i++) {
@@ -661,8 +652,8 @@
     }
     case kTwoByteStringCid: {
       intptr_t len = ReadSmiValue();
-      uint16_t *utf16 = reinterpret_cast<uint16_t*>(
-          allocator(len * sizeof(uint16_t)));
+      uint16_t* utf16 =
+          reinterpret_cast<uint16_t*>(allocator(len * sizeof(uint16_t)));
       intptr_t utf8_len = 0;
       // Read all the UTF-16 code units.
       for (intptr_t i = 0; i < len; i++) {
@@ -709,24 +700,23 @@
     }
 
 #define READ_TYPED_DATA_HEADER(type)                                           \
-      intptr_t len = ReadSmiValue();                                           \
-      Dart_CObject* object =                                                   \
-          AllocateDartCObjectTypedData(Dart_TypedData_k##type, len);           \
-      AddBackRef(object_id, object, kIsDeserialized);                          \
+  intptr_t len = ReadSmiValue();                                               \
+  Dart_CObject* object =                                                       \
+      AllocateDartCObjectTypedData(Dart_TypedData_k##type, len);               \
+  AddBackRef(object_id, object, kIsDeserialized);
 
 
 #define READ_TYPED_DATA(type, ctype)                                           \
-    {                                                                          \
-      READ_TYPED_DATA_HEADER(type);                                            \
-      if (len > 0) {                                                           \
-        ctype* p =                                                             \
-            reinterpret_cast<ctype*>(object->value.as_typed_data.values);      \
-        for (intptr_t i = 0; i < len; i++) {                                   \
-          p[i] = Read<ctype>();                                                \
-        }                                                                      \
+  {                                                                            \
+    READ_TYPED_DATA_HEADER(type);                                              \
+    if (len > 0) {                                                             \
+      ctype* p = reinterpret_cast<ctype*>(object->value.as_typed_data.values); \
+      for (intptr_t i = 0; i < len; i++) {                                     \
+        p[i] = Read<ctype>();                                                  \
       }                                                                        \
-      return object;                                                           \
     }                                                                          \
+    return object;                                                             \
+  }
 
     case kTypedDataInt8ArrayCid:
     case kExternalTypedDataInt8ArrayCid: {
@@ -829,10 +819,8 @@
 
 
 Dart_CObject* ApiMessageReader::ReadIndexedObject(intptr_t object_id) {
-  if (object_id == kDynamicType ||
-      object_id == kDoubleType ||
-      object_id == kIntType ||
-      object_id == kBoolType ||
+  if (object_id == kDynamicType || object_id == kDoubleType ||
+      object_id == kIntType || object_id == kBoolType ||
       object_id == kStringType) {
     // Always return dynamic type (this is only a marker).
     return &dynamic_type_marker;
@@ -905,7 +893,7 @@
 }
 
 
-void ApiMessageWriter::WriteMessage(intptr_t field_count, intptr_t *data) {
+void ApiMessageWriter::WriteMessage(intptr_t field_count, intptr_t* data) {
   // Write out the serialization header value for this object.
   WriteInlinedObjectHeader(kMaxPredefinedObjectIds);
 
@@ -939,8 +927,8 @@
 
 void ApiMessageWriter::UnmarkCObject(Dart_CObject* object) {
   ASSERT(IsCObjectMarked(object));
-  object->type = static_cast<Dart_CObject_Type>(
-      object->type & kDartCObjectTypeMask);
+  object->type =
+      static_cast<Dart_CObject_Type>(object->type & kDartCObjectTypeMask);
 }
 
 
@@ -1053,8 +1041,7 @@
   Dart_CObject_Type type = object->type;
   if (type == Dart_CObject_kArray) {
     const intptr_t array_length = object->value.as_array.length;
-    if (array_length < 0 ||
-        array_length > Array::kMaxElements) {
+    if (array_length < 0 || array_length > Array::kMaxElements) {
       return false;
     }
 
@@ -1088,8 +1075,7 @@
   Dart_CObject_Type type = object->type;
   if (type == Dart_CObject_kArray) {
     const intptr_t array_length = object->value.as_array.length;
-    if (array_length < 0 ||
-        array_length > Array::kMaxElements) {
+    if (array_length < 0 || array_length > Array::kMaxElements) {
       return false;
     }
     // Write out the serialization header value for this object.
@@ -1113,8 +1099,7 @@
       static_cast<Dart_CObject_Type>(object->type & kDartCObjectTypeMask);
   ASSERT(type == Dart_CObject_kArray);
   const intptr_t array_length = object->value.as_array.length;
-  if (array_length < 0 ||
-      array_length > Array::kMaxElements) {
+  if (array_length < 0 || array_length > Array::kMaxElements) {
     return false;
   }
 
@@ -1203,10 +1188,8 @@
       if (type == Utf8::kLatin1) {
         uint8_t* latin1_str =
             reinterpret_cast<uint8_t*>(::malloc(len * sizeof(uint8_t)));
-        bool success = Utf8::DecodeToLatin1(utf8_str,
-                                            utf8_len,
-                                            latin1_str,
-                                            len);
+        bool success =
+            Utf8::DecodeToLatin1(utf8_str, utf8_len, latin1_str, len);
         ASSERT(success);
         for (intptr_t i = 0; i < len; i++) {
           Write<uint8_t>(latin1_str[i]);
@@ -1245,8 +1228,7 @@
       }
 
       intptr_t len = object->value.as_typed_data.length;
-      if (len < 0 ||
-          len > TypedData::MaxElements(class_id)) {
+      if (len < 0 || len > TypedData::MaxElements(class_id)) {
         return false;
       }
 
@@ -1288,8 +1270,8 @@
       WriteTags(0);
       intptr_t length = object->value.as_external_typed_data.length;
       if (length < 0 ||
-          length > ExternalTypedData::MaxElements(
-              kExternalTypedDataUint8ArrayCid)) {
+          length >
+              ExternalTypedData::MaxElements(kExternalTypedDataUint8ArrayCid)) {
         return false;
       }
       uint8_t* data = object->value.as_external_typed_data.data;
diff --git a/runtime/vm/dart_api_message.h b/runtime/vm/dart_api_message.h
index 7baab59..8e2747a 100644
--- a/runtime/vm/dart_api_message.h
+++ b/runtime/vm/dart_api_message.h
@@ -50,7 +50,7 @@
   // the enclosing ApiNativeScope.
   ApiMessageReader(const uint8_t* buffer, intptr_t length);
   explicit ApiMessageReader(Message* message);
-  ~ApiMessageReader() { }
+  ~ApiMessageReader() {}
 
   Dart_CObject* ReadMessage();
 
@@ -93,8 +93,8 @@
   // Allocates a Dart_CObject object for string data.
   Dart_CObject* AllocateDartCObjectString(intptr_t length);
   // Allocates a C Dart_CObject object for a typed data.
-  Dart_CObject* AllocateDartCObjectTypedData(
-      Dart_TypedData_Type type, intptr_t length);
+  Dart_CObject* AllocateDartCObjectTypedData(Dart_TypedData_Type type,
+                                             intptr_t length);
   // Allocates a C array of Dart_CObject objects.
   Dart_CObject* AllocateDartCObjectArray(intptr_t length);
   // Allocate a C Dart_CObject object for a VM isolate object.
@@ -137,8 +137,7 @@
   }
 
   Dart_CObject* CreateDartCObjectString(RawObject* raw);
-  Dart_CObject* GetCanonicalMintObject(Dart_CObject_Type type,
-                                       int64_t value64);
+  Dart_CObject* GetCanonicalMintObject(Dart_CObject_Type type, int64_t value64);
 
   uint8_t* allocator(intptr_t size) {
     return zone_->Realloc<uint8_t>(NULL, 0, size);
@@ -160,16 +159,16 @@
   static const intptr_t kInitialSize = 512;
   ApiMessageWriter(uint8_t** buffer, ReAlloc alloc)
       : BaseWriter(buffer, alloc, kInitialSize),
-        object_id_(0), forward_list_(NULL),
-        forward_list_length_(0), forward_id_(0) {
+        object_id_(0),
+        forward_list_(NULL),
+        forward_list_length_(0),
+        forward_id_(0) {
     ASSERT(kDartCObjectTypeMask >= Dart_CObject_kNumberOfTypes - 1);
   }
-  ~ApiMessageWriter() {
-    ::free(forward_list_);
-  }
+  ~ApiMessageWriter() { ::free(forward_list_); }
 
   // Writes a message of integers.
-  void WriteMessage(intptr_t field_count, intptr_t *data);
+  void WriteMessage(intptr_t field_count, intptr_t* data);
 
   // Writes a message with a single object.
   bool WriteCMessage(Dart_CObject* object);
diff --git a/runtime/vm/dart_api_state.cc b/runtime/vm/dart_api_state.cc
index 6d0967d..2d1d827 100644
--- a/runtime/vm/dart_api_state.cc
+++ b/runtime/vm/dart_api_state.cc
@@ -15,9 +15,8 @@
 namespace dart {
 
 BackgroundFinalizer::BackgroundFinalizer(Isolate* isolate,
-                                         FinalizationQueue* queue) :
-    isolate_(isolate),
-    queue_(queue) {
+                                         FinalizationQueue* queue)
+    : isolate_(isolate), queue_(queue) {
   ASSERT(FLAG_background_finalization);
   PageSpace* old_space = isolate->heap()->old_space();
   MonitorLocker ml(old_space->tasks_lock());
@@ -26,8 +25,7 @@
 
 
 void BackgroundFinalizer::Run() {
-  bool result = Thread::EnterIsolateAsHelper(isolate_,
-                                             Thread::kFinalizerTask);
+  bool result = Thread::EnterIsolateAsHelper(isolate_, Thread::kFinalizerTask);
   ASSERT(result);
 
   {
diff --git a/runtime/vm/dart_api_state.h b/runtime/vm/dart_api_state.h
index 7b38cb5..1bff38c 100644
--- a/runtime/vm/dart_api_state.h
+++ b/runtime/vm/dart_api_state.h
@@ -32,7 +32,7 @@
 class BackgroundFinalizer : public ThreadPool::Task {
  public:
   BackgroundFinalizer(Isolate* isolate, FinalizationQueue* queue);
-  virtual ~BackgroundFinalizer() { }
+  virtual ~BackgroundFinalizer() {}
 
   void Run();
 
@@ -88,7 +88,9 @@
   // 'ElementType'.  Checks for integer overflow when performing the
   // size computation.
   template <class ElementType>
-  ElementType* Alloc(intptr_t len) { return zone_.Alloc<ElementType>(len); }
+  ElementType* Alloc(intptr_t len) {
+    return zone_.Alloc<ElementType>(len);
+  }
 
   // Allocates an array sized to hold 'len' elements of type
   // 'ElementType'.  The new array is initialized from the memory of
@@ -133,7 +135,8 @@
  private:
   Zone zone_;
 
-  template<typename T> friend class ApiGrowableArray;
+  template <typename T>
+  friend class ApiGrowableArray;
   DISALLOW_COPY_AND_ASSIGN(ApiZone);
 };
 
@@ -148,13 +151,11 @@
   void set_raw(RawObject* raw) { raw_ = raw; }
   static intptr_t raw_offset() { return OFFSET_OF(LocalHandle, raw_); }
 
-  Dart_Handle apiHandle() {
-    return reinterpret_cast<Dart_Handle>(this);
-  }
+  Dart_Handle apiHandle() { return reinterpret_cast<Dart_Handle>(this); }
 
  private:
-  LocalHandle() { }
-  ~LocalHandle() { }
+  LocalHandle() {}
+  ~LocalHandle() {}
 
   RawObject* raw_;
   DISALLOW_ALLOCATION();  // Allocated through AllocateHandle methods.
@@ -188,21 +189,17 @@
  private:
   friend class PersistentHandles;
 
-  PersistentHandle() { }
-  ~PersistentHandle() { }
+  PersistentHandle() {}
+  ~PersistentHandle() {}
 
   // Overload the raw_ field as a next pointer when adding freed
   // handles to the free list.
-  PersistentHandle* Next() {
-    return reinterpret_cast<PersistentHandle*>(raw_);
-  }
+  PersistentHandle* Next() { return reinterpret_cast<PersistentHandle*>(raw_); }
   void SetNext(PersistentHandle* free_list) {
     raw_ = reinterpret_cast<RawObject*>(free_list);
     ASSERT(!raw_->IsHeapObject());
   }
-  void FreeHandle(PersistentHandle* free_list) {
-    SetNext(free_list);
-  }
+  void FreeHandle(PersistentHandle* free_list) { SetNext(free_list); }
 
   RawObject* raw_;
   DISALLOW_ALLOCATION();  // Allocated through AllocateHandle methods.
@@ -293,19 +290,16 @@
                                                   kExternalSizeBitsSize> {};
   // This bit of external_data_ is true if the referent was created in new
   // space and UpdateRelocated has not yet detected any promotion.
-  class ExternalNewSpaceBit :
-      public BitField<uword, bool, kExternalNewSpaceBit, 1> {};
-  class QueuedForFinalizationBit :
-      public BitField<uword, bool, kQueuedForFinalizationBit, 1> {};
+  class ExternalNewSpaceBit
+      : public BitField<uword, bool, kExternalNewSpaceBit, 1> {};
+  class QueuedForFinalizationBit
+      : public BitField<uword, bool, kQueuedForFinalizationBit, 1> {};
 
   friend class FinalizablePersistentHandles;
 
   FinalizablePersistentHandle()
-      : raw_(NULL),
-        peer_(NULL),
-        external_data_(0),
-        callback_(NULL) { }
-  ~FinalizablePersistentHandle() { }
+      : raw_(NULL), peer_(NULL), external_data_(0), callback_(NULL) {}
+  ~FinalizablePersistentHandle() {}
 
   static void Finalize(Isolate* isolate, FinalizablePersistentHandle* handle);
 
@@ -348,8 +342,8 @@
   void set_external_size(intptr_t size) {
     intptr_t size_in_words = Utils::RoundUp(size, kObjectAlignment) / kWordSize;
     ASSERT(ExternalSizeInWordsBits::is_valid(size_in_words));
-    external_data_ = ExternalSizeInWordsBits::update(size_in_words,
-                                                     external_data_);
+    external_data_ =
+        ExternalSizeInWordsBits::update(size_in_words, external_data_);
   }
 
   bool is_queued_for_finalization() const {
@@ -374,8 +368,8 @@
   // Returns the space to charge for the external size.
   Heap::Space SpaceForExternal() const {
     // Non-heap and VM-heap objects count as old space here.
-    return (raw_->IsHeapObject() && raw_->IsNewObject()) ?
-           Heap::kNew : Heap::kOld;
+    return (raw_->IsHeapObject() && raw_->IsNewObject()) ? Heap::kNew
+                                                         : Heap::kOld;
   }
 
   friend class BackgroundFinalizer;
@@ -398,9 +392,10 @@
                              kLocalHandlesPerChunk,
                              kOffsetOfRawPtrInLocalHandle> {
  public:
-  LocalHandles() : Handles<kLocalHandleSizeInWords,
-                           kLocalHandlesPerChunk,
-                           kOffsetOfRawPtrInLocalHandle>() {
+  LocalHandles()
+      : Handles<kLocalHandleSizeInWords,
+                kLocalHandlesPerChunk,
+                kOffsetOfRawPtrInLocalHandle>() {
     if (FLAG_trace_handles) {
       OS::PrintErr("*** Starting a new Local handle block 0x%" Px "\n",
                    reinterpret_cast<intptr_t>(this));
@@ -409,8 +404,7 @@
   ~LocalHandles() {
     if (FLAG_trace_handles) {
       OS::PrintErr("***   Handle Counts for 0x(%" Px "):Scoped = %d\n",
-                   reinterpret_cast<intptr_t>(this),
-                   CountHandles());
+                   reinterpret_cast<intptr_t>(this), CountHandles());
       OS::PrintErr("*** Deleting Local handle block 0x%" Px "\n",
                    reinterpret_cast<intptr_t>(this));
     }
@@ -419,15 +413,13 @@
 
   // Visit all object pointers stored in the various handles.
   void VisitObjectPointers(ObjectPointerVisitor* visitor) {
-    Handles<kLocalHandleSizeInWords,
-            kLocalHandlesPerChunk,
+    Handles<kLocalHandleSizeInWords, kLocalHandlesPerChunk,
             kOffsetOfRawPtrInLocalHandle>::VisitObjectPointers(visitor);
   }
 
   // Reset the local handles block for reuse.
   void Reset() {
-    Handles<kLocalHandleSizeInWords,
-            kLocalHandlesPerChunk,
+    Handles<kLocalHandleSizeInWords, kLocalHandlesPerChunk,
             kOffsetOfRawPtrInLocalHandle>::Reset();
   }
 
@@ -444,9 +436,7 @@
   }
 
   // Returns a count of active handles (used for testing purposes).
-  int CountHandles() const {
-    return CountScopedHandles();
-  }
+  int CountHandles() const { return CountScopedHandles(); }
 
  private:
   DISALLOW_COPY_AND_ASSIGN(LocalHandles);
@@ -462,9 +452,10 @@
                                   kPersistentHandlesPerChunk,
                                   kOffsetOfRawPtrInPersistentHandle> {
  public:
-  PersistentHandles() : Handles<kPersistentHandleSizeInWords,
-                                kPersistentHandlesPerChunk,
-                                kOffsetOfRawPtrInPersistentHandle>(),
+  PersistentHandles()
+      : Handles<kPersistentHandleSizeInWords,
+                kPersistentHandlesPerChunk,
+                kOffsetOfRawPtrInPersistentHandle>(),
         free_list_(NULL) {
     if (FLAG_trace_handles) {
       OS::PrintErr("*** Starting a new Persistent handle block 0x%" Px "\n",
@@ -475,8 +466,7 @@
     free_list_ = NULL;
     if (FLAG_trace_handles) {
       OS::PrintErr("***   Handle Counts for 0x(%" Px "):Scoped = %d\n",
-                   reinterpret_cast<intptr_t>(this),
-                   CountHandles());
+                   reinterpret_cast<intptr_t>(this), CountHandles());
       OS::PrintErr("*** Deleting Persistent handle block 0x%" Px "\n",
                    reinterpret_cast<intptr_t>(this));
     }
@@ -488,15 +478,13 @@
 
   // Visit all object pointers stored in the various handles.
   void VisitObjectPointers(ObjectPointerVisitor* visitor) {
-    Handles<kPersistentHandleSizeInWords,
-            kPersistentHandlesPerChunk,
+    Handles<kPersistentHandleSizeInWords, kPersistentHandlesPerChunk,
             kOffsetOfRawPtrInPersistentHandle>::VisitObjectPointers(visitor);
   }
 
   // Visit all the handles.
   void Visit(HandleVisitor* visitor) {
-    Handles<kPersistentHandleSizeInWords,
-            kPersistentHandlesPerChunk,
+    Handles<kPersistentHandleSizeInWords, kPersistentHandlesPerChunk,
             kOffsetOfRawPtrInPersistentHandle>::Visit(visitor);
   }
 
@@ -525,9 +513,7 @@
   }
 
   // Returns a count of active handles (used for testing purposes).
-  int CountHandles() const {
-    return CountScopedHandles();
-  }
+  int CountHandles() const { return CountScopedHandles(); }
 
  private:
   PersistentHandle* free_list_;
@@ -537,7 +523,7 @@
 
 // Finalizable persistent handles repository structure.
 static const int kFinalizablePersistentHandleSizeInWords =
-     sizeof(FinalizablePersistentHandle) / kWordSize;
+    sizeof(FinalizablePersistentHandle) / kWordSize;
 static const int kFinalizablePersistentHandlesPerChunk = 64;
 static const int kOffsetOfRawPtrInFinalizablePersistentHandle = 0;
 class FinalizablePersistentHandles
@@ -549,7 +535,8 @@
       : Handles<kFinalizablePersistentHandleSizeInWords,
                 kFinalizablePersistentHandlesPerChunk,
                 kOffsetOfRawPtrInFinalizablePersistentHandle>(),
-      free_list_(NULL), mutex_(new Mutex()) { }
+        free_list_(NULL),
+        mutex_(new Mutex()) {}
   ~FinalizablePersistentHandles() {
     free_list_ = NULL;
     delete mutex_;
@@ -564,16 +551,15 @@
   void VisitHandles(HandleVisitor* visitor) {
     Handles<kFinalizablePersistentHandleSizeInWords,
             kFinalizablePersistentHandlesPerChunk,
-            kOffsetOfRawPtrInFinalizablePersistentHandle>::Visit(
-                visitor);
+            kOffsetOfRawPtrInFinalizablePersistentHandle>::Visit(visitor);
   }
 
   // Visit all object pointers stored in the various handles.
   void VisitObjectPointers(ObjectPointerVisitor* visitor) {
     Handles<kFinalizablePersistentHandleSizeInWords,
             kFinalizablePersistentHandlesPerChunk,
-            kOffsetOfRawPtrInFinalizablePersistentHandle>::VisitObjectPointers(
-                visitor);
+            kOffsetOfRawPtrInFinalizablePersistentHandle>::
+        VisitObjectPointers(visitor);
   }
 
   // Allocates a persistent handle, these have to be destroyed explicitly
@@ -590,8 +576,8 @@
       }
     }
 
-    handle = reinterpret_cast<FinalizablePersistentHandle*>(
-          AllocateScopedHandle());
+    handle =
+        reinterpret_cast<FinalizablePersistentHandle*>(AllocateScopedHandle());
     handle->Clear();
     return handle;
   }
@@ -609,9 +595,7 @@
   }
 
   // Returns a count of active handles (used for testing purposes).
-  int CountHandles() const {
-    return CountScopedHandles();
-  }
+  int CountHandles() const { return CountScopedHandles(); }
 
  private:
   FinalizablePersistentHandle* free_list_;
@@ -624,11 +608,9 @@
 // These local scopes manage handles and memory allocated in the scope.
 class ApiLocalScope {
  public:
-  ApiLocalScope(ApiLocalScope* previous, uword stack_marker) :
-      previous_(previous), stack_marker_(stack_marker) { }
-  ~ApiLocalScope() {
-    previous_ = NULL;
-  }
+  ApiLocalScope(ApiLocalScope* previous, uword stack_marker)
+      : previous_(previous), stack_marker_(stack_marker) {}
+  ~ApiLocalScope() { previous_ = NULL; }
 
   // Reinit the ApiLocalScope to new values.
   void Reinit(Thread* thread, ApiLocalScope* previous, uword stack_marker) {
@@ -668,7 +650,7 @@
     // Currently no support for nesting native scopes.
     ASSERT(Current() == NULL);
     OSThread::SetThreadLocal(Api::api_native_key_,
-                                reinterpret_cast<uword>(this));
+                             reinterpret_cast<uword>(this));
   }
 
   ~ApiNativeScope() {
@@ -697,16 +679,14 @@
 // picks the zone from the current isolate if in an isolate
 // environment. When outside an isolate environment it picks the zone
 // from the current native scope.
-template<typename T>
+template <typename T>
 class ApiGrowableArray : public BaseGrowableArray<T, ValueObject> {
  public:
   explicit ApiGrowableArray(int initial_capacity)
-      : BaseGrowableArray<T, ValueObject>(
-          initial_capacity,
-          ApiNativeScope::Current()->zone()) {}
+      : BaseGrowableArray<T, ValueObject>(initial_capacity,
+                                          ApiNativeScope::Current()->zone()) {}
   ApiGrowableArray()
-      : BaseGrowableArray<T, ValueObject>(
-          ApiNativeScope::Current()->zone()) {}
+      : BaseGrowableArray<T, ValueObject>(ApiNativeScope::Current()->zone()) {}
   ApiGrowableArray(intptr_t initial_capacity, Zone* zone)
       : BaseGrowableArray<T, ValueObject>(initial_capacity, zone) {}
 };
@@ -717,12 +697,13 @@
 // basis and destroyed when the isolate is shutdown.
 class ApiState {
  public:
-  ApiState() : persistent_handles_(),
-               weak_persistent_handles_(),
-               null_(NULL),
-               true_(NULL),
-               false_(NULL),
-               acquired_error_(NULL) {}
+  ApiState()
+      : persistent_handles_(),
+        weak_persistent_handles_(),
+        null_(NULL),
+        true_(NULL),
+        false_(NULL),
+        acquired_error_(NULL) {}
   ~ApiState() {
     if (null_ != NULL) {
       persistent_handles().FreeHandle(null_);
diff --git a/runtime/vm/dart_entry.cc b/runtime/vm/dart_entry.cc
index 12567e6..3346bef 100644
--- a/runtime/vm/dart_entry.cc
+++ b/runtime/vm/dart_entry.cc
@@ -71,8 +71,7 @@
 class SuspendLongJumpScope : public StackResource {
  public:
   explicit SuspendLongJumpScope(Thread* thread)
-      : StackResource(thread),
-        saved_long_jump_base_(thread->long_jump_base()) {
+      : StackResource(thread), saved_long_jump_base_(thread->long_jump_base()) {
     thread->set_long_jump_base(NULL);
   }
 
@@ -96,13 +95,13 @@
   Zone* zone = thread->zone();
   ASSERT(thread->IsMutatorThread());
   if (!function.HasCode()) {
-    const Error& error = Error::Handle(
-        zone, Compiler::CompileFunction(thread, function));
+    const Error& error =
+        Error::Handle(zone, Compiler::CompileFunction(thread, function));
     if (!error.IsNull()) {
       return error.raw();
     }
   }
-  // Now Call the invoke stub which will invoke the dart function.
+// Now Call the invoke stub which will invoke the dart function.
 #if !defined(TARGET_ARCH_DBC)
   invokestub entrypoint = reinterpret_cast<invokestub>(
       StubCode::InvokeDartCode_entry()->EntryPoint());
@@ -114,22 +113,16 @@
   SuspendLongJumpScope suspend_long_jump_scope(thread);
   TransitionToGenerated transition(thread);
 #if defined(TARGET_ARCH_DBC)
-  return Simulator::Current()->Call(code,
-                                    arguments_descriptor,
-                                    arguments,
+  return Simulator::Current()->Call(code, arguments_descriptor, arguments,
                                     thread);
 #elif defined(USING_SIMULATOR)
   return bit_copy<RawObject*, int64_t>(Simulator::Current()->Call(
-      reinterpret_cast<intptr_t>(entrypoint),
-      reinterpret_cast<intptr_t>(&code),
+      reinterpret_cast<intptr_t>(entrypoint), reinterpret_cast<intptr_t>(&code),
       reinterpret_cast<intptr_t>(&arguments_descriptor),
       reinterpret_cast<intptr_t>(&arguments),
       reinterpret_cast<intptr_t>(thread)));
 #else
-  return entrypoint(code,
-                    arguments_descriptor,
-                    arguments,
-                    thread);
+  return entrypoint(code, arguments_descriptor, arguments, thread);
 #endif
 }
 
@@ -155,8 +148,7 @@
     // Only invoke the function if its arguments are compatible.
     const ArgumentsDescriptor args_desc(arguments_descriptor);
     if (function.AreValidArgumentCounts(args_desc.Count(),
-                                        args_desc.NamedCount(),
-                                        NULL)) {
+                                        args_desc.NamedCount(), 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);
@@ -184,15 +176,14 @@
 
         if (c_stack_pos < c_stack_limit) {
           const Instance& exception =
-            Instance::Handle(zone, isolate->object_store()->stack_overflow());
+              Instance::Handle(zone, isolate->object_store()->stack_overflow());
           return UnhandledException::New(exception, Stacktrace::Handle(zone));
         }
 
         const Array& getter_arguments = Array::Handle(zone, Array::New(1));
         getter_arguments.SetAt(0, instance);
-        const Object& getter_result =
-              Object::Handle(zone, DartEntry::InvokeFunction(function,
-                                                       getter_arguments));
+        const Object& getter_result = Object::Handle(
+            zone, DartEntry::InvokeFunction(function, getter_arguments));
         if (getter_result.IsError()) {
           return getter_result.raw();
         }
@@ -202,8 +193,8 @@
         // This otherwise unnecessary handle is used to prevent clang from
         // doing tail call elimination, which would make the stack overflow
         // check above ineffective.
-        Object& result = Object::Handle(zone,
-            InvokeClosure(arguments, arguments_descriptor));
+        Object& result = Object::Handle(
+            zone, InvokeClosure(arguments, arguments_descriptor));
         return result.raw();
       }
       cls = cls.SuperClass();
@@ -211,9 +202,7 @@
   }
 
   // No compatible method or getter so invoke noSuchMethod.
-  return InvokeNoSuchMethod(instance,
-                            Symbols::Call(),
-                            arguments,
+  return InvokeNoSuchMethod(instance, Symbols::Call(), arguments,
                             arguments_descriptor);
 }
 
@@ -226,9 +215,8 @@
   // Allocate an Invocation object.
   const Library& core_lib = Library::Handle(Library::CoreLibrary());
 
-  Class& invocation_mirror_class = Class::Handle(
-      core_lib.LookupClass(
-          String::Handle(core_lib.PrivateName(Symbols::InvocationMirror()))));
+  Class& invocation_mirror_class = Class::Handle(core_lib.LookupClass(
+      String::Handle(core_lib.PrivateName(Symbols::InvocationMirror()))));
   ASSERT(!invocation_mirror_class.IsNull());
   const String& function_name =
       String::Handle(core_lib.PrivateName(Symbols::AllocateInvocationMirror()));
@@ -241,8 +229,8 @@
   allocation_args.SetAt(1, arguments_descriptor);
   allocation_args.SetAt(2, arguments);
   allocation_args.SetAt(3, Bool::False());  // Not a super invocation.
-  const Object& invocation_mirror = Object::Handle(
-      InvokeFunction(allocation_function, allocation_args));
+  const Object& invocation_mirror =
+      Object::Handle(InvokeFunction(allocation_function, allocation_args));
   if (invocation_mirror.IsError()) {
     Exceptions::PropagateError(Error::Cast(invocation_mirror));
     UNREACHABLE();
@@ -253,9 +241,7 @@
   ArgumentsDescriptor args_desc(
       Array::Handle(ArgumentsDescriptor::New(kNumArguments)));
   Function& function = Function::Handle(
-      Resolver::ResolveDynamic(receiver,
-                               Symbols::NoSuchMethod(),
-                               args_desc));
+      Resolver::ResolveDynamic(receiver, Symbols::NoSuchMethod(), args_desc));
   if (function.IsNull()) {
     ASSERT(!FLAG_lazy_dispatchers);
     // If noSuchMethod(invocation) is not found, call Object::noSuchMethod.
@@ -263,8 +249,7 @@
     function ^= Resolver::ResolveDynamicForReceiverClass(
         Class::Handle(thread->zone(),
                       thread->isolate()->object_store()->object_class()),
-        Symbols::NoSuchMethod(),
-        args_desc);
+        Symbols::NoSuchMethod(), args_desc);
   }
   ASSERT(!function.IsNull());
   const Array& args = Array::Handle(Array::New(kNumArguments));
@@ -274,9 +259,7 @@
 }
 
 
-ArgumentsDescriptor::ArgumentsDescriptor(const Array& array)
-    : array_(array) {
-}
+ArgumentsDescriptor::ArgumentsDescriptor(const Array& array) : array_(array) {}
 
 
 intptr_t ArgumentsDescriptor::Count() const {
@@ -290,9 +273,8 @@
 
 
 RawString* ArgumentsDescriptor::NameAt(intptr_t index) const {
-  const intptr_t offset = kFirstNamedEntryIndex +
-                          (index * kNamedEntrySize) +
-                          kNameOffset;
+  const intptr_t offset =
+      kFirstNamedEntryIndex + (index * kNamedEntrySize) + kNameOffset;
   String& result = String::Handle();
   result ^= array_.At(offset);
   return result.raw();
@@ -300,9 +282,8 @@
 
 
 intptr_t ArgumentsDescriptor::PositionAt(intptr_t index) const {
-  const intptr_t offset = kFirstNamedEntryIndex +
-                          (index * kNamedEntrySize) +
-                          kPositionOffset;
+  const intptr_t offset =
+      kFirstNamedEntryIndex + (index * kNamedEntrySize) + kPositionOffset;
   return Smi::Value(Smi::RawCast(array_.At(offset)));
 }
 
@@ -344,8 +325,8 @@
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   const intptr_t descriptor_len = LengthFor(num_named_args);
-  Array& descriptor = Array::Handle(
-      zone, Array::New(descriptor_len, Heap::kOld));
+  Array& descriptor =
+      Array::Handle(zone, Array::New(descriptor_len, Heap::kOld));
 
   // Set total number of passed arguments.
   descriptor.SetAt(kCountIndex, Smi::Handle(Smi::New(num_arguments)));
@@ -404,8 +385,8 @@
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   const intptr_t descriptor_len = LengthFor(0);
-  Array& descriptor = Array::Handle(
-      zone, Array::New(descriptor_len, Heap::kOld));
+  Array& descriptor =
+      Array::Handle(zone, Array::New(descriptor_len, Heap::kOld));
   const Smi& arg_count = Smi::Handle(zone, Smi::New(num_arguments));
 
   // Set total number of passed arguments.
@@ -444,7 +425,7 @@
   const int kNumExtraArgs = 1;  // implicit rcvr arg.
   const Instance& exception_object = Instance::Handle(Instance::New(cls));
   const Array& constructor_arguments =
-    Array::Handle(Array::New(arguments.Length() + kNumExtraArgs));
+      Array::Handle(Array::New(arguments.Length() + kNumExtraArgs));
   constructor_arguments.SetAt(0, exception_object);
   Object& obj = Object::Handle();
   for (intptr_t i = 0; i < arguments.Length(); i++) {
@@ -452,14 +433,13 @@
     constructor_arguments.SetAt((i + kNumExtraArgs), obj);
   }
 
-  const String& function_name = String::Handle(
-      String::Concat(class_name, constructor_name));
+  const String& function_name =
+      String::Handle(String::Concat(class_name, constructor_name));
   const Function& constructor =
       Function::Handle(cls.LookupConstructorAllowPrivate(function_name));
   ASSERT(!constructor.IsNull());
-  const Object& retval =
-    Object::Handle(DartEntry::InvokeFunction(constructor,
-                                             constructor_arguments));
+  const Object& retval = Object::Handle(
+      DartEntry::InvokeFunction(constructor, constructor_arguments));
   ASSERT(retval.IsNull() || retval.IsError());
   if (retval.IsError()) {
     return retval.raw();
@@ -473,14 +453,12 @@
   ArgumentsDescriptor args_desc(
       Array::Handle(ArgumentsDescriptor::New(kNumArguments)));
   const Function& function = Function::Handle(
-      Resolver::ResolveDynamic(receiver,
-                               Symbols::toString(),
-                               args_desc));
+      Resolver::ResolveDynamic(receiver, Symbols::toString(), args_desc));
   ASSERT(!function.IsNull());
   const Array& args = Array::Handle(Array::New(kNumArguments));
   args.SetAt(0, receiver);
-  const Object& result = Object::Handle(DartEntry::InvokeFunction(function,
-                                                                  args));
+  const Object& result =
+      Object::Handle(DartEntry::InvokeFunction(function, args));
   ASSERT(result.IsInstance() || result.IsError());
   return result.raw();
 }
@@ -491,14 +469,12 @@
   ArgumentsDescriptor args_desc(
       Array::Handle(ArgumentsDescriptor::New(kNumArguments)));
   const Function& function = Function::Handle(
-      Resolver::ResolveDynamic(receiver,
-                               Symbols::hashCode(),
-                               args_desc));
+      Resolver::ResolveDynamic(receiver, Symbols::hashCode(), args_desc));
   ASSERT(!function.IsNull());
   const Array& args = Array::Handle(Array::New(kNumArguments));
   args.SetAt(0, receiver);
-  const Object& result = Object::Handle(DartEntry::InvokeFunction(function,
-                                                                  args));
+  const Object& result =
+      Object::Handle(DartEntry::InvokeFunction(function, args));
   ASSERT(result.IsInstance() || result.IsError());
   return result.raw();
 }
@@ -510,16 +486,14 @@
   ArgumentsDescriptor args_desc(
       Array::Handle(ArgumentsDescriptor::New(kNumArguments)));
   const Function& function = Function::Handle(
-      Resolver::ResolveDynamic(left,
-                               Symbols::EqualOperator(),
-                               args_desc));
+      Resolver::ResolveDynamic(left, Symbols::EqualOperator(), args_desc));
   ASSERT(!function.IsNull());
 
   const Array& args = Array::Handle(Array::New(kNumArguments));
   args.SetAt(0, left);
   args.SetAt(1, right);
-  const Object& result = Object::Handle(DartEntry::InvokeFunction(function,
-                                                                  args));
+  const Object& result =
+      Object::Handle(DartEntry::InvokeFunction(function, args));
   ASSERT(result.IsInstance() || result.IsError());
   return result.raw();
 }
@@ -527,8 +501,8 @@
 
 RawObject* DartLibraryCalls::LookupHandler(Dart_Port port_id) {
   Thread* thread = Thread::Current();
-  Function& function = Function::Handle(thread->zone(),
-      thread->isolate()->object_store()->lookup_port_handler());
+  Function& function = Function::Handle(
+      thread->zone(), thread->isolate()->object_store()->lookup_port_handler());
   const int kNumArguments = 1;
   if (function.IsNull()) {
     Library& isolate_lib = Library::Handle(Library::IsolateLibrary());
@@ -537,11 +511,8 @@
         String::Handle(isolate_lib.PrivateName(Symbols::_RawReceivePortImpl()));
     const String& function_name =
         String::Handle(isolate_lib.PrivateName(Symbols::_lookupHandler()));
-    function = Resolver::ResolveStatic(isolate_lib,
-                                       class_name,
-                                       function_name,
-                                       kNumArguments,
-                                       Object::empty_array());
+    function = Resolver::ResolveStatic(isolate_lib, class_name, function_name,
+                                       kNumArguments, Object::empty_array());
     ASSERT(!function.IsNull());
     thread->isolate()->object_store()->set_lookup_port_handler(function);
   }
@@ -558,21 +529,18 @@
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   Isolate* isolate = thread->isolate();
-  Function& function = Function::Handle(zone,
-      isolate->object_store()->handle_message_function());
+  Function& function = Function::Handle(
+      zone, isolate->object_store()->handle_message_function());
   const int kNumArguments = 2;
   if (function.IsNull()) {
     Library& isolate_lib = Library::Handle(zone, Library::IsolateLibrary());
     ASSERT(!isolate_lib.IsNull());
-    const String& class_name = String::Handle(zone,
-        isolate_lib.PrivateName(Symbols::_RawReceivePortImpl()));
-    const String& function_name = String::Handle(zone,
-        isolate_lib.PrivateName(Symbols::_handleMessage()));
-    function = Resolver::ResolveStatic(isolate_lib,
-                                       class_name,
-                                       function_name,
-                                       kNumArguments,
-                                       Object::empty_array());
+    const String& class_name = String::Handle(
+        zone, isolate_lib.PrivateName(Symbols::_RawReceivePortImpl()));
+    const String& function_name = String::Handle(
+        zone, isolate_lib.PrivateName(Symbols::_handleMessage()));
+    function = Resolver::ResolveStatic(isolate_lib, class_name, function_name,
+                                       kNumArguments, Object::empty_array());
     ASSERT(!function.IsNull());
     isolate->object_store()->set_handle_message_function(function);
   }
@@ -585,8 +553,8 @@
     // at the first location the user is interested in.
     isolate->debugger()->SetSingleStep();
   }
-  const Object& result = Object::Handle(zone,
-      DartEntry::InvokeFunction(function, args));
+  const Object& result =
+      Object::Handle(zone, DartEntry::InvokeFunction(function, args));
   ASSERT(result.IsNull() || result.IsError());
   return result.raw();
 }
@@ -596,11 +564,11 @@
   Zone* zone = Thread::Current()->zone();
   Library& isolate_lib = Library::Handle(zone, Library::IsolateLibrary());
   ASSERT(!isolate_lib.IsNull());
-  Function& function = Function::Handle(zone,
-      isolate_lib.LookupFunctionAllowPrivate(
-          Symbols::_runPendingImmediateCallback()));
-  const Object& result = Object::Handle(zone,
-      DartEntry::InvokeFunction(function, Object::empty_array()));
+  Function& function =
+      Function::Handle(zone, isolate_lib.LookupFunctionAllowPrivate(
+                                 Symbols::_runPendingImmediateCallback()));
+  const Object& result = Object::Handle(
+      zone, DartEntry::InvokeFunction(function, Object::empty_array()));
   ASSERT(result.IsNull() || result.IsError());
   return result.raw();
 }
@@ -613,16 +581,14 @@
   ArgumentsDescriptor args_desc(
       Array::Handle(ArgumentsDescriptor::New(kNumArguments)));
   const Function& function = Function::Handle(
-      Resolver::ResolveDynamic(map,
-                               Symbols::AssignIndexToken(),
-                               args_desc));
+      Resolver::ResolveDynamic(map, Symbols::AssignIndexToken(), args_desc));
   ASSERT(!function.IsNull());
   const Array& args = Array::Handle(Array::New(kNumArguments));
   args.SetAt(0, map);
   args.SetAt(1, key);
   args.SetAt(2, value);
-  const Object& result = Object::Handle(DartEntry::InvokeFunction(function,
-                                                                  args));
+  const Object& result =
+      Object::Handle(DartEntry::InvokeFunction(function, args));
   return result.raw();
 }
 
diff --git a/runtime/vm/dart_entry.h b/runtime/vm/dart_entry.h
index e1d4f1a..2a52eec 100644
--- a/runtime/vm/dart_entry.h
+++ b/runtime/vm/dart_entry.h
@@ -51,8 +51,7 @@
   // Allocate and return an arguments descriptor.  The first
   // (count - optional_arguments_names.Length()) arguments are
   // positional and the remaining ones are named optional arguments.
-  static RawArray* New(intptr_t count,
-                       const Array& optional_arguments_names);
+  static RawArray* New(intptr_t count, const Array& optional_arguments_names);
 
   // Allocate and return an arguments descriptor that has no optional
   // arguments. All arguments are positional.
@@ -61,9 +60,7 @@
   // Initialize the preallocated fixed length arguments descriptors cache.
   static void InitOnce();
 
-  enum {
-    kCachedDescriptorCount = 32
-  };
+  enum { kCachedDescriptorCount = 32 };
 
  private:
   // Absolute indexes into the array.
@@ -89,15 +86,11 @@
 
   // Used by Simulator to parse argument descriptors.
   static intptr_t name_index(intptr_t index) {
-    return kFirstNamedEntryIndex +
-           (index * kNamedEntrySize) +
-           kNameOffset;
+    return kFirstNamedEntryIndex + (index * kNamedEntrySize) + kNameOffset;
   }
 
   static intptr_t position_index(intptr_t index) {
-    return kFirstNamedEntryIndex +
-           (index * kNamedEntrySize) +
-           kPositionOffset;
+    return kFirstNamedEntryIndex + (index * kNamedEntrySize) + kPositionOffset;
   }
 
   const Array& array_;
diff --git a/runtime/vm/dart_entry_test.cc b/runtime/vm/dart_entry_test.cc
index d075819..eb694cf 100644
--- a/runtime/vm/dart_entry_test.cc
+++ b/runtime/vm/dart_entry_test.cc
@@ -23,14 +23,13 @@
       "}\n";
   String& url = String::Handle(String::New("dart-test:DartEntry"));
   String& source = String::Handle(String::New(kScriptChars));
-  Script& script = Script::Handle(Script::New(url,
-                                              source,
-                                              RawScript::kScriptTag));
+  Script& script =
+      Script::Handle(Script::New(url, source, RawScript::kScriptTag));
   Library& lib = Library::Handle(Library::CoreLibrary());
   EXPECT_EQ(true, CompilerTest::TestCompileScript(lib, script));
   EXPECT(ClassFinalizer::ProcessPendingClasses());
-  Class& cls = Class::Handle(
-      lib.LookupClass(String::Handle(Symbols::New(thread, "A"))));
+  Class& cls =
+      Class::Handle(lib.LookupClass(String::Handle(Symbols::New(thread, "A"))));
   EXPECT(!cls.IsNull());  // No ambiguity error expected.
   String& name = String::Handle(String::New("foo"));
   Function& function = Function::Handle(cls.LookupStaticFunction(name));
@@ -51,14 +50,13 @@
       "}\n";
   String& url = String::Handle(String::New("dart-test:DartEntry"));
   String& source = String::Handle(String::New(kScriptChars));
-  Script& script = Script::Handle(Script::New(url,
-                                              source,
-                                              RawScript::kScriptTag));
+  Script& script =
+      Script::Handle(Script::New(url, source, RawScript::kScriptTag));
   Library& lib = Library::Handle(Library::CoreLibrary());
   EXPECT_EQ(true, CompilerTest::TestCompileScript(lib, script));
   EXPECT(ClassFinalizer::ProcessPendingClasses());
-  Class& cls = Class::Handle(
-      lib.LookupClass(String::Handle(Symbols::New(thread, "A"))));
+  Class& cls =
+      Class::Handle(lib.LookupClass(String::Handle(Symbols::New(thread, "A"))));
   EXPECT(!cls.IsNull());  // No ambiguity error expected.
   String& name = String::Handle(String::New("foo"));
   Function& function = Function::Handle(cls.LookupStaticFunction(name));
@@ -77,14 +75,13 @@
       "}\n";
   String& url = String::Handle(String::New("dart-test:DartEntry"));
   String& source = String::Handle(String::New(kScriptChars));
-  Script& script = Script::Handle(Script::New(url,
-                                              source,
-                                              RawScript::kScriptTag));
+  Script& script =
+      Script::Handle(Script::New(url, source, RawScript::kScriptTag));
   Library& lib = Library::Handle(Library::CoreLibrary());
   EXPECT_EQ(true, CompilerTest::TestCompileScript(lib, script));
   EXPECT(ClassFinalizer::ProcessPendingClasses());
-  Class& cls = Class::Handle(
-      lib.LookupClass(String::Handle(Symbols::New(thread, "A"))));
+  Class& cls =
+      Class::Handle(lib.LookupClass(String::Handle(Symbols::New(thread, "A"))));
   EXPECT(!cls.IsNull());  // No ambiguity error expected.
 
   // Invoke the constructor.
@@ -93,7 +90,7 @@
   constructor_arguments.SetAt(0, instance);
   String& constructor_name = String::Handle(Symbols::New(thread, "A."));
   Function& constructor =
-    Function::Handle(cls.LookupConstructor(constructor_name));
+      Function::Handle(cls.LookupConstructor(constructor_name));
   ASSERT(!constructor.IsNull());
   DartEntry::InvokeFunction(constructor, constructor_arguments);
 
@@ -103,8 +100,8 @@
   EXPECT(!function.IsNull());
   const Array& args = Array::Handle(Array::New(1));
   args.SetAt(0, instance);
-  const Object& retval = Object::Handle(DartEntry::InvokeFunction(function,
-                                                                  args));
+  const Object& retval =
+      Object::Handle(DartEntry::InvokeFunction(function, args));
   EXPECT(retval.IsError());
   EXPECT_SUBSTRING("++++", Error::Cast(retval).ToErrorCString());
 }
diff --git a/runtime/vm/datastream.h b/runtime/vm/datastream.h
index ca23535..3b714b7 100644
--- a/runtime/vm/datastream.h
+++ b/runtime/vm/datastream.h
@@ -27,9 +27,8 @@
 // Stream for reading various types from a buffer.
 class ReadStream : public ValueObject {
  public:
-  ReadStream(const uint8_t* buffer, intptr_t size) : buffer_(buffer),
-                                                     current_(buffer),
-                                                     end_(buffer + size)  {}
+  ReadStream(const uint8_t* buffer, intptr_t size)
+      : buffer_(buffer), current_(buffer), end_(buffer + size) {}
 
   void SetStream(const uint8_t* buffer, intptr_t size) {
     buffer_ = buffer;
@@ -37,39 +36,31 @@
     end_ = buffer + size;
   }
 
-  template<int N, typename T>
-  class Raw { };
+  template <int N, typename T>
+  class Raw {};
 
-  template<typename T>
+  template <typename T>
   class Raw<1, T> {
    public:
-    static T Read(ReadStream* st) {
-      return bit_cast<T>(st->ReadByte());
-    }
+    static T Read(ReadStream* st) { return bit_cast<T>(st->ReadByte()); }
   };
 
-  template<typename T>
+  template <typename T>
   class Raw<2, T> {
    public:
-    static T Read(ReadStream* st) {
-      return bit_cast<T>(st->Read16());
-    }
+    static T Read(ReadStream* st) { return bit_cast<T>(st->Read16()); }
   };
 
-  template<typename T>
+  template <typename T>
   class Raw<4, T> {
    public:
-    static T Read(ReadStream* st) {
-      return bit_cast<T>(st->Read32());
-    }
+    static T Read(ReadStream* st) { return bit_cast<T>(st->Read32()); }
   };
 
-  template<typename T>
+  template <typename T>
   class Raw<8, T> {
    public:
-    static T Read(ReadStream* st) {
-      return bit_cast<T>(st->Read64());
-    }
+    static T Read(ReadStream* st) { return bit_cast<T>(st->Read64()); }
   };
 
   // Reads 'len' bytes from the stream.
@@ -79,9 +70,7 @@
     current_ += len;
   }
 
-  intptr_t ReadUnsigned() {
-    return Read<intptr_t>(kEndUnsignedByteMarker);
-  }
+  intptr_t ReadUnsigned() { return Read<intptr_t>(kEndUnsignedByteMarker); }
 
   intptr_t Position() const { return current_ - buffer_; }
 
@@ -90,9 +79,7 @@
     current_ = buffer_ + value;
   }
 
-  const uint8_t* AddressOfCurrentPosition() const {
-    return current_;
-  }
+  const uint8_t* AddressOfCurrentPosition() const { return current_; }
 
   void Advance(intptr_t value) {
     ASSERT((end_ - current_) > value);
@@ -105,24 +92,18 @@
   }
 
  private:
-  template<typename T>
+  template <typename T>
   T Read() {
     return Read<T>(kEndByteMarker);
   }
 
-  int16_t Read16() {
-    return Read16(kEndByteMarker);
-  }
+  int16_t Read16() { return Read16(kEndByteMarker); }
 
-  int32_t Read32() {
-    return Read32(kEndByteMarker);
-  }
+  int32_t Read32() { return Read32(kEndByteMarker); }
 
-  int64_t Read64() {
-    return Read64(kEndByteMarker);
-  }
+  int64_t Read64() { return Read64(kEndByteMarker); }
 
-  template<typename T>
+  template <typename T>
   T Read(uint8_t end_byte_marker) {
     const uint8_t* c = current_;
     ASSERT(c < end_);
@@ -309,18 +290,16 @@
 // Stream for writing various types into a buffer.
 class WriteStream : public ValueObject {
  public:
-  WriteStream(uint8_t** buffer, ReAlloc alloc, intptr_t initial_size) :
-      buffer_(buffer),
-      end_(NULL),
-      current_(NULL),
-      current_size_(0),
-      alloc_(alloc),
-      initial_size_(initial_size) {
+  WriteStream(uint8_t** buffer, ReAlloc alloc, intptr_t initial_size)
+      : buffer_(buffer),
+        end_(NULL),
+        current_(NULL),
+        current_size_(0),
+        alloc_(alloc),
+        initial_size_(initial_size) {
     ASSERT(buffer != NULL);
     ASSERT(alloc != NULL);
-    *buffer_ = reinterpret_cast<uint8_t*>(alloc_(NULL,
-                                                 0,
-                                                 initial_size_));
+    *buffer_ = reinterpret_cast<uint8_t*>(alloc_(NULL, 0, initial_size_));
     if (*buffer_ == NULL) {
       Exceptions::ThrowOOM();
     }
@@ -334,10 +313,10 @@
 
   void set_current(uint8_t* value) { current_ = value; }
 
-  template<int N, typename T>
-  class Raw { };
+  template <int N, typename T>
+  class Raw {};
 
-  template<typename T>
+  template <typename T>
   class Raw<1, T> {
    public:
     static void Write(WriteStream* st, T value) {
@@ -345,7 +324,7 @@
     }
   };
 
-  template<typename T>
+  template <typename T>
   class Raw<2, T> {
    public:
     static void Write(WriteStream* st, T value) {
@@ -353,7 +332,7 @@
     }
   };
 
-  template<typename T>
+  template <typename T>
   class Raw<4, T> {
    public:
     static void Write(WriteStream* st, T value) {
@@ -361,7 +340,7 @@
     }
   };
 
-  template<typename T>
+  template <typename T>
   class Raw<8, T> {
    public:
     static void Write(WriteStream* st, T value) {
@@ -404,11 +383,10 @@
   }
 
  private:
-  template<typename T>
+  template <typename T>
   void Write(T value) {
     T v = value;
-    while (v < kMinDataPerByte ||
-           v > kMaxDataPerByte) {
+    while (v < kMinDataPerByte || v > kMaxDataPerByte) {
       WriteByte(static_cast<uint8_t>(v & kByteMask));
       v = v >> kDataBitsPerByte;
     }
@@ -431,9 +409,8 @@
     }
     intptr_t new_size = current_size_ + increment_size;
     ASSERT(new_size > current_size_);
-    *buffer_ = reinterpret_cast<uint8_t*>(alloc_(*buffer_,
-                                                 current_size_,
-                                                 new_size));
+    *buffer_ =
+        reinterpret_cast<uint8_t*>(alloc_(*buffer_, current_size_, new_size));
     if (*buffer_ == NULL) {
       Exceptions::ThrowOOM();
     }
@@ -459,8 +436,8 @@
     // Print.
     va_list print_args;
     va_copy(print_args, args);
-    OS::VSNPrint(reinterpret_cast<char*>(current_),
-                 len + 1, format, print_args);
+    OS::VSNPrint(reinterpret_cast<char*>(current_), len + 1, format,
+                 print_args);
     va_end(print_args);
     current_ += len;  // Not len + 1 to swallow the terminating NUL.
   }
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index 5176eff..3cdf810 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -34,12 +34,18 @@
 
 namespace dart {
 
-DEFINE_FLAG(bool, show_invisible_frames, false,
+DEFINE_FLAG(bool,
+            show_invisible_frames,
+            false,
             "Show invisible frames in debugger stack traces");
-DEFINE_FLAG(bool, trace_debugger_stacktrace, false,
+DEFINE_FLAG(bool,
+            trace_debugger_stacktrace,
+            false,
             "Trace debugger stacktrace collection");
 DEFINE_FLAG(bool, verbose_debug, false, "Verbose debugger messages");
-DEFINE_FLAG(bool, steal_breakpoints, false,
+DEFINE_FLAG(bool,
+            steal_breakpoints,
+            false,
             "Intercept breakpoints and other pause events before they "
             "are sent to the embedder and use a generic VM breakpoint "
             "handler instead.  This handler dispatches breakpoints to "
@@ -58,9 +64,7 @@
   explicit RemoteObjectCache(intptr_t initial_size);
   intptr_t AddObject(const Object& obj);
   RawObject* GetObj(intptr_t obj_id) const;
-  bool IsValidId(intptr_t obj_id) const {
-    return obj_id < objs_->Length();
-  }
+  bool IsValidId(intptr_t obj_id) const { return obj_id < objs_->Length(); }
 
  private:
   GrowableObjectArray* objs_;
@@ -205,7 +209,7 @@
 
   Breakpoint* bpt = conditions_;
   while (bpt != NULL) {
-    bpt -> VisitObjectPointers(visitor);
+    bpt->VisitObjectPointers(visitor);
     bpt = bpt->next();
   }
 }
@@ -237,14 +241,15 @@
 }
 
 
-ActivationFrame::ActivationFrame(
-    uword pc,
-    uword fp,
-    uword sp,
-    const Code& code,
-    const Array& deopt_frame,
-    intptr_t deopt_frame_offset)
-    : pc_(pc), fp_(fp), sp_(sp),
+ActivationFrame::ActivationFrame(uword pc,
+                                 uword fp,
+                                 uword sp,
+                                 const Code& code,
+                                 const Array& deopt_frame,
+                                 intptr_t deopt_frame_offset)
+    : pc_(pc),
+      fp_(fp),
+      sp_(sp),
       ctx_(Context::ZoneHandle()),
       code_(Code::ZoneHandle(code.raw())),
       function_(Function::ZoneHandle(code.function())),
@@ -259,8 +264,7 @@
       vars_initialized_(false),
       var_descriptors_(LocalVarDescriptors::ZoneHandle()),
       desc_indices_(8),
-      pc_desc_(PcDescriptors::ZoneHandle()) {
-}
+      pc_desc_(PcDescriptors::ZoneHandle()) {}
 
 
 bool Debugger::NeedsIsolateEvents() {
@@ -273,8 +277,7 @@
 bool Debugger::NeedsDebugEvents() {
   ASSERT(isolate_ != Dart::vm_isolate() &&
          !ServiceIsolate::IsServiceIsolateDescendant(isolate_));
-  return (FLAG_warn_on_pause_with_no_debugger ||
-          (event_handler_ != NULL) ||
+  return (FLAG_warn_on_pause_with_no_debugger || (event_handler_ != NULL) ||
           Service::debug_stream.enabled());
 }
 
@@ -407,10 +410,9 @@
   Class& func_class = Class::Handle(func.Owner());
   String& class_name = String::Handle(func_class.Name());
 
-  return OS::SCreate(Thread::Current()->zone(),
-    "%s%s%s", func_class.IsTopLevel() ? "" : class_name.ToCString(),
-              func_class.IsTopLevel() ? "" : ".",
-              func_name.ToCString());
+  return OS::SCreate(Thread::Current()->zone(), "%s%s%s",
+                     func_class.IsTopLevel() ? "" : class_name.ToCString(),
+                     func_class.IsTopLevel() ? "" : ".", func_name.ToCString());
 }
 
 
@@ -588,8 +590,8 @@
     if (unoptimized_code.IsNull()) {
       Thread* thread = Thread::Current();
       Zone* zone = thread->zone();
-      const Error& error = Error::Handle(zone,
-          Compiler::EnsureUnoptimizedCode(thread, function()));
+      const Error& error = Error::Handle(
+          zone, Compiler::EnsureUnoptimizedCode(thread, function()));
       if (!error.IsNull()) {
         Exceptions::PropagateError(error);
       }
@@ -661,7 +663,7 @@
     if (kind == RawLocalVarDescriptors::kSavedCurrentContext) {
       if (FLAG_trace_debugger_stacktrace) {
         OS::PrintErr("\tFound saved current ctx at index %d\n",
-            var_info.index());
+                     var_info.index());
       }
       ctx_ ^= GetStackVar(var_info.index());
       return ctx_;
@@ -697,9 +699,7 @@
   Array& handled_types = Array::Handle();
   AbstractType& type = Type::Handle();
   const TypeArguments& no_instantiator = TypeArguments::Handle();
-  for (intptr_t frame_index = 0;
-       frame_index < Length();
-       frame_index++) {
+  for (intptr_t frame_index = 0; frame_index < Length(); frame_index++) {
     ActivationFrame* frame = FrameAt(frame_index);
     intptr_t try_index = frame->TryIndex();
     if (try_index < 0) continue;
@@ -826,8 +826,8 @@
     // can be in a number of places in the caller's frame depending on how many
     // were actually supplied at the call site, but they are copied to a fixed
     // place in the callee's frame.
-    return GetVariableValue(LocalVarAddress(fp(),
-                                            (kFirstLocalSlotFromFp - index)));
+    return GetVariableValue(
+        LocalVarAddress(fp(), (kFirstLocalSlotFromFp - index)));
   } else {
     intptr_t reverse_index = num_parameters - index;
     return GetVariableValue(ParamAddress(fp(), reverse_index));
@@ -850,40 +850,43 @@
 }
 
 
-void ActivationFrame::PrintContextMismatchError(
-    intptr_t ctx_slot,
-    intptr_t frame_ctx_level,
-    intptr_t var_ctx_level) {
-  OS::PrintErr("-------------------------\n"
-               "Encountered context mismatch\n"
-               "\tctx_slot: %" Pd "\n"
-               "\tframe_ctx_level: %" Pd "\n"
-               "\tvar_ctx_level: %" Pd "\n\n",
-               ctx_slot,
-               frame_ctx_level,
-               var_ctx_level);
+void ActivationFrame::PrintContextMismatchError(intptr_t ctx_slot,
+                                                intptr_t frame_ctx_level,
+                                                intptr_t var_ctx_level) {
+  OS::PrintErr(
+      "-------------------------\n"
+      "Encountered context mismatch\n"
+      "\tctx_slot: %" Pd
+      "\n"
+      "\tframe_ctx_level: %" Pd
+      "\n"
+      "\tvar_ctx_level: %" Pd "\n\n",
+      ctx_slot, frame_ctx_level, var_ctx_level);
 
-  OS::PrintErr("-------------------------\n"
-               "Current frame:\n%s\n",
-               this->ToCString());
+  OS::PrintErr(
+      "-------------------------\n"
+      "Current frame:\n%s\n",
+      this->ToCString());
 
-  OS::PrintErr("-------------------------\n"
-               "Context contents:\n");
+  OS::PrintErr(
+      "-------------------------\n"
+      "Context contents:\n");
   const Context& ctx = GetSavedCurrentContext();
   ctx.Dump(8);
 
-  OS::PrintErr("-------------------------\n"
-               "Debugger stack trace...\n\n");
-  DebuggerStackTrace* stack =
-      Isolate::Current()->debugger()->StackTrace();
+  OS::PrintErr(
+      "-------------------------\n"
+      "Debugger stack trace...\n\n");
+  DebuggerStackTrace* stack = Isolate::Current()->debugger()->StackTrace();
   intptr_t num_frames = stack->Length();
   for (intptr_t i = 0; i < num_frames; i++) {
     ActivationFrame* frame = stack->FrameAt(i);
     OS::PrintErr("#%04" Pd " %s", i, frame->ToCString());
   }
 
-  OS::PrintErr("-------------------------\n"
-               "All frames...\n\n");
+  OS::PrintErr(
+      "-------------------------\n"
+      "All frames...\n\n");
   StackFrameIterator iterator(false);
   StackFrame* frame = iterator.NextFrame();
   intptr_t num = 0;
@@ -936,8 +939,7 @@
 
   intptr_t level_diff = frame_ctx_level - var_ctx_level;
   if (level_diff == 0) {
-    if ((ctx_slot < 0) ||
-        (ctx_slot >= ctx.num_variables())) {
+    if ((ctx_slot < 0) || (ctx_slot >= ctx.num_variables())) {
       PrintContextMismatchError(ctx_slot, frame_ctx_level, var_ctx_level);
     }
     ASSERT((ctx_slot >= 0) && (ctx_slot < ctx.num_variables()));
@@ -949,8 +951,7 @@
       level_diff--;
       var_ctx = var_ctx.parent();
     }
-    if (var_ctx.IsNull() ||
-        (ctx_slot < 0) ||
+    if (var_ctx.IsNull() || (ctx_slot < 0) ||
         (ctx_slot >= var_ctx.num_variables())) {
       PrintContextMismatchError(ctx_slot, frame_ctx_level, var_ctx_level);
     }
@@ -1026,8 +1027,7 @@
 
   if (function().is_static()) {
     const Class& cls = Class::Handle(function().Owner());
-    return cls.Evaluate(expr,
-                        Array::Handle(Array::MakeArray(param_names)),
+    return cls.Evaluate(expr, Array::Handle(Array::MakeArray(param_names)),
                         Array::Handle(Array::MakeArray(param_values)));
   } else {
     const Object& receiver = Object::Handle(GetReceiver());
@@ -1037,8 +1037,7 @@
       return Object::null();
     }
     const Instance& inst = Instance::Cast(receiver);
-    return inst.Evaluate(method_cls,
-                         expr,
+    return inst.Evaluate(method_cls, expr,
                          Array::Handle(Array::MakeArray(param_names)),
                          Array::Handle(Array::MakeArray(param_values)));
   }
@@ -1051,24 +1050,21 @@
   const String& url = String::Handle(SourceUrl());
   intptr_t line = LineNumber();
   const char* func_name = Debugger::QualifiedFunctionName(function());
-  return Thread::Current()->zone()->
-      PrintToString("[ Frame pc(0x%" Px ") fp(0x%" Px ") sp(0x%" Px ")\n"
-                    "\tfunction = %s\n"
-                    "\turl = %s\n"
-                    "\tline = %" Pd "\n"
-                    "\tcontext = %s\n"
-                    "\tcontext level = %" Pd " ]\n",
-                    pc(), fp(), sp(),
-                    func_name,
-                    url.ToCString(),
-                    line,
-                    ctx_.ToCString(),
-                    ContextLevel());
+  return Thread::Current()->zone()->PrintToString(
+      "[ Frame pc(0x%" Px ") fp(0x%" Px ") sp(0x%" Px
+      ")\n"
+      "\tfunction = %s\n"
+      "\turl = %s\n"
+      "\tline = %" Pd
+      "\n"
+      "\tcontext = %s\n"
+      "\tcontext level = %" Pd " ]\n",
+      pc(), fp(), sp(), func_name, url.ToCString(), line, ctx_.ToCString(),
+      ContextLevel());
 }
 
 
-void ActivationFrame::PrintToJSONObject(JSONObject* jsobj,
-                                        bool full) {
+void ActivationFrame::PrintToJSONObject(JSONObject* jsobj, bool full) {
   const Script& script = Script::Handle(SourceScript());
   jsobj->AddProperty("type", "Frame");
   TokenPosition pos = TokenPos();
@@ -1093,12 +1089,8 @@
       TokenPosition declaration_token_pos;
       TokenPosition visible_start_token_pos;
       TokenPosition visible_end_token_pos;
-      VariableAt(v,
-                 &var_name,
-                 &declaration_token_pos,
-                 &visible_start_token_pos,
-                 &visible_end_token_pos,
-                 &var_value);
+      VariableAt(v, &var_name, &declaration_token_pos, &visible_start_token_pos,
+                 &visible_end_token_pos, &var_value);
       if (var_name.raw() != Symbols::AsyncOperation().raw()) {
         JSONObject jsvar(&jsvars);
         jsvar.AddProperty("type", "BoundVariable");
@@ -1117,7 +1109,6 @@
 }
 
 
-
 void DebuggerStackTrace::AddActivation(ActivationFrame* frame) {
   if (FLAG_show_invisible_frames || frame->function().is_visible()) {
     trace_.Add(frame);
@@ -1125,9 +1116,9 @@
 }
 
 
-const uint8_t kSafepointKind = RawPcDescriptors::kIcCall
-                             | RawPcDescriptors::kUnoptStaticCall
-                             | RawPcDescriptors::kRuntimeCall;
+const uint8_t kSafepointKind = RawPcDescriptors::kIcCall |
+                               RawPcDescriptors::kUnoptStaticCall |
+                               RawPcDescriptors::kRuntimeCall;
 
 
 CodeBreakpoint::CodeBreakpoint(const Code& code,
@@ -1148,7 +1139,7 @@
       saved_value_(Bytecode::kTrap),
       saved_value_fastsmi_(Bytecode::kTrap)
 #endif
-    {
+{
   ASSERT(!code.IsNull());
   ASSERT(token_pos_.IsReal());
   ASSERT(pc_ != 0);
@@ -1159,7 +1150,7 @@
 CodeBreakpoint::~CodeBreakpoint() {
   // Make sure we don't leave patched code behind.
   ASSERT(!IsEnabled());
-  // Poison the data so we catch use after free errors.
+// Poison the data so we catch use after free errors.
 #ifdef DEBUG
   code_ = Code::null();
   pc_ = 0ul;
@@ -1214,8 +1205,8 @@
 
 
 RemoteObjectCache::RemoteObjectCache(intptr_t initial_size) {
-  objs_ = &GrowableObjectArray::ZoneHandle(
-              GrowableObjectArray::New(initial_size));
+  objs_ =
+      &GrowableObjectArray::ZoneHandle(GrowableObjectArray::New(initial_size));
 }
 
 
@@ -1253,8 +1244,7 @@
       stepping_fp_(0),
       skip_next_step_(false),
       synthetic_async_breakpoint_(NULL),
-      exc_pause_info_(kNoPauseOnExceptions) {
-}
+      exc_pause_info_(kNoPauseOnExceptions) {}
 
 
 Debugger::~Debugger() {
@@ -1299,9 +1289,8 @@
 }
 
 
-static RawFunction* ResolveLibraryFunction(
-                        const Library& library,
-                        const String& fname) {
+static RawFunction* ResolveLibraryFunction(const Library& library,
+                                           const String& fname) {
   ASSERT(!library.IsNull());
   const Object& object = Object::Handle(library.ResolveName(fname));
   if (!object.IsNull() && object.IsFunction()) {
@@ -1427,9 +1416,8 @@
                                             const Array& deopt_frame,
                                             intptr_t deopt_frame_offset) {
   ASSERT(code.ContainsInstructionAt(pc));
-  ActivationFrame* activation =
-      new ActivationFrame(pc, frame->fp(), frame->sp(), code,
-                          deopt_frame, deopt_frame_offset);
+  ActivationFrame* activation = new ActivationFrame(
+      pc, frame->fp(), frame->sp(), code, deopt_frame, deopt_frame_offset);
   if (FLAG_trace_debugger_stacktrace) {
     const Context& ctx = activation->GetSavedCurrentContext();
     OS::PrintErr("\tUsing saved context: %s\n", ctx.ToCString());
@@ -1448,18 +1436,14 @@
   Isolate* isolate = thread->isolate();
   // Create the DeoptContext for this deoptimization.
   DeoptContext* deopt_context =
-      new DeoptContext(frame, code,
-                       DeoptContext::kDestIsAllocated,
-                       NULL,
-                       NULL,
-                       true,
-                       false /* deoptimizing_code */);
+      new DeoptContext(frame, code, DeoptContext::kDestIsAllocated, NULL, NULL,
+                       true, false /* deoptimizing_code */);
   isolate->set_deopt_context(deopt_context);
 
   deopt_context->FillDestFrame();
   deopt_context->MaterializeDeferredObjects();
-  const Array& dest_frame = Array::Handle(thread->zone(),
-                                          deopt_context->DestFrameAsArray());
+  const Array& dest_frame =
+      Array::Handle(thread->zone(), deopt_context->DestFrameAsArray());
 
   isolate->set_deopt_context(NULL);
   delete deopt_context;
@@ -1478,8 +1462,7 @@
   Code& inlined_code = Code::Handle(zone);
   Array& deopt_frame = Array::Handle(zone);
 
-  for (StackFrame* frame = iterator.NextFrame();
-       frame != NULL;
+  for (StackFrame* frame = iterator.NextFrame(); frame != NULL;
        frame = iterator.NextFrame()) {
     ASSERT(frame->IsValid());
     if (FLAG_trace_debugger_stacktrace) {
@@ -1490,8 +1473,7 @@
       code = frame->LookupDartCode();
       if (code.is_optimized() && !FLAG_precompiled_runtime) {
         deopt_frame = DeoptimizeToArray(thread, frame, code);
-        for (InlinedFunctionsIterator it(code, frame->pc());
-             !it.Done();
+        for (InlinedFunctionsIterator it(code, frame->pc()); !it.Done();
              it.Advance()) {
           inlined_code = it.code();
           if (FLAG_trace_debugger_stacktrace) {
@@ -1502,20 +1484,13 @@
                          function.ToFullyQualifiedCString());
           }
           intptr_t deopt_frame_offset = it.GetDeoptFpOffset();
-          stack_trace->AddActivation(CollectDartFrame(isolate,
-                                                      it.pc(),
-                                                      frame,
-                                                      inlined_code,
-                                                      deopt_frame,
+          stack_trace->AddActivation(CollectDartFrame(isolate, it.pc(), frame,
+                                                      inlined_code, deopt_frame,
                                                       deopt_frame_offset));
         }
       } else {
-        stack_trace->AddActivation(CollectDartFrame(isolate,
-                                                    frame->pc(),
-                                                    frame,
-                                                    code,
-                                                    Object::null_array(),
-                                                    0));
+        stack_trace->AddActivation(CollectDartFrame(
+            isolate, frame->pc(), frame, code, Object::null_array(), 0));
       }
     }
   }
@@ -1530,9 +1505,8 @@
     frame = iterator.NextFrame();
   }
   Code& code = Code::Handle(frame->LookupDartCode());
-  ActivationFrame* activation =
-      new ActivationFrame(frame->pc(), frame->fp(), frame->sp(), code,
-                          Object::null_array(), 0);
+  ActivationFrame* activation = new ActivationFrame(
+      frame->pc(), frame->fp(), frame->sp(), code, Object::null_array(), 0);
   return activation;
 }
 
@@ -1578,12 +1552,12 @@
           ASSERT(pc < (code.PayloadStart() + code.Size()));
 
           ActivationFrame* activation = new ActivationFrame(
-            pc, fp, sp, code, deopt_frame, deopt_frame_offset);
+              pc, fp, sp, code, deopt_frame, deopt_frame_offset);
           stack_trace->AddActivation(activation);
         }
       } else {
         ActivationFrame* activation = new ActivationFrame(
-          pc, fp, sp, code, deopt_frame, deopt_frame_offset);
+            pc, fp, sp, code, deopt_frame, deopt_frame_offset);
         stack_trace->AddActivation(activation);
       }
     }
@@ -1632,8 +1606,7 @@
   // by the debugger to evaluate variables values, when we see a nested
   // breakpoint or exception event, or if the debugger is not
   // interested in exception events.
-  if (ignore_breakpoints_ ||
-      IsPaused() ||
+  if (ignore_breakpoints_ || IsPaused() ||
       (exc_pause_info_ == kNoPauseOnExceptions)) {
     return;
   }
@@ -1656,9 +1629,7 @@
 static TokenPosition LastTokenOnLine(Zone* zone,
                                      const TokenStream& tokens,
                                      TokenPosition pos) {
-  TokenStream::Iterator iter(zone,
-                             tokens,
-                             pos,
+  TokenStream::Iterator iter(zone, tokens, pos,
                              TokenStream::Iterator::kAllTokens);
   ASSERT(iter.IsValid());
   TokenPosition last_pos = pos;
@@ -1727,11 +1698,10 @@
 // algorithm, which would be simpler.  I believe that it only needs
 // two passes to support the recursive try-the-whole-function case.
 // Rewrite this later, once there are more tests in place.
-TokenPosition Debugger::ResolveBreakpointPos(
-    const Function& func,
-    TokenPosition requested_token_pos,
-    TokenPosition last_token_pos,
-    intptr_t requested_column) {
+TokenPosition Debugger::ResolveBreakpointPos(const Function& func,
+                                             TokenPosition requested_token_pos,
+                                             TokenPosition last_token_pos,
+                                             intptr_t requested_column) {
   ASSERT(func.HasCode());
   ASSERT(!func.HasOptimizedCode());
 
@@ -1755,8 +1725,7 @@
   PcDescriptors::Iterator iter(desc, kSafepointKind);
   while (iter.MoveNext()) {
     const TokenPosition pos = iter.TokenPos();
-    if ((!pos.IsReal()) ||
-        (pos < requested_token_pos) ||
+    if ((!pos.IsReal()) || (pos < requested_token_pos) ||
         (pos > last_token_pos)) {
       // Token is not in the target range.
       continue;
@@ -1802,9 +1771,7 @@
     PcDescriptors::Iterator iter(desc, kSafepointKind);
     while (iter.MoveNext()) {
       const TokenPosition pos = iter.TokenPos();
-      if (!pos.IsReal() ||
-          (pos < begin_pos) ||
-          (pos > end_of_line_pos)) {
+      if (!pos.IsReal() || (pos < begin_pos) || (pos > end_of_line_pos)) {
         // Token is not on same line as best fit.
         continue;
       }
@@ -1869,8 +1836,8 @@
   CodeBreakpoint* code_bpt = GetCodeBreakpoint(lowest_pc);
   if (code_bpt == NULL) {
     // No code breakpoint for this code exists; create one.
-    code_bpt = new CodeBreakpoint(code, loc->token_pos_,
-                                  lowest_pc, lowest_kind);
+    code_bpt =
+        new CodeBreakpoint(code, loc->token_pos_, lowest_pc, lowest_kind);
     RegisterCodeBreakpoint(code_bpt);
   }
   code_bpt->set_bpt_location(loc);
@@ -1895,9 +1862,9 @@
   for (intptr_t pos = 0; pos < num_closures; pos++) {
     function ^= closures.At(pos);
     ASSERT(!function.IsNull());
-    if ((function.token_pos() == start_pos)
-        && (function.end_token_pos() == end_pos)
-        && (function.script() == script.raw())) {
+    if ((function.token_pos() == start_pos) &&
+        (function.end_token_pos() == end_pos) &&
+        (function.script() == script.raw())) {
       if (function.HasCode() && function.is_debuggable()) {
         function_list->Add(function);
       }
@@ -1933,9 +1900,9 @@
           ASSERT(!function.IsNull());
           // Check token position first to avoid unnecessary calls
           // to script() which allocates handles.
-          if ((function.token_pos() == start_pos)
-              && (function.end_token_pos() == end_pos)
-              && (function.script() == script.raw())) {
+          if ((function.token_pos() == start_pos) &&
+              (function.end_token_pos() == end_pos) &&
+              (function.script() == script.raw())) {
             if (function.HasCode() && function.is_debuggable()) {
               function_list->Add(function);
             }
@@ -2041,9 +2008,7 @@
   // function we found.
   GrowableObjectArray& functions =
       GrowableObjectArray::Handle(GrowableObjectArray::New());
-  FindCompiledFunctions(script,
-                        func.token_pos(),
-                        func.end_token_pos(),
+  FindCompiledFunctions(script, func.token_pos(), func.end_token_pos(),
                         &functions);
 
   if (functions.Length() > 0) {
@@ -2076,10 +2041,10 @@
         intptr_t line_number;
         intptr_t column_number;
         script.GetTokenLocation(breakpoint_pos, &line_number, &column_number);
-        OS::Print("Resolved BP for "
-                  "function '%s' at line %" Pd " col %" Pd "\n",
-                  func.ToFullyQualifiedCString(),
-                  line_number, column_number);
+        OS::Print(
+            "Resolved BP for "
+            "function '%s' at line %" Pd " col %" Pd "\n",
+            func.ToFullyQualifiedCString(), line_number, column_number);
       }
       return bpt;
     }
@@ -2090,10 +2055,10 @@
     intptr_t line_number;
     intptr_t column_number;
     script.GetTokenLocation(token_pos, &line_number, &column_number);
-    OS::Print("Registering pending breakpoint for "
-              "uncompiled function '%s' at line %" Pd " col %" Pd "\n",
-              func.ToFullyQualifiedCString(),
-              line_number, column_number);
+    OS::Print(
+        "Registering pending breakpoint for "
+        "uncompiled function '%s' at line %" Pd " col %" Pd "\n",
+        func.ToFullyQualifiedCString(), line_number, column_number);
   }
   BreakpointLocation* bpt =
       GetBreakpointLocation(script, token_pos, requested_column);
@@ -2143,11 +2108,9 @@
     return NULL;
   }
   const Script& script = Script::Handle(target_function.script());
-  BreakpointLocation* bpt_location =
-      SetBreakpoint(script,
-                    target_function.token_pos(),
-                    target_function.end_token_pos(),
-                    -1, -1 /* no requested line/col */);
+  BreakpointLocation* bpt_location = SetBreakpoint(
+      script, target_function.token_pos(), target_function.end_token_pos(), -1,
+      -1 /* no requested line/col */);
   if (single_shot) {
     return bpt_location->AddSingleShot(this);
   } else {
@@ -2156,17 +2119,15 @@
 }
 
 
-Breakpoint* Debugger::SetBreakpointAtActivation(
-    const Instance& closure, bool for_over_await) {
+Breakpoint* Debugger::SetBreakpointAtActivation(const Instance& closure,
+                                                bool for_over_await) {
   if (!closure.IsClosure()) {
     return NULL;
   }
   const Function& func = Function::Handle(Closure::Cast(closure).function());
   const Script& script = Script::Handle(func.script());
-  BreakpointLocation* bpt_location = SetBreakpoint(script,
-                                                   func.token_pos(),
-                                                   func.end_token_pos(),
-                                                   -1, -1 /* no line/col */);
+  BreakpointLocation* bpt_location = SetBreakpoint(
+      script, func.token_pos(), func.end_token_pos(), -1, -1 /* no line/col */);
   return bpt_location->AddPerClosure(this, closure, for_over_await);
 }
 
@@ -2218,9 +2179,8 @@
   // Dart_SetBreakpoint instead.
   ASSERT(Thread::Current()->execution_state() == Thread::kThreadInVM);
 
-  BreakpointLocation* loc = BreakpointLocationAtLineCol(script_url,
-                                                        line_number,
-                                                        column_number);
+  BreakpointLocation* loc =
+      BreakpointLocationAtLineCol(script_url, line_number, column_number);
   if (loc != NULL) {
     return loc->AddRepeated(this);
   }
@@ -2238,7 +2198,7 @@
   const GrowableObjectArray& libs =
       GrowableObjectArray::Handle(isolate_->object_store()->libraries());
   const GrowableObjectArray& scripts =
-    GrowableObjectArray::Handle(zone, GrowableObjectArray::New());
+      GrowableObjectArray::Handle(zone, GrowableObjectArray::New());
   for (intptr_t i = 0; i < libs.Length(); i++) {
     lib ^= libs.At(i);
     script = lib.LookupScript(script_url);
@@ -2249,14 +2209,13 @@
   if (scripts.Length() == 0) {
     // No script found with given url. Create a latent breakpoint which
     // will be set if the url is loaded later.
-    BreakpointLocation* latent_bpt = GetLatentBreakpoint(script_url,
-                                                         line_number,
-                                                         column_number);
+    BreakpointLocation* latent_bpt =
+        GetLatentBreakpoint(script_url, line_number, column_number);
     if (FLAG_verbose_debug) {
-      OS::Print("Set latent breakpoint in url '%s' at "
-                "line %" Pd " col %" Pd "\n",
-                script_url.ToCString(),
-                line_number, column_number);
+      OS::Print(
+          "Set latent breakpoint in url '%s' at "
+          "line %" Pd " col %" Pd "\n",
+          script_url.ToCString(), line_number, column_number);
     }
     return latent_bpt;
   }
@@ -2279,8 +2238,8 @@
   } else if (!last_token_idx.IsReal()) {
     // Line does not contain any tokens.
     if (FLAG_verbose_debug) {
-      OS::Print("No executable code at line %" Pd " in '%s'\n",
-                line_number, script_url.ToCString());
+      OS::Print("No executable code at line %" Pd " in '%s'\n", line_number,
+                script_url.ToCString());
     }
     return NULL;
   }
@@ -2288,13 +2247,13 @@
   BreakpointLocation* bpt = NULL;
   ASSERT(first_token_idx <= last_token_idx);
   while ((bpt == NULL) && (first_token_idx <= last_token_idx)) {
-    bpt = SetBreakpoint(script, first_token_idx, last_token_idx,
-                        line_number, column_number);
+    bpt = SetBreakpoint(script, first_token_idx, last_token_idx, line_number,
+                        column_number);
     first_token_idx.Next();
   }
   if ((bpt == NULL) && FLAG_verbose_debug) {
-    OS::Print("No executable code at line %" Pd " in '%s'\n",
-                line_number, script_url.ToCString());
+    OS::Print("No executable code at line %" Pd " in '%s'\n", line_number,
+              script_url.ToCString());
   }
   return bpt;
 }
@@ -2544,8 +2503,7 @@
   {
     Thread* thread = Thread::Current();
     DisableThreadInterruptsScope dtis(thread);
-    TimelineDurationScope tds(thread,
-                              Timeline::GetDebuggerStream(),
+    TimelineDurationScope tds(thread, Timeline::GetDebuggerStream(),
                               "Debugger Pause");
 
     // Send the pause event.
@@ -2562,10 +2520,8 @@
     }
 
     // Notify the service that we have resumed.
-    const Error& error =
-        Error::Handle(Thread::Current()->sticky_error());
-    ASSERT(error.IsNull() ||
-           error.IsUnwindError() ||
+    const Error& error = Error::Handle(Thread::Current()->sticky_error());
+    ASSERT(error.IsNull() || error.IsUnwindError() ||
            error.IsUnhandledException());
 
     // Only send a resume event when the isolate is not unwinding.
@@ -2577,7 +2533,7 @@
   }
 
   pause_event_ = NULL;
-  obj_cache_ = NULL;    // Zone allocated
+  obj_cache_ = NULL;  // Zone allocated
 }
 
 
@@ -2641,14 +2597,13 @@
 }
 
 
-void Debugger::SignalPausedEvent(ActivationFrame* top_frame,
-                                 Breakpoint* bpt) {
+void Debugger::SignalPausedEvent(ActivationFrame* top_frame, Breakpoint* bpt) {
   resume_action_ = kContinue;
   stepping_fp_ = 0;
   isolate_->set_single_step(false);
   ASSERT(!IsPaused());
   ASSERT(obj_cache_ == NULL);
-  if ((bpt != NULL) && bpt->IsSingleShot())  {
+  if ((bpt != NULL) && bpt->IsSingleShot()) {
     RemoveBreakpoint(bpt->id());
     bpt = NULL;
   }
@@ -2824,11 +2779,11 @@
 
     // Hit a synthetic async breakpoint.
     if (FLAG_verbose_debug) {
-      OS::Print(">>> hit synthetic breakpoint at %s:%" Pd " "
+      OS::Print(">>> hit synthetic breakpoint at %s:%" Pd
+                " "
                 "(token %s) (address %#" Px ")\n",
                 String::Handle(cbpt->SourceUrl()).ToCString(),
-                cbpt->LineNumber(),
-                cbpt->token_pos().ToCString(),
+                cbpt->LineNumber(), cbpt->token_pos().ToCString(),
                 top_frame->pc());
     }
 
@@ -2847,13 +2802,12 @@
   }
 
   if (FLAG_verbose_debug) {
-    OS::Print(">>> hit %s breakpoint at %s:%" Pd " "
+    OS::Print(">>> hit %s breakpoint at %s:%" Pd
+              " "
               "(token %s) (address %#" Px ")\n",
               cbpt->IsInternal() ? "internal" : "user",
-              String::Handle(cbpt->SourceUrl()).ToCString(),
-              cbpt->LineNumber(),
-              cbpt->token_pos().ToCString(),
-              top_frame->pc());
+              String::Handle(cbpt->SourceUrl()).ToCString(), cbpt->LineNumber(),
+              cbpt->token_pos().ToCString(), top_frame->pc());
   }
 
   ASSERT(stack_trace_ == NULL);
@@ -2927,9 +2881,8 @@
                                             TokenPosition token_pos) {
   Zone* zone = Thread::Current()->zone();
   const Script& outer_origin = Script::Handle(zone, function.script());
-  const GrowableObjectArray& closures =
-     GrowableObjectArray::Handle(zone,
-         Isolate::Current()->object_store()->closure_functions());
+  const GrowableObjectArray& closures = GrowableObjectArray::Handle(
+      zone, Isolate::Current()->object_store()->closure_functions());
   const intptr_t num_closures = closures.Length();
   Function& closure = Function::Handle(zone);
   Function& best_fit = Function::Handle(zone);
@@ -2962,9 +2915,8 @@
   // need to be set in the newly compiled function.
   Zone* zone = Thread::Current()->zone();
   Script& script = Script::Handle(zone);
-  for (BreakpointLocation* loc = breakpoint_locations_;
-      loc != NULL;
-      loc = loc->next()) {
+  for (BreakpointLocation* loc = breakpoint_locations_; loc != NULL;
+       loc = loc->next()) {
     script = loc->script();
     if (FunctionContains(func, script, loc->token_pos())) {
       Function& inner_function = Function::Handle(zone);
@@ -3005,16 +2957,15 @@
         Breakpoint* bpt = loc->breakpoints();
         while (bpt != NULL) {
           if (FLAG_verbose_debug) {
-            OS::Print("Resolved BP %" Pd " to pos %s, "
-                      "line %" Pd " col %" Pd ", "
+            OS::Print("Resolved BP %" Pd
+                      " to pos %s, "
+                      "line %" Pd " col %" Pd
+                      ", "
                       "function '%s' (requested range %s-%s, "
                       "requested col %" Pd ")\n",
-                      bpt->id(),
-                      loc->token_pos().ToCString(),
-                      loc->LineNumber(),
-                      loc->ColumnNumber(),
-                      func.ToFullyQualifiedCString(),
-                      requested_pos.ToCString(),
+                      bpt->id(), loc->token_pos().ToCString(),
+                      loc->LineNumber(), loc->ColumnNumber(),
+                      func.ToFullyQualifiedCString(), requested_pos.ToCString(),
                       requested_end_pos.ToCString(),
                       loc->requested_column_number());
           }
@@ -3026,11 +2977,10 @@
       if (FLAG_verbose_debug) {
         Breakpoint* bpt = loc->breakpoints();
         while (bpt != NULL) {
-          OS::Print("Setting breakpoint %" Pd " at line %" Pd " col %" Pd ""
+          OS::Print("Setting breakpoint %" Pd " at line %" Pd " col %" Pd
+                    ""
                     " for %s '%s'\n",
-                    bpt->id(),
-                    loc->LineNumber(),
-                    loc->ColumnNumber(),
+                    bpt->id(), loc->LineNumber(), loc->ColumnNumber(),
                     func.IsClosureFunction() ? "closure" : "function",
                     String::Handle(func.name()).ToCString());
           bpt = bpt->next();
@@ -3085,11 +3035,10 @@
           Breakpoint* bpt = matched_loc->breakpoints();
           while (bpt != NULL) {
             if (FLAG_verbose_debug) {
-              OS::Print("No code found at line %" Pd ": "
+              OS::Print("No code found at line %" Pd
+                        ": "
                         "dropping latent breakpoint %" Pd " in '%s'\n",
-                        line_number,
-                        bpt->id(),
-                        url.ToCString());
+                        line_number, bpt->id(), url.ToCString());
             }
             Breakpoint* prev = bpt;
             bpt = bpt->next();
@@ -3107,8 +3056,7 @@
             // Create and register a new source breakpoint for the
             // latent breakpoint.
             BreakpointLocation* unresolved_loc =
-                new BreakpointLocation(script,
-                                       first_token_pos, last_token_pos,
+                new BreakpointLocation(script, first_token_pos, last_token_pos,
                                        line_number, column_number);
             RegisterBreakpointLocation(unresolved_loc);
 
@@ -3119,11 +3067,10 @@
             while (bpt != NULL) {
               bpt->set_bpt_location(unresolved_loc);
               if (FLAG_verbose_debug) {
-                OS::Print("Converted latent breakpoint "
-                          "%" Pd " in '%s' at line %" Pd " col %" Pd "\n",
-                          bpt->id(),
-                          url.ToCString(),
-                          line_number, column_number);
+                OS::Print(
+                    "Converted latent breakpoint "
+                    "%" Pd " in '%s' at line %" Pd " col %" Pd "\n",
+                    bpt->id(), url.ToCString(), line_number, column_number);
               }
               bpt = bpt->next();
             }
@@ -3148,10 +3095,10 @@
       if (FLAG_verbose_debug) {
         Breakpoint* bpt = loc->breakpoints();
         while (bpt != NULL) {
-          OS::Print("No match found for latent breakpoint id "
-                    "%" Pd " with url '%s'\n",
-                    bpt->id(),
-                    url.ToCString());
+          OS::Print(
+              "No match found for latent breakpoint id "
+              "%" Pd " with url '%s'\n",
+              bpt->id(), url.ToCString());
           bpt = bpt->next();
         }
       }
@@ -3289,8 +3236,7 @@
                                                     intptr_t requested_column) {
   BreakpointLocation* bpt = breakpoint_locations_;
   while (bpt != NULL) {
-    if ((bpt->script_ == script.raw()) &&
-        (bpt->token_pos_ == token_pos) &&
+    if ((bpt->script_ == script.raw()) && (bpt->token_pos_ == token_pos) &&
         (bpt->requested_column_number_ == requested_column)) {
       return bpt;
     }
@@ -3323,8 +3269,7 @@
   String& bpt_url = String::Handle();
   while (bpt != NULL) {
     bpt_url = bpt->url();
-    if (bpt_url.Equals(url) &&
-        (bpt->requested_line_number() == line) &&
+    if (bpt_url.Equals(url) && (bpt->requested_line_number() == line) &&
         (bpt->requested_column_number() == column)) {
       return bpt;
     }
diff --git a/runtime/vm/debugger.h b/runtime/vm/debugger.h
index a903043..7319c8e 100644
--- a/runtime/vm/debugger.h
+++ b/runtime/vm/debugger.h
@@ -27,12 +27,12 @@
 class Breakpoint {
  public:
   Breakpoint(intptr_t id, BreakpointLocation* bpt_location)
-    : id_(id),
-      kind_(Breakpoint::kNone),
-      next_(NULL),
-      closure_(Instance::null()),
-      bpt_location_(bpt_location),
-      is_synthetic_async_(false) {}
+      : id_(id),
+        kind_(Breakpoint::kNone),
+        next_(NULL),
+        closure_(Instance::null()),
+        bpt_location_(bpt_location),
+        is_synthetic_async_(false) {}
 
   intptr_t id() const { return id_; }
   Breakpoint* next() const { return next_; }
@@ -66,9 +66,7 @@
   void set_is_synthetic_async(bool is_synthetic_async) {
     is_synthetic_async_ = is_synthetic_async;
   }
-  bool is_synthetic_async() const {
-    return is_synthetic_async_;
-  }
+  bool is_synthetic_async() const { return is_synthetic_async_; }
 
   void PrintJSON(JSONStream* stream);
 
@@ -247,8 +245,12 @@
 // on the call stack.
 class ActivationFrame : public ZoneAllocated {
  public:
-  ActivationFrame(uword pc, uword fp, uword sp, const Code& code,
-                  const Array& deopt_frame, intptr_t deopt_frame_offset);
+  ActivationFrame(uword pc,
+                  uword fp,
+                  uword sp,
+                  const Code& code,
+                  const Array& deopt_frame,
+                  intptr_t deopt_frame_offset);
 
   uword pc() const { return pc_; }
   uword fp() const { return fp_; }
@@ -352,14 +354,11 @@
 // Array of function activations on the call stack.
 class DebuggerStackTrace : public ZoneAllocated {
  public:
-  explicit DebuggerStackTrace(int capacity)
-      : trace_(capacity) { }
+  explicit DebuggerStackTrace(int capacity) : trace_(capacity) {}
 
   intptr_t Length() const { return trace_.length(); }
 
-  ActivationFrame* FrameAt(int i) const {
-    return trace_[i];
-  }
+  ActivationFrame* FrameAt(int i) const { return trace_[i]; }
 
   ActivationFrame* GetHandlerFrame(const Instance& exc_obj) const;
 
@@ -484,8 +483,7 @@
   RawObject* GetInstanceField(const Class& cls,
                               const String& field_name,
                               const Instance& object);
-  RawObject* GetStaticField(const Class& cls,
-                            const String& field_name);
+  RawObject* GetStaticField(const Class& cls, const String& field_name);
 
   // Pause execution for a breakpoint.  Called from generated code.
   RawError* PauseBreakpoint();
@@ -516,12 +514,7 @@
   intptr_t limitBreakpointId() { return next_id_; }
 
  private:
-  enum ResumeAction {
-    kContinue,
-    kStepOver,
-    kStepOut,
-    kSingleStep
-  };
+  enum ResumeAction { kContinue, kStepOver, kStepOut, kSingleStep };
 
   RawError* PauseRequest(ServiceEvent::EventKind kind);
 
@@ -540,9 +533,9 @@
   RawFunction* FindInnermostClosure(const Function& function,
                                     TokenPosition token_pos);
   TokenPosition ResolveBreakpointPos(const Function& func,
-                                       TokenPosition requested_token_pos,
-                                       TokenPosition last_token_pos,
-                                       intptr_t requested_column);
+                                     TokenPosition requested_token_pos,
+                                     TokenPosition last_token_pos,
+                                     intptr_t requested_column);
   void DeoptimizeWorld();
   BreakpointLocation* SetBreakpoint(const Script& script,
                                     TokenPosition token_pos,
@@ -559,8 +552,7 @@
   BreakpointLocation* GetBreakpointLocation(const Script& script,
                                             TokenPosition token_pos,
                                             intptr_t requested_column);
-  void MakeCodeBreakpointAt(const Function& func,
-                            BreakpointLocation* bpt);
+  void MakeCodeBreakpointAt(const Function& func, BreakpointLocation* bpt);
   // Returns NULL if no breakpoint exists for the given address.
   CodeBreakpoint* GetCodeBreakpoint(uword breakpoint_address);
 
@@ -577,8 +569,7 @@
                                      StackFrame* frame,
                                      const Code& code);
   static DebuggerStackTrace* CollectStackTrace();
-  void SignalPausedEvent(ActivationFrame* top_frame,
-                         Breakpoint* bpt);
+  void SignalPausedEvent(ActivationFrame* top_frame, Breakpoint* bpt);
 
   intptr_t nextId() { return next_id_++; }
 
diff --git a/runtime/vm/debugger_api_impl.cc b/runtime/vm/debugger_api_impl.cc
index 18fb194..f0c5532 100644
--- a/runtime/vm/debugger_api_impl.cc
+++ b/runtime/vm/debugger_api_impl.cc
@@ -76,16 +76,15 @@
   Isolate* I = T->isolate();
   CHECK_DEBUGGER(I);
   if (!I->debugger()->IsValidObjectId(obj_id)) {
-    return Api::NewError("%s: object id %" Pd " is invalid",
-                         CURRENT_FUNC, obj_id);
+    return Api::NewError("%s: object id %" Pd " is invalid", CURRENT_FUNC,
+                         obj_id);
   }
   return Api::NewHandle(T, I->debugger()->GetCachedObject(obj_id));
 }
 
 
-DART_EXPORT Dart_Handle Dart_StackTraceLength(
-                            Dart_StackTrace trace,
-                            intptr_t* length) {
+DART_EXPORT Dart_Handle Dart_StackTraceLength(Dart_StackTrace trace,
+                                              intptr_t* length) {
   DARTSCOPE(Thread::Current());
   CHECK_NOT_NULL(length);
   CHECK_AND_CAST(DebuggerStackTrace, stack_trace, trace);
@@ -94,10 +93,9 @@
 }
 
 
-DART_EXPORT Dart_Handle Dart_GetActivationFrame(
-                            Dart_StackTrace trace,
-                            int frame_index,
-                            Dart_ActivationFrame* frame) {
+DART_EXPORT Dart_Handle Dart_GetActivationFrame(Dart_StackTrace trace,
+                                                int frame_index,
+                                                Dart_ActivationFrame* frame) {
   DARTSCOPE(Thread::Current());
   CHECK_NOT_NULL(frame);
   CHECK_AND_CAST(DebuggerStackTrace, stack_trace, trace);
@@ -105,8 +103,8 @@
     return Api::NewError("argument 'frame_index' is out of range for %s",
                          CURRENT_FUNC);
   }
-  *frame = reinterpret_cast<Dart_ActivationFrame>(
-       stack_trace->FrameAt(frame_index));
+  *frame =
+      reinterpret_cast<Dart_ActivationFrame>(stack_trace->FrameAt(frame_index));
   return Api::Success();
 }
 
@@ -141,8 +139,7 @@
              event->kind() == ServiceEvent::kBreakpointResolved) {
     Breakpoint* bpt = event->breakpoint();
     ASSERT(bpt != NULL);
-    if (bp_resolved_handler != NULL &&
-        bpt->bpt_location()->IsResolved() &&
+    if (bp_resolved_handler != NULL && bpt->bpt_location()->IsResolved() &&
         !bpt->IsSingleShot()) {
       Dart_CodeLocation location;
       Zone* zone = thread->zone();
@@ -159,10 +156,9 @@
     // Ignore.
   } else if (event->kind() == ServiceEvent::kPauseException) {
     if (exc_thrown_handler != NULL) {
-      Dart_Handle exception =
-          Api::NewHandle(thread, event->exception()->raw());
+      Dart_Handle exception = Api::NewHandle(thread, event->exception()->raw());
       Dart_StackTrace trace =
-      reinterpret_cast<Dart_StackTrace>(isolate->debugger()->StackTrace());
+          reinterpret_cast<Dart_StackTrace>(isolate->debugger()->StackTrace());
       (*exc_thrown_handler)(isolate_id, exception, trace);
     }
   } else if (event->kind() == ServiceEvent::kIsolateStart) {
@@ -191,14 +187,14 @@
 
 
 DART_EXPORT void Dart_SetBreakpointResolvedHandler(
-                            Dart_BreakpointResolvedHandler handler) {
+    Dart_BreakpointResolvedHandler handler) {
   bp_resolved_handler = handler;
   Debugger::SetEventHandler(DebuggerEventHandler);
 }
 
 
 DART_EXPORT void Dart_SetExceptionThrownHandler(
-                            Dart_ExceptionThrownHandler handler) {
+    Dart_ExceptionThrownHandler handler) {
   exc_thrown_handler = handler;
   Debugger::SetEventHandler(DebuggerEventHandler);
 }
@@ -210,8 +206,8 @@
 }
 
 
-DART_EXPORT Dart_Handle Dart_SetExceptionPauseInfo(
-                            Dart_ExceptionPauseInfo pause_info) {
+DART_EXPORT Dart_Handle
+Dart_SetExceptionPauseInfo(Dart_ExceptionPauseInfo pause_info) {
   DARTSCOPE(Thread::Current());
   Isolate* I = T->isolate();
   CHECK_DEBUGGER(I);
@@ -235,8 +231,8 @@
   Isolate* I = T->isolate();
   CHECK_DEBUGGER(I);
   CHECK_NOT_NULL(trace);
-  *trace = reinterpret_cast<Dart_StackTrace>(
-      I->debugger()->CurrentStackTrace());
+  *trace =
+      reinterpret_cast<Dart_StackTrace>(I->debugger()->CurrentStackTrace());
   return Api::Success();
 }
 
@@ -256,22 +252,23 @@
     } else {
       Isolate* I = T->isolate();
       *trace = reinterpret_cast<Dart_StackTrace>(
-        I->debugger()->StackTraceFrom(dart_stacktrace));
+          I->debugger()->StackTraceFrom(dart_stacktrace));
     }
     return Api::Success();
   } else {
-    return Api::NewError("Can only get stacktraces from error handles or "
-                         "instances of Error.");
+    return Api::NewError(
+        "Can only get stacktraces from error handles or "
+        "instances of Error.");
   }
 }
 
 
-DART_EXPORT Dart_Handle Dart_ActivationFrameInfo(
-                            Dart_ActivationFrame activation_frame,
-                            Dart_Handle* function_name,
-                            Dart_Handle* script_url,
-                            intptr_t* line_number,
-                            intptr_t* column_number) {
+DART_EXPORT Dart_Handle
+Dart_ActivationFrameInfo(Dart_ActivationFrame activation_frame,
+                         Dart_Handle* function_name,
+                         Dart_Handle* script_url,
+                         intptr_t* line_number,
+                         intptr_t* column_number) {
   DARTSCOPE(Thread::Current());
   CHECK_AND_CAST(ActivationFrame, frame, activation_frame);
   if (function_name != NULL) {
@@ -290,11 +287,11 @@
 }
 
 
-DART_EXPORT Dart_Handle Dart_ActivationFrameGetLocation(
-                            Dart_ActivationFrame activation_frame,
-                            Dart_Handle* function_name,
-                            Dart_Handle* function,
-                            Dart_CodeLocation* location) {
+DART_EXPORT Dart_Handle
+Dart_ActivationFrameGetLocation(Dart_ActivationFrame activation_frame,
+                                Dart_Handle* function_name,
+                                Dart_Handle* function,
+                                Dart_CodeLocation* location) {
   // TODO(hausner): Implement a way to recognize when there
   // is no source code for the code in the frame.
   DARTSCOPE(Thread::Current());
@@ -315,9 +312,9 @@
   return Api::Success();
 }
 
-DART_EXPORT Dart_Handle Dart_ActivationFrameGetFramePointer(
-                            Dart_ActivationFrame activation_frame,
-                            uintptr_t* frame_pointer) {
+DART_EXPORT Dart_Handle
+Dart_ActivationFrameGetFramePointer(Dart_ActivationFrame activation_frame,
+                                    uintptr_t* frame_pointer) {
   DARTSCOPE(Thread::Current());
   CHECK_AND_CAST(ActivationFrame, frame, activation_frame);
 
@@ -340,25 +337,23 @@
 }
 
 
-DART_EXPORT Dart_Handle Dart_GetLocalVariables(
-                            Dart_ActivationFrame activation_frame) {
+DART_EXPORT Dart_Handle
+Dart_GetLocalVariables(Dart_ActivationFrame activation_frame) {
   DARTSCOPE(Thread::Current());
   CHECK_AND_CAST(ActivationFrame, frame, activation_frame);
   return Api::NewHandle(T, frame->GetLocalVariables());
 }
 
 
-DART_EXPORT Dart_Handle Dart_SetBreakpoint(
-                            Dart_Handle script_url_in,
-                            intptr_t line_number) {
+DART_EXPORT Dart_Handle Dart_SetBreakpoint(Dart_Handle script_url_in,
+                                           intptr_t line_number) {
   DARTSCOPE(Thread::Current());
   Isolate* I = T->isolate();
   CHECK_DEBUGGER(I);
   UNWRAP_AND_CHECK_PARAM(String, script_url, script_url_in);
 
   Debugger* debugger = I->debugger();
-  Breakpoint* bpt =
-      debugger->SetBreakpointAtLine(script_url, line_number);
+  Breakpoint* bpt = debugger->SetBreakpointAtLine(script_url, line_number);
   if (bpt == NULL) {
     return Api::NewError("%s: could not set breakpoint at line %" Pd " in '%s'",
                          CURRENT_FUNC, line_number, script_url.ToCString());
@@ -376,7 +371,7 @@
   Breakpoint* bpt = debugger->GetBreakpointById(bp_id);
   if (bpt == NULL) {
     return Api::NewError("%s: breakpoint with id %" Pd " does not exist",
-                           CURRENT_FUNC, bp_id);
+                         CURRENT_FUNC, bp_id);
   }
   return Api::NewHandle(T, bpt->bpt_location()->url());
 }
@@ -401,10 +396,10 @@
 }
 
 
-DART_EXPORT Dart_Handle Dart_SetBreakpointAtEntry(
-                            Dart_Handle library_in,
-                            Dart_Handle class_name_in,
-                            Dart_Handle function_name_in) {
+DART_EXPORT Dart_Handle
+Dart_SetBreakpointAtEntry(Dart_Handle library_in,
+                          Dart_Handle class_name_in,
+                          Dart_Handle function_name_in) {
   DARTSCOPE(Thread::Current());
   Isolate* I = T->isolate();
   CHECK_DEBUGGER(I);
@@ -415,8 +410,7 @@
   // Ensure that the library is loaded.
   if (!library.Loaded()) {
     return Api::NewError(
-        "%s expects library argument 'library_in' to be loaded.",
-        CURRENT_FUNC);
+        "%s expects library argument 'library_in' to be loaded.", CURRENT_FUNC);
   }
 
   // Resolve the breakpoint target function.
@@ -425,11 +419,9 @@
       debugger->ResolveFunction(library, class_name, function_name));
   if (bp_target.IsNull()) {
     const bool toplevel = class_name.Length() == 0;
-    return Api::NewError("%s: could not find function '%s%s%s'",
-                         CURRENT_FUNC,
+    return Api::NewError("%s: could not find function '%s%s%s'", CURRENT_FUNC,
                          toplevel ? "" : class_name.ToCString(),
-                         toplevel ? "" : ".",
-                         function_name.ToCString());
+                         toplevel ? "" : ".", function_name.ToCString());
   }
 
   Breakpoint* bpt = debugger->SetBreakpointAtEntry(bp_target, false);
@@ -442,10 +434,9 @@
 }
 
 
-DART_EXPORT Dart_Handle Dart_OneTimeBreakAtEntry(
-                            Dart_Handle library_in,
-                            Dart_Handle class_name_in,
-                            Dart_Handle function_name_in) {
+DART_EXPORT Dart_Handle Dart_OneTimeBreakAtEntry(Dart_Handle library_in,
+                                                 Dart_Handle class_name_in,
+                                                 Dart_Handle function_name_in) {
   DARTSCOPE(Thread::Current());
   Isolate* I = T->isolate();
   CHECK_DEBUGGER(I);
@@ -456,8 +447,7 @@
   // Ensure that the library is loaded.
   if (!library.Loaded()) {
     return Api::NewError(
-        "%s expects library argument 'library_in' to be loaded.",
-        CURRENT_FUNC);
+        "%s expects library argument 'library_in' to be loaded.", CURRENT_FUNC);
   }
 
   // Resolve the breakpoint target function.
@@ -466,15 +456,13 @@
       debugger->ResolveFunction(library, class_name, function_name));
   if (bp_target.IsNull()) {
     const bool toplevel = class_name.Length() == 0;
-    return Api::NewError("%s: could not find function '%s%s%s'",
-                         CURRENT_FUNC,
+    return Api::NewError("%s: could not find function '%s%s%s'", CURRENT_FUNC,
                          toplevel ? "" : class_name.ToCString(),
-                         toplevel ? "" : ".",
-                         function_name.ToCString());
+                         toplevel ? "" : ".", function_name.ToCString());
   }
 
-  const Error& error = Error::Handle(Z,
-      debugger->OneTimeBreakAtEntry(bp_target));
+  const Error& error =
+      Error::Handle(Z, debugger->OneTimeBreakAtEntry(bp_target));
   if (!error.IsNull()) {
     return Api::NewHandle(T, error.raw());
   }
@@ -545,11 +533,10 @@
   DARTSCOPE(Thread::Current());
   Isolate* I = T->isolate();
   CHECK_DEBUGGER(I);
-  const Library& lib =
-      Library::Handle(Z, Library::GetLibrary(library_id));
+  const Library& lib = Library::Handle(Z, Library::GetLibrary(library_id));
   if (lib.IsNull()) {
-    return Api::NewError("%s: %" Pd " is not a valid library id",
-                         CURRENT_FUNC, library_id);
+    return Api::NewError("%s: %" Pd " is not a valid library id", CURRENT_FUNC,
+                         library_id);
   }
   return Api::NewHandle(T, I->debugger()->GetLibraryFields(lib));
 }
@@ -562,16 +549,16 @@
 
   const Library& lib = Library::Handle(Z, Library::GetLibrary(library_id));
   if (lib.IsNull()) {
-    return Api::NewError("%s: %" Pd " is not a valid library id",
-                         CURRENT_FUNC, library_id);
+    return Api::NewError("%s: %" Pd " is not a valid library id", CURRENT_FUNC,
+                         library_id);
   }
   return Api::NewHandle(T, I->debugger()->GetGlobalFields(lib));
 }
 
 
-DART_EXPORT Dart_Handle Dart_ActivationFrameEvaluate(
-                            Dart_ActivationFrame activation_frame,
-                            Dart_Handle expr_in) {
+DART_EXPORT Dart_Handle
+Dart_ActivationFrameEvaluate(Dart_ActivationFrame activation_frame,
+                             Dart_Handle expr_in) {
   DARTSCOPE(Thread::Current());
   CHECK_DEBUGGER(T->isolate());
   CHECK_AND_CAST(ActivationFrame, frame, activation_frame);
@@ -595,26 +582,22 @@
   // Type extends Instance, must check first.
   if (target.IsType()) {
     const Class& cls = Class::Handle(Z, Type::Cast(target).type_class());
-    return Api::NewHandle(T, cls.Evaluate(expr,
-                                          Array::empty_array(),
-                                          Array::empty_array()));
+    return Api::NewHandle(
+        T, cls.Evaluate(expr, Array::empty_array(), Array::empty_array()));
   } else if (target.IsInstance()) {
     const Instance& inst = Instance::Cast(target);
     const Class& receiver_cls = Class::Handle(Z, inst.clazz());
-    return Api::NewHandle(T, inst.Evaluate(receiver_cls,
-                                           expr,
-                                           Array::empty_array(),
-                                           Array::empty_array()));
+    return Api::NewHandle(
+        T, inst.Evaluate(receiver_cls, expr, Array::empty_array(),
+                         Array::empty_array()));
   } else if (target.IsLibrary()) {
     const Library& lib = Library::Cast(target);
-    return Api::NewHandle(T, lib.Evaluate(expr,
-                                          Array::empty_array(),
-                                          Array::empty_array()));
+    return Api::NewHandle(
+        T, lib.Evaluate(expr, Array::empty_array(), Array::empty_array()));
   } else if (target.IsClass()) {
     const Class& cls = Class::Cast(target);
-    return Api::NewHandle(T, cls.Evaluate(expr,
-                                          Array::empty_array(),
-                                          Array::empty_array()));
+    return Api::NewHandle(
+        T, cls.Evaluate(expr, Array::empty_array(), Array::empty_array()));
   }
   return Api::NewError("%s: unsupported target type", CURRENT_FUNC);
 }
@@ -641,8 +624,8 @@
   DARTSCOPE(Thread::Current());
   Isolate* I = T->isolate();
   if (!I->class_table()->IsValidIndex(class_id)) {
-    return Api::NewError("%s: %" Pd " is not a valid class id",
-                         CURRENT_FUNC, class_id);
+    return Api::NewError("%s: %" Pd " is not a valid class id", CURRENT_FUNC,
+                         class_id);
   }
   return Api::NewHandle(T, I->class_table()->At(class_id));
 }
@@ -694,11 +677,10 @@
 }
 
 
-DART_EXPORT Dart_Handle Dart_GetClosureInfo(
-                            Dart_Handle closure,
-                            Dart_Handle* name,
-                            Dart_Handle* signature,
-                            Dart_CodeLocation* location) {
+DART_EXPORT Dart_Handle Dart_GetClosureInfo(Dart_Handle closure,
+                                            Dart_Handle* name,
+                                            Dart_Handle* signature,
+                                            Dart_CodeLocation* location) {
   DARTSCOPE(Thread::Current());
   UNWRAP_AND_CHECK_PARAM(Instance, instance, closure);
   CHECK_NOT_NULL(location);
@@ -737,18 +719,17 @@
 }
 
 
-DART_EXPORT Dart_Handle Dart_GetClassInfo(
-                            intptr_t cls_id,
-                            Dart_Handle* class_name,
-                            intptr_t* library_id,
-                            intptr_t* super_class_id,
-                            Dart_Handle* static_fields) {
+DART_EXPORT Dart_Handle Dart_GetClassInfo(intptr_t cls_id,
+                                          Dart_Handle* class_name,
+                                          intptr_t* library_id,
+                                          intptr_t* super_class_id,
+                                          Dart_Handle* static_fields) {
   DARTSCOPE(Thread::Current());
   Isolate* I = T->isolate();
   CHECK_DEBUGGER(I);
   if (!I->class_table()->IsValidIndex(cls_id)) {
-    return Api::NewError("%s: %" Pd " is not a valid class id",
-                         CURRENT_FUNC, cls_id);
+    return Api::NewError("%s: %" Pd " is not a valid class id", CURRENT_FUNC,
+                         cls_id);
   }
   Class& cls = Class::Handle(Z, I->class_table()->At(cls_id));
   if (class_name != NULL) {
@@ -766,21 +747,19 @@
     }
   }
   if (static_fields != NULL) {
-    *static_fields =
-        Api::NewHandle(T, I->debugger()->GetStaticFields(cls));
+    *static_fields = Api::NewHandle(T, I->debugger()->GetStaticFields(cls));
   }
   return Api::Success();
 }
 
 
-DART_EXPORT Dart_Handle Dart_ScriptGetSource(
-                            intptr_t library_id,
-                            Dart_Handle script_url_in) {
+DART_EXPORT Dart_Handle Dart_ScriptGetSource(intptr_t library_id,
+                                             Dart_Handle script_url_in) {
   DARTSCOPE(Thread::Current());
   const Library& lib = Library::Handle(Library::GetLibrary(library_id));
   if (lib.IsNull()) {
-    return Api::NewError("%s: %" Pd " is not a valid library id",
-                         CURRENT_FUNC, library_id);
+    return Api::NewError("%s: %" Pd " is not a valid library id", CURRENT_FUNC,
+                         library_id);
   }
   UNWRAP_AND_CHECK_PARAM(String, script_url, script_url_in);
   const Script& script = Script::Handle(lib.LookupScript(script_url));
@@ -793,14 +772,13 @@
 }
 
 
-DART_EXPORT Dart_Handle Dart_ScriptGetTokenInfo(
-                            intptr_t library_id,
-                            Dart_Handle script_url_in) {
+DART_EXPORT Dart_Handle Dart_ScriptGetTokenInfo(intptr_t library_id,
+                                                Dart_Handle script_url_in) {
   DARTSCOPE(Thread::Current());
   const Library& lib = Library::Handle(Library::GetLibrary(library_id));
   if (lib.IsNull()) {
-    return Api::NewError("%s: %" Pd " is not a valid library id",
-                         CURRENT_FUNC, library_id);
+    return Api::NewError("%s: %" Pd " is not a valid library id", CURRENT_FUNC,
+                         library_id);
   }
   UNWRAP_AND_CHECK_PARAM(String, script_url, script_url_in);
   const Script& script = Script::Handle(lib.LookupScript(script_url));
@@ -822,11 +800,11 @@
   UNWRAP_AND_CHECK_PARAM(String, library_url, library_url_in);
   UNWRAP_AND_CHECK_PARAM(String, script_url, script_url_in);
 
-  const Library& library = Library::Handle(Z,
-      Library::LookupLibrary(T, library_url));
+  const Library& library =
+      Library::Handle(Z, Library::LookupLibrary(T, library_url));
   if (library.IsNull()) {
-    return Api::NewError("%s: library '%s' not found",
-                         CURRENT_FUNC, library_url.ToCString());
+    return Api::NewError("%s: library '%s' not found", CURRENT_FUNC,
+                         library_url.ToCString());
   }
 
   const Script& script = Script::Handle(Z, library.LookupScript(script_url));
@@ -844,11 +822,11 @@
   DARTSCOPE(Thread::Current());
   UNWRAP_AND_CHECK_PARAM(String, library_url, library_url_in);
 
-  const Library& library = Library::Handle(Z,
-      Library::LookupLibrary(T, library_url));
+  const Library& library =
+      Library::Handle(Z, Library::LookupLibrary(T, library_url));
   if (library.IsNull()) {
-    return Api::NewError("%s: library '%s' not found",
-                         CURRENT_FUNC, library_url.ToCString());
+    return Api::NewError("%s: library '%s' not found", CURRENT_FUNC,
+                         library_url.ToCString());
   }
   const Array& loaded_scripts = Array::Handle(Z, library.LoadedScripts());
   ASSERT(!loaded_scripts.IsNull());
@@ -874,7 +852,7 @@
   int num_libs = libs.Length();
 
   // Create new list and populate with the url of loaded libraries.
-  Library &lib = Library::Handle();
+  Library& lib = Library::Handle();
   const Array& library_id_list = Array::Handle(Z, Array::New(num_libs));
   for (int i = 0; i < num_libs; i++) {
     lib ^= libs.At(i);
@@ -890,8 +868,8 @@
   DARTSCOPE(Thread::Current());
   const Library& lib = Library::Handle(Z, Library::GetLibrary(library_id));
   if (lib.IsNull()) {
-    return Api::NewError("%s: %" Pd " is not a valid library id",
-                         CURRENT_FUNC, library_id);
+    return Api::NewError("%s: %" Pd " is not a valid library id", CURRENT_FUNC,
+                         library_id);
   }
   return Api::NewHandle(T, lib.raw());
 }
@@ -916,8 +894,8 @@
   DARTSCOPE(Thread::Current());
   const Library& lib = Library::Handle(Library::GetLibrary(library_id));
   if (lib.IsNull()) {
-    return Api::NewError("%s: %" Pd " is not a valid library id",
-                         CURRENT_FUNC, library_id);
+    return Api::NewError("%s: %" Pd " is not a valid library id", CURRENT_FUNC,
+                         library_id);
   }
   const GrowableObjectArray& import_list =
       GrowableObjectArray::Handle(GrowableObjectArray::New(8));
@@ -953,8 +931,8 @@
   DARTSCOPE(Thread::Current());
   const Library& lib = Library::Handle(Z, Library::GetLibrary(library_id));
   if (lib.IsNull()) {
-    return Api::NewError("%s: %" Pd " is not a valid library id",
-                         CURRENT_FUNC, library_id);
+    return Api::NewError("%s: %" Pd " is not a valid library id", CURRENT_FUNC,
+                         library_id);
   }
   return Api::NewHandle(T, lib.url());
 }
@@ -966,8 +944,8 @@
   CHECK_NOT_NULL(is_debuggable);
   const Library& lib = Library::Handle(Library::GetLibrary(library_id));
   if (lib.IsNull()) {
-    return Api::NewError("%s: %" Pd " is not a valid library id",
-                         CURRENT_FUNC, library_id);
+    return Api::NewError("%s: %" Pd " is not a valid library id", CURRENT_FUNC,
+                         library_id);
   }
   *is_debuggable = lib.IsDebuggable();
   return Api::Success();
@@ -979,8 +957,8 @@
   DARTSCOPE(Thread::Current());
   const Library& lib = Library::Handle(Z, Library::GetLibrary(library_id));
   if (lib.IsNull()) {
-    return Api::NewError("%s: %" Pd " is not a valid library id",
-                         CURRENT_FUNC, library_id);
+    return Api::NewError("%s: %" Pd " is not a valid library id", CURRENT_FUNC,
+                         library_id);
   }
   lib.set_debuggable(is_debuggable);
   return Api::Success();
diff --git a/runtime/vm/debugger_api_impl_test.cc b/runtime/vm/debugger_api_impl_test.cc
index a41d10b..0e7a1d7 100644
--- a/runtime/vm/debugger_api_impl_test.cc
+++ b/runtime/vm/debugger_api_impl_test.cc
@@ -16,7 +16,7 @@
 #ifndef PRODUCT
 
 static bool breakpoint_hit = false;
-static int  breakpoint_hit_counter = 0;
+static int breakpoint_hit_counter = 0;
 static Dart_Handle script_lib = NULL;
 
 static const bool verbose = true;
@@ -31,9 +31,8 @@
   ASSERT(script_lib != NULL);
   ASSERT(!Dart_IsError(script_lib));
   ASSERT(Dart_IsLibrary(script_lib));
-  Dart_Handle res = Dart_SetBreakpointAtEntry(script_lib,
-                        NewString(cname),
-                        NewString(fname));
+  Dart_Handle res =
+      Dart_SetBreakpointAtEntry(script_lib, NewString(cname), NewString(fname));
   EXPECT(Dart_IsInteger(res));
 }
 
@@ -104,8 +103,8 @@
   Dart_Handle url;
   intptr_t line_number = 0;
   intptr_t library_id = 0;
-  res = Dart_ActivationFrameInfo(
-            frame, &func_name, &url, &line_number, &library_id);
+  res = Dart_ActivationFrameInfo(frame, &func_name, &url, &line_number,
+                                 &library_id);
   EXPECT_TRUE(res);
   OS::SNPrint(info_str, sizeof(info_str), "function %s (%s:%" Pd ")",
               ToCString(func_name), ToCString(url), line_number);
@@ -389,10 +388,9 @@
 
   for (intptr_t frame_index = 0; frame_index < trace_len; frame_index++) {
     EXPECT_VALID(Dart_GetActivationFrame(trace, frame_index, &frame));
-    EXPECT_VALID(Dart_ActivationFrameInfo(frame, &func_name,
-                                          NULL, NULL, NULL));
-    int pos = OS::SNPrint(buffer, buffer_size, "[%" Pd "] %s { ",
-                          frame_index, ToCString(func_name));
+    EXPECT_VALID(Dart_ActivationFrameInfo(frame, &func_name, NULL, NULL, NULL));
+    int pos = OS::SNPrint(buffer, buffer_size, "[%" Pd "] %s { ", frame_index,
+                          ToCString(func_name));
     buffer += pos;
     buffer_size -= pos;
 
@@ -415,8 +413,7 @@
       const char* value_cstr = NULL;
       EXPECT_VALID(Dart_StringToCString(name, &name_cstr));
       EXPECT_VALID(Dart_StringToCString(value_str, &value_cstr));
-      pos = OS::SNPrint(buffer, buffer_size, "%s = %s ",
-                        name_cstr, value_cstr);
+      pos = OS::SNPrint(buffer, buffer_size, "%s = %s ", name_cstr, value_cstr);
       buffer += pos;
       buffer_size -= pos;
     }
@@ -493,22 +490,24 @@
   dart_args[1] = Dart_NewInteger(kLowThreshold);
   EXPECT_VALID(Dart_Invoke(script_lib, NewString("test"), 2, dart_args));
   if (optimize) {
-    EXPECT_STREQ("[0] breakpointNow { }\n"
-                 "[1] helper { a = 5 b = 99 stop = <optimized out> }\n"
-                 "[2] anotherMiddleMan { one = <optimized out> "
-                 "two = <optimized out> stop = <optimized out> }\n"
-                 "[3] middleMan { x = 5 limit = 100 stop = true value = 24255"
-                 " i = 99 }\n"
-                 "[4] test { stop = true limit = 100 }\n",
-                 stack_buffer);
+    EXPECT_STREQ(
+        "[0] breakpointNow { }\n"
+        "[1] helper { a = 5 b = 99 stop = <optimized out> }\n"
+        "[2] anotherMiddleMan { one = <optimized out> "
+        "two = <optimized out> stop = <optimized out> }\n"
+        "[3] middleMan { x = 5 limit = 100 stop = true value = 24255"
+        " i = 99 }\n"
+        "[4] test { stop = true limit = 100 }\n",
+        stack_buffer);
   } else {
-    EXPECT_STREQ("[0] breakpointNow { }\n"
-                 "[1] helper { a = 5 b = 99 stop = true }\n"
-                 "[2] anotherMiddleMan { one = 5 two = 99 stop = true }\n"
-                 "[3] middleMan { x = 5 limit = 100 stop = true value = 24255"
-                 " i = 99 }\n"
-                 "[4] test { stop = true limit = 100 }\n",
-                 stack_buffer);
+    EXPECT_STREQ(
+        "[0] breakpointNow { }\n"
+        "[1] helper { a = 5 b = 99 stop = true }\n"
+        "[2] anotherMiddleMan { one = 5 two = 99 stop = true }\n"
+        "[3] middleMan { x = 5 limit = 100 stop = true value = 24255"
+        " i = 99 }\n"
+        "[4] test { stop = true limit = 100 }\n",
+        stack_buffer);
   }
 
   FLAG_optimization_counter_threshold = saved_threshold;
@@ -587,26 +586,28 @@
   dart_args[1] = Dart_NewInteger(kLowThreshold);
   EXPECT_VALID(Dart_Invoke(script_lib, NewString("test"), 2, dart_args));
   if (optimize) {
-    EXPECT_STREQ("[0] breakpointNow { }\n"
-                 "[1] helper { a = 50 b = 99 stop = <optimized out> }\n"
-                 "[2] <anonymous closure> { x = 5 i = 99 stop = true"
-                 " value = <optimized out> }\n"
-                 "[3] anotherMiddleMan { func = <optimized out> }\n"
-                 "[4] middleMan { x = 5 limit = 100 stop = true"
-                 " value = 242550 i = 99 }\n"
-                 "[5] test { stop = true limit = 100 }\n",
-                 stack_buffer);
+    EXPECT_STREQ(
+        "[0] breakpointNow { }\n"
+        "[1] helper { a = 50 b = 99 stop = <optimized out> }\n"
+        "[2] <anonymous closure> { x = 5 i = 99 stop = true"
+        " value = <optimized out> }\n"
+        "[3] anotherMiddleMan { func = <optimized out> }\n"
+        "[4] middleMan { x = 5 limit = 100 stop = true"
+        " value = 242550 i = 99 }\n"
+        "[5] test { stop = true limit = 100 }\n",
+        stack_buffer);
   } else {
-    EXPECT_STREQ("[0] breakpointNow { }\n"
-                 "[1] helper { a = 50 b = 99 stop = true }\n"
-                 "[2] <anonymous closure> { x = 5 i = 99 stop = true"
-                 " value = 10 }\n"
-                 "[3] anotherMiddleMan {"
-                 " func = Closure: (dynamic) => dynamic }\n"
-                 "[4] middleMan { x = 5 limit = 100 stop = true"
-                 " value = 242550 i = 99 }\n"
-                 "[5] test { stop = true limit = 100 }\n",
-                 stack_buffer);
+    EXPECT_STREQ(
+        "[0] breakpointNow { }\n"
+        "[1] helper { a = 50 b = 99 stop = true }\n"
+        "[2] <anonymous closure> { x = 5 i = 99 stop = true"
+        " value = 10 }\n"
+        "[3] anotherMiddleMan {"
+        " func = Closure: (dynamic) => dynamic }\n"
+        "[4] middleMan { x = 5 limit = 100 stop = true"
+        " value = 242550 i = 99 }\n"
+        "[5] test { stop = true limit = 100 }\n",
+        stack_buffer);
   }
 
   FLAG_optimization_counter_threshold = saved_threshold;
@@ -691,22 +692,22 @@
 }
 
 static const char* step_into_expected_bpts[] = {
-    "main",        // entry
-    "main",        // call foo
-      "foo",       // entry
-      "foo",       // call f1
-        "f1",      // entry
-        "f1",      // return
-      "foo",       // call initializer
-      "foo",       // call kvmk
-        "X.kvmk",  // entry
-        "X.kvmk",  // call
-          "f2",    // entry
-          "f2",    // return
-        "X.kvmk",  // call +
-        "X.kvmk",  // return
-      "foo",       // return
-    "main"         // return
+    "main",    // entry
+    "main",    // call foo
+    "foo",     // entry
+    "foo",     // call f1
+    "f1",      // entry
+    "f1",      // return
+    "foo",     // call initializer
+    "foo",     // call kvmk
+    "X.kvmk",  // entry
+    "X.kvmk",  // call
+    "f2",      // entry
+    "f2",      // return
+    "X.kvmk",  // call +
+    "X.kvmk",  // return
+    "foo",     // return
+    "main"     // return
 };
 
 void TestStepIntoHandler(Dart_IsolateId isolate_id,
@@ -785,8 +786,8 @@
   Dart_StackTrace trace;
   Dart_GetStackTrace(&trace);
   if (verbose) {
-    OS::Print(">>> Breakpoint nr. %d in %s <<<\n",
-              breakpoint_hit_counter, BreakpointInfo(trace));
+    OS::Print(">>> Breakpoint nr. %d in %s <<<\n", breakpoint_hit_counter,
+              BreakpointInfo(trace));
     PrintStackTrace(trace);
   }
   breakpoint_hit = true;
@@ -867,8 +868,8 @@
                            const Dart_CodeLocation& location) {
   Dart_StackTrace trace;
   Dart_GetStackTrace(&trace);
-  const char* expected_bpts[] = {
-      "moo", "moo", "foo", "moo", "moo", "foo", "moo", "moo", "foo", "main"};
+  const char* expected_bpts[] = {"moo", "moo", "foo", "moo", "moo",
+                                 "foo", "moo", "moo", "foo", "main"};
   const intptr_t expected_bpts_length = ARRAY_SIZE(expected_bpts);
   intptr_t trace_len;
   Dart_Handle res = Dart_StackTraceLength(trace, &trace_len);
@@ -1086,17 +1087,15 @@
       "}                               \n";
 
   LoadScript(kScriptChars);
-  Dart_Handle result = Dart_SetNativeResolver(script_lib,
-                                              &NoopNativeResolver,
-                                              NULL);
+  Dart_Handle result =
+      Dart_SetNativeResolver(script_lib, &NoopNativeResolver, NULL);
   EXPECT_VALID(result);
   Dart_SetPausedEventHandler(&TestBreakpointHandlerWithVerify);
 
   Dart_Handle script_url = NewString(TestCase::url());
 
   const intptr_t num_breakpoints = 9;
-  intptr_t breakpoint_lines[num_breakpoints] =
-      {5, 6, 7, 8, 9, 10, 11, 12, 13};
+  intptr_t breakpoint_lines[num_breakpoints] = {5, 6, 7, 8, 9, 10, 11, 12, 13};
 
   for (intptr_t i = 0; i < num_breakpoints; i++) {
     result = Dart_SetBreakpoint(script_url, breakpoint_lines[i]);
@@ -1202,14 +1201,12 @@
   struct {
     const char* field_name;
     const char* field_value;
-  } expected[] = {
-    // Expected values at first breakpoint.
-    { "bla", "yada yada yada"},
-    { "u", "null" },
-    // Expected values at second breakpoint.
-    { "bla", "silence is golden" },
-    { "u", "442" }
-  };
+  } expected[] = {// Expected values at first breakpoint.
+                  {"bla", "yada yada yada"},
+                  {"u", "null"},
+                  // Expected values at second breakpoint.
+                  {"bla", "silence is golden"},
+                  {"u", "442"}};
   ASSERT(breakpoint_hit_counter < 2);
   int expected_idx = breakpoint_hit_counter * expected_num_fields;
   breakpoint_hit_counter++;
@@ -1248,19 +1245,19 @@
 
 TEST_CASE(Debug_InspectStaticField) {
   const char* kScriptChars =
-    " class A {                                 \n"
-    "   static var bla = 'yada yada yada';      \n"
-    "   static var u;                           \n"
-    " }                                         \n"
-    "                                           \n"
-    " debugBreak() { }                          \n"
-    " main() {                                  \n"
-    "   var a = new A();                        \n"
-    "   debugBreak();                           \n"
-    "   A.u = 442;                              \n"
-    "   A.bla = 'silence is golden';            \n"
-    "   debugBreak();                           \n"
-    " }                                         \n";
+      " class A {                                 \n"
+      "   static var bla = 'yada yada yada';      \n"
+      "   static var u;                           \n"
+      " }                                         \n"
+      "                                           \n"
+      " debugBreak() { }                          \n"
+      " main() {                                  \n"
+      "   var a = new A();                        \n"
+      "   debugBreak();                           \n"
+      "   A.u = 442;                              \n"
+      "   A.bla = 'silence is golden';            \n"
+      "   debugBreak();                           \n"
+      " }                                         \n";
 
   LoadScript(kScriptChars);
   Dart_SetPausedEventHandler(&InspectStaticFieldHandler);
@@ -1274,18 +1271,18 @@
 
 TEST_CASE(Debug_InspectObject) {
   const char* kScriptChars =
-    " class A {                                 \n"
-    "   var a_field = 'a';                      \n"
-    "   static var bla = 'yada yada yada';      \n"
-    "   static var error = unresolvedName();    \n"
-    "   var d = 42.1;                           \n"
-    " }                                         \n"
-    " class B extends A {                       \n"
-    "   var oneDay = const Duration(hours: 24); \n"
-    "   static var bla = 'blah blah';           \n"
-    " }                                         \n"
-    " get_b() { return new B(); }               \n"
-    " get_int() { return 666; }                 \n";
+      " class A {                                 \n"
+      "   var a_field = 'a';                      \n"
+      "   static var bla = 'yada yada yada';      \n"
+      "   static var error = unresolvedName();    \n"
+      "   var d = 42.1;                           \n"
+      " }                                         \n"
+      " class B extends A {                       \n"
+      "   var oneDay = const Duration(hours: 24); \n"
+      "   static var bla = 'blah blah';           \n"
+      " }                                         \n"
+      " get_b() { return new B(); }               \n"
+      " get_int() { return 666; }                 \n";
 
   // Number of instance fields in an object of class B.
   const intptr_t kNumObjectFields = 3;
@@ -1528,9 +1525,8 @@
   Dart_EnterScope();
   LoadScript(kScriptChars);
 
-  Dart_Handle result = Dart_SetNativeResolver(script_lib,
-                                              &InterruptNativeResolver,
-                                              NULL);
+  Dart_Handle result =
+      Dart_SetNativeResolver(script_lib, &InterruptNativeResolver, NULL);
   EXPECT_VALID(result);
 
   Dart_Handle retval = Invoke("main");
@@ -1590,18 +1586,14 @@
 
 
 static void StackTraceDump1BreakpointHandler(
-                Dart_IsolateId isolate_id,
-                intptr_t bp_id,
-                const Dart_CodeLocation& location) {
+    Dart_IsolateId isolate_id,
+    intptr_t bp_id,
+    const Dart_CodeLocation& location) {
   Dart_StackTrace trace;
   Dart_GetStackTrace(&trace);
   const int kStackTraceLen = 4;
   static const char* expected_trace[kStackTraceLen] = {
-    "local_to_main",
-    "Test.local1_to_func1",
-    "Test.func1",
-    "main"
-  };
+      "local_to_main", "Test.local1_to_func1", "Test.func1", "main"};
 
   intptr_t trace_len;
   Dart_Handle res = Dart_StackTraceLength(trace, &trace_len);
@@ -1672,15 +1664,11 @@
   Dart_ListSetAt(frame3_locals, 12, NewString("main_local"));
   Dart_ListSetAt(frame3_locals, 13, Dart_Null());
 
-  Dart_Handle expected_locals[] = {
-    frame0_locals,
-    frame1_locals,
-    frame2_locals,
-    frame3_locals
-  };
+  Dart_Handle expected_locals[] = {frame0_locals, frame1_locals, frame2_locals,
+                                   frame3_locals};
   breakpoint_hit_counter++;
-  VerifyStackTrace(trace, expected_trace, expected_locals,
-                   kStackTraceLen, true);
+  VerifyStackTrace(trace, expected_trace, expected_locals, kStackTraceLen,
+                   true);
 }
 
 
@@ -1751,12 +1739,8 @@
                                             Dart_StackTrace trace) {
   const int kStackTraceLen = 5;
   static const char* expected_trace[kStackTraceLen] = {
-    "Object._noSuchMethod",
-    "Object.noSuchMethod",
-    "Test.local1_to_func1",
-    "Test.func1",
-    "main"
-  };
+      "Object._noSuchMethod", "Object.noSuchMethod", "Test.local1_to_func1",
+      "Test.func1", "main"};
 
   intptr_t trace_len;
   Dart_Handle res = Dart_StackTraceLength(trace, &trace_len);
@@ -1838,16 +1822,11 @@
   Dart_ListSetAt(frame4_locals, 10, NewString("func1"));
   Dart_ListSetAt(frame4_locals, 11, Dart_Null());
 
-  Dart_Handle expected_locals[] = {
-    frame0_locals,
-    frame1_locals,
-    frame2_locals,
-    frame3_locals,
-    frame4_locals
-  };
+  Dart_Handle expected_locals[] = {frame0_locals, frame1_locals, frame2_locals,
+                                   frame3_locals, frame4_locals};
   breakpoint_hit_counter++;
-  VerifyStackTrace(trace, expected_trace, expected_locals,
-                   kStackTraceLen, true);
+  VerifyStackTrace(trace, expected_trace, expected_locals, kStackTraceLen,
+                   true);
 }
 
 
@@ -2028,7 +2007,7 @@
   closure = Dart_EvaluateExpr(script_lib, NewString("(x) => l.length + x"));
   EXPECT_VALID(closure);
   EXPECT(Dart_IsClosure(closure));
-  Dart_Handle args[1] = { Dart_NewInteger(1) };
+  Dart_Handle args[1] = {Dart_NewInteger(1)};
   len = Dart_InvokeClosure(closure, 1, args);
   EXPECT_VALID(len);
   EXPECT(Dart_IsNumber(len));
@@ -2077,8 +2056,8 @@
   Dart_SetExceptionPauseInfo(kPauseOnAllExceptions);
   breakpoint_hit_counter = 0;
 
-  Dart_Handle result = Dart_EvaluateExpr(script_lib, NewString(
-      "() { var p = new Point(3, 4); throw p; } ())"));
+  Dart_Handle result = Dart_EvaluateExpr(
+      script_lib, NewString("() { var p = new Point(3, 4); throw p; } ())"));
   EXPECT(Dart_IsError(result));
   EXPECT_EQ(1, breakpoint_hit_counter);
 }
@@ -2206,26 +2185,20 @@
   Dart_Handle Test1_type = Dart_GetType(script_lib, Test1_name, 0, NULL);
   Dart_Handle type_args = Dart_NewList(1);
   Dart_ListSetAt(type_args, 0, int_type);
-  Dart_Handle Test2_int_type = Dart_GetType(script_lib,
-                                            Test2_name,
-                                            1,
-                                            &type_args);
+  Dart_Handle Test2_int_type =
+      Dart_GetType(script_lib, Test2_name, 1, &type_args);
   Dart_Handle Test3_type = Dart_GetType(script_lib, Test3_name, 0, NULL);
   type_args = Dart_NewList(2);
   Dart_ListSetAt(type_args, 0, int_type);
   Dart_ListSetAt(type_args, 1, Test_type);
-  Dart_Handle Test4_int_type = Dart_GetType(script_lib,
-                                            Test4_name,
-                                            2,
-                                            &type_args);
+  Dart_Handle Test4_int_type =
+      Dart_GetType(script_lib, Test4_name, 2, &type_args);
   type_args = Dart_NewList(3);
   Dart_ListSetAt(type_args, 0, int_type);
   Dart_ListSetAt(type_args, 1, Test_type);
   Dart_ListSetAt(type_args, 2, int_type);
-  Dart_Handle Test5_int_type = Dart_GetType(script_lib,
-                                            Test5_name,
-                                            3,
-                                            &type_args);
+  Dart_Handle Test5_int_type =
+      Dart_GetType(script_lib, Test5_name, 3, &type_args);
   {
     Dart_Handle super_type = Dart_GetSupertype(object_type);
     EXPECT(super_type == Dart_Null());
diff --git a/runtime/vm/debugger_arm.cc b/runtime/vm/debugger_arm.cc
index 1705b30..c14eb71 100644
--- a/runtime/vm/debugger_arm.cc
+++ b/runtime/vm/debugger_arm.cc
@@ -57,7 +57,7 @@
   is_enabled_ = false;
 }
 
-#endif   // !PRODUCT
+#endif  // !PRODUCT
 
 }  // namespace dart
 
diff --git a/runtime/vm/debugger_arm64.cc b/runtime/vm/debugger_arm64.cc
index b8ab73c..842d1a2 100644
--- a/runtime/vm/debugger_arm64.cc
+++ b/runtime/vm/debugger_arm64.cc
@@ -36,7 +36,7 @@
       UNREACHABLE();
   }
   const Code& code = Code::Handle(code_);
-  saved_value_ =  CodePatcher::GetStaticCallTargetAt(pc_, code);
+  saved_value_ = CodePatcher::GetStaticCallTargetAt(pc_, code);
   CodePatcher::PatchPoolPointerCallAt(pc_, code, stub_target);
   is_enabled_ = true;
 }
@@ -49,8 +49,8 @@
     case RawPcDescriptors::kIcCall:
     case RawPcDescriptors::kUnoptStaticCall:
     case RawPcDescriptors::kRuntimeCall: {
-      CodePatcher::PatchPoolPointerCallAt(
-          pc_, code, Code::Handle(saved_value_));
+      CodePatcher::PatchPoolPointerCallAt(pc_, code,
+                                          Code::Handle(saved_value_));
       break;
     }
     default:
diff --git a/runtime/vm/debugger_dbc.cc b/runtime/vm/debugger_dbc.cc
index ac21678..8304677 100644
--- a/runtime/vm/debugger_dbc.cc
+++ b/runtime/vm/debugger_dbc.cc
@@ -35,7 +35,7 @@
   const Code& code = Code::Handle(code_);
   const Instructions& instrs = Instructions::Handle(code.instructions());
   {
-    WritableInstructionsScope writable(instrs.PayloadStart(), instrs.size());
+    WritableInstructionsScope writable(instrs.PayloadStart(), instrs.Size());
     saved_value_ = *CallInstructionFromReturnAddress(pc_);
     switch (breakpoint_kind_) {
       case RawPcDescriptors::kIcCall:
@@ -43,11 +43,8 @@
         // DebugBreak has an A operand matching the call it replaces.
         // This ensures that Return instructions continue to work - as they
         // look at calls to figure out how many arguments to drop.
-        *CallInstructionFromReturnAddress(pc_) =
-            Bytecode::Encode(Bytecode::kDebugBreak,
-                             Bytecode::DecodeArgc(saved_value_),
-                             0,
-                             0);
+        *CallInstructionFromReturnAddress(pc_) = Bytecode::Encode(
+            Bytecode::kDebugBreak, Bytecode::DecodeArgc(saved_value_), 0, 0);
         break;
       }
 
@@ -80,7 +77,7 @@
   const Code& code = Code::Handle(code_);
   const Instructions& instrs = Instructions::Handle(code.instructions());
   {
-    WritableInstructionsScope writable(instrs.PayloadStart(), instrs.size());
+    WritableInstructionsScope writable(instrs.PayloadStart(), instrs.Size());
     switch (breakpoint_kind_) {
       case RawPcDescriptors::kIcCall:
       case RawPcDescriptors::kUnoptStaticCall:
diff --git a/runtime/vm/debugger_ia32.cc b/runtime/vm/debugger_ia32.cc
index c900f75..83cd02d 100644
--- a/runtime/vm/debugger_ia32.cc
+++ b/runtime/vm/debugger_ia32.cc
@@ -30,7 +30,7 @@
   const Instructions& instrs = Instructions::Handle(code.instructions());
   Code& stub_target = Code::Handle();
   {
-    WritableInstructionsScope writable(instrs.PayloadStart(), instrs.size());
+    WritableInstructionsScope writable(instrs.PayloadStart(), instrs.Size());
     switch (breakpoint_kind_) {
       case RawPcDescriptors::kIcCall:
       case RawPcDescriptors::kUnoptStaticCall: {
@@ -57,7 +57,7 @@
   const Code& code = Code::Handle(code_);
   const Instructions& instrs = Instructions::Handle(code.instructions());
   {
-    WritableInstructionsScope writable(instrs.PayloadStart(), instrs.size());
+    WritableInstructionsScope writable(instrs.PayloadStart(), instrs.Size());
     switch (breakpoint_kind_) {
       case RawPcDescriptors::kIcCall:
       case RawPcDescriptors::kUnoptStaticCall:
diff --git a/runtime/vm/debugger_test.cc b/runtime/vm/debugger_test.cc
index 8b8b84e..6096965 100644
--- a/runtime/vm/debugger_test.cc
+++ b/runtime/vm/debugger_test.cc
@@ -76,14 +76,16 @@
         "\"breakpointNumber\":2,\"resolved\":false,"
         "\"location\":{\"type\":\"UnresolvedSourceLocation\","
         "\"script\":{\"type\":\"@Script\",\"fixedId\":true,"
-        "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\\/0\","
+        "\"id\":\"libraries\\/%" Pd
+        "\\/scripts\\/test-lib\\/0\","
         "\"uri\":\"test-lib\","
         "\"_kind\":\"script\"},\"line\":3}},"
         "{\"type\":\"Breakpoint\",\"fixedId\":true,\"id\":\"breakpoints\\/1\","
         "\"breakpointNumber\":1,\"resolved\":false,"
         "\"location\":{\"type\":\"UnresolvedSourceLocation\","
         "\"script\":{\"type\":\"@Script\",\"fixedId\":true,"
-        "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\\/0\","
+        "\"id\":\"libraries\\/%" Pd
+        "\\/scripts\\/test-lib\\/0\","
         "\"uri\":\"test-lib\","
         "\"_kind\":\"script\"},\"line\":2}}]",
         vmlib.index(), vmlib.index());
diff --git a/runtime/vm/debugger_x64.cc b/runtime/vm/debugger_x64.cc
index 7da5fc7..58c45c96 100644
--- a/runtime/vm/debugger_x64.cc
+++ b/runtime/vm/debugger_x64.cc
@@ -37,7 +37,7 @@
       UNREACHABLE();
   }
   const Code& code = Code::Handle(code_);
-  saved_value_ =  CodePatcher::GetStaticCallTargetAt(pc_, code);
+  saved_value_ = CodePatcher::GetStaticCallTargetAt(pc_, code);
   CodePatcher::PatchPoolPointerCallAt(pc_, code, stub_target);
   is_enabled_ = true;
 }
@@ -50,8 +50,8 @@
     case RawPcDescriptors::kIcCall:
     case RawPcDescriptors::kUnoptStaticCall:
     case RawPcDescriptors::kRuntimeCall: {
-      CodePatcher::PatchPoolPointerCallAt(
-          pc_, code, Code::Handle(saved_value_));
+      CodePatcher::PatchPoolPointerCallAt(pc_, code,
+                                          Code::Handle(saved_value_));
       break;
     }
     default:
diff --git a/runtime/vm/deferred_objects.cc b/runtime/vm/deferred_objects.cc
index d3f89c7..f21716a 100644
--- a/runtime/vm/deferred_objects.cc
+++ b/runtime/vm/deferred_objects.cc
@@ -94,8 +94,7 @@
     const Class& cls = Class::Handle(Isolate::Current()->class_table()->At(
         Object::Handle(obj->object()).GetClassId()));
     OS::PrintErr("writing instance of class %s ref at %" Px ".\n",
-                 cls.ToCString(),
-                 reinterpret_cast<uword>(slot()));
+                 cls.ToCString(), reinterpret_cast<uword>(slot()));
   }
 }
 
@@ -105,21 +104,21 @@
   Zone* zone = deopt_context->zone();
   Function& function = Function::Handle(zone);
   function ^= deopt_context->ObjectAt(index_);
-  const Error& error = Error::Handle(zone,
-      Compiler::EnsureUnoptimizedCode(thread, function));
+  const Error& error =
+      Error::Handle(zone, Compiler::EnsureUnoptimizedCode(thread, function));
   if (!error.IsNull()) {
     Exceptions::PropagateError(error);
   }
   const Code& code = Code::Handle(zone, function.unoptimized_code());
-  // Check that deopt_id exists.
-  // TODO(vegorov): verify after deoptimization targets as well.
+// Check that deopt_id exists.
+// TODO(vegorov): verify after deoptimization targets as well.
 #ifdef DEBUG
   ASSERT(Thread::IsDeoptAfter(deopt_id_) ||
          (code.GetPcForDeoptId(deopt_id_, RawPcDescriptors::kDeopt) != 0));
 #endif
 
-  uword continue_at_pc = code.GetPcForDeoptId(deopt_id_,
-                                              RawPcDescriptors::kDeopt);
+  uword continue_at_pc =
+      code.GetPcForDeoptId(deopt_id_, RawPcDescriptors::kDeopt);
   ASSERT(continue_at_pc != 0);
   uword* dest_addr = reinterpret_cast<uword*>(slot());
   *dest_addr = continue_at_pc;
@@ -162,8 +161,8 @@
   Function& function = Function::Handle(zone);
   function ^= deopt_context->ObjectAt(index_);
   ASSERT(!function.IsNull());
-  const Error& error = Error::Handle(zone,
-      Compiler::EnsureUnoptimizedCode(thread, function));
+  const Error& error =
+      Error::Handle(zone, Compiler::EnsureUnoptimizedCode(thread, function));
   if (!error.IsNull()) {
     Exceptions::PropagateError(error);
   }
@@ -174,8 +173,8 @@
 
   if (FLAG_trace_deoptimization_verbose) {
     THR_Print("materializing pc marker at 0x%" Px ": %s, %s\n",
-        reinterpret_cast<uword>(slot()), code.ToCString(),
-        function.ToCString());
+              reinterpret_cast<uword>(slot()), code.ToCString(),
+              function.ToCString());
   }
 
   // Increment the deoptimization counter. This effectively increments each
@@ -185,8 +184,8 @@
   }
   if (FLAG_trace_deoptimization || FLAG_trace_deoptimization_verbose) {
     THR_Print("Deoptimizing '%s' (count %d)\n",
-        function.ToFullyQualifiedCString(),
-        function.deoptimization_counter());
+              function.ToFullyQualifiedCString(),
+              function.deoptimization_counter());
   }
   // Clear invocation counter so that hopefully the function gets reoptimized
   // only after more feedback has been collected.
@@ -203,8 +202,8 @@
   Function& function = Function::Handle(zone);
   function ^= deopt_context->ObjectAt(index_);
   ASSERT(!function.IsNull());
-  const Error& error = Error::Handle(zone,
-      Compiler::EnsureUnoptimizedCode(thread, function));
+  const Error& error =
+      Error::Handle(zone, Compiler::EnsureUnoptimizedCode(thread, function));
   if (!error.IsNull()) {
     Exceptions::PropagateError(error);
   }
@@ -240,19 +239,16 @@
   if (cls.raw() == Object::context_class()) {
     intptr_t num_variables = Smi::Cast(Object::Handle(GetLength())).Value();
     if (FLAG_trace_deoptimization_verbose) {
-      OS::PrintErr(
-          "materializing context of length %" Pd " (%" Px ", %" Pd " vars)\n",
-          num_variables,
-          reinterpret_cast<uword>(args_),
-          field_count_);
+      OS::PrintErr("materializing context of length %" Pd " (%" Px ", %" Pd
+                   " vars)\n",
+                   num_variables, reinterpret_cast<uword>(args_), field_count_);
     }
     object_ = &Context::ZoneHandle(Context::New(num_variables));
 
   } else {
     if (FLAG_trace_deoptimization_verbose) {
       OS::PrintErr("materializing instance of %s (%" Px ", %" Pd " fields)\n",
-                   cls.ToCString(),
-                   reinterpret_cast<uword>(args_),
+                   cls.ToCString(), reinterpret_cast<uword>(args_),
                    field_count_);
     }
 
@@ -289,8 +285,7 @@
         context.set_parent(parent);
         if (FLAG_trace_deoptimization_verbose) {
           OS::PrintErr("    ctx@parent (offset %" Pd ") <- %s\n",
-                       offset.Value(),
-                       value.ToCString());
+                       offset.Value(), value.ToCString());
         }
       } else {
         intptr_t context_index = ToContextIndex(offset.Value());
@@ -298,9 +293,7 @@
         context.SetAt(context_index, value);
         if (FLAG_trace_deoptimization_verbose) {
           OS::PrintErr("    ctx@%" Pd " (offset %" Pd ") <- %s\n",
-                       context_index,
-                       offset.Value(),
-                       value.ToCString());
+                       context_index, offset.Value(), value.ToCString());
         }
       }
     }
@@ -322,8 +315,7 @@
         closure.SetTypeArguments(arguments);
         if (FLAG_trace_deoptimization_verbose) {
           OS::PrintErr("    closure@type_arguments (offset %" Pd ") <- %s\n",
-                       offset.Value(),
-                       value.ToCString());
+                       offset.Value(), value.ToCString());
         }
       } else if (offset.Value() == Closure::function_offset()) {
         Function& function = Function::Handle();
@@ -331,8 +323,7 @@
         closure.set_function(function);
         if (FLAG_trace_deoptimization_verbose) {
           OS::PrintErr("    closure@function (offset %" Pd ") <- %s\n",
-                       offset.Value(),
-                       value.ToCString());
+                       offset.Value(), value.ToCString());
         }
       } else {
         ASSERT(offset.Value() == Closure::context_offset());
@@ -341,8 +332,7 @@
         closure.set_context(context);
         if (FLAG_trace_deoptimization_verbose) {
           OS::PrintErr("    closure@context (offset %" Pd ") <- %s\n",
-                       offset.Value(),
-                       value.ToCString());
+                       offset.Value(), value.ToCString());
         }
       }
     }
@@ -370,8 +360,7 @@
         obj.SetFieldAtOffset(offset.Value(), value);
         if (FLAG_trace_deoptimization_verbose) {
           OS::PrintErr("    null Field @ offset(%" Pd ") <- %s\n",
-                       offset.Value(),
-                       value.ToCString());
+                       offset.Value(), value.ToCString());
         }
       }
     }
diff --git a/runtime/vm/deferred_objects.h b/runtime/vm/deferred_objects.h
index 1c9d436..eb817af 100644
--- a/runtime/vm/deferred_objects.h
+++ b/runtime/vm/deferred_objects.h
@@ -22,8 +22,8 @@
 class DeferredSlot {
  public:
   DeferredSlot(RawObject** slot, DeferredSlot* next)
-      : slot_(slot), next_(next) { }
-  virtual ~DeferredSlot() { }
+      : slot_(slot), next_(next) {}
+  virtual ~DeferredSlot() {}
 
   RawObject** slot() const { return slot_; }
   DeferredSlot* next() const { return next_; }
@@ -41,7 +41,7 @@
 class DeferredDouble : public DeferredSlot {
  public:
   DeferredDouble(double value, RawObject** slot, DeferredSlot* next)
-      : DeferredSlot(slot, next), value_(value) { }
+      : DeferredSlot(slot, next), value_(value) {}
 
   virtual void Materialize(DeoptContext* deopt_context);
 
@@ -57,7 +57,7 @@
 class DeferredMint : public DeferredSlot {
  public:
   DeferredMint(int64_t value, RawObject** slot, DeferredSlot* next)
-      : DeferredSlot(slot, next), value_(value) { }
+      : DeferredSlot(slot, next), value_(value) {}
 
   virtual void Materialize(DeoptContext* deopt_context);
 
@@ -72,9 +72,8 @@
 
 class DeferredFloat32x4 : public DeferredSlot {
  public:
-  DeferredFloat32x4(simd128_value_t value, RawObject** slot,
-                    DeferredSlot* next)
-      : DeferredSlot(slot, next), value_(value) { }
+  DeferredFloat32x4(simd128_value_t value, RawObject** slot, DeferredSlot* next)
+      : DeferredSlot(slot, next), value_(value) {}
 
   virtual void Materialize(DeoptContext* deopt_context);
 
@@ -89,9 +88,8 @@
 
 class DeferredFloat64x2 : public DeferredSlot {
  public:
-  DeferredFloat64x2(simd128_value_t value, RawObject** slot,
-                    DeferredSlot* next)
-      : DeferredSlot(slot, next), value_(value) { }
+  DeferredFloat64x2(simd128_value_t value, RawObject** slot, DeferredSlot* next)
+      : DeferredSlot(slot, next), value_(value) {}
 
   virtual void Materialize(DeoptContext* deopt_context);
 
@@ -106,9 +104,8 @@
 
 class DeferredInt32x4 : public DeferredSlot {
  public:
-  DeferredInt32x4(simd128_value_t value, RawObject** slot,
-                   DeferredSlot* next)
-      : DeferredSlot(slot, next), value_(value) { }
+  DeferredInt32x4(simd128_value_t value, RawObject** slot, DeferredSlot* next)
+      : DeferredSlot(slot, next), value_(value) {}
 
   virtual void Materialize(DeoptContext* deopt_context);
 
@@ -127,7 +124,7 @@
 class DeferredObjectRef : public DeferredSlot {
  public:
   DeferredObjectRef(intptr_t index, RawObject** slot, DeferredSlot* next)
-      : DeferredSlot(slot, next), index_(index) { }
+      : DeferredSlot(slot, next), index_(index) {}
 
   virtual void Materialize(DeoptContext* deopt_context);
 
@@ -146,7 +143,7 @@
                   intptr_t deopt_id,
                   RawObject** slot,
                   DeferredSlot* next)
-      : DeferredSlot(slot, next), index_(index), deopt_id_(deopt_id) { }
+      : DeferredSlot(slot, next), index_(index), deopt_id_(deopt_id) {}
 
   virtual void Materialize(DeoptContext* deopt_context);
 
@@ -163,7 +160,7 @@
 class DeferredPcMarker : public DeferredSlot {
  public:
   DeferredPcMarker(intptr_t index, RawObject** slot, DeferredSlot* next)
-      : DeferredSlot(slot, next), index_(index) { }
+      : DeferredSlot(slot, next), index_(index) {}
 
   virtual void Materialize(DeoptContext* deopt_context);
 
@@ -179,7 +176,7 @@
 class DeferredPp : public DeferredSlot {
  public:
   DeferredPp(intptr_t index, RawObject** slot, DeferredSlot* next)
-      : DeferredSlot(slot, next), index_(index) { }
+      : DeferredSlot(slot, next), index_(index) {}
 
   virtual void Materialize(DeoptContext* deopt_context);
 
@@ -201,7 +198,7 @@
   DeferredObject(intptr_t field_count, intptr_t* args)
       : field_count_(field_count),
         args_(reinterpret_cast<RawObject**>(args)),
-        object_(NULL) { }
+        object_(NULL) {}
 
   intptr_t ArgumentCount() const {
     return kFieldsStartIndex + kFieldEntrySize * field_count_;
@@ -239,13 +236,9 @@
 #endif
   }
 
-  RawObject* GetClass() const {
-    return GetArg(kClassIndex);
-  }
+  RawObject* GetClass() const { return GetArg(kClassIndex); }
 
-  RawObject* GetLength() const {
-    return GetArg(kLengthIndex);
-  }
+  RawObject* GetLength() const { return GetArg(kLengthIndex); }
 
   RawObject* GetFieldOffset(intptr_t index) const {
     return GetArg(kFieldsStartIndex + kFieldEntrySize * index + kOffsetIndex);
diff --git a/runtime/vm/deopt_instructions.cc b/runtime/vm/deopt_instructions.cc
index bc09820..31f08cd 100644
--- a/runtime/vm/deopt_instructions.cc
+++ b/runtime/vm/deopt_instructions.cc
@@ -17,7 +17,9 @@
 
 namespace dart {
 
-DEFINE_FLAG(bool, compress_deopt_info, true,
+DEFINE_FLAG(bool,
+            compress_deopt_info,
+            true,
             "Compress the size of the deoptimization info for optimized code.");
 DECLARE_FLAG(bool, trace_deoptimization);
 DECLARE_FLAG(bool, trace_deoptimization_verbose);
@@ -70,11 +72,11 @@
   num_args_ =
       function.HasOptionalParameters() ? 0 : function.num_fixed_parameters();
 
-  // The fixed size section of the (fake) Dart frame called via a stub by the
-  // optimized function contains FP, PP (ARM and MIPS only), PC-marker and
-  // return-address. This section is copied as well, so that its contained
-  // values can be updated before returning to the deoptimized function.
-  // Note: on DBC stack grows upwards unlike on all other architectures.
+// The fixed size section of the (fake) Dart frame called via a stub by the
+// optimized function contains FP, PP (ARM and MIPS only), PC-marker and
+// return-address. This section is copied as well, so that its contained
+// values can be updated before returning to the deoptimized function.
+// Note: on DBC stack grows upwards unlike on all other architectures.
 #if defined(TARGET_ARCH_DBC)
   ASSERT(frame->sp() >= frame->fp());
   const intptr_t frame_size = (frame->sp() - frame->fp()) / kWordSize;
@@ -83,12 +85,11 @@
   const intptr_t frame_size = (frame->fp() - frame->sp()) / kWordSize;
 #endif
 
-  source_frame_size_ =
-      + kDartFrameFixedSize  // For saved values below sp.
-      + frame_size  // For frame size incl. sp.
-      + 1  // For fp.
-      + kParamEndSlotFromFp  // For saved values above fp.
-      + num_args_;  // For arguments.
+  source_frame_size_ = +kDartFrameFixedSize   // For saved values below sp.
+                       + frame_size           // For frame size incl. sp.
+                       + 1                    // For fp.
+                       + kParamEndSlotFromFp  // For saved values above fp.
+                       + num_args_;           // For arguments.
 
   source_frame_ = FrameBase(frame);
 
@@ -125,11 +126,8 @@
     THR_Print(
         "Deoptimizing (reason %d '%s') at "
         "pc=%" Pp " fp=%" Pp " '%s' (count %d)\n",
-        deopt_reason(),
-        DeoptReasonToCString(deopt_reason()),
-        frame->pc(),
-        frame->fp(),
-        function.ToFullyQualifiedCString(),
+        deopt_reason(), DeoptReasonToCString(deopt_reason()), frame->pc(),
+        frame->fp(), function.ToFullyQualifiedCString(),
         function.deoptimization_counter());
   }
 }
@@ -172,8 +170,7 @@
       const int counter = function.deoptimization_counter();
       TimelineEvent* timeline_event = compiler_stream->StartEvent();
       if (timeline_event != NULL) {
-        timeline_event->Duration("Deoptimize",
-                                 deopt_start_micros_,
+        timeline_event->Duration("Deoptimize", deopt_start_micros_,
                                  OS::GetCurrentMonotonicMicros());
         timeline_event->SetNumArguments(3);
         timeline_event->CopyArgument(0, "function", function_name.ToCString());
@@ -203,9 +200,7 @@
 
 
 intptr_t DeoptContext::DestStackAdjustment() const {
-  return dest_frame_size_
-         - kDartFrameFixedSize
-         - num_args_
+  return dest_frame_size_ - kDartFrameFixedSize - num_args_
 #if !defined(TARGET_ARCH_DBC)
          - 1  // For fp.
 #endif
@@ -219,7 +214,7 @@
                        kParamEndSlotFromFp];
 #else
   return source_frame_[num_args_ + kDartFrameFixedSize +
-      kSavedCallerFpSlotFromFp];
+                       kSavedCallerFpSlotFromFp];
 #endif
 }
 
@@ -241,7 +236,7 @@
   return source_frame_[source_frame_size_ - num_args_ + kSavedPcSlotFromSp];
 #else
   return source_frame_[num_args_ + kDartFrameFixedSize +
-      kSavedCallerPcSlotFromFp];
+                       kSavedCallerPcSlotFromFp];
 #endif
 }
 
@@ -319,8 +314,7 @@
       DeoptInfo::NumMaterializations(deopt_instructions);
   PrepareForDeferredMaterialization(num_materializations);
   for (intptr_t from_index = 0, to_index = kDartFrameFixedSize;
-       from_index < num_materializations;
-       from_index++) {
+       from_index < num_materializations; from_index++) {
     const intptr_t field_count =
         DeoptInstr::GetFieldCount(deopt_instructions[from_index]);
     intptr_t* args = GetDestFrameAddressAt(to_index);
@@ -330,8 +324,7 @@
   }
 
   // Populate stack frames.
-  for (intptr_t to_index = frame_size - 1, from_index = len - 1;
-       to_index >= 0;
+  for (intptr_t to_index = frame_size - 1, from_index = len - 1; to_index >= 0;
        to_index--, from_index--) {
     intptr_t* to_addr = GetDestFrameAddressAt(to_index);
     DeoptInstr* instr = deopt_instructions[from_index];
@@ -345,10 +338,7 @@
   if (FLAG_trace_deoptimization_verbose) {
     for (intptr_t i = 0; i < frame_size; i++) {
       intptr_t* to_addr = GetDestFrameAddressAt(i);
-      THR_Print("*%" Pd ". [%p] 0x%" Px " [%s]\n",
-                i,
-                to_addr,
-                *to_addr,
+      THR_Print("*%" Pd ". [%p] 0x%" Px " [%s]\n", i, to_addr, *to_addr,
                 deopt_instructions[i + (len - frame_size)]->ToCString());
     }
   }
@@ -402,8 +392,8 @@
     String& line_string = String::Handle(script.GetLine(line));
     THR_Print("  Function: %s\n", top_function.ToFullyQualifiedCString());
     char line_buffer[80];
-    OS::SNPrint(line_buffer, sizeof(line_buffer), "  Line %" Pd ": '%s'",
-                line, line_string.ToCString());
+    OS::SNPrint(line_buffer, sizeof(line_buffer), "  Line %" Pd ": '%s'", line,
+                line_string.ToCString());
     THR_Print("%s\n", line_buffer);
     THR_Print("  Deopt args: %" Pd "\n", deopt_arg_count);
   }
@@ -414,8 +404,7 @@
 
 RawArray* DeoptContext::DestFrameAsArray() {
   ASSERT(dest_frame_ != NULL && dest_frame_is_allocated_);
-  const Array& dest_array =
-      Array::Handle(zone(), Array::New(dest_frame_size_));
+  const Array& dest_array = Array::Handle(zone(), Array::New(dest_frame_size_));
   PassiveObject& obj = PassiveObject::Handle(zone());
   for (intptr_t i = 0; i < dest_frame_size_; i++) {
     obj = reinterpret_cast<RawObject*>(dest_frame_[i]);
@@ -437,12 +426,11 @@
 
   explicit DeoptRetAddressInstr(intptr_t source_index)
       : object_table_index_(ObjectTableIndex::decode(source_index)),
-        deopt_id_(DeoptId::decode(source_index)) {
-  }
+        deopt_id_(DeoptId::decode(source_index)) {}
 
   virtual intptr_t source_index() const {
     return ObjectTableIndex::encode(object_table_index_) |
-        DeoptId::encode(deopt_id_);
+           DeoptId::encode(deopt_id_);
   }
 
   virtual DeoptInstr::Kind kind() const { return kRetAddress; }
@@ -454,8 +442,8 @@
 
   void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
     *dest_addr = Smi::RawValue(0);
-    deopt_context->DeferRetAddrMaterialization(
-        object_table_index_, deopt_id_, dest_addr);
+    deopt_context->DeferRetAddrMaterialization(object_table_index_, deopt_id_,
+                                               dest_addr);
   }
 
   intptr_t object_table_index() const { return object_table_index_; }
@@ -463,10 +451,10 @@
 
  private:
   static const intptr_t kFieldWidth = kBitsPerWord / 2;
-  class ObjectTableIndex :
-      public BitField<intptr_t, intptr_t, 0, kFieldWidth> { };
-  class DeoptId :
-      public BitField<intptr_t, intptr_t, kFieldWidth, kFieldWidth> { };
+  class ObjectTableIndex : public BitField<intptr_t, intptr_t, 0, kFieldWidth> {
+  };
+  class DeoptId
+      : public BitField<intptr_t, intptr_t, kFieldWidth, kFieldWidth> {};
 
   const intptr_t object_table_index_;
   const intptr_t deopt_id_;
@@ -487,8 +475,8 @@
   virtual DeoptInstr::Kind kind() const { return kConstant; }
 
   virtual const char* ArgumentsToCString() const {
-    return Thread::Current()->zone()->PrintToString(
-        "%" Pd "", object_table_index_);
+    return Thread::Current()->zone()->PrintToString("%" Pd "",
+                                                    object_table_index_);
   }
 
   void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
@@ -510,20 +498,16 @@
 // first argument) and accounts for saved return address, frame
 // pointer, pool pointer and pc marker.
 // Deoptimization instruction moving a CPU register.
-class DeoptWordInstr: public DeoptInstr {
+class DeoptWordInstr : public DeoptInstr {
  public:
-  explicit DeoptWordInstr(intptr_t source_index)
-      : source_(source_index) {}
+  explicit DeoptWordInstr(intptr_t source_index) : source_(source_index) {}
 
-  explicit DeoptWordInstr(const CpuRegisterSource& source)
-      : source_(source) {}
+  explicit DeoptWordInstr(const CpuRegisterSource& source) : source_(source) {}
 
   virtual intptr_t source_index() const { return source_.source_index(); }
   virtual DeoptInstr::Kind kind() const { return kWord; }
 
-  virtual const char* ArgumentsToCString() const {
-    return source_.ToCString();
-  }
+  virtual const char* ArgumentsToCString() const { return source_.ToCString(); }
 
   void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
     *dest_addr = source_.Value<intptr_t>(deopt_context);
@@ -536,9 +520,9 @@
 };
 
 
-class DeoptIntegerInstrBase: public DeoptInstr {
+class DeoptIntegerInstrBase : public DeoptInstr {
  public:
-  DeoptIntegerInstrBase() { }
+  DeoptIntegerInstrBase() {}
 
   void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
     const int64_t value = GetValue(deopt_context);
@@ -558,13 +542,12 @@
 };
 
 
-class DeoptMintPairInstr: public DeoptIntegerInstrBase {
+class DeoptMintPairInstr : public DeoptIntegerInstrBase {
  public:
   explicit DeoptMintPairInstr(intptr_t source_index)
       : DeoptIntegerInstrBase(),
         lo_(LoRegister::decode(source_index)),
-        hi_(HiRegister::decode(source_index)) {
-  }
+        hi_(HiRegister::decode(source_index)) {}
 
   DeoptMintPairInstr(const CpuRegisterSource& lo, const CpuRegisterSource& hi)
       : DeoptIntegerInstrBase(), lo_(lo), hi_(hi) {}
@@ -576,22 +559,20 @@
   virtual DeoptInstr::Kind kind() const { return kMintPair; }
 
   virtual const char* ArgumentsToCString() const {
-    return Thread::Current()->zone()->PrintToString(
-        "%s,%s",
-        lo_.ToCString(),
-        hi_.ToCString());
+    return Thread::Current()->zone()->PrintToString("%s,%s", lo_.ToCString(),
+                                                    hi_.ToCString());
   }
 
   virtual int64_t GetValue(DeoptContext* deopt_context) {
-    return Utils::LowHighTo64Bits(
-        lo_.Value<uint32_t>(deopt_context), hi_.Value<int32_t>(deopt_context));
+    return Utils::LowHighTo64Bits(lo_.Value<uint32_t>(deopt_context),
+                                  hi_.Value<int32_t>(deopt_context));
   }
 
  private:
   static const intptr_t kFieldWidth = kBitsPerWord / 2;
-  class LoRegister : public BitField<intptr_t, intptr_t, 0, kFieldWidth> { };
-  class HiRegister :
-      public BitField<intptr_t, intptr_t, kFieldWidth, kFieldWidth> { };
+  class LoRegister : public BitField<intptr_t, intptr_t, 0, kFieldWidth> {};
+  class HiRegister
+      : public BitField<intptr_t, intptr_t, kFieldWidth, kFieldWidth> {};
 
   const CpuRegisterSource lo_;
   const CpuRegisterSource hi_;
@@ -600,23 +581,19 @@
 };
 
 
-template<DeoptInstr::Kind K, typename T>
+template <DeoptInstr::Kind K, typename T>
 class DeoptIntInstr : public DeoptIntegerInstrBase {
  public:
   explicit DeoptIntInstr(intptr_t source_index)
-      : DeoptIntegerInstrBase(), source_(source_index) {
-  }
+      : DeoptIntegerInstrBase(), source_(source_index) {}
 
   explicit DeoptIntInstr(const CpuRegisterSource& source)
-      : DeoptIntegerInstrBase(), source_(source) {
-  }
+      : DeoptIntegerInstrBase(), source_(source) {}
 
   virtual intptr_t source_index() const { return source_.source_index(); }
   virtual DeoptInstr::Kind kind() const { return K; }
 
-  virtual const char* ArgumentsToCString() const {
-    return source_.ToCString();
-  }
+  virtual const char* ArgumentsToCString() const { return source_.ToCString(); }
 
   virtual int64_t GetValue(DeoptContext* deopt_context) {
     return static_cast<int64_t>(source_.Value<T>(deopt_context));
@@ -634,23 +611,17 @@
 typedef DeoptIntInstr<DeoptInstr::kMint, int64_t> DeoptMintInstr;
 
 
-template<DeoptInstr::Kind K,
-         typename Type,
-         typename RawObjectType>
-class DeoptFpuInstr: public DeoptInstr {
+template <DeoptInstr::Kind K, typename Type, typename RawObjectType>
+class DeoptFpuInstr : public DeoptInstr {
  public:
-  explicit DeoptFpuInstr(intptr_t source_index)
-      : source_(source_index) {}
+  explicit DeoptFpuInstr(intptr_t source_index) : source_(source_index) {}
 
-  explicit DeoptFpuInstr(const FpuRegisterSource& source)
-      : source_(source) {}
+  explicit DeoptFpuInstr(const FpuRegisterSource& source) : source_(source) {}
 
   virtual intptr_t source_index() const { return source_.source_index(); }
   virtual DeoptInstr::Kind kind() const { return K; }
 
-  virtual const char* ArgumentsToCString() const {
-    return source_.ToCString();
-  }
+  virtual const char* ArgumentsToCString() const { return source_.ToCString(); }
 
   void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
     *dest_addr = Smi::RawValue(0);
@@ -690,17 +661,18 @@
   virtual DeoptInstr::Kind kind() const { return kPcMarker; }
 
   virtual const char* ArgumentsToCString() const {
-    return Thread::Current()->zone()->PrintToString(
-        "%" Pd "", object_table_index_);
+    return Thread::Current()->zone()->PrintToString("%" Pd "",
+                                                    object_table_index_);
   }
 
   void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
     Function& function = Function::Handle(deopt_context->zone());
     function ^= deopt_context->ObjectAt(object_table_index_);
     if (function.IsNull()) {
-      *reinterpret_cast<RawObject**>(dest_addr) = deopt_context->is_lazy_deopt()
-          ? StubCode::DeoptimizeLazyFromReturn_entry()->code()
-          : StubCode::Deoptimize_entry()->code();
+      *reinterpret_cast<RawObject**>(dest_addr) =
+          deopt_context->is_lazy_deopt()
+              ? StubCode::DeoptimizeLazyFromReturn_entry()->code()
+              : StubCode::Deoptimize_entry()->code();
       return;
     }
 
@@ -734,14 +706,14 @@
   virtual DeoptInstr::Kind kind() const { return kPp; }
 
   virtual const char* ArgumentsToCString() const {
-    return Thread::Current()->zone()->PrintToString(
-        "%" Pd "", object_table_index_);
+    return Thread::Current()->zone()->PrintToString("%" Pd "",
+                                                    object_table_index_);
   }
 
   void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
     *dest_addr = Smi::RawValue(0);
-    deopt_context->DeferPpMaterialization(object_table_index_,
-        reinterpret_cast<RawObject**>(dest_addr));
+    deopt_context->DeferPpMaterialization(
+        object_table_index_, reinterpret_cast<RawObject**>(dest_addr));
   }
 
  private:
@@ -761,8 +733,8 @@
 
   void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
     *dest_addr = deopt_context->GetCallerFp();
-    deopt_context->SetCallerFp(reinterpret_cast<intptr_t>(
-        dest_addr - kSavedCallerFpSlotFromFp));
+    deopt_context->SetCallerFp(
+        reinterpret_cast<intptr_t>(dest_addr - kSavedCallerFpSlotFromFp));
   }
 
  private:
@@ -809,8 +781,7 @@
 // stack slot.
 class DeoptMaterializedObjectRefInstr : public DeoptInstr {
  public:
-  explicit DeoptMaterializedObjectRefInstr(intptr_t index)
-      : index_(index) {
+  explicit DeoptMaterializedObjectRefInstr(intptr_t index) : index_(index) {
     ASSERT(index >= 0);
   }
 
@@ -818,14 +789,12 @@
   virtual DeoptInstr::Kind kind() const { return kMaterializedObjectRef; }
 
   virtual const char* ArgumentsToCString() const {
-    return Thread::Current()->zone()->PrintToString(
-        "#%" Pd "", index_);
+    return Thread::Current()->zone()->PrintToString("#%" Pd "", index_);
   }
 
   void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
     *reinterpret_cast<RawSmi**>(dest_addr) = Smi::New(0);
-    deopt_context->DeferMaterializedObjectRef(
-        index_, dest_addr);
+    deopt_context->DeferMaterializedObjectRef(index_, dest_addr);
   }
 
  private:
@@ -849,8 +818,7 @@
   virtual DeoptInstr::Kind kind() const { return kMaterializeObject; }
 
   virtual const char* ArgumentsToCString() const {
-    return Thread::Current()->zone()->PrintToString(
-        "%" Pd "", field_count_);
+    return Thread::Current()->zone()->PrintToString("%" Pd "", field_count_);
   }
 
   void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
@@ -880,8 +848,8 @@
   Function& function = Function::Handle(zone);
   function ^= object_table.ObjectAt(ret_address_instr->object_table_index());
   ASSERT(code != NULL);
-  const Error& error = Error::Handle(zone,
-      Compiler::EnsureUnoptimizedCode(thread, function));
+  const Error& error =
+      Error::Handle(zone, Compiler::EnsureUnoptimizedCode(thread, function));
   if (!error.IsNull()) {
     Exceptions::PropagateError(error);
   }
@@ -986,11 +954,11 @@
  public:
   // Construct the root node representing the implicit "shared" terminator
   // at the end of each deopt info.
-  TrieNode() : instruction_(NULL), info_number_(-1), children_(16) { }
+  TrieNode() : instruction_(NULL), info_number_(-1), children_(16) {}
 
   // Construct a node representing a written instruction.
   TrieNode(DeoptInstr* instruction, intptr_t info_number)
-      : instruction_(instruction), info_number_(info_number), children_(4) { }
+      : instruction_(instruction), info_number_(info_number), children_(4) {}
 
   intptr_t info_number() const { return info_number_; }
 
@@ -1008,7 +976,7 @@
 
  private:
   const DeoptInstr* instruction_;  // Instruction that was written.
-  const intptr_t info_number_;  // Index of the deopt info it was written to.
+  const intptr_t info_number_;     // Index of the deopt info it was written to.
 
   GrowableArray<TrieNode*> children_;
 };
@@ -1021,11 +989,10 @@
       instructions_(),
       num_args_(num_args),
       assembler_(assembler),
-      trie_root_(new(zone) TrieNode()),
+      trie_root_(new (zone) TrieNode()),
       current_info_number_(0),
       frame_start_(-1),
-      materializations_() {
-}
+      materializations_() {}
 
 
 intptr_t DeoptInfoBuilder::FindOrAddObjectInTable(const Object& obj) const {
@@ -1035,9 +1002,9 @@
 
 intptr_t DeoptInfoBuilder::CalculateStackIndex(
     const Location& source_loc) const {
-  return source_loc.stack_index() < 0 ?
-            source_loc.stack_index() + num_args_ :
-            source_loc.stack_index() + num_args_ + kDartFrameFixedSize;
+  return source_loc.stack_index() < 0
+             ? source_loc.stack_index() + num_args_
+             : source_loc.stack_index() + num_args_ + kDartFrameFixedSize;
 }
 
 
@@ -1046,15 +1013,15 @@
     return CpuRegisterSource(CpuRegisterSource::kRegister, loc.reg());
   } else {
     ASSERT(loc.IsStackSlot());
-    return CpuRegisterSource(
-        CpuRegisterSource::kStackSlot, CalculateStackIndex(loc));
+    return CpuRegisterSource(CpuRegisterSource::kStackSlot,
+                             CalculateStackIndex(loc));
   }
 }
 
 
 FpuRegisterSource DeoptInfoBuilder::ToFpuRegisterSource(
-  const Location& loc,
-  Location::Kind stack_slot_kind) {
+    const Location& loc,
+    Location::Kind stack_slot_kind) {
   if (loc.IsFpuRegister()) {
     return FpuRegisterSource(FpuRegisterSource::kRegister, loc.fpu_reg());
 #if defined(TARGET_ARCH_DBC)
@@ -1065,8 +1032,8 @@
     ASSERT((stack_slot_kind == Location::kQuadStackSlot) ||
            (stack_slot_kind == Location::kDoubleStackSlot));
     ASSERT(loc.kind() == stack_slot_kind);
-    return FpuRegisterSource(
-        FpuRegisterSource::kStackSlot, CalculateStackIndex(loc));
+    return FpuRegisterSource(FpuRegisterSource::kStackSlot,
+                             CalculateStackIndex(loc));
   }
 }
 
@@ -1075,8 +1042,8 @@
                                         intptr_t dest_index) {
   const intptr_t object_table_index = FindOrAddObjectInTable(function);
   ASSERT(dest_index == FrameSize());
-  instructions_.Add(
-      new(zone()) DeoptRetAddressInstr(object_table_index, deopt_id));
+  instructions_.Add(new (zone())
+                        DeoptRetAddressInstr(object_table_index, deopt_id));
 }
 
 
@@ -1084,15 +1051,14 @@
                                    intptr_t dest_index) {
   intptr_t object_table_index = FindOrAddObjectInTable(function);
   ASSERT(dest_index == FrameSize());
-  instructions_.Add(new(zone()) DeoptPcMarkerInstr(object_table_index));
+  instructions_.Add(new (zone()) DeoptPcMarkerInstr(object_table_index));
 }
 
 
-void DeoptInfoBuilder::AddPp(const Function& function,
-                             intptr_t dest_index) {
+void DeoptInfoBuilder::AddPp(const Function& function, intptr_t dest_index) {
   intptr_t object_table_index = FindOrAddObjectInTable(function);
   ASSERT(dest_index == FrameSize());
-  instructions_.Add(new(zone()) DeoptPpInstr(object_table_index));
+  instructions_.Add(new (zone()) DeoptPpInstr(object_table_index));
 }
 
 
@@ -1102,55 +1068,55 @@
   DeoptInstr* deopt_instr = NULL;
   if (source_loc.IsConstant()) {
     intptr_t object_table_index = FindOrAddObjectInTable(source_loc.constant());
-    deopt_instr = new(zone()) DeoptConstantInstr(object_table_index);
+    deopt_instr = new (zone()) DeoptConstantInstr(object_table_index);
   } else if (source_loc.IsInvalid() &&
              value->definition()->IsMaterializeObject()) {
-    const intptr_t index = FindMaterialization(
-        value->definition()->AsMaterializeObject());
+    const intptr_t index =
+        FindMaterialization(value->definition()->AsMaterializeObject());
     ASSERT(index >= 0);
-    deopt_instr = new(zone()) DeoptMaterializedObjectRefInstr(index);
+    deopt_instr = new (zone()) DeoptMaterializedObjectRefInstr(index);
   } else {
     ASSERT(!source_loc.IsInvalid());
     switch (value->definition()->representation()) {
       case kTagged:
-        deopt_instr = new(zone()) DeoptWordInstr(
-          ToCpuRegisterSource(source_loc));
+        deopt_instr =
+            new (zone()) DeoptWordInstr(ToCpuRegisterSource(source_loc));
         break;
       case kUnboxedMint: {
         if (source_loc.IsPairLocation()) {
           PairLocation* pair = source_loc.AsPairLocation();
-          deopt_instr = new(zone()) DeoptMintPairInstr(
-              ToCpuRegisterSource(pair->At(0)),
-              ToCpuRegisterSource(pair->At(1)));
+          deopt_instr =
+              new (zone()) DeoptMintPairInstr(ToCpuRegisterSource(pair->At(0)),
+                                              ToCpuRegisterSource(pair->At(1)));
         } else {
           ASSERT(!source_loc.IsPairLocation());
-          deopt_instr = new(zone()) DeoptMintInstr(
-              ToCpuRegisterSource(source_loc));
+          deopt_instr =
+              new (zone()) DeoptMintInstr(ToCpuRegisterSource(source_loc));
         }
         break;
       }
       case kUnboxedInt32:
-        deopt_instr = new(zone()) DeoptInt32Instr(
-            ToCpuRegisterSource(source_loc));
+        deopt_instr =
+            new (zone()) DeoptInt32Instr(ToCpuRegisterSource(source_loc));
         break;
       case kUnboxedUint32:
-        deopt_instr = new(zone()) DeoptUint32Instr(
-            ToCpuRegisterSource(source_loc));
+        deopt_instr =
+            new (zone()) DeoptUint32Instr(ToCpuRegisterSource(source_loc));
         break;
       case kUnboxedDouble:
-        deopt_instr = new(zone()) DeoptDoubleInstr(
+        deopt_instr = new (zone()) DeoptDoubleInstr(
             ToFpuRegisterSource(source_loc, Location::kDoubleStackSlot));
         break;
       case kUnboxedFloat32x4:
-        deopt_instr = new(zone()) DeoptFloat32x4Instr(
+        deopt_instr = new (zone()) DeoptFloat32x4Instr(
             ToFpuRegisterSource(source_loc, Location::kQuadStackSlot));
         break;
       case kUnboxedFloat64x2:
-        deopt_instr = new(zone()) DeoptFloat64x2Instr(
+        deopt_instr = new (zone()) DeoptFloat64x2Instr(
             ToFpuRegisterSource(source_loc, Location::kQuadStackSlot));
         break;
       case kUnboxedInt32x4:
-        deopt_instr = new(zone()) DeoptInt32x4Instr(
+        deopt_instr = new (zone()) DeoptInt32x4Instr(
             ToFpuRegisterSource(source_loc, Location::kQuadStackSlot));
         break;
       default:
@@ -1166,26 +1132,26 @@
 
 void DeoptInfoBuilder::AddCallerFp(intptr_t dest_index) {
   ASSERT(dest_index == FrameSize());
-  instructions_.Add(new(zone()) DeoptCallerFpInstr());
+  instructions_.Add(new (zone()) DeoptCallerFpInstr());
 }
 
 
 void DeoptInfoBuilder::AddCallerPp(intptr_t dest_index) {
   ASSERT(dest_index == FrameSize());
-  instructions_.Add(new(zone()) DeoptCallerPpInstr());
+  instructions_.Add(new (zone()) DeoptCallerPpInstr());
 }
 
 
 void DeoptInfoBuilder::AddCallerPc(intptr_t dest_index) {
   ASSERT(dest_index == FrameSize());
-  instructions_.Add(new(zone()) DeoptCallerPcInstr());
+  instructions_.Add(new (zone()) DeoptCallerPcInstr());
 }
 
 
 void DeoptInfoBuilder::AddConstant(const Object& obj, intptr_t dest_index) {
   ASSERT(dest_index == FrameSize());
   intptr_t object_table_index = FindOrAddObjectInTable(obj);
-  instructions_.Add(new(zone()) DeoptConstantInstr(object_table_index));
+  instructions_.Add(new (zone()) DeoptConstantInstr(object_table_index));
 }
 
 
@@ -1206,12 +1172,11 @@
     }
   }
 
-  instructions_.Add(
-      new(zone()) DeoptMaterializeObjectInstr(non_null_fields));
+  instructions_.Add(new (zone()) DeoptMaterializeObjectInstr(non_null_fields));
 
   for (intptr_t i = 0; i < mat->InputCount(); i++) {
-    MaterializeObjectInstr* nested_mat = mat->InputAt(i)->definition()->
-        AsMaterializeObject();
+    MaterializeObjectInstr* nested_mat =
+        mat->InputAt(i)->definition()->AsMaterializeObject();
     if (nested_mat != NULL) {
       AddMaterialization(nested_mat);
     }
@@ -1253,8 +1218,7 @@
 static uint8_t* ZoneReAlloc(uint8_t* ptr,
                             intptr_t old_size,
                             intptr_t new_size) {
-  return Thread::Current()->zone()->Realloc<uint8_t>(
-      ptr, old_size, new_size);
+  return Thread::Current()->zone()->Realloc<uint8_t>(ptr, old_size, new_size);
 }
 
 
@@ -1303,22 +1267,21 @@
     Writer::Write(&stream, instr->kind());
     Writer::Write(&stream, instr->source_index());
 
-    TrieNode* child = new(zone()) TrieNode(instr, current_info_number_);
+    TrieNode* child = new (zone()) TrieNode(instr, current_info_number_);
     node->AddChild(child);
     node = child;
   }
 
-  const TypedData& deopt_info = TypedData::Handle(zone(), TypedData::New(
-      kTypedDataUint8ArrayCid, stream.bytes_written(), Heap::kOld));
+  const TypedData& deopt_info = TypedData::Handle(
+      zone(), TypedData::New(kTypedDataUint8ArrayCid, stream.bytes_written(),
+                             Heap::kOld));
   {
     NoSafepointScope no_safepoint;
-    memmove(deopt_info.DataAddr(0),
-            stream.buffer(),
-            stream.bytes_written());
+    memmove(deopt_info.DataAddr(0), stream.buffer(), stream.bytes_written());
   }
 
-  ASSERT(DeoptInfo::VerifyDecompression(
-      instructions_, deopt_table, deopt_info));
+  ASSERT(
+      DeoptInfo::VerifyDecompression(instructions_, deopt_table, deopt_info));
   instructions_.Clear();
   materializations_.Clear();
   frame_start_ = -1;
diff --git a/runtime/vm/deopt_instructions.h b/runtime/vm/deopt_instructions.h
index ee1a052..01a6974 100644
--- a/runtime/vm/deopt_instructions.h
+++ b/runtime/vm/deopt_instructions.h
@@ -29,8 +29,8 @@
 class DeoptContext {
  public:
   enum DestFrameOptions {
-    kDestIsOriginalFrame,   // Replace the original frame with deopt frame.
-    kDestIsAllocated        // Write deopt frame to a buffer.
+    kDestIsOriginalFrame,  // Replace the original frame with deopt frame.
+    kDestIsAllocated       // Write deopt frame to a buffer.
   };
 
   // If 'deoptimizing_code' is false, only frame is being deoptimized.
@@ -116,8 +116,8 @@
 #if !defined(TARGET_ARCH_DBC)
     // SP of the deoptimization frame is the lowest slot because
     // stack is growing downwards.
-    return reinterpret_cast<intptr_t*>(
-      frame->sp() - (kDartFrameFixedSize * kWordSize));
+    return reinterpret_cast<intptr_t*>(frame->sp() -
+                                       (kDartFrameFixedSize * kWordSize));
 #else
     // First argument is the lowest slot because stack is growing upwards.
     return reinterpret_cast<intptr_t*>(
@@ -163,61 +163,44 @@
 
   void DeferMaterializedObjectRef(intptr_t idx, intptr_t* slot) {
     deferred_slots_ = new DeferredObjectRef(
-        idx,
-        reinterpret_cast<RawObject**>(slot),
-        deferred_slots_);
+        idx, reinterpret_cast<RawObject**>(slot), deferred_slots_);
   }
 
   void DeferMaterialization(double value, RawDouble** slot) {
     deferred_slots_ = new DeferredDouble(
-        value,
-        reinterpret_cast<RawObject**>(slot),
-        deferred_slots_);
+        value, reinterpret_cast<RawObject**>(slot), deferred_slots_);
   }
 
   void DeferMintMaterialization(int64_t value, RawMint** slot) {
     deferred_slots_ = new DeferredMint(
-        value,
-        reinterpret_cast<RawObject**>(slot),
-        deferred_slots_);
+        value, reinterpret_cast<RawObject**>(slot), deferred_slots_);
   }
 
   void DeferMaterialization(simd128_value_t value, RawFloat32x4** slot) {
     deferred_slots_ = new DeferredFloat32x4(
-        value,
-        reinterpret_cast<RawObject**>(slot),
-        deferred_slots_);
+        value, reinterpret_cast<RawObject**>(slot), deferred_slots_);
   }
 
   void DeferMaterialization(simd128_value_t value, RawFloat64x2** slot) {
     deferred_slots_ = new DeferredFloat64x2(
-        value,
-        reinterpret_cast<RawObject**>(slot),
-        deferred_slots_);
+        value, reinterpret_cast<RawObject**>(slot), deferred_slots_);
   }
 
   void DeferMaterialization(simd128_value_t value, RawInt32x4** slot) {
     deferred_slots_ = new DeferredInt32x4(
-        value,
-        reinterpret_cast<RawObject**>(slot),
-        deferred_slots_);
+        value, reinterpret_cast<RawObject**>(slot), deferred_slots_);
   }
 
   void DeferRetAddrMaterialization(intptr_t index,
                                    intptr_t deopt_id,
                                    intptr_t* slot) {
     deferred_slots_ = new DeferredRetAddr(
-        index,
-        deopt_id,
-        reinterpret_cast<RawObject**>(slot),
-        deferred_slots_);
+        index, deopt_id, reinterpret_cast<RawObject**>(slot), deferred_slots_);
   }
 
   void DeferPcMarkerMaterialization(intptr_t index, intptr_t* slot) {
     deferred_slots_ = new DeferredPcMarker(
-        index,
-        reinterpret_cast<RawObject**>(slot),
-        deferred_slots_);
+        index, reinterpret_cast<RawObject**>(slot), deferred_slots_);
   }
 
   void DeferPpMaterialization(intptr_t index, RawObject** slot) {
@@ -257,9 +240,7 @@
     deferred_objects_[idx] = object;
   }
 
-  intptr_t DeferredObjectsCount() const {
-    return deferred_objects_count_;
-  }
+  intptr_t DeferredObjectsCount() const { return deferred_objects_count_; }
 
   RawCode* code_;
   RawObjectPool* object_pool_;
@@ -291,7 +272,6 @@
 };
 
 
-
 // Represents one deopt instruction, e.g, setup return address, store object,
 // store register, etc. The target is defined by instruction's position in
 // the deopt-info array.
@@ -363,9 +343,7 @@
 
   virtual intptr_t source_index() const = 0;
 
-  virtual const char* ArgumentsToCString() const {
-    return NULL;
-  }
+  virtual const char* ArgumentsToCString() const { return NULL; }
 
  private:
   static const char* KindToCString(Kind kind);
@@ -378,17 +356,17 @@
 // the DeoptContext as the specified type.
 // It calls different method depending on which kind of register (cpu/fpu) and
 // destination types are specified.
-template<typename RegisterType, typename DestinationType>
+template <typename RegisterType, typename DestinationType>
 struct RegisterReader;
 
-template<typename T>
+template <typename T>
 struct RegisterReader<Register, T> {
   static intptr_t Read(DeoptContext* context, Register reg) {
     return context->RegisterValue(reg);
   }
 };
 
-template<>
+template <>
 struct RegisterReader<FpuRegister, double> {
   static double Read(DeoptContext* context, FpuRegister reg) {
     return context->FpuRegisterValue(reg);
@@ -396,7 +374,7 @@
 };
 
 
-template<>
+template <>
 struct RegisterReader<FpuRegister, simd128_value_t> {
   static simd128_value_t Read(DeoptContext* context, FpuRegister reg) {
     return context->FpuRegisterValueAsSimd128(reg);
@@ -407,7 +385,7 @@
 // Class that encapsulates reading and writing of values that were either in
 // the registers in the optimized code or were spilled from those registers
 // to the stack.
-template<typename RegisterType>
+template <typename RegisterType>
 class RegisterSource {
  public:
   enum Kind {
@@ -418,20 +396,19 @@
   };
 
   explicit RegisterSource(intptr_t source_index)
-      : source_index_(source_index) { }
+      : source_index_(source_index) {}
 
   RegisterSource(Kind kind, intptr_t index)
-      : source_index_(KindField::encode(kind) | RawIndexField::encode(index)) {
-  }
+      : source_index_(KindField::encode(kind) | RawIndexField::encode(index)) {}
 
-  template<typename T>
+  template <typename T>
   T Value(DeoptContext* context) const {
     if (is_register()) {
-      return static_cast<T>(RegisterReader<RegisterType, T>::Read(
-        context, reg()));
+      return static_cast<T>(
+          RegisterReader<RegisterType, T>::Read(context, reg()));
     } else {
-      return *reinterpret_cast<T*>(context->GetSourceFrameAddressAt(
-          raw_index()));
+      return *reinterpret_cast<T*>(
+          context->GetSourceFrameAddressAt(raw_index()));
     }
   }
 
@@ -441,15 +418,14 @@
     if (is_register()) {
       return Name(reg());
     } else {
-      return Thread::Current()->zone()->PrintToString(
-          "s%" Pd "", raw_index());
+      return Thread::Current()->zone()->PrintToString("s%" Pd "", raw_index());
     }
   }
 
  private:
-  class KindField : public BitField<intptr_t, intptr_t, 0, 1> { };
-  class RawIndexField :
-      public BitField<intptr_t, intptr_t, 1, kBitsPerWord - 1> { };
+  class KindField : public BitField<intptr_t, intptr_t, 0, 1> {};
+  class RawIndexField
+      : public BitField<intptr_t, intptr_t, 1, kBitsPerWord - 1> {};
 
   bool is_register() const {
     return KindField::decode(source_index_) == kRegister;
@@ -458,9 +434,7 @@
 
   RegisterType reg() const { return static_cast<RegisterType>(raw_index()); }
 
-  static const char* Name(Register reg) {
-    return Assembler::RegisterName(reg);
-  }
+  static const char* Name(Register reg) { return Assembler::RegisterName(reg); }
 
   static const char* Name(FpuRegister fpu_reg) {
     return Assembler::FpuRegisterName(fpu_reg);
@@ -525,8 +499,9 @@
   class TrieNode;
 
   CpuRegisterSource ToCpuRegisterSource(const Location& loc);
-  FpuRegisterSource ToFpuRegisterSource(const Location& loc,
-                                      Location::Kind expected_stack_slot_kind);
+  FpuRegisterSource ToFpuRegisterSource(
+      const Location& loc,
+      Location::Kind expected_stack_slot_kind);
 
   intptr_t FindOrAddObjectInTable(const Object& obj) const;
   intptr_t FindMaterialization(MaterializeObjectInstr* mat) const;
@@ -591,13 +566,11 @@
 
   static RawSmi* EncodeReasonAndFlags(ICData::DeoptReasonId reason,
                                       uint32_t flags) {
-    return Smi::New(ReasonField::encode(reason) |
-                    FlagsField::encode(flags));
+    return Smi::New(ReasonField::encode(reason) | FlagsField::encode(flags));
   }
 
-  class ReasonField :
-      public BitField<intptr_t, ICData::DeoptReasonId, 0, 8> { };
-  class FlagsField : public BitField<intptr_t, uint32_t, 8, 8> { };
+  class ReasonField : public BitField<intptr_t, ICData::DeoptReasonId, 0, 8> {};
+  class FlagsField : public BitField<intptr_t, uint32_t, 8, 8> {};
 
  private:
   static const intptr_t kEntrySize = 3;
diff --git a/runtime/vm/disassembler.cc b/runtime/vm/disassembler.cc
index 1b62540..235fcfe 100644
--- a/runtime/vm/disassembler.cc
+++ b/runtime/vm/disassembler.cc
@@ -81,7 +81,7 @@
   va_start(args, format);
   intptr_t len = OS::VSNPrint(NULL, 0, format, args);
   va_end(args);
-  char* p = reinterpret_cast<char*>(malloc(len+1));
+  char* p = reinterpret_cast<char*>(malloc(len + 1));
   va_start(args, format);
   intptr_t len2 = OS::VSNPrint(p, len, format, args);
   va_end(args);
@@ -146,31 +146,25 @@
     }
     int instruction_length;
     Object* object;
-    DecodeInstruction(hex_buffer,
-                      sizeof(hex_buffer),
-                      human_buffer,
-                      sizeof(human_buffer),
-                      &instruction_length, code, &object, pc);
-    formatter->ConsumeInstruction(code,
-                                  hex_buffer,
-                                  sizeof(hex_buffer),
-                                  human_buffer,
-                                  sizeof(human_buffer),
-                                  object,
+    DecodeInstruction(hex_buffer, sizeof(hex_buffer), human_buffer,
+                      sizeof(human_buffer), &instruction_length, code, &object,
+                      pc);
+    formatter->ConsumeInstruction(code, hex_buffer, sizeof(hex_buffer),
+                                  human_buffer, sizeof(human_buffer), object,
                                   pc);
     pc += instruction_length;
   }
 }
 
 
-void Disassembler::DisassembleCodeHelper(
-    const char* function_fullname, const Code& code, bool optimized) {
+void Disassembler::DisassembleCodeHelper(const char* function_fullname,
+                                         const Code& code,
+                                         bool optimized) {
   LocalVarDescriptors& var_descriptors = LocalVarDescriptors::Handle();
   if (FLAG_print_variable_descriptors) {
     var_descriptors = code.GetLocalVarDescriptors();
   }
-  THR_Print("Code for %sfunction '%s' {\n",
-            optimized ? "optimized " : "",
+  THR_Print("Code for %sfunction '%s' {\n", optimized ? "optimized " : "",
             function_fullname);
   code.Disassemble();
   THR_Print("}\n");
@@ -182,8 +176,8 @@
   for (intptr_t i = code.pointer_offsets_length() - 1; i >= 0; i--) {
     const uword addr = code.GetPointerOffsetAt(i) + code.PayloadStart();
     obj = *reinterpret_cast<RawObject**>(addr);
-    THR_Print(" %d : %#" Px " '%s'\n",
-              code.GetPointerOffsetAt(i), addr, obj.ToCString());
+    THR_Print(" %d : %#" Px " '%s'\n", code.GetPointerOffsetAt(i), addr,
+              obj.ToCString());
   }
   THR_Print("}\n");
 #else
@@ -212,12 +206,10 @@
       const intptr_t reason =
           DeoptTable::ReasonField::decode(reason_and_flags.Value());
       ASSERT((0 <= reason) && (reason < ICData::kDeoptNumReasons));
-      THR_Print("%4" Pd ": 0x%" Px "  %s  (%s)\n",
-                i,
-                start + offset.Value(),
-                DeoptInfo::ToCString(deopt_table, info),
-                DeoptReasonToCString(
-                    static_cast<ICData::DeoptReasonId>(reason)));
+      THR_Print(
+          "%4" Pd ": 0x%" Px "  %s  (%s)\n", i, start + offset.Value(),
+          DeoptInfo::ToCString(deopt_table, info),
+          DeoptReasonToCString(static_cast<ICData::DeoptReasonId>(reason)));
     }
     THR_Print("}\n");
   }
@@ -234,8 +226,7 @@
   THR_Print("}\n");
 
   if (FLAG_print_variable_descriptors) {
-    THR_Print("Variable Descriptors for function '%s' {\n",
-              function_fullname);
+    THR_Print("Variable Descriptors for function '%s' {\n", function_fullname);
     intptr_t var_desc_length =
         var_descriptors.IsNull() ? 0 : var_descriptors.Length();
     String& var_name = String::Handle();
@@ -249,17 +240,17 @@
       } else {
         if (kind == RawLocalVarDescriptors::kContextLevel) {
           THR_Print("  context level %d scope %d", var_info.index(),
-              var_info.scope_id);
+                    var_info.scope_id);
         } else if (kind == RawLocalVarDescriptors::kStackVar) {
-          THR_Print("  stack var '%s' offset %d",
-            var_name.ToCString(), var_info.index());
+          THR_Print("  stack var '%s' offset %d", var_name.ToCString(),
+                    var_info.index());
         } else {
           ASSERT(kind == RawLocalVarDescriptors::kContextVar);
           THR_Print("  context var '%s' level %d offset %d",
-              var_name.ToCString(), var_info.scope_id, var_info.index());
+                    var_name.ToCString(), var_info.scope_id, var_info.index());
         }
         THR_Print(" (valid %s-%s)\n", var_info.begin_pos.ToCString(),
-                                      var_info.end_pos.ToCString());
+                  var_info.end_pos.ToCString());
       }
     }
     THR_Print("}\n");
@@ -267,7 +258,7 @@
 
   THR_Print("Exception Handlers for function '%s' {\n", function_fullname);
   const ExceptionHandlers& handlers =
-        ExceptionHandlers::Handle(code.exception_handlers());
+      ExceptionHandlers::Handle(code.exception_handlers());
   THR_Print("%s}\n", handlers.ToCString());
 
   {
@@ -277,7 +268,7 @@
     Function& function = Function::Handle();
     Code& code = Code::Handle();
     for (intptr_t i = 0; i < table.Length();
-        i += Code::kSCallTableEntryLength) {
+         i += Code::kSCallTableEntryLength) {
       offset ^= table.At(i + Code::kSCallTableOffsetEntry);
       function ^= table.At(i + Code::kSCallTableFunctionEntry);
       code ^= table.At(i + Code::kSCallTableCodeEntry);
@@ -285,21 +276,15 @@
         Class& cls = Class::Handle();
         cls ^= code.owner();
         if (cls.IsNull()) {
-          THR_Print("  0x%" Px ": %s, %p\n",
-              start + offset.Value(),
-              code.Name(),
-              code.raw());
+          THR_Print("  0x%" Px ": %s, %p\n", start + offset.Value(),
+                    code.Name(), code.raw());
         } else {
           THR_Print("  0x%" Px ": allocation stub for %s, %p\n",
-              start + offset.Value(),
-              cls.ToCString(),
-              code.raw());
+                    start + offset.Value(), cls.ToCString(), code.raw());
         }
       } else {
-        THR_Print("  0x%" Px ": %s, %p\n",
-            start + offset.Value(),
-            function.ToFullyQualifiedCString(),
-            code.raw());
+        THR_Print("  0x%" Px ": %s, %p\n", start + offset.Value(),
+                  function.ToFullyQualifiedCString(), code.raw());
       }
     }
     THR_Print("}\n");
@@ -317,8 +302,8 @@
 }
 
 
-void Disassembler::DisassembleCodeUnoptimized(
-    const Function& function, bool optimized) {
+void Disassembler::DisassembleCodeUnoptimized(const Function& function,
+                                              bool optimized) {
   const char* function_fullname = function.ToFullyQualifiedCString();
   const Code& code = Code::Handle(function.unoptimized_code());
   DisassembleCodeHelper(function_fullname, code, optimized);
diff --git a/runtime/vm/disassembler.h b/runtime/vm/disassembler.h
index e26a214..283f16e 100644
--- a/runtime/vm/disassembler.h
+++ b/runtime/vm/disassembler.h
@@ -20,8 +20,8 @@
 // disassembled instructions in any desired form.
 class DisassemblyFormatter {
  public:
-  DisassemblyFormatter() { }
-  virtual ~DisassemblyFormatter() { }
+  DisassemblyFormatter() {}
+  virtual ~DisassemblyFormatter() {}
 
   // Consume the decoded instruction at the given pc.
   virtual void ConsumeInstruction(const Code& code,
@@ -41,8 +41,8 @@
 // to stdout.
 class DisassembleToStdout : public DisassemblyFormatter {
  public:
-  DisassembleToStdout() : DisassemblyFormatter() { }
-  ~DisassembleToStdout() { }
+  DisassembleToStdout() : DisassemblyFormatter() {}
+  ~DisassembleToStdout() {}
 
   virtual void ConsumeInstruction(const Code& code,
                                   char* hex_buffer,
@@ -64,8 +64,8 @@
 class DisassembleToJSONStream : public DisassemblyFormatter {
  public:
   explicit DisassembleToJSONStream(const JSONArray& jsarr)
-      : DisassemblyFormatter(), jsarr_(jsarr) { }
-  ~DisassembleToJSONStream() { }
+      : DisassemblyFormatter(), jsarr_(jsarr) {}
+  ~DisassembleToJSONStream() {}
 
   virtual void ConsumeInstruction(const Code& code,
                                   char* hex_buffer,
@@ -101,9 +101,7 @@
     Disassemble(start, end, formatter, Code::Handle());
   }
 
-  static void Disassemble(uword start,
-                          uword end,
-                          const Code& code) {
+  static void Disassemble(uword start, uword end, const Code& code) {
     DisassembleToStdout stdout_formatter;
     LogBlock lb;
     Disassemble(start, end, &stdout_formatter, code);
@@ -119,18 +117,23 @@
   // Writes a hexadecimal representation into the hex_buffer and a
   // human-readable representation into the human_buffer.
   // Writes the length of the decoded instruction in bytes in out_instr_len.
-  static void DecodeInstruction(char* hex_buffer, intptr_t hex_size,
-                                char* human_buffer, intptr_t human_size,
-                                int* out_instr_len, const Code& code,
-                                Object** object, uword pc);
+  static void DecodeInstruction(char* hex_buffer,
+                                intptr_t hex_size,
+                                char* human_buffer,
+                                intptr_t human_size,
+                                int* out_instr_len,
+                                const Code& code,
+                                Object** object,
+                                uword pc);
 
   static void DisassembleCode(const Function& function, bool optimized);
-  static void DisassembleCodeUnoptimized(
-      const Function& function, bool optimized);
+  static void DisassembleCodeUnoptimized(const Function& function,
+                                         bool optimized);
 
  private:
-  static void DisassembleCodeHelper(
-      const char* function_fullname, const Code& code, bool optimized);
+  static void DisassembleCodeHelper(const char* function_fullname,
+                                    const Code& code,
+                                    bool optimized);
 
   static const int kHexadecimalBufferSize = 32;
   static const int kUserReadableBufferSize = 256;
diff --git a/runtime/vm/disassembler_arm.cc b/runtime/vm/disassembler_arm.cc
index 6419c08..8c6d5fd 100644
--- a/runtime/vm/disassembler_arm.cc
+++ b/runtime/vm/disassembler_arm.cc
@@ -17,9 +17,7 @@
 class ARMDecoder : public ValueObject {
  public:
   ARMDecoder(char* buffer, size_t buffer_size)
-      : buffer_(buffer),
-        buffer_size_(buffer_size),
-        buffer_pos_(0) {
+      : buffer_(buffer), buffer_size_(buffer_size), buffer_pos_(0) {
     buffer_[buffer_pos_] = '\0';
   }
 
@@ -71,9 +69,9 @@
   char* current_position_in_buffer() { return buffer_ + buffer_pos_; }
   size_t remaining_size_in_buffer() { return buffer_size_ - buffer_pos_; }
 
-  char* buffer_;  // Decode instructions into this buffer.
+  char* buffer_;        // Decode instructions into this buffer.
   size_t buffer_size_;  // The size of the character buffer.
-  size_t buffer_pos_;  // Current character position in buffer.
+  size_t buffer_pos_;   // Current character position in buffer.
 
   DISALLOW_ALLOCATION();
   DISALLOW_COPY_AND_ASSIGN(ARMDecoder);
@@ -81,7 +79,7 @@
 
 
 // Support for assertions in the ARMDecoder formatting functions.
-#define STRING_STARTS_WITH(string, compare_string) \
+#define STRING_STARTS_WITH(string, compare_string)                             \
   (strncmp(string, compare_string, strlen(compare_string)) == 0)
 
 
@@ -99,8 +97,8 @@
 // These condition names are defined in a way to match the native disassembler
 // formatting. See for example the command "objdump -d <binary file>".
 static const char* cond_names[kMaxCondition] = {
-  "eq", "ne", "cs" , "cc" , "mi" , "pl" , "vs" , "vc" ,
-  "hi", "ls", "ge", "lt", "gt", "le", "", "invalid",
+    "eq", "ne", "cs", "cc", "mi", "pl", "vs", "vc",
+    "hi", "ls", "ge", "lt", "gt", "le", "",   "invalid",
 };
 
 
@@ -115,11 +113,11 @@
 // See for example the command "objdump -d <binary file>".
 static const char* reg_names[kNumberOfCpuRegisters] = {
 #if defined(TARGET_ABI_IOS)
-  "r0", "r1", "r2", "r3", "r4", "pp", "r6", "fp",
-  "r8", "r9", "thr", "r11", "ip", "sp", "lr", "pc",
+    "r0", "r1", "r2",  "r3",  "r4", "pp", "r6", "fp",
+    "r8", "r9", "thr", "r11", "ip", "sp", "lr", "pc",
 #elif defined(TARGET_ABI_EABI)
-  "r0", "r1", "r2", "r3", "r4", "pp", "r6", "r7",
-  "r8", "r9", "thr", "fp", "ip", "sp", "lr", "pc",
+    "r0", "r1", "r2",  "r3", "r4", "pp", "r6", "r7",
+    "r8", "r9", "thr", "fp", "ip", "sp", "lr", "pc",
 #else
 #error Unknown ABI
 #endif
@@ -138,8 +136,7 @@
   ASSERT(0 <= reg);
   ASSERT(reg < kNumberOfSRegisters);
   buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                             remaining_size_in_buffer(),
-                             "s%d", reg);
+                             remaining_size_in_buffer(), "s%d", reg);
 }
 
 
@@ -147,8 +144,7 @@
   ASSERT(0 <= reg);
   ASSERT(reg < kNumberOfDRegisters);
   buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                             remaining_size_in_buffer(),
-                             "d%d", reg);
+                             remaining_size_in_buffer(), "d%d", reg);
 }
 
 
@@ -156,16 +152,13 @@
   ASSERT(0 <= reg);
   ASSERT(reg < kNumberOfQRegisters);
   buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                             remaining_size_in_buffer(),
-                             "q%d", reg);
+                             remaining_size_in_buffer(), "q%d", reg);
 }
 
 
 // These shift names are defined in a way to match the native disassembler
 // formatting. See for example the command "objdump -d <binary file>".
-static const char* shift_names[kMaxShift] = {
-  "lsl", "lsr", "asr", "ror"
-};
+static const char* shift_names[kMaxShift] = {"lsl", "lsr", "asr", "ror"};
 
 
 // Print the register shift operands for the instruction. Generally used for
@@ -189,18 +182,15 @@
     } else if (((shift == LSR) || (shift == ASR)) && (shift_amount == 0)) {
       shift_amount = 32;
     }
-    buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                               remaining_size_in_buffer(),
-                               ", %s #%d",
-                               shift_names[shift],
-                               shift_amount);
+    buffer_pos_ +=
+        OS::SNPrint(current_position_in_buffer(), remaining_size_in_buffer(),
+                    ", %s #%d", shift_names[shift], shift_amount);
   } else {
     // by register
     int rs = instr->RsField();
-    buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                               remaining_size_in_buffer(),
-                              ", %s ",
-                              shift_names[shift]);
+    buffer_pos_ +=
+        OS::SNPrint(current_position_in_buffer(), remaining_size_in_buffer(),
+                    ", %s ", shift_names[shift]);
     PrintRegister(rs);
   }
 }
@@ -213,9 +203,7 @@
   int immed8 = instr->Immed8Field();
   int imm = (immed8 >> rotate) | (immed8 << (32 - rotate));
   buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                             remaining_size_in_buffer(),
-                             "#%d",
-                             imm);
+                             remaining_size_in_buffer(), "#%d", imm);
 }
 
 
@@ -437,10 +425,9 @@
         ASSERT(STRING_STARTS_WITH(format, "dest"));
         int off = (instr->SImmed24Field() << 2) + 8;
         uword destination = reinterpret_cast<uword>(instr) + off;
-        buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                                   remaining_size_in_buffer(),
-                                   "%#" Px "",
-                                   destination);
+        buffer_pos_ +=
+            OS::SNPrint(current_position_in_buffer(),
+                        remaining_size_in_buffer(), "%#" Px "", destination);
         return 4;
       } else {
         return FormatDRegister(instr, format);
@@ -454,15 +441,13 @@
       if (format[3] == 'f') {
         ASSERT(STRING_STARTS_WITH(format, "immf"));
         buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                                   remaining_size_in_buffer(),
-                                   "%f",
+                                   remaining_size_in_buffer(), "%f",
                                    instr->ImmFloatField());
         return 4;
       } else if (format[3] == 'd') {
         ASSERT(STRING_STARTS_WITH(format, "immd"));
         buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                                   remaining_size_in_buffer(),
-                                   "%g",
+                                   remaining_size_in_buffer(), "%g",
                                    instr->ImmDoubleField());
         return 4;
       } else if (format[3] == '1') {
@@ -474,13 +459,14 @@
           ASSERT(STRING_STARTS_WITH(format, "imm4_vdup"));
           int32_t idx = -1;
           int32_t imm4 = instr->Bits(16, 4);
-          if ((imm4 & 1) != 0) idx = imm4 >> 1;
-          else if ((imm4 & 2) != 0) idx = imm4 >> 2;
-          else if ((imm4 & 4) != 0) idx = imm4 >> 3;
+          if ((imm4 & 1) != 0)
+            idx = imm4 >> 1;
+          else if ((imm4 & 2) != 0)
+            idx = imm4 >> 2;
+          else if ((imm4 & 4) != 0)
+            idx = imm4 >> 3;
           buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                                     remaining_size_in_buffer(),
-                                     "%d",
-                                     idx);
+                                     remaining_size_in_buffer(), "%d", idx);
           return 9;
         } else {
           ASSERT(STRING_STARTS_WITH(format, "imm4_12"));
@@ -488,9 +474,7 @@
         }
       }
       buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                                 remaining_size_in_buffer(),
-                                 "0x%x",
-                                 immed16);
+                                 remaining_size_in_buffer(), "0x%x", immed16);
       return 7;
     }
     case 'l': {  // 'l: branch and link
@@ -515,15 +499,13 @@
         if (format[4] == '0') {
           // 'off10: 10-bit offset for VFP load and store instructions
           buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                                     remaining_size_in_buffer(),
-                                     "%d",
+                                     remaining_size_in_buffer(), "%d",
                                      instr->Bits(0, 8) << 2);
         } else {
           // 'off12: 12-bit offset for load and store instructions.
           ASSERT(STRING_STARTS_WITH(format, "off12"));
           buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                                     remaining_size_in_buffer(),
-                                     "%d",
+                                     remaining_size_in_buffer(), "%d",
                                      instr->Offset12Field());
         }
         return 5;
@@ -532,9 +514,7 @@
       ASSERT(STRING_STARTS_WITH(format, "off8"));
       int offs8 = (instr->ImmedHField() << 4) | instr->ImmedLField();
       buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                                 remaining_size_in_buffer(),
-                                 "%d",
-                                 offs8);
+                                 remaining_size_in_buffer(), "%d", offs8);
       return 4;
     }
     case 'p': {  // 'pu: P and U bits for load and store instructions.
@@ -546,7 +526,7 @@
       return FormatRegister(instr, format);
     }
     case 's': {
-      if (format[1] == 'h') {  // 'shift_op or 'shift_rm
+      if (format[1] == 'h') {    // 'shift_op or 'shift_rm
         if (format[6] == 'o') {  // 'shift_op
           ASSERT(STRING_STARTS_WITH(format, "shift_op"));
           if (instr->TypeField() == 0) {
@@ -563,26 +543,33 @@
         }
       } else if (format[1] == 'v') {  // 'svc
         ASSERT(STRING_STARTS_WITH(format, "svc"));
-        buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                                   remaining_size_in_buffer(),
-                                   "0x%x",
-                                   instr->SvcField());
+        buffer_pos_ +=
+            OS::SNPrint(current_position_in_buffer(),
+                        remaining_size_in_buffer(), "0x%x", instr->SvcField());
         return 3;
       } else if (format[1] == 'z') {
         // 'sz: Size field of SIMD instructions.
         int sz = instr->Bits(20, 2);
         char const* sz_str;
         switch (sz) {
-          case 0: sz_str = "b"; break;
-          case 1: sz_str = "h"; break;
-          case 2: sz_str = "w"; break;
-          case 3: sz_str = "l"; break;
-          default: sz_str = "?"; break;
+          case 0:
+            sz_str = "b";
+            break;
+          case 1:
+            sz_str = "h";
+            break;
+          case 2:
+            sz_str = "w";
+            break;
+          case 3:
+            sz_str = "l";
+            break;
+          default:
+            sz_str = "?";
+            break;
         }
         buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                                   remaining_size_in_buffer(),
-                                   "%s",
-                                   sz_str);
+                                   remaining_size_in_buffer(), "%s", sz_str);
         return 2;
       } else if (format[1] == ' ') {
         // 's: S field of data processing instructions.
@@ -598,9 +585,7 @@
       ASSERT(STRING_STARTS_WITH(format, "target"));
       int off = (instr->SImmed24Field() << 2) + 8;
       buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                                 remaining_size_in_buffer(),
-                                 "%+d",
-                                 off);
+                                 remaining_size_in_buffer(), "%+d", off);
       return 6;
     }
     case 'u': {  // 'u: signed or unsigned multiplies.
@@ -654,7 +639,7 @@
     }
     cur = *format++;
   }
-  buffer_[buffer_pos_]  = '\0';
+  buffer_[buffer_pos_] = '\0';
 }
 
 
@@ -695,13 +680,12 @@
             if (instr->BkptField() == Instr::kStopMessageCode) {
               const char* message = *reinterpret_cast<const char**>(
                   reinterpret_cast<intptr_t>(instr) - Instr::kInstrSize);
-              buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                                         remaining_size_in_buffer(),
-                                         " ; \"%s\"",
-                                         message);
+              buffer_pos_ +=
+                  OS::SNPrint(current_position_in_buffer(),
+                              remaining_size_in_buffer(), " ; \"%s\"", message);
             }
           } else {
-             // Format(instr, "smc'cond");
+            // Format(instr, "smc'cond");
             Unknown(instr);  // Not used.
           }
           break;
@@ -1064,7 +1048,7 @@
         Format(instr, "vmovdrr'cond 'dm, 'rd, 'rn");
       }
     }
-  } else if (instr-> IsVFPLoadStore()) {
+  } else if (instr->IsVFPLoadStore()) {
     if (instr->Bit(8) == 0) {
       if (instr->Bit(20) == 1) {  // vldrs
         if (instr->Bit(23) == 1) {
@@ -1095,13 +1079,13 @@
       }
     }
   } else if (instr->IsVFPMultipleLoadStore()) {
-    if (instr->HasL()) {  // vldm
+    if (instr->HasL()) {    // vldm
       if (instr->Bit(8)) {  // vldmd
         Format(instr, "vldmd'cond'pu 'rn'w, 'dlist");
       } else {  // vldms
         Format(instr, "vldms'cond'pu 'rn'w, 'slist");
       }
-    } else {  // vstm
+    } else {                // vstm
       if (instr->Bit(8)) {  // vstmd
         Format(instr, "vstmd'cond'pu 'rn'w, 'dlist");
       } else {  // vstms
@@ -1174,7 +1158,7 @@
           }
           break;
         }
-        case 0xb: {  // Other VFP data-processing instructions
+        case 0xb: {                  // Other VFP data-processing instructions
           if (instr->Bit(6) == 0) {  // vmov immediate
             if (instr->Bit(8) == 0) {
               Format(instr, "vmovs'cond 'sd, #'immf");
@@ -1234,8 +1218,8 @@
               }
               break;
             }
-            case 4:  // vcmp, vcmpe
-            case 5: {  // vcmp #0.0, vcmpe #0.0
+            case 4:                      // vcmp, vcmpe
+            case 5: {                    // vcmp #0.0, vcmpe #0.0
               if (instr->Bit(7) == 1) {  // vcmpe
                 Unknown(instr);
               } else {
@@ -1301,9 +1285,9 @@
               }
               break;
             }
-            case 2:  // vcvtb, vcvtt
-            case 3:  // vcvtb, vcvtt
-            case 9:  // undefined
+            case 2:   // vcvtb, vcvtt
+            case 3:   // vcvtb, vcvtt
+            case 9:   // undefined
             case 10:  // vcvt between floating-point and fixed-point
             case 11:  // vcvt between floating-point and fixed-point
             case 14:  // vcvt between floating-point and fixed-point
@@ -1313,8 +1297,7 @@
               break;
             }
           }
-        }
-        break;
+        } break;
       }
     } else {
       // 8, 16, or 32-bit Transfer between ARM Core and VFP
@@ -1532,10 +1515,14 @@
 }
 
 
-void Disassembler::DecodeInstruction(char* hex_buffer, intptr_t hex_size,
-                                     char* human_buffer, intptr_t human_size,
-                                     int* out_instr_size, const Code& code,
-                                     Object** object, uword pc) {
+void Disassembler::DecodeInstruction(char* hex_buffer,
+                                     intptr_t hex_size,
+                                     char* human_buffer,
+                                     intptr_t human_size,
+                                     int* out_instr_size,
+                                     const Code& code,
+                                     Object** object,
+                                     uword pc) {
   ARMDecoder decoder(human_buffer, human_size);
   decoder.InstructionDecode(pc);
   int32_t instruction_bits = Instr::At(pc)->InstructionBits();
diff --git a/runtime/vm/disassembler_arm64.cc b/runtime/vm/disassembler_arm64.cc
index 6bbc3c7..448fda3 100644
--- a/runtime/vm/disassembler_arm64.cc
+++ b/runtime/vm/disassembler_arm64.cc
@@ -16,9 +16,7 @@
 class ARM64Decoder : public ValueObject {
  public:
   ARM64Decoder(char* buffer, size_t buffer_size)
-      : buffer_(buffer),
-        buffer_size_(buffer_size),
-        buffer_pos_(0) {
+      : buffer_(buffer), buffer_size_(buffer_size), buffer_pos_(0) {
     buffer_[buffer_pos_] = '\0';
   }
 
@@ -43,16 +41,15 @@
 
   // Handle formatting of instructions and their options.
   int FormatRegister(Instr* instr, const char* option);
-  int FormatVRegister(Instr*instr, const char* option);
+  int FormatVRegister(Instr* instr, const char* option);
   int FormatOption(Instr* instr, const char* format);
   void Format(Instr* instr, const char* format);
   void Unknown(Instr* instr);
 
-  // Decode instructions.
-  #define DECODE_OP(op)                                                        \
-    void Decode##op(Instr* instr);
+// Decode instructions.
+#define DECODE_OP(op) void Decode##op(Instr* instr);
   APPLY_OP_LIST(DECODE_OP)
-  #undef DECODE_OP
+#undef DECODE_OP
 
 
   // Convenience functions.
@@ -60,9 +57,9 @@
   char* current_position_in_buffer() { return buffer_ + buffer_pos_; }
   size_t remaining_size_in_buffer() { return buffer_size_ - buffer_pos_; }
 
-  char* buffer_;  // Decode instructions into this buffer.
+  char* buffer_;        // Decode instructions into this buffer.
   size_t buffer_size_;  // The size of the character buffer.
-  size_t buffer_pos_;  // Current character position in buffer.
+  size_t buffer_pos_;   // Current character position in buffer.
 
   DISALLOW_ALLOCATION();
   DISALLOW_COPY_AND_ASSIGN(ARM64Decoder);
@@ -70,7 +67,7 @@
 
 
 // Support for assertions in the ARM64Decoder formatting functions.
-#define STRING_STARTS_WITH(string, compare_string) \
+#define STRING_STARTS_WITH(string, compare_string)                             \
   (strncmp(string, compare_string, strlen(compare_string)) == 0)
 
 
@@ -89,10 +86,9 @@
 // formatting, except for register aliases ctx (r9), pp (r10) and sp (r19).
 // See for example the command "objdump -d <binary file>".
 static const char* reg_names[kNumberOfCpuRegisters] = {
-  "r0",  "r1",  "r2",  "r3",  "r4",  "r5",  "r6",  "r7",
-  "r8",  "r9",  "r10", "r11", "r12", "r13", "r14", "r15",
-  "ip0", "ip1", "r18", "sp",  "r20", "r21", "r22", "r23",
-  "r24", "r25", "thr", "pp",  "ctx", "fp",  "lr",  "r31",
+    "r0",  "r1",  "r2",  "r3",  "r4",  "r5",  "r6",  "r7",  "r8", "r9",  "r10",
+    "r11", "r12", "r13", "r14", "r15", "ip0", "ip1", "r18", "sp", "r20", "r21",
+    "r22", "r23", "r24", "r25", "thr", "pp",  "ctx", "fp",  "lr", "r31",
 };
 
 
@@ -113,29 +109,25 @@
   ASSERT(0 <= reg);
   ASSERT(reg < kNumberOfVRegisters);
   buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                             remaining_size_in_buffer(),
-                             "v%d", reg);
+                             remaining_size_in_buffer(), "v%d", reg);
 }
 
 
 // These shift names are defined in a way to match the native disassembler
 // formatting. See for example the command "objdump -d <binary file>".
-static const char* shift_names[kMaxShift] = {
-  "lsl", "lsr", "asr", "ror"
-};
+static const char* shift_names[kMaxShift] = {"lsl", "lsr", "asr", "ror"};
 
 
 static const char* extend_names[kMaxExtend] = {
-  "uxtb", "uxth", "uxtw", "uxtx",
-  "sxtb", "sxth", "sxtw", "sxtx",
+    "uxtb", "uxth", "uxtw", "uxtx", "sxtb", "sxth", "sxtw", "sxtx",
 };
 
 
 // These condition names are defined in a way to match the native disassembler
 // formatting. See for example the command "objdump -d <binary file>".
 static const char* cond_names[kMaxCondition] = {
-  "eq", "ne", "cs" , "cc" , "mi" , "pl" , "vs" , "vc" ,
-  "hi", "ls", "ge", "lt", "gt", "le", "", "invalid",
+    "eq", "ne", "cs", "cc", "mi", "pl", "vs", "vc",
+    "hi", "ls", "ge", "lt", "gt", "le", "",   "invalid",
 };
 
 
@@ -172,25 +164,21 @@
     } else if (((shift == LSR) || (shift == ASR)) && (shift_amount == 0)) {
       shift_amount = 32;
     }
-    buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                               remaining_size_in_buffer(),
-                               " %s #%d",
-                               shift_names[shift],
-                               shift_amount);
+    buffer_pos_ +=
+        OS::SNPrint(current_position_in_buffer(), remaining_size_in_buffer(),
+                    " %s #%d", shift_names[shift], shift_amount);
   } else {
     ASSERT(instr->IsExtend());
     // by register
-    buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                               remaining_size_in_buffer(),
-                               " %s",
-                               extend_names[extend]);
+    buffer_pos_ +=
+        OS::SNPrint(current_position_in_buffer(), remaining_size_in_buffer(),
+                    " %s", extend_names[extend]);
     if (((instr->SFField() == 1) && (extend == UXTX)) ||
         ((instr->SFField() == 0) && (extend == UXTW))) {
       // Shift amount.
-      buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                                 remaining_size_in_buffer(),
-                                 " %d",
-                                 extend_shift_amount);
+      buffer_pos_ +=
+          OS::SNPrint(current_position_in_buffer(), remaining_size_in_buffer(),
+                      " %d", extend_shift_amount);
     }
   }
 }
@@ -207,9 +195,7 @@
     PrintRegister(rn, R31IsSP);
     if (off != 0) {
       buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                                 remaining_size_in_buffer(),
-                                 ", #%d",
-                                 off);
+                                 remaining_size_in_buffer(), ", #%d", off);
     }
     Print("]");
   } else {
@@ -220,9 +206,7 @@
         Print("[");
         PrintRegister(rn, R31IsSP);
         buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                                   remaining_size_in_buffer(),
-                                   ", #%d",
-                                   imm9);
+                                   remaining_size_in_buffer(), ", #%d", imm9);
         Print("]");
         break;
       }
@@ -233,9 +217,7 @@
         PrintRegister(rn, R31IsSP);
         Print("]");
         buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                                   remaining_size_in_buffer(),
-                                   ", #%d !",
-                                   imm9);
+                                   remaining_size_in_buffer(), ", #%d !", imm9);
         break;
       }
       case 2: {
@@ -246,10 +228,9 @@
         PrintRegister(rn, R31IsSP);
         Print(", ");
         PrintRegister(rm, R31IsZR);
-        buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                                   remaining_size_in_buffer(),
-                                   " %s",
-                                   extend_names[ext]);
+        buffer_pos_ +=
+            OS::SNPrint(current_position_in_buffer(),
+                        remaining_size_in_buffer(), " %s", extend_names[ext]);
         if (s == 1) {
           Print(" scaled");
         }
@@ -262,15 +243,11 @@
         Print("[");
         PrintRegister(rn, R31IsSP);
         buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                                   remaining_size_in_buffer(),
-                                   ", #%d",
-                                   imm9);
+                                   remaining_size_in_buffer(), ", #%d", imm9);
         Print("] !");
         break;
       }
-      default: {
-        Print("???");
-      }
+      default: { Print("???"); }
     }
   }
 }
@@ -285,24 +262,20 @@
   switch (instr->Bits(23, 3)) {
     case 1:
       // rn + (imm7 << (2 + B31)), post-index, writeback.
-      buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                                 remaining_size_in_buffer(),
-                                 "], #%d !",
-                                 offset);
+      buffer_pos_ +=
+          OS::SNPrint(current_position_in_buffer(), remaining_size_in_buffer(),
+                      "], #%d !", offset);
       break;
     case 2:
       // rn + (imm7 << (2 + B31)), pre-index, no writeback.
       buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                                 remaining_size_in_buffer(),
-                                 ", #%d ]",
-                                 offset);
+                                 remaining_size_in_buffer(), ", #%d ]", offset);
       break;
     case 3:
       // rn + (imm7 << (2 + B31)), pre-index, writeback.
-      buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                                 remaining_size_in_buffer(),
-                                 ", #%d ]!",
-                                 offset);
+      buffer_pos_ +=
+          OS::SNPrint(current_position_in_buffer(), remaining_size_in_buffer(),
+                      ", #%d ]!", offset);
       break;
     default:
       Print(", ???]");
@@ -381,17 +354,13 @@
         ASSERT(STRING_STARTS_WITH(format, "bitimm"));
         const uint64_t imm = instr->ImmLogical();
         buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                                   remaining_size_in_buffer(),
-                                   "0x%" Px64,
-                                   imm);
+                                   remaining_size_in_buffer(), "0x%" Px64, imm);
         return 6;
       } else {
         ASSERT(STRING_STARTS_WITH(format, "bitpos"));
         int bitpos = instr->Bits(19, 4) | (instr->Bit(31) << 5);
         buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                                   remaining_size_in_buffer(),
-                                   "#%d",
-                                   bitpos);
+                                   remaining_size_in_buffer(), "#%d", bitpos);
         return 6;
       }
     }
@@ -410,9 +379,7 @@
           typ = "d";
         }
         buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                                   remaining_size_in_buffer(),
-                                   "%s",
-                                   typ);
+                                   remaining_size_in_buffer(), "%s", typ);
         return 3;
       } else {
         ASSERT(STRING_STARTS_WITH(format, "cond"));
@@ -425,52 +392,55 @@
         ASSERT(STRING_STARTS_WITH(format, "dest26"));
         int64_t off = instr->SImm26Field() << 2;
         uword destination = reinterpret_cast<uword>(instr) + off;
-        buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                                   remaining_size_in_buffer(),
-                                   "%#" Px "",
-                                   destination);
+        buffer_pos_ +=
+            OS::SNPrint(current_position_in_buffer(),
+                        remaining_size_in_buffer(), "%#" Px "", destination);
       } else {
         if (format[5] == '4') {
           ASSERT(STRING_STARTS_WITH(format, "dest14"));
           int64_t off = instr->SImm14Field() << 2;
           uword destination = reinterpret_cast<uword>(instr) + off;
-          buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                                     remaining_size_in_buffer(),
-                                     "%#" Px "",
-                                     destination);
+          buffer_pos_ +=
+              OS::SNPrint(current_position_in_buffer(),
+                          remaining_size_in_buffer(), "%#" Px "", destination);
         } else {
           ASSERT(STRING_STARTS_WITH(format, "dest19"));
           int64_t off = instr->SImm19Field() << 2;
           uword destination = reinterpret_cast<uword>(instr) + off;
-          buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                                     remaining_size_in_buffer(),
-                                     "%#" Px "",
-                                     destination);
+          buffer_pos_ +=
+              OS::SNPrint(current_position_in_buffer(),
+                          remaining_size_in_buffer(), "%#" Px "", destination);
         }
       }
       return 6;
     }
     case 'f': {
       ASSERT(STRING_STARTS_WITH(format, "fsz"));
-        const int sz = instr->SzField();
-        char const* sz_str;
-        switch (sz) {
-          case 0:
-            if (instr->Bit(23) == 1) {
-              sz_str = "q";
-            } else {
-              sz_str = "b";
-            }
-            break;
-          case 1: sz_str = "h"; break;
-          case 2: sz_str = "s"; break;
-          case 3: sz_str = "d"; break;
-          default: sz_str = "?"; break;
-        }
-        buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                                   remaining_size_in_buffer(),
-                                   "%s",
-                                   sz_str);
+      const int sz = instr->SzField();
+      char const* sz_str;
+      switch (sz) {
+        case 0:
+          if (instr->Bit(23) == 1) {
+            sz_str = "q";
+          } else {
+            sz_str = "b";
+          }
+          break;
+        case 1:
+          sz_str = "h";
+          break;
+        case 2:
+          sz_str = "s";
+          break;
+        case 3:
+          sz_str = "d";
+          break;
+        default:
+          sz_str = "?";
+          break;
+      }
+      buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
+                                 remaining_size_in_buffer(), "%s", sz_str);
       return 3;
     }
     case 'h': {
@@ -478,9 +448,7 @@
       const int shift = instr->HWField() << 4;
       if (shift != 0) {
         buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                                   remaining_size_in_buffer(),
-                                   "lsl %d",
-                                   shift);
+                                   remaining_size_in_buffer(), "lsl %d", shift);
       }
       return 2;
     }
@@ -509,9 +477,7 @@
           idx = imm >> (shift + 3);
         }
         buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                                   remaining_size_in_buffer(),
-                                   "[%d]",
-                                   idx);
+                                   remaining_size_in_buffer(), "[%d]", idx);
         return 4;
       } else if (format[3] == '1') {
         uint64_t imm;
@@ -533,18 +499,14 @@
           imm = instr->Imm16Field();
         }
         buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                                   remaining_size_in_buffer(),
-                                   "0x%" Px64,
-                                   imm);
+                                   remaining_size_in_buffer(), "0x%" Px64, imm);
         return ret;
       } else {
         ASSERT(STRING_STARTS_WITH(format, "immd"));
-        double dimm = bit_cast<double, int64_t>(
-            Instr::VFPExpandImm(instr->Imm8Field()));
+        double dimm =
+            bit_cast<double, int64_t>(Instr::VFPExpandImm(instr->Imm8Field()));
         buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                                   remaining_size_in_buffer(),
-                                   "%f",
-                                   dimm);
+                                   remaining_size_in_buffer(), "%f", dimm);
         return 4;
       }
     }
@@ -562,19 +524,17 @@
           const int64_t off = (immhi << 2) | immlo;
           const int64_t pc = reinterpret_cast<int64_t>(instr);
           const int64_t dest = pc + off;
-          buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                                     remaining_size_in_buffer(),
-                                     "0x%" Px64,
-                                     dest);
+          buffer_pos_ +=
+              OS::SNPrint(current_position_in_buffer(),
+                          remaining_size_in_buffer(), "0x%" Px64, dest);
         } else {
           ASSERT(STRING_STARTS_WITH(format, "pcldr"));
           const int64_t off = instr->SImm19Field() << 2;
           const int64_t pc = reinterpret_cast<int64_t>(instr);
           const int64_t dest = pc + off;
-          buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                                     remaining_size_in_buffer(),
-                                     "0x%" Px64,
-                                     dest);
+          buffer_pos_ +=
+              OS::SNPrint(current_position_in_buffer(),
+                          remaining_size_in_buffer(), "0x%" Px64, dest);
         }
         return 5;
       } else {
@@ -592,21 +552,31 @@
         char const* sz_str = NULL;
         if (instr->Bits(14, 2) == 3) {
           switch (instr->Bit(22)) {
-            case 0: sz_str = "s"; break;
-            case 1: sz_str = "d"; break;
-            default: UNREACHABLE(); break;
+            case 0:
+              sz_str = "s";
+              break;
+            case 1:
+              sz_str = "d";
+              break;
+            default:
+              UNREACHABLE();
+              break;
           }
         } else {
           switch (instr->Bit(22)) {
-            case 0: sz_str = "w"; break;
-            case 1: sz_str = "x"; break;
-            default: UNREACHABLE(); break;
+            case 0:
+              sz_str = "w";
+              break;
+            case 1:
+              sz_str = "x";
+              break;
+            default:
+              UNREACHABLE();
+              break;
           }
         }
         buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                                   remaining_size_in_buffer(),
-                                   "%s",
-                                   sz_str);
+                                   remaining_size_in_buffer(), "%s", sz_str);
         return 3;
       } else {
         return FormatVRegister(instr, format);
@@ -632,16 +602,24 @@
         const int sz = instr->SzField();
         char const* sz_str;
         switch (sz) {
-          case 0: sz_str = "b"; break;
-          case 1: sz_str = "h"; break;
-          case 2: sz_str = "w"; break;
-          case 3: sz_str = "x"; break;
-          default: sz_str = "?"; break;
+          case 0:
+            sz_str = "b";
+            break;
+          case 1:
+            sz_str = "h";
+            break;
+          case 2:
+            sz_str = "w";
+            break;
+          case 3:
+            sz_str = "x";
+            break;
+          default:
+            sz_str = "?";
+            break;
         }
         buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                                   remaining_size_in_buffer(),
-                                   "%s",
-                                   sz_str);
+                                   remaining_size_in_buffer(), "%s", sz_str);
         return 2;
       } else if (format[1] == ' ') {
         if (instr->HasS()) {
@@ -675,7 +653,7 @@
     }
     cur = *format++;
   }
-  buffer_[buffer_pos_]  = '\0';
+  buffer_[buffer_pos_] = '\0';
 }
 
 
@@ -748,9 +726,7 @@
 
 
 void ARM64Decoder::DecodeLoadStoreExclusive(Instr* instr) {
-  if ((instr->Bit(23) != 0) ||
-      (instr->Bit(21) != 0) ||
-      (instr->Bit(15) != 0)) {
+  if ((instr->Bit(23) != 0) || (instr->Bit(21) != 0) || (instr->Bit(15) != 0)) {
     Unknown(instr);
   }
   const int32_t size = instr->Bits(30, 2);
@@ -859,10 +835,9 @@
     if (instr->Imm16Field() == Instr::kStopMessageCode) {
       const char* message = *reinterpret_cast<const char**>(
           reinterpret_cast<intptr_t>(instr) - 2 * Instr::kInstrSize);
-      buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                                 remaining_size_in_buffer(),
-                                 " ; \"%s\"",
-                                 message);
+      buffer_pos_ +=
+          OS::SNPrint(current_position_in_buffer(), remaining_size_in_buffer(),
+                      " ; \"%s\"", message);
     }
   } else if ((instr->Bits(0, 2) == 0) && (instr->Bits(2, 3) == 0) &&
              (instr->Bits(21, 3) == 2)) {
@@ -1187,7 +1162,7 @@
     } else {
       Format(instr, "vmovrd 'rd, 'vn'idx5");
     }
-  } else if ((Q == 1)  && (op == 0) && (imm4 == 0)) {
+  } else if ((Q == 1) && (op == 0) && (imm4 == 0)) {
     Format(instr, "vdup'csz 'vd, 'vn'idx5");
   } else if ((Q == 1) && (op == 0) && (imm4 == 3)) {
     Format(instr, "vins'csz 'vd'idx5, 'rn");
@@ -1487,10 +1462,14 @@
 }
 
 
-void Disassembler::DecodeInstruction(char* hex_buffer, intptr_t hex_size,
-                                     char* human_buffer, intptr_t human_size,
-                                     int* out_instr_size, const Code& code,
-                                     Object** object, uword pc) {
+void Disassembler::DecodeInstruction(char* hex_buffer,
+                                     intptr_t hex_size,
+                                     char* human_buffer,
+                                     intptr_t human_size,
+                                     int* out_instr_size,
+                                     const Code& code,
+                                     Object** object,
+                                     uword pc) {
   ARM64Decoder decoder(human_buffer, human_size);
   decoder.InstructionDecode(pc);
   int32_t instruction_bits = Instr::At(pc)->InstructionBits();
diff --git a/runtime/vm/disassembler_dbc.cc b/runtime/vm/disassembler_dbc.cc
index a2095a0..3759bb9 100644
--- a/runtime/vm/disassembler_dbc.cc
+++ b/runtime/vm/disassembler_dbc.cc
@@ -195,9 +195,9 @@
 }
 
 
-#define BYTECODE_FORMATTER(name, encoding, op1, op2, op3)                     \
-  static void Format##name(char* buf, intptr_t size, uword pc, uint32_t op) { \
-    Format##encoding(buf, size, pc, op, Fmt##op1, Fmt##op2, Fmt##op3);        \
+#define BYTECODE_FORMATTER(name, encoding, op1, op2, op3)                      \
+  static void Format##name(char* buf, intptr_t size, uword pc, uint32_t op) {  \
+    Format##encoding(buf, size, pc, op, Fmt##op1, Fmt##op2, Fmt##op3);         \
   }
 BYTECODES_LIST(BYTECODE_FORMATTER)
 #undef BYTECODE_FORMATTER
diff --git a/runtime/vm/disassembler_ia32.cc b/runtime/vm/disassembler_ia32.cc
index d0252d3..004ed60 100644
--- a/runtime/vm/disassembler_ia32.cc
+++ b/runtime/vm/disassembler_ia32.cc
@@ -18,11 +18,7 @@
 #ifndef PRODUCT
 
 // Tables used for decoding of x86 instructions.
-enum OperandOrder {
-  UNSET_OP_ORDER = 0,
-  REG_OPER_OP_ORDER,
-  OPER_REG_OP_ORDER
-};
+enum OperandOrder { UNSET_OP_ORDER = 0, REG_OPER_OP_ORDER, OPER_REG_OP_ORDER };
 
 
 struct ByteMnemonic {
@@ -33,89 +29,60 @@
 
 
 static ByteMnemonic two_operands_instr[] = {
-  {0x01, "add", OPER_REG_OP_ORDER},
-  {0x03, "add", REG_OPER_OP_ORDER},
-  {0x09, "or", OPER_REG_OP_ORDER},
-  {0x0B, "or", REG_OPER_OP_ORDER},
-  {0x11, "adc", OPER_REG_OP_ORDER},
-  {0x13, "adc", REG_OPER_OP_ORDER},
-  {0x19, "sbb", OPER_REG_OP_ORDER},
-  {0x1B, "sbb", REG_OPER_OP_ORDER},
-  {0x21, "and", OPER_REG_OP_ORDER},
-  {0x23, "and", REG_OPER_OP_ORDER},
-  {0x29, "sub", OPER_REG_OP_ORDER},
-  {0x2B, "sub", REG_OPER_OP_ORDER},
-  {0x31, "xor", OPER_REG_OP_ORDER},
-  {0x33, "xor", REG_OPER_OP_ORDER},
-  {0x39, "cmp", OPER_REG_OP_ORDER},
-  {0x3B, "cmp", REG_OPER_OP_ORDER},
-  {0x85, "test", REG_OPER_OP_ORDER},
-  {0x87, "xchg", REG_OPER_OP_ORDER},
-  {0x8A, "mov_b", REG_OPER_OP_ORDER},
-  {0x8B, "mov", REG_OPER_OP_ORDER},
-  {0x8D, "lea", REG_OPER_OP_ORDER},
-  {-1, "", UNSET_OP_ORDER}
-};
+    {0x01, "add", OPER_REG_OP_ORDER},   {0x03, "add", REG_OPER_OP_ORDER},
+    {0x09, "or", OPER_REG_OP_ORDER},    {0x0B, "or", REG_OPER_OP_ORDER},
+    {0x11, "adc", OPER_REG_OP_ORDER},   {0x13, "adc", REG_OPER_OP_ORDER},
+    {0x19, "sbb", OPER_REG_OP_ORDER},   {0x1B, "sbb", REG_OPER_OP_ORDER},
+    {0x21, "and", OPER_REG_OP_ORDER},   {0x23, "and", REG_OPER_OP_ORDER},
+    {0x29, "sub", OPER_REG_OP_ORDER},   {0x2B, "sub", REG_OPER_OP_ORDER},
+    {0x31, "xor", OPER_REG_OP_ORDER},   {0x33, "xor", REG_OPER_OP_ORDER},
+    {0x39, "cmp", OPER_REG_OP_ORDER},   {0x3B, "cmp", REG_OPER_OP_ORDER},
+    {0x85, "test", REG_OPER_OP_ORDER},  {0x87, "xchg", REG_OPER_OP_ORDER},
+    {0x8A, "mov_b", REG_OPER_OP_ORDER}, {0x8B, "mov", REG_OPER_OP_ORDER},
+    {0x8D, "lea", REG_OPER_OP_ORDER},   {-1, "", UNSET_OP_ORDER}};
 
 
 static ByteMnemonic zero_operands_instr[] = {
-  {0xC3, "ret", UNSET_OP_ORDER},
-  {0xC9, "leave", UNSET_OP_ORDER},
-  {0x90, "nop", UNSET_OP_ORDER},
-  {0xF4, "hlt", UNSET_OP_ORDER},
-  {0xCC, "int3", UNSET_OP_ORDER},
-  {0x60, "pushad", UNSET_OP_ORDER},
-  {0x61, "popad", UNSET_OP_ORDER},
-  {0x9C, "pushfd", UNSET_OP_ORDER},
-  {0x9D, "popfd", UNSET_OP_ORDER},
-  {0x9E, "sahf", UNSET_OP_ORDER},
-  {0x99, "cdq", UNSET_OP_ORDER},
-  {0x9B, "fwait", UNSET_OP_ORDER},
-  {-1, "", UNSET_OP_ORDER}
-};
+    {0xC3, "ret", UNSET_OP_ORDER},   {0xC9, "leave", UNSET_OP_ORDER},
+    {0x90, "nop", UNSET_OP_ORDER},   {0xF4, "hlt", UNSET_OP_ORDER},
+    {0xCC, "int3", UNSET_OP_ORDER},  {0x60, "pushad", UNSET_OP_ORDER},
+    {0x61, "popad", UNSET_OP_ORDER}, {0x9C, "pushfd", UNSET_OP_ORDER},
+    {0x9D, "popfd", UNSET_OP_ORDER}, {0x9E, "sahf", UNSET_OP_ORDER},
+    {0x99, "cdq", UNSET_OP_ORDER},   {0x9B, "fwait", UNSET_OP_ORDER},
+    {-1, "", UNSET_OP_ORDER}};
 
 
-static ByteMnemonic call_jump_instr[] = {
-  {0xE8, "call", UNSET_OP_ORDER},
-  {0xE9, "jmp", UNSET_OP_ORDER},
-  {-1, "", UNSET_OP_ORDER}
-};
+static ByteMnemonic call_jump_instr[] = {{0xE8, "call", UNSET_OP_ORDER},
+                                         {0xE9, "jmp", UNSET_OP_ORDER},
+                                         {-1, "", UNSET_OP_ORDER}};
 
 
 static ByteMnemonic short_immediate_instr[] = {
-  {0x05, "add", UNSET_OP_ORDER},
-  {0x0D, "or", UNSET_OP_ORDER},
-  {0x15, "adc", UNSET_OP_ORDER},
-  {0x25, "and", UNSET_OP_ORDER},
-  {0x2D, "sub", UNSET_OP_ORDER},
-  {0x35, "xor", UNSET_OP_ORDER},
-  {0x3D, "cmp", UNSET_OP_ORDER},
-  {-1, "", UNSET_OP_ORDER}
-};
+    {0x05, "add", UNSET_OP_ORDER}, {0x0D, "or", UNSET_OP_ORDER},
+    {0x15, "adc", UNSET_OP_ORDER}, {0x25, "and", UNSET_OP_ORDER},
+    {0x2D, "sub", UNSET_OP_ORDER}, {0x35, "xor", UNSET_OP_ORDER},
+    {0x3D, "cmp", UNSET_OP_ORDER}, {-1, "", UNSET_OP_ORDER}};
 
 
 static const char* jump_conditional_mnem[] = {
-  /*0*/ "jo", "jno", "jc", "jnc",
-  /*4*/ "jz", "jnz", "jna", "ja",
-  /*8*/ "js", "jns", "jpe", "jpo",
-  /*12*/ "jl", "jnl", "jng", "jg"
-};
+    /*0*/ "jo",  "jno", "jc",  "jnc",
+    /*4*/ "jz",  "jnz", "jna", "ja",
+    /*8*/ "js",  "jns", "jpe", "jpo",
+    /*12*/ "jl", "jnl", "jng", "jg"};
 
 
 static const char* set_conditional_mnem[] = {
-  /*0*/ "seto", "setno", "setc", "setnc",
-  /*4*/ "setz", "setnz", "setna", "seta",
-  /*8*/ "sets", "setns", "setpe", "setpo",
-  /*12*/ "setl", "setnl", "setng", "setg"
-};
+    /*0*/ "seto",  "setno", "setc",  "setnc",
+    /*4*/ "setz",  "setnz", "setna", "seta",
+    /*8*/ "sets",  "setns", "setpe", "setpo",
+    /*12*/ "setl", "setnl", "setng", "setg"};
 
 
 static const char* conditional_move_mnem[] = {
-  /*0*/ "cmovo", "cmovno", "cmovc", "cmovnc",
-  /*4*/ "cmovz", "cmovnz", "cmovna", "cmova",
-  /*8*/ "cmovs", "cmovns", "cmovpe", "cmovpo",
-  /*12*/ "cmovl", "cmovnl", "cmovng", "cmovg"
-};
+    /*0*/ "cmovo",  "cmovno", "cmovc",  "cmovnc",
+    /*4*/ "cmovz",  "cmovnz", "cmovna", "cmova",
+    /*8*/ "cmovs",  "cmovns", "cmovpe", "cmovpo",
+    /*12*/ "cmovl", "cmovnl", "cmovng", "cmovg"};
 
 
 enum InstructionType {
@@ -228,43 +195,78 @@
 // Returns NULL if the instruction is not handled here.
 static const char* F0Mnem(uint8_t f0byte) {
   switch (f0byte) {
-    case 0x12: return "movhlps";
-    case 0x14: return "unpcklps";
-    case 0x15: return "unpckhps";
-    case 0x16: return "movlhps";
-    case 0xA2: return "cpuid";
-    case 0x31: return "rdtsc";
-    case 0xBE: return "movsx_b";
-    case 0xBF: return "movsx_w";
-    case 0xB6: return "movzx_b";
-    case 0xB7: return "movzx_w";
-    case 0xAF: return "imul";
+    case 0x12:
+      return "movhlps";
+    case 0x14:
+      return "unpcklps";
+    case 0x15:
+      return "unpckhps";
+    case 0x16:
+      return "movlhps";
+    case 0xA2:
+      return "cpuid";
+    case 0x31:
+      return "rdtsc";
+    case 0xBE:
+      return "movsx_b";
+    case 0xBF:
+      return "movsx_w";
+    case 0xB6:
+      return "movzx_b";
+    case 0xB7:
+      return "movzx_w";
+    case 0xAF:
+      return "imul";
     case 0xA4:  // Fall through.
-    case 0xA5: return "shld";
+    case 0xA5:
+      return "shld";
     case 0xAC:  // Fall through.
-    case 0xAD: return "shrd";
-    case 0xA3: return "bt";
-    case 0xAB: return "bts";
-    case 0xBD: return "bsr";
-    case 0xB1: return "cmpxchg";
-    case 0x50: return "movmskps";
-    case 0x51: return "sqrtps";
-    case 0x52: return "rqstps";
-    case 0x53: return "rcpps";
-    case 0x54: return "andps";
-    case 0x56: return "orps";
-    case 0x57: return "xorps";
-    case 0x58: return "addps";
-    case 0x59: return "mulps";
-    case 0x5A: return "cvtps2pd";
-    case 0x5C: return "subps";
-    case 0x5D: return "minps";
-    case 0x5E: return "divps";
-    case 0x5F: return "maxps";
-    case 0x28: return "movaps";
-    case 0x10: return "movups";
-    case 0x11: return "movups";
-    default: return NULL;
+    case 0xAD:
+      return "shrd";
+    case 0xA3:
+      return "bt";
+    case 0xAB:
+      return "bts";
+    case 0xBD:
+      return "bsr";
+    case 0xB1:
+      return "cmpxchg";
+    case 0x50:
+      return "movmskps";
+    case 0x51:
+      return "sqrtps";
+    case 0x52:
+      return "rqstps";
+    case 0x53:
+      return "rcpps";
+    case 0x54:
+      return "andps";
+    case 0x56:
+      return "orps";
+    case 0x57:
+      return "xorps";
+    case 0x58:
+      return "addps";
+    case 0x59:
+      return "mulps";
+    case 0x5A:
+      return "cvtps2pd";
+    case 0x5C:
+      return "subps";
+    case 0x5D:
+      return "minps";
+    case 0x5E:
+      return "divps";
+    case 0x5F:
+      return "maxps";
+    case 0x28:
+      return "movaps";
+    case 0x10:
+      return "movups";
+    case 0x11:
+      return "movups";
+    default:
+      return NULL;
   }
 }
 
@@ -287,12 +289,11 @@
 
 
 static bool IsTwoXmmRegInstruction(uint8_t f0byte) {
-  return f0byte == 0x28 || f0byte == 0x11 || f0byte == 0x12 ||
-         f0byte == 0x14 || f0byte == 0x15 || f0byte == 0x16 ||
-         f0byte == 0x51 || f0byte == 0x52 || f0byte == 0x53 ||
-         f0byte == 0x54 || f0byte == 0x56 || f0byte == 0x58 ||
-         f0byte == 0x59 || f0byte == 0x5C || f0byte == 0x5D ||
-         f0byte == 0x5E || f0byte == 0x5F || f0byte == 0x5A;
+  return f0byte == 0x28 || f0byte == 0x11 || f0byte == 0x12 || f0byte == 0x14 ||
+         f0byte == 0x15 || f0byte == 0x16 || f0byte == 0x51 || f0byte == 0x52 ||
+         f0byte == 0x53 || f0byte == 0x54 || f0byte == 0x56 || f0byte == 0x58 ||
+         f0byte == 0x59 || f0byte == 0x5C || f0byte == 0x5D || f0byte == 0x5E ||
+         f0byte == 0x5F || f0byte == 0x5A;
 }
 
 
@@ -300,9 +301,7 @@
 class X86Decoder : public ValueObject {
  public:
   X86Decoder(char* buffer, intptr_t buffer_size)
-      : buffer_(buffer),
-        buffer_size_(buffer_size),
-        buffer_pos_(0) {
+      : buffer_(buffer), buffer_size_(buffer_size), buffer_pos_(0) {
     buffer_[buffer_pos_] = '\0';
   }
 
@@ -386,9 +385,9 @@
   char* current_position_in_buffer() { return buffer_ + buffer_pos_; }
   intptr_t remaining_size_in_buffer() { return buffer_size_ - buffer_pos_; }
 
-  char* buffer_;  // Decode instructions into this buffer.
+  char* buffer_;          // Decode instructions into this buffer.
   intptr_t buffer_size_;  // The size of the buffer_.
-  intptr_t buffer_pos_;  // Current character position in the buffer_.
+  intptr_t buffer_pos_;   // Current character position in the buffer_.
 
   DISALLOW_COPY_AND_ASSIGN(X86Decoder);
 };
@@ -421,19 +420,16 @@
 
 
 static const int kMaxCPURegisters = 8;
-static const char* cpu_regs[kMaxCPURegisters] = {
-  "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi"
-};
+static const char* cpu_regs[kMaxCPURegisters] = {"eax", "ecx", "edx", "ebx",
+                                                 "esp", "ebp", "esi", "edi"};
 
 static const int kMaxByteCPURegisters = 8;
 static const char* byte_cpu_regs[kMaxByteCPURegisters] = {
-  "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh"
-};
+    "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh"};
 
 static const int kMaxXmmRegisters = 8;
 static const char* xmm_regs[kMaxXmmRegisters] = {
-  "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7"
-};
+    "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7"};
 
 void X86Decoder::PrintCPURegister(int reg) {
   ASSERT(0 <= reg);
@@ -459,8 +455,7 @@
   ASSERT(0 <= comparison);
   ASSERT(comparison < 8);
   static const char* comparisons[8] = {
-    "eq", "lt", "le", "unordered", "not eq", "not lt", "not le", "ordered"
-  };
+      "eq", "lt", "le", "unordered", "not eq", "not lt", "not le", "ordered"};
   Print(comparisons[comparison]);
 }
 
@@ -487,7 +482,7 @@
   switch (mod) {
     case 0:
       if (rm == ebp) {
-        int32_t disp = *reinterpret_cast<int32_t*>(modrmp+1);
+        int32_t disp = *reinterpret_cast<int32_t*>(modrmp + 1);
         Print("[");
         PrintHex(disp);
         Print("]");
@@ -514,7 +509,7 @@
             Print("+");
           }
           PrintHex(disp);
-           Print("]");
+          Print("]");
           return 6;
         } else if (index != esp && base != ebp) {
           // [base+index*scale]
@@ -543,9 +538,8 @@
         uint8_t sib = *(modrmp + 1);
         int scale, index, base;
         GetSib(sib, &scale, &index, &base);
-        int disp = (mod == 2) ?
-                   *reinterpret_cast<int32_t*>(modrmp + 2) :
-                   *reinterpret_cast<int8_t*>(modrmp + 2);
+        int disp = (mod == 2) ? *reinterpret_cast<int32_t*>(modrmp + 2)
+                              : *reinterpret_cast<int8_t*>(modrmp + 2);
         if (index == base && index == rm /*esp*/ && scale == 0 /*times_1*/) {
           Print("[");
           PrintCPURegister(rm);
@@ -576,9 +570,8 @@
         return mod == 2 ? 6 : 3;
       } else {
         // No sib.
-        int disp = (mod == 2) ?
-                   *reinterpret_cast<int32_t*>(modrmp + 1) :
-                   *reinterpret_cast<int8_t*>(modrmp + 1);
+        int disp = (mod == 2) ? *reinterpret_cast<int32_t*>(modrmp + 1)
+                              : *reinterpret_cast<int8_t*>(modrmp + 1);
         Print("[");
         PrintCPURegister(rm);
         if (disp < 0) {
@@ -652,24 +645,41 @@
 
 int X86Decoder::PrintImmediateOp(uint8_t* data, bool size_override) {
   bool sign_extension_bit = (*data & 0x02) != 0;
-  uint8_t modrm = *(data+1);
+  uint8_t modrm = *(data + 1);
   int mod, regop, rm;
   GetModRm(modrm, &mod, &regop, &rm);
   const char* mnem = "Imm???";
   switch (regop) {
-    case 0: mnem = "add"; break;
-    case 1: mnem = "or"; break;
-    case 2: mnem = "adc"; break;
-    case 3: mnem = "sbb"; break;
-    case 4: mnem = "and"; break;
-    case 5: mnem = "sub"; break;
-    case 6: mnem = "xor"; break;
-    case 7: mnem = "cmp"; break;
-    default: UNIMPLEMENTED();
+    case 0:
+      mnem = "add";
+      break;
+    case 1:
+      mnem = "or";
+      break;
+    case 2:
+      mnem = "adc";
+      break;
+    case 3:
+      mnem = "sbb";
+      break;
+    case 4:
+      mnem = "and";
+      break;
+    case 5:
+      mnem = "sub";
+      break;
+    case 6:
+      mnem = "xor";
+      break;
+    case 7:
+      mnem = "cmp";
+      break;
+    default:
+      UNIMPLEMENTED();
   }
   Print(mnem);
   Print(" ");
-  int count = PrintRightOperand(data+1);
+  int count = PrintRightOperand(data + 1);
   Print(",");
   if (size_override) {
     PrintHex(*reinterpret_cast<int16_t*>(data + 1 + count));
@@ -698,7 +708,7 @@
 // Returns number of bytes used, including *data.
 int X86Decoder::JumpShort(uint8_t* data) {
   ASSERT(*data == 0xEB);
-  uint8_t b = *(data+1);
+  uint8_t b = *(data + 1);
   uword dest = reinterpret_cast<uword>(data) + static_cast<int8_t>(b) + 2;
   Print("jmp ");
   PrintAddress(dest);
@@ -709,9 +719,9 @@
 // Returns number of bytes used, including *data.
 int X86Decoder::JumpConditional(uint8_t* data, const char* comment) {
   ASSERT(*data == 0x0F);
-  uint8_t cond = *(data+1) & 0x0F;
-  uword dest = reinterpret_cast<uword>(data) +
-               *reinterpret_cast<int32_t*>(data+2) + 6;
+  uint8_t cond = *(data + 1) & 0x0F;
+  uword dest =
+      reinterpret_cast<uword>(data) + *reinterpret_cast<int32_t*>(data + 2) + 6;
   const char* mnem = jump_conditional_mnem[cond];
   Print(mnem);
   Print(" ");
@@ -727,7 +737,7 @@
 // Returns number of bytes used, including *data.
 int X86Decoder::JumpConditionalShort(uint8_t* data, const char* comment) {
   uint8_t cond = *data & 0x0F;
-  uint8_t b = *(data+1);
+  uint8_t b = *(data + 1);
   uword dest = reinterpret_cast<uword>(data) + static_cast<int8_t>(b) + 2;
   const char* mnem = jump_conditional_mnem[cond];
   Print(mnem);
@@ -744,11 +754,11 @@
 // Returns number of bytes used, including *data.
 int X86Decoder::SetCC(uint8_t* data) {
   ASSERT(*data == 0x0F);
-  uint8_t cond = *(data+1) & 0x0F;
+  uint8_t cond = *(data + 1) & 0x0F;
   const char* mnem = set_conditional_mnem[cond];
   Print(mnem);
   Print(" ");
-  PrintRightByteOperand(data+2);
+  PrintRightByteOperand(data + 2);
   return 3;  // includes 0x0F
 }
 
@@ -767,31 +777,40 @@
   uint8_t op = *data;
   ASSERT(op == 0xD1 || op == 0xD3 || op == 0xC1);
   int mod, regop, rm;
-  GetModRm(*(data+1), &mod, &regop, &rm);
+  GetModRm(*(data + 1), &mod, &regop, &rm);
   int num_bytes = 1;
   const char* mnem = NULL;
   switch (regop) {
-    case 2: mnem = "rcl"; break;
-    case 4: mnem = "shl"; break;
-    case 5: mnem = "shr"; break;
-    case 7: mnem = "sar"; break;
-    default: UNIMPLEMENTED();
+    case 2:
+      mnem = "rcl";
+      break;
+    case 4:
+      mnem = "shl";
+      break;
+    case 5:
+      mnem = "shr";
+      break;
+    case 7:
+      mnem = "sar";
+      break;
+    default:
+      UNIMPLEMENTED();
   }
   ASSERT(mnem != NULL);
   Print(mnem);
   Print(" ");
 
   if (op == 0xD1) {
-    num_bytes += PrintRightOperand(data+1);
+    num_bytes += PrintRightOperand(data + 1);
     Print(", 1");
   } else if (op == 0xC1) {
-    num_bytes += PrintRightOperand(data+1);
+    num_bytes += PrintRightOperand(data + 1);
     Print(", ");
-    PrintInt(*(data+2));
+    PrintInt(*(data + 2));
     num_bytes++;
   } else {
     ASSERT(op == 0xD3);
-    num_bytes += PrintRightOperand(data+1);
+    num_bytes += PrintRightOperand(data + 1);
     Print(", cl");
   }
   return num_bytes;
@@ -799,8 +818,8 @@
 
 
 uint8_t* X86Decoder::F3Instruction(uint8_t* data) {
-  if (*(data+1) == 0x0F) {
-    uint8_t b2 = *(data+2);
+  if (*(data + 1) == 0x0F) {
+    uint8_t b2 = *(data + 2);
     switch (b2) {
       case 0x2C: {
         data += 3;
@@ -861,14 +880,29 @@
         GetModRm(*data, &mod, &regop, &rm);
         const char* mnem = "?? 0xF3";
         switch (b2) {
-          case 0x51: mnem = "sqrtss"; break;
-          case 0x58: mnem = "addss"; break;
-          case 0x59: mnem = "mulss"; break;
-          case 0x5A: mnem = "cvtss2sd"; break;
-          case 0x5C: mnem = "subss"; break;
-          case 0x5E: mnem = "divss"; break;
-          case 0xE6: mnem = "cvtdq2pd"; break;
-          default: UNIMPLEMENTED();
+          case 0x51:
+            mnem = "sqrtss";
+            break;
+          case 0x58:
+            mnem = "addss";
+            break;
+          case 0x59:
+            mnem = "mulss";
+            break;
+          case 0x5A:
+            mnem = "cvtss2sd";
+            break;
+          case 0x5C:
+            mnem = "subss";
+            break;
+          case 0x5E:
+            mnem = "divss";
+            break;
+          case 0xE6:
+            mnem = "cvtdq2pd";
+            break;
+          default:
+            UNIMPLEMENTED();
         }
         Print(mnem);
         Print(" ");
@@ -890,7 +924,7 @@
       default:
         UNIMPLEMENTED();
     }
-  } else if (*(data+1) == 0xA4) {
+  } else if (*(data + 1) == 0xA4) {
     Print("rep_movsb");
     data += 2;
   } else {
@@ -903,26 +937,39 @@
 // Returns number of bytes used, including *data.
 int X86Decoder::F7Instruction(uint8_t* data) {
   ASSERT(*data == 0xF7);
-  uint8_t modrm = *(data+1);
+  uint8_t modrm = *(data + 1);
   int mod, regop, rm;
   GetModRm(modrm, &mod, &regop, &rm);
   if (mod == 3 && regop != 0) {
     const char* mnem = NULL;
     switch (regop) {
-      case 2: mnem = "not"; break;
-      case 3: mnem = "neg"; break;
-      case 4: mnem = "mul"; break;
-      case 5: mnem = "imul"; break;
-      case 6: mnem = "div"; break;
-      case 7: mnem = "idiv"; break;
-      default: UNIMPLEMENTED();
+      case 2:
+        mnem = "not";
+        break;
+      case 3:
+        mnem = "neg";
+        break;
+      case 4:
+        mnem = "mul";
+        break;
+      case 5:
+        mnem = "imul";
+        break;
+      case 6:
+        mnem = "div";
+        break;
+      case 7:
+        mnem = "idiv";
+        break;
+      default:
+        UNIMPLEMENTED();
     }
     Print(mnem);
     Print(" ");
     PrintCPURegister(rm);
     return 2;
   } else if (mod == 3 && regop == eax) {
-    int32_t imm = *reinterpret_cast<int32_t*>(data+2);
+    int32_t imm = *reinterpret_cast<int32_t*>(data + 2);
     Print("test ");
     PrintCPURegister(rm);
     Print(",");
@@ -930,11 +977,11 @@
     return 6;
   } else if (regop == eax) {
     Print("test ");
-    int count = PrintRightOperand(data+1);
-    int32_t imm = *reinterpret_cast<int32_t*>(data+1+count);
+    int count = PrintRightOperand(data + 1);
+    int32_t imm = *reinterpret_cast<int32_t*>(data + 1 + count);
     Print(",");
     PrintHex(imm);
-    return 1+count+4 /*int32_t*/;
+    return 1 + count + 4 /*int32_t*/;
   } else if (regop == 5) {
     Print("imul ");
     int count = PrintRightOperand(data + 1);
@@ -957,18 +1004,42 @@
   if (b1 == 0xD9) {
     const char* mnem = NULL;
     switch (b2) {
-      case 0xE0: mnem = "fchs"; break;
-      case 0xE1: mnem = "fabs"; break;
-      case 0xE4: mnem = "ftst"; break;
-      case 0xE8: mnem = "fld1"; break;
-      case 0xEE: mnem = "fldz"; break;
-      case 0xF2: mnem = "fptan"; break;
-      case 0xF5: mnem = "fprem1"; break;
-      case 0xF8: mnem = "fprem"; break;
-      case 0xF7: mnem = "fincstp"; break;
-      case 0xFB: mnem = "fsincos"; break;
-      case 0xFE: mnem = "fsin"; break;
-      case 0xFF: mnem = "fcos"; break;
+      case 0xE0:
+        mnem = "fchs";
+        break;
+      case 0xE1:
+        mnem = "fabs";
+        break;
+      case 0xE4:
+        mnem = "ftst";
+        break;
+      case 0xE8:
+        mnem = "fld1";
+        break;
+      case 0xEE:
+        mnem = "fldz";
+        break;
+      case 0xF2:
+        mnem = "fptan";
+        break;
+      case 0xF5:
+        mnem = "fprem1";
+        break;
+      case 0xF8:
+        mnem = "fprem";
+        break;
+      case 0xF7:
+        mnem = "fincstp";
+        break;
+      case 0xFB:
+        mnem = "fsincos";
+        break;
+      case 0xFE:
+        mnem = "fsin";
+        break;
+      case 0xFF:
+        mnem = "fcos";
+        break;
     }
     if (mnem != NULL) {
       Print(mnem);
@@ -979,14 +1050,23 @@
       return 2;
     } else {
       int mod, regop, rm;
-      GetModRm(*(data+1), &mod, &regop, &rm);
+      GetModRm(*(data + 1), &mod, &regop, &rm);
       const char* mnem = "? FPU 0xD9";
       switch (regop) {
-        case 0: mnem = "fld_s"; break;
-        case 3: mnem = "fstp_s"; break;
-        case 5: mnem = "fldcw"; break;
-        case 7: mnem = "fnstcw"; break;
-        default: UNIMPLEMENTED();
+        case 0:
+          mnem = "fld_s";
+          break;
+        case 3:
+          mnem = "fstp_s";
+          break;
+        case 5:
+          mnem = "fldcw";
+          break;
+        case 7:
+          mnem = "fnstcw";
+          break;
+        default:
+          UNIMPLEMENTED();
       }
       Print(mnem);
       Print(" ");
@@ -1000,12 +1080,17 @@
       return 2;
     } else {
       int mod, regop, rm;
-      GetModRm(*(data+1), &mod, &regop, &rm);
+      GetModRm(*(data + 1), &mod, &regop, &rm);
       const char* mnem = "? FPU 0xDD";
       switch (regop) {
-        case 0: mnem = "fld_d"; break;
-        case 3: mnem = "fstp_d"; break;
-       default: UNIMPLEMENTED();
+        case 0:
+          mnem = "fld_d";
+          break;
+        case 3:
+          mnem = "fstp_d";
+          break;
+        default:
+          UNIMPLEMENTED();
       }
       Print(mnem);
       Print(" ");
@@ -1014,13 +1099,20 @@
     }
   } else if (b1 == 0xDB) {
     int mod, regop, rm;
-    GetModRm(*(data+1), &mod, &regop, &rm);
+    GetModRm(*(data + 1), &mod, &regop, &rm);
     const char* mnem = "? FPU 0xDB";
     switch (regop) {
-      case 0: mnem = "fild_s"; break;
-      case 2: mnem = "fist_s"; break;
-      case 3: mnem = "fistp_s"; break;
-      default: UNIMPLEMENTED();
+      case 0:
+        mnem = "fild_s";
+        break;
+      case 2:
+        mnem = "fist_s";
+        break;
+      case 3:
+        mnem = "fistp_s";
+        break;
+      default:
+        UNIMPLEMENTED();
     }
     Print(mnem);
     Print(" ");
@@ -1032,12 +1124,17 @@
       return 2;
     }
     int mod, regop, rm;
-    GetModRm(*(data+1), &mod, &regop, &rm);
+    GetModRm(*(data + 1), &mod, &regop, &rm);
     const char* mnem = "? FPU 0xDF";
     switch (regop) {
-      case 5: mnem = "fild_d"; break;
-      case 7: mnem = "fistp_d"; break;
-      default: UNIMPLEMENTED();
+      case 5:
+        mnem = "fild_d";
+        break;
+      case 7:
+        mnem = "fistp_d";
+        break;
+      default:
+        UNIMPLEMENTED();
     }
     Print(mnem);
     Print(" ");
@@ -1051,11 +1148,20 @@
     }
     const char* mnem = "FP0xDC";
     switch (b2 & 0xF8) {
-      case 0xC0: mnem = "fadd"; break;
-      case 0xE8: mnem = "fsub"; break;
-      case 0xC8: mnem = "fmul"; break;
-      case 0xF8: mnem = "fdiv"; break;
-      default: UNIMPLEMENTED();
+      case 0xC0:
+        mnem = "fadd";
+        break;
+      case 0xE8:
+        mnem = "fsub";
+        break;
+      case 0xC8:
+        mnem = "fmul";
+        break;
+      case 0xF8:
+        mnem = "fdiv";
+        break;
+      default:
+        UNIMPLEMENTED();
     }
     Print(mnem);
     Print(is_pop ? "p" : "");
@@ -1072,7 +1178,8 @@
 }
 
 
-uint8_t* X86Decoder::SSEInstruction(uint8_t prefix, uint8_t primary,
+uint8_t* X86Decoder::SSEInstruction(uint8_t prefix,
+                                    uint8_t primary,
                                     uint8_t* data) {
   ASSERT(prefix == 0x0F);
   int mod, regop, rm;
@@ -1104,36 +1211,33 @@
 
 
 int X86Decoder::BitwisePDInstruction(uint8_t* data) {
-  const char* mnem = (*data == 0x57)
-      ? "xorpd"
-      : (*data == 0x56)
-        ? "orpd"
-        : "andpd";
+  const char* mnem =
+      (*data == 0x57) ? "xorpd" : (*data == 0x56) ? "orpd" : "andpd";
   int mod, regop, rm;
-  GetModRm(*(data+1), &mod, &regop, &rm);
+  GetModRm(*(data + 1), &mod, &regop, &rm);
   Print(mnem);
   Print(" ");
   PrintXmmRegister(regop);
   Print(",");
-  return 1 + PrintRightXmmOperand(data+1);
+  return 1 + PrintRightXmmOperand(data + 1);
 }
 
 
 int X86Decoder::Packed660F38Instruction(uint8_t* data) {
-  if (*(data+1) == 0x25) {
+  if (*(data + 1) == 0x25) {
     Print("pmovsxdq ");
     int mod, regop, rm;
-    GetModRm(*(data+2), &mod, &regop, &rm);
+    GetModRm(*(data + 2), &mod, &regop, &rm);
     PrintXmmRegister(regop);
     Print(",");
-    return 2 + PrintRightXmmOperand(data+2);
-  } else if (*(data+1) == 0x29) {
+    return 2 + PrintRightXmmOperand(data + 2);
+  } else if (*(data + 1) == 0x29) {
     Print("pcmpeqq ");
     int mod, regop, rm;
-    GetModRm(*(data+2), &mod, &regop, &rm);
+    GetModRm(*(data + 2), &mod, &regop, &rm);
     PrintXmmRegister(regop);
     Print(",");
-    return 2 + PrintRightXmmOperand(data+2);
+    return 2 + PrintRightXmmOperand(data + 2);
   }
   UNREACHABLE();
   return 1;
@@ -1196,10 +1300,9 @@
       return true;
 
     case MOVE_REG_INSTR: {
-      uword addr = *reinterpret_cast<uword*>(*data+1);
+      uword addr = *reinterpret_cast<uword*>(*data + 1);
       Print("mov ");
-      PrintCPURegister(**data & 0x07),
-      Print(",");
+      PrintCPURegister(**data & 0x07), Print(",");
       PrintAddress(addr);
       (*data) += 5;
       return true;
@@ -1207,7 +1310,7 @@
 
     case CALL_JUMP_INSTR: {
       uword addr = reinterpret_cast<uword>(*data) +
-                   *reinterpret_cast<uword*>(*data+1) + 5;
+                   *reinterpret_cast<uword*>(*data + 1) + 5;
       Print(idesc.mnem);
       Print(" ");
       PrintAddress(addr);
@@ -1216,7 +1319,7 @@
     }
 
     case SHORT_IMMEDIATE_INSTR: {
-      uword addr = *reinterpret_cast<uword*>(*data+1);
+      uword addr = *reinterpret_cast<uword*>(*data + 1);
       Print(idesc.mnem);
       Print(" eax, ");
       PrintAddress(addr);
@@ -1247,16 +1350,16 @@
     switch (*data) {
       case 0xC2:
         Print("ret ");
-        PrintHex(*reinterpret_cast<uint16_t*>(data+1));
+        PrintHex(*reinterpret_cast<uint16_t*>(data + 1));
         data += 3;
         break;
 
       case 0x69:  // fall through
-      case 0x6B:
-      { int mod, regop, rm;
-        GetModRm(*(data+1), &mod, &regop, &rm);
+      case 0x6B: {
+        int mod, regop, rm;
+        GetModRm(*(data + 1), &mod, &regop, &rm);
         int32_t imm =
-        *data == 0x6B ? *(data+2) : *reinterpret_cast<int32_t*>(data+2);
+            *data == 0x6B ? *(data + 2) : *reinterpret_cast<int32_t*>(data + 2);
         Print("imul ");
         PrintCPURegister(regop);
         Print(",");
@@ -1264,17 +1367,16 @@
         Print(",");
         PrintHex(imm);
         data += 2 + (*data == 0x6B ? 1 : 4);
-      }
-        break;
+      } break;
 
-      case 0xF6:
-      { int mod, regop, rm;
-        GetModRm(*(data+1), &mod, &regop, &rm);
+      case 0xF6: {
+        int mod, regop, rm;
+        GetModRm(*(data + 1), &mod, &regop, &rm);
         if ((mod == 3) && (regop == eax)) {
           Print("test_b ");
           PrintCPURegister(rm);
           Print(",");
-          PrintHex(*(data+2));
+          PrintHex(*(data + 2));
           data += 3;
         } else {
           data++;
@@ -1285,16 +1387,15 @@
           PrintHex(imm);
           data++;
         }
-      }
-        break;
+      } break;
 
       case 0x81:  // fall through
       case 0x83:  // 0x81 with sign extension bit set
         data += PrintImmediateOp(data);
         break;
 
-      case 0x0F:
-      { uint8_t f0byte = *(data+1);
+      case 0x0F: {
+        uint8_t f0byte = *(data + 1);
         const char* f0mnem = F0Mnem(f0byte);
         if (f0byte == 0xA2 || f0byte == 0x31) {
           Print(f0mnem);
@@ -1331,30 +1432,24 @@
           PrintXmmRegister(rm);
           data++;
         } else if (f0byte == 0x1F) {
-          if (*(data+2) == 0x00) {
+          if (*(data + 2) == 0x00) {
             Print("nop");
             data += 3;
-          } else if (*(data+2) == 0x40 && *(data+3) == 0x00) {
+          } else if (*(data + 2) == 0x40 && *(data + 3) == 0x00) {
             Print("nop");
             data += 4;
-          } else if (*(data+2) == 0x44 &&
-                     *(data+3) == 0x00 &&
-                     *(data+4) == 0x00) {
+          } else if (*(data + 2) == 0x44 && *(data + 3) == 0x00 &&
+                     *(data + 4) == 0x00) {
             Print("nop");
             data += 5;
-          } else if (*(data+2) == 0x80 &&
-                     *(data+3) == 0x00 &&
-                     *(data+4) == 0x00 &&
-                     *(data+5) == 0x00 &&
-                     *(data+6) == 0x00) {
+          } else if (*(data + 2) == 0x80 && *(data + 3) == 0x00 &&
+                     *(data + 4) == 0x00 && *(data + 5) == 0x00 &&
+                     *(data + 6) == 0x00) {
             Print("nop");
             data += 7;
-          } else if (*(data+2) == 0x84 &&
-                     *(data+3) == 0x00 &&
-                     *(data+4) == 0x00 &&
-                     *(data+5) == 0x00 &&
-                     *(data+6) == 0x00 &&
-                     *(data+7) == 0x00) {
+          } else if (*(data + 2) == 0x84 && *(data + 3) == 0x00 &&
+                     *(data + 4) == 0x00 && *(data + 5) == 0x00 &&
+                     *(data + 6) == 0x00 && *(data + 7) == 0x00) {
             Print("nop");
             data += 8;
           } else {
@@ -1410,42 +1505,51 @@
             UNIMPLEMENTED();
           }
         }
-      }
-        break;
+      } break;
 
-      case 0x8F:
-      { data++;
+      case 0x8F: {
+        data++;
         int mod, regop, rm;
         GetModRm(*data, &mod, &regop, &rm);
         if (regop == eax) {
           Print("pop ");
           data += PrintRightOperand(data);
         }
-      }
-        break;
+      } break;
 
-      case 0xFF:
-      { data++;
+      case 0xFF: {
+        data++;
         int mod, regop, rm;
         GetModRm(*data, &mod, &regop, &rm);
         const char* mnem = NULL;
         switch (regop) {
-          case esi: mnem = "push"; break;
-          case eax: mnem = "inc"; break;
-          case ecx: mnem = "dec"; break;
-          case edx: mnem = "call"; break;
-          case esp: mnem = "jmp"; break;
-          default: mnem = "??? 0xFF";
+          case esi:
+            mnem = "push";
+            break;
+          case eax:
+            mnem = "inc";
+            break;
+          case ecx:
+            mnem = "dec";
+            break;
+          case edx:
+            mnem = "call";
+            break;
+          case esp:
+            mnem = "jmp";
+            break;
+          default:
+            mnem = "??? 0xFF";
         }
         Print(mnem);
         Print(" ");
         data += PrintRightOperand(data);
-      }
-        break;
+      } break;
 
       case 0xC7:  // imm32, fall through
       case 0xC6:  // imm8
-      { bool is_byte = *data == 0xC6;
+      {
+        bool is_byte = *data == 0xC6;
         data++;
         Print(is_byte ? "mov_b" : "mov");
         Print(" ");
@@ -1454,23 +1558,22 @@
         Print(",");
         PrintHex(imm);
         data += is_byte ? 1 : 4;
-      }
-        break;
+      } break;
 
-      case 0x80:
-      { data++;
+      case 0x80: {
+        data++;
         Print("cmpb ");
         data += PrintRightOperand(data);
         int32_t imm = *data;
         Print(",");
         PrintHex(imm);
         data++;
-      }
-        break;
+      } break;
 
       case 0x88:  // 8bit, fall through
       case 0x89:  // 32bit
-      { bool is_byte = *data == 0x88;
+      {
+        bool is_byte = *data == 0x88;
         int mod, regop, rm;
         data++;
         GetModRm(*data, &mod, &regop, &rm);
@@ -1479,8 +1582,7 @@
         data += PrintRightOperand(data);
         Print(",");
         PrintCPURegister(regop);
-      }
-        break;
+      } break;
 
       case 0x66:  // prefix
         data++;
@@ -1525,10 +1627,8 @@
             PrintXmmRegister(regop);
           } else if (*data == 0x57 || *data == 0x56 || *data == 0x54) {
             data += BitwisePDInstruction(data);
-          } else if (*data == 0x1F &&
-                     *(data+1) == 0x44 &&
-                     *(data+2) == 0x00 &&
-                     *(data+3) == 0x00) {
+          } else if (*data == 0x1F && *(data + 1) == 0x44 &&
+                     *(data + 2) == 0x00 && *(data + 3) == 0x00) {
             data += 4;
             Print("nop");
           } else if (*data == 0x50) {
@@ -1539,7 +1639,7 @@
             PrintCPURegister(regop);
             Print(",");
             data += PrintRightXmmOperand(data);
-          } else if (*data == 0x3A && *(data+1) == 0x16) {
+          } else if (*data == 0x3A && *(data + 1) == 0x16) {
             Print("pextrd ");
             data += 2;
             int mod, regop, rm;
@@ -1548,13 +1648,13 @@
             Print(",");
             PrintXmmRegister(regop);
             Print(",");
-            PrintHex(*(data+1));
+            PrintHex(*(data + 1));
             data += 2;
           } else if (*data == 0x38) {
             data += Packed660F38Instruction(data);
           } else if (*data == 0xEF) {
             int mod, regop, rm;
-            GetModRm(*(data+1), &mod, &regop, &rm);
+            GetModRm(*(data + 1), &mod, &regop, &rm);
             Print("pxor ");
             PrintXmmRegister(regop);
             Print(",");
@@ -1578,7 +1678,7 @@
             }
           } else if (*data == 0x14) {
             int mod, regop, rm;
-            GetModRm(*(data+1), &mod, &regop, &rm);
+            GetModRm(*(data + 1), &mod, &regop, &rm);
             Print("unpcklpd ");
             PrintXmmRegister(regop);
             Print(",");
@@ -1586,7 +1686,7 @@
             data += 2;
           } else if (*data == 0x15) {
             int mod, regop, rm;
-            GetModRm(*(data+1), &mod, &regop, &rm);
+            GetModRm(*(data + 1), &mod, &regop, &rm);
             Print("unpckhpd ");
             PrintXmmRegister(regop);
             Print(",");
@@ -1598,7 +1698,7 @@
                      (*data == 0x51) || (*data == 0x5A)) {
             const char* mnemonic = PackedDoubleMnemonic(*data);
             int mod, regop, rm;
-            GetModRm(*(data+1), &mod, &regop, &rm);
+            GetModRm(*(data + 1), &mod, &regop, &rm);
             Print(mnemonic);
             PrintXmmRegister(regop);
             Print(",");
@@ -1646,8 +1746,8 @@
         }
         break;
 
-      case 0xFE:
-      { data++;
+      case 0xFE: {
+        data++;
         int mod, regop, rm;
         GetModRm(*data, &mod, &regop, &rm);
         if (mod == 3 && regop == ecx) {
@@ -1657,12 +1757,11 @@
           UNIMPLEMENTED();
         }
         data++;
-      }
-        break;
+      } break;
 
       case 0x68:
         Print("push ");
-        PrintHex(*reinterpret_cast<int32_t*>(data+1));
+        PrintHex(*reinterpret_cast<int32_t*>(data + 1));
         data += 5;
         break;
 
@@ -1674,13 +1773,13 @@
 
       case 0xA8:
         Print("test al,");
-        PrintHex(*reinterpret_cast<uint8_t*>(data+1));
+        PrintHex(*reinterpret_cast<uint8_t*>(data + 1));
         data += 2;
         break;
 
       case 0xA9:
         Print("test eax,");
-        PrintHex(*reinterpret_cast<int32_t*>(data+1));
+        PrintHex(*reinterpret_cast<int32_t*>(data + 1));
         CheckPrintStop(data);
         data += 5;
         break;
@@ -1709,8 +1808,8 @@
         data = F3Instruction(data);
         break;
       case 0xF2: {
-        if (*(data+1) == 0x0F) {
-          uint8_t b2 = *(data+2);
+        if (*(data + 1) == 0x0F) {
+          uint8_t b2 = *(data + 2);
           if (b2 == 0x11) {
             Print("movsd ");
             data += 3;
@@ -1730,16 +1829,35 @@
           } else {
             const char* mnem = "? 0xF2";
             switch (b2) {
-              case 0x2A: mnem = "cvtsi2sd"; break;
-              case 0x2C: mnem = "cvttsd2si"; break;
-              case 0x2D: mnem = "cvtsd2i"; break;
-              case 0x51: mnem = "sqrtsd"; break;
-              case 0x58: mnem = "addsd"; break;
-              case 0x59: mnem = "mulsd"; break;
-              case 0x5A: mnem = "cvtsd2ss"; break;
-              case 0x5C: mnem = "subsd"; break;
-              case 0x5E: mnem = "divsd"; break;
-              default: UNIMPLEMENTED();
+              case 0x2A:
+                mnem = "cvtsi2sd";
+                break;
+              case 0x2C:
+                mnem = "cvttsd2si";
+                break;
+              case 0x2D:
+                mnem = "cvtsd2i";
+                break;
+              case 0x51:
+                mnem = "sqrtsd";
+                break;
+              case 0x58:
+                mnem = "addsd";
+                break;
+              case 0x59:
+                mnem = "mulsd";
+                break;
+              case 0x5A:
+                mnem = "cvtsd2ss";
+                break;
+              case 0x5C:
+                mnem = "subsd";
+                break;
+              case 0x5E:
+                mnem = "divsd";
+                break;
+              default:
+                UNIMPLEMENTED();
             }
             data += 3;
             int mod, regop, rm;
@@ -1791,10 +1909,14 @@
 }  // NOLINT
 
 
-void Disassembler::DecodeInstruction(char* hex_buffer, intptr_t hex_size,
-                                     char* human_buffer, intptr_t human_size,
-                                     int* out_instr_len, const Code& code,
-                                     Object** object, uword pc) {
+void Disassembler::DecodeInstruction(char* hex_buffer,
+                                     intptr_t hex_size,
+                                     char* human_buffer,
+                                     intptr_t human_size,
+                                     int* out_instr_len,
+                                     const Code& code,
+                                     Object** object,
+                                     uword pc) {
   ASSERT(hex_size > 0);
   ASSERT(human_size > 0);
   X86Decoder decoder(human_buffer, human_size);
diff --git a/runtime/vm/disassembler_mips.cc b/runtime/vm/disassembler_mips.cc
index 49fbb33..23244b3 100644
--- a/runtime/vm/disassembler_mips.cc
+++ b/runtime/vm/disassembler_mips.cc
@@ -16,9 +16,7 @@
 class MIPSDecoder : public ValueObject {
  public:
   MIPSDecoder(char* buffer, size_t buffer_size)
-      : buffer_(buffer),
-        buffer_size_(buffer_size),
-        buffer_pos_(0) {
+      : buffer_(buffer), buffer_size_(buffer_size), buffer_pos_(0) {
     buffer_[buffer_pos_] = '\0';
   }
 
@@ -53,9 +51,9 @@
   char* current_position_in_buffer() { return buffer_ + buffer_pos_; }
   size_t remaining_size_in_buffer() { return buffer_size_ - buffer_pos_; }
 
-  char* buffer_;  // Decode instructions into this buffer.
+  char* buffer_;        // Decode instructions into this buffer.
   size_t buffer_size_;  // The size of the character buffer.
-  size_t buffer_pos_;  // Current character position in buffer.
+  size_t buffer_pos_;   // Current character position in buffer.
 
   DISALLOW_ALLOCATION();
   DISALLOW_COPY_AND_ASSIGN(MIPSDecoder);
@@ -63,7 +61,7 @@
 
 
 // Support for assertions in the MIPSDecoder formatting functions.
-#define STRING_STARTS_WITH(string, compare_string) \
+#define STRING_STARTS_WITH(string, compare_string)                             \
   (strncmp(string, compare_string, strlen(compare_string)) == 0)
 
 
@@ -79,18 +77,16 @@
 
 
 static const char* reg_names[kNumberOfCpuRegisters] = {
-  "zr", "at", "v0", "v1" , "a0", "a1", "a2", "a3",
-  "t0", "t1", "t2", "t3" , "t4", "t5", "t6", "t7",
-  "s0", "s1", "s2", "thr", "s4", "s5", "s6", "pp",
-  "t8", "t9", "k0", "k1" , "gp", "sp", "fp", "ra",
+    "zr", "at", "v0", "v1", "a0", "a1", "a2", "a3", "t0",  "t1", "t2",
+    "t3", "t4", "t5", "t6", "t7", "s0", "s1", "s2", "thr", "s4", "s5",
+    "s6", "pp", "t8", "t9", "k0", "k1", "gp", "sp", "fp",  "ra",
 };
 
 
 static const char* freg_names[kNumberOfFRegisters] = {
-  "f0" , "f1" , "f2" , "f3" , "f4" , "f5" , "f6" , "f7" ,
-  "f8" , "f9" , "f10", "f11", "f12", "f13", "f14", "f15",
-  "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
-  "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
+    "f0",  "f1",  "f2",  "f3",  "f4",  "f5",  "f6",  "f7",  "f8",  "f9",  "f10",
+    "f11", "f12", "f13", "f14", "f15", "f16", "f17", "f18", "f19", "f20", "f21",
+    "f22", "f23", "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
 };
 
 
@@ -152,7 +148,7 @@
 }
 
 
-void MIPSDecoder::PrintFormat(Instr *instr) {
+void MIPSDecoder::PrintFormat(Instr* instr) {
   switch (instr->FormatField()) {
     case FMT_S: {
       Print("s");
@@ -191,10 +187,9 @@
   switch (format[0]) {
     case 'c': {
       ASSERT(STRING_STARTS_WITH(format, "code"));
-      buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                                remaining_size_in_buffer(),
-                                "0x%x",
-                                 instr->BreakCodeField());
+      buffer_pos_ +=
+          OS::SNPrint(current_position_in_buffer(), remaining_size_in_buffer(),
+                      "0x%x", instr->BreakCodeField());
       return 4;
     }
     case 'h': {
@@ -203,12 +198,10 @@
         // The high bit of the SA field is the only one that means something for
         // JALR and JR. TODO(zra): Fill in the other cases for PREF if needed.
         buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                                   remaining_size_in_buffer(),
-                                   ".hb");
+                                   remaining_size_in_buffer(), ".hb");
       } else if (instr->SaField() != 0) {
         buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                           remaining_size_in_buffer(),
-                           ".unknown");
+                                   remaining_size_in_buffer(), ".unknown");
       }
       return 4;
     }
@@ -217,10 +210,9 @@
       int off = instr->SImmField() << 2;
       uword destination =
           reinterpret_cast<uword>(instr) + off + Instr::kInstrSize;
-      buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                                 remaining_size_in_buffer(),
-                                 "%#" Px "",
-                                 destination);
+      buffer_pos_ +=
+          OS::SNPrint(current_position_in_buffer(), remaining_size_in_buffer(),
+                      "%#" Px "", destination);
       return 4;
     }
     case 'i': {
@@ -228,16 +220,12 @@
       if (format[3] == 'u') {
         int32_t imm = instr->UImmField();
         buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                                   remaining_size_in_buffer(),
-                                   "0x%x",
-                                   imm);
+                                   remaining_size_in_buffer(), "0x%x", imm);
       } else {
         ASSERT(STRING_STARTS_WITH(format, "imms"));
         int32_t imm = instr->SImmField();
         buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                                   remaining_size_in_buffer(),
-                                   "%d",
-                                   imm);
+                                   remaining_size_in_buffer(), "%d", imm);
       }
       return 4;
     }
@@ -255,15 +243,12 @@
     }
     case 's': {
       ASSERT(STRING_STARTS_WITH(format, "sa"));
-      buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                                 remaining_size_in_buffer(),
-                                 "%d",
-                                 instr->SaField());
+      buffer_pos_ +=
+          OS::SNPrint(current_position_in_buffer(), remaining_size_in_buffer(),
+                      "%d", instr->SaField());
       return 2;
     }
-    default: {
-      UNREACHABLE();
-    }
+    default: { UNREACHABLE(); }
   }
   UNREACHABLE();
   return -1;
@@ -283,7 +268,7 @@
     }
     cur = *format++;
   }
-  buffer_[buffer_pos_]  = '\0';
+  buffer_[buffer_pos_] = '\0';
 }
 
 
@@ -310,10 +295,9 @@
       if (instr->BreakCodeField() == Instr::kStopMessageCode) {
         const char* message = *reinterpret_cast<const char**>(
             reinterpret_cast<intptr_t>(instr) - Instr::kInstrSize);
-        buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                                   remaining_size_in_buffer(),
-                                   " ; \"%s\"",
-                                   message);
+        buffer_pos_ +=
+            OS::SNPrint(current_position_in_buffer(),
+                        remaining_size_in_buffer(), " ; \"%s\"", message);
       }
       break;
     }
@@ -390,8 +374,7 @@
       break;
     }
     case SLL: {
-      if ((instr->RdField() == R0) &&
-          (instr->RtField() == R0) &&
+      if ((instr->RdField() == R0) && (instr->RtField() == R0) &&
           (instr->SaField() == 0)) {
         Format(instr, "nop");
       } else {
@@ -777,10 +760,14 @@
 }
 
 
-void Disassembler::DecodeInstruction(char* hex_buffer, intptr_t hex_size,
-                                     char* human_buffer, intptr_t human_size,
-                                     int* out_instr_len, const Code& code,
-                                     Object** object, uword pc) {
+void Disassembler::DecodeInstruction(char* hex_buffer,
+                                     intptr_t hex_size,
+                                     char* human_buffer,
+                                     intptr_t human_size,
+                                     int* out_instr_len,
+                                     const Code& code,
+                                     Object** object,
+                                     uword pc) {
   MIPSDecoder decoder(human_buffer, human_size);
   Instr* instr = Instr::At(pc);
   decoder.InstructionDecode(instr);
diff --git a/runtime/vm/disassembler_x64.cc b/runtime/vm/disassembler_x64.cc
index f389415..fe384dc 100644
--- a/runtime/vm/disassembler_x64.cc
+++ b/runtime/vm/disassembler_x64.cc
@@ -40,97 +40,79 @@
 
 
 static const ByteMnemonic two_operands_instr[] = {
-  { 0x00, BYTE_OPER_REG_OP_ORDER, "add" },
-  { 0x01, OPER_REG_OP_ORDER,      "add" },
-  { 0x02, BYTE_REG_OPER_OP_ORDER, "add" },
-  { 0x03, REG_OPER_OP_ORDER,      "add" },
-  { 0x08, BYTE_OPER_REG_OP_ORDER, "or" },
-  { 0x09, OPER_REG_OP_ORDER,      "or" },
-  { 0x0A, BYTE_REG_OPER_OP_ORDER, "or" },
-  { 0x0B, REG_OPER_OP_ORDER,      "or" },
-  { 0x10, BYTE_OPER_REG_OP_ORDER, "adc" },
-  { 0x11, OPER_REG_OP_ORDER,      "adc" },
-  { 0x12, BYTE_REG_OPER_OP_ORDER, "adc" },
-  { 0x13, REG_OPER_OP_ORDER,      "adc" },
-  { 0x18, BYTE_OPER_REG_OP_ORDER, "sbb" },
-  { 0x19, OPER_REG_OP_ORDER,      "sbb" },
-  { 0x1A, BYTE_REG_OPER_OP_ORDER, "sbb" },
-  { 0x1B, REG_OPER_OP_ORDER,      "sbb" },
-  { 0x20, BYTE_OPER_REG_OP_ORDER, "and" },
-  { 0x21, OPER_REG_OP_ORDER,      "and" },
-  { 0x22, BYTE_REG_OPER_OP_ORDER, "and" },
-  { 0x23, REG_OPER_OP_ORDER,      "and" },
-  { 0x28, BYTE_OPER_REG_OP_ORDER, "sub" },
-  { 0x29, OPER_REG_OP_ORDER,      "sub" },
-  { 0x2A, BYTE_REG_OPER_OP_ORDER, "sub" },
-  { 0x2B, REG_OPER_OP_ORDER,      "sub" },
-  { 0x30, BYTE_OPER_REG_OP_ORDER, "xor" },
-  { 0x31, OPER_REG_OP_ORDER,      "xor" },
-  { 0x32, BYTE_REG_OPER_OP_ORDER, "xor" },
-  { 0x33, REG_OPER_OP_ORDER,      "xor" },
-  { 0x38, BYTE_OPER_REG_OP_ORDER, "cmp" },
-  { 0x39, OPER_REG_OP_ORDER,      "cmp" },
-  { 0x3A, BYTE_REG_OPER_OP_ORDER, "cmp" },
-  { 0x3B, REG_OPER_OP_ORDER,      "cmp" },
-  { 0x63, REG_OPER_OP_ORDER,      "movsxd" },
-  { 0x84, BYTE_REG_OPER_OP_ORDER, "test" },
-  { 0x85, REG_OPER_OP_ORDER,      "test" },
-  { 0x86, BYTE_REG_OPER_OP_ORDER, "xchg" },
-  { 0x87, REG_OPER_OP_ORDER,      "xchg" },
-  { 0x88, BYTE_OPER_REG_OP_ORDER, "mov" },
-  { 0x89, OPER_REG_OP_ORDER,      "mov" },
-  { 0x8A, BYTE_REG_OPER_OP_ORDER, "mov" },
-  { 0x8B, REG_OPER_OP_ORDER,      "mov" },
-  { 0x8D, REG_OPER_OP_ORDER,      "lea" },
-  { -1, UNSET_OP_ORDER, "" }
-};
+    {0x00, BYTE_OPER_REG_OP_ORDER, "add"},
+    {0x01, OPER_REG_OP_ORDER, "add"},
+    {0x02, BYTE_REG_OPER_OP_ORDER, "add"},
+    {0x03, REG_OPER_OP_ORDER, "add"},
+    {0x08, BYTE_OPER_REG_OP_ORDER, "or"},
+    {0x09, OPER_REG_OP_ORDER, "or"},
+    {0x0A, BYTE_REG_OPER_OP_ORDER, "or"},
+    {0x0B, REG_OPER_OP_ORDER, "or"},
+    {0x10, BYTE_OPER_REG_OP_ORDER, "adc"},
+    {0x11, OPER_REG_OP_ORDER, "adc"},
+    {0x12, BYTE_REG_OPER_OP_ORDER, "adc"},
+    {0x13, REG_OPER_OP_ORDER, "adc"},
+    {0x18, BYTE_OPER_REG_OP_ORDER, "sbb"},
+    {0x19, OPER_REG_OP_ORDER, "sbb"},
+    {0x1A, BYTE_REG_OPER_OP_ORDER, "sbb"},
+    {0x1B, REG_OPER_OP_ORDER, "sbb"},
+    {0x20, BYTE_OPER_REG_OP_ORDER, "and"},
+    {0x21, OPER_REG_OP_ORDER, "and"},
+    {0x22, BYTE_REG_OPER_OP_ORDER, "and"},
+    {0x23, REG_OPER_OP_ORDER, "and"},
+    {0x28, BYTE_OPER_REG_OP_ORDER, "sub"},
+    {0x29, OPER_REG_OP_ORDER, "sub"},
+    {0x2A, BYTE_REG_OPER_OP_ORDER, "sub"},
+    {0x2B, REG_OPER_OP_ORDER, "sub"},
+    {0x30, BYTE_OPER_REG_OP_ORDER, "xor"},
+    {0x31, OPER_REG_OP_ORDER, "xor"},
+    {0x32, BYTE_REG_OPER_OP_ORDER, "xor"},
+    {0x33, REG_OPER_OP_ORDER, "xor"},
+    {0x38, BYTE_OPER_REG_OP_ORDER, "cmp"},
+    {0x39, OPER_REG_OP_ORDER, "cmp"},
+    {0x3A, BYTE_REG_OPER_OP_ORDER, "cmp"},
+    {0x3B, REG_OPER_OP_ORDER, "cmp"},
+    {0x63, REG_OPER_OP_ORDER, "movsxd"},
+    {0x84, BYTE_REG_OPER_OP_ORDER, "test"},
+    {0x85, REG_OPER_OP_ORDER, "test"},
+    {0x86, BYTE_REG_OPER_OP_ORDER, "xchg"},
+    {0x87, REG_OPER_OP_ORDER, "xchg"},
+    {0x88, BYTE_OPER_REG_OP_ORDER, "mov"},
+    {0x89, OPER_REG_OP_ORDER, "mov"},
+    {0x8A, BYTE_REG_OPER_OP_ORDER, "mov"},
+    {0x8B, REG_OPER_OP_ORDER, "mov"},
+    {0x8D, REG_OPER_OP_ORDER, "lea"},
+    {-1, UNSET_OP_ORDER, ""}};
 
 
 static const ByteMnemonic zero_operands_instr[] = {
-  { 0xC3, UNSET_OP_ORDER, "ret" },
-  { 0xC9, UNSET_OP_ORDER, "leave" },
-  { 0xF4, UNSET_OP_ORDER, "hlt" },
-  { 0xFC, UNSET_OP_ORDER, "cld" },
-  { 0xCC, UNSET_OP_ORDER, "int3" },
-  { 0x60, UNSET_OP_ORDER, "pushad" },
-  { 0x61, UNSET_OP_ORDER, "popad" },
-  { 0x9C, UNSET_OP_ORDER, "pushfd" },
-  { 0x9D, UNSET_OP_ORDER, "popfd" },
-  { 0x9E, UNSET_OP_ORDER, "sahf" },
-  { 0x99, UNSET_OP_ORDER, "cdq" },
-  { 0x9B, UNSET_OP_ORDER, "fwait" },
-  { 0xA4, UNSET_OP_ORDER, "movs" },
-  { 0xA5, UNSET_OP_ORDER, "movs" },
-  { 0xA6, UNSET_OP_ORDER, "cmps" },
-  { 0xA7, UNSET_OP_ORDER, "cmps" },
-  { -1, UNSET_OP_ORDER, "" }
-};
+    {0xC3, UNSET_OP_ORDER, "ret"},   {0xC9, UNSET_OP_ORDER, "leave"},
+    {0xF4, UNSET_OP_ORDER, "hlt"},   {0xFC, UNSET_OP_ORDER, "cld"},
+    {0xCC, UNSET_OP_ORDER, "int3"},  {0x60, UNSET_OP_ORDER, "pushad"},
+    {0x61, UNSET_OP_ORDER, "popad"}, {0x9C, UNSET_OP_ORDER, "pushfd"},
+    {0x9D, UNSET_OP_ORDER, "popfd"}, {0x9E, UNSET_OP_ORDER, "sahf"},
+    {0x99, UNSET_OP_ORDER, "cdq"},   {0x9B, UNSET_OP_ORDER, "fwait"},
+    {0xA4, UNSET_OP_ORDER, "movs"},  {0xA5, UNSET_OP_ORDER, "movs"},
+    {0xA6, UNSET_OP_ORDER, "cmps"},  {0xA7, UNSET_OP_ORDER, "cmps"},
+    {-1, UNSET_OP_ORDER, ""}};
 
 
-static const ByteMnemonic call_jump_instr[] = {
-  { 0xE8, UNSET_OP_ORDER, "call" },
-  { 0xE9, UNSET_OP_ORDER, "jmp" },
-  { -1, UNSET_OP_ORDER, "" }
-};
+static const ByteMnemonic call_jump_instr[] = {{0xE8, UNSET_OP_ORDER, "call"},
+                                               {0xE9, UNSET_OP_ORDER, "jmp"},
+                                               {-1, UNSET_OP_ORDER, ""}};
 
 
 static const ByteMnemonic short_immediate_instr[] = {
-  { 0x05, UNSET_OP_ORDER, "add" },
-  { 0x0D, UNSET_OP_ORDER, "or" },
-  { 0x15, UNSET_OP_ORDER, "adc" },
-  { 0x1D, UNSET_OP_ORDER, "sbb" },
-  { 0x25, UNSET_OP_ORDER, "and" },
-  { 0x2D, UNSET_OP_ORDER, "sub" },
-  { 0x35, UNSET_OP_ORDER, "xor" },
-  { 0x3D, UNSET_OP_ORDER, "cmp" },
-  { -1, UNSET_OP_ORDER, "" }
-};
+    {0x05, UNSET_OP_ORDER, "add"}, {0x0D, UNSET_OP_ORDER, "or"},
+    {0x15, UNSET_OP_ORDER, "adc"}, {0x1D, UNSET_OP_ORDER, "sbb"},
+    {0x25, UNSET_OP_ORDER, "and"}, {0x2D, UNSET_OP_ORDER, "sub"},
+    {0x35, UNSET_OP_ORDER, "xor"}, {0x3D, UNSET_OP_ORDER, "cmp"},
+    {-1, UNSET_OP_ORDER, ""}};
 
 
 static const char* const conditional_code_suffix[] = {
-  "o", "no", "c", "nc", "z", "nz", "na", "a",
-  "s", "ns", "pe", "po", "l", "ge", "le", "g"
-};
+    "o", "no", "c",  "nc", "z", "nz", "na", "a",
+    "s", "ns", "pe", "po", "l", "ge", "le", "g"};
 
 
 enum InstructionType {
@@ -167,9 +149,7 @@
 class InstructionTable : public ValueObject {
  public:
   InstructionTable();
-  const InstructionDesc& Get(uint8_t x) const {
-    return instructions_[x];
-  }
+  const InstructionDesc& Get(uint8_t x) const { return instructions_[x]; }
 
  private:
   InstructionDesc instructions_[256];
@@ -249,7 +229,7 @@
   for (uint8_t b = 0x70; b <= 0x7F; b++) {
     InstructionDesc* id = &instructions_[b];
     ASSERT(NO_INSTR == id->type);  // Information not already entered
-    id->mnem = NULL;  // Computed depending on condition code.
+    id->mnem = NULL;               // Computed depending on condition code.
     id->type = JUMP_CONDITIONAL_SHORT_INSTR;
   }
 }
@@ -259,23 +239,22 @@
 
 
 static InstructionDesc cmov_instructions[16] = {
-  {"cmovo", TWO_OPERANDS_INSTR, REG_OPER_OP_ORDER, false},
-  {"cmovno", TWO_OPERANDS_INSTR, REG_OPER_OP_ORDER, false},
-  {"cmovc", TWO_OPERANDS_INSTR, REG_OPER_OP_ORDER, false},
-  {"cmovnc", TWO_OPERANDS_INSTR, REG_OPER_OP_ORDER, false},
-  {"cmovz", TWO_OPERANDS_INSTR, REG_OPER_OP_ORDER, false},
-  {"cmovnz", TWO_OPERANDS_INSTR, REG_OPER_OP_ORDER, false},
-  {"cmovna", TWO_OPERANDS_INSTR, REG_OPER_OP_ORDER, false},
-  {"cmova", TWO_OPERANDS_INSTR, REG_OPER_OP_ORDER, false},
-  {"cmovs", TWO_OPERANDS_INSTR, REG_OPER_OP_ORDER, false},
-  {"cmovns", TWO_OPERANDS_INSTR, REG_OPER_OP_ORDER, false},
-  {"cmovpe", TWO_OPERANDS_INSTR, REG_OPER_OP_ORDER, false},
-  {"cmovpo", TWO_OPERANDS_INSTR, REG_OPER_OP_ORDER, false},
-  {"cmovl", TWO_OPERANDS_INSTR, REG_OPER_OP_ORDER, false},
-  {"cmovge", TWO_OPERANDS_INSTR, REG_OPER_OP_ORDER, false},
-  {"cmovle", TWO_OPERANDS_INSTR, REG_OPER_OP_ORDER, false},
-  {"cmovg", TWO_OPERANDS_INSTR, REG_OPER_OP_ORDER, false}
-};
+    {"cmovo", TWO_OPERANDS_INSTR, REG_OPER_OP_ORDER, false},
+    {"cmovno", TWO_OPERANDS_INSTR, REG_OPER_OP_ORDER, false},
+    {"cmovc", TWO_OPERANDS_INSTR, REG_OPER_OP_ORDER, false},
+    {"cmovnc", TWO_OPERANDS_INSTR, REG_OPER_OP_ORDER, false},
+    {"cmovz", TWO_OPERANDS_INSTR, REG_OPER_OP_ORDER, false},
+    {"cmovnz", TWO_OPERANDS_INSTR, REG_OPER_OP_ORDER, false},
+    {"cmovna", TWO_OPERANDS_INSTR, REG_OPER_OP_ORDER, false},
+    {"cmova", TWO_OPERANDS_INSTR, REG_OPER_OP_ORDER, false},
+    {"cmovs", TWO_OPERANDS_INSTR, REG_OPER_OP_ORDER, false},
+    {"cmovns", TWO_OPERANDS_INSTR, REG_OPER_OP_ORDER, false},
+    {"cmovpe", TWO_OPERANDS_INSTR, REG_OPER_OP_ORDER, false},
+    {"cmovpo", TWO_OPERANDS_INSTR, REG_OPER_OP_ORDER, false},
+    {"cmovl", TWO_OPERANDS_INSTR, REG_OPER_OP_ORDER, false},
+    {"cmovge", TWO_OPERANDS_INSTR, REG_OPER_OP_ORDER, false},
+    {"cmovle", TWO_OPERANDS_INSTR, REG_OPER_OP_ORDER, false},
+    {"cmovg", TWO_OPERANDS_INSTR, REG_OPER_OP_ORDER, false}};
 
 
 //-------------------------------------------------
@@ -284,9 +263,8 @@
 
 static const int kMaxXmmRegisters = 16;
 static const char* xmm_regs[kMaxXmmRegisters] = {
-  "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
-  "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
-};
+    "xmm0", "xmm1", "xmm2",  "xmm3",  "xmm4",  "xmm5",  "xmm6",  "xmm7",
+    "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"};
 
 class DisassemblerX64 : public ValueObject {
  public:
@@ -301,8 +279,7 @@
     buffer_[buffer_pos_] = '\0';
   }
 
-  virtual ~DisassemblerX64() {
-  }
+  virtual ~DisassemblerX64() {}
 
   int InstructionDecode(uword pc);
 
@@ -339,24 +316,16 @@
     return DOUBLEWORD_SIZE;
   }
 
-  char operand_size_code() {
-    return "bwlq"[operand_size()];
-  }
+  char operand_size_code() { return "bwlq"[operand_size()]; }
 
   // Disassembler helper functions.
-  void get_modrm(uint8_t data,
-                 int* mod,
-                 int* regop,
-                 int* rm) {
+  void get_modrm(uint8_t data, int* mod, int* regop, int* rm) {
     *mod = (data >> 6) & 3;
     *regop = ((data & 0x38) >> 3) | (rex_r() ? 8 : 0);
     *rm = (data & 7) | (rex_b() ? 8 : 0);
   }
 
-  void get_sib(uint8_t data,
-               int* scale,
-               int* index,
-               int* base) {
+  void get_sib(uint8_t data, int* scale, int* index, int* base) {
     *scale = (data >> 6) & 3;
     *index = ((data >> 3) & 7) | (rex_x() ? 8 : 0);
     *base = (data & 7) | (rex_b() ? 8 : 0);
@@ -378,9 +347,7 @@
   void Print(const char* format, ...) PRINTF_ATTRIBUTE(2, 3);
   void PrintAddress(uint8_t* addr);
 
-  int PrintOperands(const char* mnem,
-                    OperandType op_order,
-                    uint8_t* data);
+  int PrintOperands(const char* mnem, OperandType op_order, uint8_t* data);
 
   typedef const char* (DisassemblerX64::*RegisterNameMapping)(int reg) const;
 
@@ -408,13 +375,11 @@
 
   bool DecodeInstructionType(uint8_t** data);
 
-  void UnimplementedInstruction() {
-    Print("'Unimplemented Instruction'");
-  }
+  void UnimplementedInstruction() { Print("'Unimplemented Instruction'"); }
 
-  char* buffer_;  // Decode instructions into this buffer.
+  char* buffer_;          // Decode instructions into this buffer.
   intptr_t buffer_size_;  // The size of the buffer_.
-  intptr_t buffer_pos_;  // Current character position in the buffer_.
+  intptr_t buffer_pos_;   // Current character position in the buffer_.
 
   // Prefixes parsed
   uint8_t rex_;
@@ -451,8 +416,8 @@
     RegisterNameMapping direct_register_name) {
   int mod, regop, rm;
   get_modrm(*modrmp, &mod, &regop, &rm);
-  RegisterNameMapping register_name = (mod == 3) ? direct_register_name :
-      &DisassemblerX64::NameOfCPURegister;
+  RegisterNameMapping register_name =
+      (mod == 3) ? direct_register_name : &DisassemblerX64::NameOfCPURegister;
   switch (mod) {
     case 0:
       if ((rm & 7) == 5) {
@@ -478,9 +443,7 @@
           return 6;
         } else if (index != 4 && base != 5) {
           // [base+index*scale]
-          Print("[%s+%s*%d]",
-                NameOfCPURegister(base),
-                NameOfCPURegister(index),
+          Print("[%s+%s*%d]", NameOfCPURegister(base), NameOfCPURegister(index),
                 1 << scale);
           return 2;
         } else {
@@ -504,9 +467,7 @@
           Print("[%s", NameOfCPURegister(base));
           PrintDisp(disp, "]");
         } else {
-          Print("[%s+%s*%d",
-                NameOfCPURegister(base),
-                NameOfCPURegister(index),
+          Print("[%s+%s*%d", NameOfCPURegister(base), NameOfCPURegister(index),
                 1 << scale);
           PrintDisp(disp, "]");
         }
@@ -578,8 +539,6 @@
 }
 
 
-
-
 // Returns number of bytes used by machine instruction, including *data byte.
 // Writes immediate instructions to 'tmp_buffer_'.
 int DisassemblerX64::PrintImmediateOp(uint8_t* data) {
@@ -652,10 +611,7 @@
       default:
         UnimplementedInstruction();
     }
-    Print("%s%c %s",
-          mnem,
-          operand_size_code(),
-          NameOfCPURegister(rm));
+    Print("%s%c %s", mnem, operand_size_code(), NameOfCPURegister(rm));
     return 2;
   } else if (regop == 0) {
     Print("test%c ", operand_size_code());
@@ -720,11 +676,8 @@
     imm8 = *(data + 2);
     num_bytes = 3;
   }
-  Print("%s%c %s,",
-        mnem,
-        operand_size_code(),
-        byte_size_operand_ ? NameOfByteCPURegister(rm)
-                           : NameOfCPURegister(rm));
+  Print("%s%c %s,", mnem, operand_size_code(),
+        byte_size_operand_ ? NameOfByteCPURegister(rm) : NameOfCPURegister(rm));
   if (op == 0xD2) {
     Print("cl");
   } else {
@@ -735,8 +688,7 @@
 
 
 int DisassemblerX64::PrintRightOperand(uint8_t* modrmp) {
-  return PrintRightOperandHelper(modrmp,
-                                 &DisassemblerX64::NameOfCPURegister);
+  return PrintRightOperandHelper(modrmp, &DisassemblerX64::NameOfCPURegister);
 }
 
 
@@ -747,8 +699,7 @@
 
 
 int DisassemblerX64::PrintRightXMMOperand(uint8_t* modrmp) {
-  return PrintRightOperandHelper(modrmp,
-                                 &DisassemblerX64::NameOfXMMRegister);
+  return PrintRightOperandHelper(modrmp, &DisassemblerX64::NameOfXMMRegister);
 }
 
 
@@ -761,9 +712,8 @@
   int mod, regop, rm;
   get_modrm(modrm, &mod, &regop, &rm);
   int advance = 0;
-  const char* register_name =
-      byte_size_operand_ ? NameOfByteCPURegister(regop)
-                         : NameOfCPURegister(regop);
+  const char* register_name = byte_size_operand_ ? NameOfByteCPURegister(regop)
+                                                 : NameOfCPURegister(regop);
   switch (op_order) {
     case REG_OPER_OP_ORDER: {
       Print("%s%c %s,", mnem, operand_size_code(), register_name);
@@ -842,12 +792,12 @@
 int DisassemblerX64::FPUInstruction(uint8_t* data) {
   uint8_t escape_opcode = *data;
   ASSERT(0xD8 == (escape_opcode & 0xF8));
-  uint8_t modrm_byte = *(data+1);
+  uint8_t modrm_byte = *(data + 1);
 
   if (modrm_byte >= 0xC0) {
     return RegisterFPUInstruction(escape_opcode, modrm_byte);
   } else {
-    return MemoryFPUInstruction(escape_opcode, modrm_byte, data+1);
+    return MemoryFPUInstruction(escape_opcode, modrm_byte, data + 1);
   }
 }
 
@@ -858,38 +808,69 @@
   const char* mnem = "?";
   int regop = (modrm_byte >> 3) & 0x7;  // reg/op field of modrm byte.
   switch (escape_opcode) {
-    case 0xD9: switch (regop) {
-        case 0: mnem = "fld_s"; break;
-        case 3: mnem = "fstp_s"; break;
-        case 7: mnem = "fstcw"; break;
-        default: UnimplementedInstruction();
+    case 0xD9:
+      switch (regop) {
+        case 0:
+          mnem = "fld_s";
+          break;
+        case 3:
+          mnem = "fstp_s";
+          break;
+        case 7:
+          mnem = "fstcw";
+          break;
+        default:
+          UnimplementedInstruction();
       }
       break;
 
-    case 0xDB: switch (regop) {
-        case 0: mnem = "fild_s"; break;
-        case 1: mnem = "fisttp_s"; break;
-        case 2: mnem = "fist_s"; break;
-        case 3: mnem = "fistp_s"; break;
-        default: UnimplementedInstruction();
+    case 0xDB:
+      switch (regop) {
+        case 0:
+          mnem = "fild_s";
+          break;
+        case 1:
+          mnem = "fisttp_s";
+          break;
+        case 2:
+          mnem = "fist_s";
+          break;
+        case 3:
+          mnem = "fistp_s";
+          break;
+        default:
+          UnimplementedInstruction();
       }
       break;
 
-    case 0xDD: switch (regop) {
-        case 0: mnem = "fld_d"; break;
-        case 3: mnem = "fstp_d"; break;
-        default: UnimplementedInstruction();
+    case 0xDD:
+      switch (regop) {
+        case 0:
+          mnem = "fld_d";
+          break;
+        case 3:
+          mnem = "fstp_d";
+          break;
+        default:
+          UnimplementedInstruction();
       }
       break;
 
-    case 0xDF: switch (regop) {
-        case 5: mnem = "fild_d"; break;
-        case 7: mnem = "fistp_d"; break;
-        default: UnimplementedInstruction();
+    case 0xDF:
+      switch (regop) {
+        case 5:
+          mnem = "fild_d";
+          break;
+        case 7:
+          mnem = "fistp_d";
+          break;
+        default:
+          UnimplementedInstruction();
       }
       break;
 
-    default: UnimplementedInstruction();
+    default:
+      UnimplementedInstruction();
   }
   Print("%s ", mnem);
   int count = PrintRightOperand(modrm_start);
@@ -918,24 +899,59 @@
           break;
         default:
           switch (modrm_byte) {
-            case 0xE0: mnem = "fchs"; break;
-            case 0xE1: mnem = "fabs"; break;
-            case 0xE3: mnem = "fninit"; break;
-            case 0xE4: mnem = "ftst"; break;
-            case 0xE8: mnem = "fld1"; break;
-            case 0xEB: mnem = "fldpi"; break;
-            case 0xED: mnem = "fldln2"; break;
-            case 0xEE: mnem = "fldz"; break;
-            case 0xF0: mnem = "f2xm1"; break;
-            case 0xF1: mnem = "fyl2x"; break;
-            case 0xF2: mnem = "fptan"; break;
-            case 0xF5: mnem = "fprem1"; break;
-            case 0xF7: mnem = "fincstp"; break;
-            case 0xF8: mnem = "fprem"; break;
-            case 0xFD: mnem = "fscale"; break;
-            case 0xFE: mnem = "fsin"; break;
-            case 0xFF: mnem = "fcos"; break;
-            default: UnimplementedInstruction();
+            case 0xE0:
+              mnem = "fchs";
+              break;
+            case 0xE1:
+              mnem = "fabs";
+              break;
+            case 0xE3:
+              mnem = "fninit";
+              break;
+            case 0xE4:
+              mnem = "ftst";
+              break;
+            case 0xE8:
+              mnem = "fld1";
+              break;
+            case 0xEB:
+              mnem = "fldpi";
+              break;
+            case 0xED:
+              mnem = "fldln2";
+              break;
+            case 0xEE:
+              mnem = "fldz";
+              break;
+            case 0xF0:
+              mnem = "f2xm1";
+              break;
+            case 0xF1:
+              mnem = "fyl2x";
+              break;
+            case 0xF2:
+              mnem = "fptan";
+              break;
+            case 0xF5:
+              mnem = "fprem1";
+              break;
+            case 0xF7:
+              mnem = "fincstp";
+              break;
+            case 0xF8:
+              mnem = "fprem";
+              break;
+            case 0xFD:
+              mnem = "fscale";
+              break;
+            case 0xFE:
+              mnem = "fsin";
+              break;
+            case 0xFF:
+              mnem = "fcos";
+              break;
+            default:
+              UnimplementedInstruction();
           }
       }
       break;
@@ -952,7 +968,7 @@
       if ((modrm_byte & 0xF8) == 0xE8) {
         mnem = "fucomi";
         has_register = true;
-      } else if (modrm_byte  == 0xE2) {
+      } else if (modrm_byte == 0xE2) {
         mnem = "fclex";
       } else {
         UnimplementedInstruction();
@@ -962,34 +978,57 @@
     case 0xDC:
       has_register = true;
       switch (modrm_byte & 0xF8) {
-        case 0xC0: mnem = "fadd"; break;
-        case 0xE8: mnem = "fsub"; break;
-        case 0xC8: mnem = "fmul"; break;
-        case 0xF8: mnem = "fdiv"; break;
-        default: UnimplementedInstruction();
+        case 0xC0:
+          mnem = "fadd";
+          break;
+        case 0xE8:
+          mnem = "fsub";
+          break;
+        case 0xC8:
+          mnem = "fmul";
+          break;
+        case 0xF8:
+          mnem = "fdiv";
+          break;
+        default:
+          UnimplementedInstruction();
       }
       break;
 
     case 0xDD:
       has_register = true;
       switch (modrm_byte & 0xF8) {
-        case 0xC0: mnem = "ffree"; break;
-        case 0xD8: mnem = "fstp"; break;
-        default: UnimplementedInstruction();
+        case 0xC0:
+          mnem = "ffree";
+          break;
+        case 0xD8:
+          mnem = "fstp";
+          break;
+        default:
+          UnimplementedInstruction();
       }
       break;
 
     case 0xDE:
-      if (modrm_byte  == 0xD9) {
+      if (modrm_byte == 0xD9) {
         mnem = "fcompp";
       } else {
         has_register = true;
         switch (modrm_byte & 0xF8) {
-          case 0xC0: mnem = "faddp"; break;
-          case 0xE8: mnem = "fsubp"; break;
-          case 0xC8: mnem = "fmulp"; break;
-          case 0xF8: mnem = "fdivp"; break;
-          default: UnimplementedInstruction();
+          case 0xC0:
+            mnem = "faddp";
+            break;
+          case 0xE8:
+            mnem = "fsubp";
+            break;
+          case 0xC8:
+            mnem = "fmulp";
+            break;
+          case 0xF8:
+            mnem = "fdivp";
+            break;
+          default:
+            UnimplementedInstruction();
         }
       }
       break;
@@ -1003,7 +1042,8 @@
       }
       break;
 
-    default: UnimplementedInstruction();
+    default:
+      UnimplementedInstruction();
   }
 
   if (has_register) {
@@ -1068,16 +1108,12 @@
       break;
 
     case REGISTER_INSTR:
-      Print("%s%c %s",
-            idesc.mnem,
-            operand_size_code(),
+      Print("%s%c %s", idesc.mnem, operand_size_code(),
             NameOfCPURegister(base_reg(current & 0x07)));
       (*data)++;
       break;
     case PUSHPOP_INSTR:
-      Print("%s %s",
-            idesc.mnem,
-            NameOfCPURegister(base_reg(current & 0x07)));
+      Print("%s %s", idesc.mnem, NameOfCPURegister(base_reg(current & 0x07)));
       (*data)++;
       break;
     case MOVE_REG_INSTR: {
@@ -1101,8 +1137,7 @@
         default:
           UNREACHABLE();
       }
-      Print("mov%c %s,",
-            operand_size_code(),
+      Print("mov%c %s,", operand_size_code(),
             NameOfCPURegister(base_reg(current & 0x07)));
       PrintAddress(addr);
       break;
@@ -1164,7 +1199,7 @@
         current += 1;
       } else if (third_byte == 0x0b) {
         get_modrm(*current, &mod, &regop, &rm);
-         // roundsd xmm, xmm/m64, imm8
+        // roundsd xmm, xmm/m64, imm8
         Print("roundsd %s, ", NameOfCPURegister(regop));
         current += PrintRightOperand(current);
         Print(", %d", (*current) & 3);
@@ -1193,17 +1228,13 @@
         current += PrintRightXMMOperand(current);
         Print(", %s", NameOfXMMRegister(regop));
       } else if (opcode == 0x6E) {
-        Print("mov%c %s,",
-              rex_w() ? 'q' : 'd',
-              NameOfXMMRegister(regop));
+        Print("mov%c %s,", rex_w() ? 'q' : 'd', NameOfXMMRegister(regop));
         current += PrintRightOperand(current);
       } else if (opcode == 0x6F) {
-        Print("movdqa %s,",
-              NameOfXMMRegister(regop));
+        Print("movdqa %s,", NameOfXMMRegister(regop));
         current += PrintRightXMMOperand(current);
       } else if (opcode == 0x7E) {
-        Print("mov%c ",
-              rex_w() ? 'q' : 'd');
+        Print("mov%c ", rex_w() ? 'q' : 'd');
         current += PrintRightOperand(current);
         Print(", %s", NameOfXMMRegister(regop));
       } else if (opcode == 0x7F) {
@@ -1225,9 +1256,9 @@
           mnemonic = "unpckhpd";
         } else if (opcode == 0x54) {
           mnemonic = "andpd";
-        } else  if (opcode == 0x56) {
+        } else if (opcode == 0x56) {
           mnemonic = "orpd";
-        } else  if (opcode == 0x57) {
+        } else if (opcode == 0x57) {
           mnemonic = "xorpd";
         } else if (opcode == 0x2E) {
           mnemonic = "ucomisd";
@@ -1286,15 +1317,13 @@
       // Convert with truncation scalar double-precision FP to integer.
       int mod, regop, rm;
       get_modrm(*current, &mod, &regop, &rm);
-      Print("cvttsd2si%c %s,",
-          operand_size_code(), NameOfCPURegister(regop));
+      Print("cvttsd2si%c %s,", operand_size_code(), NameOfCPURegister(regop));
       current += PrintRightXMMOperand(current);
     } else if (opcode == 0x2D) {
       // CVTSD2SI: Convert scalar double-precision FP to integer.
       int mod, regop, rm;
       get_modrm(*current, &mod, &regop, &rm);
-      Print("cvtsd2si%c %s,",
-          operand_size_code(), NameOfCPURegister(regop));
+      Print("cvtsd2si%c %s,", operand_size_code(), NameOfCPURegister(regop));
       current += PrintRightXMMOperand(current);
     } else if ((opcode & 0xF8) == 0x58 || opcode == 0x51) {
       // XMM arithmetic. Mnemonic was retrieved at the start of this function.
@@ -1330,8 +1359,7 @@
       // Convert with truncation scalar single-precision FP to dword integer.
       int mod, regop, rm;
       get_modrm(*current, &mod, &regop, &rm);
-      Print("cvttss2si%c %s,",
-            operand_size_code(), NameOfCPURegister(regop));
+      Print("cvttss2si%c %s,", operand_size_code(), NameOfCPURegister(regop));
       current += PrintRightXMMOperand(current);
     } else if (opcode == 0x5A) {
       // CVTSS2SD:
@@ -1418,24 +1446,59 @@
              opcode == 0x5E || opcode == 0x5F) {
     const char* mnemonic = NULL;
     switch (opcode) {
-      case 0x12: mnemonic = "movhlps"; break;
-      case 0x14: mnemonic = "unpcklps"; break;
-      case 0x15: mnemonic = "unpckhps"; break;
-      case 0x16: mnemonic = "movlhps"; break;
-      case 0x51: mnemonic = "sqrtps"; break;
-      case 0x52: mnemonic = "rsqrtps"; break;
-      case 0x53: mnemonic = "rcpps"; break;
-      case 0x54: mnemonic = "andps"; break;
-      case 0x56: mnemonic = "orps"; break;
-      case 0x57: mnemonic = "xorps"; break;
-      case 0x58: mnemonic = "addps"; break;
-      case 0x59: mnemonic = "mulps"; break;
-      case 0x5A: mnemonic = "cvtsd2ss"; break;
-      case 0x5C: mnemonic = "subps"; break;
-      case 0x5D: mnemonic = "minps"; break;
-      case 0x5E: mnemonic = "divps"; break;
-      case 0x5F: mnemonic = "maxps"; break;
-      default: UNREACHABLE();
+      case 0x12:
+        mnemonic = "movhlps";
+        break;
+      case 0x14:
+        mnemonic = "unpcklps";
+        break;
+      case 0x15:
+        mnemonic = "unpckhps";
+        break;
+      case 0x16:
+        mnemonic = "movlhps";
+        break;
+      case 0x51:
+        mnemonic = "sqrtps";
+        break;
+      case 0x52:
+        mnemonic = "rsqrtps";
+        break;
+      case 0x53:
+        mnemonic = "rcpps";
+        break;
+      case 0x54:
+        mnemonic = "andps";
+        break;
+      case 0x56:
+        mnemonic = "orps";
+        break;
+      case 0x57:
+        mnemonic = "xorps";
+        break;
+      case 0x58:
+        mnemonic = "addps";
+        break;
+      case 0x59:
+        mnemonic = "mulps";
+        break;
+      case 0x5A:
+        mnemonic = "cvtsd2ss";
+        break;
+      case 0x5C:
+        mnemonic = "subps";
+        break;
+      case 0x5D:
+        mnemonic = "minps";
+        break;
+      case 0x5E:
+        mnemonic = "divps";
+        break;
+      case 0x5F:
+        mnemonic = "maxps";
+        break;
+      default:
+        UNREACHABLE();
     }
     int mod, regop, rm;
     get_modrm(*current, &mod, &regop, &rm);
@@ -1562,9 +1625,7 @@
         break;
 
       case 0xC8:
-        Print("enter %d, %d",
-              *reinterpret_cast<uint16_t*>(data + 1),
-              data[3]);
+        Print("enter %d, %d", *reinterpret_cast<uint16_t*>(data + 1), data[3]);
         data += 4;
         break;
 
@@ -1572,11 +1633,9 @@
       case 0x6B: {
         int mod, regop, rm;
         get_modrm(*(data + 1), &mod, &regop, &rm);
-        int32_t imm = *data == 0x6B ? *(data + 2)
-            : *reinterpret_cast<int32_t*>(data + 2);
-        Print("imul%c %s,%s,",
-              operand_size_code(),
-              NameOfCPURegister(regop),
+        int32_t imm =
+            *data == 0x6B ? *(data + 2) : *reinterpret_cast<int32_t*>(data + 2);
+        Print("imul%c %s,%s,", operand_size_code(), NameOfCPURegister(regop),
               NameOfCPURegister(rm));
         PrintImmediateValue(imm);
         data += 2 + (*data == 0x6B ? 1 : 4);
@@ -1600,8 +1659,7 @@
           Print("pop ");
           data += PrintRightOperand(data);
         }
-      }
-        break;
+      } break;
 
       case 0xFF: {
         data++;
@@ -1633,8 +1691,7 @@
           Print("%s ", mnem);
         }
         data += PrintRightOperand(data);
-      }
-        break;
+      } break;
 
       case 0xC7:  // imm32, fall through
       case 0xC6:  // imm8
@@ -1656,8 +1713,7 @@
           PrintImmediateValue(imm);
           data += 4;
         }
-      }
-        break;
+      } break;
 
       case 0x80: {
         data++;
@@ -1667,8 +1723,7 @@
         Print(",");
         PrintImmediateValue(imm);
         data++;
-      }
-        break;
+      } break;
 
       case 0x88:  // 8bit, fall through
       case 0x89:  // 32bit
@@ -1686,8 +1741,7 @@
           data += PrintRightOperand(data);
           Print(",%s", NameOfCPURegister(regop));
         }
-      }
-        break;
+      } break;
 
       case 0x90:
       case 0x91:
@@ -1704,8 +1758,7 @@
           Print("xchg%c rax, %s", operand_size_code(), NameOfCPURegister(reg));
         }
         data++;
-      }
-        break;
+      } break;
       case 0xB0:
       case 0xB1:
       case 0xB2:
@@ -1764,22 +1817,19 @@
       case 0xA3:
         switch (operand_size()) {
           case DOUBLEWORD_SIZE: {
-            PrintAddress(
-                reinterpret_cast<uint8_t*>(
-                    *reinterpret_cast<int32_t*>(data + 1)));
+            PrintAddress(reinterpret_cast<uint8_t*>(
+                *reinterpret_cast<int32_t*>(data + 1)));
             if (*data == 0xA1) {  // Opcode 0xA1
               Print("movzxlq rax,(");
-              PrintAddress(
-                  reinterpret_cast<uint8_t*>(
-                      *reinterpret_cast<int32_t*>(data + 1)));
+              PrintAddress(reinterpret_cast<uint8_t*>(
+                  *reinterpret_cast<int32_t*>(data + 1)));
               Print(")");
             } else {  // Opcode 0xA3
               Print("movzxlq (");
-              PrintAddress(
-                  reinterpret_cast<uint8_t*>(
-                      *reinterpret_cast<int32_t*>(data + 1)));
+              PrintAddress(reinterpret_cast<uint8_t*>(
+                  *reinterpret_cast<int32_t*>(data + 1)));
               Print("),rax");
-           }
+            }
             data += 5;
             break;
           }
@@ -1878,10 +1928,14 @@
 }
 
 
-void Disassembler::DecodeInstruction(char* hex_buffer, intptr_t hex_size,
-                                     char* human_buffer, intptr_t human_size,
-                                     int* out_instr_len, const Code& code,
-                                     Object** object, uword pc) {
+void Disassembler::DecodeInstruction(char* hex_buffer,
+                                     intptr_t hex_size,
+                                     char* human_buffer,
+                                     intptr_t human_size,
+                                     int* out_instr_len,
+                                     const Code& code,
+                                     Object** object,
+                                     uword pc) {
   ASSERT(hex_size > 0);
   ASSERT(human_size > 0);
   DisassemblerX64 decoder(human_buffer, human_size);
diff --git a/runtime/vm/double_conversion.cc b/runtime/vm/double_conversion.cc
index cb3c047..4490d5f 100644
--- a/runtime/vm/double_conversion.cc
+++ b/runtime/vm/double_conversion.cc
@@ -34,16 +34,14 @@
   static const int kConversionFlags =
       double_conversion::DoubleToStringConverter::EMIT_POSITIVE_EXPONENT_SIGN |
       double_conversion::DoubleToStringConverter::EMIT_TRAILING_DECIMAL_POINT |
-     double_conversion::DoubleToStringConverter::EMIT_TRAILING_ZERO_AFTER_POINT;
+      double_conversion::DoubleToStringConverter::
+          EMIT_TRAILING_ZERO_AFTER_POINT;
 
   const double_conversion::DoubleToStringConverter converter(
-      kConversionFlags,
-      kDoubleToStringCommonInfinitySymbol,
-      kDoubleToStringCommonNaNSymbol,
-      kDoubleToStringCommonExponentChar,
-      kDecimalLow,
-      kDecimalHigh,
-      0, 0);  // Last two values are ignored in shortest mode.
+      kConversionFlags, kDoubleToStringCommonInfinitySymbol,
+      kDoubleToStringCommonNaNSymbol, kDoubleToStringCommonExponentChar,
+      kDecimalLow, kDecimalHigh, 0,
+      0);  // Last two values are ignored in shortest mode.
 
   double_conversion::StringBuilder builder(buffer, buffer_size);
   bool status = converter.ToShortest(d, &builder);
@@ -80,11 +78,9 @@
          fraction_digits <= kMaxFractionDigits);
 
   const double_conversion::DoubleToStringConverter converter(
-      kConversionFlags,
-      kDoubleToStringCommonInfinitySymbol,
-      kDoubleToStringCommonNaNSymbol,
-      kDoubleToStringCommonExponentChar,
-      0, 0, 0, 0);  // Last four values are ignored in fixed mode.
+      kConversionFlags, kDoubleToStringCommonInfinitySymbol,
+      kDoubleToStringCommonNaNSymbol, kDoubleToStringCommonExponentChar, 0, 0,
+      0, 0);  // Last four values are ignored in fixed mode.
 
   char* buffer = Thread::Current()->zone()->Alloc<char>(kBufferSize);
   buffer[kBufferSize - 1] = '\0';
@@ -113,11 +109,9 @@
          fraction_digits <= kMaxFractionDigits);
 
   const double_conversion::DoubleToStringConverter converter(
-      kConversionFlags,
-      kDoubleToStringCommonInfinitySymbol,
-      kDoubleToStringCommonNaNSymbol,
-      kDoubleToStringCommonExponentChar,
-      0, 0, 0, 0);  // Last four values are ignored in exponential mode.
+      kConversionFlags, kDoubleToStringCommonInfinitySymbol,
+      kDoubleToStringCommonNaNSymbol, kDoubleToStringCommonExponentChar, 0, 0,
+      0, 0);  // Last four values are ignored in exponential mode.
 
   char* buffer = Thread::Current()->zone()->Alloc<char>(kBufferSize);
   buffer[kBufferSize - 1] = '\0';
@@ -145,18 +139,16 @@
   // plus the \0.
   // Note that padding and exponent are exclusive. We still add them up.
   ASSERT(kBufferSize >= 1 + 1 + 1 + kMaxLeadingPaddingZeroes +
-         kMaxTrailingPaddingZeroes + kMaxPrecisionDigits + 1 + 1 + 3 + 1);
+                            kMaxTrailingPaddingZeroes + kMaxPrecisionDigits +
+                            1 + 1 + 3 + 1);
 
   ASSERT(kMinPrecisionDigits <= precision && precision <= kMaxPrecisionDigits);
 
   const double_conversion::DoubleToStringConverter converter(
-      kConversionFlags,
-      kDoubleToStringCommonInfinitySymbol,
-      kDoubleToStringCommonNaNSymbol,
-      kDoubleToStringCommonExponentChar,
-      0, 0,  // Ignored in precision mode.
-      kMaxLeadingPaddingZeroes,
-      kMaxTrailingPaddingZeroes);
+      kConversionFlags, kDoubleToStringCommonInfinitySymbol,
+      kDoubleToStringCommonNaNSymbol, kDoubleToStringCommonExponentChar, 0,
+      0,  // Ignored in precision mode.
+      kMaxLeadingPaddingZeroes, kMaxTrailingPaddingZeroes);
 
   char* buffer = Thread::Current()->zone()->Alloc<char>(kBufferSize);
   buffer[kBufferSize - 1] = '\0';
@@ -173,16 +165,12 @@
   }
 
   double_conversion::StringToDoubleConverter converter(
-    double_conversion::StringToDoubleConverter::NO_FLAGS,
-    0.0,
-    0.0,
-    kDoubleToStringCommonInfinitySymbol,
-    kDoubleToStringCommonNaNSymbol);
+      double_conversion::StringToDoubleConverter::NO_FLAGS, 0.0, 0.0,
+      kDoubleToStringCommonInfinitySymbol, kDoubleToStringCommonNaNSymbol);
 
   int parsed_count = 0;
-  *result = converter.StringToDouble(str,
-                                     static_cast<int>(length),
-                                     &parsed_count);
+  *result =
+      converter.StringToDouble(str, static_cast<int>(length), &parsed_count);
   return (parsed_count == length);
 }
 
diff --git a/runtime/vm/double_internals.h b/runtime/vm/double_internals.h
index 4a55548..87125be 100644
--- a/runtime/vm/double_internals.h
+++ b/runtime/vm/double_internals.h
@@ -10,7 +10,9 @@
 namespace dart {
 
 // We assume that doubles and uint64_t have the same endianness.
-static uint64_t double_to_uint64(double d) { return bit_cast<uint64_t>(d); }
+static uint64_t double_to_uint64(double d) {
+  return bit_cast<uint64_t>(d);
+}
 
 // Helper functions for doubles.
 class DoubleInternals {
@@ -20,9 +22,7 @@
   explicit DoubleInternals(double d) : d64_(double_to_uint64(d)) {}
 
   // Returns the double's bit as uint64.
-  uint64_t AsUint64() const {
-    return d64_;
-  }
+  uint64_t AsUint64() const { return d64_; }
 
   int Exponent() const {
     if (IsDenormal()) return kDenormalExponent;
@@ -58,7 +58,7 @@
 
   int Sign() const {
     uint64_t d64 = AsUint64();
-    return (d64 & kSignMask) == 0? 1: -1;
+    return (d64 & kSignMask) == 0 ? 1 : -1;
   }
 
  private:
diff --git a/runtime/vm/exceptions.cc b/runtime/vm/exceptions.cc
index a0af67e..4b73efd 100644
--- a/runtime/vm/exceptions.cc
+++ b/runtime/vm/exceptions.cc
@@ -22,14 +22,16 @@
 namespace dart {
 
 DECLARE_FLAG(bool, trace_deoptimization);
-DEFINE_FLAG(bool, print_stacktrace_at_throw, false,
+DEFINE_FLAG(bool,
+            print_stacktrace_at_throw,
+            false,
             "Prints a stack trace everytime a throw occurs.");
 
 
 class StacktraceBuilder : public ValueObject {
  public:
-  StacktraceBuilder() { }
-  virtual ~StacktraceBuilder() { }
+  StacktraceBuilder() {}
+  virtual ~StacktraceBuilder() {}
 
   virtual void AddFrame(const Code& code, const Smi& offset) = 0;
 };
@@ -39,10 +41,10 @@
  public:
   explicit RegularStacktraceBuilder(Zone* zone)
       : code_list_(
-          GrowableObjectArray::Handle(zone, GrowableObjectArray::New())),
+            GrowableObjectArray::Handle(zone, GrowableObjectArray::New())),
         pc_offset_list_(
-          GrowableObjectArray::Handle(zone, GrowableObjectArray::New())) { }
-  ~RegularStacktraceBuilder() { }
+            GrowableObjectArray::Handle(zone, GrowableObjectArray::New())) {}
+  ~RegularStacktraceBuilder() {}
 
   const GrowableObjectArray& code_list() const { return code_list_; }
   const GrowableObjectArray& pc_offset_list() const { return pc_offset_list_; }
@@ -63,13 +65,13 @@
 class PreallocatedStacktraceBuilder : public StacktraceBuilder {
  public:
   explicit PreallocatedStacktraceBuilder(const Instance& stacktrace)
-  : stacktrace_(Stacktrace::Cast(stacktrace)),
+      : stacktrace_(Stacktrace::Cast(stacktrace)),
         cur_index_(0),
         dropped_frames_(0) {
     ASSERT(stacktrace_.raw() ==
            Isolate::Current()->object_store()->preallocated_stack_trace());
   }
-  ~PreallocatedStacktraceBuilder() { }
+  ~PreallocatedStacktraceBuilder() {}
 
   virtual void AddFrame(const Code& code, const Smi& offset);
 
@@ -156,10 +158,8 @@
   uword temp_handler_pc = kUwordMax;
   while (!frame->IsEntryFrame()) {
     if (frame->IsDartFrame()) {
-      if (frame->FindExceptionHandler(thread,
-                                      &temp_handler_pc,
-                                      needs_stacktrace,
-                                      &is_catch_all)) {
+      if (frame->FindExceptionHandler(thread, &temp_handler_pc,
+                                      needs_stacktrace, &is_catch_all)) {
         if (!handler_pc_set) {
           handler_pc_set = true;
           *handler_pc = temp_handler_pc;
@@ -259,9 +259,10 @@
     for (intptr_t i = 0; i < pending_deopts->length(); i++) {
       if ((*pending_deopts)[i].fp() < frame_pointer) {
         if (FLAG_trace_deoptimization) {
-          THR_Print("Lazy deopt skipped due to throw for "
-                    "fp=%" Pp ", pc=%" Pp "\n",
-                    (*pending_deopts)[i].fp(), (*pending_deopts)[i].pc());
+          THR_Print(
+              "Lazy deopt skipped due to throw for "
+              "fp=%" Pp ", pc=%" Pp "\n",
+              (*pending_deopts)[i].fp(), (*pending_deopts)[i].pc());
         }
         pending_deopts->RemoveAt(i);
       }
@@ -303,8 +304,8 @@
   ASAN_UNPOISON(reinterpret_cast<void*>(current_sp),
                 stack_pointer - current_sp);
 
-  func(program_counter, stack_pointer, frame_pointer,
-       raw_exception, raw_stacktrace, thread);
+  func(program_counter, stack_pointer, frame_pointer, raw_exception,
+       raw_stacktrace, thread);
 #endif
   UNREACHABLE();
 }
@@ -318,8 +319,8 @@
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   Isolate* isolate = thread->isolate();
-  Class& error_class = Class::Handle(zone,
-                                     isolate->object_store()->error_class());
+  Class& error_class =
+      Class::Handle(zone, isolate->object_store()->error_class());
   if (error_class.IsNull()) {
     const Library& core_lib = Library::Handle(zone, Library::CoreLibrary());
     error_class = core_lib.LookupClass(Symbols::Error());
@@ -349,10 +350,10 @@
   BuildStackTrace(&frame_builder);
 
   // Create arrays for code and pc_offset tuples of each frame.
-  const Array& full_code_array = Array::Handle(zone,
-      Array::MakeArray(frame_builder.code_list()));
-  const Array& full_pc_offset_array = Array::Handle(zone,
-      Array::MakeArray(frame_builder.pc_offset_list()));
+  const Array& full_code_array =
+      Array::Handle(zone, Array::MakeArray(frame_builder.code_list()));
+  const Array& full_pc_offset_array =
+      Array::Handle(zone, Array::MakeArray(frame_builder.pc_offset_list()));
   const Stacktrace& full_stacktrace = Stacktrace::Handle(
       Stacktrace::New(full_code_array, full_pc_offset_array));
   return full_stacktrace.raw();
@@ -368,8 +369,8 @@
   bool use_preallocated_stacktrace = false;
   Instance& exception = Instance::Handle(zone, incoming_exception.raw());
   if (exception.IsNull()) {
-    exception ^= Exceptions::Create(Exceptions::kNullThrown,
-                                    Object::empty_array());
+    exception ^=
+        Exceptions::Create(Exceptions::kNullThrown, Object::empty_array());
   } else if (exception.raw() == isolate->object_store()->out_of_memory() ||
              exception.raw() == isolate->object_store()->stack_overflow()) {
     use_preallocated_stacktrace = true;
@@ -383,11 +384,9 @@
   if (use_preallocated_stacktrace) {
     stacktrace ^= isolate->object_store()->preallocated_stack_trace();
     PreallocatedStacktraceBuilder frame_builder(stacktrace);
-    handler_exists = FindExceptionHandler(thread,
-                                          &handler_pc,
-                                          &handler_sp,
-                                          &handler_fp,
-                                          &handler_needs_stacktrace);
+    handler_exists =
+        FindExceptionHandler(thread, &handler_pc, &handler_sp, &handler_fp,
+                             &handler_needs_stacktrace);
     if (handler_pc == 0) {
       // No Dart frame.
       ASSERT(incoming_exception.raw() ==
@@ -408,11 +407,9 @@
 
     // Find the exception handler and determine if the handler needs a
     // stacktrace.
-    handler_exists = FindExceptionHandler(thread,
-                                          &handler_pc,
-                                          &handler_sp,
-                                          &handler_fp,
-                                          &handler_needs_stacktrace);
+    handler_exists =
+        FindExceptionHandler(thread, &handler_pc, &handler_sp, &handler_fp,
+                             &handler_needs_stacktrace);
     if (!existing_stacktrace.IsNull()) {
       // If we have an existing stack trace then this better be a rethrow. The
       // reverse is not necessarily true (e.g. Dart_PropagateError can cause
@@ -445,12 +442,8 @@
   }
   if (handler_exists) {
     // Found a dart handler for the exception, jump to it.
-    JumpToExceptionHandler(thread,
-                           handler_pc,
-                           handler_sp,
-                           handler_fp,
-                           exception,
-                           stacktrace);
+    JumpToExceptionHandler(thread, handler_pc, handler_sp, handler_fp,
+                           exception, stacktrace);
   } else {
     // No dart exception handler found in this invocation sequence,
     // so we create an unhandled exception object and return to the
@@ -462,12 +455,8 @@
     const UnhandledException& unhandled_exception = UnhandledException::Handle(
         zone, UnhandledException::New(exception, stacktrace));
     stacktrace = Stacktrace::null();
-    JumpToExceptionHandler(thread,
-                           handler_pc,
-                           handler_sp,
-                           handler_fp,
-                           unhandled_exception,
-                           stacktrace);
+    JumpToExceptionHandler(thread, handler_pc, handler_sp, handler_fp,
+                           unhandled_exception, stacktrace);
   }
   UNREACHABLE();
 }
@@ -492,8 +481,8 @@
 RawInstance* Exceptions::NewInstance(const char* class_name) {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
-  const String& cls_name = String::Handle(zone,
-                                          Symbols::New(thread, class_name));
+  const String& cls_name =
+      String::Handle(zone, Symbols::New(thread, class_name));
   const Library& core_lib = Library::Handle(Library::CoreLibrary());
   // No ambiguity error expected: passing NULL.
   Class& cls = Class::Handle(core_lib.LookupClass(cls_name));
@@ -516,7 +505,9 @@
 
   ExceptionType exception_type =
       (bound_error_msg.IsNull() &&
-       (dst_name.raw() == Symbols::InTypeCast().raw())) ? kCast : kType;
+       (dst_name.raw() == Symbols::InTypeCast().raw()))
+          ? kCast
+          : kType;
 
   DartFrameIterator iterator;
   const Script& script = Script::Handle(zone, GetCallerScript(&iterator));
@@ -533,8 +524,8 @@
   args.SetAt(2, Smi::Handle(zone, Smi::New(column)));
 
   // Construct '_errorMsg'.
-  const GrowableObjectArray& pieces = GrowableObjectArray::Handle(zone,
-      GrowableObjectArray::New(20));
+  const GrowableObjectArray& pieces =
+      GrowableObjectArray::Handle(zone, GrowableObjectArray::New(20));
 
   // Print bound error first, if any.
   if (!bound_error_msg.IsNull() && (bound_error_msg.Length() > 0)) {
@@ -619,10 +610,11 @@
     }
   }
   // Null object is a valid exception object.
-  ThrowExceptionHelper(thread, exception,
-      Stacktrace::Handle(thread->zone()), false);
+  ThrowExceptionHelper(thread, exception, Stacktrace::Handle(thread->zone()),
+                       false);
 }
 
+
 void Exceptions::ReThrow(Thread* thread,
                          const Instance& exception,
                          const Instance& stacktrace) {
@@ -797,10 +789,8 @@
       break;
   }
 
-  return DartLibraryCalls::InstanceCreate(library,
-                                          *class_name,
-                                          *constructor_name,
-                                          arguments);
+  return DartLibraryCalls::InstanceCreate(library, *class_name,
+                                          *constructor_name, arguments);
 }
 
 
diff --git a/runtime/vm/exceptions_test.cc b/runtime/vm/exceptions_test.cc
index 355bc01..5fbfaa2 100644
--- a/runtime/vm/exceptions_test.cc
+++ b/runtime/vm/exceptions_test.cc
@@ -11,8 +11,7 @@
 
 
 #define FUNCTION_NAME(name) UnhandledExcp_##name
-#define REGISTER_FUNCTION(name, count)                                         \
-  { ""#name, FUNCTION_NAME(name), count },
+#define REGISTER_FUNCTION(name, count) {"" #name, FUNCTION_NAME(name), count},
 
 
 void FUNCTION_NAME(Unhandled_equals)(Dart_NativeArguments args) {
@@ -20,8 +19,8 @@
   const Instance& expected = Instance::CheckedHandle(arguments->NativeArgAt(0));
   const Instance& actual = Instance::CheckedHandle(arguments->NativeArgAt(1));
   if (!expected.CanonicalizeEquals(actual)) {
-    OS::Print("expected: '%s' actual: '%s'\n",
-        expected.ToCString(), actual.ToCString());
+    OS::Print("expected: '%s' actual: '%s'\n", expected.ToCString(),
+              actual.ToCString());
     FATAL("Unhandled_equals fails.\n");
   }
 }
@@ -30,10 +29,7 @@
 void FUNCTION_NAME(Unhandled_invoke)(Dart_NativeArguments args) {
   // Invoke the specified entry point.
   Dart_Handle cls = Dart_GetClass(TestCase::lib(), NewString("Second"));
-  Dart_Handle result = Dart_Invoke(cls,
-                                   NewString("method2"),
-                                   0,
-                                   NULL);
+  Dart_Handle result = Dart_Invoke(cls, NewString("method2"), 0, NULL);
   ASSERT(Dart_IsError(result));
   ASSERT(Dart_ErrorHasException(result));
   return;
@@ -43,10 +39,7 @@
 void FUNCTION_NAME(Unhandled_invoke2)(Dart_NativeArguments args) {
   // Invoke the specified entry point.
   Dart_Handle cls = Dart_GetClass(TestCase::lib(), NewString("Second"));
-  Dart_Handle result = Dart_Invoke(cls,
-                                   NewString("method2"),
-                                   0,
-                                   NULL);
+  Dart_Handle result = Dart_Invoke(cls, NewString("method2"), 0, NULL);
   ASSERT(Dart_IsError(result));
   ASSERT(Dart_ErrorHasException(result));
   Dart_Handle exception = Dart_ErrorGetException(result);
@@ -63,16 +56,14 @@
 #define UNHANDLED_NATIVE_LIST(V)                                               \
   V(Unhandled_equals, 2)                                                       \
   V(Unhandled_invoke, 0)                                                       \
-  V(Unhandled_invoke2, 0)                                                      \
+  V(Unhandled_invoke2, 0)
 
 
 static struct NativeEntries {
   const char* name_;
   Dart_NativeFunction function_;
   int argument_count_;
-} BuiltinEntries[] = {
-  UNHANDLED_NATIVE_LIST(REGISTER_FUNCTION)
-};
+} BuiltinEntries[] = {UNHANDLED_NATIVE_LIST(REGISTER_FUNCTION)};
 
 
 static Dart_NativeFunction native_lookup(Dart_Handle name,
@@ -127,8 +118,7 @@
       "  UnhandledExceptions.equals(3, Second.method3(1));\n"
       "}";
   Dart_Handle lib = TestCase::LoadTestScript(
-      kScriptChars,
-      reinterpret_cast<Dart_NativeEntryResolver>(native_lookup));
+      kScriptChars, reinterpret_cast<Dart_NativeEntryResolver>(native_lookup));
   EXPECT_VALID(Dart_Invoke(lib, NewString("testMain"), 0, NULL));
 }
 
diff --git a/runtime/vm/find_code_object_test.cc b/runtime/vm/find_code_object_test.cc
index 75ffa2b..a47129e 100644
--- a/runtime/vm/find_code_object_test.cc
+++ b/runtime/vm/find_code_object_test.cc
@@ -48,13 +48,10 @@
   // Load up class A with 1024 functions.
   int written = OS::SNPrint(scriptChars, kScriptSize, "class A {");
   for (int i = 0; i < kNumFunctions; i++) {
-    OS::SNPrint(buffer,
-                256,
+    OS::SNPrint(buffer, 256,
                 "static foo%d([int i=1,int j=2,int k=3]){return i+j+k;}", i);
-    written += OS::SNPrint((scriptChars + written),
-                           (kScriptSize - written),
-                           "%s",
-                           buffer);
+    written += OS::SNPrint((scriptChars + written), (kScriptSize - written),
+                           "%s", buffer);
   }
   OS::SNPrint((scriptChars + written), (kScriptSize - written), "}");
   source = String::New(scriptChars);
@@ -78,32 +75,23 @@
   written = OS::SNPrint(scriptChars, kScriptSize, "class B {");
   // Create one large function.
   OS::SNPrint(buffer, sizeof(buffer), "static moo0([var i=1]) { ");
-  written += OS::SNPrint((scriptChars + written),
-                         (kScriptSize - written),
-                         "%s",
+  written += OS::SNPrint((scriptChars + written), (kScriptSize - written), "%s",
                          buffer);
   // Generate a large function so that the code for this function when
   // compiled will reside in a large page.
   for (int i = 0; i < kLoopCount; i++) {
     OS::SNPrint(buffer, sizeof(buffer), "i = i+i;");
-    written += OS::SNPrint((scriptChars + written),
-                           (kScriptSize - written),
-                           "%s",
-                           buffer);
+    written += OS::SNPrint((scriptChars + written), (kScriptSize - written),
+                           "%s", buffer);
   }
   OS::SNPrint(buffer, sizeof(buffer), "return i; }");
-  written += OS::SNPrint((scriptChars + written),
-                         (kScriptSize - written),
-                         "%s",
+  written += OS::SNPrint((scriptChars + written), (kScriptSize - written), "%s",
                          buffer);
   for (int i = 1; i < kNumFunctions; i++) {
-    OS::SNPrint(buffer,
-                256,
+    OS::SNPrint(buffer, 256,
                 "static moo%d([int i=1,int j=2,int k=3]){return i+j+k;}", i);
-    written += OS::SNPrint((scriptChars + written),
-                           (kScriptSize - written),
-                           "%s",
-                           buffer);
+    written += OS::SNPrint((scriptChars + written), (kScriptSize - written),
+                           "%s", buffer);
   }
   OS::SNPrint((scriptChars + written), (kScriptSize - written), "}");
   url = String::New("dart-test:FindCodeObject");
diff --git a/runtime/vm/flag_list.h b/runtime/vm/flag_list.h
index 6b2e631..94c0425 100644
--- a/runtime/vm/flag_list.h
+++ b/runtime/vm/flag_list.h
@@ -41,164 +41,126 @@
 //   D(name, type, default_value, comment)
 //   C(name, precompiled_value, product_value, type, default_value, comment)
 #define FLAG_LIST(P, R, D, C)                                                  \
-P(background_compilation, bool, USING_MULTICORE,                               \
-  "Run optimizing compilation in background")                                  \
-R(background_compilation_stop_alot, false, bool, false,                        \
-  "Stress test system: stop background compiler often.")                       \
-P(background_finalization, bool, USING_MULTICORE,                              \
-  "Run weak handle finalizers in background")                                  \
-R(break_at_isolate_spawn, false, bool, false,                                  \
-  "Insert a one-time breakpoint at the entrypoint for all spawned isolates")   \
-C(collect_code, false, true, bool, true,                                       \
-  "Attempt to GC infrequently used code.")                                     \
-P(collect_dynamic_function_names, bool, true,                                  \
-  "Collects all dynamic function names to identify unique targets")            \
-R(concurrent_sweep, USING_MULTICORE, bool, USING_MULTICORE,                    \
-  "Concurrent sweep for old generation.")                                      \
-R(dedup_instructions, true, bool, false,                                       \
-  "Canonicalize instructions when precompiling.")                              \
-C(deoptimize_alot, false, false, bool, false,                                  \
-  "Deoptimizes we are about to return to Dart code from native entries.")      \
-C(deoptimize_every, 0, 0, int, 0,                                              \
-  "Deoptimize on every N stack overflow checks")                               \
-R(disable_alloc_stubs_after_gc, false, bool, false,                            \
-  "Stress testing flag.")                                                      \
-R(disassemble, false, bool, false,                                             \
-  "Disassemble dart code.")                                                    \
-R(disassemble_optimized, false, bool, false,                                   \
-  "Disassemble optimized code.")                                               \
-R(dump_megamorphic_stats, false, bool, false,                                  \
-  "Dump megamorphic cache statistics")                                         \
-R(dump_symbol_stats, false, bool, false,                                       \
-  "Dump symbol table statistics")                                              \
-R(enable_asserts, false, bool, false,                                          \
-  "Enable assert statements.")                                                 \
-C(enable_mirrors, false, false, bool, true,                                    \
-  "Disable to make importing dart:mirrors an error.")                          \
-R(enable_type_checks, false, bool, false,                                      \
-  "Enable type checks.")                                                       \
-R(error_on_bad_override, false, bool, false,                                   \
-  "Report error for bad overrides.")                                           \
-R(error_on_bad_type, false, bool, false,                                       \
-  "Report error for malformed types.")                                         \
-P(external_max_size, int, (kWordSize <= 4) ? 512 : 1024,                       \
-  "Max total size of external allocations in MB, or 0 for unlimited,"          \
-  "e.g: --external_max_size=1024 allows up to 1024MB of externals")            \
-P(fields_may_be_reset, bool, false,                                            \
-  "Don't optimize away static field initialization")                           \
-C(force_clone_compiler_objects, false, false, bool, false,                     \
-  "Force cloning of objects needed in compiler (ICData and Field).")           \
-R(gc_at_alloc, false, bool, false,                                             \
-  "GC at every allocation.")                                                   \
-P(getter_setter_ratio, int, 13,                                                \
-  "Ratio of getter/setter usage used for double field unboxing heuristics")    \
-P(guess_icdata_cid, bool, true,                                                \
-  "Artificially create type feedback for arithmetic etc. operations")          \
-P(huge_method_cutoff_in_tokens, int, 20000,                                    \
-  "Huge method cutoff in tokens: Disables optimizations for huge methods.")    \
-P(interpret_irregexp, bool, USING_DBC,                                         \
-  "Use irregexp bytecode interpreter")                                         \
-P(lazy_dispatchers, bool, true,                                                \
-  "Generate dispatchers lazily")                                               \
-P(link_natives_lazily, bool, false,                                            \
-  "Link native calls lazily")                                                  \
-C(load_deferred_eagerly, true, true, bool, false,                              \
-  "Load deferred libraries eagerly.")                                          \
-R(log_marker_tasks, false, bool, false,                                        \
-  "Log debugging information for old gen GC marking tasks.")                   \
-R(marker_tasks, USING_MULTICORE ? 2 : 0, int, USING_MULTICORE ? 2 : 0,         \
-  "The number of tasks to spawn during old gen GC marking (0 means "           \
-  "perform all marking on main thread).")                                      \
-P(max_polymorphic_checks, int, 4,                                              \
-  "Maximum number of polymorphic check, otherwise it is megamorphic.")         \
-P(max_equality_polymorphic_checks, int, 32,                                    \
-  "Maximum number of polymorphic checks in equality operator,")                \
-P(merge_sin_cos, bool, false,                                                  \
-  "Merge sin/cos into sincos")                                                 \
-P(new_gen_ext_limit, int, 64,                                                  \
-  "maximum total external size (MB) in new gen before triggering GC")          \
-P(new_gen_semi_max_size, int, (kWordSize <= 4) ? 16 : 32,                      \
-  "Max size of new gen semi space in MB")                                      \
-P(optimization_counter_threshold, int, 30000,                                  \
-  "Function's usage-counter value before it is optimized, -1 means never")     \
-P(old_gen_heap_size, int, (kWordSize <= 4) ? 1536 : 0,                         \
-  "Max size of old gen heap size in MB, or 0 for unlimited,"                   \
-  "e.g: --old_gen_heap_size=1024 allows up to 1024MB old gen heap")            \
-R(pause_isolates_on_start, false, bool, false,                                 \
-  "Pause isolates before starting.")                                           \
-R(pause_isolates_on_exit, false, bool, false,                                  \
-  "Pause isolates exiting.")                                                   \
-R(pause_isolates_on_unhandled_exceptions, false, bool, false,                  \
-  "Pause isolates on unhandled exceptions.")                                   \
-P(polymorphic_with_deopt, bool, true,                                          \
-  "Polymorphic calls with deoptimization / megamorphic call")                  \
-P(precompiled_mode, bool, false,                                               \
-  "Precompilation compiler mode")                                              \
-C(precompiled_runtime, true, false, bool, false,                               \
-  "Precompiled runtime mode")                                                  \
-R(print_ssa_liveranges, false, bool, false,                                    \
-  "Print live ranges after allocation.")                                       \
-C(print_stop_message, false, false, bool, false,                               \
-  "Print stop message.")                                                       \
-D(print_variable_descriptors, bool, false,                                     \
-  "Print variable descriptors in disassembly.")                                \
-R(profiler, false, bool, !USING_DBC && !USING_FUCHSIA,                         \
-  "Enable the profiler.")                                                      \
-P(reorder_basic_blocks, bool, true,                                            \
-  "Reorder basic blocks")                                                      \
-R(support_ast_printer, false, bool, true,                                      \
-  "Support the AST printer.")                                                  \
-R(support_compiler_stats, false, bool, true,                                   \
-  "Support compiler stats.")                                                   \
-C(support_debugger, false, false, bool, true,                                  \
-  "Support the debugger.")                                                     \
-R(support_disassembler, false, bool, true,                                     \
-  "Support the disassembler.")                                                 \
-R(support_il_printer, false, bool, true,                                       \
-  "Support the IL printer.")                                                   \
-C(support_reload, false, false, bool, true,                                    \
-  "Support isolate reload.")                                                   \
-R(support_service, false, bool, true,                                          \
-  "Support the service protocol.")                                             \
-R(support_timeline, false, bool, true,                                         \
-  "Support timeline.")                                                         \
-D(trace_cha, bool, false,                                                      \
-  "Trace CHA operations")                                                      \
-D(trace_field_guards, bool, false,                                             \
-  "Trace changes in field's cids.")                                            \
-D(trace_isolates, bool, false,                                                 \
-  "Trace isolate creation and shut down.")                                     \
-D(trace_handles, bool, false,                                                  \
-  "Traces allocation of handles.")                                             \
-D(trace_kernel_binary, bool, false,                                            \
-  "Trace Kernel reader/writer.")                                               \
-D(trace_optimization, bool, false,                                             \
-  "Print optimization details.")                                               \
-R(trace_profiler, false, bool, false,                                          \
-  "Profiler trace")                                                            \
-D(trace_profiler_verbose, bool, false,                                         \
-  "Verbose profiler trace")                                                    \
-D(trace_ssa_allocator, bool, false,                                            \
-  "Trace register allocation over SSA.")                                       \
-D(trace_zones, bool, false,                                                    \
-  "Traces allocation sizes in the zone.")                                      \
-P(truncating_left_shift, bool, true,                                           \
-  "Optimize left shift to truncate if possible")                               \
-P(use_cha_deopt, bool, true,                                                   \
-  "Use class hierarchy analysis even if it can cause deoptimization.")         \
-P(use_field_guards, bool, !USING_DBC,                                          \
-  "Use field guards and track field types")                                    \
-C(use_osr, false, true, bool, true,                                            \
-  "Use OSR")                                                                   \
-P(verbose_gc, bool, false,                                                     \
-  "Enables verbose GC.")                                                       \
-P(verbose_gc_hdr, int, 40,                                                     \
-  "Print verbose GC header interval.")                                         \
-R(verify_after_gc, false, bool, false,                                         \
-  "Enables heap verification after GC.")                                       \
-R(verify_before_gc, false, bool, false,                                        \
-  "Enables heap verification before GC.")                                      \
-D(verify_on_transition, bool, false,                                           \
-  "Verify on dart <==> VM.")                                                   \
+  P(background_compilation, bool, USING_MULTICORE,                             \
+    "Run optimizing compilation in background")                                \
+  R(background_compilation_stop_alot, false, bool, false,                      \
+    "Stress test system: stop background compiler often.")                     \
+  P(background_finalization, bool, USING_MULTICORE,                            \
+    "Run weak handle finalizers in background")                                \
+  R(break_at_isolate_spawn, false, bool, false,                                \
+    "Insert a one-time breakpoint at the entrypoint for all spawned isolates") \
+  C(collect_code, false, true, bool, true,                                     \
+    "Attempt to GC infrequently used code.")                                   \
+  P(collect_dynamic_function_names, bool, true,                                \
+    "Collects all dynamic function names to identify unique targets")          \
+  R(concurrent_sweep, USING_MULTICORE, bool, USING_MULTICORE,                  \
+    "Concurrent sweep for old generation.")                                    \
+  R(dedup_instructions, true, bool, false,                                     \
+    "Canonicalize instructions when precompiling.")                            \
+  C(deoptimize_alot, false, false, bool, false,                                \
+    "Deoptimizes we are about to return to Dart code from native entries.")    \
+  C(deoptimize_every, 0, 0, int, 0,                                            \
+    "Deoptimize on every N stack overflow checks")                             \
+  R(disable_alloc_stubs_after_gc, false, bool, false, "Stress testing flag.")  \
+  R(disassemble, false, bool, false, "Disassemble dart code.")                 \
+  R(disassemble_optimized, false, bool, false, "Disassemble optimized code.")  \
+  R(dump_megamorphic_stats, false, bool, false,                                \
+    "Dump megamorphic cache statistics")                                       \
+  R(dump_symbol_stats, false, bool, false, "Dump symbol table statistics")     \
+  R(enable_asserts, false, bool, false, "Enable assert statements.")           \
+  C(enable_mirrors, false, false, bool, true,                                  \
+    "Disable to make importing dart:mirrors an error.")                        \
+  R(enable_type_checks, false, bool, false, "Enable type checks.")             \
+  R(error_on_bad_override, false, bool, false,                                 \
+    "Report error for bad overrides.")                                         \
+  R(error_on_bad_type, false, bool, false,                                     \
+    "Report error for malformed types.")                                       \
+  P(external_max_size, int, (kWordSize <= 4) ? 512 : 1024,                     \
+    "Max total size of external allocations in MB, or 0 for unlimited,"        \
+    "e.g: --external_max_size=1024 allows up to 1024MB of externals")          \
+  P(fields_may_be_reset, bool, false,                                          \
+    "Don't optimize away static field initialization")                         \
+  C(force_clone_compiler_objects, false, false, bool, false,                   \
+    "Force cloning of objects needed in compiler (ICData and Field).")         \
+  R(gc_at_alloc, false, bool, false, "GC at every allocation.")                \
+  P(getter_setter_ratio, int, 13,                                              \
+    "Ratio of getter/setter usage used for double field unboxing heuristics")  \
+  P(guess_icdata_cid, bool, true,                                              \
+    "Artificially create type feedback for arithmetic etc. operations")        \
+  P(huge_method_cutoff_in_tokens, int, 20000,                                  \
+    "Huge method cutoff in tokens: Disables optimizations for huge methods.")  \
+  P(interpret_irregexp, bool, USING_DBC, "Use irregexp bytecode interpreter")  \
+  P(lazy_dispatchers, bool, true, "Generate dispatchers lazily")               \
+  P(link_natives_lazily, bool, false, "Link native calls lazily")              \
+  C(load_deferred_eagerly, true, true, bool, false,                            \
+    "Load deferred libraries eagerly.")                                        \
+  R(log_marker_tasks, false, bool, false,                                      \
+    "Log debugging information for old gen GC marking tasks.")                 \
+  R(marker_tasks, USING_MULTICORE ? 2 : 0, int, USING_MULTICORE ? 2 : 0,       \
+    "The number of tasks to spawn during old gen GC marking (0 means "         \
+    "perform all marking on main thread).")                                    \
+  P(max_polymorphic_checks, int, 4,                                            \
+    "Maximum number of polymorphic check, otherwise it is megamorphic.")       \
+  P(max_equality_polymorphic_checks, int, 32,                                  \
+    "Maximum number of polymorphic checks in equality operator,")              \
+  P(merge_sin_cos, bool, false, "Merge sin/cos into sincos")                   \
+  P(new_gen_ext_limit, int, 64,                                                \
+    "maximum total external size (MB) in new gen before triggering GC")        \
+  P(new_gen_semi_max_size, int, (kWordSize <= 4) ? 16 : 32,                    \
+    "Max size of new gen semi space in MB")                                    \
+  P(optimization_counter_threshold, int, 30000,                                \
+    "Function's usage-counter value before it is optimized, -1 means never")   \
+  P(old_gen_heap_size, int, (kWordSize <= 4) ? 1536 : 0,                       \
+    "Max size of old gen heap size in MB, or 0 for unlimited,"                 \
+    "e.g: --old_gen_heap_size=1024 allows up to 1024MB old gen heap")          \
+  R(pause_isolates_on_start, false, bool, false,                               \
+    "Pause isolates before starting.")                                         \
+  R(pause_isolates_on_exit, false, bool, false, "Pause isolates exiting.")     \
+  R(pause_isolates_on_unhandled_exceptions, false, bool, false,                \
+    "Pause isolates on unhandled exceptions.")                                 \
+  P(polymorphic_with_deopt, bool, true,                                        \
+    "Polymorphic calls with deoptimization / megamorphic call")                \
+  P(precompiled_mode, bool, false, "Precompilation compiler mode")             \
+  C(precompiled_runtime, true, false, bool, false, "Precompiled runtime mode") \
+  R(print_ssa_liveranges, false, bool, false,                                  \
+    "Print live ranges after allocation.")                                     \
+  C(print_stop_message, false, false, bool, false, "Print stop message.")      \
+  D(print_variable_descriptors, bool, false,                                   \
+    "Print variable descriptors in disassembly.")                              \
+  R(profiler, false, bool, !USING_DBC && !USING_FUCHSIA,                       \
+    "Enable the profiler.")                                                    \
+  P(reorder_basic_blocks, bool, true, "Reorder basic blocks")                  \
+  R(support_ast_printer, false, bool, true, "Support the AST printer.")        \
+  R(support_compiler_stats, false, bool, true, "Support compiler stats.")      \
+  C(support_debugger, false, false, bool, true, "Support the debugger.")       \
+  R(support_disassembler, false, bool, true, "Support the disassembler.")      \
+  R(support_il_printer, false, bool, true, "Support the IL printer.")          \
+  C(support_reload, false, false, bool, true, "Support isolate reload.")       \
+  R(support_service, false, bool, true, "Support the service protocol.")       \
+  R(support_timeline, false, bool, true, "Support timeline.")                  \
+  D(trace_cha, bool, false, "Trace CHA operations")                            \
+  D(trace_field_guards, bool, false, "Trace changes in field's cids.")         \
+  D(trace_isolates, bool, false, "Trace isolate creation and shut down.")      \
+  D(trace_handles, bool, false, "Traces allocation of handles.")               \
+  D(trace_kernel_binary, bool, false, "Trace Kernel reader/writer.")           \
+  D(trace_optimization, bool, false, "Print optimization details.")            \
+  R(trace_profiler, false, bool, false, "Profiler trace")                      \
+  D(trace_profiler_verbose, bool, false, "Verbose profiler trace")             \
+  D(trace_ssa_allocator, bool, false, "Trace register allocation over SSA.")   \
+  D(trace_zones, bool, false, "Traces allocation sizes in the zone.")          \
+  P(truncating_left_shift, bool, true,                                         \
+    "Optimize left shift to truncate if possible")                             \
+  P(use_cha_deopt, bool, true,                                                 \
+    "Use class hierarchy analysis even if it can cause deoptimization.")       \
+  P(use_field_guards, bool, !USING_DBC,                                        \
+    "Use field guards and track field types")                                  \
+  C(use_osr, false, true, bool, true, "Use OSR")                               \
+  P(verbose_gc, bool, false, "Enables verbose GC.")                            \
+  P(verbose_gc_hdr, int, 40, "Print verbose GC header interval.")              \
+  R(verify_after_gc, false, bool, false,                                       \
+    "Enables heap verification after GC.")                                     \
+  R(verify_before_gc, false, bool, false,                                      \
+    "Enables heap verification before GC.")                                    \
+  D(verify_on_transition, bool, false, "Verify on dart <==> VM.")
 
 #endif  // RUNTIME_VM_FLAG_LIST_H_
diff --git a/runtime/vm/flags.cc b/runtime/vm/flags.cc
index 8c5a9d8..dad1410 100644
--- a/runtime/vm/flags.cc
+++ b/runtime/vm/flags.cc
@@ -11,21 +11,19 @@
 namespace dart {
 
 DEFINE_FLAG(bool, print_flags, false, "Print flags as they are being parsed.");
-DEFINE_FLAG(bool, ignore_unrecognized_flags, false,
-    "Ignore unrecognized flags.");
+DEFINE_FLAG(bool,
+            ignore_unrecognized_flags,
+            false,
+            "Ignore unrecognized flags.");
 
-#define PRODUCT_FLAG_MARCO(name, type, default_value, comment) \
-  type FLAG_##name = Flags::Register_##type(&FLAG_##name,                      \
-                                            #name,                             \
-                                            default_value,                     \
-                                            comment);
+#define PRODUCT_FLAG_MARCO(name, type, default_value, comment)                 \
+  type FLAG_##name =                                                           \
+      Flags::Register_##type(&FLAG_##name, #name, default_value, comment);
 
 #if defined(DEBUG)
-#define DEBUG_FLAG_MARCO(name, type, default_value, comment) \
-  type FLAG_##name = Flags::Register_##type(&FLAG_##name,                      \
-                                            #name,                             \
-                                            default_value,                     \
-                                            comment);
+#define DEBUG_FLAG_MARCO(name, type, default_value, comment)                   \
+  type FLAG_##name =                                                           \
+      Flags::Register_##type(&FLAG_##name, #name, default_value, comment);
 #else  // defined(DEBUG)
 #define DEBUG_FLAG_MARCO(name, type, default_value, comment)
 #endif  // defined(DEBUG)
@@ -46,26 +44,20 @@
 
 #elif defined(DART_PRECOMPILED_RUNTIME)  // !PRODUCT
 #define RELEASE_FLAG_MARCO(name, product_value, type, default_value, comment)  \
-  type FLAG_##name = Flags::Register_##type(&FLAG_##name,                      \
-                                            #name,                             \
-                                            default_value,                     \
-                                            comment);
+  type FLAG_##name =                                                           \
+      Flags::Register_##type(&FLAG_##name, #name, default_value, comment);
 // Nothing to be done for the precompilation flag definitions.
 #define PRECOMPILE_FLAG_MARCO(name, pre_value, product_value, type,            \
                               default_value, comment)
 
 #else  // !PRODUCT && !PRECOMPILED
 #define RELEASE_FLAG_MARCO(name, product_value, type, default_value, comment)  \
-  type FLAG_##name = Flags::Register_##type(&FLAG_##name,                      \
-                                            #name,                             \
-                                            default_value,                     \
-                                            comment);
+  type FLAG_##name =                                                           \
+      Flags::Register_##type(&FLAG_##name, #name, default_value, comment);
 #define PRECOMPILE_FLAG_MARCO(name, pre_value, product_value, type,            \
                               default_value, comment)                          \
-  type FLAG_##name = Flags::Register_##type(&FLAG_##name,                      \
-                                            #name,                             \
-                                            default_value,                     \
-                                            comment);
+  type FLAG_##name =                                                           \
+      Flags::Register_##type(&FLAG_##name, #name, default_value, comment);
 #endif
 
 
@@ -90,21 +82,12 @@
 
 class Flag {
  public:
-  enum FlagType {
-    kBoolean,
-    kInteger,
-    kUint64,
-    kString,
-    kFunc,
-    kNumFlagTypes
-  };
+  enum FlagType { kBoolean, kInteger, kUint64, kString, kFunc, kNumFlagTypes };
 
   Flag(const char* name, const char* comment, void* addr, FlagType type)
-      : name_(name), comment_(comment), addr_(addr), type_(type) {
-  }
+      : name_(name), comment_(comment), addr_(addr), type_(type) {}
   Flag(const char* name, const char* comment, FlagHandler handler)
-      : name_(name), comment_(comment), handler_(handler), type_(kFunc) {
-  }
+      : name_(name), comment_(comment), handler_(handler), type_(kFunc) {}
 
   void Print() {
     if (IsUnrecognized()) {
@@ -113,8 +96,8 @@
     }
     switch (type_) {
       case kBoolean: {
-        OS::Print("%s: %s (%s)\n",
-            name_, *this->bool_ptr_ ? "true" : "false", comment_);
+        OS::Print("%s: %s (%s)\n", name_, *this->bool_ptr_ ? "true" : "false",
+                  comment_);
         break;
       }
       case kInteger: {
@@ -175,10 +158,8 @@
 
 bool Flags::IsSet(const char* name) {
   Flag* flag = Lookup(name);
-  return (flag != NULL) &&
-         (flag->type_ == Flag::kBoolean) &&
-         (flag->bool_ptr_ != NULL) &&
-         (*flag->bool_ptr_ == true);
+  return (flag != NULL) && (flag->type_ == Flag::kBoolean) &&
+         (flag->bool_ptr_ != NULL) && (*flag->bool_ptr_ == true);
 }
 
 
@@ -194,7 +175,7 @@
       for (intptr_t i = 0; i < num_flags_; i++) {
         new_flags[i] = flags_[i];
       }
-      delete [] flags_;
+      delete[] flags_;
       flags_ = new_flags;
       capacity_ = new_capacity;
     }
@@ -412,8 +393,8 @@
 
 
 int Flags::CompareFlagNames(const void* left, const void* right) {
-  const Flag* left_flag = *reinterpret_cast<const Flag* const *>(left);
-  const Flag* right_flag = *reinterpret_cast<const Flag* const *>(right);
+  const Flag* left_flag = *reinterpret_cast<const Flag* const*>(left);
+  const Flag* right_flag = *reinterpret_cast<const Flag* const*>(right);
   return strcmp(left_flag->name_, right_flag->name_);
 }
 
@@ -463,9 +444,7 @@
   return true;
 }
 
-bool Flags::SetFlag(const char* name,
-                    const char* value,
-                    const char** error) {
+bool Flags::SetFlag(const char* name, const char* value, const char** error) {
   Flag* flag = Lookup(name);
   if (flag == NULL) {
     *error = "Cannot set flag: flag not found";
diff --git a/runtime/vm/flags.h b/runtime/vm/flags.h
index 2d882d0..f5cb8f3 100644
--- a/runtime/vm/flags.h
+++ b/runtime/vm/flags.h
@@ -11,14 +11,11 @@
 
 typedef const char* charp;
 
-#define DECLARE_FLAG(type, name)                                               \
-  extern type FLAG_##name
+#define DECLARE_FLAG(type, name) extern type FLAG_##name
 
 #define DEFINE_FLAG(type, name, default_value, comment)                        \
-  type FLAG_##name = Flags::Register_##type(&FLAG_##name,                      \
-                                            #name,                             \
-                                            default_value,                     \
-                                            comment);
+  type FLAG_##name =                                                           \
+      Flags::Register_##type(&FLAG_##name, #name, default_value, comment);
 
 #define DEFINE_FLAG_HANDLER(handler, name, comment)                            \
   bool DUMMY_##name = Flags::Register_func(handler, #name, comment);
@@ -71,9 +68,7 @@
   static void PrintJSON(JSONStream* js);
 #endif  // !PRODUCT
 
-  static bool SetFlag(const char* name,
-                      const char* value,
-                      const char** error);
+  static bool SetFlag(const char* name, const char* value, const char** error);
 
  private:
   static Flag** flags_;
@@ -103,7 +98,7 @@
   DISALLOW_IMPLICIT_CONSTRUCTORS(Flags);
 };
 
-#define PRODUCT_FLAG_MARCO(name, type, default_value, comment) \
+#define PRODUCT_FLAG_MARCO(name, type, default_value, comment)                 \
   extern type FLAG_##name;
 
 #if defined(DEBUG)
diff --git a/runtime/vm/flow_graph.cc b/runtime/vm/flow_graph.cc
index fc20379..bcc18fb 100644
--- a/runtime/vm/flow_graph.cc
+++ b/runtime/vm/flow_graph.cc
@@ -26,36 +26,34 @@
 FlowGraph::FlowGraph(const ParsedFunction& parsed_function,
                      GraphEntryInstr* graph_entry,
                      intptr_t max_block_id)
-  : thread_(Thread::Current()),
-    parent_(),
-    current_ssa_temp_index_(0),
-    max_block_id_(max_block_id),
-    parsed_function_(parsed_function),
-    num_copied_params_(parsed_function.num_copied_params()),
-    num_non_copied_params_(parsed_function.num_non_copied_params()),
-    graph_entry_(graph_entry),
-    preorder_(),
-    postorder_(),
-    reverse_postorder_(),
-    optimized_block_order_(),
-    constant_null_(NULL),
-    constant_dead_(NULL),
-    constant_empty_context_(NULL),
-    block_effects_(NULL),
-    licm_allowed_(true),
-    loop_headers_(NULL),
-    loop_invariant_loads_(NULL),
-    deferred_prefixes_(parsed_function.deferred_prefixes()),
-    captured_parameters_(new(zone()) BitVector(zone(), variable_count())),
-    inlining_id_(-1) {
+    : thread_(Thread::Current()),
+      parent_(),
+      current_ssa_temp_index_(0),
+      max_block_id_(max_block_id),
+      parsed_function_(parsed_function),
+      num_copied_params_(parsed_function.num_copied_params()),
+      num_non_copied_params_(parsed_function.num_non_copied_params()),
+      graph_entry_(graph_entry),
+      preorder_(),
+      postorder_(),
+      reverse_postorder_(),
+      optimized_block_order_(),
+      constant_null_(NULL),
+      constant_dead_(NULL),
+      constant_empty_context_(NULL),
+      block_effects_(NULL),
+      licm_allowed_(true),
+      loop_headers_(NULL),
+      loop_invariant_loads_(NULL),
+      deferred_prefixes_(parsed_function.deferred_prefixes()),
+      captured_parameters_(new (zone()) BitVector(zone(), variable_count())),
+      inlining_id_(-1) {
   DiscoverBlocks();
 }
 
 
-void FlowGraph::EnsureSSATempIndex(Definition* defn,
-                                   Definition* replacement) {
-  if ((replacement->ssa_temp_index() == -1) &&
-      (defn->ssa_temp_index() != -1)) {
+void FlowGraph::EnsureSSATempIndex(Definition* defn, Definition* replacement) {
+  if ((replacement->ssa_temp_index() == -1) && (defn->ssa_temp_index() != -1)) {
     AllocateSSAIndexes(replacement);
   }
 }
@@ -100,7 +98,7 @@
     ZoneGrowableArray<const LibraryPrefix*>* from) {
   ZoneGrowableArray<const LibraryPrefix*>* to = deferred_prefixes();
   for (intptr_t i = 0; i < from->length(); i++) {
-    const  LibraryPrefix* prefix = (*from)[i];
+    const LibraryPrefix* prefix = (*from)[i];
     for (intptr_t j = 0; j < to->length(); j++) {
       if ((*to)[j]->raw() == prefix->raw()) {
         return;
@@ -113,17 +111,14 @@
 
 bool FlowGraph::ShouldReorderBlocks(const Function& function,
                                     bool is_optimized) {
-  return is_optimized
-      && FLAG_reorder_basic_blocks
-      && !function.is_intrinsic();
+  return is_optimized && FLAG_reorder_basic_blocks && !function.is_intrinsic();
 }
 
 
 GrowableArray<BlockEntryInstr*>* FlowGraph::CodegenBlockOrder(
     bool is_optimized) {
-  return ShouldReorderBlocks(function(), is_optimized)
-      ? &optimized_block_order_
-      : &reverse_postorder_;
+  return ShouldReorderBlocks(function(), is_optimized) ? &optimized_block_order_
+                                                       : &reverse_postorder_;
 }
 
 
@@ -131,8 +126,8 @@
   ConstantInstr* constant = constant_instr_pool_.LookupValue(object);
   if (constant == NULL) {
     // Otherwise, allocate and add it to the pool.
-    constant = new(zone()) ConstantInstr(
-        Object::ZoneHandle(zone(), object.raw()));
+    constant =
+        new (zone()) ConstantInstr(Object::ZoneHandle(zone(), object.raw()));
     constant->set_ssa_temp_index(alloc_ssa_temp_index());
 
     AddToInitialDefinitions(constant);
@@ -195,8 +190,8 @@
 class BlockTraversalState {
  public:
   explicit BlockTraversalState(BlockEntryInstr* block)
-    : block_(block),
-      next_successor_ix_(block->last_instruction()->SuccessorCount() - 1) { }
+      : block_(block),
+        next_successor_ix_(block->last_instruction()->SuccessorCount() - 1) {}
 
   bool HasNextSuccessor() const { return next_successor_ix_ >= 0; }
   BlockEntryInstr* NextSuccessor() {
@@ -227,7 +222,7 @@
   graph_entry_->DiscoverBlock(NULL, &preorder_, &parent_);
   block_stack.Add(BlockTraversalState(graph_entry_));
   while (!block_stack.is_empty()) {
-    BlockTraversalState &state = block_stack.Last();
+    BlockTraversalState& state = block_stack.Last();
     BlockEntryInstr* block = state.block();
     if (state.HasNextSuccessor()) {
       // Process successors one-by-one.
@@ -261,9 +256,8 @@
 
 void FlowGraph::MergeBlocks() {
   bool changed = false;
-  BitVector* merged = new(zone()) BitVector(zone(), postorder().length());
-  for (BlockIterator block_it = reverse_postorder_iterator();
-       !block_it.Done();
+  BitVector* merged = new (zone()) BitVector(zone(), postorder().length());
+  for (BlockIterator block_it = reverse_postorder_iterator(); !block_it.Done();
        block_it.Advance()) {
     BlockEntryInstr* block = block_it.Current();
     if (block->IsGraphEntry()) continue;
@@ -271,8 +265,7 @@
 
     Instruction* last = block->last_instruction();
     BlockEntryInstr* successor = NULL;
-    while ((!last->IsIndirectGoto()) &&
-           (last->SuccessorCount() == 1) &&
+    while ((!last->IsIndirectGoto()) && (last->SuccessorCount() == 1) &&
            (!last->SuccessorAt(0)->IsIndirectEntry()) &&
            (last->SuccessorAt(0)->PredecessorCount() == 1) &&
            (block->try_index() == last->SuccessorAt(0)->try_index())) {
@@ -288,8 +281,7 @@
       merged->Add(successor->postorder_number());
       changed = true;
       if (FLAG_trace_optimization) {
-        OS::Print("Merged blocks B%" Pd " and B%" Pd "\n",
-                  block->block_id(),
+        OS::Print("Merged blocks B%" Pd " and B%" Pd "\n", block->block_id(),
                   successor->block_id());
       }
     }
@@ -321,8 +313,7 @@
   for (intptr_t i = 0; i < instr->InputCount(); ++i) {
     Value* use = instr->InputAt(i);
     ASSERT(use->definition() != NULL);
-    ASSERT((use->definition() != instr) ||
-           use->definition()->IsPhi() ||
+    ASSERT((use->definition() != instr) || use->definition()->IsPhi() ||
            use->definition()->IsMaterializeObject());
     ASSERT(use->instruction() == instr);
     ASSERT(use->use_index() == i);
@@ -381,7 +372,8 @@
 }
 
 void FlowGraph::ComputeIsReceiverRecursive(
-    PhiInstr* phi, GrowableArray<PhiInstr*>* unmark) const {
+    PhiInstr* phi,
+    GrowableArray<PhiInstr*>* unmark) const {
   if (phi->is_receiver() != PhiInstr::kUnknownReceiver) return;
   phi->set_is_receiver(PhiInstr::kReceiver);
   for (intptr_t i = 0; i < phi->InputCount(); ++i) {
@@ -448,14 +440,17 @@
   Definition* callee_receiver = call->ArgumentAt(0);
   ASSERT(callee_receiver != NULL);
   if (function().IsDynamicFunction() && IsReceiver(callee_receiver)) {
-    const String& name = (kind == RawFunction::kMethodExtractor)
-        ? String::Handle(zone(), Field::NameFromGetter(call->function_name()))
-        : call->function_name();
+    const String& name =
+        (kind == RawFunction::kMethodExtractor)
+            ? String::Handle(zone(),
+                             Field::NameFromGetter(call->function_name()))
+            : call->function_name();
     const Class& cls = Class::Handle(zone(), function().Owner());
     intptr_t subclass_count = 0;
     if (!thread()->cha()->HasOverride(cls, name, &subclass_count)) {
       if (FLAG_trace_cha) {
-        THR_Print("  **(CHA) Instance call needs no check, "
+        THR_Print(
+            "  **(CHA) Instance call needs no check, "
             "no overrides of '%s' '%s'\n",
             name.ToCString(), cls.ToCString());
       }
@@ -467,7 +462,6 @@
 }
 
 
-
 bool FlowGraph::VerifyUseLists() {
   // Verify the initial definitions.
   for (intptr_t i = 0; i < graph_entry_->initial_definitions()->length(); ++i) {
@@ -494,15 +488,14 @@
 
 
 LivenessAnalysis::LivenessAnalysis(
-  intptr_t variable_count,
-  const GrowableArray<BlockEntryInstr*>& postorder)
+    intptr_t variable_count,
+    const GrowableArray<BlockEntryInstr*>& postorder)
     : zone_(Thread::Current()->zone()),
       variable_count_(variable_count),
       postorder_(postorder),
       live_out_(postorder.length()),
       kill_(postorder.length()),
-      live_in_(postorder.length()) {
-}
+      live_in_(postorder.length()) {}
 
 
 bool LivenessAnalysis::UpdateLiveOut(const BlockEntryInstr& block) {
@@ -553,9 +546,9 @@
 void LivenessAnalysis::Analyze() {
   const intptr_t block_count = postorder_.length();
   for (intptr_t i = 0; i < block_count; i++) {
-    live_out_.Add(new(zone()) BitVector(zone(), variable_count_));
-    kill_.Add(new(zone()) BitVector(zone(), variable_count_));
-    live_in_.Add(new(zone()) BitVector(zone(), variable_count_));
+    live_out_.Add(new (zone()) BitVector(zone(), variable_count_));
+    kill_.Add(new (zone()) BitVector(zone(), variable_count_));
+    live_in_.Add(new (zone()) BitVector(zone(), variable_count_));
   }
 
   ComputeInitialSets();
@@ -599,7 +592,7 @@
       : LivenessAnalysis(flow_graph->variable_count(), flow_graph->postorder()),
         flow_graph_(flow_graph),
         num_non_copied_params_(flow_graph->num_non_copied_params()),
-        assigned_vars_() { }
+        assigned_vars_() {}
 
   // For every block (in preorder) compute and return set of variables that
   // have new assigned values flowing out of that block.
@@ -672,7 +665,7 @@
 void VariableLivenessAnalysis::ComputeInitialSets() {
   const intptr_t block_count = postorder_.length();
 
-  BitVector* last_loads = new(zone()) BitVector(zone(), variable_count_);
+  BitVector* last_loads = new (zone()) BitVector(zone(), variable_count_);
   for (intptr_t i = 0; i < block_count; i++) {
     BlockEntryInstr* block = postorder_[i];
 
@@ -743,10 +736,8 @@
 
   GrowableArray<PhiInstr*> live_phis;
 
-  InsertPhis(preorder_,
-             variable_liveness.ComputeAssignedVars(),
-             dominance_frontier,
-             &live_phis);
+  InsertPhis(preorder_, variable_liveness.ComputeAssignedVars(),
+             dominance_frontier, &live_phis);
 
 
   // Rename uses to reference inserted phis where appropriate.
@@ -780,8 +771,8 @@
 
   // All arrays are maps between preorder basic-block numbers.
   intptr_t size = parent_.length();
-  GrowableArray<intptr_t> idom(size);  // Immediate dominator.
-  GrowableArray<intptr_t> semi(size);  // Semidominator.
+  GrowableArray<intptr_t> idom(size);   // Immediate dominator.
+  GrowableArray<intptr_t> semi(size);   // Semidominator.
   GrowableArray<intptr_t> label(size);  // Label for link-eval forest.
 
   // 1. First pass: compute semidominators as in Lengauer-Tarjan.
@@ -798,7 +789,7 @@
     idom.Add(parent_[i]);
     semi.Add(i);
     label.Add(i);
-    dominance_frontier->Add(new(zone()) BitVector(zone(), size));
+    dominance_frontier->Add(new (zone()) BitVector(zone(), size));
   }
 
   // Loop over the blocks in reverse preorder (not including the graph
@@ -877,11 +868,10 @@
 }
 
 
-void FlowGraph::InsertPhis(
-    const GrowableArray<BlockEntryInstr*>& preorder,
-    const GrowableArray<BitVector*>& assigned_vars,
-    const GrowableArray<BitVector*>& dom_frontier,
-    GrowableArray<PhiInstr*>* live_phis) {
+void FlowGraph::InsertPhis(const GrowableArray<BlockEntryInstr*>& preorder,
+                           const GrowableArray<BitVector*>& assigned_vars,
+                           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
@@ -901,8 +891,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());
+    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)) {
@@ -915,14 +905,13 @@
       BlockEntryInstr* current = worklist.RemoveLast();
       // Ensure a phi for each block in the dominance frontier of current.
       for (BitVector::Iterator it(dom_frontier[current->preorder_number()]);
-           !it.Done();
-           it.Advance()) {
+           !it.Done(); it.Advance()) {
         int index = it.Current();
         if (has_already[index] < var_index) {
           BlockEntryInstr* block = preorder[index];
           ASSERT(block->IsJoinEntry());
-          PhiInstr* phi = 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);
@@ -950,8 +939,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()));
+  constant_empty_context_ =
+      GetConstant(Context::Handle(isolate()->object_store()->empty_context()));
 
   // Add parameters to the initial definitions and renaming environment.
   if (inlining_parameters != NULL) {
@@ -968,7 +957,7 @@
     // are unknown and so treated like parameters.
     intptr_t count = IsCompiledForOsr() ? variable_count() : parameter_count();
     for (intptr_t i = 0; i < count; ++i) {
-      ParameterInstr* param = new(zone()) ParameterInstr(i, entry);
+      ParameterInstr* param = new (zone()) ParameterInstr(i, entry);
       param->set_ssa_temp_index(alloc_ssa_temp_index());  // New SSA temp.
       AddToInitialDefinitions(param);
       env.Add(param);
@@ -1007,13 +996,10 @@
 void FlowGraph::AttachEnvironment(Instruction* instr,
                                   GrowableArray<Definition*>* env) {
   Environment* deopt_env =
-      Environment::From(zone(),
-                        *env,
-                        num_non_copied_params_,
-                        parsed_function_);
+      Environment::From(zone(), *env, num_non_copied_params_, parsed_function_);
   if (instr->IsClosureCall()) {
-    deopt_env = deopt_env->DeepCopy(zone(),
-                                    deopt_env->Length() - instr->InputCount());
+    deopt_env =
+        deopt_env->DeepCopy(zone(), deopt_env->Length() - instr->InputCount());
   }
   instr->SetEnvironment(deopt_env);
   for (Environment::DeepIterator it(deopt_env); !it.Done(); it.Advance()) {
@@ -1054,7 +1040,7 @@
   } else if (block_entry->IsCatchBlockEntry()) {
     // Add real definitions for all locals and parameters.
     for (intptr_t i = 0; i < env->length(); ++i) {
-      ParameterInstr* param = new(zone()) ParameterInstr(i, block_entry);
+      ParameterInstr* param = new (zone()) ParameterInstr(i, block_entry);
       param->set_ssa_temp_index(alloc_ssa_temp_index());  // New SSA temp.
       (*env)[i] = param;
       block_entry->AsCatchBlockEntry()->initial_definitions()->Add(param);
@@ -1067,8 +1053,7 @@
   for (intptr_t i = 0; i < variable_count(); 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) &&
+    if (FLAG_prune_dead_locals && !live_in->Contains(i) &&
         (i != CurrentContextEnvIndex())) {
       (*env)[i] = constant_dead();
     }
@@ -1099,10 +1084,8 @@
       Definition* reaching_defn = env->RemoveLast();
       Definition* input_defn = v->definition();
       if (input_defn != reaching_defn) {
-        ASSERT(input_defn->IsLoadLocal() ||
-               input_defn->IsStoreLocal() ||
-               input_defn->IsDropTemps() ||
-               input_defn->IsConstant());
+        ASSERT(input_defn->IsLoadLocal() || input_defn->IsStoreLocal() ||
+               input_defn->IsDropTemps() || input_defn->IsConstant());
         // Assert we are not referencing nulls in the initial environment.
         ASSERT(reaching_defn->ssa_temp_index() != -1);
         v->set_definition(reaching_defn);
@@ -1123,9 +1106,7 @@
       StoreLocalInstr* store = definition->AsStoreLocal();
       DropTempsInstr* drop = definition->AsDropTemps();
       ConstantInstr* constant = definition->AsConstant();
-      if ((load != NULL) ||
-          (store != NULL) ||
-          (drop != NULL) ||
+      if ((load != NULL) || (store != NULL) || (drop != NULL) ||
           (constant != NULL)) {
         Definition* result = NULL;
         if (store != NULL) {
@@ -1220,7 +1201,7 @@
         PhiInstr* phi = (*successor->phis())[i];
         if (phi != NULL) {
           // Rename input operand.
-          Value* use = new(zone()) Value((*env)[i]);
+          Value* use = new (zone()) Value((*env)[i]);
           phi->SetInputAt(pred_index, use);
         }
       }
@@ -1238,14 +1219,11 @@
       if (join == NULL) continue;
       for (PhiIterator phi_it(join); !phi_it.Done(); phi_it.Advance()) {
         PhiInstr* phi = phi_it.Current();
-        if (phi == NULL ||
-            phi->is_alive() ||
-            (phi->input_use_list() != NULL) ||
+        if (phi == NULL || phi->is_alive() || (phi->input_use_list() != NULL) ||
             (phi->env_use_list() == NULL)) {
           continue;
         }
-        for (Value::Iterator it(phi->env_use_list());
-             !it.Done();
+        for (Value::Iterator it(phi->env_use_list()); !it.Done();
              it.Advance()) {
           Value* use = it.Current();
           if (use->instruction()->MayThrow() &&
@@ -1280,12 +1258,10 @@
 
 void FlowGraph::RemoveRedefinitions() {
   // Remove redefinition instructions inserted to inhibit hoisting.
-  for (BlockIterator block_it = reverse_postorder_iterator();
-       !block_it.Done();
+  for (BlockIterator block_it = reverse_postorder_iterator(); !block_it.Done();
        block_it.Advance()) {
     for (ForwardInstructionIterator instr_it(block_it.Current());
-         !instr_it.Done();
-         instr_it.Advance()) {
+         !instr_it.Done(); instr_it.Advance()) {
       RedefinitionInstr* redefinition = instr_it.Current()->AsRedefinition();
       if (redefinition != NULL) {
         Definition* original;
@@ -1305,7 +1281,7 @@
 // Design & Implementation" (Muchnick) p192.
 BitVector* FlowGraph::FindLoop(BlockEntryInstr* m, BlockEntryInstr* n) const {
   GrowableArray<BlockEntryInstr*> stack;
-  BitVector* loop = new(zone()) BitVector(zone(), preorder_.length());
+  BitVector* loop = new (zone()) BitVector(zone(), preorder_.length());
 
   loop->Add(n->preorder_number());
   if (n != m) {
@@ -1329,11 +1305,9 @@
 
 ZoneGrowableArray<BlockEntryInstr*>* FlowGraph::ComputeLoops() const {
   ZoneGrowableArray<BlockEntryInstr*>* loop_headers =
-      new(zone()) ZoneGrowableArray<BlockEntryInstr*>();
+      new (zone()) ZoneGrowableArray<BlockEntryInstr*>();
 
-  for (BlockIterator it = postorder_iterator();
-       !it.Done();
-       it.Advance()) {
+  for (BlockIterator it = postorder_iterator(); !it.Done(); it.Advance()) {
     BlockEntryInstr* block = it.Current();
     for (intptr_t i = 0; i < block->PredecessorCount(); ++i) {
       BlockEntryInstr* pred = block->PredecessorAt(i);
@@ -1364,8 +1338,7 @@
     for (intptr_t i = 0; i < loop_headers->length(); ++i) {
       BlockEntryInstr* header = (*loop_headers)[i];
       OS::Print("Loop header B%" Pd "\n", header->block_id());
-      for (BitVector::Iterator it(header->loop_info());
-           !it.Done();
+      for (BitVector::Iterator it(header->loop_info()); !it.Done();
            it.Advance()) {
         OS::Print("  B%" Pd "\n", preorder_[it.Current()]->block_id());
       }
@@ -1379,8 +1352,7 @@
   intptr_t size = 0;
   // Iterate each block, skipping the graph entry.
   for (intptr_t i = 1; i < preorder_.length(); ++i) {
-    for (ForwardInstructionIterator it(preorder_[i]);
-         !it.Done();
+    for (ForwardInstructionIterator it(preorder_[i]); !it.Done();
          it.Advance()) {
       ++size;
     }
@@ -1390,7 +1362,7 @@
 
 
 void FlowGraph::ComputeBlockEffects() {
-  block_effects_ = new(zone()) BlockEffects(this);
+  block_effects_ = new (zone()) BlockEffects(this);
 }
 
 
@@ -1402,7 +1374,7 @@
   const intptr_t block_count = flow_graph->postorder().length();
 
   // Set of blocks that contain side-effects.
-  BitVector* kill = new(zone) BitVector(zone, block_count);
+  BitVector* kill = new (zone) BitVector(zone, block_count);
 
   // Per block available-after sets. Block A is available after the block B if
   // and only if A is either equal to B or A is available at B and B contains no
@@ -1411,16 +1383,13 @@
   GrowableArray<BitVector*> available_after(block_count);
 
   // Discover all blocks with side-effects.
-  for (BlockIterator it = flow_graph->postorder_iterator();
-       !it.Done();
+  for (BlockIterator it = flow_graph->postorder_iterator(); !it.Done();
        it.Advance()) {
     available_at_.Add(NULL);
     available_after.Add(NULL);
 
     BlockEntryInstr* block = it.Current();
-    for (ForwardInstructionIterator it(block);
-         !it.Done();
-         it.Advance()) {
+    for (ForwardInstructionIterator it(block); !it.Done(); it.Advance()) {
       if (!it.Current()->Effects().IsNone()) {
         kill->Add(block->postorder_number());
         break;
@@ -1428,7 +1397,7 @@
     }
   }
 
-  BitVector* temp = new(zone) BitVector(zone, block_count);
+  BitVector* temp = new (zone) BitVector(zone, block_count);
 
   // Recompute available-at based on predecessors' available-after until the fix
   // point is reached.
@@ -1437,8 +1406,7 @@
     changed = false;
 
     for (BlockIterator it = flow_graph->reverse_postorder_iterator();
-         !it.Done();
-         it.Advance()) {
+         !it.Done(); it.Advance()) {
       BlockEntryInstr* block = it.Current();
       const intptr_t block_num = block->postorder_number();
 
@@ -1461,9 +1429,8 @@
         // Available-at changed: update it and recompute available-after.
         if (available_at_[block_num] == NULL) {
           current = available_at_[block_num] =
-              new(zone) BitVector(zone, block_count);
-          available_after[block_num] =
-              new(zone) BitVector(zone, block_count);
+              new (zone) BitVector(zone, block_count);
+          available_after[block_num] = new (zone) BitVector(zone, block_count);
           // Block is always available after itself.
           available_after[block_num]->Add(block_num);
         }
@@ -1483,14 +1450,14 @@
 bool BlockEffects::IsAvailableAt(Instruction* instr,
                                  BlockEntryInstr* block) const {
   return (instr->Dependencies().IsNone()) ||
-      IsSideEffectFreePath(instr->GetBlock(), block);
+         IsSideEffectFreePath(instr->GetBlock(), block);
 }
 
 
 bool BlockEffects::CanBeMovedTo(Instruction* instr,
                                 BlockEntryInstr* block) const {
   return (instr->Dependencies().IsNone()) ||
-      IsSideEffectFreePath(block, instr->GetBlock());
+         IsSideEffectFreePath(block, instr->GetBlock());
 }
 
 
@@ -1511,13 +1478,12 @@
   if (from_rep == to_rep || to_rep == kNoRepresentation) {
     return;
   }
-  InsertConversion(from_rep, to_rep, use, /*is_environment_use=*/ false);
+  InsertConversion(from_rep, to_rep, use, /*is_environment_use=*/false);
 }
 
 
 static bool IsUnboxedInteger(Representation rep) {
-  return (rep == kUnboxedInt32) ||
-         (rep == kUnboxedUint32) ||
+  return (rep == kUnboxedInt32) || (rep == kUnboxedUint32) ||
          (rep == kUnboxedMint);
 }
 
@@ -1556,24 +1522,24 @@
 
   Definition* converted = NULL;
   if (IsUnboxedInteger(from) && IsUnboxedInteger(to)) {
-    const intptr_t deopt_id = (to == kUnboxedInt32) && (deopt_target != NULL) ?
-      deopt_target->DeoptimizationTarget() : Thread::kNoDeoptId;
-    converted = new(Z) UnboxedIntConverterInstr(from,
-                                                to,
-                                                use->CopyWithType(),
-                                                deopt_id);
+    const intptr_t deopt_id = (to == kUnboxedInt32) && (deopt_target != NULL)
+                                  ? deopt_target->DeoptimizationTarget()
+                                  : Thread::kNoDeoptId;
+    converted = new (Z)
+        UnboxedIntConverterInstr(from, to, use->CopyWithType(), deopt_id);
   } else if ((from == kUnboxedInt32) && (to == kUnboxedDouble)) {
     converted = new Int32ToDoubleInstr(use->CopyWithType());
-  } else if ((from == kUnboxedMint) &&
-             (to == kUnboxedDouble) &&
+  } else if ((from == kUnboxedMint) && (to == kUnboxedDouble) &&
              CanConvertUnboxedMintToDouble()) {
-    const intptr_t deopt_id = (deopt_target != NULL) ?
-        deopt_target->DeoptimizationTarget() : Thread::kNoDeoptId;
+    const intptr_t deopt_id = (deopt_target != NULL)
+                                  ? deopt_target->DeoptimizationTarget()
+                                  : Thread::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() : Thread::kNoDeoptId;
+    const intptr_t deopt_id = (deopt_target != NULL)
+                                  ? deopt_target->DeoptimizationTarget()
+                                  : Thread::kNoDeoptId;
     converted = UnboxInstr::Create(to, use->CopyWithType(), deopt_id);
   } else if ((to == kTagged) && Boxing::Supports(from)) {
     converted = BoxInstr::Create(from, use->CopyWithType());
@@ -1582,14 +1548,15 @@
     // 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() : Thread::kNoDeoptId;
+    const intptr_t deopt_id = (deopt_target != NULL)
+                                  ? deopt_target->DeoptimizationTarget()
+                                  : Thread::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);
-    converted = UnboxInstr::Create(to, new(Z) Value(boxed), deopt_id);
+    converted = UnboxInstr::Create(to, new (Z) Value(boxed), deopt_id);
   }
   ASSERT(converted != NULL);
   InsertBefore(insert_before, converted, use->instruction()->env(),
@@ -1613,23 +1580,19 @@
   if (from_rep == to_rep) {
     return;
   }
-  InsertConversion(from_rep, to_rep, use, /*is_environment_use=*/ true);
+  InsertConversion(from_rep, to_rep, use, /*is_environment_use=*/true);
 }
 
 
 void FlowGraph::InsertConversionsFor(Definition* def) {
   const Representation from_rep = def->representation();
 
-  for (Value::Iterator it(def->input_use_list());
-       !it.Done();
-       it.Advance()) {
+  for (Value::Iterator it(def->input_use_list()); !it.Done(); it.Advance()) {
     ConvertUse(it.Current(), from_rep);
   }
 
   if (graph_entry()->SuccessorCount() > 1) {
-    for (Value::Iterator it(def->env_use_list());
-         !it.Done();
-         it.Advance()) {
+    for (Value::Iterator it(def->env_use_list()); !it.Done(); it.Advance()) {
       Value* use = it.Current();
       if (use->instruction()->MayThrow() &&
           use->instruction()->GetBlock()->InsideTryBlock()) {
@@ -1668,9 +1631,7 @@
       break;
   }
 
-  if ((kSmiBits < 32) &&
-      (unboxed == kTagged) &&
-      phi->Type()->IsInt() &&
+  if ((kSmiBits < 32) && (unboxed == kTagged) && phi->Type()->IsInt() &&
       RangeUtils::Fits(phi->range(), RangeBoundary::kRangeBoundaryInt64)) {
     // On 32-bit platforms conservatively unbox phis that:
     //   - are proven to be of type Int;
@@ -1695,15 +1656,14 @@
       // We checked inputs. Check if phi is used in at least one unbox
       // operation.
       bool has_unboxed_use = false;
-      for (Value* use = phi->input_use_list();
-           use != NULL;
+      for (Value* use = phi->input_use_list(); use != NULL;
            use = use->next_use()) {
         Instruction* instr = use->instruction();
         if (instr->IsUnbox()) {
           has_unboxed_use = true;
           break;
         } else if (IsUnboxedInteger(
-            instr->RequiredInputRepresentation(use->use_index()))) {
+                       instr->RequiredInputRepresentation(use->use_index()))) {
           has_unboxed_use = true;
           break;
         }
@@ -1717,7 +1677,8 @@
     if (should_unbox) {
       unboxed =
           RangeUtils::Fits(phi->range(), RangeBoundary::kRangeBoundaryInt32)
-          ? kUnboxedInt32 : kUnboxedMint;
+              ? kUnboxedInt32
+              : kUnboxedMint;
     }
   }
 
@@ -1728,8 +1689,7 @@
 void FlowGraph::SelectRepresentations() {
   // Conservatively unbox all phis that were proven to be of Double,
   // Float32x4, or Int32x4 type.
-  for (BlockIterator block_it = reverse_postorder_iterator();
-       !block_it.Done();
+  for (BlockIterator block_it = reverse_postorder_iterator(); !block_it.Done();
        block_it.Advance()) {
     JoinEntryInstr* join_entry = block_it.Current()->AsJoinEntry();
     if (join_entry != NULL) {
@@ -1742,14 +1702,12 @@
 
   // Process all instructions and insert conversions where needed.
   // Visit incoming parameters and constants.
-  for (intptr_t i = 0;
-       i < graph_entry()->initial_definitions()->length();
+  for (intptr_t i = 0; i < graph_entry()->initial_definitions()->length();
        i++) {
     InsertConversionsFor((*graph_entry()->initial_definitions())[i]);
   }
 
-  for (BlockIterator block_it = reverse_postorder_iterator();
-       !block_it.Done();
+  for (BlockIterator block_it = reverse_postorder_iterator(); !block_it.Done();
        block_it.Advance()) {
     BlockEntryInstr* entry = block_it.Current();
     JoinEntryInstr* join_entry = entry->AsJoinEntry();
@@ -1763,8 +1721,7 @@
     }
     CatchBlockEntryInstr* catch_entry = entry->AsCatchBlockEntry();
     if (catch_entry != NULL) {
-      for (intptr_t i = 0;
-           i < catch_entry->initial_definitions()->length();
+      for (intptr_t i = 0; i < catch_entry->initial_definitions()->length();
            i++) {
         InsertConversionsFor((*catch_entry->initial_definitions())[i]);
       }
@@ -1783,8 +1740,7 @@
 // Smi widening pass is only meaningful on platforms where Smi
 // is smaller than 32bit. For now only support it on ARM and ia32.
 static bool CanBeWidened(BinarySmiOpInstr* smi_op) {
-  return BinaryInt32OpInstr::IsSupported(smi_op->op_kind(),
-                                         smi_op->left(),
+  return BinaryInt32OpInstr::IsSupported(smi_op->op_kind(), smi_op->left(),
                                          smi_op->right());
 }
 
@@ -1810,17 +1766,13 @@
 
   // Step 1. Collect all instructions that potentially benefit from widening of
   // their operands (or their result) into int32 range.
-  for (BlockIterator block_it = reverse_postorder_iterator();
-       !block_it.Done();
+  for (BlockIterator block_it = reverse_postorder_iterator(); !block_it.Done();
        block_it.Advance()) {
     for (ForwardInstructionIterator instr_it(block_it.Current());
-         !instr_it.Done();
-         instr_it.Advance()) {
+         !instr_it.Done(); instr_it.Advance()) {
       BinarySmiOpInstr* smi_op = instr_it.Current()->AsBinarySmiOp();
-      if ((smi_op != NULL) &&
-          smi_op->HasSSATemp() &&
-          BenefitsFromWidening(smi_op) &&
-          CanBeWidened(smi_op)) {
+      if ((smi_op != NULL) && smi_op->HasSSATemp() &&
+          BenefitsFromWidening(smi_op) && CanBeWidened(smi_op)) {
         candidates.Add(smi_op);
       }
     }
@@ -1844,8 +1796,7 @@
 
   for (intptr_t loop_id = 0; loop_id < loop_headers.length(); ++loop_id) {
     for (BitVector::Iterator loop_it(loop_headers[loop_id]->loop_info());
-         !loop_it.Done();
-         loop_it.Advance()) {
+         !loop_it.Done(); loop_it.Advance()) {
       loops[loop_it.Current()] = loop_id;
     }
   }
@@ -1858,8 +1809,7 @@
 
   // BitVector containing SSA indexes of all processed definitions. Used to skip
   // those candidates that belong to dependency graph of another candidate.
-  BitVector* processed =
-      new(Z) BitVector(Z, current_ssa_temp_index());
+  BitVector* processed = new (Z) BitVector(Z, current_ssa_temp_index());
 
   // Worklist used to collect dependency graph.
   DefinitionWorklist worklist(this, candidates.length());
@@ -1898,8 +1848,7 @@
       // Process all inputs.
       for (intptr_t k = 0; k < defn->InputCount(); k++) {
         Definition* input = defn->InputAt(k)->definition();
-        if (input->IsBinarySmiOp() &&
-            CanBeWidened(input->AsBinarySmiOp())) {
+        if (input->IsBinarySmiOp() && CanBeWidened(input->AsBinarySmiOp())) {
           worklist.Add(input);
         } else if (input->IsPhi() && (input->Type()->ToCid() == kSmiCid)) {
           worklist.Add(input);
@@ -1924,8 +1873,7 @@
       }
 
       // Process all uses.
-      for (Value* use = defn->input_use_list();
-           use != NULL;
+      for (Value* use = defn->input_use_list(); use != NULL;
            use = use->next_use()) {
         Instruction* instr = use->instruction();
         Definition* use_defn = instr->AsDefinition();
@@ -1935,8 +1883,7 @@
           if (!instr->IsReturn() && !instr->IsPushArgument()) {
             gain--;
             if (FLAG_support_il_printer && FLAG_trace_smi_widening) {
-              THR_Print("v [%" Pd "] (u) %s\n",
-                        gain,
+              THR_Print("v [%" Pd "] (u) %s\n", gain,
                         use->instruction()->ToCString());
             }
           }
@@ -1953,15 +1900,13 @@
           // sign extension operation.
           gain++;
           if (FLAG_support_il_printer && FLAG_trace_smi_widening) {
-            THR_Print("^ [%" Pd "] (u) %s\n",
-                      gain,
+            THR_Print("^ [%" Pd "] (u) %s\n", gain,
                       use->instruction()->ToCString());
           }
         } else if (defn_loop == loops[instr->GetBlock()->preorder_number()]) {
           gain--;
           if (FLAG_support_il_printer && FLAG_trace_smi_widening) {
-            THR_Print("v [%" Pd "] (u) %s\n",
-                      gain,
+            THR_Print("v [%" Pd "] (u) %s\n", gain,
                       use->instruction()->ToCString());
           }
         }
@@ -1983,11 +1928,9 @@
 
         if (defn->IsBinarySmiOp()) {
           BinarySmiOpInstr* smi_op = defn->AsBinarySmiOp();
-          BinaryInt32OpInstr* int32_op = new(Z) BinaryInt32OpInstr(
-            smi_op->op_kind(),
-            smi_op->left()->CopyWithType(),
-            smi_op->right()->CopyWithType(),
-            smi_op->DeoptimizationTarget());
+          BinaryInt32OpInstr* int32_op = new (Z) BinaryInt32OpInstr(
+              smi_op->op_kind(), smi_op->left()->CopyWithType(),
+              smi_op->right()->CopyWithType(), smi_op->DeoptimizationTarget());
 
           smi_op->ReplaceWith(int32_op, NULL);
         } else if (defn->IsPhi()) {
@@ -2013,8 +1956,7 @@
   // that can deoptimize.
 
   disallow_licm();
-  for (BlockIterator block_it = reverse_postorder_iterator();
-       !block_it.Done();
+  for (BlockIterator block_it = reverse_postorder_iterator(); !block_it.Done();
        block_it.Advance()) {
     BlockEntryInstr* block = block_it.Current();
     if (!block->IsCatchBlockEntry()) {
@@ -2039,11 +1981,9 @@
 bool FlowGraph::Canonicalize() {
   bool changed = false;
 
-  for (BlockIterator block_it = reverse_postorder_iterator();
-       !block_it.Done();
+  for (BlockIterator block_it = reverse_postorder_iterator(); !block_it.Done();
        block_it.Advance()) {
-    for (ForwardInstructionIterator it(block_it.Current());
-         !it.Done();
+    for (ForwardInstructionIterator it(block_it.Current()); !it.Done();
          it.Advance()) {
       Instruction* current = it.Current();
       if (current->HasUnmatchedInputRepresentations()) {
@@ -2074,8 +2014,7 @@
   if (!FLAG_truncating_left_shift) return;
   GrowableArray<BinarySmiOpInstr*> div_mod_merge;
   GrowableArray<InvokeMathCFunctionInstr*> sin_cos_merge;
-  for (BlockIterator block_it = reverse_postorder_iterator();
-       !block_it.Done();
+  for (BlockIterator block_it = reverse_postorder_iterator(); !block_it.Done();
        block_it.Advance()) {
     // Merging only per basic-block.
     div_mod_merge.Clear();
@@ -2085,9 +2024,7 @@
       if (it.Current()->IsBinarySmiOp()) {
         BinarySmiOpInstr* binop = it.Current()->AsBinarySmiOp();
         if (binop->op_kind() == Token::kBIT_AND) {
-          OptimizeLeftShiftBitAndSmiOp(&it,
-                                       binop,
-                                       binop->left()->definition(),
+          OptimizeLeftShiftBitAndSmiOp(&it, binop, binop->left()->definition(),
                                        binop->right()->definition());
         } else if ((binop->op_kind() == Token::kTRUNCDIV) ||
                    (binop->op_kind() == Token::kMOD)) {
@@ -2098,8 +2035,7 @@
       } else if (it.Current()->IsBinaryMintOp()) {
         BinaryMintOpInstr* mintop = it.Current()->AsBinaryMintOp();
         if (mintop->op_kind() == Token::kBIT_AND) {
-          OptimizeLeftShiftBitAndSmiOp(&it,
-                                       mintop,
+          OptimizeLeftShiftBitAndSmiOp(&it, mintop,
                                        mintop->left()->definition(),
                                        mintop->right()->definition());
         }
@@ -2167,10 +2103,8 @@
   ASSERT(bit_and_instr->IsBinarySmiOp() || bit_and_instr->IsBinaryMintOp());
   if (bit_and_instr->IsBinaryMintOp()) {
     // Replace Mint op with Smi op.
-    BinarySmiOpInstr* smi_op = new(Z) BinarySmiOpInstr(
-        Token::kBIT_AND,
-        new(Z) Value(left_instr),
-        new(Z) Value(right_instr),
+    BinarySmiOpInstr* smi_op = new (Z) BinarySmiOpInstr(
+        Token::kBIT_AND, new (Z) Value(left_instr), new (Z) Value(right_instr),
         Thread::kNoDeoptId);  // BIT_AND cannot deoptimize.
     bit_and_instr->ReplaceWith(smi_op, current_iterator);
   }
@@ -2209,38 +2143,34 @@
     ASSERT((curr_instr->op_kind() == Token::kTRUNCDIV) ||
            (curr_instr->op_kind() == Token::kMOD));
     // Check if there is kMOD/kTRUNDIV binop with same inputs.
-    const Token::Kind other_kind = (curr_instr->op_kind() == Token::kTRUNCDIV) ?
-        Token::kMOD : Token::kTRUNCDIV;
+    const Token::Kind other_kind = (curr_instr->op_kind() == Token::kTRUNCDIV)
+                                       ? Token::kMOD
+                                       : Token::kTRUNCDIV;
     Definition* left_def = curr_instr->left()->definition();
     Definition* right_def = curr_instr->right()->definition();
     for (intptr_t k = i + 1; k < merge_candidates->length(); k++) {
       BinarySmiOpInstr* other_binop = (*merge_candidates)[k];
       // 'other_binop' can be NULL if it was already merged.
-      if ((other_binop != NULL) &&
-          (other_binop->op_kind() == other_kind) &&
+      if ((other_binop != NULL) && (other_binop->op_kind() == other_kind) &&
           (other_binop->left()->definition() == left_def) &&
           (other_binop->right()->definition() == right_def)) {
         (*merge_candidates)[k] = NULL;  // Clear it.
         ASSERT(curr_instr->HasUses());
         AppendExtractNthOutputForMerged(
-            curr_instr,
-            MergedMathInstr::OutputIndexOf(curr_instr->op_kind()),
+            curr_instr, MergedMathInstr::OutputIndexOf(curr_instr->op_kind()),
             kTagged, kSmiCid);
         ASSERT(other_binop->HasUses());
         AppendExtractNthOutputForMerged(
-            other_binop,
-            MergedMathInstr::OutputIndexOf(other_binop->op_kind()),
+            other_binop, MergedMathInstr::OutputIndexOf(other_binop->op_kind()),
             kTagged, kSmiCid);
 
-        ZoneGrowableArray<Value*>* args = new(Z) ZoneGrowableArray<Value*>(2);
-        args->Add(new(Z) Value(curr_instr->left()->definition()));
-        args->Add(new(Z) Value(curr_instr->right()->definition()));
+        ZoneGrowableArray<Value*>* args = new (Z) ZoneGrowableArray<Value*>(2);
+        args->Add(new (Z) Value(curr_instr->left()->definition()));
+        args->Add(new (Z) Value(curr_instr->right()->definition()));
 
         // Replace with TruncDivMod.
-        MergedMathInstr* div_mod = new(Z) MergedMathInstr(
-            args,
-            curr_instr->deopt_id(),
-            MergedMathInstr::kTruncDivMod);
+        MergedMathInstr* div_mod = new (Z) MergedMathInstr(
+            args, curr_instr->deopt_id(), MergedMathInstr::kTruncDivMod);
         curr_instr->ReplaceWith(div_mod, NULL);
         other_binop->ReplaceUsesWith(div_mod);
         other_binop->RemoveFromGraph();
@@ -2276,8 +2206,8 @@
            (kind == MethodRecognizer::kMathCos));
     // Check if there is sin/cos binop with same inputs.
     const MethodRecognizer::Kind other_kind =
-        (kind == MethodRecognizer::kMathSin)
-        ? MethodRecognizer::kMathCos : MethodRecognizer::kMathSin;
+        (kind == MethodRecognizer::kMathSin) ? MethodRecognizer::kMathCos
+                                             : MethodRecognizer::kMathSin;
     Definition* def = curr_instr->InputAt(0)->definition();
     for (intptr_t k = i + 1; k < merge_candidates->length(); k++) {
       InvokeMathCFunctionInstr* other_op = (*merge_candidates)[k];
@@ -2291,16 +2221,13 @@
                                         kUnboxedDouble, kDoubleCid);
         ASSERT(other_op->HasUses());
         AppendExtractNthOutputForMerged(
-            other_op,
-            MergedMathInstr::OutputIndexOf(other_kind),
+            other_op, MergedMathInstr::OutputIndexOf(other_kind),
             kUnboxedDouble, kDoubleCid);
-        ZoneGrowableArray<Value*>* args = new(Z) ZoneGrowableArray<Value*>(1);
-        args->Add(new(Z) Value(curr_instr->InputAt(0)->definition()));
+        ZoneGrowableArray<Value*>* args = new (Z) ZoneGrowableArray<Value*>(1);
+        args->Add(new (Z) Value(curr_instr->InputAt(0)->definition()));
         // Replace with SinCos.
-        MergedMathInstr* sin_cos =
-            new(Z) MergedMathInstr(args,
-                                   curr_instr->DeoptimizationTarget(),
-                                   MergedMathInstr::kSinCos);
+        MergedMathInstr* sin_cos = new (Z) MergedMathInstr(
+            args, curr_instr->DeoptimizationTarget(), MergedMathInstr::kSinCos);
         curr_instr->ReplaceWith(sin_cos, NULL);
         other_op->ReplaceUsesWith(sin_cos);
         other_op->RemoveFromGraph();
@@ -2319,12 +2246,10 @@
                                                 Representation rep,
                                                 intptr_t cid) {
   ExtractNthOutputInstr* extract =
-      new(Z) ExtractNthOutputInstr(new(Z) Value(instr), index, rep, cid);
+      new (Z) ExtractNthOutputInstr(new (Z) Value(instr), index, rep, cid);
   instr->ReplaceUsesWith(extract);
   InsertAfter(instr, extract, NULL, FlowGraph::kValue);
 }
 
 
-
-
 }  // namespace dart
diff --git a/runtime/vm/flow_graph.h b/runtime/vm/flow_graph.h
index 1b71083..8a1b5c6 100644
--- a/runtime/vm/flow_graph.h
+++ b/runtime/vm/flow_graph.h
@@ -22,12 +22,12 @@
 class BlockIterator : public ValueObject {
  public:
   explicit BlockIterator(const GrowableArray<BlockEntryInstr*>& block_order)
-      : block_order_(block_order), current_(0) { }
+      : block_order_(block_order), current_(0) {}
 
   BlockIterator(const BlockIterator& other)
       : ValueObject(),
         block_order_(other.block_order_),
-        current_(other.current_) { }
+        current_(other.current_) {}
 
   void Advance() {
     ASSERT(!Done());
@@ -49,22 +49,17 @@
   typedef const Object& Key;
   typedef ConstantInstr* Pair;
 
-  static Key KeyOf(Pair kv) {
-    return kv->value();
-  }
+  static Key KeyOf(Pair kv) { return kv->value(); }
 
-  static Value ValueOf(Pair kv) {
-    return kv;
-  }
+  static Value ValueOf(Pair kv) { return kv; }
 
   static inline intptr_t Hashcode(Key key) {
     if (key.IsSmi()) {
       return Smi::Cast(key).Value();
     }
     if (key.IsDouble()) {
-      return static_cast<intptr_t>(
-          bit_cast<int32_t, float>(
-              static_cast<float>(Double::Cast(key).value())));
+      return static_cast<intptr_t>(bit_cast<int32_t, float>(
+          static_cast<float>(Double::Cast(key).value())));
     }
     if (key.IsMint()) {
       return static_cast<intptr_t>(Mint::Cast(key).value());
@@ -89,12 +84,8 @@
             intptr_t max_block_id);
 
   // Function properties.
-  const ParsedFunction& parsed_function() const {
-    return parsed_function_;
-  }
-  const Function& function() const {
-    return parsed_function_.function();
-  }
+  const ParsedFunction& parsed_function() const { return parsed_function_; }
+  const Function& function() const { return parsed_function_.function(); }
   intptr_t parameter_count() const {
     return num_copied_params_ + num_non_copied_params_;
   }
@@ -104,15 +95,9 @@
   intptr_t num_stack_locals() const {
     return parsed_function_.num_stack_locals();
   }
-  intptr_t num_copied_params() const {
-    return num_copied_params_;
-  }
-  intptr_t num_non_copied_params() const {
-    return num_non_copied_params_;
-  }
-  bool IsIrregexpFunction() const {
-    return function().IsIrregexpFunction();
-  }
+  intptr_t num_copied_params() const { return num_copied_params_; }
+  intptr_t num_non_copied_params() const { return num_non_copied_params_; }
+  bool IsIrregexpFunction() const { return function().IsIrregexpFunction(); }
 
   LocalVariable* CurrentContextVar() const {
     return parsed_function().current_context_var();
@@ -124,9 +109,7 @@
   }
 
   // Flow graph orders.
-  const GrowableArray<BlockEntryInstr*>& preorder() const {
-    return preorder_;
-  }
+  const GrowableArray<BlockEntryInstr*>& preorder() const { return preorder_; }
   const GrowableArray<BlockEntryInstr*>& postorder() const {
     return postorder_;
   }
@@ -170,17 +153,11 @@
   void set_max_block_id(intptr_t id) { max_block_id_ = id; }
   intptr_t allocate_block_id() { return ++max_block_id_; }
 
-  GraphEntryInstr* graph_entry() const {
-    return graph_entry_;
-  }
+  GraphEntryInstr* graph_entry() const { return graph_entry_; }
 
-  ConstantInstr* constant_null() const {
-    return constant_null_;
-  }
+  ConstantInstr* constant_null() const { return constant_null_; }
 
-  ConstantInstr* constant_dead() const {
-    return constant_dead_;
-  }
+  ConstantInstr* constant_dead() const { return constant_dead_; }
 
   ConstantInstr* constant_empty_context() const {
     return constant_empty_context_;
@@ -286,9 +263,7 @@
     return deferred_prefixes_;
   }
 
-  BitVector* captured_parameters() const {
-    return captured_parameters_;
-  }
+  BitVector* captured_parameters() const { return captured_parameters_; }
 
   intptr_t inlining_id() const { return inlining_id_; }
   void set_inlining_id(intptr_t value) { inlining_id_ = value; }
@@ -319,28 +294,25 @@
   // SSA transformation methods and fields.
   void ComputeDominators(GrowableArray<BitVector*>* dominance_frontier);
 
-  void CompressPath(
-      intptr_t start_index,
-      intptr_t current_index,
-      GrowableArray<intptr_t>* parent,
-      GrowableArray<intptr_t>* label);
+  void CompressPath(intptr_t start_index,
+                    intptr_t current_index,
+                    GrowableArray<intptr_t>* parent,
+                    GrowableArray<intptr_t>* label);
 
   void Rename(GrowableArray<PhiInstr*>* live_phis,
               VariableLivenessAnalysis* variable_liveness,
               ZoneGrowableArray<Definition*>* inlining_parameters);
-  void RenameRecursive(
-      BlockEntryInstr* block_entry,
-      GrowableArray<Definition*>* env,
-      GrowableArray<PhiInstr*>* live_phis,
-      VariableLivenessAnalysis* variable_liveness);
+  void RenameRecursive(BlockEntryInstr* block_entry,
+                       GrowableArray<Definition*>* env,
+                       GrowableArray<PhiInstr*>* live_phis,
+                       VariableLivenessAnalysis* variable_liveness);
 
   void AttachEnvironment(Instruction* instr, GrowableArray<Definition*>* env);
 
-  void InsertPhis(
-      const GrowableArray<BlockEntryInstr*>& preorder,
-      const GrowableArray<BitVector*>& assigned_vars,
-      const GrowableArray<BitVector*>& dom_frontier,
-      GrowableArray<PhiInstr*>* live_phis);
+  void InsertPhis(const GrowableArray<BlockEntryInstr*>& preorder,
+                  const GrowableArray<BitVector*>& assigned_vars,
+                  const GrowableArray<BitVector*>& dom_frontier,
+                  GrowableArray<PhiInstr*>* live_phis);
 
   void RemoveDeadPhis(GrowableArray<PhiInstr*>* live_phis);
 
@@ -376,8 +348,10 @@
   void TryMergeMathUnary(
       GrowableArray<InvokeMathCFunctionInstr*>* merge_candidates);
 
-  void AppendExtractNthOutputForMerged(Definition* instr, intptr_t ix,
-                                       Representation rep, intptr_t cid);
+  void AppendExtractNthOutputForMerged(Definition* instr,
+                                       intptr_t ix,
+                                       Representation rep,
+                                       intptr_t cid);
 
   Thread* thread_;
 
@@ -422,7 +396,7 @@
 
   void Analyze();
 
-  virtual ~LivenessAnalysis() { }
+  virtual ~LivenessAnalysis() {}
 
   BitVector* GetLiveInSetAt(intptr_t postorder_number) const {
     return live_in_[postorder_number];
@@ -520,13 +494,10 @@
 
 class DefinitionWorklist : public ValueObject {
  public:
-  DefinitionWorklist(FlowGraph* flow_graph,
-                     intptr_t initial_capacity)
+  DefinitionWorklist(FlowGraph* flow_graph, intptr_t initial_capacity)
       : defs_(initial_capacity),
-        contains_vector_(
-            new BitVector(flow_graph->zone(),
-                          flow_graph->current_ssa_temp_index())) {
-  }
+        contains_vector_(new BitVector(flow_graph->zone(),
+                                       flow_graph->current_ssa_temp_index())) {}
 
   void Add(Definition* defn) {
     if (!Contains(defn)) {
@@ -537,12 +508,10 @@
 
   bool Contains(Definition* defn) const {
     return (defn->ssa_temp_index() >= 0) &&
-        contains_vector_->Contains(defn->ssa_temp_index());
+           contains_vector_->Contains(defn->ssa_temp_index());
   }
 
-  bool IsEmpty() const {
-    return defs_.is_empty();
-  }
+  bool IsEmpty() const { return defs_.is_empty(); }
 
   Definition* RemoveLast() {
     Definition* defn = defs_.RemoveLast();
diff --git a/runtime/vm/flow_graph_allocator.cc b/runtime/vm/flow_graph_allocator.cc
index 423e6c1..9010074 100644
--- a/runtime/vm/flow_graph_allocator.cc
+++ b/runtime/vm/flow_graph_allocator.cc
@@ -69,23 +69,23 @@
 
 FlowGraphAllocator::FlowGraphAllocator(const FlowGraph& flow_graph,
                                        bool intrinsic_mode)
-  : flow_graph_(flow_graph),
-    reaching_defs_(flow_graph),
-    value_representations_(flow_graph.max_virtual_register_number()),
-    block_order_(flow_graph.reverse_postorder()),
-    postorder_(flow_graph.postorder()),
-    liveness_(flow_graph),
-    vreg_count_(flow_graph.max_virtual_register_number()),
-    live_ranges_(flow_graph.max_virtual_register_number()),
-    cpu_regs_(),
-    fpu_regs_(),
-    blocked_cpu_registers_(),
-    blocked_fpu_registers_(),
-    number_of_registers_(0),
-    registers_(),
-    blocked_registers_(),
-    cpu_spill_slot_count_(0),
-    intrinsic_mode_(intrinsic_mode) {
+    : flow_graph_(flow_graph),
+      reaching_defs_(flow_graph),
+      value_representations_(flow_graph.max_virtual_register_number()),
+      block_order_(flow_graph.reverse_postorder()),
+      postorder_(flow_graph.postorder()),
+      liveness_(flow_graph),
+      vreg_count_(flow_graph.max_virtual_register_number()),
+      live_ranges_(flow_graph.max_virtual_register_number()),
+      cpu_regs_(),
+      fpu_regs_(),
+      blocked_cpu_registers_(),
+      blocked_fpu_registers_(),
+      number_of_registers_(0),
+      registers_(),
+      blocked_registers_(),
+      cpu_spill_slot_count_(0),
+      intrinsic_mode_(intrinsic_mode) {
   for (intptr_t i = 0; i < vreg_count_; i++) {
     live_ranges_.Add(NULL);
   }
@@ -196,8 +196,7 @@
       // Add non-argument uses from the deoptimization environment (pushed
       // arguments are not allocated by the register allocator).
       if (current->env() != NULL) {
-        for (Environment::DeepIterator env_it(current->env());
-             !env_it.Done();
+        for (Environment::DeepIterator env_it(current->env()); !env_it.Done();
              env_it.Advance()) {
           Definition* defn = env_it.CurrentValue()->definition();
           if (defn->IsMaterializeObject()) {
@@ -249,8 +248,7 @@
     } else if (block->IsCatchBlockEntry()) {
       // Process initial definitions.
       CatchBlockEntryInstr* catch_entry = block->AsCatchBlockEntry();
-      for (intptr_t i = 0;
-           i < catch_entry->initial_definitions()->length();
+      for (intptr_t i = 0; i < catch_entry->initial_definitions()->length();
            i++) {
         Definition* def = (*catch_entry->initial_definitions())[i];
         const intptr_t vreg = def->ssa_temp_index();
@@ -275,8 +273,7 @@
   ASSERT((first_use_interval_->start_ <= pos) &&
          (pos <= first_use_interval_->end_));
   if (uses_ != NULL) {
-    if ((uses_->pos() == pos) &&
-        (uses_->location_slot() == location_slot)) {
+    if ((uses_->pos() == pos) && (uses_->location_slot() == location_slot)) {
       return uses_;
     } else if (uses_->pos() < pos) {
       // If an instruction at position P is using the same value both as
@@ -443,8 +440,8 @@
   if (loc.IsRegister()) {
     BlockRegisterLocation(loc, from, to, blocked_cpu_registers_, cpu_regs_);
 #if defined(TARGET_ARCH_DBC)
-    last_used_register_ = Utils::Maximum(last_used_register_,
-                                         loc.register_code());
+    last_used_register_ =
+        Utils::Maximum(last_used_register_, loc.register_code());
 #endif
   } else if (loc.IsFpuRegister()) {
     BlockRegisterLocation(loc, from, to, blocked_fpu_registers_, fpu_regs_);
@@ -459,9 +456,8 @@
     return;
   }
 
-  THR_Print("  live range v%" Pd " [%" Pd ", %" Pd ") in ", vreg(),
-                                                            Start(),
-                                                            End());
+  THR_Print("  live range v%" Pd " [%" Pd ", %" Pd ") in ", vreg(), Start(),
+            End());
   assigned_location().Print();
   if (spill_slot_.HasStackIndex()) {
     intptr_t stack_slot = spill_slot_.stack_index();
@@ -478,11 +474,9 @@
   }
 
   UsePosition* use_pos = uses_;
-  for (UseInterval* interval = first_use_interval_;
-       interval != NULL;
+  for (UseInterval* interval = first_use_interval_; interval != NULL;
        interval = interval->next()) {
-    THR_Print("    use interval [%" Pd ", %" Pd ")\n",
-              interval->start(),
+    THR_Print("    use interval [%" Pd ", %" Pd ")\n", interval->start(),
               interval->end());
     while ((use_pos != NULL) && (use_pos->pos() <= interval->end())) {
       THR_Print("      use at %" Pd "", use_pos->pos());
@@ -560,8 +554,7 @@
     // For every SSA value that is live out of this block, create an interval
     // that covers the whole block.  It will be shortened if we encounter a
     // definition of this value in this block.
-    for (BitVector::Iterator it(liveness_.GetLiveOutSetAt(i));
-         !it.Done();
+    for (BitVector::Iterator it(liveness_.GetLiveOutSetAt(i)); !it.Done();
          it.Advance()) {
       LiveRange* range = GetLiveRange(it.Current());
       range->AddUseInterval(block->start_pos(), block->end_pos());
@@ -569,21 +562,20 @@
 
     BlockInfo* loop_header = block_info->loop_header();
     if ((loop_header != NULL) && (loop_header->last_block() == block)) {
-      current_interference_set = new(zone) BitVector(
-          zone, flow_graph_.max_virtual_register_number());
+      current_interference_set =
+          new (zone) BitVector(zone, flow_graph_.max_virtual_register_number());
       ASSERT(loop_header->backedge_interference() == NULL);
       // All values flowing into the loop header are live at the back-edge and
       // can interfere with phi moves.
       current_interference_set->AddAll(
           liveness_.GetLiveInSet(loop_header->entry()));
-      loop_header->set_backedge_interference(
-          current_interference_set);
+      loop_header->set_backedge_interference(current_interference_set);
     }
 
     // Connect outgoing phi-moves that were created in NumberInstructions
     // and find last instruction that contributes to liveness.
-    Instruction* current = ConnectOutgoingPhiMoves(block,
-                                                   current_interference_set);
+    Instruction* current =
+        ConnectOutgoingPhiMoves(block, current_interference_set);
 
     // Now process all instructions in reverse order.
     while (current != block) {
@@ -598,8 +590,7 @@
     // Check if any values live into the loop can be spilled for free.
     if (block_info->is_loop_header()) {
       current_interference_set = NULL;
-      for (BitVector::Iterator it(liveness_.GetLiveInSetAt(i));
-           !it.Done();
+      for (BitVector::Iterator it(liveness_.GetLiveInSetAt(i)); !it.Done();
            it.Advance()) {
         LiveRange* range = GetLiveRange(it.Current());
         if (HasOnlyUnconstrainedUsesInLoop(range, block_info)) {
@@ -616,8 +607,7 @@
 
       ProcessEnvironmentUses(catch_entry, catch_entry);  // For lazy deopt
 
-      for (intptr_t i = 0;
-           i < catch_entry->initial_definitions()->length();
+      for (intptr_t i = 0; i < catch_entry->initial_definitions()->length();
            i++) {
         Definition* defn = (*catch_entry->initial_definitions())[i];
         LiveRange* range = GetLiveRange(defn->ssa_temp_index());
@@ -637,11 +627,9 @@
       const intptr_t stacktrace_reg =
           LocalVarIndex(0, catch_entry->stacktrace_var().index());
 #endif
-      BlockLocation(Location::RegisterLocation(exception_reg),
-                    start,
+      BlockLocation(Location::RegisterLocation(exception_reg), start,
                     ToInstructionEnd(start));
-      BlockLocation(Location::RegisterLocation(stacktrace_reg),
-                    start,
+      BlockLocation(Location::RegisterLocation(stacktrace_reg), start,
                     ToInstructionEnd(start));
     }
   }
@@ -694,8 +682,7 @@
       UsePosition* use =
           range->finger()->FirstRegisterBeneficialUse(block->start_pos());
       if (use != NULL) {
-        LiveRange* tail =
-            SplitBetween(range, block->start_pos(), use->pos());
+        LiveRange* tail = SplitBetween(range, block->start_pos(), use->pos());
         // Parameters and constants are tagged, so allocated to CPU registers.
         ASSERT(constant->representation() == kTagged);
         CompleteRange(tail, Location::kRegister);
@@ -733,10 +720,9 @@
       return;
     }
 #endif  // defined(TARGET_ARCH_DBC)
-    range->set_assigned_location(Location::StackSlot(slot_index,
-                                                     param->base_reg()));
-    range->set_spill_slot(Location::StackSlot(slot_index,
-                                              param->base_reg()));
+    range->set_assigned_location(
+        Location::StackSlot(slot_index, param->base_reg()));
+    range->set_spill_slot(Location::StackSlot(slot_index, param->base_reg()));
 
   } else if (defn->IsCurrentContext()) {
 #if !defined(TARGET_ARCH_DBC)
@@ -765,8 +751,7 @@
   UsePosition* use =
       range->finger()->FirstRegisterBeneficialUse(block->start_pos());
   if (use != NULL) {
-    LiveRange* tail =
-        SplitBetween(range, block->start_pos(), use->pos());
+    LiveRange* tail = SplitBetween(range, block->start_pos(), use->pos());
     // Parameters and constants are tagged, so allocated to CPU registers.
     CompleteRange(tail, Location::kRegister);
   }
@@ -842,7 +827,8 @@
 //
 
 Instruction* FlowGraphAllocator::ConnectOutgoingPhiMoves(
-    BlockEntryInstr* block, BitVector* interfere_at_backedge) {
+    BlockEntryInstr* block,
+    BitVector* interfere_at_backedge) {
   Instruction* last = block->last_instruction();
 
   GotoInstr* goto_instr = last->AsGoto();
@@ -889,8 +875,7 @@
 
     range->AddUseInterval(block->start_pos(), pos);
     range->AddHintedUse(
-        pos,
-        move->src_slot(),
+        pos, move->src_slot(),
         GetLiveRange(phi->ssa_temp_index())->assigned_location_slot());
     move->set_src(Location::PrefersRegister());
 
@@ -902,11 +887,9 @@
         interfere_at_backedge->Add(vreg);
       }
       range->AddUseInterval(block->start_pos(), pos);
-      range->AddHintedUse(
-          pos,
-          move->src_slot(),
-          GetLiveRange(ToSecondPairVreg(
-              phi->ssa_temp_index()))->assigned_location_slot());
+      range->AddHintedUse(pos, move->src_slot(),
+                          GetLiveRange(ToSecondPairVreg(phi->ssa_temp_index()))
+                              ->assigned_location_slot());
       move->set_src(Location::PrefersRegister());
     }
   }
@@ -1044,7 +1027,7 @@
         {
           // Second live range.
           LiveRange* range =
-            GetLiveRange(ToSecondPairVreg(def->ssa_temp_index()));
+              GetLiveRange(ToSecondPairVreg(def->ssa_temp_index()));
           range->AddUseInterval(block_start_pos, use_pos);
           range->AddUse(use_pos, location_pair->SlotAt(1));
         }
@@ -1103,8 +1086,8 @@
       }
     } else if (def->IsMaterializeObject()) {
       locations[i] = Location::NoLocation();
-      ProcessMaterializationUses(
-          block, block_start_pos, use_pos, def->AsMaterializeObject());
+      ProcessMaterializationUses(block, block_start_pos, use_pos,
+                                 def->AsMaterializeObject());
     } else {
       locations[i] = Location::Any();
       LiveRange* range = GetLiveRange(def->ssa_temp_index());
@@ -1137,8 +1120,7 @@
     if (live_registers != NULL) {
       live_registers->Add(*in_ref, range->representation());
     }
-    MoveOperands* move =
-        AddMoveAt(pos - 1, *in_ref, Location::Any());
+    MoveOperands* move = AddMoveAt(pos - 1, *in_ref, Location::Any());
     BlockLocation(*in_ref, pos - 1, pos + 1);
     range->AddUseInterval(block->start_pos(), pos - 1);
     range->AddHintedUse(pos - 1, move->src_slot(), in_ref);
@@ -1150,8 +1132,7 @@
       //                 i  i'
       //      value    --*
       //      temp       [--)
-      MoveOperands* move = AddMoveAt(pos,
-                                     Location::RequiresRegister(),
+      MoveOperands* move = AddMoveAt(pos, Location::RequiresRegister(),
                                      Location::PrefersRegister());
 
       // Add uses to the live range of the input.
@@ -1196,8 +1177,8 @@
   ASSERT(def != NULL);
   ASSERT(block != NULL);
 
-  LiveRange* range = vreg >= 0 ?
-      GetLiveRange(vreg) : MakeLiveRangeForTemporary();
+  LiveRange* range =
+      vreg >= 0 ? GetLiveRange(vreg) : MakeLiveRangeForTemporary();
 
   // Process output and finalize its liverange.
   if (out->IsMachineRegister()) {
@@ -1249,9 +1230,8 @@
            in_ref->Equals(Location::RequiresFpuRegister()));
     *out = *in_ref;
     // Create move that will copy value between input and output.
-    MoveOperands* move = AddMoveAt(pos,
-                                   Location::RequiresRegister(),
-                                   Location::Any());
+    MoveOperands* move =
+        AddMoveAt(pos, Location::RequiresRegister(), Location::Any());
 
     // Add uses to the live range of the input.
     LiveRange* input_range = GetLiveRange(input_vreg);
@@ -1265,8 +1245,7 @@
     range->AddUse(pos, move->dest_slot());
     range->AddUse(pos, in_ref);
 
-    if ((interference_set != NULL) &&
-        (range->vreg() >= 0) &&
+    if ((interference_set != NULL) && (range->vreg() >= 0) &&
         interference_set->Contains(range->vreg())) {
       interference_set->Add(input->ssa_temp_index());
     }
@@ -1301,8 +1280,9 @@
   Definition* def = current->AsDefinition();
   if ((def != NULL) && (def->AsConstant() != NULL)) {
     ASSERT(!def->HasPairRepresentation());
-    LiveRange* range = (def->ssa_temp_index() != -1) ?
-        GetLiveRange(def->ssa_temp_index()) : NULL;
+    LiveRange* range = (def->ssa_temp_index() != -1)
+                           ? GetLiveRange(def->ssa_temp_index())
+                           : NULL;
 
     // Drop definitions of constants that have no uses.
     if ((range == NULL) || (range->first_use() == NULL)) {
@@ -1368,8 +1348,7 @@
   // they will be processed together at the very end.
   {
     for (intptr_t j = output_same_as_first_input ? 1 : 0;
-         j < locs->input_count();
-         j++) {
+         j < locs->input_count(); j++) {
       // Determine if we are dealing with a value pair, and if so, whether
       // the location is the first register or second register.
       Value* input = current->InputAt(j);
@@ -1384,8 +1363,8 @@
         const intptr_t vreg = input->definition()->ssa_temp_index();
         // Each element of the pair is assigned it's own virtual register number
         // and is allocated its own LiveRange.
-        ProcessOneInput(block, pos, pair->SlotAt(0),
-                        input, vreg, live_registers);
+        ProcessOneInput(block, pos, pair->SlotAt(0), input, vreg,
+                        live_registers);
         ProcessOneInput(block, pos, pair->SlotAt(1), input,
                         ToSecondPairVreg(vreg), live_registers);
       } else {
@@ -1418,9 +1397,9 @@
     }
   }
 
-  // Block all allocatable registers for calls.
-  // Note that on DBC registers are always essentially spilled so
-  // we don't need to block anything.
+// Block all allocatable registers for calls.
+// Note that on DBC registers are always essentially spilled so
+// we don't need to block anything.
 #if !defined(TARGET_ARCH_DBC)
   if (locs->always_calls()) {
     // Expected shape of live range:
@@ -1430,15 +1409,13 @@
     //
     // The stack bitmap describes the position i.
     for (intptr_t reg = 0; reg < kNumberOfCpuRegisters; reg++) {
-      BlockLocation(Location::RegisterLocation(static_cast<Register>(reg)),
-                    pos,
+      BlockLocation(Location::RegisterLocation(static_cast<Register>(reg)), pos,
                     pos + 1);
     }
 
     for (intptr_t reg = 0; reg < kNumberOfFpuRegisters; reg++) {
       BlockLocation(
-          Location::FpuRegisterLocation(static_cast<FpuRegister>(reg)),
-          pos,
+          Location::FpuRegisterLocation(static_cast<FpuRegister>(reg)), pos,
           pos + 1);
     }
 
@@ -1499,54 +1476,44 @@
       ASSERT(input->HasPairRepresentation());
       // Each element of the pair is assigned it's own virtual register number
       // and is allocated its own LiveRange.
-      ProcessOneOutput(block, pos,  // BlockEntry, seq.
-                       pair->SlotAt(0), def,  // (output) Location, Definition.
+      ProcessOneOutput(block, pos,             // BlockEntry, seq.
+                       pair->SlotAt(0), def,   // (output) Location, Definition.
                        def->ssa_temp_index(),  // (output) virtual register.
-                       true,  // output mapped to first input.
+                       true,                   // output mapped to first input.
                        in_pair->SlotAt(0), input,  // (input) Location, Def.
-                       input->ssa_temp_index(),  // (input) virtual register.
+                       input->ssa_temp_index(),    // (input) virtual register.
                        interference_set);
-      ProcessOneOutput(block, pos,
-                       pair->SlotAt(1), def,
-                       ToSecondPairVreg(def->ssa_temp_index()),
-                       true,
-                       in_pair->SlotAt(1), input,
-                       ToSecondPairVreg(input->ssa_temp_index()),
-                       interference_set);
+      ProcessOneOutput(
+          block, pos, pair->SlotAt(1), def,
+          ToSecondPairVreg(def->ssa_temp_index()), true, in_pair->SlotAt(1),
+          input, ToSecondPairVreg(input->ssa_temp_index()), interference_set);
     } else {
       // Each element of the pair is assigned it's own virtual register number
       // and is allocated its own LiveRange.
-      ProcessOneOutput(block, pos,
-                       pair->SlotAt(0), def,
-                       def->ssa_temp_index(),
-                       false,            // output is not mapped to first input.
-                       NULL, NULL, -1,   // First input not needed.
+      ProcessOneOutput(block, pos, pair->SlotAt(0), def, def->ssa_temp_index(),
+                       false,           // output is not mapped to first input.
+                       NULL, NULL, -1,  // First input not needed.
                        interference_set);
-      ProcessOneOutput(block, pos,
-                       pair->SlotAt(1), def,
-                       ToSecondPairVreg(def->ssa_temp_index()),
-                       false,
-                       NULL, NULL, -1,
-                       interference_set);
+      ProcessOneOutput(block, pos, pair->SlotAt(1), def,
+                       ToSecondPairVreg(def->ssa_temp_index()), false, NULL,
+                       NULL, -1, interference_set);
     }
   } else {
     if (output_same_as_first_input) {
       Location* in_ref = locs->in_slot(0);
       Definition* input = current->InputAt(0)->definition();
       ASSERT(!in_ref->IsPairLocation());
-      ProcessOneOutput(block, pos,  // BlockEntry, Instruction, seq.
-                       out, def,  // (output) Location, Definition.
+      ProcessOneOutput(block, pos,             // BlockEntry, Instruction, seq.
+                       out, def,               // (output) Location, Definition.
                        def->ssa_temp_index(),  // (output) virtual register.
-                       true,  // output mapped to first input.
-                       in_ref, input,  // (input) Location, Def.
+                       true,                   // output mapped to first input.
+                       in_ref, input,          // (input) Location, Def.
                        input->ssa_temp_index(),  // (input) virtual register.
                        interference_set);
     } else {
-      ProcessOneOutput(block, pos,
-                       out, def,
-                       def->ssa_temp_index(),
-                       false,            // output is not mapped to first input.
-                       NULL, NULL, -1,   // First input not needed.
+      ProcessOneOutput(block, pos, out, def, def->ssa_temp_index(),
+                       false,           // output is not mapped to first input.
+                       NULL, NULL, -1,  // First input not needed.
                        interference_set);
     }
   }
@@ -1667,7 +1634,7 @@
         if (!successor_info->is_loop_header() &&
             ((current_loop == NULL) ||
              (current_loop->entry()->postorder_number() >
-                  successor_info->entry()->postorder_number()))) {
+              successor_info->entry()->postorder_number()))) {
           ASSERT(successor_info != current_loop);
 
           successor_info->mark_loop_header();
@@ -1718,7 +1685,8 @@
 
 bool AllocationFinger::Advance(const intptr_t start) {
   UseInterval* a = first_pending_use_interval_;
-  while (a != NULL && a->end() <= start) a = a->next();
+  while (a != NULL && a->end() <= start)
+    a = a->next();
   first_pending_use_interval_ = a;
   return (first_pending_use_interval_ == NULL);
 }
@@ -1746,12 +1714,11 @@
 
 UsePosition* AllocationFinger::FirstRegisterUse(intptr_t after) {
   for (UsePosition* use = FirstUseAfter(first_register_use_, after);
-       use != NULL;
-       use = use->next()) {
+       use != NULL; use = use->next()) {
     Location* loc = use->location_slot();
     if (loc->IsUnallocated() &&
         ((loc->policy() == Location::kRequiresRegister) ||
-        (loc->policy() == Location::kRequiresFpuRegister))) {
+         (loc->policy() == Location::kRequiresFpuRegister))) {
       first_register_use_ = use;
       return use;
     }
@@ -1762,8 +1729,7 @@
 
 UsePosition* AllocationFinger::FirstRegisterBeneficialUse(intptr_t after) {
   for (UsePosition* use = FirstUseAfter(first_register_beneficial_use_, after);
-       use != NULL;
-       use = use->next()) {
+       use != NULL; use = use->next()) {
     Location* loc = use->location_slot();
     if (loc->IsUnallocated() && loc->IsRegisterBeneficial()) {
       first_register_beneficial_use_ = use;
@@ -1823,7 +1789,7 @@
 }
 
 
-template<typename PositionType>
+template <typename PositionType>
 PositionType* SplitListOfPositions(PositionType** head,
                                    intptr_t split_pos,
                                    bool split_at_start) {
@@ -1876,9 +1842,8 @@
 
   UseInterval* first_after_split = interval;
   if (!split_at_start && interval->Contains(split_pos)) {
-    first_after_split = new UseInterval(split_pos,
-                                        interval->end(),
-                                        interval->next());
+    first_after_split =
+        new UseInterval(split_pos, interval->end(), interval->next());
     interval->end_ = split_pos;
     interval->next_ = first_after_split;
     last_before_split = interval;
@@ -1895,15 +1860,12 @@
   SafepointPosition* first_safepoint_after_split =
       SplitListOfPositions(&first_safepoint_, split_pos, split_at_start);
 
-  UseInterval* last_use_interval = (last_before_split == last_use_interval_) ?
-    first_after_split : last_use_interval_;
-  next_sibling_ = new LiveRange(vreg(),
-                                representation(),
-                                first_use_after_split,
-                                first_after_split,
-                                last_use_interval,
-                                first_safepoint_after_split,
-                                next_sibling_);
+  UseInterval* last_use_interval = (last_before_split == last_use_interval_)
+                                       ? first_after_split
+                                       : last_use_interval_;
+  next_sibling_ = new LiveRange(vreg(), representation(), first_use_after_split,
+                                first_after_split, last_use_interval,
+                                first_safepoint_after_split, next_sibling_);
 
   TRACE_ALLOC(THR_Print("  split sibling [%" Pd ", %" Pd ")\n",
                         next_sibling_->Start(), next_sibling_->End()));
@@ -1922,8 +1884,8 @@
 LiveRange* FlowGraphAllocator::SplitBetween(LiveRange* range,
                                             intptr_t from,
                                             intptr_t to) {
-  TRACE_ALLOC(THR_Print("split v%" Pd " [%" Pd ", %" Pd
-                        ") between [%" Pd ", %" Pd ")\n",
+  TRACE_ALLOC(THR_Print("split v%" Pd " [%" Pd ", %" Pd ") between [%" Pd
+                        ", %" Pd ")\n",
                         range->vreg(), range->Start(), range->End(), from, to));
 
   intptr_t split_pos = kIllegalPosition;
@@ -1994,8 +1956,8 @@
         RangeHasOnlyUnconstrainedUsesInLoop(range, loop_header->loop_id())) {
       ASSERT(loop_header->entry()->start_pos() <= from);
       from = loop_header->entry()->start_pos();
-      TRACE_ALLOC(THR_Print("  moved spill position to loop header %" Pd "\n",
-                            from));
+      TRACE_ALLOC(
+          THR_Print("  moved spill position to loop header %" Pd "\n", from));
     }
   }
 
@@ -2031,11 +1993,11 @@
   // double and quad spill slots as it complicates disambiguation during
   // parallel move resolution.
   const bool need_quad = (register_kind_ == Location::kFpuRegister) &&
-      ((range->representation() == kUnboxedFloat32x4) ||
-       (range->representation() == kUnboxedInt32x4)   ||
-       (range->representation() == kUnboxedFloat64x2));
+                         ((range->representation() == kUnboxedFloat32x4) ||
+                          (range->representation() == kUnboxedInt32x4) ||
+                          (range->representation() == kUnboxedFloat64x2));
   const bool need_untagged = (register_kind_ == Location::kRegister) &&
-      ((range->representation() == kUntagged));
+                             ((range->representation() == kUntagged));
 
   // Search for a free spill slot among allocated: the value in it should be
   // dead and its type should match (e.g. it should not be a part of the quad if
@@ -2043,8 +2005,8 @@
   // For CPU registers we need to take reserved slots for try-catch into
   // account.
   intptr_t idx = register_kind_ == Location::kRegister
-      ? flow_graph_.graph_entry()->fixed_slot_count()
-      : 0;
+                     ? flow_graph_.graph_entry()->fixed_slot_count()
+                     : 0;
   for (; idx < spill_slots_.length(); idx++) {
     if ((need_quad == quad_spill_slots_[idx]) &&
         (need_untagged == untagged_spill_slots_[idx]) &&
@@ -2082,8 +2044,8 @@
     // We use the index of the slot with the lowest address as an index for the
     // FPU register spill slot. In terms of indexes this relation is inverted:
     // so we have to take the highest index.
-    const intptr_t slot_idx = cpu_spill_slot_count_ +
-        idx * kDoubleSpillFactor + (kDoubleSpillFactor - 1);
+    const intptr_t slot_idx = cpu_spill_slot_count_ + idx * kDoubleSpillFactor +
+                              (kDoubleSpillFactor - 1);
 
     Location location;
     if ((range->representation() == kUnboxedFloat32x4) ||
@@ -2108,8 +2070,7 @@
 
   while (range != NULL) {
     for (SafepointPosition* safepoint = range->first_safepoint();
-         safepoint != NULL;
-         safepoint = safepoint->next()) {
+         safepoint != NULL; safepoint = safepoint->next()) {
       // Mark the stack slot as having an object.
       safepoint->locs()->SetStackBit(stack_index);
     }
@@ -2132,7 +2093,8 @@
 
 
 intptr_t FlowGraphAllocator::FirstIntersectionWithAllocated(
-    intptr_t reg, LiveRange* unallocated) {
+    intptr_t reg,
+    LiveRange* unallocated) {
   intptr_t intersection = kMaxPosition;
   for (intptr_t i = 0; i < registers_[reg]->length(); i++) {
     LiveRange* allocated = (*registers_[reg])[i];
@@ -2143,8 +2105,7 @@
     if (allocated_head->start() >= intersection) continue;
 
     const intptr_t pos = FirstIntersection(
-        unallocated->finger()->first_pending_use_interval(),
-        allocated_head);
+        unallocated->finger()->first_pending_use_interval(), allocated_head);
     if (pos < intersection) intersection = pos;
   }
   return intersection;
@@ -2154,8 +2115,8 @@
 void ReachingDefs::AddPhi(PhiInstr* phi) {
   if (phi->reaching_defs() == NULL) {
     Zone* zone = flow_graph_.zone();
-    phi->set_reaching_defs(new(zone) BitVector(
-        zone, flow_graph_.max_virtual_register_number()));
+    phi->set_reaching_defs(
+        new (zone) BitVector(zone, flow_graph_.max_virtual_register_number()));
 
     // Compute initial set reaching defs set.
     bool depends_on_phi = false;
@@ -2230,15 +2191,13 @@
   Location hint = unallocated->finger()->FirstHint();
   if (hint.IsMachineRegister()) {
     if (!blocked_registers_[hint.register_code()]) {
-      free_until = FirstIntersectionWithAllocated(hint.register_code(),
-                                                  unallocated);
+      free_until =
+          FirstIntersectionWithAllocated(hint.register_code(), unallocated);
       candidate = hint.register_code();
     }
 
     TRACE_ALLOC(THR_Print("found hint %s for v%" Pd ": free until %" Pd "\n",
-                          hint.Name(),
-                          unallocated->vreg(),
-                          free_until));
+                          hint.Name(), unallocated->vreg(), free_until));
   } else {
     for (intptr_t reg = 0; reg < NumberOfRegisters(); ++reg) {
       if (!blocked_registers_[reg] && (registers_[reg]->length() == 0)) {
@@ -2271,8 +2230,7 @@
   // searching for a candidate that does not interfere with phis on the back
   // edge.
   BlockInfo* loop_header = BlockInfoAt(unallocated->Start())->loop_header();
-  if ((unallocated->vreg() >= 0) &&
-      (loop_header != NULL) &&
+  if ((unallocated->vreg() >= 0) && (loop_header != NULL) &&
       (free_until >= loop_header->last_block()->end_pos()) &&
       loop_header->backedge_interference()->Contains(unallocated->vreg())) {
     GrowableArray<bool> used_on_backedge(number_of_registers_);
@@ -2280,8 +2238,7 @@
       used_on_backedge.Add(false);
     }
 
-    for (PhiIterator it(loop_header->entry()->AsJoinEntry());
-         !it.Done();
+    for (PhiIterator it(loop_header->entry()->AsJoinEntry()); !it.Done();
          it.Advance()) {
       PhiInstr* phi = it.Current();
       ASSERT(phi->is_alive());
@@ -2307,16 +2264,15 @@
     }
 
     if (used_on_backedge[candidate]) {
-      TRACE_ALLOC(THR_Print(
-          "considering %s for v%" Pd ": has interference on the back edge"
-          " {loop [%" Pd ", %" Pd ")}\n",
-          MakeRegisterLocation(candidate).Name(),
-          unallocated->vreg(),
-          loop_header->entry()->start_pos(),
-          loop_header->last_block()->end_pos()));
+      TRACE_ALLOC(THR_Print("considering %s for v%" Pd
+                            ": has interference on the back edge"
+                            " {loop [%" Pd ", %" Pd ")}\n",
+                            MakeRegisterLocation(candidate).Name(),
+                            unallocated->vreg(),
+                            loop_header->entry()->start_pos(),
+                            loop_header->last_block()->end_pos()));
       for (intptr_t reg = 0; reg < NumberOfRegisters(); ++reg) {
-        if (blocked_registers_[reg] ||
-            (reg == candidate) ||
+        if (blocked_registers_[reg] || (reg == candidate) ||
             used_on_backedge[reg]) {
           continue;
         }
@@ -2328,8 +2284,7 @@
           free_until = intersection;
           TRACE_ALLOC(THR_Print(
               "found %s for v%" Pd " with no interference on the back edge\n",
-              MakeRegisterLocation(candidate).Name(),
-              candidate));
+              MakeRegisterLocation(candidate).Name(), candidate));
           break;
         }
       }
@@ -2433,8 +2388,7 @@
   }
 
   const intptr_t register_use_pos =
-      (register_use != NULL) ? register_use->pos()
-                             : unallocated->Start();
+      (register_use != NULL) ? register_use->pos() : unallocated->Start();
   if (free_until < register_use_pos) {
     // Can't acquire free register. Spill until we really need one.
     ASSERT(unallocated->Start() < ToInstructionStart(register_use_pos));
@@ -2452,9 +2406,8 @@
   if (blocked_at < unallocated->End()) {
     // Register is blocked before the end of the live range.  Split the range
     // at latest at blocked_at position.
-    LiveRange* tail = SplitBetween(unallocated,
-                                   unallocated->Start(),
-                                   blocked_at + 1);
+    LiveRange* tail =
+        SplitBetween(unallocated, unallocated->Start(), blocked_at + 1);
     AddToUnallocated(tail);
   }
 
@@ -2483,8 +2436,7 @@
         return false;
       }
 
-      UsePosition* use =
-          allocated->finger()->FirstInterferingUse(start);
+      UsePosition* use = allocated->finger()->FirstInterferingUse(start);
       if ((use != NULL) && ((ToInstructionStart(use->pos()) - start) <= 1)) {
         // This register is blocked by interval that is used
         // as register in the current instruction and can't
@@ -2492,8 +2444,7 @@
         return false;
       }
 
-      const intptr_t use_pos = (use != NULL) ? use->pos()
-                                             : allocated->End();
+      const intptr_t use_pos = (use != NULL) ? use->pos() : allocated->End();
 
       if (use_pos < free_until) free_until = use_pos;
     } else {
@@ -2562,8 +2513,7 @@
   UseInterval* first_unallocated =
       unallocated->finger()->first_pending_use_interval();
   const intptr_t intersection = FirstIntersection(
-      allocated->finger()->first_pending_use_interval(),
-      first_unallocated);
+      allocated->finger()->first_pending_use_interval(), first_unallocated);
   if (intersection == kMaxPosition) return false;
 
   const intptr_t spill_position = first_unallocated->start();
@@ -2641,8 +2591,7 @@
   // code.
   if (loc.IsMachineRegister()) {
     for (SafepointPosition* safepoint = range->first_safepoint();
-         safepoint != NULL;
-         safepoint = safepoint->next()) {
+         safepoint != NULL; safepoint = safepoint->next()) {
 #if !defined(TARGET_ARCH_DBC)
       if (!safepoint->locs()->always_calls()) {
         ASSERT(safepoint->locs()->can_call());
@@ -2680,8 +2629,7 @@
 bool LiveRange::Contains(intptr_t pos) const {
   if (!CanCover(pos)) return false;
 
-  for (UseInterval* interval = first_use_interval_;
-       interval != NULL;
+  for (UseInterval* interval = first_use_interval_; interval != NULL;
        interval = interval->next()) {
     if (interval->Contains(pos)) {
       return true;
@@ -2692,8 +2640,7 @@
 }
 
 
-void FlowGraphAllocator::AssignSafepoints(Definition* defn,
-                                          LiveRange* range) {
+void FlowGraphAllocator::AssignSafepoints(Definition* defn, LiveRange* range) {
   for (intptr_t i = safepoints_.length() - 1; i >= 0; i--) {
     Instruction* safepoint_instr = safepoints_[i];
     if (safepoint_instr == defn) {
@@ -2815,8 +2762,7 @@
     const intptr_t start = range->Start();
     TRACE_ALLOC(THR_Print("Processing live range for v%" Pd " "
                           "starting at %" Pd "\n",
-                          range->vreg(),
-                          start));
+                          range->vreg(), start));
 
     // TODO(vegorov): eagerly spill liveranges without register uses.
     AdvanceActiveIntervals(start);
@@ -2843,8 +2789,7 @@
 
 bool FlowGraphAllocator::TargetLocationIsSpillSlot(LiveRange* range,
                                                    Location target) {
-  if (target.IsStackSlot() ||
-      target.IsDoubleStackSlot() ||
+  if (target.IsStackSlot() || target.IsDoubleStackSlot() ||
       target.IsConstant()) {
     ASSERT(GetLiveRange(range->vreg())->spill_slot().Equals(target));
     return true;
@@ -2857,8 +2802,7 @@
                                               BlockEntryInstr* source_block,
                                               BlockEntryInstr* target_block) {
   TRACE_ALLOC(THR_Print("Connect v%" Pd " on the edge B%" Pd " -> B%" Pd "\n",
-                        parent->vreg(),
-                        source_block->block_id(),
+                        parent->vreg(), source_block->block_id(),
                         target_block->block_id()));
   if (parent->next_sibling() == NULL) {
     // Nothing to connect. The whole range was allocated to the same location.
@@ -2901,12 +2845,9 @@
 
   TRACE_ALLOC(THR_Print("connecting v%" Pd " between [%" Pd ", %" Pd ") {%s} "
                         "to [%" Pd ", %" Pd ") {%s}\n",
-                        parent->vreg(),
-                        source_cover->Start(),
-                        source_cover->End(),
-                        source.Name(),
-                        target_cover->Start(),
-                        target_cover->End(),
+                        parent->vreg(), source_cover->Start(),
+                        source_cover->End(), source.Name(),
+                        target_cover->Start(), target_cover->End(),
                         target.Name()));
 
   // Siblings were allocated to the same register.
@@ -2936,19 +2877,18 @@
 
     while (range->next_sibling() != NULL) {
       LiveRange* sibling = range->next_sibling();
-      TRACE_ALLOC(THR_Print("connecting [%" Pd ", %" Pd ") [",
-                            range->Start(), range->End()));
+      TRACE_ALLOC(THR_Print("connecting [%" Pd ", %" Pd ") [", range->Start(),
+                            range->End()));
       TRACE_ALLOC(range->assigned_location().Print());
-      TRACE_ALLOC(THR_Print("] to [%" Pd ", %" Pd ") [",
-                            sibling->Start(), sibling->End()));
+      TRACE_ALLOC(THR_Print("] to [%" Pd ", %" Pd ") [", sibling->Start(),
+                            sibling->End()));
       TRACE_ALLOC(sibling->assigned_location().Print());
       TRACE_ALLOC(THR_Print("]\n"));
       if ((range->End() == sibling->Start()) &&
           !TargetLocationIsSpillSlot(range, sibling->assigned_location()) &&
           !range->assigned_location().Equals(sibling->assigned_location()) &&
           !IsBlockEntry(range->End())) {
-        AddMoveAt(sibling->Start(),
-                  sibling->assigned_location(),
+        AddMoveAt(sibling->Start(), sibling->assigned_location(),
                   range->assigned_location());
       }
       range = sibling;
@@ -2977,8 +2917,7 @@
         range->assigned_location().IsConstant()) {
       ASSERT(range->assigned_location().Equals(range->spill_slot()));
     } else {
-      AddMoveAt(range->Start() + 1,
-                range->spill_slot(),
+      AddMoveAt(range->Start() + 1, range->spill_slot(),
                 range->assigned_location());
     }
   }
@@ -3007,16 +2946,14 @@
     ASSERT(!def->HasPairRepresentation());
   }
 
-  for (BlockIterator it = flow_graph_.reverse_postorder_iterator();
-       !it.Done();
+  for (BlockIterator it = flow_graph_.reverse_postorder_iterator(); !it.Done();
        it.Advance()) {
     BlockEntryInstr* block = it.Current();
 
     // Catch entry.
     if (block->IsCatchBlockEntry()) {
       CatchBlockEntryInstr* catch_entry = block->AsCatchBlockEntry();
-      for (intptr_t i = 0;
-           i < catch_entry->initial_definitions()->length();
+      for (intptr_t i = 0; i < catch_entry->initial_definitions()->length();
            ++i) {
         Definition* def = (*catch_entry->initial_definitions())[i];
         ASSERT(!def->HasPairRepresentation());
@@ -3039,8 +2976,7 @@
       }
     }
     // Normal instructions.
-    for (ForwardInstructionIterator instr_it(block);
-         !instr_it.Done();
+    for (ForwardInstructionIterator instr_it(block); !instr_it.Done();
          instr_it.Advance()) {
       Definition* def = instr_it.Current()->AsDefinition();
       if ((def != NULL) && (def->ssa_temp_index() >= 0)) {
@@ -3048,8 +2984,8 @@
         value_representations_[vreg] =
             RepresentationForRange(def->representation());
         if (def->HasPairRepresentation()) {
-         value_representations_[ToSecondPairVreg(vreg)] =
-            RepresentationForRange(def->representation());
+          value_representations_[ToSecondPairVreg(vreg)] =
+              RepresentationForRange(def->representation());
         }
       }
     }
@@ -3090,11 +3026,8 @@
     THR_Print("----------------------------------------------\n");
   }
 
-  PrepareForAllocation(Location::kRegister,
-                       kNumberOfCpuRegisters,
-                       unallocated_cpu_,
-                       cpu_regs_,
-                       blocked_cpu_registers_);
+  PrepareForAllocation(Location::kRegister, kNumberOfCpuRegisters,
+                       unallocated_cpu_, cpu_regs_, blocked_cpu_registers_);
   AllocateUnallocatedRanges();
 #if defined(TARGET_ARCH_DBC)
   const intptr_t last_used_cpu_register = last_used_register_;
@@ -3106,11 +3039,8 @@
   quad_spill_slots_.Clear();
   untagged_spill_slots_.Clear();
 
-  PrepareForAllocation(Location::kFpuRegister,
-                       kNumberOfFpuRegisters,
-                       unallocated_xmm_,
-                       fpu_regs_,
-                       blocked_fpu_registers_);
+  PrepareForAllocation(Location::kFpuRegister, kNumberOfFpuRegisters,
+                       unallocated_xmm_, fpu_regs_, blocked_fpu_registers_);
 #if defined(TARGET_ARCH_DBC)
   // For DBC all registers should have been allocated in the first pass.
   ASSERT(unallocated_.is_empty());
@@ -3139,9 +3069,9 @@
   // introducing a separate field. It has roughly the same meaning:
   // number of used registers determines how big of a frame to reserve for
   // this function on DBC stack.
-  entry->set_spill_slot_count(Utils::Maximum((last_used_cpu_register + 1) +
-                                             (last_used_fpu_register + 1),
-                                             flow_graph_.num_copied_params()));
+  entry->set_spill_slot_count(Utils::Maximum(
+      (last_used_cpu_register + 1) + (last_used_fpu_register + 1),
+      flow_graph_.num_copied_params()));
 #endif
 
   if (FLAG_print_ssa_liveranges) {
diff --git a/runtime/vm/flow_graph_allocator.h b/runtime/vm/flow_graph_allocator.h
index 6cd79e0..a1d7242 100644
--- a/runtime/vm/flow_graph_allocator.h
+++ b/runtime/vm/flow_graph_allocator.h
@@ -22,8 +22,7 @@
 class ReachingDefs : public ValueObject {
  public:
   explicit ReachingDefs(const FlowGraph& flow_graph)
-      : flow_graph_(flow_graph),
-        phis_(10) { }
+      : flow_graph_(flow_graph), phis_(10) {}
 
   BitVector* Get(PhiInstr* phi);
 
@@ -41,7 +40,7 @@
   explicit SSALivenessAnalysis(const FlowGraph& flow_graph)
       : LivenessAnalysis(flow_graph.max_virtual_register_number(),
                          flow_graph.postorder()),
-        graph_entry_(flow_graph.graph_entry()) { }
+        graph_entry_(flow_graph.graph_entry()) {}
 
  private:
   // Compute initial values for live-out, kill and live-in sets.
@@ -214,8 +213,7 @@
 
   // Find first intersection between unallocated live range and
   // live ranges currently allocated to the given register.
-  intptr_t FirstIntersectionWithAllocated(intptr_t reg,
-                                          LiveRange* unallocated);
+  intptr_t FirstIntersectionWithAllocated(intptr_t reg, LiveRange* unallocated);
 
   bool UpdateFreeUntil(intptr_t reg,
                        LiveRange* unallocated,
@@ -345,11 +343,10 @@
 class BlockInfo : public ZoneAllocated {
  public:
   explicit BlockInfo(BlockEntryInstr* entry)
-    : entry_(entry),
-      loop_(NULL),
-      is_loop_header_(false),
-      backedge_interference_(NULL) {
-  }
+      : entry_(entry),
+        loop_(NULL),
+        is_loop_header_(false),
+        backedge_interference_(NULL) {}
 
   BlockEntryInstr* entry() const { return entry_; }
 
@@ -379,16 +376,12 @@
   }
 
   BlockEntryInstr* last_block() const { return last_block_; }
-  void set_last_block(BlockEntryInstr* last_block) {
-    last_block_ = last_block;
-  }
+  void set_last_block(BlockEntryInstr* last_block) { last_block_ = last_block; }
 
   intptr_t loop_id() const { return loop_id_; }
   void set_loop_id(intptr_t loop_id) { loop_id_ = loop_id; }
 
-  BitVector* backedge_interference() const {
-    return backedge_interference_;
-  }
+  BitVector* backedge_interference() const { return backedge_interference_; }
 
   void set_backedge_interference(BitVector* backedge_interference) {
     backedge_interference_ = backedge_interference;
@@ -430,13 +423,9 @@
     return *hint_;
   }
 
-  void set_hint(Location* hint) {
-    hint_ = hint;
-  }
+  void set_hint(Location* hint) { hint_ = hint; }
 
-  bool HasHint() const {
-    return (hint_ != NULL) && !hint_->IsUnallocated();
-  }
+  bool HasHint() const { return (hint_ != NULL) && !hint_->IsUnallocated(); }
 
 
   void set_next(UsePosition* next) { next_ = next; }
@@ -464,9 +453,7 @@
 class UseInterval : public ZoneAllocated {
  public:
   UseInterval(intptr_t start, intptr_t end, UseInterval* next)
-      : start_(start),
-        end_(end),
-        next_(next) { }
+      : start_(start), end_(end), next_(next) {}
 
   void Print();
 
@@ -501,8 +488,7 @@
       : first_pending_use_interval_(NULL),
         first_register_use_(NULL),
         first_register_beneficial_use_(NULL),
-        first_hinted_use_(NULL) {
-  }
+        first_hinted_use_(NULL) {}
 
   void Initialize(LiveRange* range);
   void UpdateAfterSplit(intptr_t first_use_after_split_pos);
@@ -529,9 +515,8 @@
 
 class SafepointPosition : public ZoneAllocated {
  public:
-  SafepointPosition(intptr_t pos,
-                    LocationSummary* locs)
-      : pos_(pos), locs_(locs), next_(NULL) { }
+  SafepointPosition(intptr_t pos, LocationSummary* locs)
+      : pos_(pos), locs_(locs), next_(NULL) {}
 
   void set_next(SafepointPosition* next) { next_ = next; }
   SafepointPosition* next() const { return next_; }
@@ -552,20 +537,19 @@
 class LiveRange : public ZoneAllocated {
  public:
   explicit LiveRange(intptr_t vreg, Representation rep)
-    : vreg_(vreg),
-      representation_(rep),
-      assigned_location_(),
-      spill_slot_(),
-      uses_(NULL),
-      first_use_interval_(NULL),
-      last_use_interval_(NULL),
-      first_safepoint_(NULL),
-      last_safepoint_(NULL),
-      next_sibling_(NULL),
-      has_only_any_uses_in_loops_(0),
-      is_loop_phi_(false),
-      finger_() {
-  }
+      : vreg_(vreg),
+        representation_(rep),
+        assigned_location_(),
+        spill_slot_(),
+        uses_(NULL),
+        first_use_interval_(NULL),
+        last_use_interval_(NULL),
+        first_safepoint_(NULL),
+        last_safepoint_(NULL),
+        next_sibling_(NULL),
+        has_only_any_uses_in_loops_(0),
+        is_loop_phi_(false),
+        finger_() {}
 
   intptr_t vreg() const { return vreg_; }
   Representation representation() const { return representation_; }
@@ -587,9 +571,7 @@
     assigned_location_ = location;
   }
 
-  void set_spill_slot(Location spill_slot) {
-    spill_slot_ = spill_slot;
-  }
+  void set_spill_slot(Location spill_slot) { spill_slot_ = spill_slot; }
 
   void DefineAt(intptr_t pos);
 
@@ -614,9 +596,7 @@
   // True if the range contains the given position.
   bool Contains(intptr_t pos) const;
 
-  Location spill_slot() const {
-    return spill_slot_;
-  }
+  Location spill_slot() const { return spill_slot_; }
 
   bool HasOnlyUnconstrainedUsesInLoop(intptr_t loop_id) const {
     if (loop_id < kBitsPerWord) {
@@ -633,9 +613,7 @@
   }
 
   bool is_loop_phi() const { return is_loop_phi_; }
-  void mark_loop_phi() {
-    is_loop_phi_ = true;
-  }
+  void mark_loop_phi() { is_loop_phi_ = true; }
 
  private:
   LiveRange(intptr_t vreg,
@@ -645,19 +623,18 @@
             UseInterval* last_use_interval,
             SafepointPosition* first_safepoint,
             LiveRange* next_sibling)
-    : vreg_(vreg),
-      representation_(rep),
-      assigned_location_(),
-      uses_(uses),
-      first_use_interval_(first_use_interval),
-      last_use_interval_(last_use_interval),
-      first_safepoint_(first_safepoint),
-      last_safepoint_(NULL),
-      next_sibling_(next_sibling),
-      has_only_any_uses_in_loops_(0),
-      is_loop_phi_(false),
-      finger_() {
-  }
+      : vreg_(vreg),
+        representation_(rep),
+        assigned_location_(),
+        uses_(uses),
+        first_use_interval_(first_use_interval),
+        last_use_interval_(last_use_interval),
+        first_safepoint_(first_safepoint),
+        last_safepoint_(NULL),
+        next_sibling_(next_sibling),
+        has_only_any_uses_in_loops_(0),
+        is_loop_phi_(false),
+        finger_() {}
 
   const intptr_t vreg_;
   Representation representation_;
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index 11e4d39..e3963d9 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -32,11 +32,15 @@
 
 namespace dart {
 
-DEFINE_FLAG(bool, eliminate_type_checks, true,
+DEFINE_FLAG(bool,
+            eliminate_type_checks,
+            true,
             "Eliminate type checks when allowed by static type analysis.");
 DEFINE_FLAG(bool, print_ast, false, "Print abstract syntax tree.");
 DEFINE_FLAG(bool, print_scopes, false, "Print scopes of local variables.");
-DEFINE_FLAG(bool, trace_type_check_elimination, false,
+DEFINE_FLAG(bool,
+            trace_type_check_elimination,
+            false,
             "Trace type check elimination at compile time.");
 
 DECLARE_FLAG(bool, profile_vm);
@@ -53,13 +57,13 @@
 
 // TODO(srdjan): Allow compiler to add constants as they are encountered in
 // the compilation.
-const double kCommonDoubleConstants[] =
-    {-1.0, -0.5, -0.1, 0.0, 0.1, 0.5, 1.0, 2.0, 4.0, 5.0,
-     10.0, 20.0, 30.0, 64.0, 255.0, NAN,
-     // From dart:math
-     2.718281828459045, 2.302585092994046, 0.6931471805599453,
-     1.4426950408889634, 0.4342944819032518, 3.1415926535897932,
-     0.7071067811865476, 1.4142135623730951};
+const double kCommonDoubleConstants[] = {
+    -1.0, -0.5, -0.1, 0.0, 0.1, 0.5, 1.0, 2.0, 4.0, 5.0, 10.0, 20.0, 30.0, 64.0,
+    255.0, NAN,
+    // From dart:math
+    2.718281828459045, 2.302585092994046, 0.6931471805599453,
+    1.4426950408889634, 0.4342944819032518, 3.1415926535897932,
+    0.7071067811865476, 1.4142135623730951};
 
 uword FlowGraphBuilder::FindDoubleConstant(double value) {
   intptr_t len = sizeof(kCommonDoubleConstants) / sizeof(double);  // NOLINT
@@ -73,18 +77,16 @@
 
 
 #define RECOGNIZE_FACTORY(test_factory_symbol, cid, fp)                        \
-  { Symbols::k##test_factory_symbol##Id, cid,                                  \
-    fp, #test_factory_symbol ", " #cid },
+  {Symbols::k##test_factory_symbol##Id, cid, fp,                               \
+   #test_factory_symbol ", " #cid},  // NOLINT
 
 static struct {
   intptr_t symbold_id;
   intptr_t cid;
   intptr_t finger_print;
   const char* name;
-} factory_recognizer_list[] = {
-  RECOGNIZED_LIST_FACTORY_LIST(RECOGNIZE_FACTORY)
-  { Symbols::kIllegal, -1, -1, NULL }
-};
+} factory_recognizer_list[] = {RECOGNIZED_LIST_FACTORY_LIST(RECOGNIZE_FACTORY){
+    Symbols::kIllegal, -1, -1, NULL}};
 
 #undef RECOGNIZE_FACTORY
 
@@ -96,8 +98,7 @@
          (lib.raw() == Library::TypedDataLibrary()));
   const String& factory_name = String::Handle(factory.name());
   for (intptr_t i = 0;
-       factory_recognizer_list[i].symbold_id != Symbols::kIllegal;
-       i++) {
+       factory_recognizer_list[i].symbold_id != Symbols::kIllegal; i++) {
     if (String::EqualsIgnoringPrivateKey(
             factory_name,
             Symbols::Symbol(factory_recognizer_list[i].symbold_id))) {
@@ -173,9 +174,8 @@
 JoinEntryInstr* NestedStatement::BreakTargetFor(SourceLabel* label) {
   if (label != label_) return NULL;
   if (break_target_ == NULL) {
-    break_target_ =
-        new(owner()->zone()) JoinEntryInstr(owner()->AllocateBlockId(),
-                                            try_index());
+    break_target_ = new (owner()->zone())
+        JoinEntryInstr(owner()->AllocateBlockId(), try_index());
   }
   return break_target_;
 }
@@ -201,8 +201,8 @@
 
 intptr_t NestedBlock::ContextLevel() const {
   return ((scope_ == NULL) || (scope_->num_context_variables() == 0))
-      ? NestedStatement::ContextLevel()
-      : scope_->context_level();
+             ? NestedStatement::ContextLevel()
+             : scope_->context_level();
 }
 
 
@@ -210,7 +210,7 @@
 class NestedContextAdjustment : public NestedStatement {
  public:
   NestedContextAdjustment(FlowGraphBuilder* owner, intptr_t context_level)
-      : NestedStatement(owner, NULL), context_level_(context_level) { }
+      : NestedStatement(owner, NULL), context_level_(context_level) {}
 
   virtual intptr_t ContextLevel() const { return context_level_; }
 
@@ -233,9 +233,7 @@
     owner->IncrementLoopDepth();
   }
 
-  virtual ~NestedLoop() {
-    owner()->DecrementLoopDepth();
-  }
+  virtual ~NestedLoop() { owner()->DecrementLoopDepth(); }
 
   JoinEntryInstr* continue_target() const { return continue_target_; }
 
@@ -249,9 +247,8 @@
 JoinEntryInstr* NestedLoop::ContinueTargetFor(SourceLabel* label) {
   if (label != this->label()) return NULL;
   if (continue_target_ == NULL) {
-    continue_target_ =
-        new(owner()->zone()) JoinEntryInstr(owner()->AllocateBlockId(),
-                                            try_index());
+    continue_target_ = new (owner()->zone())
+        JoinEntryInstr(owner()->AllocateBlockId(), try_index());
   }
   return continue_target_;
 }
@@ -293,9 +290,8 @@
   for (intptr_t i = 0; i < case_labels_.length(); ++i) {
     if (label != case_labels_[i]) continue;
     if (case_targets_[i] == NULL) {
-      case_targets_[i] =
-          new(owner()->zone()) JoinEntryInstr(owner()->AllocateBlockId(),
-                                              try_index());
+      case_targets_[i] = new (owner()->zone())
+          JoinEntryInstr(owner()->AllocateBlockId(), try_index());
     }
     return case_targets_[i];
   }
@@ -307,27 +303,28 @@
     const ParsedFunction& parsed_function,
     const ZoneGrowableArray<const ICData*>& ic_data_array,
     InlineExitCollector* exit_collector,
-    intptr_t osr_id) :
-        parsed_function_(parsed_function),
-        ic_data_array_(ic_data_array),
-        num_copied_params_(parsed_function.num_copied_params()),
-        // All parameters are copied if any parameter is.
-        num_non_copied_params_((num_copied_params_ == 0)
-            ? parsed_function.function().num_fixed_parameters()
-            : 0),
-        num_stack_locals_(parsed_function.num_stack_locals()),
-        exit_collector_(exit_collector),
-        last_used_block_id_(0),  // 0 is used for the graph entry.
-        try_index_(CatchClauseNode::kInvalidTryIndex),
-        catch_try_index_(CatchClauseNode::kInvalidTryIndex),
-        loop_depth_(0),
-        graph_entry_(NULL),
-        temp_count_(0),
-        args_pushed_(0),
-        nesting_stack_(NULL),
-        osr_id_(osr_id),
-        jump_count_(0),
-        await_joins_(new(Z) ZoneGrowableArray<JoinEntryInstr*>()) { }
+    intptr_t osr_id)
+    : parsed_function_(parsed_function),
+      ic_data_array_(ic_data_array),
+      num_copied_params_(parsed_function.num_copied_params()),
+      // All parameters are copied if any parameter is.
+      num_non_copied_params_(
+          (num_copied_params_ == 0)
+              ? parsed_function.function().num_fixed_parameters()
+              : 0),
+      num_stack_locals_(parsed_function.num_stack_locals()),
+      exit_collector_(exit_collector),
+      last_used_block_id_(0),  // 0 is used for the graph entry.
+      try_index_(CatchClauseNode::kInvalidTryIndex),
+      catch_try_index_(CatchClauseNode::kInvalidTryIndex),
+      loop_depth_(0),
+      graph_entry_(NULL),
+      temp_count_(0),
+      args_pushed_(0),
+      nesting_stack_(NULL),
+      osr_id_(osr_id),
+      jump_count_(0),
+      await_joins_(new (Z) ZoneGrowableArray<JoinEntryInstr*>()) {}
 
 
 void FlowGraphBuilder::AddCatchEntry(CatchBlockEntryInstr* entry) {
@@ -349,11 +346,11 @@
   // Attach the outer environment on each instruction in the callee graph.
   ASSERT(call_->env() != NULL);
   // Scale the edge weights by the call count for the inlined function.
-  double scale_factor = static_cast<double>(call_->CallCount())
-      / static_cast<double>(caller_graph_->graph_entry()->entry_count());
+  double scale_factor =
+      static_cast<double>(call_->CallCount()) /
+      static_cast<double>(caller_graph_->graph_entry()->entry_count());
   for (BlockIterator block_it = callee_graph->postorder_iterator();
-       !block_it.Done();
-       block_it.Advance()) {
+       !block_it.Done(); block_it.Advance()) {
     BlockEntryInstr* block = block_it.Current();
     if (block->IsTargetEntry()) {
       block->AsTargetEntry()->adjust_edge_weight(scale_factor);
@@ -381,7 +378,7 @@
 
 
 void InlineExitCollector::AddExit(ReturnInstr* exit) {
-  Data data = { NULL, exit };
+  Data data = {NULL, exit};
   exits_.Add(data);
 }
 
@@ -405,8 +402,7 @@
   int j = 0;
   for (int i = 0; i < exits_.length(); ++i) {
     BlockEntryInstr* block = exits_[i].exit_return->GetBlock();
-    if ((block != NULL) &&
-        (0 <= block->postorder_number()) &&
+    if ((block != NULL) && (0 <= block->postorder_number()) &&
         (block->postorder_number() < postorder.length()) &&
         (postorder[block->postorder_number()] == block)) {
       if (i != j) {
@@ -446,8 +442,7 @@
     // Create a join of the returns.
     intptr_t join_id = caller_graph_->max_block_id() + 1;
     caller_graph_->set_max_block_id(join_id);
-    JoinEntryInstr* join =
-        new(Z) JoinEntryInstr(join_id, try_index);
+    JoinEntryInstr* join = new (Z) JoinEntryInstr(join_id, try_index);
 
     // The dominator set of the join is the intersection of the dominator
     // sets of all the predecessors.  If we keep the dominator sets ordered
@@ -465,7 +460,7 @@
     GrowableArray<BlockEntryInstr*> join_dominators;
     for (intptr_t i = 0; i < num_exits; ++i) {
       // Add the control-flow edge.
-      GotoInstr* goto_instr = new(Z) GotoInstr(join);
+      GotoInstr* goto_instr = new (Z) GotoInstr(join);
       goto_instr->InheritDeoptTarget(zone(), ReturnAt(i));
       LastInstructionAt(i)->LinkTo(goto_instr);
       ExitBlockAt(i)->set_last_instruction(LastInstructionAt(i)->next());
@@ -511,7 +506,7 @@
     // If the call has uses, create a phi of the returns.
     if (call_->HasUses()) {
       // Add a phi of the return values.
-      PhiInstr* phi = new(Z) PhiInstr(join, num_exits);
+      PhiInstr* phi = new (Z) PhiInstr(join, num_exits);
       caller_graph_->AllocateSSAIndexes(phi);
       phi->mark_alive();
       for (intptr_t i = 0; i < num_exits; ++i) {
@@ -550,21 +545,17 @@
     // The true successor is the inlined body, the false successor
     // goes to the rest of the caller graph. It is removed as unreachable code
     // by the constant propagation.
-    TargetEntryInstr* false_block =
-        new(Z) TargetEntryInstr(caller_graph_->allocate_block_id(),
-                                call_block->try_index());
+    TargetEntryInstr* false_block = new (Z) TargetEntryInstr(
+        caller_graph_->allocate_block_id(), call_block->try_index());
     false_block->InheritDeoptTargetAfter(caller_graph_, call_, NULL);
     false_block->LinkTo(call_->next());
     call_block->ReplaceAsPredecessorWith(false_block);
 
     ConstantInstr* true_const = caller_graph_->GetConstant(Bool::True());
-    BranchInstr* branch =
-        new(Z) BranchInstr(
-            new(Z) StrictCompareInstr(TokenPosition::kNoSource,
-                                      Token::kEQ_STRICT,
-                                      new(Z) Value(true_const),
-                                      new(Z) Value(true_const),
-                                      false));  // No number check.
+    BranchInstr* branch = new (Z) BranchInstr(new (Z) StrictCompareInstr(
+        TokenPosition::kNoSource, Token::kEQ_STRICT, new (Z) Value(true_const),
+        new (Z) Value(true_const),
+        false));  // No number check.
     branch->InheritDeoptTarget(zone(), call_);
     *branch->true_successor_address() = callee_entry;
     *branch->false_successor_address() = false_block;
@@ -581,9 +572,8 @@
     call_block->AddDominatedBlock(false_block);
 
   } else {
-    Definition* callee_result = JoinReturns(&callee_exit,
-                                            &callee_last_instruction,
-                                            call_block->try_index());
+    Definition* callee_result = JoinReturns(
+        &callee_exit, &callee_last_instruction, call_block->try_index());
     if (callee_result != NULL) {
       call_->ReplaceUsesWith(callee_result);
     }
@@ -675,7 +665,7 @@
     exit()->LinkTo(definition);
   }
   exit_ = definition;
-  return new(Z) Value(definition);
+  return new (Z) Value(definition);
 }
 
 
@@ -707,10 +697,9 @@
 }
 
 
-void EffectGraphVisitor::AddReturnExit(TokenPosition token_pos,
-                                       Value* value) {
+void EffectGraphVisitor::AddReturnExit(TokenPosition token_pos, Value* value) {
   ASSERT(is_open());
-  ReturnInstr* return_instr = new(Z) ReturnInstr(token_pos, value);
+  ReturnInstr* return_instr = new (Z) ReturnInstr(token_pos, value);
   AddInstruction(return_instr);
   InlineExitCollector* exit_collector = owner()->exit_collector();
   if (exit_collector != NULL) {
@@ -723,7 +712,7 @@
 void EffectGraphVisitor::Goto(JoinEntryInstr* join) {
   ASSERT(is_open());
   if (is_empty()) {
-    entry_ = new(Z) GotoInstr(join);
+    entry_ = new (Z) GotoInstr(join);
   } else {
     exit()->Goto(join);
   }
@@ -772,8 +761,8 @@
   } else if (false_exit == NULL) {
     exit_ = true_exit;
   } else {
-    JoinEntryInstr* join =
-        new(Z) JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
+    JoinEntryInstr* join = new (Z)
+        JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
     true_exit->Goto(join);
     false_exit->Goto(join);
     exit_ = join;
@@ -803,10 +792,10 @@
     Append(test_preamble_fragment);
     Append(test_fragment);
   } else {
-    JoinEntryInstr* join =
-        new(Z) JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
+    JoinEntryInstr* join = new (Z)
+        JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
     CheckStackOverflowInstr* check =
-        new(Z) CheckStackOverflowInstr(token_pos, owner()->loop_depth());
+        new (Z) CheckStackOverflowInstr(token_pos, owner()->loop_depth());
     join->LinkTo(check);
     if (!test_preamble_fragment.is_empty()) {
       check->LinkTo(test_preamble_fragment.entry());
@@ -826,7 +815,7 @@
 
 PushArgumentInstr* EffectGraphVisitor::PushArgument(Value* value) {
   owner_->add_args_pushed(1);
-  PushArgumentInstr* result = new(Z) PushArgumentInstr(value);
+  PushArgumentInstr* result = new (Z) PushArgumentInstr(value);
   AddInstruction(result);
   return result;
 }
@@ -837,15 +826,14 @@
                                                TokenPosition token_pos) {
   ASSERT(!local.is_captured());
   ASSERT(!token_pos.IsClassifying());
-  return new(Z) StoreLocalInstr(local, value, ST(token_pos));
+  return new (Z) StoreLocalInstr(local, value, ST(token_pos));
 }
 
 
 Definition* EffectGraphVisitor::BuildStoreExprTemp(Value* value,
                                                    TokenPosition token_pos) {
   return BuildStoreTemp(*owner()->parsed_function().expression_temp_var(),
-                        value,
-                        token_pos);
+                        value, token_pos);
 }
 
 
@@ -861,26 +849,22 @@
                                                 TokenPosition token_pos) {
   if (local.is_captured()) {
     LocalVariable* tmp_var = EnterTempLocalScope(value);
-    intptr_t delta =
-        owner()->context_level() - local.owner()->context_level();
+    intptr_t delta = owner()->context_level() - local.owner()->context_level();
     ASSERT(delta >= 0);
     Value* context = Bind(BuildCurrentContext(token_pos));
     while (delta-- > 0) {
-      context = Bind(new(Z) LoadFieldInstr(
-          context, Context::parent_offset(), Type::ZoneHandle(Z, Type::null()),
-          token_pos));
+      context = Bind(new (Z) LoadFieldInstr(context, Context::parent_offset(),
+                                            Type::ZoneHandle(Z, Type::null()),
+                                            token_pos));
     }
-    Value* tmp_val = Bind(new(Z) LoadLocalInstr(*tmp_var, token_pos));
-    StoreInstanceFieldInstr* store =
-        new(Z) StoreInstanceFieldInstr(Context::variable_offset(local.index()),
-                                       context,
-                                       tmp_val,
-                                       kEmitStoreBarrier,
-                                       token_pos);
+    Value* tmp_val = Bind(new (Z) LoadLocalInstr(*tmp_var, token_pos));
+    StoreInstanceFieldInstr* store = new (Z)
+        StoreInstanceFieldInstr(Context::variable_offset(local.index()),
+                                context, tmp_val, kEmitStoreBarrier, token_pos);
     Do(store);
     return ExitTempLocalScope(value);
   } else {
-    return new(Z) StoreLocalInstr(local, value, token_pos);
+    return new (Z) StoreLocalInstr(local, value, token_pos);
   }
 }
 
@@ -888,34 +872,30 @@
 Definition* EffectGraphVisitor::BuildLoadLocal(const LocalVariable& local,
                                                TokenPosition token_pos) {
   if (local.IsConst()) {
-    return new(Z) ConstantInstr(*local.ConstValue(), token_pos);
+    return new (Z) ConstantInstr(*local.ConstValue(), token_pos);
   } else if (local.is_captured()) {
-    intptr_t delta =
-        owner()->context_level() - local.owner()->context_level();
+    intptr_t delta = owner()->context_level() - local.owner()->context_level();
     ASSERT(delta >= 0);
     Value* context = Bind(BuildCurrentContext(token_pos));
     while (delta-- > 0) {
-      context = Bind(new(Z) LoadFieldInstr(
-          context, Context::parent_offset(), Type::ZoneHandle(Z, Type::null()),
-          token_pos));
+      context = Bind(new (Z) LoadFieldInstr(context, Context::parent_offset(),
+                                            Type::ZoneHandle(Z, Type::null()),
+                                            token_pos));
     }
-    LoadFieldInstr* load = new(Z) LoadFieldInstr(
-        context,
-        Context::variable_offset(local.index()),
-        local.type(),
-        token_pos);
+    LoadFieldInstr* load =
+        new (Z) LoadFieldInstr(context, Context::variable_offset(local.index()),
+                               local.type(), token_pos);
     load->set_is_immutable(local.is_final());
     return load;
   } else {
-    return new(Z) LoadLocalInstr(local, token_pos);
+    return new (Z) LoadLocalInstr(local, token_pos);
   }
 }
 
 
 // Stores current context into the 'variable'
-void EffectGraphVisitor::BuildSaveContext(
-    const LocalVariable& variable,
-    TokenPosition token_pos) {
+void EffectGraphVisitor::BuildSaveContext(const LocalVariable& variable,
+                                          TokenPosition token_pos) {
   ASSERT(token_pos.IsSynthetic() || token_pos.IsNoSource());
   Value* context = Bind(BuildCurrentContext(token_pos));
   Do(BuildStoreLocal(variable, context, token_pos));
@@ -923,25 +903,23 @@
 
 
 // Loads context saved in 'context_variable' into the current context.
-void EffectGraphVisitor::BuildRestoreContext(
-    const LocalVariable& variable,
-    TokenPosition token_pos) {
+void EffectGraphVisitor::BuildRestoreContext(const LocalVariable& variable,
+                                             TokenPosition token_pos) {
   Value* load_saved_context = Bind(BuildLoadLocal(variable, token_pos));
   Do(BuildStoreContext(load_saved_context, token_pos));
 }
 
 
-Definition* EffectGraphVisitor::BuildStoreContext(
-    Value* value, TokenPosition token_pos) {
-  return new(Z) StoreLocalInstr(
+Definition* EffectGraphVisitor::BuildStoreContext(Value* value,
+                                                  TokenPosition token_pos) {
+  return new (Z) StoreLocalInstr(
       *owner()->parsed_function().current_context_var(), value, token_pos);
 }
 
 
 Definition* EffectGraphVisitor::BuildCurrentContext(TokenPosition token_pos) {
-  return new(Z) LoadLocalInstr(
-      *owner()->parsed_function().current_context_var(),
-      token_pos);
+  return new (Z) LoadLocalInstr(
+      *owner()->parsed_function().current_context_var(), token_pos);
 }
 
 
@@ -950,9 +928,8 @@
     JoinEntryInstr* join) const {
   ASSERT(!branches.is_empty());
   for (intptr_t i = 0; i < branches.length(); i++) {
-    TargetEntryInstr* target =
-        new(Z) TargetEntryInstr(owner()->AllocateBlockId(),
-                                owner()->try_index());
+    TargetEntryInstr* target = new (Z)
+        TargetEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
     *(branches[i]) = target;
     target->Goto(join);
   }
@@ -974,15 +951,14 @@
   ASSERT(!branches.is_empty());
 
   if (branches.length() == 1) {
-    TargetEntryInstr* target =
-        new(Z) TargetEntryInstr(owner()->AllocateBlockId(),
-                                owner()->try_index());
+    TargetEntryInstr* target = new (Z)
+        TargetEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
     *(branches[0]) = target;
     return target;
   }
 
   JoinEntryInstr* join =
-      new(Z) JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
+      new (Z) JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
   ConnectBranchesTo(branches, join);
   return join;
 }
@@ -1001,16 +977,13 @@
 void TestGraphVisitor::ReturnValue(Value* value) {
   Isolate* isolate = Isolate::Current();
   if (isolate->type_checks() || isolate->asserts()) {
-    value = Bind(new(Z) AssertBooleanInstr(condition_token_pos(), value));
+    value = Bind(new (Z) AssertBooleanInstr(condition_token_pos(), value));
   }
-  Value* constant_true = Bind(new(Z) ConstantInstr(Bool::True()));
-  StrictCompareInstr* comp =
-      new(Z) StrictCompareInstr(condition_token_pos(),
-                                Token::kEQ_STRICT,
-                                value,
-                                constant_true,
-                                false);  // No number check.
-  BranchInstr* branch = new(Z) BranchInstr(comp);
+  Value* constant_true = Bind(new (Z) ConstantInstr(Bool::True()));
+  StrictCompareInstr* comp = new (Z) StrictCompareInstr(
+      condition_token_pos(), Token::kEQ_STRICT, value, constant_true,
+      false);  // No number check.
+  BranchInstr* branch = new (Z) BranchInstr(comp);
   AddInstruction(branch);
   CloseFragment();
 
@@ -1023,18 +996,17 @@
   BranchInstr* branch;
   if (Token::IsStrictEqualityOperator(comp->kind())) {
     ASSERT(comp->IsStrictCompare());
-    branch = new(Z) BranchInstr(comp);
+    branch = new (Z) BranchInstr(comp);
   } else if (Token::IsEqualityOperator(comp->kind()) &&
              (comp->left()->BindsToConstantNull() ||
               comp->right()->BindsToConstantNull())) {
-    branch = new(Z) BranchInstr(new(Z) StrictCompareInstr(
+    branch = new (Z) BranchInstr(new (Z) StrictCompareInstr(
         comp->token_pos(),
         (comp->kind() == Token::kEQ) ? Token::kEQ_STRICT : Token::kNE_STRICT,
-        comp->left(),
-        comp->right(),
+        comp->left(), comp->right(),
         false));  // No number check.
   } else {
-    branch = new(Z) BranchInstr(comp);
+    branch = new (Z) BranchInstr(comp);
     branch->set_is_checked(Isolate::Current()->type_checks());
   }
   AddInstruction(branch);
@@ -1046,14 +1018,11 @@
 
 void TestGraphVisitor::MergeBranchWithNegate(BooleanNegateInstr* neg) {
   ASSERT(!Isolate::Current()->type_checks());
-  Value* constant_true = Bind(new(Z) ConstantInstr(Bool::True()));
-  StrictCompareInstr* comp =
-      new(Z) StrictCompareInstr(condition_token_pos(),
-                             Token::kNE_STRICT,
-                             neg->value(),
-                             constant_true,
-                             false);  // No number check.
-  BranchInstr* branch = new(Z) BranchInstr(comp);
+  Value* constant_true = Bind(new (Z) ConstantInstr(Bool::True()));
+  StrictCompareInstr* comp = new (Z) StrictCompareInstr(
+      condition_token_pos(), Token::kNE_STRICT, neg->value(), constant_true,
+      false);  // No number check.
+  BranchInstr* branch = new (Z) BranchInstr(comp);
   AddInstruction(branch);
   CloseFragment();
   true_successor_addresses_.Add(branch->true_successor_address());
@@ -1135,11 +1104,10 @@
   // No debugger check is done in native functions or for return
   // statements for which there is no associated source position.
   const Function& function = owner()->function();
-  if (FLAG_support_debugger &&
-      node->token_pos().IsDebugPause() &&
+  if (FLAG_support_debugger && node->token_pos().IsDebugPause() &&
       !function.is_native()) {
-    AddInstruction(new(Z) DebugStepCheckInstr(node->token_pos(),
-                                              RawPcDescriptors::kRuntimeCall));
+    AddInstruction(new (Z) DebugStepCheckInstr(node->token_pos(),
+                                               RawPcDescriptors::kRuntimeCall));
   }
 
   NestedContextAdjustment context_adjustment(owner(), owner()->context_level());
@@ -1163,8 +1131,8 @@
   if (Isolate::Current()->type_checks()) {
     const bool is_implicit_dynamic_getter =
         (!function.is_static() &&
-        ((function.kind() == RawFunction::kImplicitGetter) ||
-         (function.kind() == RawFunction::kImplicitStaticFinalGetter)));
+         ((function.kind() == RawFunction::kImplicitGetter) ||
+          (function.kind() == RawFunction::kImplicitStaticFinalGetter)));
     // Implicit getters do not need a type check at return, unless they compute
     // the initial value of a static field.
     // The body of a constructor cannot modify the type of the
@@ -1173,10 +1141,9 @@
     if (!is_implicit_dynamic_getter && !function.IsGenerativeConstructor()) {
       const AbstractType& dst_type =
           AbstractType::ZoneHandle(Z, function.result_type());
-      return_value = BuildAssignableValue(node->value()->token_pos(),
-                                          return_value,
-                                          dst_type,
-                                          Symbols::FunctionResult());
+      return_value =
+          BuildAssignableValue(node->value()->token_pos(), return_value,
+                               dst_type, Symbols::FunctionResult());
     }
   }
 
@@ -1198,19 +1165,14 @@
         node->scope()->LookupVariable(Symbols::AsyncCompleter(), false);
     ASSERT(rcv_var != NULL && rcv_var->is_captured());
     ZoneGrowableArray<PushArgumentInstr*>* arguments =
-        new(Z) ZoneGrowableArray<PushArgumentInstr*>(2);
+        new (Z) ZoneGrowableArray<PushArgumentInstr*>(2);
     Value* rcv_value = Bind(BuildLoadLocal(*rcv_var, node->token_pos()));
     arguments->Add(PushArgument(rcv_value));
     Value* returned_value = Bind(BuildLoadExprTemp(node->token_pos()));
     arguments->Add(PushArgument(returned_value));
-    InstanceCallInstr* call = new(Z) InstanceCallInstr(
-        node->token_pos(),
-        Symbols::CompleterComplete(),
-        Token::kILLEGAL,
-        arguments,
-        Object::null_array(),
-        1,
-        owner()->ic_data_array());
+    InstanceCallInstr* call = new (Z) InstanceCallInstr(
+        node->token_pos(), Symbols::CompleterComplete(), Token::kILLEGAL,
+        arguments, Object::null_array(), 1, owner()->ic_data_array());
     Do(call);
 
     // Rebind the return value for the actual return call to be null.
@@ -1225,12 +1187,11 @@
 
   AddReturnExit(node->token_pos(), return_value);
 
-  if ((function.IsAsyncClosure() ||
-      function.IsSyncGenClosure() ||
-      function.IsAsyncGenClosure()) &&
+  if ((function.IsAsyncClosure() || function.IsSyncGenClosure() ||
+       function.IsAsyncGenClosure()) &&
       (node->return_type() == ReturnNode::kContinuationTarget)) {
-    JoinEntryInstr* const join = new(Z) JoinEntryInstr(
-        owner()->AllocateBlockId(), owner()->try_index());
+    JoinEntryInstr* const join = new (Z)
+        JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
     owner()->await_joins()->Add(join);
     exit_ = join;
   }
@@ -1239,7 +1200,7 @@
 
 // <Expression> ::= Literal { literal: Instance }
 void EffectGraphVisitor::VisitLiteralNode(LiteralNode* node) {
-  ReturnDefinition(new(Z) ConstantInstr(node->literal(), node->token_pos()));
+  ReturnDefinition(new (Z) ConstantInstr(node->literal(), node->token_pos()));
 }
 
 
@@ -1256,13 +1217,13 @@
   // Type may be malbounded, but not malformed.
   ASSERT(type.IsFinalized() && !type.IsMalformed());
   if (type.IsInstantiated()) {
-    ReturnDefinition(new(Z) ConstantInstr(type));
+    ReturnDefinition(new (Z) ConstantInstr(type));
   } else {
-    const Class& instantiator_class = Class::ZoneHandle(
-        Z, owner()->function().Owner());
+    const Class& instantiator_class =
+        Class::ZoneHandle(Z, owner()->function().Owner());
     Value* instantiator_value = BuildInstantiatorTypeArguments(
         node->token_pos(), instantiator_class, NULL);
-    ReturnDefinition(new(Z) InstantiateTypeInstr(
+    ReturnDefinition(new (Z) InstantiateTypeInstr(
         node->token_pos(), type, instantiator_class, instantiator_value));
   }
 }
@@ -1303,12 +1264,8 @@
 
   const bool eliminated = value->Type()->IsAssignableTo(dst_type);
   if (FLAG_trace_type_check_elimination) {
-    FlowGraphPrinter::PrintTypeCheck(owner()->parsed_function(),
-                                     token_pos,
-                                     value,
-                                     dst_type,
-                                     dst_name,
-                                     eliminated);
+    FlowGraphPrinter::PrintTypeCheck(owner()->parsed_function(), token_pos,
+                                     value, dst_type, dst_name, eliminated);
   }
   return eliminated;
 }
@@ -1321,15 +1278,12 @@
   ValueGraphVisitor for_value(owner());
   node->expr()->Visit(&for_value);
   Append(for_value);
-  if (CanSkipTypeCheck(node->expr()->token_pos(),
-                       for_value.value(),
-                       node->type(),
-                       node->dst_name())) {
+  if (CanSkipTypeCheck(node->expr()->token_pos(), for_value.value(),
+                       node->type(), node->dst_name())) {
     ReturnValue(for_value.value());
   } else {
     ReturnDefinition(BuildAssertAssignable(node->expr()->token_pos(),
-                                           for_value.value(),
-                                           node->type(),
+                                           for_value.value(), node->type(),
                                            node->dst_name()));
   }
 }
@@ -1339,10 +1293,8 @@
   ValueGraphVisitor for_value(owner());
   node->expr()->Visit(&for_value);
   Append(for_value);
-  ReturnValue(BuildAssignableValue(node->expr()->token_pos(),
-                                   for_value.value(),
-                                   node->type(),
-                                   node->dst_name()));
+  ReturnValue(BuildAssignableValue(node->expr()->token_pos(), for_value.value(),
+                                   node->type(), node->dst_name()));
 }
 
 
@@ -1362,8 +1314,8 @@
       ValueGraphVisitor for_right(owner());
       node->right()->Visit(&for_right);
       Value* right_value = for_right.value();
-      for_right.Do(new(Z) AssertBooleanInstr(node->right()->token_pos(),
-                                             right_value));
+      for_right.Do(
+          new (Z) AssertBooleanInstr(node->right()->token_pos(), right_value));
       if (node->kind() == Token::kAND) {
         Join(for_left, for_right, empty);
       } else {
@@ -1392,18 +1344,14 @@
   PushArgumentInstr* push_right = PushArgument(for_right_value.value());
 
   ZoneGrowableArray<PushArgumentInstr*>* arguments =
-      new(Z) ZoneGrowableArray<PushArgumentInstr*>(2);
+      new (Z) ZoneGrowableArray<PushArgumentInstr*>(2);
   arguments->Add(push_left);
   arguments->Add(push_right);
   const String& name = Symbols::Token(node->kind());
   const intptr_t kNumArgsChecked = 2;
-  InstanceCallInstr* call = new(Z) InstanceCallInstr(node->token_pos(),
-                                                     name,
-                                                     node->kind(),
-                                                     arguments,
-                                                     Object::null_array(),
-                                                     kNumArgsChecked,
-                                                     owner()->ic_data_array());
+  InstanceCallInstr* call = new (Z) InstanceCallInstr(
+      node->token_pos(), name, node->kind(), arguments, Object::null_array(),
+      kNumArgsChecked, owner()->ic_data_array());
   ReturnDefinition(call);
 }
 
@@ -1426,29 +1374,25 @@
     Value* right_value = for_right.value();
     Isolate* isolate = Isolate::Current();
     if (isolate->type_checks() || isolate->asserts()) {
-      right_value =
-          for_right.Bind(new(Z) AssertBooleanInstr(node->right()->token_pos(),
-                                                   right_value));
+      right_value = for_right.Bind(
+          new (Z) AssertBooleanInstr(node->right()->token_pos(), right_value));
     }
-    Value* constant_true = for_right.Bind(new(Z) ConstantInstr(Bool::True()));
-    Value* compare =
-        for_right.Bind(new(Z) StrictCompareInstr(node->token_pos(),
-                                                 Token::kEQ_STRICT,
-                                                 right_value,
-                                                 constant_true,
-                                                 false));  // No number check.
+    Value* constant_true = for_right.Bind(new (Z) ConstantInstr(Bool::True()));
+    Value* compare = for_right.Bind(new (Z) StrictCompareInstr(
+        node->token_pos(), Token::kEQ_STRICT, right_value, constant_true,
+        false));  // No number check.
     for_right.Do(BuildStoreExprTemp(compare, node->token_pos()));
 
     if (node->kind() == Token::kAND) {
       ValueGraphVisitor for_false(owner());
       Value* constant_false =
-          for_false.Bind(new(Z) ConstantInstr(Bool::False()));
+          for_false.Bind(new (Z) ConstantInstr(Bool::False()));
       for_false.Do(BuildStoreExprTemp(constant_false, node->token_pos()));
       Join(for_test, for_right, for_false);
     } else {
       ASSERT(node->kind() == Token::kOR);
       ValueGraphVisitor for_true(owner());
-      Value* constant_true = for_true.Bind(new(Z) ConstantInstr(Bool::True()));
+      Value* constant_true = for_true.Bind(new (Z) ConstantInstr(Bool::True()));
       for_true.Do(BuildStoreExprTemp(constant_true, node->token_pos()));
       Join(for_test, for_true, for_right);
     }
@@ -1463,8 +1407,8 @@
 void EffectGraphVisitor::BuildTypecheckPushArguments(
     TokenPosition token_pos,
     PushArgumentInstr** push_instantiator_type_arguments_result) {
-  const Class& instantiator_class = Class::Handle(
-      Z, owner()->function().Owner());
+  const Class& instantiator_class =
+      Class::Handle(Z, owner()->function().Owner());
   // Since called only when type tested against is not instantiated.
   ASSERT(instantiator_class.IsGeneric());
   Value* instantiator_type_arguments = NULL;
@@ -1482,14 +1426,13 @@
 }
 
 
-
 void EffectGraphVisitor::BuildTypecheckArguments(
     TokenPosition token_pos,
     Value** instantiator_type_arguments_result) {
   Value* instantiator = NULL;
   Value* instantiator_type_arguments = NULL;
-  const Class& instantiator_class = Class::Handle(
-      Z, owner()->function().Owner());
+  const Class& instantiator_class =
+      Class::Handle(Z, owner()->function().Owner());
   // Since called only when type tested against is not instantiated.
   ASSERT(instantiator_class.IsGeneric());
   instantiator = BuildInstantiator(token_pos);
@@ -1506,8 +1449,8 @@
 
 
 Value* EffectGraphVisitor::BuildNullValue(TokenPosition token_pos) {
-  return Bind(new(Z) ConstantInstr(Object::ZoneHandle(Z, Object::null()),
-                                   token_pos));
+  return Bind(
+      new (Z) ConstantInstr(Object::ZoneHandle(Z, Object::null()), token_pos));
 }
 
 
@@ -1526,12 +1469,9 @@
   }
 
   const intptr_t deopt_id = Thread::Current()->GetNextDeoptId();
-  return new(Z) AssertAssignableInstr(token_pos,
-                                      value,
-                                      instantiator_type_arguments,
-                                      dst_type,
-                                      dst_name,
-                                      deopt_id);
+  return new (Z)
+      AssertAssignableInstr(token_pos, value, instantiator_type_arguments,
+                            dst_type, dst_name, deopt_id);
 }
 
 
@@ -1577,7 +1517,7 @@
     EffectGraphVisitor for_left_value(owner());
     node->left()->Visit(&for_left_value);
     Append(for_left_value);
-    ReturnDefinition(new(Z) ConstantInstr(Bool::Get(!negate_result)));
+    ReturnDefinition(new (Z) ConstantInstr(Bool::Get(!negate_result)));
     return;
   }
   ValueGraphVisitor for_left_value(owner());
@@ -1601,20 +1541,17 @@
     ASSERT(!method_name.IsNull());
     PushArgumentInstr* push_left = PushArgument(for_left_value.value());
     ZoneGrowableArray<PushArgumentInstr*>* arguments =
-        new(Z) ZoneGrowableArray<PushArgumentInstr*>(2);
+        new (Z) ZoneGrowableArray<PushArgumentInstr*>(2);
     arguments->Add(push_left);
     const Bool& negate = Bool::Get(node->kind() == Token::kISNOT);
-    Value* negate_arg = Bind(new(Z) ConstantInstr(negate));
+    Value* negate_arg = Bind(new (Z) ConstantInstr(negate));
     arguments->Add(PushArgument(negate_arg));
     const intptr_t kNumArgsChecked = 1;
-    InstanceCallInstr* call = new(Z) InstanceCallInstr(
-        node->token_pos(),
-        Library::PrivateCoreLibName(method_name),
-        node->kind(),
-        arguments,
+    InstanceCallInstr* call = new (Z) InstanceCallInstr(
+        node->token_pos(), Library::PrivateCoreLibName(method_name),
+        node->kind(), arguments,
         Object::null_array(),  // No argument names.
-        kNumArgsChecked,
-        owner()->ic_data_array());
+        kNumArgsChecked, owner()->ic_data_array());
     ReturnDefinition(call);
     return;
   }
@@ -1625,21 +1562,19 @@
   if (simpleInstanceOfType(type)) {
     ASSERT(!node->right()->AsTypeNode()->type().IsNull());
     ZoneGrowableArray<PushArgumentInstr*>* arguments =
-        new(Z) ZoneGrowableArray<PushArgumentInstr*>(2);
+        new (Z) ZoneGrowableArray<PushArgumentInstr*>(2);
     arguments->Add(push_left);
-    Value* type_const = Bind(new(Z) ConstantInstr(type));
+    Value* type_const = Bind(new (Z) ConstantInstr(type));
     arguments->Add(PushArgument(type_const));
     const intptr_t kNumArgsChecked = 2;
-    Definition* result = new(Z) InstanceCallInstr(
+    Definition* result = new (Z) InstanceCallInstr(
         node->token_pos(),
-        Library::PrivateCoreLibName(Symbols::_simpleInstanceOf()),
-        node->kind(),
+        Library::PrivateCoreLibName(Symbols::_simpleInstanceOf()), node->kind(),
         arguments,
         Object::null_array(),  // No argument names.
-        kNumArgsChecked,
-        owner()->ic_data_array());
+        kNumArgsChecked, owner()->ic_data_array());
     if (negate_result) {
-      result = new(Z) BooleanNegateInstr(Bind(result));
+      result = new (Z) BooleanNegateInstr(Bind(result));
     }
     ReturnDefinition(result);
     return;
@@ -1652,24 +1587,21 @@
     BuildTypecheckPushArguments(node->token_pos(), &push_type_args);
   }
   ZoneGrowableArray<PushArgumentInstr*>* arguments =
-      new(Z) ZoneGrowableArray<PushArgumentInstr*>(4);
+      new (Z) ZoneGrowableArray<PushArgumentInstr*>(4);
   arguments->Add(push_left);
   arguments->Add(push_type_args);
   ASSERT(!node->right()->AsTypeNode()->type().IsNull());
-  Value* type_const = Bind(new(Z) ConstantInstr(type));
+  Value* type_const = Bind(new (Z) ConstantInstr(type));
   arguments->Add(PushArgument(type_const));
   const Bool& negate = Bool::Get(node->kind() == Token::kISNOT);
-  Value* negate_arg = Bind(new(Z) ConstantInstr(negate));
+  Value* negate_arg = Bind(new (Z) ConstantInstr(negate));
   arguments->Add(PushArgument(negate_arg));
   const intptr_t kNumArgsChecked = 1;
-  InstanceCallInstr* call = new(Z) InstanceCallInstr(
-      node->token_pos(),
-      Library::PrivateCoreLibName(Symbols::_instanceOf()),
-      node->kind(),
-      arguments,
+  InstanceCallInstr* call = new (Z) InstanceCallInstr(
+      node->token_pos(), Library::PrivateCoreLibName(Symbols::_instanceOf()),
+      node->kind(), arguments,
       Object::null_array(),  // No argument names.
-      kNumArgsChecked,
-      owner()->ic_data_array());
+      kNumArgsChecked, owner()->ic_data_array());
   ReturnDefinition(call);
 }
 
@@ -1682,9 +1614,7 @@
   ValueGraphVisitor for_value(owner());
   node->left()->Visit(&for_value);
   Append(for_value);
-  if (CanSkipTypeCheck(node->token_pos(),
-                       for_value.value(),
-                       type,
+  if (CanSkipTypeCheck(node->token_pos(), for_value.value(), type,
                        Symbols::InTypeCast())) {
     ReturnValue(for_value.value());
     return;
@@ -1697,20 +1627,17 @@
     BuildTypecheckPushArguments(node->token_pos(), &push_type_args);
   }
   ZoneGrowableArray<PushArgumentInstr*>* arguments =
-      new(Z) ZoneGrowableArray<PushArgumentInstr*>(3);
+      new (Z) ZoneGrowableArray<PushArgumentInstr*>(3);
   arguments->Add(push_left);
   arguments->Add(push_type_args);
-  Value* type_arg = Bind(new(Z) ConstantInstr(type));
+  Value* type_arg = Bind(new (Z) ConstantInstr(type));
   arguments->Add(PushArgument(type_arg));
   const intptr_t kNumArgsChecked = 1;
-  InstanceCallInstr* call = new(Z) InstanceCallInstr(
-      node->token_pos(),
-      Library::PrivateCoreLibName(Symbols::_as()),
-      node->kind(),
-      arguments,
+  InstanceCallInstr* call = new (Z) InstanceCallInstr(
+      node->token_pos(), Library::PrivateCoreLibName(Symbols::_as()),
+      node->kind(), arguments,
       Object::null_array(),  // No argument names.
-      kNumArgsChecked,
-      owner()->ic_data_array());
+      kNumArgsChecked, owner()->ic_data_array());
   ReturnDefinition(call);
 }
 
@@ -1726,11 +1653,9 @@
   ValueGraphVisitor for_right_value(owner());
   right->Visit(&for_right_value);
   Append(for_right_value);
-  StrictCompareInstr* comp = new(Z) StrictCompareInstr(token_pos,
-                                                       kind,
-                                                       for_left_value.value(),
-                                                       for_right_value.value(),
-                                                       true);  // Number check.
+  StrictCompareInstr* comp = new (Z) StrictCompareInstr(
+      token_pos, kind, for_left_value.value(), for_right_value.value(),
+      true);  // Number check.
   return comp;
 }
 
@@ -1763,15 +1688,14 @@
         ((right_lit != NULL) && right_lit->literal().IsNull())) {
       Token::Kind kind =
           (node->kind() == Token::kEQ) ? Token::kEQ_STRICT : Token::kNE_STRICT;
-      StrictCompareInstr* compare =
-          BuildStrictCompare(node->left(), node->right(),
-                             kind, node->token_pos());
+      StrictCompareInstr* compare = BuildStrictCompare(
+          node->left(), node->right(), kind, node->token_pos());
       ReturnDefinition(compare);
       return;
     }
 
     ZoneGrowableArray<PushArgumentInstr*>* arguments =
-        new(Z) ZoneGrowableArray<PushArgumentInstr*>(2);
+        new (Z) ZoneGrowableArray<PushArgumentInstr*>(2);
 
     ValueGraphVisitor for_left_value(owner());
     node->left()->Visit(&for_left_value);
@@ -1786,29 +1710,26 @@
     arguments->Add(push_right);
 
     const intptr_t kNumArgsChecked = 2;
-    Definition* result = new(Z) InstanceCallInstr(
-        node->token_pos(),
-        Symbols::EqualOperator(),
-        Token::kEQ,  // Result is negated later for kNE.
-        arguments,
-        Object::null_array(),
-        kNumArgsChecked,
-        owner()->ic_data_array());
+    Definition* result = new (Z)
+        InstanceCallInstr(node->token_pos(), Symbols::EqualOperator(),
+                          Token::kEQ,  // Result is negated later for kNE.
+                          arguments, Object::null_array(), kNumArgsChecked,
+                          owner()->ic_data_array());
     if (node->kind() == Token::kNE) {
       Isolate* isolate = Isolate::Current();
       if (isolate->type_checks() || isolate->asserts()) {
         Value* value = Bind(result);
-        result = new(Z) AssertBooleanInstr(node->token_pos(), value);
+        result = new (Z) AssertBooleanInstr(node->token_pos(), value);
       }
       Value* value = Bind(result);
-      result = new(Z) BooleanNegateInstr(value);
+      result = new (Z) BooleanNegateInstr(value);
     }
     ReturnDefinition(result);
     return;
   }
 
   ZoneGrowableArray<PushArgumentInstr*>* arguments =
-      new(Z) ZoneGrowableArray<PushArgumentInstr*>(2);
+      new (Z) ZoneGrowableArray<PushArgumentInstr*>(2);
 
   ValueGraphVisitor for_left_value(owner());
   node->left()->Visit(&for_left_value);
@@ -1823,14 +1744,9 @@
   arguments->Add(push_right);
 
   ASSERT(Token::IsRelationalOperator(node->kind()));
-  InstanceCallInstr* comp = new(Z) InstanceCallInstr(
-      node->token_pos(),
-      Symbols::Token(node->kind()),
-      node->kind(),
-      arguments,
-      Object::null_array(),
-      2,
-      owner()->ic_data_array());
+  InstanceCallInstr* comp = new (Z) InstanceCallInstr(
+      node->token_pos(), Symbols::Token(node->kind()), node->kind(), arguments,
+      Object::null_array(), 2, owner()->ic_data_array());
   ReturnDefinition(comp);
 }
 
@@ -1845,9 +1761,9 @@
     Isolate* isolate = Isolate::Current();
     if (isolate->type_checks() || isolate->asserts()) {
       value =
-          Bind(new(Z) AssertBooleanInstr(node->operand()->token_pos(), value));
+          Bind(new (Z) AssertBooleanInstr(node->operand()->token_pos(), value));
     }
-    BooleanNegateInstr* negate = new(Z) BooleanNegateInstr(value);
+    BooleanNegateInstr* negate = new (Z) BooleanNegateInstr(value);
     ReturnDefinition(negate);
     return;
   }
@@ -1857,16 +1773,11 @@
   Append(for_value);
   PushArgumentInstr* push_value = PushArgument(for_value.value());
   ZoneGrowableArray<PushArgumentInstr*>* arguments =
-      new(Z) ZoneGrowableArray<PushArgumentInstr*>(1);
+      new (Z) ZoneGrowableArray<PushArgumentInstr*>(1);
   arguments->Add(push_value);
-  InstanceCallInstr* call = new(Z) InstanceCallInstr(
-      node->token_pos(),
-      Symbols::Token(node->kind()),
-      node->kind(),
-      arguments,
-      Object::null_array(),
-      1,
-      owner()->ic_data_array());
+  InstanceCallInstr* call = new (Z) InstanceCallInstr(
+      node->token_pos(), Symbols::Token(node->kind()), node->kind(), arguments,
+      Object::null_array(), 1, owner()->ic_data_array());
   ReturnDefinition(call);
 }
 
@@ -1892,14 +1803,14 @@
   ValueGraphVisitor for_true(owner());
   node->true_expr()->Visit(&for_true);
   ASSERT(for_true.is_open());
-  for_true.Do(BuildStoreExprTemp(for_true.value(),
-                                 node->true_expr()->token_pos()));
+  for_true.Do(
+      BuildStoreExprTemp(for_true.value(), node->true_expr()->token_pos()));
 
   ValueGraphVisitor for_false(owner());
   node->false_expr()->Visit(&for_false);
   ASSERT(for_false.is_open());
-  for_false.Do(BuildStoreExprTemp(for_false.value(),
-                                  node->false_expr()->token_pos()));
+  for_false.Do(
+      BuildStoreExprTemp(for_false.value(), node->false_expr()->token_pos()));
 
   Join(for_test, for_true, for_false);
   ReturnDefinition(BuildLoadExprTemp(node->token_pos()));
@@ -1964,8 +1875,8 @@
   // Compute the start of the statements fragment.
   JoinEntryInstr* statement_start = NULL;
   if (node->label() == NULL) {
-    statement_start = new(Z) JoinEntryInstr(owner()->AllocateBlockId(),
-                                            owner()->try_index());
+    statement_start = new (Z)
+        JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
   } else {
     // The case nodes are nested inside a SequenceNode that is the body of a
     // SwitchNode.  The SwitchNode on the nesting stack contains the
@@ -2016,8 +1927,8 @@
       exit_instruction = statement_exit;
     } else {
       if (statement_exit != NULL) {
-        JoinEntryInstr* join = new(Z) JoinEntryInstr(owner()->AllocateBlockId(),
-                                                     owner()->try_index());
+        JoinEntryInstr* join = new (Z)
+            JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
         statement_exit->Goto(join);
         next_target->Goto(join);
         exit_instruction = join;
@@ -2100,19 +2011,18 @@
 
   // Tie do-while loop (test is after the body).
   JoinEntryInstr* body_entry_join =
-      new(Z) JoinEntryInstr(owner()->AllocateBlockId(),
-                            owner()->try_index());
+      new (Z) JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
   Goto(body_entry_join);
   Instruction* body_exit = AppendFragment(body_entry_join, for_body);
 
   JoinEntryInstr* join = nested_loop.continue_target();
   if ((body_exit != NULL) || (join != NULL)) {
     if (join == NULL) {
-      join = new(Z) JoinEntryInstr(owner()->AllocateBlockId(),
-                                   owner()->try_index());
+      join = new (Z)
+          JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
     }
-    CheckStackOverflowInstr* check = new(Z) CheckStackOverflowInstr(
-        node->token_pos(), owner()->loop_depth());
+    CheckStackOverflowInstr* check = new (Z)
+        CheckStackOverflowInstr(node->token_pos(), owner()->loop_depth());
     join->LinkTo(check);
     check->LinkTo(for_test.entry());
     if (body_exit != NULL) {
@@ -2160,8 +2070,8 @@
   // Join the loop body and increment and then tie the loop.
   JoinEntryInstr* continue_join = nested_loop.continue_target();
   if ((continue_join != NULL) || for_body.is_open()) {
-    JoinEntryInstr* loop_entry =
-        new(Z) JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
+    JoinEntryInstr* loop_entry = new (Z)
+        JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
     if (continue_join != NULL) {
       if (for_body.is_open()) for_body.Goto(continue_join);
       Instruction* current = AppendFragment(continue_join, for_increment);
@@ -2177,9 +2087,8 @@
     // check must match the position of the increment expression, so that
     // the context level (if any) matches the that of the increment
     // expression.
-    AddInstruction(
-        new(Z) CheckStackOverflowInstr(node->increment()->token_pos(),
-                                       owner()->loop_depth()));
+    AddInstruction(new (Z) CheckStackOverflowInstr(
+        node->increment()->token_pos(), owner()->loop_depth()));
   }
 
   if (node->condition() == NULL) {
@@ -2230,8 +2139,8 @@
   NestedStatement* current = owner()->nesting_stack();
   while (current != NULL) {
     jump_target = (node->kind() == Token::kBREAK)
-        ? current->BreakTargetFor(node->label())
-        : current->ContinueTargetFor(node->label());
+                      ? current->BreakTargetFor(node->label())
+                      : current->ContinueTargetFor(node->label());
     if (jump_target != NULL) break;
     current = current->outer();
   }
@@ -2258,10 +2167,10 @@
   ASSERT(node->token_pos().IsSynthetic() || node->token_pos().IsNoSource());
   ASSERT(node->async_scope() != NULL);
   ASSERT(node->await_scope() != NULL);
-  LocalVariable* jump_var = node->async_scope()->LookupVariable(
-      Symbols::AwaitJumpVar(), false);
-  LocalVariable* ctx_var = node->async_scope()->LookupVariable(
-      Symbols::AwaitContextVar(), false);
+  LocalVariable* jump_var =
+      node->async_scope()->LookupVariable(Symbols::AwaitJumpVar(), false);
+  LocalVariable* ctx_var =
+      node->async_scope()->LookupVariable(Symbols::AwaitContextVar(), false);
   ASSERT((jump_var != NULL) && jump_var->is_captured());
   ASSERT((ctx_var != NULL) && ctx_var->is_captured());
   const intptr_t jump_count = owner()->next_await_counter();
@@ -2270,7 +2179,7 @@
   // state.
   ASSERT(jump_count == owner()->await_joins()->length());
   // Store the counter in :await_jump_var.
-  Value* jump_val = Bind(new(Z) ConstantInstr(
+  Value* jump_val = Bind(new (Z) ConstantInstr(
       Smi::ZoneHandle(Z, Smi::New(jump_count)), node->token_pos()));
   Do(BuildStoreLocal(*jump_var, jump_val, node->token_pos()));
   // Save the current context for resuming.
@@ -2279,11 +2188,9 @@
 
 
 intptr_t EffectGraphVisitor::GetCurrentTempLocalIndex() const {
-  return kFirstLocalSlotFromFp
-      - owner()->num_stack_locals()
-      - owner()->num_copied_params()
-      - owner()->args_pushed()
-      - owner()->temp_count() + 1;
+  return kFirstLocalSlotFromFp - owner()->num_stack_locals() -
+         owner()->num_copied_params() - owner()->args_pushed() -
+         owner()->temp_count() + 1;
 }
 
 
@@ -2292,18 +2199,17 @@
   intptr_t index = GetCurrentTempLocalIndex();
   char name[64];
   OS::SNPrint(name, 64, ":tmp_local%" Pd, index);
-  LocalVariable*  var =
-      new(Z) LocalVariable(TokenPosition::kNoSource,
-                           TokenPosition::kNoSource,
-                           String::ZoneHandle(Z, Symbols::New(T, name)),
-                           *value->Type()->ToAbstractType());
+  LocalVariable* var =
+      new (Z) LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
+                            String::ZoneHandle(Z, Symbols::New(T, name)),
+                            *value->Type()->ToAbstractType());
   var->set_index(index);
   return var;
 }
 
 
 Definition* EffectGraphVisitor::ExitTempLocalScope(Value* value) {
-  return new(Z) DropTempsInstr(0, value);
+  return new (Z) DropTempsInstr(0, value);
 }
 
 
@@ -2333,7 +2239,7 @@
   intptr_t num_temps = node->num_temps();
   if (num_temps > 0) {
     owner()->DeallocateTemps(num_temps);
-    Do(new(Z) DropTempsInstr(num_temps, NULL));
+    Do(new (Z) DropTempsInstr(num_temps, NULL));
   }
 }
 
@@ -2356,7 +2262,7 @@
   intptr_t num_temps = node->num_temps();
   if (num_temps > 0) {
     owner()->DeallocateTemps(num_temps);
-    ReturnDefinition(new(Z) DropTempsInstr(num_temps, result_value));
+    ReturnDefinition(new (Z) DropTempsInstr(num_temps, result_value));
   } else {
     ReturnValue(result_value);
   }
@@ -2366,35 +2272,33 @@
 void EffectGraphVisitor::VisitArrayNode(ArrayNode* node) {
   const TypeArguments& type_args =
       TypeArguments::ZoneHandle(Z, node->type().arguments());
-  Value* element_type = BuildInstantiatedTypeArguments(node->token_pos(),
-                                                       type_args);
+  Value* element_type =
+      BuildInstantiatedTypeArguments(node->token_pos(), type_args);
   Value* num_elements =
-      Bind(new(Z) ConstantInstr(Smi::ZoneHandle(Z, Smi::New(node->length()))));
-  CreateArrayInstr* create = new(Z) CreateArrayInstr(node->token_pos(),
-                                                     element_type,
-                                                     num_elements);
+      Bind(new (Z) ConstantInstr(Smi::ZoneHandle(Z, Smi::New(node->length()))));
+  CreateArrayInstr* create =
+      new (Z) CreateArrayInstr(node->token_pos(), element_type, num_elements);
   Value* array_val = Bind(create);
 
-  { LocalVariable* tmp_var = EnterTempLocalScope(array_val);
+  {
+    LocalVariable* tmp_var = EnterTempLocalScope(array_val);
     const intptr_t class_id = kArrayCid;
     const intptr_t deopt_id = Thread::kNoDeoptId;
     for (int i = 0; i < node->length(); ++i) {
-      Value* array = Bind(new(Z) LoadLocalInstr(*tmp_var, node->token_pos()));
-      Value* index =
-          Bind(new(Z) ConstantInstr(Smi::ZoneHandle(Z, Smi::New(i)),
-                                    node->token_pos()));
+      Value* array = Bind(new (Z) LoadLocalInstr(*tmp_var, node->token_pos()));
+      Value* index = Bind(new (Z) ConstantInstr(Smi::ZoneHandle(Z, Smi::New(i)),
+                                                node->token_pos()));
       ValueGraphVisitor for_value(owner());
       node->ElementAt(i)->Visit(&for_value);
       Append(for_value);
       // No store barrier needed for constants.
       const StoreBarrierType emit_store_barrier =
-          for_value.value()->BindsToConstant()
-              ? kNoStoreBarrier
-              : kEmitStoreBarrier;
+          for_value.value()->BindsToConstant() ? kNoStoreBarrier
+                                               : kEmitStoreBarrier;
       const intptr_t index_scale = Instance::ElementSizeFor(class_id);
-      StoreIndexedInstr* store = new(Z) StoreIndexedInstr(
-          array, index, for_value.value(), emit_store_barrier,
-          index_scale, class_id, kAlignedAccess, deopt_id, node->token_pos());
+      StoreIndexedInstr* store = new (Z) StoreIndexedInstr(
+          array, index, for_value.value(), emit_store_barrier, index_scale,
+          class_id, kAlignedAccess, deopt_id, node->token_pos());
       Do(store);
     }
     ReturnDefinition(ExitTempLocalScope(array_val));
@@ -2408,7 +2312,7 @@
   ArrayNode* arguments = node->value();
   if (arguments->length() == 1) {
     ZoneGrowableArray<PushArgumentInstr*>* values =
-        new(Z) ZoneGrowableArray<PushArgumentInstr*>(1);
+        new (Z) ZoneGrowableArray<PushArgumentInstr*>(1);
     arguments->ElementAt(0)->Visit(&for_argument);
     Append(for_argument);
     PushArgumentInstr* push_arg = PushArgument(for_argument.value());
@@ -2419,25 +2323,19 @@
         Class::Handle(Library::LookupCoreClass(Symbols::StringBase()));
     ASSERT(!cls.IsNull());
     const Function& function = Function::ZoneHandle(
-        Z,
-        Resolver::ResolveStatic(
-            cls,
-            Library::PrivateCoreLibName(Symbols::InterpolateSingle()),
-            kNumberOfArguments,
-            kNoArgumentNames));
+        Z, Resolver::ResolveStatic(
+               cls, Library::PrivateCoreLibName(Symbols::InterpolateSingle()),
+               kNumberOfArguments, kNoArgumentNames));
     StaticCallInstr* call =
-        new(Z) StaticCallInstr(node->token_pos(),
-                               function,
-                               kNoArgumentNames,
-                               values,
-                               owner()->ic_data_array());
+        new (Z) StaticCallInstr(node->token_pos(), function, kNoArgumentNames,
+                                values, owner()->ic_data_array());
     ReturnDefinition(call);
     return;
   }
   arguments->Visit(&for_argument);
   Append(for_argument);
   StringInterpolateInstr* instr =
-      new(Z) StringInterpolateInstr(for_argument.value(), node->token_pos());
+      new (Z) StringInterpolateInstr(for_argument.value(), node->token_pos());
   ReturnDefinition(instr);
 }
 
@@ -2447,7 +2345,7 @@
   if (function.IsImplicitStaticClosureFunction()) {
     const Instance& closure =
         Instance::ZoneHandle(Z, function.ImplicitStaticClosure());
-    ReturnDefinition(new(Z) ConstantInstr(closure));
+    ReturnDefinition(new (Z) ConstantInstr(closure));
     return;
   }
 
@@ -2471,8 +2369,8 @@
     // same closure, do not add a second one. We compare token position,
     // and parent function to detect duplicates.
     const Function& parent = Function::Handle(function.parent_function());
-    const Function& found_func = Function::Handle(Z,
-        isolate()->LookupClosureFunction(parent, function.token_pos()));
+    const Function& found_func = Function::Handle(
+        Z, isolate()->LookupClosureFunction(parent, function.token_pos()));
     if (found_func.IsNull()) {
       isolate()->AddClosureFunction(function);
     }
@@ -2484,84 +2382,73 @@
   const Class& closure_class =
       Class::ZoneHandle(Z, isolate()->object_store()->closure_class());
   ZoneGrowableArray<PushArgumentInstr*>* no_arguments =
-      new(Z) ZoneGrowableArray<PushArgumentInstr*>(0);
-  AllocateObjectInstr* alloc = new(Z) AllocateObjectInstr(node->token_pos(),
-                                                          closure_class,
-                                                          no_arguments);
+      new (Z) ZoneGrowableArray<PushArgumentInstr*>(0);
+  AllocateObjectInstr* alloc = new (Z)
+      AllocateObjectInstr(node->token_pos(), closure_class, no_arguments);
   alloc->set_closure_function(function);
 
   Value* closure_val = Bind(alloc);
-  { LocalVariable* closure_tmp_var = EnterTempLocalScope(closure_val);
+  {
+    LocalVariable* closure_tmp_var = EnterTempLocalScope(closure_val);
     // Store type arguments if scope class is generic.
     const Type& function_type = Type::ZoneHandle(Z, function.SignatureType());
     const Class& scope_cls = Class::ZoneHandle(Z, function_type.type_class());
     if (scope_cls.IsGeneric()) {
       ASSERT(function.Owner() == scope_cls.raw());
-      Value* closure_tmp_val = Bind(new(Z) LoadLocalInstr(*closure_tmp_var,
-                                                          node->token_pos()));
-      const Class& instantiator_class = Class::Handle(
-          Z, owner()->function().Owner());
-      Value* type_arguments = BuildInstantiatorTypeArguments(node->token_pos(),
-                                                             instantiator_class,
-                                                             NULL);
-      Do(new(Z) StoreInstanceFieldInstr(Closure::type_arguments_offset(),
-                                        closure_tmp_val,
-                                        type_arguments,
-                                        kEmitStoreBarrier,
-                                        node->token_pos()));
+      Value* closure_tmp_val =
+          Bind(new (Z) LoadLocalInstr(*closure_tmp_var, node->token_pos()));
+      const Class& instantiator_class =
+          Class::Handle(Z, owner()->function().Owner());
+      Value* type_arguments = BuildInstantiatorTypeArguments(
+          node->token_pos(), instantiator_class, NULL);
+      Do(new (Z) StoreInstanceFieldInstr(Closure::type_arguments_offset(),
+                                         closure_tmp_val, type_arguments,
+                                         kEmitStoreBarrier, node->token_pos()));
     }
 
     // Store function.
     Value* closure_tmp_val =
-        Bind(new(Z) LoadLocalInstr(*closure_tmp_var, node->token_pos()));
+        Bind(new (Z) LoadLocalInstr(*closure_tmp_var, node->token_pos()));
     Value* func_val =
-        Bind(new(Z) ConstantInstr(Function::ZoneHandle(Z, function.raw())));
-    Do(new(Z) StoreInstanceFieldInstr(Closure::function_offset(),
-                                      closure_tmp_val,
-                                      func_val,
-                                      kEmitStoreBarrier,
-                                      node->token_pos()));
+        Bind(new (Z) ConstantInstr(Function::ZoneHandle(Z, function.raw())));
+    Do(new (Z) StoreInstanceFieldInstr(Closure::function_offset(),
+                                       closure_tmp_val, func_val,
+                                       kEmitStoreBarrier, node->token_pos()));
     if (is_implicit) {
       // Create new context containing the receiver.
       const intptr_t kNumContextVariables = 1;  // The receiver.
-      Value* allocated_context =
-          Bind(new(Z) AllocateContextInstr(node->token_pos(),
-                                           kNumContextVariables));
-      { LocalVariable* context_tmp_var = EnterTempLocalScope(allocated_context);
+      Value* allocated_context = Bind(new (Z) AllocateContextInstr(
+          node->token_pos(), kNumContextVariables));
+      {
+        LocalVariable* context_tmp_var = EnterTempLocalScope(allocated_context);
         // Store receiver in context.
         Value* context_tmp_val =
-            Bind(new(Z) LoadLocalInstr(*context_tmp_var, node->token_pos()));
+            Bind(new (Z) LoadLocalInstr(*context_tmp_var, node->token_pos()));
         ValueGraphVisitor for_receiver(owner());
         node->receiver()->Visit(&for_receiver);
         Append(for_receiver);
         Value* receiver = for_receiver.value();
-        Do(new(Z) StoreInstanceFieldInstr(Context::variable_offset(0),
-                                          context_tmp_val,
-                                          receiver,
-                                          kEmitStoreBarrier,
-                                          node->token_pos()));
+        Do(new (Z) StoreInstanceFieldInstr(
+            Context::variable_offset(0), context_tmp_val, receiver,
+            kEmitStoreBarrier, node->token_pos()));
         // Store new context in closure.
         closure_tmp_val =
-            Bind(new(Z) LoadLocalInstr(*closure_tmp_var, node->token_pos()));
+            Bind(new (Z) LoadLocalInstr(*closure_tmp_var, node->token_pos()));
         context_tmp_val =
-            Bind(new(Z) LoadLocalInstr(*context_tmp_var, node->token_pos()));
-        Do(new(Z) StoreInstanceFieldInstr(Closure::context_offset(),
-                                          closure_tmp_val,
-                                          context_tmp_val,
-                                          kEmitStoreBarrier,
-                                          node->token_pos()));
+            Bind(new (Z) LoadLocalInstr(*context_tmp_var, node->token_pos()));
+        Do(new (Z) StoreInstanceFieldInstr(
+            Closure::context_offset(), closure_tmp_val, context_tmp_val,
+            kEmitStoreBarrier, node->token_pos()));
         Do(ExitTempLocalScope(allocated_context));
       }
     } else {
       // Store current context in closure.
-      closure_tmp_val = Bind(
-          new(Z) LoadLocalInstr(*closure_tmp_var, node->token_pos()));
+      closure_tmp_val =
+          Bind(new (Z) LoadLocalInstr(*closure_tmp_var, node->token_pos()));
       Value* context = Bind(BuildCurrentContext(node->token_pos()));
-      Do(new(Z) StoreInstanceFieldInstr(Closure::context_offset(),
-                                        closure_tmp_val,
-                                        context,
-                                        kEmitStoreBarrier,
-                                        node->token_pos()));
+      Do(new (Z) StoreInstanceFieldInstr(Closure::context_offset(),
+                                         closure_tmp_val, context,
+                                         kEmitStoreBarrier, node->token_pos()));
     }
     ReturnDefinition(ExitTempLocalScope(closure_val));
   }
@@ -2584,15 +2471,12 @@
 void EffectGraphVisitor::BuildInstanceCallConditional(InstanceCallNode* node) {
   const TokenPosition token_pos = node->token_pos();
   LocalVariable* temp_var = owner()->parsed_function().expression_temp_var();
-  LoadLocalNode* load_temp = new(Z) LoadLocalNode(token_pos, temp_var);
+  LoadLocalNode* load_temp = new (Z) LoadLocalNode(token_pos, temp_var);
 
   LiteralNode* null_constant =
-      new(Z) LiteralNode(ST(token_pos), Object::null_instance());
-  ComparisonNode* check_is_null =
-      new(Z) ComparisonNode(ST(token_pos),
-                            Token::kEQ,
-                            load_temp,
-                            null_constant);
+      new (Z) LiteralNode(ST(token_pos), Object::null_instance());
+  ComparisonNode* check_is_null = new (Z)
+      ComparisonNode(ST(token_pos), Token::kEQ, load_temp, null_constant);
   TestGraphVisitor for_test(owner(), ST(token_pos));
   check_is_null->Visit(&for_test);
 
@@ -2600,16 +2484,13 @@
   EffectGraphVisitor for_false(owner());
 
   StoreLocalNode* store_null =
-      new(Z) StoreLocalNode(ST(token_pos), temp_var, null_constant);
+      new (Z) StoreLocalNode(ST(token_pos), temp_var, null_constant);
   store_null->Visit(&for_true);
 
-  InstanceCallNode* call =
-      new(Z) InstanceCallNode(token_pos,
-                              load_temp,
-                              node->function_name(),
-                              node->arguments());
+  InstanceCallNode* call = new (Z) InstanceCallNode(
+      token_pos, load_temp, node->function_name(), node->arguments());
   StoreLocalNode* store_result =
-      new(Z) StoreLocalNode(ST(token_pos), temp_var, call);
+      new (Z) StoreLocalNode(ST(token_pos), temp_var, call);
   store_result->Visit(&for_false);
 
   Join(for_test, for_true, for_false);
@@ -2639,20 +2520,14 @@
     BuildInstanceCallConditional(node);
   } else {
     PushArgumentInstr* push_receiver = PushArgument(for_receiver.value());
-    ZoneGrowableArray<PushArgumentInstr*>* arguments =
-        new(Z) ZoneGrowableArray<PushArgumentInstr*>(
-            node->arguments()->length() + 1);
+    ZoneGrowableArray<PushArgumentInstr*>* arguments = new (Z)
+        ZoneGrowableArray<PushArgumentInstr*>(node->arguments()->length() + 1);
     arguments->Add(push_receiver);
 
     BuildPushArguments(*node->arguments(), arguments);
-    InstanceCallInstr* call = new(Z) InstanceCallInstr(
-        node->token_pos(),
-        node->function_name(),
-        Token::kILLEGAL,
-        arguments,
-        node->arguments()->names(),
-        1,
-        owner()->ic_data_array());
+    InstanceCallInstr* call = new (Z) InstanceCallInstr(
+        node->token_pos(), node->function_name(), Token::kILLEGAL, arguments,
+        node->arguments()->names(), 1, owner()->ic_data_array());
     ReturnDefinition(call);
   }
 }
@@ -2661,15 +2536,12 @@
 // <Expression> ::= StaticCall { function: Function
 //                               arguments: <ArgumentList> }
 void EffectGraphVisitor::VisitStaticCallNode(StaticCallNode* node) {
-  ZoneGrowableArray<PushArgumentInstr*>* arguments =
-      new(Z) ZoneGrowableArray<PushArgumentInstr*>(node->arguments()->length());
+  ZoneGrowableArray<PushArgumentInstr*>* arguments = new (Z)
+      ZoneGrowableArray<PushArgumentInstr*>(node->arguments()->length());
   BuildPushArguments(*node->arguments(), arguments);
-  StaticCallInstr* call =
-      new(Z) StaticCallInstr(node->token_pos(),
-                             node->function(),
-                             node->arguments()->names(),
-                             arguments,
-                             owner()->ic_data_array());
+  StaticCallInstr* call = new (Z) StaticCallInstr(
+      node->token_pos(), node->function(), node->arguments()->names(),
+      arguments, owner()->ic_data_array());
   if (node->function().recognized_kind() != MethodRecognizer::kUnknown) {
     call->set_result_cid(MethodRecognizer::ResultCid(node->function()));
   }
@@ -2677,8 +2549,8 @@
 }
 
 
-void EffectGraphVisitor::BuildClosureCall(
-    ClosureCallNode* node, bool result_needed) {
+void EffectGraphVisitor::BuildClosureCall(ClosureCallNode* node,
+                                          bool result_needed) {
   ValueGraphVisitor for_closure(owner());
   node->closure()->Visit(&for_closure);
   Append(for_closure);
@@ -2686,27 +2558,26 @@
   Value* closure_value = for_closure.value();
   LocalVariable* tmp_var = EnterTempLocalScope(closure_value);
 
-  ZoneGrowableArray<PushArgumentInstr*>* arguments =
-      new(Z) ZoneGrowableArray<PushArgumentInstr*>(node->arguments()->length());
-  Value* closure_val = Bind(new(Z) LoadLocalInstr(*tmp_var, node->token_pos()));
+  ZoneGrowableArray<PushArgumentInstr*>* arguments = new (Z)
+      ZoneGrowableArray<PushArgumentInstr*>(node->arguments()->length());
+  Value* closure_val =
+      Bind(new (Z) LoadLocalInstr(*tmp_var, node->token_pos()));
   PushArgumentInstr* push_closure = PushArgument(closure_val);
   arguments->Add(push_closure);
   BuildPushArguments(*node->arguments(), arguments);
 
-  closure_val = Bind(new(Z) LoadLocalInstr(*tmp_var, node->token_pos()));
-  LoadFieldInstr* function_load = new(Z) LoadFieldInstr(
-      closure_val,
-      Closure::function_offset(),
-      AbstractType::ZoneHandle(Z, AbstractType::null()),
-      node->token_pos());
+  closure_val = Bind(new (Z) LoadLocalInstr(*tmp_var, node->token_pos()));
+  LoadFieldInstr* function_load = new (Z) LoadFieldInstr(
+      closure_val, Closure::function_offset(),
+      AbstractType::ZoneHandle(Z, AbstractType::null()), node->token_pos());
   function_load->set_is_immutable(true);
   Value* function_val = Bind(function_load);
 
   Definition* closure_call =
-      new(Z) ClosureCallInstr(function_val, node, arguments);
+      new (Z) ClosureCallInstr(function_val, node, arguments);
   if (result_needed) {
     Value* result = Bind(closure_call);
-    Do(new(Z) StoreLocalInstr(*tmp_var, result, ST(node->token_pos())));
+    Do(new (Z) StoreLocalInstr(*tmp_var, result, ST(node->token_pos())));
   } else {
     Do(closure_call);
   }
@@ -2725,15 +2596,15 @@
 
 
 void EffectGraphVisitor::VisitInitStaticFieldNode(InitStaticFieldNode* node) {
-  Value* field = Bind(new(Z) ConstantInstr(
-      Field::ZoneHandle(Z, node->field().Original())));
-  AddInstruction(new(Z) InitStaticFieldInstr(field, node->field()));
+  Value* field = Bind(
+      new (Z) ConstantInstr(Field::ZoneHandle(Z, node->field().Original())));
+  AddInstruction(new (Z) InitStaticFieldInstr(field, node->field()));
 }
 
 
 void EffectGraphVisitor::VisitCloneContextNode(CloneContextNode* node) {
   Value* context = Bind(BuildCurrentContext(node->token_pos()));
-  Value* clone = Bind(new(Z) CloneContextInstr(node->token_pos(), context));
+  Value* clone = Bind(new (Z) CloneContextInstr(node->token_pos(), context));
   Do(BuildStoreContext(clone, node->token_pos()));
 }
 
@@ -2742,18 +2613,16 @@
   const Class& cls = Class::ZoneHandle(Z, node->constructor().Owner());
   const bool cls_is_parameterized = cls.NumTypeArguments() > 0;
 
-  ZoneGrowableArray<PushArgumentInstr*>* allocate_arguments =
-      new(Z) ZoneGrowableArray<PushArgumentInstr*>(
-          cls_is_parameterized ? 1 : 0);
+  ZoneGrowableArray<PushArgumentInstr*>* allocate_arguments = new (Z)
+      ZoneGrowableArray<PushArgumentInstr*>(cls_is_parameterized ? 1 : 0);
   if (cls_is_parameterized) {
     Value* type_args = BuildInstantiatedTypeArguments(node->token_pos(),
                                                       node->type_arguments());
     allocate_arguments->Add(PushArgument(type_args));
   }
 
-  Definition* allocation = new(Z) AllocateObjectInstr(
-      node->token_pos(),
-      Class::ZoneHandle(Z, node->constructor().Owner()),
+  Definition* allocation = new (Z) AllocateObjectInstr(
+      node->token_pos(), Class::ZoneHandle(Z, node->constructor().Owner()),
       allocate_arguments);
 
   return Bind(allocation);
@@ -2763,17 +2632,14 @@
 void EffectGraphVisitor::BuildConstructorCall(
     ConstructorCallNode* node,
     PushArgumentInstr* push_alloc_value) {
-
   ZoneGrowableArray<PushArgumentInstr*>* arguments =
-      new(Z) ZoneGrowableArray<PushArgumentInstr*>(2);
+      new (Z) ZoneGrowableArray<PushArgumentInstr*>(2);
   arguments->Add(push_alloc_value);
 
   BuildPushArguments(*node->arguments(), arguments);
-  Do(new(Z) StaticCallInstr(node->token_pos(),
-                            node->constructor(),
-                            node->arguments()->names(),
-                            arguments,
-                            owner()->ic_data_array()));
+  Do(new (Z) StaticCallInstr(node->token_pos(), node->constructor(),
+                             node->arguments()->names(), arguments,
+                             owner()->ic_data_array()));
 }
 
 
@@ -2797,26 +2663,23 @@
     }
     return FactoryRecognizer::ResultCid(function);
   }
-  return kDynamicCid;   // Not a known list constructor.
+  return kDynamicCid;  // Not a known list constructor.
 }
 
 
 void EffectGraphVisitor::VisitConstructorCallNode(ConstructorCallNode* node) {
   if (node->constructor().IsFactory()) {
     ZoneGrowableArray<PushArgumentInstr*>* arguments =
-        new(Z) ZoneGrowableArray<PushArgumentInstr*>();
-    PushArgumentInstr* push_type_arguments = PushArgument(
-        BuildInstantiatedTypeArguments(node->token_pos(),
-                                       node->type_arguments()));
+        new (Z) ZoneGrowableArray<PushArgumentInstr*>();
+    PushArgumentInstr* push_type_arguments =
+        PushArgument(BuildInstantiatedTypeArguments(node->token_pos(),
+                                                    node->type_arguments()));
     arguments->Add(push_type_arguments);
     ASSERT(arguments->length() == 1);
     BuildPushArguments(*node->arguments(), arguments);
-    StaticCallInstr* call =
-        new(Z) StaticCallInstr(node->token_pos(),
-                               node->constructor(),
-                               node->arguments()->names(),
-                               arguments,
-                               owner()->ic_data_array());
+    StaticCallInstr* call = new (Z) StaticCallInstr(
+        node->token_pos(), 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);
@@ -2871,15 +2734,14 @@
     TypeArguments& type_arguments =
         TypeArguments::ZoneHandle(Z, TypeArguments::null());
     // Type is temporary. Only its type arguments are preserved.
-    Type& type = Type::Handle(
-        Z,
-        Type::New(instantiator_class, type_arguments, token_pos, Heap::kNew));
-    type ^= ClassFinalizer::FinalizeType(
-        instantiator_class, type, ClassFinalizer::kFinalize);
+    Type& type = Type::Handle(Z, Type::New(instantiator_class, type_arguments,
+                                           token_pos, Heap::kNew));
+    type ^= ClassFinalizer::FinalizeType(instantiator_class, type,
+                                         ClassFinalizer::kFinalize);
     ASSERT(!type.IsMalformedOrMalbounded());
     type_arguments = type.arguments();
     type_arguments = type_arguments.Canonicalize();
-    return Bind(new(Z) ConstantInstr(type_arguments));
+    return Bind(new (Z) ConstantInstr(type_arguments));
   }
   Function& outer_function = Function::Handle(Z, owner()->function().raw());
   while (outer_function.IsLocalFunction()) {
@@ -2888,8 +2750,7 @@
   if (outer_function.IsFactory()) {
     // No instantiator for factories.
     ASSERT(instantiator == NULL);
-    LocalVariable* instantiator_var =
-        owner()->parsed_function().instantiator();
+    LocalVariable* instantiator_var = owner()->parsed_function().instantiator();
     ASSERT(instantiator_var != NULL);
     return Bind(BuildLoadLocal(*instantiator_var, token_pos));
   }
@@ -2904,9 +2765,8 @@
       instantiator_class.type_arguments_field_offset();
   ASSERT(type_arguments_field_offset != Class::kNoTypeArguments);
 
-  return Bind(new(Z) LoadFieldInstr(
-      instantiator,
-      type_arguments_field_offset,
+  return Bind(new (Z) LoadFieldInstr(
+      instantiator, type_arguments_field_offset,
       Type::ZoneHandle(Z, Type::null()),  // Not an instance, no type.
       token_pos));
 }
@@ -2916,11 +2776,11 @@
     TokenPosition token_pos,
     const TypeArguments& type_arguments) {
   if (type_arguments.IsNull() || type_arguments.IsInstantiated()) {
-    return Bind(new(Z) ConstantInstr(type_arguments));
+    return Bind(new (Z) ConstantInstr(type_arguments));
   }
   // The type arguments are uninstantiated.
-  const Class& instantiator_class = Class::ZoneHandle(
-      Z, owner()->function().Owner());
+  const Class& instantiator_class =
+      Class::ZoneHandle(Z, owner()->function().Owner());
   Value* instantiator_value =
       BuildInstantiatorTypeArguments(token_pos, instantiator_class, NULL);
   const bool use_instantiator_type_args =
@@ -2929,10 +2789,8 @@
   if (use_instantiator_type_args) {
     return instantiator_value;
   } else {
-    return Bind(new(Z) InstantiateTypeArgumentsInstr(token_pos,
-                                                  type_arguments,
-                                                  instantiator_class,
-                                                  instantiator_value));
+    return Bind(new (Z) InstantiateTypeArgumentsInstr(
+        token_pos, type_arguments, instantiator_class, instantiator_value));
   }
 }
 
@@ -2952,9 +2810,10 @@
   //   tn       <- LoadLocal(temp)
 
   Value* allocate = BuildObjectAllocation(node);
-  { LocalVariable* tmp_var = EnterTempLocalScope(allocate);
+  {
+    LocalVariable* tmp_var = EnterTempLocalScope(allocate);
     Value* allocated_tmp =
-        Bind(new(Z) LoadLocalInstr(*tmp_var, node->token_pos()));
+        Bind(new (Z) LoadLocalInstr(*tmp_var, node->token_pos()));
     PushArgumentInstr* push_allocated_value = PushArgument(allocated_tmp);
     BuildConstructorCall(node, push_allocated_value);
     ReturnDefinition(ExitTempLocalScope(allocate));
@@ -2962,20 +2821,16 @@
 }
 
 
-
 void EffectGraphVisitor::BuildInstanceGetterConditional(
     InstanceGetterNode* node) {
   const TokenPosition token_pos = node->token_pos();
   LocalVariable* temp_var = owner()->parsed_function().expression_temp_var();
-  LoadLocalNode* load_temp = new(Z) LoadLocalNode(token_pos, temp_var);
+  LoadLocalNode* load_temp = new (Z) LoadLocalNode(token_pos, temp_var);
 
   LiteralNode* null_constant =
-      new(Z) LiteralNode(ST(token_pos), Object::null_instance());
-  ComparisonNode* check_is_null =
-      new(Z) ComparisonNode(ST(token_pos),
-                            Token::kEQ,
-                            load_temp,
-                            null_constant);
+      new (Z) LiteralNode(ST(token_pos), Object::null_instance());
+  ComparisonNode* check_is_null = new (Z)
+      ComparisonNode(ST(token_pos), Token::kEQ, load_temp, null_constant);
   TestGraphVisitor for_test(owner(), ST(token_pos));
   check_is_null->Visit(&for_test);
 
@@ -2983,14 +2838,13 @@
   EffectGraphVisitor for_false(owner());
 
   StoreLocalNode* store_null =
-      new(Z) StoreLocalNode(ST(token_pos), temp_var, null_constant);
+      new (Z) StoreLocalNode(ST(token_pos), temp_var, null_constant);
   store_null->Visit(&for_true);
 
-  InstanceGetterNode* getter = new(Z) InstanceGetterNode(token_pos,
-                                                         load_temp,
-                                                         node->field_name());
+  InstanceGetterNode* getter =
+      new (Z) InstanceGetterNode(token_pos, load_temp, node->field_name());
   StoreLocalNode* store_getter =
-      new(Z) StoreLocalNode(ST(token_pos), temp_var, getter);
+      new (Z) StoreLocalNode(ST(token_pos), temp_var, getter);
   store_getter->Visit(&for_false);
 
   Join(for_test, for_true, for_false);
@@ -3021,17 +2875,13 @@
   } else {
     PushArgumentInstr* push_receiver = PushArgument(for_receiver.value());
     ZoneGrowableArray<PushArgumentInstr*>* arguments =
-        new(Z) ZoneGrowableArray<PushArgumentInstr*>(1);
+        new (Z) ZoneGrowableArray<PushArgumentInstr*>(1);
     arguments->Add(push_receiver);
     const String& name =
         String::ZoneHandle(Z, Field::GetterSymbol(node->field_name()));
-    InstanceCallInstr* call = new(Z) InstanceCallInstr(
-        node->token_pos(),
-        name,
-        Token::kGET,
-        arguments, Object::null_array(),
-        1,
-        owner()->ic_data_array());
+    InstanceCallInstr* call = new (Z)
+        InstanceCallInstr(node->token_pos(), name, Token::kGET, arguments,
+                          Object::null_array(), 1, owner()->ic_data_array());
     ReturnDefinition(call);
   }
 }
@@ -3069,43 +2919,32 @@
     Do(BuildStoreExprTemp(for_receiver.value(), token_pos));
 
     LocalVariable* temp_var = owner()->parsed_function().expression_temp_var();
-    LoadLocalNode* load_temp =
-        new(Z) LoadLocalNode(ST(token_pos), temp_var);
+    LoadLocalNode* load_temp = new (Z) LoadLocalNode(ST(token_pos), temp_var);
     LiteralNode* null_constant =
-        new(Z) LiteralNode(ST(token_pos), Object::null_instance());
-    ComparisonNode* check_is_null =
-        new(Z) ComparisonNode(ST(token_pos),
-                              Token::kEQ,
-                              load_temp,
-                              null_constant);
+        new (Z) LiteralNode(ST(token_pos), Object::null_instance());
+    ComparisonNode* check_is_null = new (Z)
+        ComparisonNode(ST(token_pos), Token::kEQ, load_temp, null_constant);
     TestGraphVisitor for_test(owner(), ST(token_pos));
     check_is_null->Visit(&for_test);
 
     EffectGraphVisitor for_true(owner());
     EffectGraphVisitor for_false(owner());
 
-    InstanceSetterNode* setter =
-        new(Z) InstanceSetterNode(token_pos,
-                                  load_temp,
-                                  node->field_name(),
-                                  node->value());
+    InstanceSetterNode* setter = new (Z) InstanceSetterNode(
+        token_pos, load_temp, node->field_name(), node->value());
     setter->Visit(&for_false);
     Join(for_test, for_true, for_false);
     return;
   }
   ZoneGrowableArray<PushArgumentInstr*>* arguments =
-      new(Z) ZoneGrowableArray<PushArgumentInstr*>(2);
+      new (Z) ZoneGrowableArray<PushArgumentInstr*>(2);
   BuildInstanceSetterArguments(node, arguments, kResultNotNeeded);
   const String& name =
       String::ZoneHandle(Z, Field::SetterSymbol(node->field_name()));
   const intptr_t kNumArgsChecked = 1;  // Do not check value type.
-  InstanceCallInstr* call = new(Z) InstanceCallInstr(token_pos,
-                                                     name,
-                                                     Token::kSET,
-                                                     arguments,
-                                                     Object::null_array(),
-                                                     kNumArgsChecked,
-                                                     owner()->ic_data_array());
+  InstanceCallInstr* call = new (Z) InstanceCallInstr(
+      token_pos, name, Token::kSET, arguments, Object::null_array(),
+      kNumArgsChecked, owner()->ic_data_array());
   ReturnDefinition(call);
 }
 
@@ -3119,15 +2958,11 @@
     Do(BuildStoreExprTemp(for_receiver.value(), token_pos));
 
     LocalVariable* temp_var = owner()->parsed_function().expression_temp_var();
-    LoadLocalNode* load_temp =
-        new(Z) LoadLocalNode(ST(token_pos), temp_var);
+    LoadLocalNode* load_temp = new (Z) LoadLocalNode(ST(token_pos), temp_var);
     LiteralNode* null_constant =
-        new(Z) LiteralNode(ST(token_pos), Object::null_instance());
-    ComparisonNode* check_is_null =
-        new(Z) ComparisonNode(ST(token_pos),
-                              Token::kEQ,
-                              load_temp,
-                              null_constant);
+        new (Z) LiteralNode(ST(token_pos), Object::null_instance());
+    ComparisonNode* check_is_null = new (Z)
+        ComparisonNode(ST(token_pos), Token::kEQ, load_temp, null_constant);
     TestGraphVisitor for_test(owner(), ST(token_pos));
     check_is_null->Visit(&for_test);
 
@@ -3136,11 +2971,8 @@
     for_true.Do(BuildStoreExprTemp(for_true.value(), token_pos));
 
     ValueGraphVisitor for_false(owner());
-    InstanceSetterNode* setter =
-        new(Z) InstanceSetterNode(token_pos,
-                                  load_temp,
-                                  node->field_name(),
-                                  node->value());
+    InstanceSetterNode* setter = new (Z) InstanceSetterNode(
+        token_pos, load_temp, node->field_name(), node->value());
     setter->Visit(&for_false);
     for_false.Do(BuildStoreExprTemp(for_false.value(), token_pos));
 
@@ -3149,18 +2981,14 @@
     return;
   }
   ZoneGrowableArray<PushArgumentInstr*>* arguments =
-      new(Z) ZoneGrowableArray<PushArgumentInstr*>(2);
+      new (Z) ZoneGrowableArray<PushArgumentInstr*>(2);
   BuildInstanceSetterArguments(node, arguments, kResultNeeded);
   const String& name =
       String::ZoneHandle(Z, Field::SetterSymbol(node->field_name()));
   const intptr_t kNumArgsChecked = 1;  // Do not check value type.
-  Do(new(Z) InstanceCallInstr(token_pos,
-                              name,
-                              Token::kSET,
-                              arguments,
-                              Object::null_array(),
-                              kNumArgsChecked,
-                              owner()->ic_data_array()));
+  Do(new (Z) InstanceCallInstr(token_pos, name, Token::kSET, arguments,
+                               Object::null_array(), kNumArgsChecked,
+                               owner()->ic_data_array()));
   ReturnDefinition(BuildLoadExprTemp(token_pos));
 }
 
@@ -3169,24 +2997,21 @@
   const String& getter_name =
       String::ZoneHandle(Z, Field::GetterSymbol(node->field_name()));
   ZoneGrowableArray<PushArgumentInstr*>* arguments =
-      new(Z) ZoneGrowableArray<PushArgumentInstr*>();
+      new (Z) ZoneGrowableArray<PushArgumentInstr*>();
   Function& getter_function = Function::ZoneHandle(Z, Function::null());
   if (node->is_super_getter()) {
     // Statically resolved instance getter, i.e. "super getter".
     ASSERT(node->receiver() != NULL);
-    getter_function = Resolver::ResolveDynamicAnyArgs(Z,
-        node->cls(), getter_name);
+    getter_function =
+        Resolver::ResolveDynamicAnyArgs(Z, node->cls(), getter_name);
     if (getter_function.IsNull()) {
       // Resolve and call noSuchMethod.
-      ArgumentListNode* arguments = new(Z) ArgumentListNode(node->token_pos());
+      ArgumentListNode* arguments = new (Z) ArgumentListNode(node->token_pos());
       arguments->Add(node->receiver());
-      StaticCallInstr* call =
-          BuildStaticNoSuchMethodCall(node->cls(),
-                                      node->receiver(),
-                                      getter_name,
-                                      arguments,
-                                      false,  // Don't save last argument.
-                                      true);  // Super invocation.
+      StaticCallInstr* call = BuildStaticNoSuchMethodCall(
+          node->cls(), node->receiver(), getter_name, arguments,
+          false,  // Don't save last argument.
+          true);  // Super invocation.
       ReturnDefinition(call);
       return;
     } else {
@@ -3214,26 +3039,21 @@
 
       // Throw a NoSuchMethodError.
       StaticCallInstr* call = BuildThrowNoSuchMethodError(
-          node->token_pos(),
-          node->cls(),
-          getter_name,
+          node->token_pos(), node->cls(), getter_name,
           NULL,  // No Arguments to getter.
-          InvocationMirror::EncodeType(
-              node->cls().IsTopLevel() ?
-                  InvocationMirror::kTopLevel :
-                  InvocationMirror::kStatic,
-              InvocationMirror::kGetter));
+          InvocationMirror::EncodeType(node->cls().IsTopLevel()
+                                           ? InvocationMirror::kTopLevel
+                                           : InvocationMirror::kStatic,
+                                       InvocationMirror::kGetter));
       ReturnDefinition(call);
       return;
     }
   }
   ASSERT(!getter_function.IsNull());
-  StaticCallInstr* call = new(Z) StaticCallInstr(
-      node->token_pos(),
-      getter_function,
-      Object::null_array(),  // No names
-      arguments,
-      owner()->ic_data_array());
+  StaticCallInstr* call =
+      new (Z) StaticCallInstr(node->token_pos(), getter_function,
+                              Object::null_array(),  // No names
+                              arguments, owner()->ic_data_array());
   ReturnDefinition(call);
 }
 
@@ -3243,7 +3063,7 @@
   const String& setter_name =
       String::ZoneHandle(Z, Field::SetterSymbol(node->field_name()));
   ZoneGrowableArray<PushArgumentInstr*>* arguments =
-      new(Z) ZoneGrowableArray<PushArgumentInstr*>(1);
+      new (Z) ZoneGrowableArray<PushArgumentInstr*>(1);
   const TokenPosition token_pos = node->token_pos();
   // A super setter is an instance setter whose setter function is
   // resolved at compile time (in the caller instance getter's super class).
@@ -3255,30 +3075,24 @@
     if (is_super_setter) {
       ASSERT(node->receiver() != NULL);
       // Resolve and call noSuchMethod.
-      ArgumentListNode* arguments = new(Z) ArgumentListNode(token_pos);
+      ArgumentListNode* arguments = new (Z) ArgumentListNode(token_pos);
       arguments->Add(node->receiver());
       arguments->Add(node->value());
       call = BuildStaticNoSuchMethodCall(
-          node->cls(),
-          node->receiver(),
-          setter_name,
-          arguments,
+          node->cls(), node->receiver(), setter_name, arguments,
           result_is_needed,  // Save last arg if result is needed.
-          true);  // Super invocation.
+          true);             // Super invocation.
     } else {
       // Throw a NoSuchMethodError.
-      ArgumentListNode* arguments = new(Z) ArgumentListNode(token_pos);
+      ArgumentListNode* arguments = new (Z) ArgumentListNode(token_pos);
       arguments->Add(node->value());
       call = BuildThrowNoSuchMethodError(
-          token_pos,
-          node->cls(),
-          setter_name,
+          token_pos, node->cls(), setter_name,
           arguments,  // Argument is the value passed to the setter.
-          InvocationMirror::EncodeType(
-            node->cls().IsTopLevel() ?
-                InvocationMirror::kTopLevel :
-                InvocationMirror::kStatic,
-            InvocationMirror::kSetter));
+          InvocationMirror::EncodeType(node->cls().IsTopLevel()
+                                           ? InvocationMirror::kTopLevel
+                                           : InvocationMirror::kStatic,
+                                       InvocationMirror::kSetter));
     }
   } else {
     if (is_super_setter) {
@@ -3299,11 +3113,9 @@
     }
     arguments->Add(PushArgument(value));
 
-    call = new(Z) StaticCallInstr(token_pos,
-                                  setter_function,
-                                  Object::null_array(),  // No names.
-                                  arguments,
-                                  owner()->ic_data_array());
+    call = new (Z) StaticCallInstr(token_pos, setter_function,
+                                   Object::null_array(),  // No names.
+                                   arguments, owner()->ic_data_array());
   }
   if (result_is_needed) {
     Do(call);
@@ -3343,11 +3155,11 @@
 }
 
 
-LoadLocalInstr* EffectGraphVisitor::BuildLoadThisVar(
-    LocalScope* scope, TokenPosition token_pos) {
+LoadLocalInstr* EffectGraphVisitor::BuildLoadThisVar(LocalScope* scope,
+                                                     TokenPosition token_pos) {
   LocalVariable* receiver_var = scope->LookupVariable(Symbols::This(),
                                                       true);  // Test only.
-  return new(Z) LoadLocalInstr(*receiver_var, token_pos);
+  return new (Z) LoadLocalInstr(*receiver_var, token_pos);
 }
 
 
@@ -3358,10 +3170,8 @@
     const Type& type,
     intptr_t class_id) {
   Value* receiver = Bind(BuildLoadThisVar(node->scope(), node->token_pos()));
-  LoadFieldInstr* load = new(Z) LoadFieldInstr(receiver,
-                                               offset,
-                                               type,
-                                               node->token_pos());
+  LoadFieldInstr* load =
+      new (Z) LoadFieldInstr(receiver, offset, type, node->token_pos());
   load->set_result_cid(class_id);
   load->set_recognized_kind(kind);
   return load;
@@ -3375,15 +3185,11 @@
   Value* receiver = Bind(BuildLoadThisVar(node->scope(), node->token_pos()));
   LocalVariable* value_var =
       node->scope()->LookupVariable(Symbols::Value(), true);
-  Value* value = Bind(new(Z) LoadLocalInstr(*value_var, node->token_pos()));
-  StoreInstanceFieldInstr* store = new(Z) StoreInstanceFieldInstr(
-      offset,
-      receiver,
-      value,
-      emit_store_barrier,
-      node->token_pos());
+  Value* value = Bind(new (Z) LoadLocalInstr(*value_var, node->token_pos()));
+  StoreInstanceFieldInstr* store = new (Z) StoreInstanceFieldInstr(
+      offset, receiver, value, emit_store_barrier, node->token_pos());
   Do(store);
-  return new(Z) ConstantInstr(Object::ZoneHandle(Z, Object::null()));
+  return new (Z) ConstantInstr(Object::ZoneHandle(Z, Object::null()));
 }
 
 
@@ -3398,15 +3204,11 @@
         LocalVariable* other_var =
             node->scope()->LookupVariable(Symbols::Other(),
                                           true);  // Test only.
-        Value* other = Bind(new(Z) LoadLocalInstr(*other_var, token_pos));
+        Value* other = Bind(new (Z) LoadLocalInstr(*other_var, token_pos));
         // Receiver is not a number because numbers override equality.
         const bool kNoNumberCheck = false;
-        StrictCompareInstr* compare =
-            new(Z) StrictCompareInstr(token_pos,
-                                      Token::kEQ_STRICT,
-                                      receiver,
-                                      other,
-                                      kNoNumberCheck);
+        StrictCompareInstr* compare = new (Z) StrictCompareInstr(
+            token_pos, Token::kEQ_STRICT, receiver, other, kNoNumberCheck);
         return ReturnDefinition(compare);
       }
       case MethodRecognizer::kStringBaseLength:
@@ -3423,102 +3225,90 @@
           return ReturnDefinition(load);
         }
         ASSERT(kind == MethodRecognizer::kStringBaseIsEmpty);
-        Value* zero_val = Bind(new(Z) ConstantInstr(
-            Smi::ZoneHandle(Z, Smi::New(0))));
+        Value* zero_val =
+            Bind(new (Z) ConstantInstr(Smi::ZoneHandle(Z, Smi::New(0))));
         Value* load_val = Bind(load);
-        StrictCompareInstr* compare =
-            new(Z) StrictCompareInstr(token_pos,
-                                      Token::kEQ_STRICT,
-                                      load_val,
-                                      zero_val,
-                                      false);  // No number check.
+        StrictCompareInstr* compare = new (Z)
+            StrictCompareInstr(token_pos, Token::kEQ_STRICT, load_val, zero_val,
+                               false);  // No number check.
         return ReturnDefinition(compare);
       }
       case MethodRecognizer::kGrowableArrayLength:
       case MethodRecognizer::kObjectArrayLength:
       case MethodRecognizer::kImmutableArrayLength:
       case MethodRecognizer::kTypedDataLength: {
-        LoadFieldInstr* load = BuildNativeGetter(
-            node, kind, OffsetForLengthGetter(kind),
-            Type::ZoneHandle(Z, Type::SmiType()), kSmiCid);
+        LoadFieldInstr* load =
+            BuildNativeGetter(node, kind, OffsetForLengthGetter(kind),
+                              Type::ZoneHandle(Z, Type::SmiType()), kSmiCid);
         load->set_is_immutable(kind != MethodRecognizer::kGrowableArrayLength);
         return ReturnDefinition(load);
       }
       case MethodRecognizer::kClassIDgetID: {
         LocalVariable* value_var =
             node->scope()->LookupVariable(Symbols::Value(), true);
-        Value* value = Bind(new(Z) LoadLocalInstr(*value_var, token_pos));
-        LoadClassIdInstr* load = new(Z) LoadClassIdInstr(value);
+        Value* value = Bind(new (Z) LoadLocalInstr(*value_var, token_pos));
+        LoadClassIdInstr* load = new (Z) LoadClassIdInstr(value);
         return ReturnDefinition(load);
       }
       case MethodRecognizer::kGrowableArrayCapacity: {
         Value* receiver = Bind(BuildLoadThisVar(node->scope(), token_pos));
-        LoadFieldInstr* data_load = new(Z) LoadFieldInstr(
-            receiver,
-            Array::data_offset(),
-            Object::dynamic_type(),
-            node->token_pos());
+        LoadFieldInstr* data_load =
+            new (Z) LoadFieldInstr(receiver, Array::data_offset(),
+                                   Object::dynamic_type(), node->token_pos());
         data_load->set_result_cid(kArrayCid);
         Value* data = Bind(data_load);
-        LoadFieldInstr* length_load = new(Z) LoadFieldInstr(
-            data,
-            Array::length_offset(),
-            Type::ZoneHandle(Z, Type::SmiType()),
+        LoadFieldInstr* length_load = new (Z) LoadFieldInstr(
+            data, Array::length_offset(), Type::ZoneHandle(Z, Type::SmiType()),
             node->token_pos());
         length_load->set_result_cid(kSmiCid);
         length_load->set_recognized_kind(MethodRecognizer::kObjectArrayLength);
         return ReturnDefinition(length_load);
       }
       case MethodRecognizer::kObjectArrayAllocate: {
-        LocalVariable* type_args_parameter =
-            node->scope()->LookupVariable(Symbols::TypeArgumentsParameter(),
-                                          true);
+        LocalVariable* type_args_parameter = node->scope()->LookupVariable(
+            Symbols::TypeArgumentsParameter(), true);
         Value* element_type =
-            Bind(new(Z) LoadLocalInstr(*type_args_parameter, token_pos));
+            Bind(new (Z) LoadLocalInstr(*type_args_parameter, token_pos));
         LocalVariable* length_parameter =
             node->scope()->LookupVariable(Symbols::Length(), true);
         Value* length =
-            Bind(new(Z) LoadLocalInstr(*length_parameter, token_pos));
+            Bind(new (Z) LoadLocalInstr(*length_parameter, token_pos));
         CreateArrayInstr* create_array =
             new CreateArrayInstr(token_pos, element_type, length);
         return ReturnDefinition(create_array);
       }
       case MethodRecognizer::kBigint_getDigits: {
         return ReturnDefinition(BuildNativeGetter(
-            node, kind, Bigint::digits_offset(),
-            Object::dynamic_type(),
+            node, kind, Bigint::digits_offset(), Object::dynamic_type(),
             kTypedDataUint32ArrayCid));
       }
       case MethodRecognizer::kBigint_getUsed: {
-        return ReturnDefinition(BuildNativeGetter(
-            node, kind, Bigint::used_offset(),
-            Type::ZoneHandle(Z, Type::SmiType()), kSmiCid));
+        return ReturnDefinition(
+            BuildNativeGetter(node, kind, Bigint::used_offset(),
+                              Type::ZoneHandle(Z, Type::SmiType()), kSmiCid));
       }
       case MethodRecognizer::kLinkedHashMap_getIndex: {
-        return ReturnDefinition(BuildNativeGetter(
-            node, kind, LinkedHashMap::index_offset(),
-            Object::dynamic_type(),
-            kDynamicCid));
+        return ReturnDefinition(
+            BuildNativeGetter(node, kind, LinkedHashMap::index_offset(),
+                              Object::dynamic_type(), kDynamicCid));
       }
       case MethodRecognizer::kLinkedHashMap_setIndex: {
         return ReturnDefinition(DoNativeSetterStoreValue(
             node, LinkedHashMap::index_offset(), kEmitStoreBarrier));
       }
       case MethodRecognizer::kLinkedHashMap_getData: {
-        return ReturnDefinition(BuildNativeGetter(
-            node, kind, LinkedHashMap::data_offset(),
-            Object::dynamic_type(),
-            kArrayCid));
+        return ReturnDefinition(
+            BuildNativeGetter(node, kind, LinkedHashMap::data_offset(),
+                              Object::dynamic_type(), kArrayCid));
       }
       case MethodRecognizer::kLinkedHashMap_setData: {
         return ReturnDefinition(DoNativeSetterStoreValue(
             node, LinkedHashMap::data_offset(), kEmitStoreBarrier));
       }
       case MethodRecognizer::kLinkedHashMap_getHashMask: {
-        return ReturnDefinition(BuildNativeGetter(
-            node, kind, LinkedHashMap::hash_mask_offset(),
-            Type::ZoneHandle(Z, Type::SmiType()),
-            kSmiCid));
+        return ReturnDefinition(
+            BuildNativeGetter(node, kind, LinkedHashMap::hash_mask_offset(),
+                              Type::ZoneHandle(Z, Type::SmiType()), kSmiCid));
       }
       case MethodRecognizer::kLinkedHashMap_setHashMask: {
         // Smi field; no barrier needed.
@@ -3526,10 +3316,9 @@
             node, LinkedHashMap::hash_mask_offset(), kNoStoreBarrier));
       }
       case MethodRecognizer::kLinkedHashMap_getUsedData: {
-        return ReturnDefinition(BuildNativeGetter(
-            node, kind, LinkedHashMap::used_data_offset(),
-            Type::ZoneHandle(Z, Type::SmiType()),
-            kSmiCid));
+        return ReturnDefinition(
+            BuildNativeGetter(node, kind, LinkedHashMap::used_data_offset(),
+                              Type::ZoneHandle(Z, Type::SmiType()), kSmiCid));
       }
       case MethodRecognizer::kLinkedHashMap_setUsedData: {
         // Smi field; no barrier needed.
@@ -3537,10 +3326,9 @@
             node, LinkedHashMap::used_data_offset(), kNoStoreBarrier));
       }
       case MethodRecognizer::kLinkedHashMap_getDeletedKeys: {
-        return ReturnDefinition(BuildNativeGetter(
-            node, kind, LinkedHashMap::deleted_keys_offset(),
-            Type::ZoneHandle(Z, Type::SmiType()),
-            kSmiCid));
+        return ReturnDefinition(
+            BuildNativeGetter(node, kind, LinkedHashMap::deleted_keys_offset(),
+                              Type::ZoneHandle(Z, Type::SmiType()), kSmiCid));
       }
       case MethodRecognizer::kLinkedHashMap_setDeletedKeys: {
         // Smi field; no barrier needed.
@@ -3548,16 +3336,16 @@
             node, LinkedHashMap::deleted_keys_offset(), kNoStoreBarrier));
       }
       case MethodRecognizer::kBigint_getNeg: {
-        return ReturnDefinition(BuildNativeGetter(
-            node, kind, Bigint::neg_offset(),
-            Type::ZoneHandle(Z, Type::BoolType()), kBoolCid));
+        return ReturnDefinition(
+            BuildNativeGetter(node, kind, Bigint::neg_offset(),
+                              Type::ZoneHandle(Z, Type::BoolType()), kBoolCid));
       }
       default:
         break;
     }
   }
   InlineBailout("EffectGraphVisitor::VisitNativeBodyNode");
-  NativeCallInstr* native_call = new(Z) NativeCallInstr(node);
+  NativeCallInstr* native_call = new (Z) NativeCallInstr(node);
   ReturnDefinition(native_call);
 }
 
@@ -3596,9 +3384,8 @@
          (rhs->IsLoadLocalNode() &&
           !rhs->AsLoadLocalNode()->local().IsInternal()) ||
          rhs->IsClosureNode()) &&
-        !node->local().IsInternal() &&
-        node->token_pos().IsDebugPause()) {
-      AddInstruction(new(Z) DebugStepCheckInstr(
+        !node->local().IsInternal() && node->token_pos().IsDebugPause()) {
+      AddInstruction(new (Z) DebugStepCheckInstr(
           node->token_pos(), RawPcDescriptors::kRuntimeCall));
     }
   }
@@ -3608,14 +3395,12 @@
   Append(for_value);
   Value* store_value = for_value.value();
   if (Isolate::Current()->type_checks()) {
-    store_value = BuildAssignableValue(node->value()->token_pos(),
-                                       store_value,
-                                       node->local().type(),
-                                       node->local().name());
+    store_value =
+        BuildAssignableValue(node->value()->token_pos(), store_value,
+                             node->local().type(), node->local().name());
   }
-  Definition* store = BuildStoreLocal(node->local(),
-                                      store_value,
-                                      node->token_pos());
+  Definition* store =
+      BuildStoreLocal(node->local(), store_value, node->token_pos());
   ReturnDefinition(store);
 }
 
@@ -3625,11 +3410,9 @@
   ValueGraphVisitor for_instance(owner());
   node->instance()->Visit(&for_instance);
   Append(for_instance);
-  LoadFieldInstr* load = new(Z) LoadFieldInstr(
-      for_instance.value(),
-      &node->field(),
-      AbstractType::ZoneHandle(Z, node->field().type()),
-      node->token_pos());
+  LoadFieldInstr* load = new (Z) LoadFieldInstr(
+      for_instance.value(), &node->field(),
+      AbstractType::ZoneHandle(Z, node->field().type()), node->token_pos());
   if (node->field().guarded_cid() != kIllegalCid) {
     if (!node->field().is_nullable() ||
         (node->field().guarded_cid() == kNullCid)) {
@@ -3655,33 +3438,24 @@
     const AbstractType& type =
         AbstractType::ZoneHandle(Z, node->field().type());
     const String& dst_name = String::ZoneHandle(Z, node->field().name());
-    store_value = BuildAssignableValue(node->value()->token_pos(),
-                                       store_value,
-                                       type,
-                                       dst_name);
+    store_value = BuildAssignableValue(node->value()->token_pos(), store_value,
+                                       type, dst_name);
   }
 
   if (FLAG_use_field_guards) {
     store_value = Bind(BuildStoreExprTemp(store_value, token_pos));
-    GuardFieldClassInstr* guard_field_class =
-        new(Z) GuardFieldClassInstr(store_value,
-                                    node->field(),
-                                    thread()->GetNextDeoptId());
+    GuardFieldClassInstr* guard_field_class = new (Z) GuardFieldClassInstr(
+        store_value, node->field(), thread()->GetNextDeoptId());
     AddInstruction(guard_field_class);
     store_value = Bind(BuildLoadExprTemp(token_pos));
-    GuardFieldLengthInstr* guard_field_length =
-        new(Z) GuardFieldLengthInstr(store_value,
-                                     node->field(),
-                                     thread()->GetNextDeoptId());
+    GuardFieldLengthInstr* guard_field_length = new (Z) GuardFieldLengthInstr(
+        store_value, node->field(), thread()->GetNextDeoptId());
     AddInstruction(guard_field_length);
     store_value = Bind(BuildLoadExprTemp(token_pos));
   }
-  StoreInstanceFieldInstr* store =
-      new(Z) StoreInstanceFieldInstr(node->field(),
-                                     for_instance.value(),
-                                     store_value,
-                                     kEmitStoreBarrier,
-                                     token_pos);
+  StoreInstanceFieldInstr* store = new (Z)
+      StoreInstanceFieldInstr(node->field(), for_instance.value(), store_value,
+                              kEmitStoreBarrier, token_pos);
   // Maybe initializing unboxed store.
   store->set_is_initialization(node->is_initializer());
   ReturnDefinition(store);
@@ -3692,16 +3466,15 @@
   const TokenPosition token_pos = node->token_pos();
   if (node->field().is_const()) {
     ASSERT(node->field().StaticValue() != Object::sentinel().raw());
-    ASSERT(node->field().StaticValue() !=
-           Object::transition_sentinel().raw());
-    Definition* result = new(Z) ConstantInstr(
+    ASSERT(node->field().StaticValue() != Object::transition_sentinel().raw());
+    Definition* result = new (Z) ConstantInstr(
         Instance::ZoneHandle(Z, node->field().StaticValue()), token_pos);
     return ReturnDefinition(result);
   }
-  Value* field_value = Bind(new(Z) ConstantInstr(
+  Value* field_value = Bind(new (Z) ConstantInstr(
       Field::ZoneHandle(Z, node->field().Original()), token_pos));
   LoadStaticFieldInstr* load =
-      new(Z) LoadStaticFieldInstr(field_value, token_pos);
+      new (Z) LoadStaticFieldInstr(field_value, token_pos);
   ReturnDefinition(load);
 }
 
@@ -3718,11 +3491,10 @@
     if (rhs->IsAssignableNode()) {
       rhs = rhs->AsAssignableNode()->expr();
     }
-    if ((rhs->IsLiteralNode() ||
-         rhs->IsLoadLocalNode() ||
+    if ((rhs->IsLiteralNode() || rhs->IsLoadLocalNode() ||
          rhs->IsClosureNode()) &&
-         node->token_pos().IsDebugPause()) {
-      AddInstruction(new(Z) DebugStepCheckInstr(
+        node->token_pos().IsDebugPause()) {
+      AddInstruction(new (Z) DebugStepCheckInstr(
           node->token_pos(), RawPcDescriptors::kRuntimeCall));
     }
   }
@@ -3737,7 +3509,7 @@
     store_value = for_value.value();
   }
   StoreStaticFieldInstr* store =
-      new(Z) StoreStaticFieldInstr(node->field(), store_value, token_pos);
+      new (Z) StoreStaticFieldInstr(node->field(), store_value, token_pos);
 
   if (result_is_needed) {
     Do(store);
@@ -3764,27 +3536,25 @@
   Function* super_function = NULL;
   if (node->IsSuperLoad()) {
     // Resolve the load indexed operator in the super class.
-    super_function = &Function::ZoneHandle(Z, Resolver::ResolveDynamicAnyArgs(Z,
-        node->super_class(), Symbols::IndexToken()));
+    super_function = &Function::ZoneHandle(
+        Z, Resolver::ResolveDynamicAnyArgs(Z, node->super_class(),
+                                           Symbols::IndexToken()));
     if (super_function->IsNull()) {
       // Could not resolve super operator. Generate call noSuchMethod() of the
       // super class instead.
-      ArgumentListNode* arguments = new(Z) ArgumentListNode(node->token_pos());
+      ArgumentListNode* arguments = new (Z) ArgumentListNode(node->token_pos());
       arguments->Add(node->array());
       arguments->Add(node->index_expr());
-      StaticCallInstr* call =
-          BuildStaticNoSuchMethodCall(node->super_class(),
-                                      node->array(),
-                                      Symbols::IndexToken(),
-                                      arguments,
-                                      false,  // Don't save last arg.
-                                      true);  // Super invocation.
+      StaticCallInstr* call = BuildStaticNoSuchMethodCall(
+          node->super_class(), node->array(), Symbols::IndexToken(), arguments,
+          false,  // Don't save last arg.
+          true);  // Super invocation.
       ReturnDefinition(call);
       return;
     }
   }
   ZoneGrowableArray<PushArgumentInstr*>* arguments =
-      new(Z) ZoneGrowableArray<PushArgumentInstr*>(2);
+      new (Z) ZoneGrowableArray<PushArgumentInstr*>(2);
   ValueGraphVisitor for_array(owner());
   node->array()->Visit(&for_array);
   Append(for_array);
@@ -3797,51 +3567,42 @@
 
   if (super_function != NULL) {
     // Generate static call to super operator.
-    StaticCallInstr* load = new(Z) StaticCallInstr(node->token_pos(),
-                                                   *super_function,
-                                                   Object::null_array(),
-                                                   arguments,
-                                                   owner()->ic_data_array());
+    StaticCallInstr* load = new (Z) StaticCallInstr(
+        node->token_pos(), *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(Z) InstanceCallInstr(
-        node->token_pos(),
-        Symbols::IndexToken(),
-        Token::kINDEX,
-        arguments,
-        Object::null_array(),
-        checked_argument_count,
-        owner()->ic_data_array());
+    InstanceCallInstr* load = new (Z) InstanceCallInstr(
+        node->token_pos(), Symbols::IndexToken(), Token::kINDEX, arguments,
+        Object::null_array(), checked_argument_count, owner()->ic_data_array());
     ReturnDefinition(load);
   }
 }
 
 
-Definition* EffectGraphVisitor::BuildStoreIndexedValues(
-    StoreIndexedNode* node,
-    bool result_is_needed) {
+Definition* EffectGraphVisitor::BuildStoreIndexedValues(StoreIndexedNode* node,
+                                                        bool result_is_needed) {
   Function* super_function = NULL;
   const TokenPosition token_pos = node->token_pos();
   if (node->IsSuperStore()) {
     // Resolve the store indexed operator in the super class.
-    super_function = &Function::ZoneHandle(Z, Resolver::ResolveDynamicAnyArgs(Z,
-        node->super_class(), Symbols::AssignIndexToken()));
+    super_function = &Function::ZoneHandle(
+        Z, Resolver::ResolveDynamicAnyArgs(Z, node->super_class(),
+                                           Symbols::AssignIndexToken()));
     if (super_function->IsNull()) {
       // Could not resolve super operator. Generate call noSuchMethod() of the
       // super class instead.
-      ArgumentListNode* arguments = new(Z) ArgumentListNode(token_pos);
+      ArgumentListNode* arguments = new (Z) ArgumentListNode(token_pos);
       arguments->Add(node->array());
       arguments->Add(node->index_expr());
       arguments->Add(node->value());
       StaticCallInstr* call = BuildStaticNoSuchMethodCall(
-          node->super_class(),
-          node->array(),
-          Symbols::AssignIndexToken(),
+          node->super_class(), node->array(), Symbols::AssignIndexToken(),
           arguments,
           result_is_needed,  // Save last arg if result is needed.
-          true);  // Super invocation.
+          true);             // Super invocation.
       if (result_is_needed) {
         Do(call);
         // BuildStaticNoSuchMethodCall stores the value in expression_temp.
@@ -3853,7 +3614,7 @@
   }
 
   ZoneGrowableArray<PushArgumentInstr*>* arguments =
-      new(Z) ZoneGrowableArray<PushArgumentInstr*>(3);
+      new (Z) ZoneGrowableArray<PushArgumentInstr*>(3);
   ValueGraphVisitor for_array(owner());
   node->array()->Visit(&for_array);
   Append(for_array);
@@ -3878,12 +3639,9 @@
   if (super_function != NULL) {
     // Generate static call to super operator []=.
 
-    StaticCallInstr* store =
-        new(Z) StaticCallInstr(token_pos,
-                               *super_function,
-                               Object::null_array(),
-                               arguments,
-                               owner()->ic_data_array());
+    StaticCallInstr* store = new (Z)
+        StaticCallInstr(token_pos, *super_function, Object::null_array(),
+                        arguments, owner()->ic_data_array());
     if (result_is_needed) {
       Do(store);
       return BuildLoadExprTemp(token_pos);
@@ -3893,14 +3651,9 @@
   } else {
     // Generate dynamic call to operator []=.
     const intptr_t checked_argument_count = 2;  // Do not check for value type.
-    InstanceCallInstr* store =
-        new(Z) InstanceCallInstr(token_pos,
-                                 Symbols::AssignIndexToken(),
-                                 Token::kASSIGN_INDEX,
-                                 arguments,
-                                 Object::null_array(),
-                                 checked_argument_count,
-                                 owner()->ic_data_array());
+    InstanceCallInstr* store = new (Z) InstanceCallInstr(
+        token_pos, Symbols::AssignIndexToken(), Token::kASSIGN_INDEX, arguments,
+        Object::null_array(), checked_argument_count, owner()->ic_data_array());
     if (result_is_needed) {
       Do(store);
       return BuildLoadExprTemp(token_pos);
@@ -3922,8 +3675,8 @@
 
 
 bool EffectGraphVisitor::HasContextScope() const {
-  const ContextScope& context_scope = ContextScope::Handle(
-      owner()->function().context_scope());
+  const ContextScope& context_scope =
+      ContextScope::Handle(owner()->function().context_scope());
   return !context_scope.IsNull() && (context_scope.num_variables() > 0);
 }
 
@@ -3934,12 +3687,10 @@
   if (n > 0) {
     Value* context = Bind(BuildCurrentContext(token_pos));
     while (n-- > 0) {
-      context = Bind(
-          new(Z) LoadFieldInstr(context,
-                                Context::parent_offset(),
-                                // Not an instance, no type.
-                                Type::ZoneHandle(Z, Type::null()),
-                                token_pos));
+      context = Bind(new (Z) LoadFieldInstr(context, Context::parent_offset(),
+                                            // Not an instance, no type.
+                                            Type::ZoneHandle(Z, Type::null()),
+                                            token_pos));
     }
     Do(BuildStoreContext(context, token_pos));
   }
@@ -3991,26 +3742,23 @@
     // 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(Z) AllocateContextInstr(node->token_pos(),
-                                         num_context_variables));
-    { LocalVariable* tmp_var = EnterTempLocalScope(allocated_context);
+    Value* allocated_context = Bind(
+        new (Z) AllocateContextInstr(node->token_pos(), num_context_variables));
+    {
+      LocalVariable* tmp_var = EnterTempLocalScope(allocated_context);
       if (!is_top_level_sequence || HasContextScope()) {
         ASSERT(is_top_level_sequence ||
                (nested_block.ContextLevel() ==
                 nested_block.outer()->ContextLevel() + 1));
-        Value* tmp_val = Bind(
-            new(Z) LoadLocalInstr(*tmp_var, node->token_pos()));
+        Value* tmp_val =
+            Bind(new (Z) LoadLocalInstr(*tmp_var, node->token_pos()));
         Value* parent_context = Bind(BuildCurrentContext(node->token_pos()));
-        Do(new(Z) StoreInstanceFieldInstr(Context::parent_offset(),
-                                          tmp_val,
-                                          parent_context,
-                                          kEmitStoreBarrier,
-                                          node->token_pos()));
+        Do(new (Z) StoreInstanceFieldInstr(Context::parent_offset(), tmp_val,
+                                           parent_context, kEmitStoreBarrier,
+                                           node->token_pos()));
       }
-      Do(BuildStoreContext(
-          Bind(ExitTempLocalScope(allocated_context)),
-          node->token_pos()));
+      Do(BuildStoreContext(Bind(ExitTempLocalScope(allocated_context)),
+                           node->token_pos()));
     }
 
     // If this node_sequence is the body of the function being compiled, copy
@@ -4018,19 +3766,20 @@
     if (is_top_level_sequence) {
       ASSERT(scope->context_level() == 1);
       const int num_params = function.NumParameters();
-      int param_frame_index = (num_params == function.num_fixed_parameters()) ?
-          (kParamEndSlotFromFp + num_params) : kFirstLocalSlotFromFp;
+      int param_frame_index = (num_params == function.num_fixed_parameters())
+                                  ? (kParamEndSlotFromFp + num_params)
+                                  : kFirstLocalSlotFromFp;
       for (int pos = 0; pos < num_params; param_frame_index--, pos++) {
         const LocalVariable& parameter = *scope->VariableAt(pos);
         ASSERT(parameter.owner() == scope);
         if (parameter.is_captured()) {
           // Create a temporary local describing the original position.
           const String& temp_name = Symbols::TempParam();
-          LocalVariable* temp_local = new(Z) LocalVariable(
-              TokenPosition::kNoSource,  // Token index.
-              TokenPosition::kNoSource,  // Token index.
-              temp_name,
-              Object::dynamic_type());  // Type.
+          LocalVariable* temp_local =
+              new (Z) LocalVariable(TokenPosition::kNoSource,  // Token index.
+                                    TokenPosition::kNoSource,  // Token index.
+                                    temp_name,
+                                    Object::dynamic_type());  // Type.
           temp_local->set_index(param_frame_index);
 
           // Mark this local as captured parameter so that the optimizer
@@ -4045,18 +3794,16 @@
           // Write NULL to the source location to detect buggy accesses and
           // allow GC of passed value if it gets overwritten by a new value in
           // the function.
-          Value* null_constant = Bind(new(Z) ConstantInstr(
-              Object::ZoneHandle(Z, Object::null())));
-          Do(BuildStoreLocal(*temp_local,
-                             null_constant,
+          Value* null_constant = Bind(
+              new (Z) ConstantInstr(Object::ZoneHandle(Z, Object::null())));
+          Do(BuildStoreLocal(*temp_local, null_constant,
                              ST(node->token_pos())));
         }
       }
     }
   }
 
-  if (FLAG_support_debugger &&
-      is_top_level_sequence &&
+  if (FLAG_support_debugger && is_top_level_sequence &&
       function.is_debuggable()) {
     // Place a debug check at method entry to ensure breaking on a method always
     // happens, even if there are no assignments/calls/runtimecalls in the first
@@ -4074,8 +3821,8 @@
       check_pos = node->token_pos();
       ASSERT(check_pos.IsDebugPause());
     }
-    AddInstruction(new(Z) DebugStepCheckInstr(check_pos,
-                                              RawPcDescriptors::kRuntimeCall));
+    AddInstruction(
+        new (Z) DebugStepCheckInstr(check_pos, RawPcDescriptors::kRuntimeCall));
   }
 
   // This check may be deleted if the generated code is leaf.
@@ -4086,7 +3833,7 @@
     if (!function.IsImplicitGetterFunction() &&
         !function.IsImplicitSetterFunction()) {
       CheckStackOverflowInstr* check =
-          new(Z) CheckStackOverflowInstr(node->token_pos(), 0);
+          new (Z) CheckStackOverflowInstr(node->token_pos(), 0);
       // If we are inlining don't actually attach the stack check. We must still
       // create the stack check in order to allocate a deopt id.
       if (!owner()->IsInlining()) {
@@ -4098,8 +3845,7 @@
   if (Isolate::Current()->type_checks() && is_top_level_sequence) {
     const int num_params = function.NumParameters();
     int pos = 0;
-    if (function.IsFactory() ||
-        function.IsDynamicFunction() ||
+    if (function.IsFactory() || function.IsDynamicFunction() ||
         function.IsGenerativeConstructor()) {
       // Skip type checking of type arguments for factory functions.
       // Skip type checking of receiver for instance functions and constructors.
@@ -4108,16 +3854,12 @@
     while (pos < num_params) {
       const LocalVariable& parameter = *scope->VariableAt(pos);
       ASSERT(parameter.owner() == scope);
-      if (!CanSkipTypeCheck(parameter.token_pos(),
-                            NULL,
-                            parameter.type(),
+      if (!CanSkipTypeCheck(parameter.token_pos(), NULL, parameter.type(),
                             parameter.name())) {
         Value* parameter_value =
             Bind(BuildLoadLocal(parameter, parameter.token_pos()));
-        Do(BuildAssertAssignable(parameter.token_pos(),
-                                 parameter_value,
-                                 parameter.type(),
-                                 parameter.name()));
+        Do(BuildAssertAssignable(parameter.token_pos(), parameter_value,
+                                 parameter.type(), parameter.name()));
       }
       pos++;
     }
@@ -4129,11 +3871,10 @@
   // The preamble is generated after visiting the body.
   GotoInstr* preamble_start = NULL;
   if (is_top_level_sequence &&
-      (function.IsAsyncClosure() ||
-          function.IsSyncGenClosure() ||
-          function.IsAsyncGenClosure())) {
-    JoinEntryInstr* preamble_end = new(Z) JoinEntryInstr(
-        owner()->AllocateBlockId(), owner()->try_index());
+      (function.IsAsyncClosure() || function.IsSyncGenClosure() ||
+       function.IsAsyncGenClosure())) {
+    JoinEntryInstr* preamble_end = new (Z)
+        JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
     ASSERT(exit() != NULL);
     exit()->Goto(preamble_end);
     ASSERT(exit()->next()->IsGoto());
@@ -4157,14 +3898,13 @@
   // After generating the CFG for the body we can create the preamble
   // because we know exactly how many continuation states we need.
   if (is_top_level_sequence &&
-      (function.IsAsyncClosure() ||
-          function.IsSyncGenClosure() ||
-          function.IsAsyncGenClosure())) {
+      (function.IsAsyncClosure() || function.IsSyncGenClosure() ||
+       function.IsAsyncGenClosure())) {
     ASSERT(preamble_start != NULL);
     // We are at the top level. Fetch the corresponding scope.
     LocalScope* top_scope = node->scope();
-    LocalVariable* jump_var = top_scope->LookupVariable(
-        Symbols::AwaitJumpVar(), false);
+    LocalVariable* jump_var =
+        top_scope->LookupVariable(Symbols::AwaitJumpVar(), false);
     ASSERT(jump_var != NULL && jump_var->is_captured());
     Instruction* saved_entry = entry_;
     Instruction* saved_exit = exit_;
@@ -4172,27 +3912,24 @@
     exit_ = NULL;
 
     LoadLocalNode* load_jump_count =
-        new(Z) LoadLocalNode(node->token_pos(), jump_var);
+        new (Z) LoadLocalNode(node->token_pos(), jump_var);
     ComparisonNode* check_jump_count;
     const intptr_t num_await_states = owner()->await_joins()->length();
 
-    LocalVariable* old_context = top_scope->LookupVariable(
-        Symbols::AwaitContextVar(), false);
+    LocalVariable* old_context =
+        top_scope->LookupVariable(Symbols::AwaitContextVar(), false);
     for (intptr_t i = 0; i < num_await_states; i++) {
-      check_jump_count = new(Z) ComparisonNode(
-          ST(node->token_pos()),
-          Token::kEQ,
-          load_jump_count,
-          new(Z) LiteralNode(
-              ST(node->token_pos()), Smi::ZoneHandle(Z, Smi::New(i))));
+      check_jump_count = new (Z)
+          ComparisonNode(ST(node->token_pos()), Token::kEQ, load_jump_count,
+                         new (Z) LiteralNode(ST(node->token_pos()),
+                                             Smi::ZoneHandle(Z, Smi::New(i))));
       TestGraphVisitor for_test(owner(), ST(node->token_pos()));
       check_jump_count->Visit(&for_test);
       EffectGraphVisitor for_true(owner());
       EffectGraphVisitor for_false(owner());
 
       // Build async jump or sync yield jump.
-      ASSERT(function.IsAsyncClosure() ||
-             function.IsAsyncGenClosure() ||
+      ASSERT(function.IsAsyncClosure() || function.IsAsyncGenClosure() ||
              function.IsSyncGenClosure());
 
       // Restore the saved continuation context, i.e. the context that was
@@ -4221,8 +3958,7 @@
     exit_ = saved_exit;
   }
 
-  if (is_open() &&
-      (num_context_variables > 0) &&
+  if (is_open() && (num_context_variables > 0) &&
       (!is_top_level_sequence || HasContextScope())) {
     UnchainContexts(1);
   }
@@ -4279,15 +4015,14 @@
   node->try_block()->Visit(&for_try);
 
   if (for_try.is_open()) {
-    JoinEntryInstr* after_try =
-        new(Z) JoinEntryInstr(owner()->AllocateBlockId(),
-                              original_handler_index);
+    JoinEntryInstr* after_try = new (Z)
+        JoinEntryInstr(owner()->AllocateBlockId(), original_handler_index);
     for_try.Goto(after_try);
     for_try.exit_ = after_try;
   }
 
   JoinEntryInstr* try_entry =
-      new(Z) JoinEntryInstr(owner()->AllocateBlockId(), try_handler_index);
+      new (Z) JoinEntryInstr(owner()->AllocateBlockId(), try_handler_index);
 
   Goto(try_entry);
   AppendFragment(try_entry, for_try);
@@ -4299,8 +4034,8 @@
   // If there is a finally block, it is the handler for code in the catch
   // block.
   const intptr_t catch_handler_index = (finally_block == NULL)
-      ? original_handler_index
-      : catch_block->catch_handler_index();
+                                           ? original_handler_index
+                                           : catch_block->catch_handler_index();
 
   const intptr_t prev_catch_try_index = owner()->catch_try_index();
 
@@ -4316,22 +4051,17 @@
   ASSERT(!catch_block->exception_var().is_captured());
   ASSERT(!catch_block->stacktrace_var().is_captured());
 
-  CatchBlockEntryInstr* catch_entry =
-      new(Z) CatchBlockEntryInstr(owner()->AllocateBlockId(),
-                                  catch_handler_index,
-                                  owner()->graph_entry(),
-                                  catch_block->handler_types(),
-                                  try_handler_index,
-                                  catch_block->exception_var(),
-                                  catch_block->stacktrace_var(),
-                                  catch_block->needs_stacktrace(),
-                                  Thread::Current()->GetNextDeoptId());
+  CatchBlockEntryInstr* catch_entry = new (Z) CatchBlockEntryInstr(
+      owner()->AllocateBlockId(), catch_handler_index, owner()->graph_entry(),
+      catch_block->handler_types(), try_handler_index,
+      catch_block->exception_var(), catch_block->stacktrace_var(),
+      catch_block->needs_stacktrace(), Thread::Current()->GetNextDeoptId());
   owner()->AddCatchEntry(catch_entry);
   AppendFragment(catch_entry, for_catch);
 
   if (for_catch.is_open()) {
-    JoinEntryInstr* join = new(Z) JoinEntryInstr(owner()->AllocateBlockId(),
-                                                 original_handler_index);
+    JoinEntryInstr* join = new (Z)
+        JoinEntryInstr(owner()->AllocateBlockId(), original_handler_index);
     for_catch.Goto(join);
     if (is_open()) Goto(join);
     exit_ = join;
@@ -4356,23 +4086,18 @@
           catch_block->rethrow_stacktrace_var(), finally_block->token_pos()));
       for_finally.PushArgument(stacktrace);
       for_finally.AddInstruction(
-          new(Z) ReThrowInstr(catch_block->token_pos(), catch_handler_index));
+          new (Z) ReThrowInstr(catch_block->token_pos(), catch_handler_index));
       for_finally.CloseFragment();
     }
     ASSERT(!for_finally.is_open());
 
     const Array& types = Array::ZoneHandle(Z, Array::New(1, Heap::kOld));
     types.SetAt(0, Object::dynamic_type());
-    CatchBlockEntryInstr* finally_entry =
-        new(Z) CatchBlockEntryInstr(owner()->AllocateBlockId(),
-                                    original_handler_index,
-                                    owner()->graph_entry(),
-                                    types,
-                                    catch_handler_index,
-                                    catch_block->exception_var(),
-                                    catch_block->stacktrace_var(),
-                                    catch_block->needs_stacktrace(),
-                                    Thread::Current()->GetNextDeoptId());
+    CatchBlockEntryInstr* finally_entry = new (Z) CatchBlockEntryInstr(
+        owner()->AllocateBlockId(), original_handler_index,
+        owner()->graph_entry(), types, catch_handler_index,
+        catch_block->exception_var(), catch_block->stacktrace_var(),
+        catch_block->needs_stacktrace(), Thread::Current()->GetNextDeoptId());
     owner()->AddCatchEntry(finally_entry);
     AppendFragment(finally_entry, for_finally);
   }
@@ -4400,39 +4125,30 @@
   if (save_last_arg) {
     temp = owner()->parsed_function().expression_temp_var();
   }
-  ArgumentListNode* args =
-      Parser::BuildNoSuchMethodArguments(args_pos,
-                                         method_name,
-                                         *method_arguments,
-                                         temp,
-                                         is_super_invocation);
+  ArgumentListNode* args = Parser::BuildNoSuchMethodArguments(
+      args_pos, method_name, *method_arguments, temp, is_super_invocation);
   // Make sure we resolve to a compatible noSuchMethod, otherwise call
   // noSuchMethod of class Object.
   const int kNumArguments = 2;
   ArgumentsDescriptor args_desc(
       Array::ZoneHandle(Z, ArgumentsDescriptor::New(kNumArguments)));
-  Function& no_such_method_func = Function::ZoneHandle(Z,
-      Resolver::ResolveDynamicForReceiverClass(target_class,
-                                               Symbols::NoSuchMethod(),
-                                               args_desc));
+  Function& no_such_method_func = Function::ZoneHandle(
+      Z, Resolver::ResolveDynamicForReceiverClass(
+             target_class, Symbols::NoSuchMethod(), args_desc));
   if (no_such_method_func.IsNull()) {
     const Class& object_class =
         Class::ZoneHandle(Z, isolate()->object_store()->object_class());
-    no_such_method_func =
-        Resolver::ResolveDynamicForReceiverClass(object_class,
-                                                 Symbols::NoSuchMethod(),
-                                                 args_desc);
+    no_such_method_func = Resolver::ResolveDynamicForReceiverClass(
+        object_class, Symbols::NoSuchMethod(), args_desc);
   }
   // We are guaranteed to find noSuchMethod of class Object.
   ASSERT(!no_such_method_func.IsNull());
   ZoneGrowableArray<PushArgumentInstr*>* push_arguments =
-      new(Z) ZoneGrowableArray<PushArgumentInstr*>(2);
+      new (Z) ZoneGrowableArray<PushArgumentInstr*>(2);
   BuildPushArguments(*args, push_arguments);
-  return new(Z) StaticCallInstr(args_pos,
-                                no_such_method_func,
-                                Object::null_array(),
-                                push_arguments,
-                                owner()->ic_data_array());
+  return new (Z)
+      StaticCallInstr(args_pos, no_such_method_func, Object::null_array(),
+                      push_arguments, owner()->ic_data_array());
 }
 
 
@@ -4443,43 +4159,41 @@
     ArgumentListNode* function_arguments,
     int invocation_type) {
   ZoneGrowableArray<PushArgumentInstr*>* arguments =
-      new(Z) ZoneGrowableArray<PushArgumentInstr*>();
+      new (Z) ZoneGrowableArray<PushArgumentInstr*>();
   // Object receiver, actually a class literal of the unresolved method's owner.
   AbstractType& type = Type::ZoneHandle(
       Z,
-      Type::New(function_class,
-                TypeArguments::Handle(Z, TypeArguments::null()),
-                token_pos,
-                Heap::kOld));
-  type ^= ClassFinalizer::FinalizeType(
-      function_class, type, ClassFinalizer::kCanonicalize);
-  Value* receiver_value = Bind(new(Z) ConstantInstr(type));
+      Type::New(function_class, TypeArguments::Handle(Z, TypeArguments::null()),
+                token_pos, Heap::kOld));
+  type ^= ClassFinalizer::FinalizeType(function_class, type,
+                                       ClassFinalizer::kCanonicalize);
+  Value* receiver_value = Bind(new (Z) ConstantInstr(type));
   arguments->Add(PushArgument(receiver_value));
   // String memberName.
   const String& member_name =
       String::ZoneHandle(Z, Symbols::New(T, function_name));
-  Value* member_name_value = Bind(new(Z) ConstantInstr(member_name));
+  Value* member_name_value = Bind(new (Z) ConstantInstr(member_name));
   arguments->Add(PushArgument(member_name_value));
   // Smi invocation_type.
-  Value* invocation_type_value = Bind(new(Z) ConstantInstr(
-      Smi::ZoneHandle(Z, Smi::New(invocation_type))));
+  Value* invocation_type_value = Bind(
+      new (Z) ConstantInstr(Smi::ZoneHandle(Z, Smi::New(invocation_type))));
   arguments->Add(PushArgument(invocation_type_value));
   // List arguments.
   if (function_arguments == NULL) {
-    Value* arguments_value = Bind(
-        new(Z) ConstantInstr(Array::ZoneHandle(Z, Array::null())));
+    Value* arguments_value =
+        Bind(new (Z) ConstantInstr(Array::ZoneHandle(Z, Array::null())));
     arguments->Add(PushArgument(arguments_value));
   } else {
     ValueGraphVisitor array_val(owner());
     ArrayNode* array =
-        new(Z) ArrayNode(token_pos, Type::ZoneHandle(Z, Type::ArrayType()),
-                      function_arguments->nodes());
+        new (Z) ArrayNode(token_pos, Type::ZoneHandle(Z, Type::ArrayType()),
+                          function_arguments->nodes());
     array->Visit(&array_val);
     Append(array_val);
     arguments->Add(PushArgument(array_val.value()));
   }
   // List argumentNames.
-  ConstantInstr* cinstr = new(Z) ConstantInstr(
+  ConstantInstr* cinstr = new (Z) ConstantInstr(
       (function_arguments == NULL) ? Array::ZoneHandle(Z, Array::null())
                                    : function_arguments->names());
   Value* argument_names_value = Bind(cinstr);
@@ -4487,25 +4201,21 @@
 
   // List existingArgumentNames.
   Value* existing_argument_names_value =
-      Bind(new(Z) ConstantInstr(Array::ZoneHandle(Z, Array::null())));
+      Bind(new (Z) ConstantInstr(Array::ZoneHandle(Z, Array::null())));
   arguments->Add(PushArgument(existing_argument_names_value));
   // Resolve and call NoSuchMethodError._throwNew.
   const Library& core_lib = Library::Handle(Z, Library::CoreLibrary());
-  const Class& cls = Class::Handle(
-      Z, core_lib.LookupClass(Symbols::NoSuchMethodError()));
+  const Class& cls =
+      Class::Handle(Z, core_lib.LookupClass(Symbols::NoSuchMethodError()));
   ASSERT(!cls.IsNull());
   const Function& func = Function::ZoneHandle(
-      Z,
-      Resolver::ResolveStatic(cls,
-                              Library::PrivateCoreLibName(Symbols::ThrowNew()),
-                              arguments->length(),
-                              Object::null_array()));
+      Z, Resolver::ResolveStatic(
+             cls, Library::PrivateCoreLibName(Symbols::ThrowNew()),
+             arguments->length(), Object::null_array()));
   ASSERT(!func.IsNull());
-  return new(Z) StaticCallInstr(token_pos,
-                                func,
-                                Object::null_array(),  // No names.
-                                arguments,
-                                owner()->ic_data_array());
+  return new (Z) StaticCallInstr(token_pos, func,
+                                 Object::null_array(),  // No names.
+                                 arguments, owner()->ic_data_array());
 }
 
 
@@ -4514,7 +4224,7 @@
     if (node->exception()->IsLiteralNode() ||
         node->exception()->IsLoadLocalNode() ||
         node->exception()->IsClosureNode()) {
-      AddInstruction(new(Z) DebugStepCheckInstr(
+      AddInstruction(new (Z) DebugStepCheckInstr(
           node->token_pos(), RawPcDescriptors::kRuntimeCall));
     }
   }
@@ -4524,13 +4234,13 @@
   PushArgument(for_exception.value());
   Instruction* instr = NULL;
   if (node->stacktrace() == NULL) {
-    instr = new(Z) ThrowInstr(node->token_pos());
+    instr = new (Z) ThrowInstr(node->token_pos());
   } else {
     ValueGraphVisitor for_stack_trace(owner());
     node->stacktrace()->Visit(&for_stack_trace);
     Append(for_stack_trace);
     PushArgument(for_stack_trace.value());
-    instr = new(Z) ReThrowInstr(node->token_pos(), owner()->catch_try_index());
+    instr = new (Z) ReThrowInstr(node->token_pos(), owner()->catch_try_index());
   }
   AddInstruction(instr);
 }
@@ -4547,8 +4257,8 @@
 // so that the fragment is not closed in the middle of an expression.
 void ValueGraphVisitor::VisitThrowNode(ThrowNode* node) {
   BuildThrowNode(node);
-  ReturnDefinition(new(Z) ConstantInstr(
-      Instance::ZoneHandle(Z, Instance::null())));
+  ReturnDefinition(
+      new (Z) ConstantInstr(Instance::ZoneHandle(Z, Instance::null())));
 }
 
 
@@ -4570,7 +4280,7 @@
   // context variable.
 
   JoinEntryInstr* finally_entry =
-      new(Z) JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
+      new (Z) JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
   EffectGraphVisitor for_finally_block(owner());
   for_finally_block.AdjustContextLevel(node->finally_block()->scope());
   node->finally_block()->Visit(&for_finally_block);
@@ -4580,8 +4290,8 @@
   }
 
   if (for_finally_block.is_open()) {
-    JoinEntryInstr* after_finally =
-        new(Z) JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
+    JoinEntryInstr* after_finally = new (Z)
+        JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
     for_finally_block.Goto(after_finally);
     for_finally_block.exit_ = after_finally;
   }
@@ -4593,13 +4303,12 @@
 
 
 void EffectGraphVisitor::VisitStopNode(StopNode* node) {
-  AddInstruction(new(Z) StopInstr(node->message()));
+  AddInstruction(new (Z) StopInstr(node->message()));
 }
 
 
 FlowGraph* FlowGraphBuilder::BuildGraph() {
-  VMTagScope tagScope(thread(),
-                      VMTag::kCompileFlowGraphBuilderTagId,
+  VMTagScope tagScope(thread(), VMTag::kCompileFlowGraphBuilderTagId,
                       FLAG_profile_vm);
   if (FLAG_support_ast_printer && FLAG_print_ast) {
     // Print the function ast before IL generation.
@@ -4610,11 +4319,10 @@
     AstPrinter ast_printer;
     ast_printer.PrintFunctionScope(parsed_function());
   }
-  TargetEntryInstr* normal_entry =
-      new(Z) TargetEntryInstr(AllocateBlockId(),
-                              CatchClauseNode::kInvalidTryIndex);
+  TargetEntryInstr* normal_entry = new (Z)
+      TargetEntryInstr(AllocateBlockId(), CatchClauseNode::kInvalidTryIndex);
   graph_entry_ =
-      new(Z) GraphEntryInstr(parsed_function(), normal_entry, osr_id_);
+      new (Z) GraphEntryInstr(parsed_function(), normal_entry, osr_id_);
   EffectGraphVisitor for_effect(this);
   parsed_function().node_sequence()->Visit(&for_effect);
   AppendFragment(normal_entry, for_effect);
@@ -4629,16 +4337,16 @@
   }
 
   FlowGraph* graph =
-      new(Z) FlowGraph(parsed_function(), graph_entry_, last_used_block_id_);
+      new (Z) FlowGraph(parsed_function(), graph_entry_, last_used_block_id_);
   return graph;
 }
 
 
 void FlowGraphBuilder::PruneUnreachable() {
   ASSERT(osr_id_ != Compiler::kNoOSRDeoptId);
-  BitVector* block_marks = new(Z) BitVector(Z, last_used_block_id_ + 1);
-  bool found = graph_entry_->PruneUnreachable(graph_entry_, NULL, osr_id_,
-                                              block_marks);
+  BitVector* block_marks = new (Z) BitVector(Z, last_used_block_id_ + 1);
+  bool found =
+      graph_entry_->PruneUnreachable(graph_entry_, NULL, osr_id_, block_marks);
   ASSERT(found);
 }
 
diff --git a/runtime/vm/flow_graph_builder.h b/runtime/vm/flow_graph_builder.h
index 19dc316..8db4aae 100644
--- a/runtime/vm/flow_graph_builder.h
+++ b/runtime/vm/flow_graph_builder.h
@@ -30,10 +30,10 @@
 
 // A class to collect the exits from an inlined function during graph
 // construction so they can be plugged into the caller's flow graph.
-class InlineExitCollector: public ZoneAllocated {
+class InlineExitCollector : public ZoneAllocated {
  public:
   InlineExitCollector(FlowGraph* caller_graph, Definition* call)
-      : caller_graph_(caller_graph), call_(call), exits_(4) { }
+      : caller_graph_(caller_graph), call_(call), exits_(4) {}
 
   void AddExit(ReturnInstr* exit);
 
@@ -70,13 +70,9 @@
     return ReturnAt(i)->previous();
   }
 
-  Value* ValueAt(intptr_t i) const {
-    return ReturnAt(i)->value();
-  }
+  Value* ValueAt(intptr_t i) const { return ReturnAt(i)->value(); }
 
-  ReturnInstr* ReturnAt(intptr_t i) const {
-    return exits_[i].exit_return;
-  }
+  ReturnInstr* ReturnAt(intptr_t i) const { return exits_[i].exit_return; }
 
   static int LowestBlockIdFirst(const Data* a, const Data* b);
   void SortExits();
@@ -140,19 +136,11 @@
 
   void AddCatchEntry(CatchBlockEntryInstr* entry);
 
-  GraphEntryInstr* graph_entry() const {
-    return graph_entry_;
-  }
+  GraphEntryInstr* graph_entry() const { return graph_entry_; }
 
-  intptr_t num_copied_params() const {
-    return num_copied_params_;
-  }
-  intptr_t num_non_copied_params() const {
-    return num_non_copied_params_;
-  }
-  intptr_t num_stack_locals() const {
-    return num_stack_locals_;
-  }
+  intptr_t num_copied_params() const { return num_copied_params_; }
+  intptr_t num_non_copied_params() const { return num_non_copied_params_; }
+  intptr_t num_stack_locals() const { return num_stack_locals_; }
 
   bool IsInlining() const { return (exit_collector_ != NULL); }
   InlineExitCollector* exit_collector() const { return exit_collector_; }
@@ -241,9 +229,7 @@
 class EffectGraphVisitor : public AstNodeVisitor {
  public:
   explicit EffectGraphVisitor(FlowGraphBuilder* owner)
-      : owner_(owner),
-        entry_(NULL),
-        exit_(NULL) { }
+      : owner_(owner), entry_(NULL), exit_(NULL) {}
 
 #define DECLARE_VISIT(BaseName)                                                \
   virtual void Visit##BaseName##Node(BaseName##Node* node);
@@ -309,19 +295,16 @@
                               TokenPosition token_pos);
   Definition* BuildLoadLocal(const LocalVariable& local,
                              TokenPosition token_pos);
-  LoadLocalInstr* BuildLoadThisVar(LocalScope* scope,
-                                   TokenPosition token_pos);
-  LoadFieldInstr* BuildNativeGetter(
-      NativeBodyNode* node,
-      MethodRecognizer::Kind kind,
-      intptr_t offset,
-      const Type& type,
-      intptr_t class_id);
+  LoadLocalInstr* BuildLoadThisVar(LocalScope* scope, TokenPosition token_pos);
+  LoadFieldInstr* BuildNativeGetter(NativeBodyNode* node,
+                                    MethodRecognizer::Kind kind,
+                                    intptr_t offset,
+                                    const Type& type,
+                                    intptr_t class_id);
   // Assumes setter parameter is named 'value'. Returns null constant.
-  ConstantInstr* DoNativeSetterStoreValue(
-      NativeBodyNode* node,
-      intptr_t offset,
-      StoreBarrierType emit_store_barrier);
+  ConstantInstr* DoNativeSetterStoreValue(NativeBodyNode* node,
+                                          intptr_t offset,
+                                          StoreBarrierType emit_store_barrier);
 
   // Helpers for translating parts of the AST.
   void BuildPushArguments(const ArgumentListNode& node,
@@ -330,9 +313,8 @@
   // Creates an instantiated type argument vector used in preparation of an
   // allocation call.
   // May be called only if allocating an object of a parameterized class.
-  Value* BuildInstantiatedTypeArguments(
-      TokenPosition token_pos,
-      const TypeArguments& type_arguments);
+  Value* BuildInstantiatedTypeArguments(TokenPosition token_pos,
+                                        const TypeArguments& type_arguments);
 
   void BuildTypecheckPushArguments(
       TokenPosition token_pos,
@@ -394,8 +376,7 @@
   void BuildConstructorCall(ConstructorCallNode* node,
                             PushArgumentInstr* alloc_value);
 
-  void BuildSaveContext(const LocalVariable& variable,
-                        TokenPosition token_pos);
+  void BuildSaveContext(const LocalVariable& variable, TokenPosition token_pos);
   void BuildRestoreContext(const LocalVariable& variable,
                            TokenPosition token_pos);
 
@@ -452,9 +433,7 @@
   friend class TempLocalScope;  // For ReturnDefinition.
 
   // Helper to drop the result value.
-  virtual void ReturnValue(Value* value) {
-    Do(new DropTempsInstr(0, value));
-  }
+  virtual void ReturnValue(Value* value) { Do(new DropTempsInstr(0, value)); }
 
   // Specify a definition of the final result.  Adds the definition to
   // the graph, but normally overridden in subclasses.
@@ -483,7 +462,7 @@
 class ValueGraphVisitor : public EffectGraphVisitor {
  public:
   explicit ValueGraphVisitor(FlowGraphBuilder* owner)
-      : EffectGraphVisitor(owner), value_(NULL) { }
+      : EffectGraphVisitor(owner), value_(NULL) {}
 
   // Visit functions overridden by this class.
   virtual void VisitAssignableNode(AssignableNode* node);
@@ -540,12 +519,11 @@
 // condition of the test is of type bool.
 class TestGraphVisitor : public ValueGraphVisitor {
  public:
-  TestGraphVisitor(FlowGraphBuilder* owner,
-                   TokenPosition condition_token_pos)
+  TestGraphVisitor(FlowGraphBuilder* owner, TokenPosition condition_token_pos)
       : ValueGraphVisitor(owner),
         true_successor_addresses_(1),
         false_successor_addresses_(1),
-        condition_token_pos_(condition_token_pos) { }
+        condition_token_pos_(condition_token_pos) {}
 
   void IfFalseGoto(JoinEntryInstr* join) const;
   void IfTrueGoto(JoinEntryInstr* join) const;
@@ -570,11 +548,10 @@
   void MergeBranchWithNegate(BooleanNegateInstr* comp);
 
   BlockEntryInstr* CreateSuccessorFor(
-    const GrowableArray<TargetEntryInstr**>& branches) const;
+      const GrowableArray<TargetEntryInstr**>& branches) const;
 
-  void ConnectBranchesTo(
-    const GrowableArray<TargetEntryInstr**>& branches,
-    JoinEntryInstr* join) const;
+  void ConnectBranchesTo(const GrowableArray<TargetEntryInstr**>& branches,
+                         JoinEntryInstr* join) const;
 
   // Output parameters.
   GrowableArray<TargetEntryInstr**> true_successor_addresses_;
diff --git a/runtime/vm/flow_graph_builder_test.cc b/runtime/vm/flow_graph_builder_test.cc
index 10f93cb..9de7a0c 100644
--- a/runtime/vm/flow_graph_builder_test.cc
+++ b/runtime/vm/flow_graph_builder_test.cc
@@ -24,8 +24,7 @@
 
 class SourcePositionTest : public ValueObject {
  public:
-  SourcePositionTest(Thread* thread,
-                     const char* script)
+  SourcePositionTest(Thread* thread, const char* script)
       : thread_(thread),
         isolate_(thread->isolate()),
         script_(script),
@@ -40,8 +39,8 @@
     EXPECT_VALID(lib);
     root_lib_ ^= Api::UnwrapHandle(lib);
     EXPECT(!root_lib_.IsNull());
-    root_script_ ^= root_lib_.LookupScript(
-        String::Handle(String::New(USER_TEST_URI)));
+    root_script_ ^=
+        root_lib_.LookupScript(String::Handle(String::New(USER_TEST_URI)));
     EXPECT(!root_script_.IsNull());
   }
 
@@ -57,15 +56,12 @@
         Function::Handle(GetFunction(root_lib_, function_name));
     ZoneGrowableArray<const ICData*>* ic_data_array =
         new ZoneGrowableArray<const ICData*>();
-    ParsedFunction* parsed_function = new ParsedFunction(
-        thread_, Function::ZoneHandle(function.raw()));
+    ParsedFunction* parsed_function =
+        new ParsedFunction(thread_, Function::ZoneHandle(function.raw()));
     Parser::ParseFunction(parsed_function);
     parsed_function->AllocateVariables();
-    FlowGraphBuilder builder(
-        *parsed_function,
-        *ic_data_array,
-        NULL,
-        Compiler::kNoOSRDeoptId);
+    FlowGraphBuilder builder(*parsed_function, *ic_data_array, NULL,
+                             Compiler::kNoOSRDeoptId);
     graph_ = builder.BuildGraph();
     EXPECT(graph_ != NULL);
     blocks_ = graph_->CodegenBlockOrder(optimized);
@@ -98,9 +94,7 @@
   }
 
   // Expect to find an instance call at |line| and |column|.
-  void InstanceCallAt(const char* needle,
-                      intptr_t line,
-                      intptr_t column = -1) {
+  void InstanceCallAt(const char* needle, intptr_t line, intptr_t column = -1) {
     ZoneGrowableArray<Instruction*>* instructions =
         FindInstructionsAt(line, column);
     intptr_t count = 0;
@@ -119,9 +113,7 @@
 
   // Expect to find at least one static call at |line| and |column|. The
   // static call will have |needle| in its |ToCString| representation.
-  void StaticCallAt(const char* needle,
-                    intptr_t line,
-                    intptr_t column = -1) {
+  void StaticCallAt(const char* needle, intptr_t line, intptr_t column = -1) {
     ZoneGrowableArray<Instruction*>* instructions =
         FindInstructionsAt(line, column);
     intptr_t count = 0;
@@ -196,20 +188,13 @@
     }
     intptr_t token_line = -1;
     intptr_t token_column = -1;
-    root_script_.GetTokenLocation(token_pos,
-                                  &token_line,
-                                  &token_column,
-                                  NULL);
+    root_script_.GetTokenLocation(token_pos, &token_line, &token_column, NULL);
     if (synthetic) {
-      THR_Print("      *%02d:%02d -- %s\n",
-                static_cast<int>(token_line),
-                static_cast<int>(token_column),
-                instr->ToCString());
+      THR_Print("      *%02d:%02d -- %s\n", static_cast<int>(token_line),
+                static_cast<int>(token_column), instr->ToCString());
     } else {
-      THR_Print("       %02d:%02d -- %s\n",
-                static_cast<int>(token_line),
-                static_cast<int>(token_column),
-                instr->ToCString());
+      THR_Print("       %02d:%02d -- %s\n", static_cast<int>(token_line),
+                static_cast<int>(token_column), instr->ToCString());
     }
   }
 
@@ -222,8 +207,8 @@
     return instructions->At(0);
   }
 
-  ZoneGrowableArray<Instruction*>* FindInstructionsAt(
-      intptr_t line, intptr_t column) {
+  ZoneGrowableArray<Instruction*>* FindInstructionsAt(intptr_t line,
+                                                      intptr_t column) {
     ZoneGrowableArray<Instruction*>* instructions =
         new ZoneGrowableArray<Instruction*>();
     for (intptr_t i = 0; i < blocks_->length(); i++) {
@@ -239,9 +224,7 @@
         }
         intptr_t token_line = -1;
         intptr_t token_column = -1;
-        root_script_.GetTokenLocation(token_pos,
-                                      &token_line,
-                                      &token_column,
+        root_script_.GetTokenLocation(token_pos, &token_line, &token_column,
                                       NULL);
         if (token_line == line) {
           if ((column < 0) || (column == token_column)) {
@@ -269,15 +252,15 @@
   }
 
   RawFunction* GetFunction(const Library& lib, const char* name) {
-    const Function& result = Function::Handle(lib.LookupFunctionAllowPrivate(
-        String::Handle(String::New(name))));
+    const Function& result = Function::Handle(
+        lib.LookupFunctionAllowPrivate(String::Handle(String::New(name))));
     EXPECT(!result.IsNull());
     return result.raw();
   }
 
   RawFunction* GetFunction(const Class& cls, const char* name) {
-    const Function& result = Function::Handle(cls.LookupFunctionAllowPrivate(
-        String::Handle(String::New(name))));
+    const Function& result = Function::Handle(
+        cls.LookupFunctionAllowPrivate(String::Handle(String::New(name))));
     EXPECT(!result.IsNull());
     return result.raw();
   }
@@ -656,22 +639,22 @@
   spt.FuzzyInstructionMatchAt("StoreLocal(:switch_expr", 4, 11);
 
   spt.FuzzyInstructionMatchAt("Constant(#1", 5, 10);
-  spt.FuzzyInstructionMatchAt("LoadLocal(:switch_expr", 5, 5);   // 'c'
-  spt.InstanceCallAt(5, 10, Token::kEQ);                         // '1'
+  spt.FuzzyInstructionMatchAt("LoadLocal(:switch_expr", 5, 5);  // 'c'
+  spt.InstanceCallAt(5, 10, Token::kEQ);                        // '1'
 
-  spt.FuzzyInstructionMatchAt("Constant(#3", 5, 20);             // '3'
+  spt.FuzzyInstructionMatchAt("Constant(#3", 5, 20);  // '3'
   spt.FuzzyInstructionMatchAt("DebugStepCheck", 5, 13);
   spt.FuzzyInstructionMatchAt("Return", 5, 13);
 
   spt.FuzzyInstructionMatchAt("Constant(#2", 6, 10);
-  spt.FuzzyInstructionMatchAt("LoadLocal(:switch_expr", 6, 5);   // 'c'
-  spt.InstanceCallAt(6, 10, Token::kEQ);                         // '2'
+  spt.FuzzyInstructionMatchAt("LoadLocal(:switch_expr", 6, 5);  // 'c'
+  spt.InstanceCallAt(6, 10, Token::kEQ);                        // '2'
 
-  spt.FuzzyInstructionMatchAt("Constant(#4", 6, 20);             // '4'
+  spt.FuzzyInstructionMatchAt("Constant(#4", 6, 20);  // '4'
   spt.FuzzyInstructionMatchAt("DebugStepCheck", 6, 13);
   spt.FuzzyInstructionMatchAt("Return", 6, 13);
 
-  spt.FuzzyInstructionMatchAt("Constant(#5", 7, 21);             // '5'
+  spt.FuzzyInstructionMatchAt("Constant(#5", 7, 21);  // '5'
   spt.FuzzyInstructionMatchAt("DebugStepCheck", 7, 14);
   spt.FuzzyInstructionMatchAt("Return", 7, 14);
 
@@ -700,32 +683,32 @@
   spt.FuzzyInstructionMatchAt("DebugStepCheck", 3, 5);
   spt.FuzzyInstructionMatchAt("CheckStackOverflow", 3, 5);
 
-  spt.FuzzyInstructionMatchAt("LoadLocal(:current_context", 4, 3);     // 't'
+  spt.FuzzyInstructionMatchAt("LoadLocal(:current_context", 4, 3);  // 't'
   spt.FuzzyInstructionMatchAt("StoreLocal(:saved_try_context", 4, 3);
 
-  spt.FuzzyInstructionMatchAt("Constant(#A", 5, 11);                   // 'A'
-  spt.FuzzyInstructionMatchAt("Throw", 5, 5);                          // 't'
+  spt.FuzzyInstructionMatchAt("Constant(#A", 5, 11);  // 'A'
+  spt.FuzzyInstructionMatchAt("Throw", 5, 5);         // 't'
 
-  spt.FuzzyInstructionMatchAt("LoadLocal(:saved_try_context", 6, 5);   // 'c'
-  spt.FuzzyInstructionMatchAt("StoreLocal(:current_context", 6, 5);    // 'c'
-  spt.FuzzyInstructionMatchAt("LoadLocal(:exception_var", 6, 5);       // 'c'
-  spt.FuzzyInstructionMatchAt("StoreLocal(e", 6, 5);                   // 'c'
+  spt.FuzzyInstructionMatchAt("LoadLocal(:saved_try_context", 6, 5);  // 'c'
+  spt.FuzzyInstructionMatchAt("StoreLocal(:current_context", 6, 5);   // 'c'
+  spt.FuzzyInstructionMatchAt("LoadLocal(:exception_var", 6, 5);      // 'c'
+  spt.FuzzyInstructionMatchAt("StoreLocal(e", 6, 5);                  // 'c'
 
-  spt.FuzzyInstructionMatchAt("LoadLocal(e", 7, 11);                   // 'e'
+  spt.FuzzyInstructionMatchAt("LoadLocal(e", 7, 11);  // 'e'
 
-  spt.FuzzyInstructionMatchAt("StaticCall", 7, 5);                     // 'p'
+  spt.FuzzyInstructionMatchAt("StaticCall", 7, 5);  // 'p'
 
-  spt.FuzzyInstructionMatchAt("Constant(#77", 8, 12);                  // '7'
-  spt.FuzzyInstructionMatchAt("StoreLocal(:finally_ret_val", 8, 5);    // 'r'
+  spt.FuzzyInstructionMatchAt("Constant(#77", 8, 12);                // '7'
+  spt.FuzzyInstructionMatchAt("StoreLocal(:finally_ret_val", 8, 5);  // 'r'
 
-  spt.FuzzyInstructionMatchAt("Constant(#99", 10, 12);                 // '9'
-  spt.FuzzyInstructionMatchAt("Return", 10, 5);                        // 'r'
+  spt.FuzzyInstructionMatchAt("Constant(#99", 10, 12);  // '9'
+  spt.FuzzyInstructionMatchAt("Return", 10, 5);         // 'r'
 
   spt.FuzzyInstructionMatchAt("LoadLocal(:saved_try_context", 9, 13);  // '{'
   spt.FuzzyInstructionMatchAt("StoreLocal(:current_context", 9, 13);   // '{'
 
-  spt.FuzzyInstructionMatchAt("Constant(#99", 10, 12);                 // '9'
-  spt.FuzzyInstructionMatchAt("Return", 10, 5);                        // 'r'
+  spt.FuzzyInstructionMatchAt("Constant(#99", 10, 12);  // '9'
+  spt.FuzzyInstructionMatchAt("Return", 10, 5);         // 'r'
 
   spt.EnsureSourcePositions();
 }
@@ -746,14 +729,14 @@
 
   SourcePositionTest spt(thread, kScript);
   spt.BuildGraphFor("main");
-  spt.FuzzyInstructionMatchAt("AllocateObject(A)", 6, 15);       // 'A'
-  spt.FuzzyInstructionMatchAt("StaticCall", 6, 15);              // 'A'
-  spt.FuzzyInstructionMatchAt("StoreLocal(z", 6, 9);             // '='
-  spt.InstanceCallAt("set:x", 7, 5);                             // 'x'
-  spt.InstanceCallAt("get:x", 8, 11);                            // 'x'
-  spt.InstanceCallAt("set:y", 8, 5);                             // 'y'
+  spt.FuzzyInstructionMatchAt("AllocateObject(A)", 6, 15);  // 'A'
+  spt.FuzzyInstructionMatchAt("StaticCall", 6, 15);         // 'A'
+  spt.FuzzyInstructionMatchAt("StoreLocal(z", 6, 9);        // '='
+  spt.InstanceCallAt("set:x", 7, 5);                        // 'x'
+  spt.InstanceCallAt("get:x", 8, 11);                       // 'x'
+  spt.InstanceCallAt("set:y", 8, 5);                        // 'y'
 
-  spt.InstanceCallAt("get:y", 9, 12);                            // 'y'
+  spt.InstanceCallAt("get:y", 9, 12);  // 'y'
   spt.FuzzyInstructionMatchAt("DebugStepCheck", 9, 3);
   spt.FuzzyInstructionMatchAt("Return", 9, 3);
 
@@ -808,4 +791,3 @@
 }
 
 }  // namespace dart
-
diff --git a/runtime/vm/flow_graph_compiler.cc b/runtime/vm/flow_graph_compiler.cc
index b983754..dba8c8e 100644
--- a/runtime/vm/flow_graph_compiler.cc
+++ b/runtime/vm/flow_graph_compiler.cc
@@ -30,19 +30,33 @@
 
 namespace dart {
 
-DEFINE_FLAG(bool, enable_simd_inline, true,
-    "Enable inlining of SIMD related method calls.");
-DEFINE_FLAG(bool, inline_smi_string_hashcode, true,
+DEFINE_FLAG(bool,
+            enable_simd_inline,
+            true,
+            "Enable inlining of SIMD related method calls.");
+DEFINE_FLAG(
+    bool,
+    inline_smi_string_hashcode,
+    true,
     "Inline hashcode for Smi and one-byte strings in case of megamorphic call");
-DEFINE_FLAG(int, inline_smi_string_hashcode_ratio, 50,
+DEFINE_FLAG(
+    int,
+    inline_smi_string_hashcode_ratio,
+    50,
     "Minimal hotness (0..100) of one-byte-string before inlining its hashcode");
-DEFINE_FLAG(int, min_optimization_counter_threshold, 5000,
-    "The minimum invocation count for a function.");
-DEFINE_FLAG(int, optimization_counter_scale, 2000,
-    "The scale of invocation count, by size of the function.");
+DEFINE_FLAG(int,
+            min_optimization_counter_threshold,
+            5000,
+            "The minimum invocation count for a function.");
+DEFINE_FLAG(int,
+            optimization_counter_scale,
+            2000,
+            "The scale of invocation count, by size of the function.");
 DEFINE_FLAG(bool, source_lines, false, "Emit source line as assembly comment.");
-DEFINE_FLAG(bool, trace_inlining_intervals, false,
-    "Inlining interval diagnostics");
+DEFINE_FLAG(bool,
+            trace_inlining_intervals,
+            false,
+            "Inlining interval diagnostics");
 
 DECLARE_FLAG(bool, code_comments);
 DECLARE_FLAG(charp, deoptimize_filter);
@@ -79,7 +93,7 @@
     FLAG_inlining_size_threshold = 5;
     FLAG_inline_getters_setters_smaller_than = 5;
     FLAG_inlining_callee_size_threshold = 20;
-    FLAG_inlining_depth_threshold = 2;
+    FLAG_inlining_depth_threshold = 4;
     FLAG_inlining_caller_size_threshold = 1000;
     FLAG_inlining_constant_arguments_max_size_threshold = 100;
     FLAG_inlining_constant_arguments_min_size_threshold = 30;
@@ -164,7 +178,7 @@
 // TODO(srdjan): Add check and code if Smi class is hot.
 bool FlowGraphCompiler::ShouldInlineSmiStringHashCode(const ICData& ic_data) {
   if (!FLAG_inline_smi_string_hashcode ||
-     (ic_data.target_name() != Symbols::hashCode().raw())) {
+      (ic_data.target_name() != Symbols::hashCode().raw())) {
     return false;
   }
   // Precompiled code has no ICData, optimistically inline it.
@@ -192,57 +206,55 @@
     const GrowableArray<const Function*>& inline_id_to_function,
     const GrowableArray<TokenPosition>& inline_id_to_token_pos,
     const GrowableArray<intptr_t>& caller_inline_id)
-      : thread_(Thread::Current()),
-        zone_(Thread::Current()->zone()),
-        assembler_(assembler),
-        parsed_function_(parsed_function),
-        flow_graph_(*flow_graph),
-        block_order_(*flow_graph->CodegenBlockOrder(is_optimizing)),
-        current_block_(NULL),
-        exception_handlers_list_(NULL),
-        pc_descriptors_list_(NULL),
-        stackmap_table_builder_(NULL),
-        code_source_map_builder_(NULL),
-        saved_code_size_(0),
-        block_info_(block_order_.length()),
-        deopt_infos_(),
-        static_calls_target_table_(),
-        is_optimizing_(is_optimizing),
-        may_reoptimize_(false),
-        intrinsic_mode_(false),
-        double_class_(Class::ZoneHandle(
-            isolate()->object_store()->double_class())),
-        mint_class_(Class::ZoneHandle(
-            isolate()->object_store()->mint_class())),
-        float32x4_class_(Class::ZoneHandle(
-            isolate()->object_store()->float32x4_class())),
-        float64x2_class_(Class::ZoneHandle(
-            isolate()->object_store()->float64x2_class())),
-        int32x4_class_(Class::ZoneHandle(
-            isolate()->object_store()->int32x4_class())),
-        list_class_(Class::ZoneHandle(
-            Library::Handle(Library::CoreLibrary()).
-                LookupClass(Symbols::List()))),
-        parallel_move_resolver_(this),
-        pending_deoptimization_env_(NULL),
-        deopt_id_to_ic_data_(NULL),
-        edge_counters_array_(Array::ZoneHandle()),
-        inlined_code_intervals_(Array::ZoneHandle(Object::empty_array().raw())),
-        inline_id_to_function_(inline_id_to_function),
-        inline_id_to_token_pos_(inline_id_to_token_pos),
-        caller_inline_id_(caller_inline_id) {
+    : thread_(Thread::Current()),
+      zone_(Thread::Current()->zone()),
+      assembler_(assembler),
+      parsed_function_(parsed_function),
+      flow_graph_(*flow_graph),
+      block_order_(*flow_graph->CodegenBlockOrder(is_optimizing)),
+      current_block_(NULL),
+      exception_handlers_list_(NULL),
+      pc_descriptors_list_(NULL),
+      stackmap_table_builder_(NULL),
+      code_source_map_builder_(NULL),
+      saved_code_size_(0),
+      block_info_(block_order_.length()),
+      deopt_infos_(),
+      static_calls_target_table_(),
+      is_optimizing_(is_optimizing),
+      may_reoptimize_(false),
+      intrinsic_mode_(false),
+      double_class_(
+          Class::ZoneHandle(isolate()->object_store()->double_class())),
+      mint_class_(Class::ZoneHandle(isolate()->object_store()->mint_class())),
+      float32x4_class_(
+          Class::ZoneHandle(isolate()->object_store()->float32x4_class())),
+      float64x2_class_(
+          Class::ZoneHandle(isolate()->object_store()->float64x2_class())),
+      int32x4_class_(
+          Class::ZoneHandle(isolate()->object_store()->int32x4_class())),
+      list_class_(Class::ZoneHandle(Library::Handle(Library::CoreLibrary())
+                                        .LookupClass(Symbols::List()))),
+      parallel_move_resolver_(this),
+      pending_deoptimization_env_(NULL),
+      deopt_id_to_ic_data_(NULL),
+      edge_counters_array_(Array::ZoneHandle()),
+      inlined_code_intervals_(Array::ZoneHandle(Object::empty_array().raw())),
+      inline_id_to_function_(inline_id_to_function),
+      inline_id_to_token_pos_(inline_id_to_token_pos),
+      caller_inline_id_(caller_inline_id) {
   ASSERT(flow_graph->parsed_function().function().raw() ==
          parsed_function.function().raw());
   if (!is_optimizing) {
     const intptr_t len = thread()->deopt_id();
-    deopt_id_to_ic_data_ = new(zone()) ZoneGrowableArray<const ICData*>(len);
+    deopt_id_to_ic_data_ = new (zone()) ZoneGrowableArray<const ICData*>(len);
     deopt_id_to_ic_data_->SetLength(len);
     for (intptr_t i = 0; i < len; i++) {
       (*deopt_id_to_ic_data_)[i] = NULL;
     }
     // TODO(fschneider): Abstract iteration into ICDataArrayIterator.
-    const Array& old_saved_ic_data = Array::Handle(zone(),
-        flow_graph->function().ic_data_array());
+    const Array& old_saved_ic_data =
+        Array::Handle(zone(), flow_graph->function().ic_data_array());
     const intptr_t saved_len =
         old_saved_ic_data.IsNull() ? 0 : old_saved_ic_data.Length();
     for (intptr_t i = 1; i < saved_len; i++) {
@@ -257,16 +269,12 @@
 
 
 bool FlowGraphCompiler::IsUnboxedField(const Field& field) {
-  bool valid_class = (SupportsUnboxedDoubles() &&
-                      (field.guarded_cid() == kDoubleCid)) ||
-                     (SupportsUnboxedSimd128() &&
-                      (field.guarded_cid() == kFloat32x4Cid)) ||
-                     (SupportsUnboxedSimd128() &&
-                      (field.guarded_cid() == kFloat64x2Cid));
-  return field.is_unboxing_candidate()
-      && !field.is_final()
-      && !field.is_nullable()
-      && valid_class;
+  bool valid_class =
+      (SupportsUnboxedDoubles() && (field.guarded_cid() == kDoubleCid)) ||
+      (SupportsUnboxedSimd128() && (field.guarded_cid() == kFloat32x4Cid)) ||
+      (SupportsUnboxedSimd128() && (field.guarded_cid() == kFloat64x2Cid));
+  return field.is_unboxing_candidate() && !field.is_final() &&
+         !field.is_nullable() && valid_class;
 }
 
 
@@ -278,8 +286,8 @@
 
 
 void FlowGraphCompiler::InitCompiler() {
-  pc_descriptors_list_ = new(zone()) DescriptorList(64);
-  exception_handlers_list_ = new(zone()) ExceptionHandlerList();
+  pc_descriptors_list_ = new (zone()) DescriptorList(64);
+  exception_handlers_list_ = new (zone()) ExceptionHandlerList();
   block_info_.Clear();
   // Conservative detection of leaf routines used to remove the stack check
   // on function entry.
@@ -288,7 +296,7 @@
   // indicating a non-leaf routine and calls without IC data indicating
   // possible reoptimization.
   for (int i = 0; i < block_order_.length(); ++i) {
-    block_info_.Add(new(zone()) BlockInfo());
+    block_info_.Add(new (zone()) BlockInfo());
     if (is_optimizing() && !flow_graph().IsCompiledForOsr()) {
       BlockEntryInstr* entry = block_order_[i];
       for (ForwardInstructionIterator it(entry); !it.Done(); it.Advance()) {
@@ -304,8 +312,7 @@
         if ((ic_data != NULL) && (ic_data->NumberOfUsedChecks() == 0)) {
           may_reoptimize_ = true;
         }
-        if (is_leaf &&
-            !current->IsCheckStackOverflow() &&
+        if (is_leaf && !current->IsCheckStackOverflow() &&
             !current->IsParallelMove()) {
           // Note that we do not care if the code contains instructions that
           // can deoptimize.
@@ -352,8 +359,7 @@
 
 
 bool FlowGraphCompiler::ForceSlowPathForStackOverflow() const {
-  if ((FLAG_stacktrace_every > 0) ||
-      (FLAG_deoptimize_every > 0) ||
+  if ((FLAG_stacktrace_every > 0) || (FLAG_deoptimize_every > 0) ||
       (isolate()->reload_every_n_stack_overflow_checks() > 0)) {
     return true;
   }
@@ -362,8 +368,7 @@
              FLAG_stacktrace_filter) != NULL) {
     return true;
   }
-  if (is_optimizing() &&
-      FLAG_deoptimize_filter != NULL &&
+  if (is_optimizing() && FLAG_deoptimize_filter != NULL &&
       strstr(parsed_function().function().ToFullyQualifiedCString(),
              FLAG_deoptimize_filter) != NULL) {
     return true;
@@ -373,8 +378,7 @@
 
 
 static bool IsEmptyBlock(BlockEntryInstr* block) {
-  return !block->IsCatchBlockEntry() &&
-         !block->HasNonRedundantParallelMove() &&
+  return !block->IsCatchBlockEntry() && !block->HasNonRedundantParallelMove() &&
          block->next()->IsGoto() &&
          !block->next()->AsGoto()->HasNonRedundantParallelMove() &&
          !block->IsIndirectEntry();
@@ -435,12 +439,11 @@
       // Instructions that can be deoptimization targets need to record kDeopt
       // PcDescriptor corresponding to their deopt id. GotoInstr records its
       // own so that it can control the placement.
-      AddCurrentDescriptor(RawPcDescriptors::kDeopt,
-                           instr->deopt_id(),
+      AddCurrentDescriptor(RawPcDescriptors::kDeopt, instr->deopt_id(),
                            instr->token_pos());
     }
     AllocateRegistersLocally(instr);
-  } else if (instr->MayThrow()  &&
+  } else if (instr->MayThrow() &&
              (CurrentTryIndex() != CatchClauseNode::kInvalidTryIndex)) {
     // Optimized try-block: Sync locals to fixed stack locations.
     EmitTrySync(instr, CurrentTryIndex());
@@ -448,7 +451,6 @@
 }
 
 
-
 void FlowGraphCompiler::EmitSourceLine(Instruction* instr) {
   if (!instr->token_pos().IsReal() || (instr->env() == NULL)) {
     return;
@@ -459,10 +461,9 @@
   intptr_t column_nr;
   script.GetTokenLocation(instr->token_pos(), &line_nr, &column_nr);
   const String& line = String::Handle(zone(), script.GetLine(line_nr));
-  assembler()->Comment("Line %" Pd " in '%s':\n           %s",
-      line_nr,
-      instr->env()->function().ToFullyQualifiedCString(),
-      line.ToCString());
+  assembler()->Comment("Line %" Pd " in '%s':\n           %s", line_nr,
+                       instr->env()->function().ToFullyQualifiedCString(),
+                       line.ToCString());
 }
 
 
@@ -473,10 +474,9 @@
   if (Assembler::EmittingComments()) {
     for (intptr_t loop_id = 0; loop_id < loop_headers.length(); ++loop_id) {
       for (BitVector::Iterator loop_it(loop_headers[loop_id]->loop_info());
-           !loop_it.Done();
-           loop_it.Advance()) {
+           !loop_it.Done(); loop_it.Advance()) {
         if (loop_it.Current() == block.preorder_number()) {
-           assembler->Comment("  Loop %" Pd "", loop_id);
+          assembler->Comment("  Loop %" Pd "", loop_id);
         }
       }
     }
@@ -494,8 +494,8 @@
   IntervalStruct(intptr_t s, TokenPosition tp, intptr_t id)
       : start(s), pos(tp), inlining_id(id) {}
   void Dump() {
-    THR_Print("start: 0x%" Px " iid: %" Pd " pos: %s",
-              start, inlining_id, pos.ToCString());
+    THR_Print("start: 0x%" Px " iid: %" Pd " pos: %s", start, inlining_id,
+              pos.ToCString());
   }
 };
 
@@ -562,8 +562,8 @@
           }
         }
       }
-      if (FLAG_code_comments ||
-          FLAG_disassemble || FLAG_disassemble_optimized) {
+      if (FLAG_code_comments || FLAG_disassemble ||
+          FLAG_disassemble_optimized) {
         if (FLAG_source_lines) {
           EmitSourceLine(instr);
         }
@@ -609,8 +609,8 @@
             *inline_id_to_function_.At(intervals[i].inlining_id);
         intervals[i].Dump();
         THR_Print(" parent iid %" Pd " %s\n",
-            caller_inline_id_[intervals[i].inlining_id],
-            function.ToQualifiedCString());
+                  caller_inline_id_[intervals[i].inlining_id],
+                  function.ToQualifiedCString());
       }
 
       const intptr_t id = intervals[i].inlining_id;
@@ -628,8 +628,8 @@
     LogBlock lb;
     THR_Print("Intervals:\n");
     for (intptr_t cc = 0; cc < caller_inline_id_.length(); cc++) {
-      THR_Print("  iid: %" Pd " caller iid: %" Pd "\n",
-          cc, caller_inline_id_[cc]);
+      THR_Print("  iid: %" Pd " caller iid: %" Pd "\n", cc,
+                caller_inline_id_[cc]);
     }
     Smi& temp = Smi::Handle();
     for (intptr_t i = 0; i < inlined_code_intervals_.Length();
@@ -664,7 +664,7 @@
   // Parameters first.
   intptr_t i = 0;
   const intptr_t num_non_copied_params = flow_graph().num_non_copied_params();
-  ParallelMoveInstr* move_instr = new(zone()) ParallelMoveInstr();
+  ParallelMoveInstr* move_instr = new (zone()) ParallelMoveInstr();
   for (; i < num_non_copied_params; ++i) {
     // Don't sync captured parameters. They are not in the environment.
     if (flow_graph().captured_parameters()->Contains(i)) continue;
@@ -717,20 +717,18 @@
     return flow_graph_.graph_entry()->spill_slot_count();
   } else {
     return parsed_function_.num_stack_locals() +
-        parsed_function_.num_copied_params();
+           parsed_function_.num_copied_params();
   }
 }
 
 
-Label* FlowGraphCompiler::GetJumpLabel(
-    BlockEntryInstr* block_entry) const {
+Label* FlowGraphCompiler::GetJumpLabel(BlockEntryInstr* block_entry) const {
   const intptr_t block_index = block_entry->postorder_number();
   return block_info_[block_index]->jump_label();
 }
 
 
-bool FlowGraphCompiler::WasCompacted(
-    BlockEntryInstr* block_entry) const {
+bool FlowGraphCompiler::WasCompacted(BlockEntryInstr* block_entry) const {
   const intptr_t block_index = block_entry->postorder_number();
   return block_info_[block_index]->WasCompacted();
 }
@@ -751,7 +749,7 @@
   Label* true_label = GetJumpLabel(branch->true_successor());
   Label* false_label = GetJumpLabel(branch->false_successor());
   Label* fall_through = NextNonEmptyLabel();
-  BranchLabels result = { true_label, false_label, fall_through };
+  BranchLabels result = {true_label, false_label, fall_through};
   return result;
 }
 
@@ -780,11 +778,8 @@
                                             intptr_t pc_offset,
                                             const Array& handler_types,
                                             bool needs_stacktrace) {
-  exception_handlers_list_->AddHandler(try_index,
-                                       outer_try_index,
-                                       pc_offset,
-                                       handler_types,
-                                       needs_stacktrace);
+  exception_handlers_list_->AddHandler(try_index, outer_try_index, pc_offset,
+                                       handler_types, needs_stacktrace);
 }
 
 
@@ -799,25 +794,22 @@
                                              TokenPosition token_pos) {
   // When running with optimizations disabled, don't emit deopt-descriptors.
   if (!CanOptimize() && (kind == RawPcDescriptors::kDeopt)) return;
-  pc_descriptors_list()->AddDescriptor(kind,
-                                       assembler()->CodeSize(),
-                                       deopt_id,
-                                       token_pos,
-                                       CurrentTryIndex());
+  pc_descriptors_list()->AddDescriptor(kind, assembler()->CodeSize(), deopt_id,
+                                       token_pos, CurrentTryIndex());
 }
 
 
 void FlowGraphCompiler::AddStaticCallTarget(const Function& func) {
   ASSERT(func.IsZoneHandle());
   static_calls_target_table_.Add(
-      new(zone()) StaticCallsStruct(assembler()->CodeSize(), &func, NULL));
+      new (zone()) StaticCallsStruct(assembler()->CodeSize(), &func, NULL));
 }
 
 
 void FlowGraphCompiler::AddStubCallTarget(const Code& code) {
   ASSERT(code.IsZoneHandle());
   static_calls_target_table_.Add(
-      new(zone()) StaticCallsStruct(assembler()->CodeSize(), NULL, &code));
+      new (zone()) StaticCallsStruct(assembler()->CodeSize(), NULL, &code));
 }
 
 
@@ -825,10 +817,9 @@
   ASSERT(is_optimizing());
   ASSERT(!intrinsic_mode());
   CompilerDeoptInfo* info =
-      new(zone()) CompilerDeoptInfo(deopt_id,
-                                    ICData::kDeoptAtCall,
-                                    0,  // No flags.
-                                    pending_deoptimization_env_);
+      new (zone()) CompilerDeoptInfo(deopt_id, ICData::kDeoptAtCall,
+                                     0,  // No flags.
+                                     pending_deoptimization_env_);
   info->set_pc_offset(assembler()->CodeSize());
   deopt_infos_.Add(info);
 }
@@ -841,28 +832,28 @@
 void FlowGraphCompiler::RecordSafepoint(LocationSummary* locs,
                                         intptr_t slow_path_argument_count) {
   if (is_optimizing() || locs->live_registers()->HasUntaggedValues()) {
-    const intptr_t spill_area_size = is_optimizing() ?
-        flow_graph_.graph_entry()->spill_slot_count() : 0;
+    const intptr_t spill_area_size =
+        is_optimizing() ? flow_graph_.graph_entry()->spill_slot_count() : 0;
 
     RegisterSet* registers = locs->live_registers();
     ASSERT(registers != NULL);
-    const intptr_t kFpuRegisterSpillFactor =
-            kFpuRegisterSize / kWordSize;
-    const intptr_t live_registers_size = registers->CpuRegisterCount() +
+    const intptr_t kFpuRegisterSpillFactor = kFpuRegisterSize / kWordSize;
+    const intptr_t live_registers_size =
+        registers->CpuRegisterCount() +
         (registers->FpuRegisterCount() * kFpuRegisterSpillFactor);
 
     BitmapBuilder* bitmap = locs->stack_bitmap();
 
-    // An instruction may have two safepoints in deferred code. The
-    // call to RecordSafepoint has the side-effect of appending the live
-    // registers to the bitmap. This is why the second call to RecordSafepoint
-    // with the same instruction (and same location summary) sees a bitmap that
-    // is larger that StackSize(). It will never be larger than StackSize() +
-    // live_registers_size.
-    // The first safepoint will grow the bitmap to be the size of
-    // spill_area_size but the second safepoint will truncate the bitmap and
-    // append the live registers to it again. The bitmap produced by both calls
-    // will be the same.
+// An instruction may have two safepoints in deferred code. The
+// call to RecordSafepoint has the side-effect of appending the live
+// registers to the bitmap. This is why the second call to RecordSafepoint
+// with the same instruction (and same location summary) sees a bitmap that
+// is larger that StackSize(). It will never be larger than StackSize() +
+// live_registers_size.
+// The first safepoint will grow the bitmap to be the size of
+// spill_area_size but the second safepoint will truncate the bitmap and
+// append the live registers to it again. The bitmap produced by both calls
+// will be the same.
 #if !defined(TARGET_ARCH_DBC)
     ASSERT(bitmap->Length() <= (spill_area_size + live_registers_size));
     bitmap->SetLength(spill_area_size);
@@ -913,8 +904,7 @@
     // The slow path area Outside the spill area contains are live registers
     // and pushed arguments for calls inside the slow path.
     intptr_t slow_path_bit_count = bitmap->Length() - spill_area_size;
-    stackmap_table_builder()->AddEntry(assembler()->CodeSize(),
-                                       bitmap,
+    stackmap_table_builder()->AddEntry(assembler()->CodeSize(), bitmap,
                                        slow_path_bit_count);
   }
 }
@@ -969,8 +959,8 @@
   for (Environment::DeepIterator it(env); !it.Done(); it.Advance()) {
     Location loc = it.CurrentLocation();
     Value* value = it.CurrentValue();
-    it.SetCurrentLocation(loc.RemapForSlowPath(
-        value->definition(), cpu_reg_slots, fpu_reg_slots));
+    it.SetCurrentLocation(loc.RemapForSlowPath(value->definition(),
+                                               cpu_reg_slots, fpu_reg_slots));
   }
 
   return env;
@@ -997,11 +987,8 @@
   }
 
   ASSERT(is_optimizing_);
-  CompilerDeoptInfoWithStub* stub =
-      new(zone()) CompilerDeoptInfoWithStub(deopt_id,
-                                            reason,
-                                            flags,
-                                            pending_deoptimization_env_);
+  CompilerDeoptInfoWithStub* stub = new (zone()) CompilerDeoptInfoWithStub(
+      deopt_id, reason, flags, pending_deoptimization_env_);
   deopt_infos_.Add(stub);
   return stub->entry_label();
 }
@@ -1015,15 +1002,11 @@
   ASSERT(!intrinsic_mode());
   // The pending deoptimization environment may be changed after this deopt is
   // emitted, so we need to make a copy.
-  Environment* env_copy =
-      pending_deoptimization_env_->DeepCopy(zone());
+  Environment* env_copy = pending_deoptimization_env_->DeepCopy(zone());
   CompilerDeoptInfo* info =
-      new(zone()) CompilerDeoptInfo(deopt_id,
-                                    reason,
-                                    flags,
-                                    env_copy);
+      new (zone()) CompilerDeoptInfo(deopt_id, reason, flags, env_copy);
   deopt_infos_.Add(info);
-  assembler()->Deopt(0, /*is_eager =*/ 1);
+  assembler()->Deopt(0, /*is_eager =*/1);
   info->set_pc_offset(assembler()->CodeSize());
 }
 #endif  // defined(TARGET_ARCH_DBC)
@@ -1037,7 +1020,7 @@
   if (FLAG_compiler_stats) {
     Thread* thread = Thread::Current();
     INC_STAT(thread, total_code_size,
-        ExceptionHandlers::InstanceSize(handlers.num_entries()));
+             ExceptionHandlers::InstanceSize(handlers.num_entries()));
     INC_STAT(thread, total_code_size, handlers.num_entries() * sizeof(uword));
   }
 }
@@ -1077,8 +1060,7 @@
       offset = Smi::New(deopt_infos_[i]->pc_offset());
       info = deopt_infos_[i]->CreateDeoptInfo(this, &builder, array);
       reason_and_flags = DeoptTable::EncodeReasonAndFlags(
-          deopt_infos_[i]->reason(),
-          deopt_infos_[i]->flags());
+          deopt_infos_[i]->reason(), deopt_infos_[i]->flags());
       DeoptTable::SetEntry(array, i, offset, info, reason_and_flags);
     }
     return array.raw();
@@ -1126,9 +1108,10 @@
 
 void FlowGraphCompiler::FinalizeStaticCallTargetsTable(const Code& code) {
   ASSERT(code.static_calls_target_table() == Array::null());
-  const Array& targets = Array::Handle(zone(), Array::New(
-      (static_calls_target_table_.length() * Code::kSCallTableEntryLength),
-      Heap::kOld));
+  const Array& targets =
+      Array::Handle(zone(), Array::New((static_calls_target_table_.length() *
+                                        Code::kSCallTableEntryLength),
+                                       Heap::kOld));
   Smi& smi_offset = Smi::Handle(zone());
   for (intptr_t i = 0; i < static_calls_target_table_.length(); i++) {
     const intptr_t target_ix = Code::kSCallTableEntryLength * i;
@@ -1136,16 +1119,15 @@
     targets.SetAt(target_ix + Code::kSCallTableOffsetEntry, smi_offset);
     if (static_calls_target_table_[i]->function != NULL) {
       targets.SetAt(target_ix + Code::kSCallTableFunctionEntry,
-          *static_calls_target_table_[i]->function);
+                    *static_calls_target_table_[i]->function);
     }
     if (static_calls_target_table_[i]->code != NULL) {
       targets.SetAt(target_ix + Code::kSCallTableCodeEntry,
-          *static_calls_target_table_[i]->code);
+                    *static_calls_target_table_[i]->code);
     }
   }
   code.set_static_calls_target_table(targets);
-  INC_STAT(Thread::Current(),
-           total_code_size,
+  INC_STAT(Thread::Current(), total_code_size,
            targets.Length() * sizeof(uword));
 }
 
@@ -1208,17 +1190,16 @@
 // DBC is very different from other architectures in how it performs instance
 // and static calls because it does not use stubs.
 #if !defined(TARGET_ARCH_DBC)
-void FlowGraphCompiler::GenerateInstanceCall(
-    intptr_t deopt_id,
-    TokenPosition token_pos,
-    intptr_t argument_count,
-    LocationSummary* locs,
-    const ICData& ic_data_in) {
+void FlowGraphCompiler::GenerateInstanceCall(intptr_t deopt_id,
+                                             TokenPosition token_pos,
+                                             intptr_t argument_count,
+                                             LocationSummary* locs,
+                                             const ICData& ic_data_in) {
   ICData& ic_data = ICData::ZoneHandle(ic_data_in.Original());
   if (FLAG_precompiled_mode) {
     ic_data = ic_data.AsUnaryClassChecks();
-    EmitSwitchableInstanceCall(ic_data, argument_count,
-                               deopt_id, token_pos, locs);
+    EmitSwitchableInstanceCall(ic_data, argument_count, deopt_id, token_pos,
+                               locs);
     return;
   }
   ASSERT(!ic_data.IsNull());
@@ -1244,22 +1225,19 @@
   }
 
   if (is_optimizing()) {
-    EmitMegamorphicInstanceCall(ic_data_in, argument_count,
-                                deopt_id, token_pos, locs,
-                                CatchClauseNode::kInvalidTryIndex);
+    EmitMegamorphicInstanceCall(ic_data_in, argument_count, deopt_id, token_pos,
+                                locs, CatchClauseNode::kInvalidTryIndex);
     return;
   }
 
   switch (ic_data.NumArgsTested()) {
     case 1:
-      EmitInstanceCall(
-          *StubCode::OneArgCheckInlineCache_entry(), ic_data, argument_count,
-          deopt_id, token_pos, locs);
+      EmitInstanceCall(*StubCode::OneArgCheckInlineCache_entry(), ic_data,
+                       argument_count, deopt_id, token_pos, locs);
       break;
     case 2:
-      EmitInstanceCall(
-          *StubCode::TwoArgsCheckInlineCache_entry(), ic_data, argument_count,
-          deopt_id, token_pos, locs);
+      EmitInstanceCall(*StubCode::TwoArgsCheckInlineCache_entry(), ic_data,
+                       argument_count, deopt_id, token_pos, locs);
       break;
     default:
       UNIMPLEMENTED();
@@ -1275,21 +1253,21 @@
                                            LocationSummary* locs,
                                            const ICData& ic_data_in) {
   const ICData& ic_data = ICData::ZoneHandle(ic_data_in.Original());
-  const Array& arguments_descriptor = Array::ZoneHandle(
-      ic_data.IsNull() ? ArgumentsDescriptor::New(argument_count,
-                                                  argument_names)
-                       : ic_data.arguments_descriptor());
+  const Array& arguments_descriptor =
+      Array::ZoneHandle(ic_data.IsNull() ? ArgumentsDescriptor::New(
+                                               argument_count, argument_names)
+                                         : ic_data.arguments_descriptor());
   if (is_optimizing()) {
-    EmitOptimizedStaticCall(function, arguments_descriptor,
-                            argument_count, deopt_id, token_pos, locs);
+    EmitOptimizedStaticCall(function, arguments_descriptor, argument_count,
+                            deopt_id, token_pos, locs);
   } else {
     ICData& call_ic_data = ICData::ZoneHandle(ic_data.raw());
     if (call_ic_data.IsNull()) {
       const intptr_t kNumArgsChecked = 0;
-      call_ic_data = GetOrAddStaticCallICData(deopt_id,
-                                              function,
-                                              arguments_descriptor,
-                                              kNumArgsChecked)->raw();
+      call_ic_data =
+          GetOrAddStaticCallICData(deopt_id, function, arguments_descriptor,
+                                   kNumArgsChecked)
+              ->raw();
     }
     EmitUnoptimizedStaticCall(argument_count, deopt_id, token_pos, locs,
                               call_ic_data);
@@ -1361,9 +1339,9 @@
 bool FlowGraphCompiler::NeedsEdgeCounter(TargetEntryInstr* block) {
   // Only emit an edge counter if there is not goto at the end of the block,
   // except for the entry block.
-  return (FLAG_reorder_basic_blocks
-      && (!block->last_instruction()->IsGoto()
-          || (block == flow_graph().graph_entry()->normal_entry())));
+  return (FLAG_reorder_basic_blocks &&
+          (!block->last_instruction()->IsGoto() ||
+           (block == flow_graph().graph_entry()->normal_entry())));
 }
 
 
@@ -1383,11 +1361,10 @@
 
 void FlowGraphCompiler::AllocateRegistersLocally(Instruction* instr) {
   ASSERT(!is_optimizing());
-  instr->InitializeLocationSummary(zone(),
-                                   false);  // Not optimizing.
+  instr->InitializeLocationSummary(zone(), false);  // Not optimizing.
 
-  // No need to allocate registers based on LocationSummary on DBC as in
-  // unoptimized mode it's a stack based bytecode just like IR itself.
+// No need to allocate registers based on LocationSummary on DBC as in
+// unoptimized mode it's a stack based bytecode just like IR itself.
 #if !defined(TARGET_ARCH_DBC)
   LocationSummary* locs = instr->locs();
 
@@ -1453,8 +1430,7 @@
     Location loc = locs->temp(i);
     if (loc.IsUnallocated()) {
       ASSERT(loc.policy() == Location::kRequiresRegister);
-      loc = Location::RegisterLocation(
-        AllocateFreeRegister(blocked_registers));
+      loc = Location::RegisterLocation(AllocateFreeRegister(blocked_registers));
       locs->set_temp(i, loc);
     }
   }
@@ -1466,8 +1442,8 @@
       case Location::kPrefersRegister:
       case Location::kRequiresRegister:
       case Location::kWritableRegister:
-        result_location = Location::RegisterLocation(
-            AllocateFreeRegister(blocked_registers));
+        result_location =
+            Location::RegisterLocation(AllocateFreeRegister(blocked_registers));
         break;
       case Location::kSameAsFirstInput:
         result_location = locs->in(0);
@@ -1654,19 +1630,15 @@
 
 
 ParallelMoveResolver::ScratchFpuRegisterScope::ScratchFpuRegisterScope(
-    ParallelMoveResolver* resolver, FpuRegister blocked)
-    : resolver_(resolver),
-      reg_(kNoFpuRegister),
-      spilled_(false) {
+    ParallelMoveResolver* resolver,
+    FpuRegister blocked)
+    : resolver_(resolver), reg_(kNoFpuRegister), spilled_(false) {
   COMPILE_ASSERT(FpuTMP != kNoFpuRegister);
-  uword blocked_mask = ((blocked != kNoFpuRegister) ? 1 << blocked : 0)
-                     | 1 << FpuTMP;
-  reg_ = static_cast<FpuRegister>(
-      resolver_->AllocateScratchRegister(Location::kFpuRegister,
-                                         blocked_mask,
-                                         0,
-                                         kNumberOfFpuRegisters - 1,
-                                         &spilled_));
+  uword blocked_mask =
+      ((blocked != kNoFpuRegister) ? 1 << blocked : 0) | 1 << FpuTMP;
+  reg_ = static_cast<FpuRegister>(resolver_->AllocateScratchRegister(
+      Location::kFpuRegister, blocked_mask, 0, kNumberOfFpuRegisters - 1,
+      &spilled_));
 
   if (spilled_) {
     resolver->SpillFpuScratch(reg_);
@@ -1682,10 +1654,9 @@
 
 
 ParallelMoveResolver::ScratchRegisterScope::ScratchRegisterScope(
-    ParallelMoveResolver* resolver, Register blocked)
-    : resolver_(resolver),
-      reg_(kNoRegister),
-      spilled_(false) {
+    ParallelMoveResolver* resolver,
+    Register blocked)
+    : resolver_(resolver), reg_(kNoRegister), spilled_(false) {
   uword blocked_mask = RegMaskBit(blocked) | kReservedCpuRegisters;
   if (resolver->compiler_->intrinsic_mode()) {
     // Block additional registers that must be preserved for intrinsics.
@@ -1697,11 +1668,8 @@
 #endif
   }
   reg_ = static_cast<Register>(
-      resolver_->AllocateScratchRegister(Location::kRegister,
-                                         blocked_mask,
-                                         0,
-                                         kNumberOfCpuRegisters - 1,
-                                         &spilled_));
+      resolver_->AllocateScratchRegister(Location::kRegister, blocked_mask, 0,
+                                         kNumberOfCpuRegisters - 1, &spilled_));
 
   if (spilled_) {
     resolver->SpillScratch(reg_);
@@ -1756,9 +1724,10 @@
     ASSERT(!res->is_static_call());
     return res;
   }
-  const ICData& ic_data = ICData::ZoneHandle(zone(), ICData::New(
-      parsed_function().function(), target_name,
-      arguments_descriptor, deopt_id, num_args_tested, false));
+  const ICData& ic_data =
+      ICData::ZoneHandle(zone(), ICData::New(parsed_function().function(),
+                                             target_name, arguments_descriptor,
+                                             deopt_id, num_args_tested, false));
 #if defined(TAG_IC_DATA)
   ic_data.set_tag(Instruction::kInstanceCall);
 #endif
@@ -1784,9 +1753,11 @@
     ASSERT(res->is_static_call());
     return res;
   }
-  const ICData& ic_data = ICData::ZoneHandle(zone(), ICData::New(
-      parsed_function().function(), String::Handle(zone(), target.name()),
-      arguments_descriptor, deopt_id, num_args_tested, true));
+  const ICData& ic_data = ICData::ZoneHandle(
+      zone(),
+      ICData::New(parsed_function().function(),
+                  String::Handle(zone(), target.name()), arguments_descriptor,
+                  deopt_id, num_args_tested, true));
   ic_data.AddTarget(target);
 #if defined(TAG_IC_DATA)
   ic_data.set_tag(Instruction::kStaticCall);
@@ -1808,7 +1779,7 @@
     const intptr_t basic_blocks = flow_graph().preorder().length();
     ASSERT(basic_blocks > 0);
     threshold = FLAG_optimization_counter_scale * basic_blocks +
-        FLAG_min_optimization_counter_threshold;
+                FLAG_min_optimization_counter_threshold;
     if (threshold > FLAG_optimization_counter_threshold) {
       threshold = FLAG_optimization_counter_threshold;
     }
@@ -1840,8 +1811,8 @@
   if (inline_id_to_function_.length() == 0) {
     return Object::empty_array().raw();
   }
-  const Array& res = Array::Handle(
-      Array::New(inline_id_to_function_.length(), Heap::kOld));
+  const Array& res =
+      Array::Handle(Array::New(inline_id_to_function_.length(), Heap::kOld));
   for (intptr_t i = 0; i < inline_id_to_function_.length(); i++) {
     res.SetAt(i, *inline_id_to_function_[i]);
   }
@@ -1853,8 +1824,8 @@
   if (inline_id_to_token_pos_.length() == 0) {
     return Object::empty_array().raw();
   }
-  const Array& res = Array::Handle(zone(),
-      Array::New(inline_id_to_token_pos_.length(), Heap::kOld));
+  const Array& res = Array::Handle(
+      zone(), Array::New(inline_id_to_token_pos_.length(), Heap::kOld));
   Smi& smi = Smi::Handle(zone());
   for (intptr_t i = 0; i < inline_id_to_token_pos_.length(); i++) {
     smi = Smi::New(inline_id_to_token_pos_[i].value());
@@ -1868,8 +1839,8 @@
   if (caller_inline_id_.length() == 0) {
     return Object::empty_array().raw();
   }
-  const Array& res = Array::Handle(
-      Array::New(caller_inline_id_.length(), Heap::kOld));
+  const Array& res =
+      Array::Handle(Array::New(caller_inline_id_.length(), Heap::kOld));
   Smi& smi = Smi::Handle();
   for (intptr_t i = 0; i < caller_inline_id_.length(); i++) {
     smi = Smi::New(caller_inline_id_[i]);
@@ -1880,16 +1851,16 @@
 
 
 void FlowGraphCompiler::BeginCodeSourceRange() {
-NOT_IN_PRODUCT(
+#if !defined(PRODUCT)
   // Remember how many bytes of code we emitted so far. This function
   // is called before we call into an instruction's EmitNativeCode.
   saved_code_size_ = assembler()->CodeSize();
-);
+#endif  // !defined(PRODUCT)
 }
 
 
 bool FlowGraphCompiler::EndCodeSourceRange(TokenPosition token_pos) {
-NOT_IN_PRODUCT(
+#if !defined(PRODUCT)
   // This function is called after each instructions' EmitNativeCode.
   if (saved_code_size_ < assembler()->CodeSize()) {
     // We emitted more code, now associate the emitted code chunk with
@@ -1898,7 +1869,7 @@
     BeginCodeSourceRange();
     return true;
   }
-);
+#endif  // !defined(PRODUCT)
   return false;
 }
 
@@ -1906,17 +1877,16 @@
 #if !defined(TARGET_ARCH_DBC)
 // DBC emits calls very differently from other architectures due to its
 // interpreted nature.
-void FlowGraphCompiler::EmitPolymorphicInstanceCall(
-    const ICData& ic_data,
-    intptr_t argument_count,
-    const Array& argument_names,
-    intptr_t deopt_id,
-    TokenPosition token_pos,
-    LocationSummary* locs,
-    bool complete) {
+void FlowGraphCompiler::EmitPolymorphicInstanceCall(const ICData& ic_data,
+                                                    intptr_t argument_count,
+                                                    const Array& argument_names,
+                                                    intptr_t deopt_id,
+                                                    TokenPosition token_pos,
+                                                    LocationSummary* locs,
+                                                    bool complete) {
   if (FLAG_polymorphic_with_deopt) {
-    Label* deopt = AddDeoptStub(deopt_id,
-                                ICData::kDeoptPolymorphicInstanceCallTestFail);
+    Label* deopt =
+        AddDeoptStub(deopt_id, ICData::kDeoptPolymorphicInstanceCallTestFail);
     Label ok;
     EmitTestAndCall(ic_data, argument_count, argument_names,
                     deopt,  // No cid match.
@@ -1927,13 +1897,13 @@
     if (complete) {
       Label ok;
       EmitTestAndCall(ic_data, argument_count, argument_names,
-                      NULL,                      // No cid match.
-                      &ok,                       // Found cid.
+                      NULL,  // No cid match.
+                      &ok,   // Found cid.
                       deopt_id, token_pos, locs, true);
       assembler()->Bind(&ok);
     } else {
-      EmitSwitchableInstanceCall(ic_data, argument_count,
-                                 deopt_id, token_pos, locs);
+      EmitSwitchableInstanceCall(ic_data, argument_count, deopt_id, token_pos,
+                                 locs);
     }
   }
 }
@@ -1953,7 +1923,7 @@
 
     case Instruction::kDropTemps:
       FrameStatePop(instr->locs()->input_count() +
-          instr->AsDropTemps()->num_temps());
+                    instr->AsDropTemps()->num_temps());
       break;
 
     default:
@@ -1973,8 +1943,7 @@
 
 void FlowGraphCompiler::FrameStatePush(Definition* defn) {
   Representation rep = defn->representation();
-  if ((rep == kUnboxedDouble) ||
-      (rep == kUnboxedFloat64x2) ||
+  if ((rep == kUnboxedDouble) || (rep == kUnboxedFloat64x2) ||
       (rep == kUnboxedFloat32x4)) {
     // LoadField instruction lies about its representation in the unoptimized
     // code because Definition::representation() can't depend on the type of
@@ -1992,8 +1961,8 @@
 
 void FlowGraphCompiler::FrameStatePop(intptr_t count) {
   ASSERT(!is_optimizing());
-  frame_state_.TruncateTo(Utils::Maximum(static_cast<intptr_t>(0),
-      frame_state_.length() - count));
+  frame_state_.TruncateTo(
+      Utils::Maximum(static_cast<intptr_t>(0), frame_state_.length() - count));
 }
 
 
diff --git a/runtime/vm/flow_graph_compiler.h b/runtime/vm/flow_graph_compiler.h
index a43c6af..fe777cf 100644
--- a/runtime/vm/flow_graph_compiler.h
+++ b/runtime/vm/flow_graph_compiler.h
@@ -19,7 +19,8 @@
 class FlowGraph;
 class FlowGraphCompiler;
 class Function;
-template <typename T> class GrowableArray;
+template <typename T>
+class GrowableArray;
 class ParsedFunction;
 
 
@@ -124,7 +125,7 @@
         deopt_env_(deopt_env) {
     ASSERT(deopt_env != NULL);
   }
-  virtual ~CompilerDeoptInfo() { }
+  virtual ~CompilerDeoptInfo() {}
 
   RawTypedData* CreateDeoptInfo(FlowGraphCompiler* compiler,
                                 DeoptInfoBuilder* builder,
@@ -175,11 +176,12 @@
 
   const char* Name() const {
     const char* kFormat = "Deopt stub for id %d, reason: %s";
-    const intptr_t len = OS::SNPrint(NULL, 0, kFormat,
-        deopt_id(), DeoptReasonToCString(reason())) + 1;
+    const intptr_t len = OS::SNPrint(NULL, 0, kFormat, deopt_id(),
+                                     DeoptReasonToCString(reason())) +
+                         1;
     char* chars = Thread::Current()->zone()->Alloc<char>(len);
-    OS::SNPrint(chars, len, kFormat,
-        deopt_id(), DeoptReasonToCString(reason()));
+    OS::SNPrint(chars, len, kFormat, deopt_id(),
+                DeoptReasonToCString(reason()));
     return chars;
   }
 
@@ -192,8 +194,8 @@
 
 class SlowPathCode : public ZoneAllocated {
  public:
-  SlowPathCode() : entry_label_(), exit_label_() { }
-  virtual ~SlowPathCode() { }
+  SlowPathCode() : entry_label_(), exit_label_() {}
+  virtual ~SlowPathCode() {}
 
   Label* entry_label() { return &entry_label_; }
   Label* exit_label() { return &exit_label_; }
@@ -217,9 +219,7 @@
   intptr_t cid;
   Function* target;
   intptr_t count;
-  CidTarget(intptr_t cid_arg,
-            Function* target_arg,
-            intptr_t count_arg)
+  CidTarget(intptr_t cid_arg, Function* target_arg, intptr_t count_arg)
       : cid(cid_arg), target(target_arg), count(count_arg) {}
 };
 
@@ -245,9 +245,7 @@
     Label* next_nonempty_label() const { return next_nonempty_label_; }
     void set_next_nonempty_label(Label* label) { next_nonempty_label_ = label; }
 
-    bool WasCompacted() const {
-      return jump_label_ != &block_label_;
-    }
+    bool WasCompacted() const { return jump_label_ != &block_label_; }
 
     // Block compaction is recursive.  Block info for already-compacted
     // blocks is marked so as to avoid cycles in the graph.
@@ -264,14 +262,13 @@
   };
 
  public:
-  FlowGraphCompiler(
-      Assembler* assembler,
-      FlowGraph* flow_graph,
-      const ParsedFunction& parsed_function,
-      bool is_optimizing,
-      const GrowableArray<const Function*>& inline_id_to_function,
-      const GrowableArray<TokenPosition>& inline_id_to_token_pos,
-      const GrowableArray<intptr_t>& caller_inline_id);
+  FlowGraphCompiler(Assembler* assembler,
+                    FlowGraph* flow_graph,
+                    const ParsedFunction& parsed_function,
+                    bool is_optimizing,
+                    const GrowableArray<const Function*>& inline_id_to_function,
+                    const GrowableArray<TokenPosition>& inline_id_to_token_pos,
+                    const GrowableArray<intptr_t>& caller_inline_id);
 
   ~FlowGraphCompiler();
 
@@ -294,13 +291,9 @@
 
   const FlowGraph& flow_graph() const { return flow_graph_; }
 
-  DescriptorList* pc_descriptors_list() const {
-    return pc_descriptors_list_;
-  }
+  DescriptorList* pc_descriptors_list() const { return pc_descriptors_list_; }
   BlockEntryInstr* current_block() const { return current_block_; }
-  void set_current_block(BlockEntryInstr* value) {
-    current_block_ = value;
-  }
+  void set_current_block(BlockEntryInstr* value) { current_block_ = value; }
   static bool CanOptimize();
   bool CanOptimizeFunction() const;
   bool CanOSRFunction() const;
@@ -310,9 +303,7 @@
   void ExitIntrinsicMode();
   bool intrinsic_mode() const { return intrinsic_mode_; }
 
-  Label* intrinsic_slow_path_label() {
-    return &intrinsic_slow_path_label_;
-  }
+  Label* intrinsic_slow_path_label() { return &intrinsic_slow_path_label_; }
 
   bool ForceSlowPathForStackOverflow() const;
 
@@ -341,8 +332,8 @@
                                 const String& dst_name,
                                 LocationSummary* locs);
 
-  // DBC emits calls very differently from all other architectures due to its
-  // interpreted nature.
+// DBC emits calls very differently from all other architectures due to its
+// interpreted nature.
 #if !defined(TARGET_ARCH_DBC)
   void GenerateRuntimeCall(TokenPosition token_pos,
                            intptr_t deopt_id,
@@ -394,8 +385,7 @@
   void GenerateStringTypeCheck(Register kClassIdReg,
                                Label* is_instance_lbl,
                                Label* is_not_instance_lbl);
-  void GenerateListTypeCheck(Register kClassIdReg,
-                             Label* is_instance_lbl);
+  void GenerateListTypeCheck(Register kClassIdReg, Label* is_instance_lbl);
 
   void EmitOptimizedInstanceCall(const StubEntry& stub_entry,
                                  const ICData& ic_data,
@@ -420,14 +410,13 @@
                                    bool complete);
 
   // Pass a value for try-index where block is not available (e.g. slow path).
-  void EmitMegamorphicInstanceCall(
-      const ICData& ic_data,
-      intptr_t argument_count,
-      intptr_t deopt_id,
-      TokenPosition token_pos,
-      LocationSummary* locs,
-      intptr_t try_index,
-      intptr_t slow_path_argument_count = 0);
+  void EmitMegamorphicInstanceCall(const ICData& ic_data,
+                                   intptr_t argument_count,
+                                   intptr_t deopt_id,
+                                   TokenPosition token_pos,
+                                   LocationSummary* locs,
+                                   intptr_t try_index,
+                                   intptr_t slow_path_argument_count = 0);
 
   void EmitSwitchableInstanceCall(const ICData& ic_data,
                                   intptr_t argument_count,
@@ -571,9 +560,7 @@
     return inlined_code_intervals_;
   }
 
-  RawArray* edge_counters_array() const {
-    return edge_counters_array_.raw();
-  }
+  RawArray* edge_counters_array() const { return edge_counters_array_.raw(); }
 
   RawArray* InliningIdToFunction() const;
   RawArray* InliningIdToTokenPos() const;
@@ -591,6 +578,10 @@
   bool EndCodeSourceRange(TokenPosition token_pos);
 
 #if defined(TARGET_ARCH_DBC)
+  void RecordAfterCallHelper(TokenPosition token_pos,
+                             intptr_t deopt_id,
+                             intptr_t argument_count,
+                             LocationSummary* locs);
   void RecordAfterCall(Instruction* instr);
 #endif
 
@@ -624,8 +615,8 @@
                                  LocationSummary* locs,
                                  const ICData& ic_data);
 
-  // DBC handles type tests differently from all other architectures due
-  // to its interpreted nature.
+// DBC handles type tests differently from all other architectures due
+// to its interpreted nature.
 #if !defined(TARGET_ARCH_DBC)
   // Type checking helper methods.
   void CheckClassIds(Register class_id_reg,
@@ -710,9 +701,9 @@
     return stackmap_table_builder_;
   }
 
-  // TODO(vegorov) re-enable frame state tracking on DBC. It is
-  // currently disabled because it relies on LocationSummaries and
-  // we don't use them during unoptimized compilation on DBC.
+// TODO(vegorov) re-enable frame state tracking on DBC. It is
+// currently disabled because it relies on LocationSummaries and
+// we don't use them during unoptimized compilation on DBC.
 #if defined(DEBUG) && !defined(TARGET_ARCH_DBC)
   void FrameStateUpdateWith(Instruction* instr);
   void FrameStatePush(Definition* defn);
diff --git a/runtime/vm/flow_graph_compiler_arm.cc b/runtime/vm/flow_graph_compiler_arm.cc
index bc1ebce..738a2bb 100644
--- a/runtime/vm/flow_graph_compiler_arm.cc
+++ b/runtime/vm/flow_graph_compiler_arm.cc
@@ -118,8 +118,7 @@
 
   // For the innermost environment, set outgoing arguments and the locals.
   for (intptr_t i = current->Length() - 1;
-       i >= current->fixed_parameter_count();
-       i--) {
+       i >= current->fixed_parameter_count(); i--) {
     builder->AddCopy(current->ValueAt(i), current->LocationAt(i), slot_ix++);
   }
 
@@ -132,26 +131,21 @@
 
     // For any outer environment the deopt id is that of the call instruction
     // which is recorded in the outer environment.
-    builder->AddReturnAddress(
-        current->function(),
-        Thread::ToDeoptAfter(current->deopt_id()),
-        slot_ix++);
+    builder->AddReturnAddress(current->function(),
+                              Thread::ToDeoptAfter(current->deopt_id()),
+                              slot_ix++);
 
     // The values of outgoing arguments can be changed from the inlined call so
     // we must read them from the previous environment.
     for (intptr_t i = previous->fixed_parameter_count() - 1; i >= 0; i--) {
-      builder->AddCopy(previous->ValueAt(i),
-                       previous->LocationAt(i),
+      builder->AddCopy(previous->ValueAt(i), previous->LocationAt(i),
                        slot_ix++);
     }
 
     // Set the locals, note that outgoing arguments are not in the environment.
     for (intptr_t i = current->Length() - 1;
-         i >= current->fixed_parameter_count();
-         i--) {
-      builder->AddCopy(current->ValueAt(i),
-                       current->LocationAt(i),
-                       slot_ix++);
+         i >= current->fixed_parameter_count(); i--) {
+      builder->AddCopy(current->ValueAt(i), current->LocationAt(i), slot_ix++);
     }
 
     // Iterate on the outer environment.
@@ -288,7 +282,7 @@
     const TypeArguments& type_arguments =
         TypeArguments::ZoneHandle(zone(), type.arguments());
     const bool is_raw_type = type_arguments.IsNull() ||
-        type_arguments.IsRaw(from_index, num_type_params);
+                             type_arguments.IsRaw(from_index, num_type_params);
     if (is_raw_type) {
       const Register kClassIdReg = R2;
       // dynamic type argument, check only classes.
@@ -304,8 +298,8 @@
     }
     // If one type argument only, check if type argument is Object or dynamic.
     if (type_arguments.Length() == 1) {
-      const AbstractType& tp_argument = AbstractType::ZoneHandle(
-          zone(), type_arguments.TypeAt(0));
+      const AbstractType& tp_argument =
+          AbstractType::ZoneHandle(zone(), type_arguments.TypeAt(0));
       ASSERT(!tp_argument.IsMalformed());
       if (tp_argument.IsType()) {
         ASSERT(tp_argument.HasResolvedTypeClass());
@@ -323,12 +317,9 @@
   const Register kTypeArgumentsReg = kNoRegister;
   const Register kTempReg = kNoRegister;
   // R0: instance (must be preserved).
-  return GenerateCallSubtypeTestStub(kTestTypeTwoArgs,
-                                     kInstanceReg,
-                                     kTypeArgumentsReg,
-                                     kTempReg,
-                                     is_instance_lbl,
-                                     is_not_instance_lbl);
+  return GenerateCallSubtypeTestStub(kTestTypeTwoArgs, kInstanceReg,
+                                     kTypeArgumentsReg, kTempReg,
+                                     is_instance_lbl, is_not_instance_lbl);
 }
 
 
@@ -367,11 +358,8 @@
   __ tst(kInstanceReg, Operand(kSmiTagMask));
   // If instance is Smi, check directly.
   const Class& smi_class = Class::Handle(zone(), Smi::Class());
-  if (smi_class.IsSubtypeOf(TypeArguments::Handle(zone()),
-                            type_class,
-                            TypeArguments::Handle(zone()),
-                            NULL,
-                            NULL,
+  if (smi_class.IsSubtypeOf(TypeArguments::Handle(zone()), type_class,
+                            TypeArguments::Handle(zone()), NULL, NULL,
                             Heap::kOld)) {
     __ b(is_instance_lbl, EQ);
   } else {
@@ -391,8 +379,8 @@
   // Custom checking for numbers (Smi, Mint, Bigint and Double).
   // Note that instance is not Smi (checked above).
   if (type.IsNumberType() || type.IsIntType() || type.IsDoubleType()) {
-    GenerateNumberTypeCheck(
-        kClassIdReg, type, is_instance_lbl, is_not_instance_lbl);
+    GenerateNumberTypeCheck(kClassIdReg, type, is_instance_lbl,
+                            is_not_instance_lbl);
     return false;
   }
   if (type.IsStringType()) {
@@ -439,12 +427,9 @@
 
   const Register kTypeArgumentsReg = kNoRegister;
   const Register kTempReg = kNoRegister;
-  return GenerateCallSubtypeTestStub(kTestTypeOneArg,
-                                     kInstanceReg,
-                                     kTypeArgumentsReg,
-                                     kTempReg,
-                                     is_instance_lbl,
-                                     is_not_instance_lbl);
+  return GenerateCallSubtypeTestStub(kTestTypeOneArg, kInstanceReg,
+                                     kTypeArgumentsReg, kTempReg,
+                                     is_instance_lbl, is_not_instance_lbl);
 }
 
 
@@ -467,7 +452,7 @@
     __ CompareObject(R1, Object::null_object());
     __ b(is_instance_lbl, EQ);
     __ ldr(R2,
-        FieldAddress(R1, TypeArguments::type_at_offset(type_param.index())));
+           FieldAddress(R1, TypeArguments::type_at_offset(type_param.index())));
     // R2: concrete type of type.
     // Check if type argument is dynamic.
     __ CompareObject(R2, Object::dynamic_type());
@@ -493,14 +478,10 @@
     const Register kInstanceReg = R0;
     const Register kTypeArgumentsReg = R1;
     const Register kTempReg = kNoRegister;
-    const SubtypeTestCache& type_test_cache =
-        SubtypeTestCache::ZoneHandle(zone(),
-            GenerateCallSubtypeTestStub(kTestTypeThreeArgs,
-                                        kInstanceReg,
-                                        kTypeArgumentsReg,
-                                        kTempReg,
-                                        is_instance_lbl,
-                                        is_not_instance_lbl));
+    const SubtypeTestCache& type_test_cache = SubtypeTestCache::ZoneHandle(
+        zone(), GenerateCallSubtypeTestStub(
+                    kTestTypeThreeArgs, kInstanceReg, kTypeArgumentsReg,
+                    kTempReg, is_instance_lbl, is_not_instance_lbl));
     __ Bind(&fall_through);
     return type_test_cache.raw();
   }
@@ -513,12 +494,9 @@
     // Uninstantiated type class is known at compile time, but the type
     // arguments are determined at runtime by the instantiator.
     const Register kTempReg = kNoRegister;
-    return GenerateCallSubtypeTestStub(kTestTypeThreeArgs,
-                                       kInstanceReg,
-                                       kTypeArgumentsReg,
-                                       kTempReg,
-                                       is_instance_lbl,
-                                       is_not_instance_lbl);
+    return GenerateCallSubtypeTestStub(kTestTypeThreeArgs, kInstanceReg,
+                                       kTypeArgumentsReg, kTempReg,
+                                       is_instance_lbl, is_not_instance_lbl);
   }
   return SubtypeTestCache::null();
 }
@@ -550,17 +528,12 @@
     // function type) of a non-parameterized class or with a raw dst type of
     // a parameterized class.
     if (type.IsFunctionType() || (type_class.NumTypeArguments() > 0)) {
-      return GenerateInstantiatedTypeWithArgumentsTest(token_pos,
-                                                       type,
-                                                       is_instance_lbl,
-                                                       is_not_instance_lbl);
+      return GenerateInstantiatedTypeWithArgumentsTest(
+          token_pos, type, is_instance_lbl, is_not_instance_lbl);
       // Fall through to runtime call.
     }
-    const bool has_fall_through =
-        GenerateInstantiatedTypeNoArgumentsTest(token_pos,
-                                                type,
-                                                is_instance_lbl,
-                                                is_not_instance_lbl);
+    const bool has_fall_through = GenerateInstantiatedTypeNoArgumentsTest(
+        token_pos, type, is_instance_lbl, is_not_instance_lbl);
     if (has_fall_through) {
       // If test non-conclusive so far, try the inlined type-test cache.
       // 'type' is known at compile time.
@@ -570,9 +543,7 @@
       return SubtypeTestCache::null();
     }
   }
-  return GenerateUninstantiatedTypeTest(token_pos,
-                                        type,
-                                        is_instance_lbl,
+  return GenerateUninstantiatedTypeTest(token_pos, type, is_instance_lbl,
                                         is_not_instance_lbl);
 }
 
@@ -614,8 +585,8 @@
 
   // Generate inline instanceof test.
   SubtypeTestCache& test_cache = SubtypeTestCache::ZoneHandle(zone());
-  test_cache = GenerateInlineInstanceof(token_pos, type,
-                                        &is_instance, &is_not_instance);
+  test_cache =
+      GenerateInlineInstanceof(token_pos, type, &is_instance, &is_not_instance);
 
   // test_cache is null if there is no fall-through.
   Label done;
@@ -624,8 +595,8 @@
     // Load instantiator type arguments (R1).
     __ ldr(R1, Address(SP, 0 * kWordSize));
     __ PushObject(Object::null_object());  // Make room for the result.
-    __ Push(R0);  // Push the instance.
-    __ PushObject(type);  // Push the type.
+    __ Push(R0);                           // Push the instance.
+    __ PushObject(type);                   // Push the type.
     __ Push(R1);  // Push instantiator type arguments (R1).
     __ LoadUniqueObject(R0, test_cache);
     __ Push(R0);
@@ -688,13 +659,10 @@
   // Generate throw new TypeError() if the type is malformed or malbounded.
   if (dst_type.IsMalformedOrMalbounded()) {
     __ PushObject(Object::null_object());  // Make room for the result.
-    __ Push(R0);  // Push the source object.
-    __ PushObject(dst_name);  // Push the name of the destination.
-    __ PushObject(dst_type);  // Push the type of the destination.
-    GenerateRuntimeCall(token_pos,
-                        deopt_id,
-                        kBadTypeErrorRuntimeEntry,
-                        3,
+    __ Push(R0);                           // Push the source object.
+    __ PushObject(dst_name);               // Push the name of the destination.
+    __ PushObject(dst_type);               // Push the type of the destination.
+    GenerateRuntimeCall(token_pos, deopt_id, kBadTypeErrorRuntimeEntry, 3,
                         locs);
     // We should never return here.
     __ bkpt(0);
@@ -707,16 +675,16 @@
 
   // Generate inline type check, linking to runtime call if not assignable.
   SubtypeTestCache& test_cache = SubtypeTestCache::ZoneHandle(zone());
-  test_cache = GenerateInlineInstanceof(token_pos, dst_type,
-                                        &is_assignable, &runtime_call);
+  test_cache = GenerateInlineInstanceof(token_pos, dst_type, &is_assignable,
+                                        &runtime_call);
 
   __ Bind(&runtime_call);
   // Load instantiator type arguments (R1).
   __ ldr(R1, Address(SP, 0 * kWordSize));
   __ PushObject(Object::null_object());  // Make room for the result.
-  __ Push(R0);  // Push the source object.
-  __ PushObject(dst_type);  // Push the type of the destination.
-  __ Push(R1);  // Push instantiator type arguments (R1).
+  __ Push(R0);                           // Push the source object.
+  __ PushObject(dst_type);               // Push the type of the destination.
+  __ Push(R1);              // Push instantiator type arguments (R1).
   __ PushObject(dst_name);  // Push the name of the destination.
   __ LoadUniqueObject(R0, test_cache);
   __ Push(R0);
@@ -805,9 +773,9 @@
   // Copy or initialize optional named arguments.
   Label all_arguments_processed;
 #ifdef DEBUG
-    const bool check_correct_named_args = true;
+  const bool check_correct_named_args = true;
 #else
-    const bool check_correct_named_args = function.IsClosureFunction();
+  const bool check_correct_named_args = function.IsClosureFunction();
 #endif
   if (num_opt_named_params > 0) {
     // Start by alphabetically sorting the names of the optional parameters.
@@ -838,8 +806,8 @@
     __ add(NOTFP, FP, Operand(NOTFP, LSL, 1));
     __ AddImmediate(NOTFP, NOTFP, kParamEndSlotFromFp * kWordSize);
     // Let R8 point to the entry of the first named argument.
-    __ add(R8, R4, Operand(
-        ArgumentsDescriptor::first_named_entry_offset() - kHeapObjectTag));
+    __ add(R8, R4, Operand(ArgumentsDescriptor::first_named_entry_offset() -
+                           kHeapObjectTag));
     for (int i = 0; i < num_opt_named_params; i++) {
       Label load_default_value, assign_optional_parameter;
       const int param_pos = opt_param_position[i];
@@ -978,8 +946,7 @@
 
 void FlowGraphCompiler::EmitFrameEntry() {
   const Function& function = parsed_function().function();
-  if (CanOptimizeFunction() &&
-      function.IsOptimizable() &&
+  if (CanOptimizeFunction() && function.IsOptimizable() &&
       (!is_optimizing() || may_reoptimize())) {
     __ Comment("Invocation Count Check");
     const Register function_reg = R8;
@@ -989,14 +956,12 @@
     // Load function object from object pool.
     __ LoadFunctionFromCalleePool(function_reg, function, new_pp);
 
-    __ ldr(R3, FieldAddress(function_reg,
-                            Function::usage_counter_offset()));
+    __ ldr(R3, FieldAddress(function_reg, Function::usage_counter_offset()));
     // Reoptimization of an optimized function is triggered by counting in
     // IC stubs, but not at the entry of the function.
     if (!is_optimizing()) {
       __ add(R3, R3, Operand(1));
-      __ str(R3, FieldAddress(function_reg,
-                              Function::usage_counter_offset()));
+      __ str(R3, FieldAddress(function_reg, Function::usage_counter_offset()));
     }
     __ CompareImmediate(R3, GetOptimizationThreshold());
     ASSERT(function_reg == R8);
@@ -1004,9 +969,8 @@
   }
   __ Comment("Enter frame");
   if (flow_graph().IsCompiledForOsr()) {
-    intptr_t extra_slots = StackSize()
-        - flow_graph().num_stack_locals()
-        - flow_graph().num_copied_params();
+    intptr_t extra_slots = StackSize() - flow_graph().num_stack_locals() -
+                           flow_graph().num_copied_params();
     ASSERT(extra_slots >= 0);
     __ EnterOsrFrame(extra_slots * kWordSize);
   } else {
@@ -1059,8 +1023,8 @@
       __ ldr(R0, FieldAddress(R4, ArgumentsDescriptor::count_offset()));
       __ CompareImmediate(R0, Smi::RawValue(num_fixed_params));
       __ b(&wrong_num_arguments, NE);
-      __ ldr(R1, FieldAddress(R4,
-                              ArgumentsDescriptor::positional_count_offset()));
+      __ ldr(R1,
+             FieldAddress(R4, ArgumentsDescriptor::positional_count_offset()));
       __ cmp(R0, Operand(R1));
       __ b(&correct_num_arguments, EQ);
       __ Bind(&wrong_num_arguments);
@@ -1146,8 +1110,7 @@
   } else {
     // Add deoptimization continuation point after the call and before the
     // arguments are removed.
-    AddCurrentDescriptor(RawPcDescriptors::kDeopt,
-        deopt_id_after, token_pos);
+    AddCurrentDescriptor(RawPcDescriptors::kDeopt, deopt_id_after, token_pos);
   }
 }
 
@@ -1174,8 +1137,7 @@
   } else {
     // Add deoptimization continuation point after the call and before the
     // arguments are removed.
-    AddCurrentDescriptor(RawPcDescriptors::kDeopt,
-        deopt_id_after, token_pos);
+    AddCurrentDescriptor(RawPcDescriptors::kDeopt, deopt_id_after, token_pos);
   }
   AddStaticCallTarget(target);
 }
@@ -1198,9 +1160,7 @@
     } else {
       // Add deoptimization continuation point after the call and before the
       // arguments are removed.
-      AddCurrentDescriptor(RawPcDescriptors::kDeopt,
-                           deopt_id_after,
-                           token_pos);
+      AddCurrentDescriptor(RawPcDescriptors::kDeopt, deopt_id_after, token_pos);
     }
   }
 }
@@ -1229,13 +1189,12 @@
 }
 
 
-void FlowGraphCompiler::EmitOptimizedInstanceCall(
-    const StubEntry& stub_entry,
-    const ICData& ic_data,
-    intptr_t argument_count,
-    intptr_t deopt_id,
-    TokenPosition token_pos,
-    LocationSummary* locs) {
+void FlowGraphCompiler::EmitOptimizedInstanceCall(const StubEntry& stub_entry,
+                                                  const ICData& ic_data,
+                                                  intptr_t argument_count,
+                                                  intptr_t deopt_id,
+                                                  TokenPosition token_pos,
+                                                  LocationSummary* locs) {
   ASSERT(Array::Handle(zone(), ic_data.arguments_descriptor()).Length() > 0);
   // Each ICData propagated from unoptimized to optimized code contains the
   // function that corresponds to the Dart function of that IC call. Due
@@ -1246,10 +1205,7 @@
 
   __ LoadObject(R8, parsed_function().function());
   __ LoadUniqueObject(R9, ic_data);
-  GenerateDartCall(deopt_id,
-                   token_pos,
-                   stub_entry,
-                   RawPcDescriptors::kIcCall,
+  GenerateDartCall(deopt_id, token_pos, stub_entry, RawPcDescriptors::kIcCall,
                    locs);
   __ Drop(argument_count);
 }
@@ -1263,10 +1219,7 @@
                                          LocationSummary* locs) {
   ASSERT(Array::Handle(zone(), ic_data.arguments_descriptor()).Length() > 0);
   __ LoadUniqueObject(R9, ic_data);
-  GenerateDartCall(deopt_id,
-                   token_pos,
-                   stub_entry,
-                   RawPcDescriptors::kIcCall,
+  GenerateDartCall(deopt_id, token_pos, stub_entry, RawPcDescriptors::kIcCall,
                    locs);
   __ Drop(argument_count);
 }
@@ -1284,7 +1237,8 @@
   const Array& arguments_descriptor =
       Array::ZoneHandle(zone(), ic_data.arguments_descriptor());
   ASSERT(!arguments_descriptor.IsNull() && (arguments_descriptor.Length() > 0));
-  const MegamorphicCache& cache = MegamorphicCache::ZoneHandle(zone(),
+  const MegamorphicCache& cache = MegamorphicCache::ZoneHandle(
+      zone(),
       MegamorphicCacheTable::Lookup(isolate(), name, arguments_descriptor));
 
   __ Comment("MegamorphicCall");
@@ -1306,7 +1260,7 @@
     ASSERT(Smi::New(0) == 0);
     __ cmp(R0, Operand(0));
 
-    __ b(&done, NE);  // Return if already computed.
+    __ b(&done, NE);          // Return if already computed.
     __ mov(R0, Operand(R9));  // Restore receiver in R0.
 
     __ Bind(&megamorphic_call);
@@ -1325,36 +1279,32 @@
     if (try_index == CatchClauseNode::kInvalidTryIndex) {
       try_index = CurrentTryIndex();
     }
-    pc_descriptors_list()->AddDescriptor(RawPcDescriptors::kOther,
-                                         assembler()->CodeSize(),
-                                         Thread::kNoDeoptId,
-                                         token_pos,
-                                         try_index);
+    pc_descriptors_list()->AddDescriptor(
+        RawPcDescriptors::kOther, assembler()->CodeSize(), Thread::kNoDeoptId,
+        token_pos, try_index);
   } else if (is_optimizing()) {
-    AddCurrentDescriptor(RawPcDescriptors::kOther,
-                         Thread::kNoDeoptId, token_pos);
+    AddCurrentDescriptor(RawPcDescriptors::kOther, Thread::kNoDeoptId,
+                         token_pos);
     AddDeoptIndexAtCall(deopt_id_after);
   } else {
-    AddCurrentDescriptor(RawPcDescriptors::kOther,
-        Thread::kNoDeoptId, token_pos);
+    AddCurrentDescriptor(RawPcDescriptors::kOther, Thread::kNoDeoptId,
+                         token_pos);
     // Add deoptimization continuation point after the call and before the
     // arguments are removed.
-    AddCurrentDescriptor(RawPcDescriptors::kDeopt,
-        deopt_id_after, token_pos);
+    AddCurrentDescriptor(RawPcDescriptors::kDeopt, deopt_id_after, token_pos);
   }
   __ Drop(argument_count);
 }
 
 
-void FlowGraphCompiler::EmitSwitchableInstanceCall(
-    const ICData& ic_data,
-    intptr_t argument_count,
-    intptr_t deopt_id,
-    TokenPosition token_pos,
-    LocationSummary* locs) {
+void FlowGraphCompiler::EmitSwitchableInstanceCall(const ICData& ic_data,
+                                                   intptr_t argument_count,
+                                                   intptr_t deopt_id,
+                                                   TokenPosition token_pos,
+                                                   LocationSummary* locs) {
   ASSERT(ic_data.NumArgsTested() == 1);
-  const Code& initial_stub = Code::ZoneHandle(
-      StubCode::ICCallThroughFunction_entry()->code());
+  const Code& initial_stub =
+      Code::ZoneHandle(StubCode::ICCallThroughFunction_entry()->code());
 
   __ Comment("SwitchableCall");
 
@@ -1372,27 +1322,22 @@
   } else {
     // Add deoptimization continuation point after the call and before the
     // arguments are removed.
-    AddCurrentDescriptor(RawPcDescriptors::kDeopt,
-        deopt_id_after, token_pos);
+    AddCurrentDescriptor(RawPcDescriptors::kDeopt, deopt_id_after, token_pos);
   }
   __ Drop(argument_count);
 }
 
 
-void FlowGraphCompiler::EmitUnoptimizedStaticCall(
-    intptr_t argument_count,
-    intptr_t deopt_id,
-    TokenPosition token_pos,
-    LocationSummary* locs,
-    const ICData& ic_data) {
+void FlowGraphCompiler::EmitUnoptimizedStaticCall(intptr_t argument_count,
+                                                  intptr_t deopt_id,
+                                                  TokenPosition token_pos,
+                                                  LocationSummary* locs,
+                                                  const ICData& ic_data) {
   const StubEntry* stub_entry =
       StubCode::UnoptimizedStaticCallEntry(ic_data.NumArgsTested());
   __ LoadObject(R9, ic_data);
-  GenerateDartCall(deopt_id,
-                   token_pos,
-                   *stub_entry,
-                   RawPcDescriptors::kUnoptStaticCall,
-                   locs);
+  GenerateDartCall(deopt_id, token_pos, *stub_entry,
+                   RawPcDescriptors::kUnoptStaticCall, locs);
   __ Drop(argument_count);
 }
 
@@ -1412,12 +1357,9 @@
   }
   // Do not use the code from the function, but let the code be patched so that
   // we can record the outgoing edges to other code.
-  GenerateStaticDartCall(deopt_id,
-                         token_pos,
+  GenerateStaticDartCall(deopt_id, token_pos,
                          *StubCode::CallStaticFunction_entry(),
-                         RawPcDescriptors::kOther,
-                         locs,
-                         function);
+                         RawPcDescriptors::kOther, locs, function);
   __ Drop(argument_count);
 }
 
@@ -1439,12 +1381,11 @@
           *StubCode::UnoptimizedIdenticalWithNumberCheck_entry());
     }
     if (token_pos.IsReal()) {
-      AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall,
-                           Thread::kNoDeoptId,
+      AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall, Thread::kNoDeoptId,
                            token_pos);
     }
     // Stub returns result in flags (result of a cmp, we need Z computed).
-    __ Drop(1);  // Discard constant.
+    __ Drop(1);   // Discard constant.
     __ Pop(reg);  // Restore 'reg'.
   } else {
     __ CompareObject(reg, obj);
@@ -1469,8 +1410,7 @@
           *StubCode::UnoptimizedIdenticalWithNumberCheck_entry());
     }
     if (token_pos.IsReal()) {
-      AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall,
-                           Thread::kNoDeoptId,
+      AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall, Thread::kNoDeoptId,
                            token_pos);
     }
     // Stub returns result in flags (result of a cmp, we need Z computed).
@@ -1587,9 +1527,8 @@
                                         bool complete) {
   ASSERT(is_optimizing());
   __ Comment("EmitTestAndCall");
-  const Array& arguments_descriptor =
-      Array::ZoneHandle(zone(), ArgumentsDescriptor::New(argument_count,
-                                                         argument_names));
+  const Array& arguments_descriptor = Array::ZoneHandle(
+      zone(), ArgumentsDescriptor::New(argument_count, argument_names));
 
   // Load receiver into R0.
   __ LoadFromOffset(kWord, R0, SP, (argument_count - 1) * kWordSize);
@@ -1611,14 +1550,11 @@
     }
     // Do not use the code from the function, but let the code be patched so
     // that we can record the outgoing edges to other code.
-    const Function& function = Function::ZoneHandle(
-        zone(), ic_data.GetTargetAt(0));
-    GenerateStaticDartCall(deopt_id,
-                           token_index,
+    const Function& function =
+        Function::ZoneHandle(zone(), ic_data.GetTargetAt(0));
+    GenerateStaticDartCall(deopt_id, token_index,
                            *StubCode::CallStaticFunction_entry(),
-                           RawPcDescriptors::kOther,
-                           locs,
-                           function);
+                           RawPcDescriptors::kOther, locs, function);
     __ Drop(argument_count);
     if (kNumChecks > 1) {
       __ b(match_found);
@@ -1664,12 +1600,9 @@
     // Do not use the code from the function, but let the code be patched so
     // that we can record the outgoing edges to other code.
     const Function& function = *sorted[i].target;
-    GenerateStaticDartCall(deopt_id,
-                           token_index,
+    GenerateStaticDartCall(deopt_id, token_index,
                            *StubCode::CallStaticFunction_entry(),
-                           RawPcDescriptors::kOther,
-                           locs,
-                           function);
+                           RawPcDescriptors::kOther, locs, function);
     __ Drop(argument_count);
     if (!kIsLastCheck) {
       __ b(match_found);
@@ -1694,14 +1627,14 @@
     } else {
       ASSERT(destination.IsStackSlot());
       const intptr_t dest_offset = destination.ToStackSlotOffset();
-      __ StoreToOffset(
-          kWord, source.reg(), destination.base_reg(), dest_offset);
+      __ StoreToOffset(kWord, source.reg(), destination.base_reg(),
+                       dest_offset);
     }
   } else if (source.IsStackSlot()) {
     if (destination.IsRegister()) {
       const intptr_t source_offset = source.ToStackSlotOffset();
-      __ LoadFromOffset(
-          kWord, destination.reg(), source.base_reg(), source_offset);
+      __ LoadFromOffset(kWord, destination.reg(), source.base_reg(),
+                        source_offset);
     } else {
       ASSERT(destination.IsStackSlot());
       const intptr_t source_offset = source.ToStackSlotOffset();
@@ -1728,8 +1661,8 @@
         ASSERT(destination.IsQuadStackSlot());
         const intptr_t dest_offset = destination.ToStackSlotOffset();
         const DRegister dsrc0 = EvenDRegisterOf(source.fpu_reg());
-        __ StoreMultipleDToOffset(
-            dsrc0, 2, destination.base_reg(), dest_offset);
+        __ StoreMultipleDToOffset(dsrc0, 2, destination.base_reg(),
+                                  dest_offset);
       }
     }
   } else if (source.IsDoubleStackSlot()) {
@@ -1816,11 +1749,10 @@
     __ mov(source.reg(), Operand(destination.reg()));
     __ mov(destination.reg(), Operand(IP));
   } else if (source.IsRegister() && destination.IsStackSlot()) {
-    Exchange(source.reg(),
-             destination.base_reg(), destination.ToStackSlotOffset());
+    Exchange(source.reg(), destination.base_reg(),
+             destination.ToStackSlotOffset());
   } else if (source.IsStackSlot() && destination.IsRegister()) {
-    Exchange(destination.reg(),
-             source.base_reg(), source.ToStackSlotOffset());
+    Exchange(destination.reg(), source.base_reg(), source.ToStackSlotOffset());
   } else if (source.IsStackSlot() && destination.IsStackSlot()) {
     Exchange(source.base_reg(), source.ToStackSlotOffset(),
              destination.base_reg(), destination.ToStackSlotOffset());
@@ -1839,21 +1771,18 @@
       __ vmovd(dst, DTMP);
     }
   } else if (source.IsFpuRegister() || destination.IsFpuRegister()) {
-    ASSERT(destination.IsDoubleStackSlot() ||
-           destination.IsQuadStackSlot() ||
-           source.IsDoubleStackSlot() ||
-           source.IsQuadStackSlot());
-    bool double_width = destination.IsDoubleStackSlot() ||
-                        source.IsDoubleStackSlot();
-    QRegister qreg = source.IsFpuRegister() ? source.fpu_reg()
-                                            : destination.fpu_reg();
+    ASSERT(destination.IsDoubleStackSlot() || destination.IsQuadStackSlot() ||
+           source.IsDoubleStackSlot() || source.IsQuadStackSlot());
+    bool double_width =
+        destination.IsDoubleStackSlot() || source.IsDoubleStackSlot();
+    QRegister qreg =
+        source.IsFpuRegister() ? source.fpu_reg() : destination.fpu_reg();
     DRegister reg = EvenDRegisterOf(qreg);
-    Register base_reg = source.IsFpuRegister()
-        ? destination.base_reg()
-        : source.base_reg();
+    Register base_reg =
+        source.IsFpuRegister() ? destination.base_reg() : source.base_reg();
     const intptr_t slot_offset = source.IsFpuRegister()
-        ? destination.ToStackSlotOffset()
-        : source.ToStackSlotOffset();
+                                     ? destination.ToStackSlotOffset()
+                                     : source.ToStackSlotOffset();
 
     if (double_width) {
       __ LoadDFromOffset(DTMP, base_reg, slot_offset);
@@ -1883,8 +1812,8 @@
     __ LoadMultipleDFromOffset(DTMP, 2, source.base_reg(), source_offset);
     __ LoadMultipleDFromOffset(scratch, 2, destination.base_reg(), dest_offset);
     __ StoreMultipleDToOffset(DTMP, 2, destination.base_reg(), dest_offset);
-    __ StoreMultipleDToOffset(
-        scratch, 2, destination.base_reg(), source_offset);
+    __ StoreMultipleDToOffset(scratch, 2, destination.base_reg(),
+                              source_offset);
   } else {
     UNREACHABLE();
   }
diff --git a/runtime/vm/flow_graph_compiler_arm64.cc b/runtime/vm/flow_graph_compiler_arm64.cc
index 326ca58..09ff218 100644
--- a/runtime/vm/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/flow_graph_compiler_arm64.cc
@@ -116,8 +116,7 @@
 
   // For the innermost environment, set outgoing arguments and the locals.
   for (intptr_t i = current->Length() - 1;
-       i >= current->fixed_parameter_count();
-       i--) {
+       i >= current->fixed_parameter_count(); i--) {
     builder->AddCopy(current->ValueAt(i), current->LocationAt(i), slot_ix++);
   }
 
@@ -130,26 +129,21 @@
 
     // For any outer environment the deopt id is that of the call instruction
     // which is recorded in the outer environment.
-    builder->AddReturnAddress(
-        current->function(),
-        Thread::ToDeoptAfter(current->deopt_id()),
-        slot_ix++);
+    builder->AddReturnAddress(current->function(),
+                              Thread::ToDeoptAfter(current->deopt_id()),
+                              slot_ix++);
 
     // The values of outgoing arguments can be changed from the inlined call so
     // we must read them from the previous environment.
     for (intptr_t i = previous->fixed_parameter_count() - 1; i >= 0; i--) {
-      builder->AddCopy(previous->ValueAt(i),
-                       previous->LocationAt(i),
+      builder->AddCopy(previous->ValueAt(i), previous->LocationAt(i),
                        slot_ix++);
     }
 
     // Set the locals, note that outgoing arguments are not in the environment.
     for (intptr_t i = current->Length() - 1;
-         i >= current->fixed_parameter_count();
-         i--) {
-      builder->AddCopy(current->ValueAt(i),
-                       current->LocationAt(i),
-                       slot_ix++);
+         i >= current->fixed_parameter_count(); i--) {
+      builder->AddCopy(current->ValueAt(i), current->LocationAt(i), slot_ix++);
     }
 
     // Iterate on the outer environment.
@@ -281,7 +275,7 @@
     const TypeArguments& type_arguments =
         TypeArguments::ZoneHandle(zone(), type.arguments());
     const bool is_raw_type = type_arguments.IsNull() ||
-        type_arguments.IsRaw(from_index, num_type_params);
+                             type_arguments.IsRaw(from_index, num_type_params);
     if (is_raw_type) {
       const Register kClassIdReg = R2;
       // dynamic type argument, check only classes.
@@ -297,8 +291,8 @@
     }
     // If one type argument only, check if type argument is Object or dynamic.
     if (type_arguments.Length() == 1) {
-      const AbstractType& tp_argument = AbstractType::ZoneHandle(
-          zone(), type_arguments.TypeAt(0));
+      const AbstractType& tp_argument =
+          AbstractType::ZoneHandle(zone(), type_arguments.TypeAt(0));
       ASSERT(!tp_argument.IsMalformed());
       if (tp_argument.IsType()) {
         ASSERT(tp_argument.HasResolvedTypeClass());
@@ -316,12 +310,9 @@
   const Register kTypeArgumentsReg = kNoRegister;
   const Register kTempReg = kNoRegister;
   // R0: instance (must be preserved).
-  return GenerateCallSubtypeTestStub(kTestTypeTwoArgs,
-                                     kInstanceReg,
-                                     kTypeArgumentsReg,
-                                     kTempReg,
-                                     is_instance_lbl,
-                                     is_not_instance_lbl);
+  return GenerateCallSubtypeTestStub(kTestTypeTwoArgs, kInstanceReg,
+                                     kTypeArgumentsReg, kTempReg,
+                                     is_instance_lbl, is_not_instance_lbl);
 }
 
 
@@ -360,11 +351,8 @@
   __ tsti(kInstanceReg, Immediate(kSmiTagMask));
   // If instance is Smi, check directly.
   const Class& smi_class = Class::Handle(zone(), Smi::Class());
-  if (smi_class.IsSubtypeOf(TypeArguments::Handle(zone()),
-                            type_class,
-                            TypeArguments::Handle(zone()),
-                            NULL,
-                            NULL,
+  if (smi_class.IsSubtypeOf(TypeArguments::Handle(zone()), type_class,
+                            TypeArguments::Handle(zone()), NULL, NULL,
                             Heap::kOld)) {
     __ b(is_instance_lbl, EQ);
   } else {
@@ -384,8 +372,8 @@
   // Custom checking for numbers (Smi, Mint, Bigint and Double).
   // Note that instance is not Smi (checked above).
   if (type.IsNumberType() || type.IsIntType() || type.IsDoubleType()) {
-    GenerateNumberTypeCheck(
-        kClassIdReg, type, is_instance_lbl, is_not_instance_lbl);
+    GenerateNumberTypeCheck(kClassIdReg, type, is_instance_lbl,
+                            is_not_instance_lbl);
     return false;
   }
   if (type.IsStringType()) {
@@ -432,12 +420,9 @@
 
   const Register kTypeArgumentsReg = kNoRegister;
   const Register kTempReg = kNoRegister;
-  return GenerateCallSubtypeTestStub(kTestTypeOneArg,
-                                     kInstanceReg,
-                                     kTypeArgumentsReg,
-                                     kTempReg,
-                                     is_instance_lbl,
-                                     is_not_instance_lbl);
+  return GenerateCallSubtypeTestStub(kTestTypeOneArg, kInstanceReg,
+                                     kTypeArgumentsReg, kTempReg,
+                                     is_instance_lbl, is_not_instance_lbl);
 }
 
 
@@ -459,8 +444,8 @@
     // Check if type arguments are null, i.e. equivalent to vector of dynamic.
     __ CompareObject(R1, Object::null_object());
     __ b(is_instance_lbl, EQ);
-    __ LoadFieldFromOffset(
-        R2, R1, TypeArguments::type_at_offset(type_param.index()));
+    __ LoadFieldFromOffset(R2, R1,
+                           TypeArguments::type_at_offset(type_param.index()));
     // R2: concrete type of type.
     // Check if type argument is dynamic.
     __ CompareObject(R2, Object::dynamic_type());
@@ -486,14 +471,10 @@
     const Register kInstanceReg = R0;
     const Register kTypeArgumentsReg = R1;
     const Register kTempReg = kNoRegister;
-    const SubtypeTestCache& type_test_cache =
-        SubtypeTestCache::ZoneHandle(zone(),
-            GenerateCallSubtypeTestStub(kTestTypeThreeArgs,
-                                        kInstanceReg,
-                                        kTypeArgumentsReg,
-                                        kTempReg,
-                                        is_instance_lbl,
-                                        is_not_instance_lbl));
+    const SubtypeTestCache& type_test_cache = SubtypeTestCache::ZoneHandle(
+        zone(), GenerateCallSubtypeTestStub(
+                    kTestTypeThreeArgs, kInstanceReg, kTypeArgumentsReg,
+                    kTempReg, is_instance_lbl, is_not_instance_lbl));
     __ Bind(&fall_through);
     return type_test_cache.raw();
   }
@@ -506,12 +487,9 @@
     // Uninstantiated type class is known at compile time, but the type
     // arguments are determined at runtime by the instantiator.
     const Register kTempReg = kNoRegister;
-    return GenerateCallSubtypeTestStub(kTestTypeThreeArgs,
-                                       kInstanceReg,
-                                       kTypeArgumentsReg,
-                                       kTempReg,
-                                       is_instance_lbl,
-                                       is_not_instance_lbl);
+    return GenerateCallSubtypeTestStub(kTestTypeThreeArgs, kInstanceReg,
+                                       kTypeArgumentsReg, kTempReg,
+                                       is_instance_lbl, is_not_instance_lbl);
   }
   return SubtypeTestCache::null();
 }
@@ -543,17 +521,12 @@
     // function type) of a non-parameterized class or with a raw dst type of
     // a parameterized class.
     if (type.IsFunctionType() || (type_class.NumTypeArguments() > 0)) {
-      return GenerateInstantiatedTypeWithArgumentsTest(token_pos,
-                                                       type,
-                                                       is_instance_lbl,
-                                                       is_not_instance_lbl);
+      return GenerateInstantiatedTypeWithArgumentsTest(
+          token_pos, type, is_instance_lbl, is_not_instance_lbl);
       // Fall through to runtime call.
     }
-    const bool has_fall_through =
-        GenerateInstantiatedTypeNoArgumentsTest(token_pos,
-                                                type,
-                                                is_instance_lbl,
-                                                is_not_instance_lbl);
+    const bool has_fall_through = GenerateInstantiatedTypeNoArgumentsTest(
+        token_pos, type, is_instance_lbl, is_not_instance_lbl);
     if (has_fall_through) {
       // If test non-conclusive so far, try the inlined type-test cache.
       // 'type' is known at compile time.
@@ -563,9 +536,7 @@
       return SubtypeTestCache::null();
     }
   }
-  return GenerateUninstantiatedTypeTest(token_pos,
-                                        type,
-                                        is_instance_lbl,
+  return GenerateUninstantiatedTypeTest(token_pos, type, is_instance_lbl,
                                         is_not_instance_lbl);
 }
 
@@ -607,8 +578,8 @@
 
   // Generate inline instanceof test.
   SubtypeTestCache& test_cache = SubtypeTestCache::ZoneHandle(zone());
-  test_cache = GenerateInlineInstanceof(token_pos, type,
-                                        &is_instance, &is_not_instance);
+  test_cache =
+      GenerateInlineInstanceof(token_pos, type, &is_instance, &is_not_instance);
 
   // test_cache is null if there is no fall-through.
   Label done;
@@ -617,8 +588,8 @@
     // Load instantiator (R2) and its type arguments (R1).
     __ ldr(R1, Address(SP, 0 * kWordSize));
     __ PushObject(Object::null_object());  // Make room for the result.
-    __ Push(R0);  // Push the instance.
-    __ PushObject(type);  // Push the type.
+    __ Push(R0);                           // Push the instance.
+    __ PushObject(type);                   // Push the type.
     __ Push(R1);  // Push instantiator type arguments (R1).
     __ LoadUniqueObject(R0, test_cache);
     __ Push(R0);
@@ -681,13 +652,10 @@
   // Generate throw new TypeError() if the type is malformed or malbounded.
   if (dst_type.IsMalformedOrMalbounded()) {
     __ PushObject(Object::null_object());  // Make room for the result.
-    __ Push(R0);  // Push the source object.
-    __ PushObject(dst_name);  // Push the name of the destination.
-    __ PushObject(dst_type);  // Push the type of the destination.
-    GenerateRuntimeCall(token_pos,
-                        deopt_id,
-                        kBadTypeErrorRuntimeEntry,
-                        3,
+    __ Push(R0);                           // Push the source object.
+    __ PushObject(dst_name);               // Push the name of the destination.
+    __ PushObject(dst_type);               // Push the type of the destination.
+    GenerateRuntimeCall(token_pos, deopt_id, kBadTypeErrorRuntimeEntry, 3,
                         locs);
     // We should never return here.
     __ brk(0);
@@ -700,15 +668,15 @@
 
   // Generate inline type check, linking to runtime call if not assignable.
   SubtypeTestCache& test_cache = SubtypeTestCache::ZoneHandle(zone());
-  test_cache = GenerateInlineInstanceof(token_pos, dst_type,
-                                        &is_assignable, &runtime_call);
+  test_cache = GenerateInlineInstanceof(token_pos, dst_type, &is_assignable,
+                                        &runtime_call);
 
   __ Bind(&runtime_call);
   __ ldr(R1, Address(SP));  // Load instantiator type arguments (R1).
   __ PushObject(Object::null_object());  // Make room for the result.
-  __ Push(R0);  // Push the source object.
-  __ PushObject(dst_type);  // Push the type of the destination.
-  __ Push(R1);  // Push instantiator type arguments (R1).
+  __ Push(R0);                           // Push the source object.
+  __ PushObject(dst_type);               // Push the type of the destination.
+  __ Push(R1);              // Push instantiator type arguments (R1).
   __ PushObject(dst_name);  // Push the name of the destination.
   __ LoadUniqueObject(R0, test_cache);
   __ Push(R0);
@@ -754,8 +722,8 @@
   const int min_num_pos_args = num_fixed_params;
   const int max_num_pos_args = num_fixed_params + num_opt_pos_params;
 
-  __ LoadFieldFromOffset(
-      R8, R4, ArgumentsDescriptor::positional_count_offset());
+  __ LoadFieldFromOffset(R8, R4,
+                         ArgumentsDescriptor::positional_count_offset());
   // Check that min_num_pos_args <= num_pos_args.
   Label wrong_num_arguments;
   __ CompareImmediate(R8, Smi::RawValue(min_num_pos_args));
@@ -798,9 +766,9 @@
   // Copy or initialize optional named arguments.
   Label all_arguments_processed;
 #ifdef DEBUG
-    const bool check_correct_named_args = true;
+  const bool check_correct_named_args = true;
 #else
-    const bool check_correct_named_args = function.IsClosureFunction();
+  const bool check_correct_named_args = function.IsClosureFunction();
 #endif
   if (num_opt_named_params > 0) {
     // Start by alphabetically sorting the names of the optional parameters.
@@ -823,16 +791,16 @@
     }
     // Generate code handling each optional parameter in alphabetical order.
     __ LoadFieldFromOffset(R7, R4, ArgumentsDescriptor::count_offset());
-    __ LoadFieldFromOffset(
-        R8, R4, ArgumentsDescriptor::positional_count_offset());
+    __ LoadFieldFromOffset(R8, R4,
+                           ArgumentsDescriptor::positional_count_offset());
     __ SmiUntag(R8);
     // Let R7 point to the first passed argument, i.e. to
     // fp[kParamEndSlotFromFp + num_args - 0]; num_args (R7) is Smi.
     __ add(R7, FP, Operand(R7, LSL, 2));
     __ AddImmediate(R7, R7, kParamEndSlotFromFp * kWordSize);
     // Let R6 point to the entry of the first named argument.
-    __ add(R6, R4, Operand(
-        ArgumentsDescriptor::first_named_entry_offset() - kHeapObjectTag));
+    __ add(R6, R4, Operand(ArgumentsDescriptor::first_named_entry_offset() -
+                           kHeapObjectTag));
     for (int i = 0; i < num_opt_named_params; i++) {
       Label load_default_value, assign_optional_parameter;
       const int param_pos = opt_param_position[i];
@@ -877,8 +845,8 @@
     }
   } else {
     ASSERT(num_opt_pos_params > 0);
-    __ LoadFieldFromOffset(
-        R8, R4, ArgumentsDescriptor::positional_count_offset());
+    __ LoadFieldFromOffset(R8, R4,
+                           ArgumentsDescriptor::positional_count_offset());
     __ SmiUntag(R8);
     for (int i = 0; i < num_opt_pos_params; i++) {
       Label next_parameter;
@@ -968,8 +936,7 @@
 void FlowGraphCompiler::EmitFrameEntry() {
   const Function& function = parsed_function().function();
   Register new_pp = kNoRegister;
-  if (CanOptimizeFunction() &&
-      function.IsOptimizable() &&
+  if (CanOptimizeFunction() && function.IsOptimizable() &&
       (!is_optimizing() || may_reoptimize())) {
     __ Comment("Invocation Count Check");
     const Register function_reg = R6;
@@ -981,14 +948,14 @@
     // Load function object using the callee's pool pointer.
     __ LoadFunctionFromCalleePool(function_reg, function, new_pp);
 
-    __ LoadFieldFromOffset(
-        R7, function_reg, Function::usage_counter_offset(), kWord);
+    __ LoadFieldFromOffset(R7, function_reg, Function::usage_counter_offset(),
+                           kWord);
     // Reoptimization of an optimized function is triggered by counting in
     // IC stubs, but not at the entry of the function.
     if (!is_optimizing()) {
       __ add(R7, R7, Operand(1));
-      __ StoreFieldToOffset(
-          R7, function_reg, Function::usage_counter_offset(), kWord);
+      __ StoreFieldToOffset(R7, function_reg, Function::usage_counter_offset(),
+                            kWord);
     }
     __ CompareImmediate(R7, GetOptimizationThreshold());
     ASSERT(function_reg == R6);
@@ -999,9 +966,8 @@
   }
   __ Comment("Enter frame");
   if (flow_graph().IsCompiledForOsr()) {
-    intptr_t extra_slots = StackSize()
-        - flow_graph().num_stack_locals()
-        - flow_graph().num_copied_params();
+    intptr_t extra_slots = StackSize() - flow_graph().num_stack_locals() -
+                           flow_graph().num_copied_params();
     ASSERT(extra_slots >= 0);
     __ EnterOsrFrame(extra_slots * kWordSize, new_pp);
   } else {
@@ -1055,7 +1021,7 @@
       __ CompareImmediate(R0, Smi::RawValue(num_fixed_params));
       __ b(&wrong_num_arguments, NE);
       __ LoadFieldFromOffset(R1, R4,
-            ArgumentsDescriptor::positional_count_offset());
+                             ArgumentsDescriptor::positional_count_offset());
       __ CompareRegisters(R0, R1);
       __ b(&correct_num_arguments, EQ);
       __ Bind(&wrong_num_arguments);
@@ -1212,13 +1178,12 @@
 }
 
 
-void FlowGraphCompiler::EmitOptimizedInstanceCall(
-    const StubEntry& stub_entry,
-    const ICData& ic_data,
-    intptr_t argument_count,
-    intptr_t deopt_id,
-    TokenPosition token_pos,
-    LocationSummary* locs) {
+void FlowGraphCompiler::EmitOptimizedInstanceCall(const StubEntry& stub_entry,
+                                                  const ICData& ic_data,
+                                                  intptr_t argument_count,
+                                                  intptr_t deopt_id,
+                                                  TokenPosition token_pos,
+                                                  LocationSummary* locs) {
   ASSERT(Array::Handle(zone(), ic_data.arguments_descriptor()).Length() > 0);
   // Each ICData propagated from unoptimized to optimized code contains the
   // function that corresponds to the Dart function of that IC call. Due
@@ -1229,10 +1194,7 @@
 
   __ LoadObject(R6, parsed_function().function());
   __ LoadUniqueObject(R5, ic_data);
-  GenerateDartCall(deopt_id,
-                   token_pos,
-                   stub_entry,
-                   RawPcDescriptors::kIcCall,
+  GenerateDartCall(deopt_id, token_pos, stub_entry, RawPcDescriptors::kIcCall,
                    locs);
   __ Drop(argument_count);
 }
@@ -1246,10 +1208,7 @@
                                          LocationSummary* locs) {
   ASSERT(Array::Handle(zone(), ic_data.arguments_descriptor()).Length() > 0);
   __ LoadUniqueObject(R5, ic_data);
-  GenerateDartCall(deopt_id,
-                   token_pos,
-                   stub_entry,
-                   RawPcDescriptors::kIcCall,
+  GenerateDartCall(deopt_id, token_pos, stub_entry, RawPcDescriptors::kIcCall,
                    locs);
   __ Drop(argument_count);
 }
@@ -1267,7 +1226,8 @@
   const Array& arguments_descriptor =
       Array::ZoneHandle(zone(), ic_data.arguments_descriptor());
   ASSERT(!arguments_descriptor.IsNull() && (arguments_descriptor.Length() > 0));
-  const MegamorphicCache& cache = MegamorphicCache::ZoneHandle(zone(),
+  const MegamorphicCache& cache = MegamorphicCache::ZoneHandle(
+      zone(),
       MegamorphicCacheTable::Lookup(isolate(), name, arguments_descriptor));
 
   __ Comment("MegamorphicCall");
@@ -1307,18 +1267,16 @@
     if (try_index == CatchClauseNode::kInvalidTryIndex) {
       try_index = CurrentTryIndex();
     }
-    pc_descriptors_list()->AddDescriptor(RawPcDescriptors::kOther,
-                                         assembler()->CodeSize(),
-                                         Thread::kNoDeoptId,
-                                         token_pos,
-                                         try_index);
+    pc_descriptors_list()->AddDescriptor(
+        RawPcDescriptors::kOther, assembler()->CodeSize(), Thread::kNoDeoptId,
+        token_pos, try_index);
   } else if (is_optimizing()) {
-    AddCurrentDescriptor(RawPcDescriptors::kOther,
-        Thread::kNoDeoptId, token_pos);
+    AddCurrentDescriptor(RawPcDescriptors::kOther, Thread::kNoDeoptId,
+                         token_pos);
     AddDeoptIndexAtCall(deopt_id_after);
   } else {
-    AddCurrentDescriptor(RawPcDescriptors::kOther,
-        Thread::kNoDeoptId, token_pos);
+    AddCurrentDescriptor(RawPcDescriptors::kOther, Thread::kNoDeoptId,
+                         token_pos);
     // Add deoptimization continuation point after the call and before the
     // arguments are removed.
     AddCurrentDescriptor(RawPcDescriptors::kDeopt, deopt_id_after, token_pos);
@@ -1327,15 +1285,14 @@
 }
 
 
-void FlowGraphCompiler::EmitSwitchableInstanceCall(
-    const ICData& ic_data,
-    intptr_t argument_count,
-    intptr_t deopt_id,
-    TokenPosition token_pos,
-    LocationSummary* locs) {
+void FlowGraphCompiler::EmitSwitchableInstanceCall(const ICData& ic_data,
+                                                   intptr_t argument_count,
+                                                   intptr_t deopt_id,
+                                                   TokenPosition token_pos,
+                                                   LocationSummary* locs) {
   ASSERT(ic_data.NumArgsTested() == 1);
-  const Code& initial_stub = Code::ZoneHandle(
-      StubCode::ICCallThroughFunction_entry()->code());
+  const Code& initial_stub =
+      Code::ZoneHandle(StubCode::ICCallThroughFunction_entry()->code());
   __ Comment("SwitchableCall");
 
   __ LoadFromOffset(R0, SP, (argument_count - 1) * kWordSize);
@@ -1344,8 +1301,7 @@
   __ LoadUniqueObject(R5, ic_data);
   __ blr(TMP);
 
-  AddCurrentDescriptor(RawPcDescriptors::kOther,
-      Thread::kNoDeoptId, token_pos);
+  AddCurrentDescriptor(RawPcDescriptors::kOther, Thread::kNoDeoptId, token_pos);
   RecordSafepoint(locs);
   const intptr_t deopt_id_after = Thread::ToDeoptAfter(deopt_id);
   if (is_optimizing()) {
@@ -1359,20 +1315,16 @@
 }
 
 
-void FlowGraphCompiler::EmitUnoptimizedStaticCall(
-    intptr_t argument_count,
-    intptr_t deopt_id,
-    TokenPosition token_pos,
-    LocationSummary* locs,
-    const ICData& ic_data) {
+void FlowGraphCompiler::EmitUnoptimizedStaticCall(intptr_t argument_count,
+                                                  intptr_t deopt_id,
+                                                  TokenPosition token_pos,
+                                                  LocationSummary* locs,
+                                                  const ICData& ic_data) {
   const StubEntry* stub_entry =
       StubCode::UnoptimizedStaticCallEntry(ic_data.NumArgsTested());
   __ LoadObject(R5, ic_data);
-  GenerateDartCall(deopt_id,
-                   token_pos,
-                   *stub_entry,
-                   RawPcDescriptors::kUnoptStaticCall,
-                   locs);
+  GenerateDartCall(deopt_id, token_pos, *stub_entry,
+                   RawPcDescriptors::kUnoptStaticCall, locs);
   __ Drop(argument_count);
 }
 
@@ -1392,12 +1344,9 @@
   }
   // Do not use the code from the function, but let the code be patched so that
   // we can record the outgoing edges to other code.
-  GenerateStaticDartCall(deopt_id,
-                         token_pos,
+  GenerateStaticDartCall(deopt_id, token_pos,
                          *StubCode::CallStaticFunction_entry(),
-                         RawPcDescriptors::kOther,
-                         locs,
-                         function);
+                         RawPcDescriptors::kOther, locs, function);
   __ Drop(argument_count);
 }
 
@@ -1419,12 +1368,11 @@
           *StubCode::UnoptimizedIdenticalWithNumberCheck_entry());
     }
     if (token_pos.IsReal()) {
-      AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall,
-                           Thread::kNoDeoptId,
+      AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall, Thread::kNoDeoptId,
                            token_pos);
     }
     // Stub returns result in flags (result of a cmp, we need Z computed).
-    __ Drop(1);  // Discard constant.
+    __ Drop(1);   // Discard constant.
     __ Pop(reg);  // Restore 'reg'.
   } else {
     __ CompareObject(reg, obj);
@@ -1449,8 +1397,7 @@
           *StubCode::UnoptimizedIdenticalWithNumberCheck_entry());
     }
     if (token_pos.IsReal()) {
-      AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall,
-                           Thread::kNoDeoptId,
+      AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall, Thread::kNoDeoptId,
                            token_pos);
     }
     // Stub returns result in flags (result of a cmp, we need Z computed).
@@ -1543,9 +1490,8 @@
   ASSERT(is_optimizing());
 
   __ Comment("EmitTestAndCall");
-  const Array& arguments_descriptor =
-      Array::ZoneHandle(zone(), ArgumentsDescriptor::New(argument_count,
-                                                         argument_names));
+  const Array& arguments_descriptor = Array::ZoneHandle(
+      zone(), ArgumentsDescriptor::New(argument_count, argument_names));
 
   // Load receiver into R0.
   __ LoadFromOffset(R0, SP, (argument_count - 1) * kWordSize);
@@ -1567,14 +1513,11 @@
     }
     // Do not use the code from the function, but let the code be patched so
     // that we can record the outgoing edges to other code.
-    const Function& function = Function::ZoneHandle(
-        zone(), ic_data.GetTargetAt(0));
-    GenerateStaticDartCall(deopt_id,
-                           token_index,
+    const Function& function =
+        Function::ZoneHandle(zone(), ic_data.GetTargetAt(0));
+    GenerateStaticDartCall(deopt_id, token_index,
                            *StubCode::CallStaticFunction_entry(),
-                           RawPcDescriptors::kOther,
-                           locs,
-                           function);
+                           RawPcDescriptors::kOther, locs, function);
     __ Drop(argument_count);
     if (kNumChecks > 1) {
       __ b(match_found);
@@ -1620,12 +1563,9 @@
     // Do not use the code from the function, but let the code be patched so
     // that we can record the outgoing edges to other code.
     const Function& function = *sorted[i].target;
-    GenerateStaticDartCall(deopt_id,
-                           token_index,
+    GenerateStaticDartCall(deopt_id, token_index,
                            *StubCode::CallStaticFunction_entry(),
-                           RawPcDescriptors::kOther,
-                           locs,
-                           function);
+                           RawPcDescriptors::kOther, locs, function);
     __ Drop(argument_count);
     if (!kIsLastCheck) {
       __ b(match_found);
@@ -1655,8 +1595,7 @@
   } else if (source.IsStackSlot()) {
     if (destination.IsRegister()) {
       const intptr_t source_offset = source.ToStackSlotOffset();
-      __ LoadFromOffset(
-          destination.reg(), source.base_reg(), source_offset);
+      __ LoadFromOffset(destination.reg(), source.base_reg(), source_offset);
     } else {
       ASSERT(destination.IsStackSlot());
       const intptr_t source_offset = source.ToStackSlotOffset();
@@ -1676,8 +1615,8 @@
       } else {
         ASSERT(destination.IsQuadStackSlot());
         const intptr_t dest_offset = destination.ToStackSlotOffset();
-        __ StoreQToOffset(
-            source.fpu_reg(), destination.base_reg(), dest_offset);
+        __ StoreQToOffset(source.fpu_reg(), destination.base_reg(),
+                          dest_offset);
       }
     }
   } else if (source.IsDoubleStackSlot()) {
@@ -1695,8 +1634,8 @@
   } else if (source.IsQuadStackSlot()) {
     if (destination.IsFpuRegister()) {
       const intptr_t source_offset = source.ToStackSlotOffset();
-      __ LoadQFromOffset(
-          destination.fpu_reg(), source.base_reg(), source_offset);
+      __ LoadQFromOffset(destination.fpu_reg(), source.base_reg(),
+                         source_offset);
     } else {
       ASSERT(destination.IsQuadStackSlot());
       const intptr_t source_offset = source.ToStackSlotOffset();
@@ -1765,11 +1704,10 @@
     __ mov(source.reg(), destination.reg());
     __ mov(destination.reg(), TMP);
   } else if (source.IsRegister() && destination.IsStackSlot()) {
-    Exchange(source.reg(),
-             destination.base_reg(), destination.ToStackSlotOffset());
+    Exchange(source.reg(), destination.base_reg(),
+             destination.ToStackSlotOffset());
   } else if (source.IsStackSlot() && destination.IsRegister()) {
-    Exchange(destination.reg(),
-             source.base_reg(), source.ToStackSlotOffset());
+    Exchange(destination.reg(), source.base_reg(), source.ToStackSlotOffset());
   } else if (source.IsStackSlot() && destination.IsStackSlot()) {
     Exchange(source.base_reg(), source.ToStackSlotOffset(),
              destination.base_reg(), destination.ToStackSlotOffset());
@@ -1780,20 +1718,17 @@
     __ vmov(src, dst);
     __ vmov(dst, VTMP);
   } else if (source.IsFpuRegister() || destination.IsFpuRegister()) {
-    ASSERT(destination.IsDoubleStackSlot() ||
-           destination.IsQuadStackSlot() ||
-           source.IsDoubleStackSlot() ||
-           source.IsQuadStackSlot());
-    bool double_width = destination.IsDoubleStackSlot() ||
-                        source.IsDoubleStackSlot();
-    VRegister reg = source.IsFpuRegister() ? source.fpu_reg()
-                                           : destination.fpu_reg();
-    Register base_reg = source.IsFpuRegister()
-        ? destination.base_reg()
-        : source.base_reg();
+    ASSERT(destination.IsDoubleStackSlot() || destination.IsQuadStackSlot() ||
+           source.IsDoubleStackSlot() || source.IsQuadStackSlot());
+    bool double_width =
+        destination.IsDoubleStackSlot() || source.IsDoubleStackSlot();
+    VRegister reg =
+        source.IsFpuRegister() ? source.fpu_reg() : destination.fpu_reg();
+    Register base_reg =
+        source.IsFpuRegister() ? destination.base_reg() : source.base_reg();
     const intptr_t slot_offset = source.IsFpuRegister()
-        ? destination.ToStackSlotOffset()
-        : source.ToStackSlotOffset();
+                                     ? destination.ToStackSlotOffset()
+                                     : source.ToStackSlotOffset();
 
     if (double_width) {
       __ LoadDFromOffset(VTMP, base_reg, slot_offset);
diff --git a/runtime/vm/flow_graph_compiler_dbc.cc b/runtime/vm/flow_graph_compiler_dbc.cc
index 00fc026..745fcf9 100644
--- a/runtime/vm/flow_graph_compiler_dbc.cc
+++ b/runtime/vm/flow_graph_compiler_dbc.cc
@@ -120,8 +120,7 @@
 
   // For the innermost environment, set outgoing arguments and the locals.
   for (intptr_t i = current->Length() - 1;
-       i >= current->fixed_parameter_count();
-       i--) {
+       i >= current->fixed_parameter_count(); i--) {
     builder->AddCopy(current->ValueAt(i), current->LocationAt(i), slot_ix++);
   }
 
@@ -132,10 +131,9 @@
   while (current != NULL) {
     // For any outer environment the deopt id is that of the call instruction
     // which is recorded in the outer environment.
-    builder->AddReturnAddress(
-        current->function(),
-        Thread::ToDeoptAfter(current->deopt_id()),
-        slot_ix++);
+    builder->AddReturnAddress(current->function(),
+                              Thread::ToDeoptAfter(current->deopt_id()),
+                              slot_ix++);
 
     builder->AddPcMarker(previous->function(), slot_ix++);
     builder->AddConstant(previous->function(), slot_ix++);
@@ -143,18 +141,14 @@
     // The values of outgoing arguments can be changed from the inlined call so
     // we must read them from the previous environment.
     for (intptr_t i = previous->fixed_parameter_count() - 1; i >= 0; i--) {
-      builder->AddCopy(previous->ValueAt(i),
-                       previous->LocationAt(i),
+      builder->AddCopy(previous->ValueAt(i), previous->LocationAt(i),
                        slot_ix++);
     }
 
     // Set the locals, note that outgoing arguments are not in the environment.
     for (intptr_t i = current->Length() - 1;
-         i >= current->fixed_parameter_count();
-         i--) {
-      builder->AddCopy(current->ValueAt(i),
-                       current->LocationAt(i),
-                       slot_ix++);
+         i >= current->fixed_parameter_count(); i--) {
+      builder->AddCopy(current->ValueAt(i), current->LocationAt(i), slot_ix++);
     }
 
     builder->AddCallerFp(slot_ix++);
@@ -182,31 +176,37 @@
 }
 
 
-void FlowGraphCompiler::RecordAfterCall(Instruction* instr) {
-  RecordSafepoint(instr->locs());
+void FlowGraphCompiler::RecordAfterCallHelper(TokenPosition token_pos,
+                                              intptr_t deopt_id,
+                                              intptr_t argument_count,
+                                              LocationSummary* locs) {
+  RecordSafepoint(locs);
   // Marks either the continuation point in unoptimized code or the
   // deoptimization point in optimized code, after call.
-  const intptr_t deopt_id_after = Thread::ToDeoptAfter(instr->deopt_id());
+  const intptr_t deopt_id_after = Thread::ToDeoptAfter(deopt_id);
   if (is_optimizing()) {
     // Return/ReturnTOS instruction drops incoming arguments so
     // we have to drop outgoing arguments from the innermost environment.
     // On all other architectures caller drops outgoing arguments itself
     // hence the difference.
-    pending_deoptimization_env_->DropArguments(instr->ArgumentCount());
+    pending_deoptimization_env_->DropArguments(argument_count);
     AddDeoptIndexAtCall(deopt_id_after);
     // This descriptor is needed for exception handling in optimized code.
-    AddCurrentDescriptor(RawPcDescriptors::kOther,
-                         deopt_id_after, instr->token_pos());
+    AddCurrentDescriptor(RawPcDescriptors::kOther, deopt_id_after, token_pos);
   } else {
     // Add deoptimization continuation point after the call and before the
     // arguments are removed.
-    AddCurrentDescriptor(RawPcDescriptors::kDeopt,
-                         deopt_id_after,
-                         instr->token_pos());
+    AddCurrentDescriptor(RawPcDescriptors::kDeopt, deopt_id_after, token_pos);
   }
 }
 
 
+void FlowGraphCompiler::RecordAfterCall(Instruction* instr) {
+  RecordAfterCallHelper(instr->token_pos(), instr->deopt_id(),
+                        instr->ArgumentCount(), instr->locs());
+}
+
+
 void CompilerDeoptInfoWithStub::GenerateCode(FlowGraphCompiler* compiler,
                                              intptr_t stub_ix) {
   UNREACHABLE();
@@ -244,12 +244,9 @@
       const Class& type_class = Class::Handle(zone(), dst_type.type_class());
       if (type_class.NumTypeArguments() == 0) {
         const Class& smi_class = Class::Handle(zone(), Smi::Class());
-        may_be_smi = smi_class.IsSubtypeOf(TypeArguments::Handle(zone()),
-                                           type_class,
-                                           TypeArguments::Handle(zone()),
-                                           NULL,
-                                           NULL,
-                                           Heap::kOld);
+        may_be_smi = smi_class.IsSubtypeOf(
+            TypeArguments::Handle(zone()), type_class,
+            TypeArguments::Handle(zone()), NULL, NULL, Heap::kOld);
       }
     }
     __ AssertAssignable(may_be_smi ? 1 : 0, __ AddConstant(test_cache));
@@ -265,8 +262,8 @@
     // visits it.
     locs->SetStackBit(locs->out(0).reg());
   }
-  RecordSafepoint(locs);
   AddCurrentDescriptor(RawPcDescriptors::kOther, deopt_id, token_pos);
+  RecordAfterCallHelper(token_pos, deopt_id, 0, locs);
   if (is_optimizing()) {
     // Assert assignable keeps the instance on the stack as the result,
     // all other arguments are popped.
@@ -279,14 +276,12 @@
 void FlowGraphCompiler::EmitInstructionEpilogue(Instruction* instr) {
   if (!is_optimizing()) {
     Definition* defn = instr->AsDefinition();
-    if ((defn != NULL) &&
-        (defn->tag() != Instruction::kPushArgument) &&
+    if ((defn != NULL) && (defn->tag() != Instruction::kPushArgument) &&
         (defn->tag() != Instruction::kStoreIndexed) &&
         (defn->tag() != Instruction::kStoreStaticField) &&
         (defn->tag() != Instruction::kStoreLocal) &&
         (defn->tag() != Instruction::kStoreInstanceField) &&
-        (defn->tag() != Instruction::kDropTemps) &&
-        !defn->HasTemp()) {
+        (defn->tag() != Instruction::kDropTemps) && !defn->HasTemp()) {
       __ Drop1();
     }
   }
@@ -296,7 +291,7 @@
 void FlowGraphCompiler::GenerateInlinedGetter(intptr_t offset) {
   __ Move(0, -(1 + kParamEndSlotFromFp));
   ASSERT(offset % kWordSize == 0);
-  if (Utils::IsInt(8, offset/ kWordSize)) {
+  if (Utils::IsInt(8, offset / kWordSize)) {
     __ LoadField(0, 0, offset / kWordSize);
   } else {
     __ LoadFieldExt(0, 0);
@@ -310,7 +305,7 @@
   __ Move(0, -(2 + kParamEndSlotFromFp));
   __ Move(1, -(1 + kParamEndSlotFromFp));
   ASSERT(offset % kWordSize == 0);
-  if (Utils::IsInt(8, offset/ kWordSize)) {
+  if (Utils::IsInt(8, offset / kWordSize)) {
     __ StoreField(0, offset / kWordSize, 1);
   } else {
     __ StoreFieldExt(0, 1);
@@ -328,21 +323,19 @@
   const int num_opt_named_params = function.NumOptionalNamedParameters();
   const int num_params =
       num_fixed_params + num_opt_pos_params + num_opt_named_params;
-  const bool has_optional_params = (num_opt_pos_params != 0) ||
-      (num_opt_named_params != 0);
+  const bool has_optional_params =
+      (num_opt_pos_params != 0) || (num_opt_named_params != 0);
   const int num_locals = parsed_function().num_stack_locals();
   const intptr_t context_index =
       -parsed_function().current_context_var()->index() - 1;
 
-  if (CanOptimizeFunction() &&
-      function.IsOptimizable() &&
+  if (CanOptimizeFunction() && function.IsOptimizable() &&
       (!is_optimizing() || may_reoptimize())) {
     __ HotCheck(!is_optimizing(), GetOptimizationThreshold());
   }
 
   if (has_optional_params) {
-    __ EntryOptional(num_fixed_params,
-                     num_opt_pos_params,
+    __ EntryOptional(num_fixed_params, num_opt_pos_params,
                      num_opt_named_params);
   } else if (!is_optimizing()) {
     __ Entry(num_fixed_params, num_locals, context_index);
@@ -392,17 +385,17 @@
   if (has_optional_params) {
     if (!is_optimizing()) {
       ASSERT(num_locals > 0);  // There is always at least context_var.
-      __ Frame(num_locals);  // Reserve space for locals.
+      __ Frame(num_locals);    // Reserve space for locals.
     } else if (flow_graph_.graph_entry()->spill_slot_count() >
-                   flow_graph_.num_copied_params()) {
+               flow_graph_.num_copied_params()) {
       __ Frame(flow_graph_.graph_entry()->spill_slot_count() -
-          flow_graph_.num_copied_params());
+               flow_graph_.num_copied_params());
     }
   }
 
   if (function.IsClosureFunction()) {
-    Register reg = is_optimizing() ? flow_graph_.num_copied_params()
-                                   : context_index;
+    Register reg =
+        is_optimizing() ? flow_graph_.num_copied_params() : context_index;
     Register closure_reg = reg;
     LocalScope* scope = parsed_function().node_sequence()->scope();
     LocalVariable* local = scope->VariableAt(0);
@@ -414,7 +407,7 @@
     __ LoadField(reg, closure_reg, Closure::context_offset() / kWordSize);
   } else if (has_optional_params && !is_optimizing()) {
     __ LoadConstant(context_index,
-        Object::Handle(isolate()->object_store()->empty_context()));
+                    Object::Handle(isolate()->object_store()->empty_context()));
   }
 }
 
diff --git a/runtime/vm/flow_graph_compiler_ia32.cc b/runtime/vm/flow_graph_compiler_ia32.cc
index be480f1..729608f 100644
--- a/runtime/vm/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/flow_graph_compiler_ia32.cc
@@ -117,8 +117,7 @@
 
   // For the innermost environment, set outgoing arguments and the locals.
   for (intptr_t i = current->Length() - 1;
-       i >= current->fixed_parameter_count();
-       i--) {
+       i >= current->fixed_parameter_count(); i--) {
     builder->AddCopy(current->ValueAt(i), current->LocationAt(i), slot_ix++);
   }
 
@@ -130,26 +129,21 @@
   while (current != NULL) {
     // For any outer environment the deopt id is that of the call instruction
     // which is recorded in the outer environment.
-    builder->AddReturnAddress(
-        current->function(),
-        Thread::ToDeoptAfter(current->deopt_id()),
-        slot_ix++);
+    builder->AddReturnAddress(current->function(),
+                              Thread::ToDeoptAfter(current->deopt_id()),
+                              slot_ix++);
 
     // The values of outgoing arguments can be changed from the inlined call so
     // we must read them from the previous environment.
     for (intptr_t i = previous->fixed_parameter_count() - 1; i >= 0; i--) {
-      builder->AddCopy(previous->ValueAt(i),
-                       previous->LocationAt(i),
+      builder->AddCopy(previous->ValueAt(i), previous->LocationAt(i),
                        slot_ix++);
     }
 
     // Set the locals, note that outgoing arguments are not in the environment.
     for (intptr_t i = current->Length() - 1;
-         i >= current->fixed_parameter_count();
-         i--) {
-      builder->AddCopy(current->ValueAt(i),
-                       current->LocationAt(i),
-                       slot_ix++);
+         i >= current->fixed_parameter_count(); i--) {
+      builder->AddCopy(current->ValueAt(i), current->LocationAt(i), slot_ix++);
     }
 
     builder->AddPcMarker(current->function(), slot_ix++);
@@ -227,7 +221,7 @@
   const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   __ LoadObject(temp_reg, type_test_cache);
-  __ pushl(temp_reg);  // Subtype test cache.
+  __ pushl(temp_reg);      // Subtype test cache.
   __ pushl(instance_reg);  // Instance.
   if (test_kind == kTestTypeOneArg) {
     ASSERT(type_arguments_reg == kNoRegister);
@@ -248,7 +242,7 @@
   ASSERT(temp_reg != ECX);
   __ popl(instance_reg);  // Discard.
   __ popl(instance_reg);  // Restore receiver.
-  __ popl(temp_reg);  // Discard.
+  __ popl(temp_reg);      // Discard.
   GenerateBoolToJump(ECX, is_instance_lbl, is_not_instance_lbl);
   return type_test_cache.raw();
 }
@@ -290,7 +284,7 @@
     const TypeArguments& type_arguments =
         TypeArguments::ZoneHandle(zone(), type.arguments());
     const bool is_raw_type = type_arguments.IsNull() ||
-        type_arguments.IsRaw(from_index, num_type_params);
+                             type_arguments.IsRaw(from_index, num_type_params);
     if (is_raw_type) {
       const Register kClassIdReg = ECX;
       // dynamic type argument, check only classes.
@@ -306,8 +300,8 @@
     }
     // If one type argument only, check if type argument is Object or dynamic.
     if (type_arguments.Length() == 1) {
-      const AbstractType& tp_argument = AbstractType::ZoneHandle(
-          zone(), type_arguments.TypeAt(0));
+      const AbstractType& tp_argument =
+          AbstractType::ZoneHandle(zone(), type_arguments.TypeAt(0));
       ASSERT(!tp_argument.IsMalformed());
       if (tp_argument.IsType()) {
         ASSERT(tp_argument.HasResolvedTypeClass());
@@ -324,12 +318,9 @@
   // Regular subtype test cache involving instance's type arguments.
   const Register kTypeArgumentsReg = kNoRegister;
   const Register kTempReg = EDI;
-  return GenerateCallSubtypeTestStub(kTestTypeTwoArgs,
-                                     kInstanceReg,
-                                     kTypeArgumentsReg,
-                                     kTempReg,
-                                     is_instance_lbl,
-                                     is_not_instance_lbl);
+  return GenerateCallSubtypeTestStub(kTestTypeTwoArgs, kInstanceReg,
+                                     kTypeArgumentsReg, kTempReg,
+                                     is_instance_lbl, is_not_instance_lbl);
 }
 
 
@@ -368,11 +359,8 @@
   __ testl(kInstanceReg, Immediate(kSmiTagMask));
   // If instance is Smi, check directly.
   const Class& smi_class = Class::Handle(zone(), Smi::Class());
-  if (smi_class.IsSubtypeOf(TypeArguments::Handle(zone()),
-                            type_class,
-                            TypeArguments::Handle(zone()),
-                            NULL,
-                            NULL,
+  if (smi_class.IsSubtypeOf(TypeArguments::Handle(zone()), type_class,
+                            TypeArguments::Handle(zone()), NULL, NULL,
                             Heap::kOld)) {
     __ j(ZERO, is_instance_lbl);
   } else {
@@ -392,8 +380,8 @@
   // Custom checking for numbers (Smi, Mint, Bigint and Double).
   // Note that instance is not Smi (checked above).
   if (type.IsNumberType() || type.IsIntType() || type.IsDoubleType()) {
-    GenerateNumberTypeCheck(
-        kClassIdReg, type, is_instance_lbl, is_not_instance_lbl);
+    GenerateNumberTypeCheck(kClassIdReg, type, is_instance_lbl,
+                            is_not_instance_lbl);
     return false;
   }
   if (type.IsStringType()) {
@@ -440,12 +428,9 @@
 
   const Register kTypeArgumentsReg = kNoRegister;
   const Register kTempReg = EDI;
-  return GenerateCallSubtypeTestStub(kTestTypeOneArg,
-                                     kInstanceReg,
-                                     kTypeArgumentsReg,
-                                     kTempReg,
-                                     is_instance_lbl,
-                                     is_not_instance_lbl);
+  return GenerateCallSubtypeTestStub(kTestTypeOneArg, kInstanceReg,
+                                     kTypeArgumentsReg, kTempReg,
+                                     is_instance_lbl, is_not_instance_lbl);
 }
 
 
@@ -470,23 +455,23 @@
     // Check if type arguments are null, i.e. equivalent to vector of dynamic.
     __ cmpl(EDX, raw_null);
     __ j(EQUAL, is_instance_lbl);
-    __ movl(EDI,
-        FieldAddress(EDX, TypeArguments::type_at_offset(type_param.index())));
+    __ movl(EDI, FieldAddress(
+                     EDX, TypeArguments::type_at_offset(type_param.index())));
     // EDI: concrete type of type.
     // Check if type argument is dynamic.
     __ CompareObject(EDI, Object::dynamic_type());
-    __ j(EQUAL,  is_instance_lbl);
+    __ j(EQUAL, is_instance_lbl);
     __ CompareObject(EDI, Type::ZoneHandle(zone(), Type::ObjectType()));
-    __ j(EQUAL,  is_instance_lbl);
+    __ j(EQUAL, is_instance_lbl);
 
     // For Smi check quickly against int and num interfaces.
     Label not_smi;
     __ testl(EAX, Immediate(kSmiTagMask));  // Value is Smi?
     __ j(NOT_ZERO, &not_smi, Assembler::kNearJump);
     __ CompareObject(EDI, Type::ZoneHandle(zone(), Type::IntType()));
-    __ j(EQUAL,  is_instance_lbl);
+    __ j(EQUAL, is_instance_lbl);
     __ CompareObject(EDI, Type::ZoneHandle(zone(), Type::Number()));
-    __ j(EQUAL,  is_instance_lbl);
+    __ j(EQUAL, is_instance_lbl);
     // Smi must be handled in runtime.
     Label fall_through;
     __ jmp(&fall_through);
@@ -497,14 +482,10 @@
     const Register kInstanceReg = EAX;
     const Register kTypeArgumentsReg = EDX;
     const Register kTempReg = EDI;
-    const SubtypeTestCache& type_test_cache =
-        SubtypeTestCache::ZoneHandle(zone(),
-            GenerateCallSubtypeTestStub(kTestTypeThreeArgs,
-                                        kInstanceReg,
-                                        kTypeArgumentsReg,
-                                        kTempReg,
-                                        is_instance_lbl,
-                                        is_not_instance_lbl));
+    const SubtypeTestCache& type_test_cache = SubtypeTestCache::ZoneHandle(
+        zone(), GenerateCallSubtypeTestStub(
+                    kTestTypeThreeArgs, kInstanceReg, kTypeArgumentsReg,
+                    kTempReg, is_instance_lbl, is_not_instance_lbl));
     __ Bind(&fall_through);
     return type_test_cache.raw();
   }
@@ -517,12 +498,9 @@
     // Uninstantiated type class is known at compile time, but the type
     // arguments are determined at runtime by the instantiator.
     const Register kTempReg = EDI;
-    return GenerateCallSubtypeTestStub(kTestTypeThreeArgs,
-                                       kInstanceReg,
-                                       kTypeArgumentsReg,
-                                       kTempReg,
-                                       is_instance_lbl,
-                                       is_not_instance_lbl);
+    return GenerateCallSubtypeTestStub(kTestTypeThreeArgs, kInstanceReg,
+                                       kTypeArgumentsReg, kTempReg,
+                                       is_instance_lbl, is_not_instance_lbl);
   }
   return SubtypeTestCache::null();
 }
@@ -554,17 +532,12 @@
     // function type) of a non-parameterized class or with a raw dst type of
     // a parameterized class.
     if (type.IsFunctionType() || (type_class.NumTypeArguments() > 0)) {
-      return GenerateInstantiatedTypeWithArgumentsTest(token_pos,
-                                                       type,
-                                                       is_instance_lbl,
-                                                       is_not_instance_lbl);
+      return GenerateInstantiatedTypeWithArgumentsTest(
+          token_pos, type, is_instance_lbl, is_not_instance_lbl);
       // Fall through to runtime call.
     }
-    const bool has_fall_through =
-        GenerateInstantiatedTypeNoArgumentsTest(token_pos,
-                                                type,
-                                                is_instance_lbl,
-                                                is_not_instance_lbl);
+    const bool has_fall_through = GenerateInstantiatedTypeNoArgumentsTest(
+        token_pos, type, is_instance_lbl, is_not_instance_lbl);
     if (has_fall_through) {
       // If test non-conclusive so far, try the inlined type-test cache.
       // 'type' is known at compile time.
@@ -574,9 +547,7 @@
       return SubtypeTestCache::null();
     }
   }
-  return GenerateUninstantiatedTypeTest(token_pos,
-                                        type,
-                                        is_instance_lbl,
+  return GenerateUninstantiatedTypeTest(token_pos, type, is_instance_lbl,
                                         is_not_instance_lbl);
 }
 
@@ -619,25 +590,21 @@
 
   // Generate inline instanceof test.
   SubtypeTestCache& test_cache = SubtypeTestCache::ZoneHandle(zone());
-  test_cache = GenerateInlineInstanceof(token_pos, type,
-                                        &is_instance, &is_not_instance);
+  test_cache =
+      GenerateInlineInstanceof(token_pos, type, &is_instance, &is_not_instance);
 
   // test_cache is null if there is no fall-through.
   Label done;
   if (!test_cache.IsNull()) {
     // Generate runtime call.
-    __ movl(EDX, Address(ESP, 0));  // Get instantiator type arguments.
+    __ movl(EDX, Address(ESP, 0));         // Get instantiator type arguments.
     __ PushObject(Object::null_object());  // Make room for the result.
-    __ pushl(EAX);  // Push the instance.
-    __ PushObject(type);  // Push the type.
-    __ pushl(EDX);  // Instantiator type arguments.
+    __ pushl(EAX);                         // Push the instance.
+    __ PushObject(type);                   // Push the type.
+    __ pushl(EDX);                         // Instantiator type arguments.
     __ LoadObject(EAX, test_cache);
     __ pushl(EAX);
-    GenerateRuntimeCall(token_pos,
-                        deopt_id,
-                        kInstanceofRuntimeEntry,
-                        4,
-                        locs);
+    GenerateRuntimeCall(token_pos, deopt_id, kInstanceofRuntimeEntry, 4, locs);
     // Pop the parameters supplied to the runtime entry. The result of the
     // instanceof runtime call will be left as the result of the operation.
     __ Drop(4);
@@ -696,34 +663,31 @@
   // Generate throw new TypeError() if the type is malformed or malbounded.
   if (dst_type.IsMalformedOrMalbounded()) {
     __ PushObject(Object::null_object());  // Make room for the result.
-    __ pushl(EAX);  // Push the source object.
-    __ PushObject(dst_name);  // Push the name of the destination.
-    __ PushObject(dst_type);  // Push the type of the destination.
-    GenerateRuntimeCall(token_pos,
-                        deopt_id,
-                        kBadTypeErrorRuntimeEntry,
-                        3,
+    __ pushl(EAX);                         // Push the source object.
+    __ PushObject(dst_name);               // Push the name of the destination.
+    __ PushObject(dst_type);               // Push the type of the destination.
+    GenerateRuntimeCall(token_pos, deopt_id, kBadTypeErrorRuntimeEntry, 3,
                         locs);
     // We should never return here.
     __ int3();
 
     __ Bind(&is_assignable);  // For a null object.
-    __ popl(EDX);  // Remove pushed instantiator type arguments.
+    __ popl(EDX);             // Remove pushed instantiator type arguments.
     return;
   }
 
   // Generate inline type check, linking to runtime call if not assignable.
   SubtypeTestCache& test_cache = SubtypeTestCache::ZoneHandle(zone());
-  test_cache = GenerateInlineInstanceof(token_pos, dst_type,
-                                        &is_assignable, &runtime_call);
+  test_cache = GenerateInlineInstanceof(token_pos, dst_type, &is_assignable,
+                                        &runtime_call);
 
   __ Bind(&runtime_call);
-  __ movl(EDX, Address(ESP, 0));  // Get instantiator type arguments.
+  __ movl(EDX, Address(ESP, 0));         // Get instantiator type arguments.
   __ PushObject(Object::null_object());  // Make room for the result.
-  __ pushl(EAX);  // Push the source object.
-  __ PushObject(dst_type);  // Push the type of the destination.
-  __ pushl(EDX);  // Instantiator type arguments.
-  __ PushObject(dst_name);  // Push the name of the destination.
+  __ pushl(EAX);                         // Push the source object.
+  __ PushObject(dst_type);               // Push the type of the destination.
+  __ pushl(EDX);                         // Instantiator type arguments.
+  __ PushObject(dst_name);               // Push the name of the destination.
   __ LoadObject(EAX, test_cache);
   __ pushl(EAX);
   GenerateRuntimeCall(token_pos, deopt_id, kTypeCheckRuntimeEntry, 5, locs);
@@ -792,8 +756,8 @@
   // Let EBX point to the last passed positional argument, i.e. to
   // fp[kParamEndSlotFromFp + num_args - (num_pos_args - 1)].
   __ subl(EBX, ECX);
-  __ leal(EBX, Address(EBP, EBX, TIMES_2,
-                       (kParamEndSlotFromFp + 1) * kWordSize));
+  __ leal(EBX,
+          Address(EBP, EBX, TIMES_2, (kParamEndSlotFromFp + 1) * kWordSize));
 
   // Let EDI point to the last copied positional argument, i.e. to
   // fp[kFirstLocalSlotFromFp - (num_pos_args - 1)].
@@ -820,9 +784,9 @@
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   Label all_arguments_processed;
 #ifdef DEBUG
-    const bool check_correct_named_args = true;
+  const bool check_correct_named_args = true;
 #else
-    const bool check_correct_named_args = function.IsClosureFunction();
+  const bool check_correct_named_args = function.IsClosureFunction();
 #endif
   if (num_opt_named_params > 0) {
     // Start by alphabetically sorting the names of the optional parameters.
@@ -850,8 +814,7 @@
     __ SmiUntag(ECX);
     // Let EBX point to the first passed argument, i.e. to
     // fp[kParamEndSlotFromFp + num_args - 0]; num_args (EBX) is Smi.
-    __ leal(EBX,
-            Address(EBP, EBX, TIMES_2, kParamEndSlotFromFp * kWordSize));
+    __ leal(EBX, Address(EBP, EBX, TIMES_2, kParamEndSlotFromFp * kWordSize));
     // Let EDI point to the entry of the first named argument.
     __ leal(EDI,
             FieldAddress(EDX, ArgumentsDescriptor::first_named_entry_offset()));
@@ -951,8 +914,8 @@
   __ SmiUntag(ECX);
   Label null_args_loop, null_args_loop_condition;
   __ jmp(&null_args_loop_condition, Assembler::kNearJump);
-  const Address original_argument_addr(
-      EBP, ECX, TIMES_4, (kParamEndSlotFromFp + 1) * kWordSize);
+  const Address original_argument_addr(EBP, ECX, TIMES_4,
+                                       (kParamEndSlotFromFp + 1) * kWordSize);
   __ Bind(&null_args_loop);
   __ movl(original_argument_addr, raw_null);
   __ Bind(&null_args_loop_condition);
@@ -992,8 +955,7 @@
 // needs to be updated to match.
 void FlowGraphCompiler::EmitFrameEntry() {
   const Function& function = parsed_function().function();
-  if (CanOptimizeFunction() &&
-      function.IsOptimizable() &&
+  if (CanOptimizeFunction() && function.IsOptimizable() &&
       (!is_optimizing() || may_reoptimize())) {
     __ Comment("Invocation Count Check");
     const Register function_reg = EBX;
@@ -1011,9 +973,8 @@
   }
   __ Comment("Enter frame");
   if (flow_graph().IsCompiledForOsr()) {
-    intptr_t extra_slots = StackSize()
-        - flow_graph().num_stack_locals()
-        - flow_graph().num_copied_params();
+    intptr_t extra_slots = StackSize() - flow_graph().num_stack_locals() -
+                           flow_graph().num_copied_params();
     ASSERT(extra_slots >= 0);
     __ EnterOsrFrame(extra_slots * kWordSize);
   } else {
@@ -1053,9 +1014,8 @@
       __ movl(EAX, FieldAddress(EDX, ArgumentsDescriptor::count_offset()));
       __ cmpl(EAX, Immediate(Smi::RawValue(num_fixed_params)));
       __ j(NOT_EQUAL, &wrong_num_arguments, Assembler::kNearJump);
-      __ cmpl(EAX,
-              FieldAddress(EDX,
-                           ArgumentsDescriptor::positional_count_offset()));
+      __ cmpl(EAX, FieldAddress(
+                       EDX, ArgumentsDescriptor::positional_count_offset()));
       __ j(EQUAL, &correct_num_arguments, Assembler::kNearJump);
 
       __ Bind(&wrong_num_arguments);
@@ -1180,20 +1140,16 @@
 }
 
 
-void FlowGraphCompiler::EmitUnoptimizedStaticCall(
-    intptr_t argument_count,
-    intptr_t deopt_id,
-    TokenPosition token_pos,
-    LocationSummary* locs,
-    const ICData& ic_data) {
+void FlowGraphCompiler::EmitUnoptimizedStaticCall(intptr_t argument_count,
+                                                  intptr_t deopt_id,
+                                                  TokenPosition token_pos,
+                                                  LocationSummary* locs,
+                                                  const ICData& ic_data) {
   const StubEntry& stub_entry =
       *StubCode::UnoptimizedStaticCallEntry(ic_data.NumArgsTested());
   __ LoadObject(ECX, ic_data);
-  GenerateDartCall(deopt_id,
-                   token_pos,
-                   stub_entry,
-                   RawPcDescriptors::kUnoptStaticCall,
-                   locs);
+  GenerateDartCall(deopt_id, token_pos, stub_entry,
+                   RawPcDescriptors::kUnoptStaticCall, locs);
   __ Drop(argument_count);
 }
 
@@ -1211,13 +1167,12 @@
 }
 
 
-void FlowGraphCompiler::EmitOptimizedInstanceCall(
-    const StubEntry& stub_entry,
-    const ICData& ic_data,
-    intptr_t argument_count,
-    intptr_t deopt_id,
-    TokenPosition token_pos,
-    LocationSummary* locs) {
+void FlowGraphCompiler::EmitOptimizedInstanceCall(const StubEntry& stub_entry,
+                                                  const ICData& ic_data,
+                                                  intptr_t argument_count,
+                                                  intptr_t deopt_id,
+                                                  TokenPosition token_pos,
+                                                  LocationSummary* locs) {
   ASSERT(Array::Handle(ic_data.arguments_descriptor()).Length() > 0);
   // Each ICData propagated from unoptimized to optimized code contains the
   // function that corresponds to the Dart function of that IC call. Due
@@ -1227,10 +1182,7 @@
   // Pass the function explicitly, it is used in IC stub.
   __ LoadObject(EBX, parsed_function().function());
   __ LoadObject(ECX, ic_data);
-  GenerateDartCall(deopt_id,
-                   token_pos,
-                   stub_entry,
-                   RawPcDescriptors::kIcCall,
+  GenerateDartCall(deopt_id, token_pos, stub_entry, RawPcDescriptors::kIcCall,
                    locs);
   __ Drop(argument_count);
 }
@@ -1244,10 +1196,7 @@
                                          LocationSummary* locs) {
   ASSERT(Array::Handle(ic_data.arguments_descriptor()).Length() > 0);
   __ LoadObject(ECX, ic_data);
-  GenerateDartCall(deopt_id,
-                   token_pos,
-                   stub_entry,
-                   RawPcDescriptors::kIcCall,
+  GenerateDartCall(deopt_id, token_pos, stub_entry, RawPcDescriptors::kIcCall,
                    locs);
   __ Drop(argument_count);
 }
@@ -1265,7 +1214,8 @@
   const Array& arguments_descriptor =
       Array::ZoneHandle(zone(), ic_data.arguments_descriptor());
   ASSERT(!arguments_descriptor.IsNull() && (arguments_descriptor.Length() > 0));
-  const MegamorphicCache& cache = MegamorphicCache::ZoneHandle(zone(),
+  const MegamorphicCache& cache = MegamorphicCache::ZoneHandle(
+      zone(),
       MegamorphicCacheTable::Lookup(isolate(), name, arguments_descriptor));
 
   __ Comment("MegamorphicCall");
@@ -1293,8 +1243,7 @@
   __ call(EBX);
 
   __ Bind(&done);
-  AddCurrentDescriptor(RawPcDescriptors::kOther,
-      Thread::kNoDeoptId, token_pos);
+  AddCurrentDescriptor(RawPcDescriptors::kOther, Thread::kNoDeoptId, token_pos);
   RecordSafepoint(locs, slow_path_argument_count);
   const intptr_t deopt_id_after = Thread::ToDeoptAfter(deopt_id);
   // Precompilation not implemented on ia32 platform.
@@ -1310,12 +1259,11 @@
 }
 
 
-void FlowGraphCompiler::EmitSwitchableInstanceCall(
-    const ICData& ic_data,
-    intptr_t argument_count,
-    intptr_t deopt_id,
-    TokenPosition token_pos,
-    LocationSummary* locs) {
+void FlowGraphCompiler::EmitSwitchableInstanceCall(const ICData& ic_data,
+                                                   intptr_t argument_count,
+                                                   intptr_t deopt_id,
+                                                   TokenPosition token_pos,
+                                                   LocationSummary* locs) {
   // Only generated with precompilation.
   UNREACHABLE();
 }
@@ -1335,11 +1283,8 @@
   }
   // Do not use the code from the function, but let the code be patched so that
   // we can record the outgoing edges to other code.
-  GenerateDartCall(deopt_id,
-                   token_pos,
-                   *StubCode::CallStaticFunction_entry(),
-                   RawPcDescriptors::kOther,
-                   locs);
+  GenerateDartCall(deopt_id, token_pos, *StubCode::CallStaticFunction_entry(),
+                   RawPcDescriptors::kOther, locs);
   AddStaticCallTarget(function);
   __ Drop(argument_count);
 }
@@ -1368,15 +1313,14 @@
       __ Call(*StubCode::UnoptimizedIdenticalWithNumberCheck_entry());
     }
     if (token_pos.IsReal()) {
-      AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall,
-                           Thread::kNoDeoptId,
+      AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall, Thread::kNoDeoptId,
                            token_pos);
     }
     // Stub returns result in flags (result of a cmpl, we need ZF computed).
     __ popl(reg);  // Discard constant.
     __ popl(reg);  // Restore 'reg'.
   } else {
-  __ CompareObject(reg, obj);
+    __ CompareObject(reg, obj);
   }
   return EQUAL;
 }
@@ -1396,8 +1340,7 @@
       __ Call(*StubCode::UnoptimizedIdenticalWithNumberCheck_entry());
     }
     if (token_pos.IsReal()) {
-      AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall,
-                           Thread::kNoDeoptId,
+      AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall, Thread::kNoDeoptId,
                            token_pos);
     }
     // Stub returns result in flags (result of a cmpl, we need ZF computed).
@@ -1498,9 +1441,8 @@
   ASSERT(is_optimizing());
   ASSERT(!complete);
   __ Comment("EmitTestAndCall");
-  const Array& arguments_descriptor =
-      Array::ZoneHandle(zone(), ArgumentsDescriptor::New(argument_count,
-                                                         argument_names));
+  const Array& arguments_descriptor = Array::ZoneHandle(
+      zone(), ArgumentsDescriptor::New(argument_count, argument_names));
   // Load receiver into EAX.
   __ movl(EAX, Address(ESP, (argument_count - 1) * kWordSize));
   __ LoadObject(EDX, arguments_descriptor);
@@ -1521,13 +1463,11 @@
     }
     // Do not use the code from the function, but let the code be patched so
     // that we can record the outgoing edges to other code.
-    GenerateDartCall(deopt_id,
-                     token_index,
+    GenerateDartCall(deopt_id, token_index,
                      *StubCode::CallStaticFunction_entry(),
-                     RawPcDescriptors::kOther,
-                     locs);
-    const Function& function = Function::ZoneHandle(
-        zone(), ic_data.GetTargetAt(0));
+                     RawPcDescriptors::kOther, locs);
+    const Function& function =
+        Function::ZoneHandle(zone(), ic_data.GetTargetAt(0));
     AddStaticCallTarget(function);
     __ Drop(argument_count);
     if (kNumChecks > 1) {
@@ -1564,11 +1504,9 @@
     }
     // Do not use the code from the function, but let the code be patched so
     // that we can record the outgoing edges to other code.
-    GenerateDartCall(deopt_id,
-                     token_index,
+    GenerateDartCall(deopt_id, token_index,
                      *StubCode::CallStaticFunction_entry(),
-                     RawPcDescriptors::kOther,
-                     locs);
+                     RawPcDescriptors::kOther, locs);
     const Function& function = *sorted[i].target;
     AddStaticCallTarget(function);
     __ Drop(argument_count);
@@ -1640,7 +1578,8 @@
       if (constant.IsSmi() && (Smi::Cast(constant).Value() == 0)) {
         __ xorl(destination.reg(), destination.reg());
       } else if (constant.IsSmi() &&
-          (source.constant_instruction()->representation() == kUnboxedInt32)) {
+                 (source.constant_instruction()->representation() ==
+                  kUnboxedInt32)) {
         __ movl(destination.reg(), Immediate(Smi::Cast(constant).Value()));
       } else {
         __ LoadObjectSafely(destination.reg(), constant);
@@ -1652,7 +1591,7 @@
         __ pushl(EAX);
         __ LoadObject(EAX, constant);
         __ movsd(destination.fpu_reg(),
-            FieldAddress(EAX, Double::value_offset()));
+                 FieldAddress(EAX, Double::value_offset()));
         __ popl(EAX);
       } else if (Utils::DoublesBitEqual(constant.value(), 0.0)) {
         __ xorps(destination.fpu_reg(), destination.fpu_reg());
@@ -1708,17 +1647,15 @@
     __ movaps(source.fpu_reg(), destination.fpu_reg());
     __ movaps(destination.fpu_reg(), XMM0);
   } else if (source.IsFpuRegister() || destination.IsFpuRegister()) {
-    ASSERT(destination.IsDoubleStackSlot() ||
-           destination.IsQuadStackSlot() ||
-           source.IsDoubleStackSlot() ||
-           source.IsQuadStackSlot());
-    bool double_width = destination.IsDoubleStackSlot() ||
-                        source.IsDoubleStackSlot();
-    XmmRegister reg = source.IsFpuRegister() ? source.fpu_reg()
-                                             : destination.fpu_reg();
+    ASSERT(destination.IsDoubleStackSlot() || destination.IsQuadStackSlot() ||
+           source.IsDoubleStackSlot() || source.IsQuadStackSlot());
+    bool double_width =
+        destination.IsDoubleStackSlot() || source.IsDoubleStackSlot();
+    XmmRegister reg =
+        source.IsFpuRegister() ? source.fpu_reg() : destination.fpu_reg();
     const Address& slot_address = source.IsFpuRegister()
-        ? destination.ToStackSlotAddress()
-        : source.ToStackSlotAddress();
+                                      ? destination.ToStackSlotAddress()
+                                      : source.ToStackSlotAddress();
 
     if (double_width) {
       __ movsd(XMM0, slot_address);
diff --git a/runtime/vm/flow_graph_compiler_mips.cc b/runtime/vm/flow_graph_compiler_mips.cc
index ca0be62..fe38b17 100644
--- a/runtime/vm/flow_graph_compiler_mips.cc
+++ b/runtime/vm/flow_graph_compiler_mips.cc
@@ -116,8 +116,7 @@
 
   // For the innermost environment, set outgoing arguments and the locals.
   for (intptr_t i = current->Length() - 1;
-       i >= current->fixed_parameter_count();
-       i--) {
+       i >= current->fixed_parameter_count(); i--) {
     builder->AddCopy(current->ValueAt(i), current->LocationAt(i), slot_ix++);
   }
 
@@ -130,26 +129,21 @@
 
     // For any outer environment the deopt id is that of the call instruction
     // which is recorded in the outer environment.
-    builder->AddReturnAddress(
-        current->function(),
-        Thread::ToDeoptAfter(current->deopt_id()),
-        slot_ix++);
+    builder->AddReturnAddress(current->function(),
+                              Thread::ToDeoptAfter(current->deopt_id()),
+                              slot_ix++);
 
     // The values of outgoing arguments can be changed from the inlined call so
     // we must read them from the previous environment.
     for (intptr_t i = previous->fixed_parameter_count() - 1; i >= 0; i--) {
-      builder->AddCopy(previous->ValueAt(i),
-                       previous->LocationAt(i),
+      builder->AddCopy(previous->ValueAt(i), previous->LocationAt(i),
                        slot_ix++);
     }
 
     // Set the locals, note that outgoing arguments are not in the environment.
     for (intptr_t i = current->Length() - 1;
-         i >= current->fixed_parameter_count();
-         i--) {
-      builder->AddCopy(current->ValueAt(i),
-                       current->LocationAt(i),
-                       slot_ix++);
+         i >= current->fixed_parameter_count(); i--) {
+      builder->AddCopy(current->ValueAt(i), current->LocationAt(i), slot_ix++);
     }
 
     // Iterate on the outer environment.
@@ -281,7 +275,7 @@
     const TypeArguments& type_arguments =
         TypeArguments::ZoneHandle(zone(), type.arguments());
     const bool is_raw_type = type_arguments.IsNull() ||
-        type_arguments.IsRaw(from_index, num_type_params);
+                             type_arguments.IsRaw(from_index, num_type_params);
     if (is_raw_type) {
       const Register kClassIdReg = T0;
       // dynamic type argument, check only classes.
@@ -296,8 +290,8 @@
     }
     // If one type argument only, check if type argument is Object or dynamic.
     if (type_arguments.Length() == 1) {
-      const AbstractType& tp_argument = AbstractType::ZoneHandle(zone(),
-          type_arguments.TypeAt(0));
+      const AbstractType& tp_argument =
+          AbstractType::ZoneHandle(zone(), type_arguments.TypeAt(0));
       ASSERT(!tp_argument.IsMalformed());
       if (tp_argument.IsType()) {
         ASSERT(tp_argument.HasResolvedTypeClass());
@@ -315,12 +309,9 @@
   const Register kTypeArgumentsReg = kNoRegister;
   const Register kTempReg = kNoRegister;
   // A0: instance (must be preserved).
-  return GenerateCallSubtypeTestStub(kTestTypeTwoArgs,
-                                     kInstanceReg,
-                                     kTypeArgumentsReg,
-                                     kTempReg,
-                                     is_instance_lbl,
-                                     is_not_instance_lbl);
+  return GenerateCallSubtypeTestStub(kTestTypeTwoArgs, kInstanceReg,
+                                     kTypeArgumentsReg, kTempReg,
+                                     is_instance_lbl, is_not_instance_lbl);
 }
 
 
@@ -359,11 +350,8 @@
   __ andi(T0, A0, Immediate(kSmiTagMask));
   // If instance is Smi, check directly.
   const Class& smi_class = Class::Handle(zone(), Smi::Class());
-  if (smi_class.IsSubtypeOf(TypeArguments::Handle(zone()),
-                            type_class,
-                            TypeArguments::Handle(zone()),
-                            NULL,
-                            NULL,
+  if (smi_class.IsSubtypeOf(TypeArguments::Handle(zone()), type_class,
+                            TypeArguments::Handle(zone()), NULL, NULL,
                             Heap::kOld)) {
     __ beq(T0, ZR, is_instance_lbl);
   } else {
@@ -382,8 +370,8 @@
   // Custom checking for numbers (Smi, Mint, Bigint and Double).
   // Note that instance is not Smi (checked above).
   if (type.IsNumberType() || type.IsIntType() || type.IsDoubleType()) {
-    GenerateNumberTypeCheck(
-        kClassIdReg, type, is_instance_lbl, is_not_instance_lbl);
+    GenerateNumberTypeCheck(kClassIdReg, type, is_instance_lbl,
+                            is_not_instance_lbl);
     return false;
   }
   if (type.IsStringType()) {
@@ -397,7 +385,7 @@
   }
   // Compare if the classes are equal.
   if (!type_class.is_abstract()) {
-  __ BranchEqual(kClassIdReg, Immediate(type_class.id()), is_instance_lbl);
+    __ BranchEqual(kClassIdReg, Immediate(type_class.id()), is_instance_lbl);
   }
   // Otherwise fallthrough.
   return true;
@@ -428,12 +416,9 @@
 
   const Register kTypeArgumentsReg = kNoRegister;
   const Register kTempReg = kNoRegister;
-  return GenerateCallSubtypeTestStub(kTestTypeOneArg,
-                                     kInstanceReg,
-                                     kTypeArgumentsReg,
-                                     kTempReg,
-                                     is_instance_lbl,
-                                     is_not_instance_lbl);
+  return GenerateCallSubtypeTestStub(kTestTypeOneArg, kInstanceReg,
+                                     kTypeArgumentsReg, kTempReg,
+                                     is_instance_lbl, is_not_instance_lbl);
 }
 
 
@@ -456,22 +441,21 @@
     __ LoadObject(T7, Object::null_object());
     __ beq(A1, T7, is_instance_lbl);
     __ lw(T2,
-        FieldAddress(A1, TypeArguments::type_at_offset(type_param.index())));
+          FieldAddress(A1, TypeArguments::type_at_offset(type_param.index())));
     // R2: concrete type of type.
     // Check if type argument is dynamic.
-    __ BranchEqual(T2,
-        Object::dynamic_type(), is_instance_lbl);
-    __ BranchEqual(T2,
-        Type::ZoneHandle(zone(), Type::ObjectType()), is_instance_lbl);
+    __ BranchEqual(T2, Object::dynamic_type(), is_instance_lbl);
+    __ BranchEqual(T2, Type::ZoneHandle(zone(), Type::ObjectType()),
+                   is_instance_lbl);
 
     // For Smi check quickly against int and num interfaces.
     Label not_smi;
     __ andi(CMPRES1, A0, Immediate(kSmiTagMask));
     __ bne(CMPRES1, ZR, &not_smi);  // Value is Smi?
-    __ BranchEqual(T2,
-        Type::ZoneHandle(zone(), Type::IntType()), is_instance_lbl);
-    __ BranchEqual(T2,
-        Type::ZoneHandle(zone(), Type::Number()), is_instance_lbl);
+    __ BranchEqual(T2, Type::ZoneHandle(zone(), Type::IntType()),
+                   is_instance_lbl);
+    __ BranchEqual(T2, Type::ZoneHandle(zone(), Type::Number()),
+                   is_instance_lbl);
     // Smi must be handled in runtime.
     Label fall_through;
     __ b(&fall_through);
@@ -482,14 +466,10 @@
     const Register kInstanceReg = A0;
     const Register kTypeArgumentsReg = A1;
     const Register kTempReg = kNoRegister;
-    const SubtypeTestCache& type_test_cache =
-        SubtypeTestCache::ZoneHandle(zone(),
-            GenerateCallSubtypeTestStub(kTestTypeThreeArgs,
-                                        kInstanceReg,
-                                        kTypeArgumentsReg,
-                                        kTempReg,
-                                        is_instance_lbl,
-                                        is_not_instance_lbl));
+    const SubtypeTestCache& type_test_cache = SubtypeTestCache::ZoneHandle(
+        zone(), GenerateCallSubtypeTestStub(
+                    kTestTypeThreeArgs, kInstanceReg, kTypeArgumentsReg,
+                    kTempReg, is_instance_lbl, is_not_instance_lbl));
     __ Bind(&fall_through);
     return type_test_cache.raw();
   }
@@ -502,12 +482,9 @@
     // Uninstantiated type class is known at compile time, but the type
     // arguments are determined at runtime by the instantiator.
     const Register kTempReg = kNoRegister;
-    return GenerateCallSubtypeTestStub(kTestTypeThreeArgs,
-                                       kInstanceReg,
-                                       kTypeArgumentsReg,
-                                       kTempReg,
-                                       is_instance_lbl,
-                                       is_not_instance_lbl);
+    return GenerateCallSubtypeTestStub(kTestTypeThreeArgs, kInstanceReg,
+                                       kTypeArgumentsReg, kTempReg,
+                                       is_instance_lbl, is_not_instance_lbl);
   }
   return SubtypeTestCache::null();
 }
@@ -539,17 +516,12 @@
     // function type) of a non-parameterized class or with a raw dst type of
     // a parameterized class.
     if (type.IsFunctionType() || (type_class.NumTypeArguments() > 0)) {
-      return GenerateInstantiatedTypeWithArgumentsTest(token_pos,
-                                                       type,
-                                                       is_instance_lbl,
-                                                       is_not_instance_lbl);
+      return GenerateInstantiatedTypeWithArgumentsTest(
+          token_pos, type, is_instance_lbl, is_not_instance_lbl);
       // Fall through to runtime call.
     }
-    const bool has_fall_through =
-        GenerateInstantiatedTypeNoArgumentsTest(token_pos,
-                                                type,
-                                                is_instance_lbl,
-                                                is_not_instance_lbl);
+    const bool has_fall_through = GenerateInstantiatedTypeNoArgumentsTest(
+        token_pos, type, is_instance_lbl, is_not_instance_lbl);
     if (has_fall_through) {
       // If test non-conclusive so far, try the inlined type-test cache.
       // 'type' is known at compile time.
@@ -559,9 +531,7 @@
       return SubtypeTestCache::null();
     }
   }
-  return GenerateUninstantiatedTypeTest(token_pos,
-                                        type,
-                                        is_instance_lbl,
+  return GenerateUninstantiatedTypeTest(token_pos, type, is_instance_lbl,
                                         is_not_instance_lbl);
 }
 
@@ -599,13 +569,13 @@
     // time, since an uninstantiated type at compile time could be Object or
     // dynamic at run time.
     __ BranchEqual(A0, Object::null_object(),
-        type.IsNullType() ? &is_instance : &is_not_instance);
+                   type.IsNullType() ? &is_instance : &is_not_instance);
   }
 
   // Generate inline instanceof test.
   SubtypeTestCache& test_cache = SubtypeTestCache::ZoneHandle(zone());
-  test_cache = GenerateInlineInstanceof(token_pos, type,
-                                        &is_instance, &is_not_instance);
+  test_cache =
+      GenerateInlineInstanceof(token_pos, type, &is_instance, &is_not_instance);
 
   // test_cache is null if there is no fall-through.
   Label done;
@@ -617,10 +587,10 @@
     __ addiu(SP, SP, Immediate(-5 * kWordSize));
     __ LoadObject(TMP, Object::null_object());
     __ sw(TMP, Address(SP, 4 * kWordSize));  // Make room for the result.
-    __ sw(A0, Address(SP, 3 * kWordSize));  // Push the instance.
+    __ sw(A0, Address(SP, 3 * kWordSize));   // Push the instance.
     __ LoadObject(TMP, type);
     __ sw(TMP, Address(SP, 2 * kWordSize));  // Push the type.
-    __ sw(A1, Address(SP, 1 * kWordSize));  // Push type arguments.
+    __ sw(A1, Address(SP, 1 * kWordSize));   // Push type arguments.
     __ LoadUniqueObject(A0, test_cache);
     __ sw(A0, Address(SP, 0 * kWordSize));
     GenerateRuntimeCall(token_pos, deopt_id, kInstanceofRuntimeEntry, 4, locs);
@@ -688,16 +658,13 @@
     __ addiu(SP, SP, Immediate(-4 * kWordSize));
     __ LoadObject(TMP, Object::null_object());
     __ sw(TMP, Address(SP, 3 * kWordSize));  // Make room for the result.
-    __ sw(A0, Address(SP, 2 * kWordSize));  // Push the source object.
+    __ sw(A0, Address(SP, 2 * kWordSize));   // Push the source object.
     __ LoadObject(TMP, dst_name);
     __ sw(TMP, Address(SP, 1 * kWordSize));  // Push the destination name.
     __ LoadObject(TMP, dst_type);
     __ sw(TMP, Address(SP, 0 * kWordSize));  // Push the destination type.
 
-    GenerateRuntimeCall(token_pos,
-                        deopt_id,
-                        kBadTypeErrorRuntimeEntry,
-                        3,
+    GenerateRuntimeCall(token_pos, deopt_id, kBadTypeErrorRuntimeEntry, 3,
                         locs);
     // We should never return here.
     __ break_(0);
@@ -711,8 +678,8 @@
 
   // Generate inline type check, linking to runtime call if not assignable.
   SubtypeTestCache& test_cache = SubtypeTestCache::ZoneHandle(zone());
-  test_cache = GenerateInlineInstanceof(token_pos, dst_type,
-                                        &is_assignable, &runtime_call);
+  test_cache = GenerateInlineInstanceof(token_pos, dst_type, &is_assignable,
+                                        &runtime_call);
 
   __ Bind(&runtime_call);
   // Load instantiator type arguments (A1).
@@ -721,10 +688,10 @@
   __ addiu(SP, SP, Immediate(-6 * kWordSize));
   __ LoadObject(TMP, Object::null_object());
   __ sw(TMP, Address(SP, 5 * kWordSize));  // Make room for the result.
-  __ sw(A0, Address(SP, 4 * kWordSize));  // Push the source object.
+  __ sw(A0, Address(SP, 4 * kWordSize));   // Push the source object.
   __ LoadObject(TMP, dst_type);
   __ sw(TMP, Address(SP, 3 * kWordSize));  // Push the type of the destination.
-  __ sw(A1, Address(SP, 2 * kWordSize));  // Push type arguments.
+  __ sw(A1, Address(SP, 2 * kWordSize));   // Push type arguments.
   __ LoadObject(TMP, dst_name);
   __ sw(TMP, Address(SP, 1 * kWordSize));  // Push the name of the destination.
   __ LoadUniqueObject(T0, test_cache);
@@ -815,9 +782,9 @@
   // Copy or initialize optional named arguments.
   Label all_arguments_processed;
 #ifdef DEBUG
-    const bool check_correct_named_args = true;
+  const bool check_correct_named_args = true;
 #else
-    const bool check_correct_named_args = function.IsClosureFunction();
+  const bool check_correct_named_args = function.IsClosureFunction();
 #endif
   if (num_opt_named_params > 0) {
     __ Comment("There are named parameters");
@@ -849,8 +816,8 @@
     __ addu(T1, FP, T3);
     __ AddImmediate(T1, kParamEndSlotFromFp * kWordSize);
     // Let T0 point to the entry of the first named argument.
-    __ AddImmediate(T0, S4,
-        ArgumentsDescriptor::first_named_entry_offset() - kHeapObjectTag);
+    __ AddImmediate(T0, S4, ArgumentsDescriptor::first_named_entry_offset() -
+                                kHeapObjectTag);
     for (int i = 0; i < num_opt_named_params; i++) {
       Label load_default_value, assign_optional_parameter;
       const int param_pos = opt_param_position[i];
@@ -896,8 +863,7 @@
   } else {
     ASSERT(num_opt_pos_params > 0);
     __ Comment("There are optional positional parameters");
-    __ lw(T2,
-          FieldAddress(S4, ArgumentsDescriptor::positional_count_offset()));
+    __ lw(T2, FieldAddress(S4, ArgumentsDescriptor::positional_count_offset()));
     __ SmiUntag(T2);
     for (int i = 0; i < num_opt_pos_params; i++) {
       Label next_parameter;
@@ -990,8 +956,7 @@
 
 void FlowGraphCompiler::EmitFrameEntry() {
   const Function& function = parsed_function().function();
-  if (CanOptimizeFunction() &&
-      function.IsOptimizable() &&
+  if (CanOptimizeFunction() && function.IsOptimizable() &&
       (!is_optimizing() || may_reoptimize())) {
     __ Comment("Invocation Count Check");
     const Register function_reg = T0;
@@ -1011,8 +976,8 @@
 
     // Skip Branch if T1 is less than the threshold.
     Label dont_branch;
-    __ BranchSignedLess(
-        T1, Immediate(GetOptimizationThreshold()), &dont_branch);
+    __ BranchSignedLess(T1, Immediate(GetOptimizationThreshold()),
+                        &dont_branch);
 
     ASSERT(function_reg == T0);
     __ Branch(*StubCode::OptimizeFunction_entry(), new_pp);
@@ -1021,9 +986,8 @@
   }
   __ Comment("Enter frame");
   if (flow_graph().IsCompiledForOsr()) {
-    intptr_t extra_slots = StackSize()
-        - flow_graph().num_stack_locals()
-        - flow_graph().num_copied_params();
+    intptr_t extra_slots = StackSize() - flow_graph().num_stack_locals() -
+                           flow_graph().num_copied_params();
     ASSERT(extra_slots >= 0);
     __ EnterOsrFrame(extra_slots * kWordSize);
   } else {
@@ -1077,8 +1041,8 @@
       __ BranchNotEqual(T0, Immediate(Smi::RawValue(num_fixed_params)),
                         &wrong_num_arguments);
 
-      __ lw(T1, FieldAddress(S4,
-                             ArgumentsDescriptor::positional_count_offset()));
+      __ lw(T1,
+            FieldAddress(S4, ArgumentsDescriptor::positional_count_offset()));
       __ beq(T0, T1, &correct_num_arguments);
       __ Bind(&wrong_num_arguments);
       __ LeaveDartFrame(kKeepCalleePP);  // Arguments are still on the stack.
@@ -1161,9 +1125,7 @@
   } else {
     // Add deoptimization continuation point after the call and before the
     // arguments are removed.
-    AddCurrentDescriptor(RawPcDescriptors::kDeopt,
-                         deopt_id_after,
-                         token_pos);
+    AddCurrentDescriptor(RawPcDescriptors::kDeopt, deopt_id_after, token_pos);
   }
 }
 
@@ -1190,9 +1152,7 @@
   } else {
     // Add deoptimization continuation point after the call and before the
     // arguments are removed.
-    AddCurrentDescriptor(RawPcDescriptors::kDeopt,
-                         deopt_id_after,
-                         token_pos);
+    AddCurrentDescriptor(RawPcDescriptors::kDeopt, deopt_id_after, token_pos);
   }
   AddStaticCallTarget(target);
 }
@@ -1215,9 +1175,7 @@
     } else {
       // Add deoptimization continuation point after the call and before the
       // arguments are removed.
-      AddCurrentDescriptor(RawPcDescriptors::kDeopt,
-                           deopt_id_after,
-                           token_pos);
+      AddCurrentDescriptor(RawPcDescriptors::kDeopt, deopt_id_after, token_pos);
     }
   }
 }
@@ -1238,13 +1196,12 @@
 }
 
 
-void FlowGraphCompiler::EmitOptimizedInstanceCall(
-    const StubEntry& stub_entry,
-    const ICData& ic_data,
-    intptr_t argument_count,
-    intptr_t deopt_id,
-    TokenPosition token_pos,
-    LocationSummary* locs) {
+void FlowGraphCompiler::EmitOptimizedInstanceCall(const StubEntry& stub_entry,
+                                                  const ICData& ic_data,
+                                                  intptr_t argument_count,
+                                                  intptr_t deopt_id,
+                                                  TokenPosition token_pos,
+                                                  LocationSummary* locs) {
   ASSERT(Array::Handle(zone(), ic_data.arguments_descriptor()).Length() > 0);
   // Each ICData propagated from unoptimized to optimized code contains the
   // function that corresponds to the Dart function of that IC call. Due
@@ -1255,10 +1212,7 @@
   __ Comment("OptimizedInstanceCall");
   __ LoadObject(T0, parsed_function().function());
   __ LoadUniqueObject(S5, ic_data);
-  GenerateDartCall(deopt_id,
-                   token_pos,
-                   stub_entry,
-                   RawPcDescriptors::kIcCall,
+  GenerateDartCall(deopt_id, token_pos, stub_entry, RawPcDescriptors::kIcCall,
                    locs);
   __ Drop(argument_count);
 }
@@ -1273,10 +1227,7 @@
   ASSERT(Array::Handle(zone(), ic_data.arguments_descriptor()).Length() > 0);
   __ Comment("InstanceCall");
   __ LoadUniqueObject(S5, ic_data);
-  GenerateDartCall(deopt_id,
-                   token_pos,
-                   stub_entry,
-                   RawPcDescriptors::kIcCall,
+  GenerateDartCall(deopt_id, token_pos, stub_entry, RawPcDescriptors::kIcCall,
                    locs);
   __ Comment("InstanceCall return");
   __ Drop(argument_count);
@@ -1295,7 +1246,8 @@
   const Array& arguments_descriptor =
       Array::ZoneHandle(zone(), ic_data.arguments_descriptor());
   ASSERT(!arguments_descriptor.IsNull() && (arguments_descriptor.Length() > 0));
-  const MegamorphicCache& cache = MegamorphicCache::ZoneHandle(zone(),
+  const MegamorphicCache& cache = MegamorphicCache::ZoneHandle(
+      zone(),
       MegamorphicCacheTable::Lookup(isolate(), name, arguments_descriptor));
 
   __ Comment("MegamorphicCall");
@@ -1306,12 +1258,11 @@
     Label megamorphic_call;
     __ Comment("Inlined get:hashCode for Smi and OneByteString");
     __ andi(CMPRES1, T0, Immediate(kSmiTagMask));
-    __ beq(CMPRES1, ZR, &done);  // Is Smi.
+    __ beq(CMPRES1, ZR, &done);    // Is Smi.
     __ delay_slot()->mov(V0, T0);  // Move Smi hashcode to V0.
 
     __ LoadClassId(CMPRES1, T0);  // Class ID check.
-    __ BranchNotEqual(
-        CMPRES1, Immediate(kOneByteStringCid), &megamorphic_call);
+    __ BranchNotEqual(CMPRES1, Immediate(kOneByteStringCid), &megamorphic_call);
 
     __ lw(V0, FieldAddress(T0, String::hash_offset()));
     __ bne(V0, ZR, &done);
@@ -1332,18 +1283,16 @@
     if (try_index == CatchClauseNode::kInvalidTryIndex) {
       try_index = CurrentTryIndex();
     }
-    pc_descriptors_list()->AddDescriptor(RawPcDescriptors::kOther,
-                                         assembler()->CodeSize(),
-                                         Thread::kNoDeoptId,
-                                         token_pos,
-                                         try_index);
+    pc_descriptors_list()->AddDescriptor(
+        RawPcDescriptors::kOther, assembler()->CodeSize(), Thread::kNoDeoptId,
+        token_pos, try_index);
   } else if (is_optimizing()) {
-    AddCurrentDescriptor(RawPcDescriptors::kOther,
-        Thread::kNoDeoptId, token_pos);
+    AddCurrentDescriptor(RawPcDescriptors::kOther, Thread::kNoDeoptId,
+                         token_pos);
     AddDeoptIndexAtCall(deopt_id_after);
   } else {
-    AddCurrentDescriptor(RawPcDescriptors::kOther,
-        Thread::kNoDeoptId, token_pos);
+    AddCurrentDescriptor(RawPcDescriptors::kOther, Thread::kNoDeoptId,
+                         token_pos);
     // Add deoptimization continuation point after the call and before the
     // arguments are removed.
     AddCurrentDescriptor(RawPcDescriptors::kDeopt, deopt_id_after, token_pos);
@@ -1352,15 +1301,14 @@
 }
 
 
-void FlowGraphCompiler::EmitSwitchableInstanceCall(
-    const ICData& ic_data,
-    intptr_t argument_count,
-    intptr_t deopt_id,
-    TokenPosition token_pos,
-    LocationSummary* locs) {
+void FlowGraphCompiler::EmitSwitchableInstanceCall(const ICData& ic_data,
+                                                   intptr_t argument_count,
+                                                   intptr_t deopt_id,
+                                                   TokenPosition token_pos,
+                                                   LocationSummary* locs) {
   ASSERT(ic_data.NumArgsTested() == 1);
-  const Code& initial_stub = Code::ZoneHandle(
-      StubCode::ICCallThroughFunction_entry()->code());
+  const Code& initial_stub =
+      Code::ZoneHandle(StubCode::ICCallThroughFunction_entry()->code());
 
   __ Comment("SwitchableCall");
   __ lw(T0, Address(SP, (argument_count - 1) * kWordSize));
@@ -1369,8 +1317,7 @@
   __ LoadUniqueObject(S5, ic_data);
   __ jalr(T9);
 
-  AddCurrentDescriptor(RawPcDescriptors::kOther,
-      Thread::kNoDeoptId, token_pos);
+  AddCurrentDescriptor(RawPcDescriptors::kOther, Thread::kNoDeoptId, token_pos);
   RecordSafepoint(locs);
   const intptr_t deopt_id_after = Thread::ToDeoptAfter(deopt_id);
   if (is_optimizing()) {
@@ -1384,20 +1331,16 @@
 }
 
 
-void FlowGraphCompiler::EmitUnoptimizedStaticCall(
-    intptr_t argument_count,
-    intptr_t deopt_id,
-    TokenPosition token_pos,
-    LocationSummary* locs,
-    const ICData& ic_data) {
+void FlowGraphCompiler::EmitUnoptimizedStaticCall(intptr_t argument_count,
+                                                  intptr_t deopt_id,
+                                                  TokenPosition token_pos,
+                                                  LocationSummary* locs,
+                                                  const ICData& ic_data) {
   const StubEntry* stub_entry =
       StubCode::UnoptimizedStaticCallEntry(ic_data.NumArgsTested());
   __ LoadObject(S5, ic_data);
-  GenerateDartCall(deopt_id,
-                   token_pos,
-                   *stub_entry,
-                   RawPcDescriptors::kUnoptStaticCall,
-                   locs);
+  GenerateDartCall(deopt_id, token_pos, *stub_entry,
+                   RawPcDescriptors::kUnoptStaticCall, locs);
   __ Drop(argument_count);
 }
 
@@ -1418,12 +1361,9 @@
   }
   // Do not use the code from the function, but let the code be patched so that
   // we can record the outgoing edges to other code.
-  GenerateStaticDartCall(deopt_id,
-                         token_pos,
+  GenerateStaticDartCall(deopt_id, token_pos,
                          *StubCode::CallStaticFunction_entry(),
-                         RawPcDescriptors::kOther,
-                         locs,
-                         function);
+                         RawPcDescriptors::kOther, locs, function);
   __ Drop(argument_count);
 }
 
@@ -1450,13 +1390,12 @@
           *StubCode::UnoptimizedIdenticalWithNumberCheck_entry());
     }
     if (token_pos.IsReal()) {
-      AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall,
-                           Thread::kNoDeoptId,
+      AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall, Thread::kNoDeoptId,
                            token_pos);
     }
     __ Comment("EqualityRegConstCompare return");
     // Stub returns result in CMPRES1 (if it is 0, then reg and obj are equal).
-    __ lw(reg, Address(SP, 1 * kWordSize));  // Restore 'reg'.
+    __ lw(reg, Address(SP, 1 * kWordSize));      // Restore 'reg'.
     __ addiu(SP, SP, Immediate(2 * kWordSize));  // Discard constant.
     return Condition(CMPRES1, ZR, EQ);
   } else {
@@ -1485,8 +1424,7 @@
           *StubCode::UnoptimizedIdenticalWithNumberCheck_entry());
     }
     if (token_pos.IsReal()) {
-      AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall,
-                           Thread::kNoDeoptId,
+      AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall, Thread::kNoDeoptId,
                            token_pos);
     }
     __ Comment("EqualityRegRegCompare return");
@@ -1609,9 +1547,8 @@
                                         bool complete) {
   ASSERT(is_optimizing());
   __ Comment("EmitTestAndCall");
-  const Array& arguments_descriptor =
-      Array::ZoneHandle(zone(), ArgumentsDescriptor::New(argument_count,
-                                                         argument_names));
+  const Array& arguments_descriptor = Array::ZoneHandle(
+      zone(), ArgumentsDescriptor::New(argument_count, argument_names));
 
   // Load receiver into T0.
   __ LoadFromOffset(T0, SP, (argument_count - 1) * kWordSize);
@@ -1633,14 +1570,11 @@
     }
     // Do not use the code from the function, but let the code be patched so
     // that we can record the outgoing edges to other code.
-    const Function& function = Function::ZoneHandle(
-        zone(), ic_data.GetTargetAt(0));
-    GenerateStaticDartCall(deopt_id,
-                           token_index,
+    const Function& function =
+        Function::ZoneHandle(zone(), ic_data.GetTargetAt(0));
+    GenerateStaticDartCall(deopt_id, token_index,
                            *StubCode::CallStaticFunction_entry(),
-                           RawPcDescriptors::kOther,
-                           locs,
-                           function);
+                           RawPcDescriptors::kOther, locs, function);
     __ Drop(argument_count);
     if (kNumChecks > 1) {
       __ b(match_found);
@@ -1684,12 +1618,9 @@
     // Do not use the code from the function, but let the code be patched so
     // that we can record the outgoing edges to other code.
     const Function& function = *sorted[i].target;
-    GenerateStaticDartCall(deopt_id,
-                           token_index,
+    GenerateStaticDartCall(deopt_id, token_index,
                            *StubCode::CallStaticFunction_entry(),
-                           RawPcDescriptors::kOther,
-                           locs,
-                           function);
+                           RawPcDescriptors::kOther, locs, function);
     __ Drop(argument_count);
     if (!kIsLastCheck) {
       __ b(match_found);
@@ -1765,7 +1696,7 @@
     } else if (destination.IsFpuRegister()) {
       __ LoadObject(TMP, constant);
       __ LoadDFromOffset(destination.fpu_reg(), TMP,
-          Double::value_offset() - kHeapObjectTag);
+                         Double::value_offset() - kHeapObjectTag);
     } else if (destination.IsDoubleStackSlot()) {
       const intptr_t dest_offset = destination.ToStackSlotOffset();
       __ LoadObject(TMP, constant);
@@ -1801,11 +1732,10 @@
     __ mov(source.reg(), destination.reg());
     __ mov(destination.reg(), TMP);
   } else if (source.IsRegister() && destination.IsStackSlot()) {
-    Exchange(source.reg(),
-             destination.base_reg(), destination.ToStackSlotOffset());
+    Exchange(source.reg(), destination.base_reg(),
+             destination.ToStackSlotOffset());
   } else if (source.IsStackSlot() && destination.IsRegister()) {
-    Exchange(destination.reg(),
-             source.base_reg(), source.ToStackSlotOffset());
+    Exchange(destination.reg(), source.base_reg(), source.ToStackSlotOffset());
   } else if (source.IsStackSlot() && destination.IsStackSlot()) {
     Exchange(source.base_reg(), source.ToStackSlotOffset(),
              destination.base_reg(), destination.ToStackSlotOffset());
@@ -1817,14 +1747,13 @@
     __ movd(dst, DTMP);
   } else if (source.IsFpuRegister() || destination.IsFpuRegister()) {
     ASSERT(destination.IsDoubleStackSlot() || source.IsDoubleStackSlot());
-    DRegister reg = source.IsFpuRegister() ? source.fpu_reg()
-                                           : destination.fpu_reg();
-    Register base_reg = source.IsFpuRegister()
-        ? destination.base_reg()
-        : source.base_reg();
+    DRegister reg =
+        source.IsFpuRegister() ? source.fpu_reg() : destination.fpu_reg();
+    Register base_reg =
+        source.IsFpuRegister() ? destination.base_reg() : source.base_reg();
     const intptr_t slot_offset = source.IsFpuRegister()
-        ? destination.ToStackSlotOffset()
-        : source.ToStackSlotOffset();
+                                     ? destination.ToStackSlotOffset()
+                                     : source.ToStackSlotOffset();
     __ LoadDFromOffset(DTMP, base_reg, slot_offset);
     __ StoreDToOffset(reg, base_reg, slot_offset);
     __ movd(reg, DTMP);
diff --git a/runtime/vm/flow_graph_compiler_x64.cc b/runtime/vm/flow_graph_compiler_x64.cc
index db309c2..8a8b24f 100644
--- a/runtime/vm/flow_graph_compiler_x64.cc
+++ b/runtime/vm/flow_graph_compiler_x64.cc
@@ -52,7 +52,6 @@
 }
 
 
-
 bool FlowGraphCompiler::SupportsSinCos() {
   return true;
 }
@@ -116,8 +115,7 @@
 
   // For the innermost environment, set outgoing arguments and the locals.
   for (intptr_t i = current->Length() - 1;
-       i >= current->fixed_parameter_count();
-       i--) {
+       i >= current->fixed_parameter_count(); i--) {
     builder->AddCopy(current->ValueAt(i), current->LocationAt(i), slot_ix++);
   }
 
@@ -130,26 +128,21 @@
 
     // For any outer environment the deopt id is that of the call instruction
     // which is recorded in the outer environment.
-    builder->AddReturnAddress(
-        current->function(),
-        Thread::ToDeoptAfter(current->deopt_id()),
-        slot_ix++);
+    builder->AddReturnAddress(current->function(),
+                              Thread::ToDeoptAfter(current->deopt_id()),
+                              slot_ix++);
 
     // The values of outgoing arguments can be changed from the inlined call so
     // we must read them from the previous environment.
     for (intptr_t i = previous->fixed_parameter_count() - 1; i >= 0; i--) {
-      builder->AddCopy(previous->ValueAt(i),
-                       previous->LocationAt(i),
+      builder->AddCopy(previous->ValueAt(i), previous->LocationAt(i),
                        slot_ix++);
     }
 
     // Set the locals, note that outgoing arguments are not in the environment.
     for (intptr_t i = current->Length() - 1;
-         i >= current->fixed_parameter_count();
-         i--) {
-      builder->AddCopy(current->ValueAt(i),
-                       current->LocationAt(i),
-                       slot_ix++);
+         i >= current->fixed_parameter_count(); i--) {
+      builder->AddCopy(current->ValueAt(i), current->LocationAt(i), slot_ix++);
     }
 
     // Iterate on the outer environment.
@@ -224,7 +217,7 @@
   const SubtypeTestCache& type_test_cache =
       SubtypeTestCache::ZoneHandle(zone(), SubtypeTestCache::New());
   __ LoadUniqueObject(temp_reg, type_test_cache);
-  __ pushq(temp_reg);  // Subtype test cache.
+  __ pushq(temp_reg);      // Subtype test cache.
   __ pushq(instance_reg);  // Instance.
   if (test_kind == kTestTypeOneArg) {
     ASSERT(type_arguments_reg == kNoRegister);
@@ -245,7 +238,7 @@
   ASSERT(temp_reg != RCX);
   __ popq(instance_reg);  // Discard.
   __ popq(instance_reg);  // Restore receiver.
-  __ popq(temp_reg);  // Discard.
+  __ popq(temp_reg);      // Discard.
   GenerateBoolToJump(RCX, is_instance_lbl, is_not_instance_lbl);
   return type_test_cache.raw();
 }
@@ -287,7 +280,7 @@
     const TypeArguments& type_arguments =
         TypeArguments::ZoneHandle(zone(), type.arguments());
     const bool is_raw_type = type_arguments.IsNull() ||
-        type_arguments.IsRaw(from_index, num_type_params);
+                             type_arguments.IsRaw(from_index, num_type_params);
     if (is_raw_type) {
       const Register kClassIdReg = R10;
       // dynamic type argument, check only classes.
@@ -303,8 +296,8 @@
     }
     // If one type argument only, check if type argument is Object or dynamic.
     if (type_arguments.Length() == 1) {
-      const AbstractType& tp_argument = AbstractType::ZoneHandle(zone(),
-          type_arguments.TypeAt(0));
+      const AbstractType& tp_argument =
+          AbstractType::ZoneHandle(zone(), type_arguments.TypeAt(0));
       ASSERT(!tp_argument.IsMalformed());
       if (tp_argument.IsType()) {
         ASSERT(tp_argument.HasResolvedTypeClass());
@@ -321,12 +314,9 @@
   // Regular subtype test cache involving instance's type arguments.
   const Register kTypeArgumentsReg = kNoRegister;
   const Register kTempReg = R10;
-  return GenerateCallSubtypeTestStub(kTestTypeTwoArgs,
-                                     kInstanceReg,
-                                     kTypeArgumentsReg,
-                                     kTempReg,
-                                     is_instance_lbl,
-                                     is_not_instance_lbl);
+  return GenerateCallSubtypeTestStub(kTestTypeTwoArgs, kInstanceReg,
+                                     kTypeArgumentsReg, kTempReg,
+                                     is_instance_lbl, is_not_instance_lbl);
 }
 
 
@@ -365,11 +355,8 @@
   __ testq(kInstanceReg, Immediate(kSmiTagMask));
   // If instance is Smi, check directly.
   const Class& smi_class = Class::Handle(zone(), Smi::Class());
-  if (smi_class.IsSubtypeOf(TypeArguments::Handle(zone()),
-                            type_class,
-                            TypeArguments::Handle(zone()),
-                            NULL,
-                            NULL,
+  if (smi_class.IsSubtypeOf(TypeArguments::Handle(zone()), type_class,
+                            TypeArguments::Handle(zone()), NULL, NULL,
                             Heap::kOld)) {
     __ j(ZERO, is_instance_lbl);
   } else {
@@ -389,8 +376,8 @@
   // Custom checking for numbers (Smi, Mint, Bigint and Double).
   // Note that instance is not Smi (checked above).
   if (type.IsNumberType() || type.IsIntType() || type.IsDoubleType()) {
-    GenerateNumberTypeCheck(
-        kClassIdReg, type, is_instance_lbl, is_not_instance_lbl);
+    GenerateNumberTypeCheck(kClassIdReg, type, is_instance_lbl,
+                            is_not_instance_lbl);
     return false;
   }
   if (type.IsStringType()) {
@@ -437,12 +424,9 @@
 
   const Register kTypeArgumentsReg = kNoRegister;
   const Register kTempReg = R10;
-  return GenerateCallSubtypeTestStub(kTestTypeOneArg,
-                                     kInstanceReg,
-                                     kTypeArgumentsReg,
-                                     kTempReg,
-                                     is_instance_lbl,
-                                     is_not_instance_lbl);
+  return GenerateCallSubtypeTestStub(kTestTypeOneArg, kInstanceReg,
+                                     kTypeArgumentsReg, kTempReg,
+                                     is_instance_lbl, is_not_instance_lbl);
 }
 
 
@@ -465,24 +449,24 @@
     // Check if type arguments are null, i.e. equivalent to vector of dynamic.
     __ CompareObject(RDX, Object::null_object());
     __ j(EQUAL, is_instance_lbl);
-    __ movq(RDI,
-        FieldAddress(RDX, TypeArguments::type_at_offset(type_param.index())));
+    __ movq(RDI, FieldAddress(
+                     RDX, TypeArguments::type_at_offset(type_param.index())));
     // RDI: Concrete type of type.
     // Check if type argument is dynamic.
     __ CompareObject(RDI, Object::dynamic_type());
-    __ j(EQUAL,  is_instance_lbl);
+    __ j(EQUAL, is_instance_lbl);
     const Type& object_type = Type::ZoneHandle(zone(), Type::ObjectType());
     __ CompareObject(RDI, object_type);
-    __ j(EQUAL,  is_instance_lbl);
+    __ j(EQUAL, is_instance_lbl);
 
     // For Smi check quickly against int and num interfaces.
     Label not_smi;
     __ testq(RAX, Immediate(kSmiTagMask));  // Value is Smi?
     __ j(NOT_ZERO, &not_smi, Assembler::kNearJump);
     __ CompareObject(RDI, Type::ZoneHandle(zone(), Type::IntType()));
-    __ j(EQUAL,  is_instance_lbl);
+    __ j(EQUAL, is_instance_lbl);
     __ CompareObject(RDI, Type::ZoneHandle(zone(), Type::Number()));
-    __ j(EQUAL,  is_instance_lbl);
+    __ j(EQUAL, is_instance_lbl);
     // Smi must be handled in runtime.
     Label fall_through;
     __ jmp(&fall_through);
@@ -493,14 +477,10 @@
     const Register kInstanceReg = RAX;
     const Register kTypeArgumentsReg = RDX;
     const Register kTempReg = R10;
-    const SubtypeTestCache& type_test_cache =
-        SubtypeTestCache::ZoneHandle(zone(),
-            GenerateCallSubtypeTestStub(kTestTypeThreeArgs,
-                                        kInstanceReg,
-                                        kTypeArgumentsReg,
-                                        kTempReg,
-                                        is_instance_lbl,
-                                        is_not_instance_lbl));
+    const SubtypeTestCache& type_test_cache = SubtypeTestCache::ZoneHandle(
+        zone(), GenerateCallSubtypeTestStub(
+                    kTestTypeThreeArgs, kInstanceReg, kTypeArgumentsReg,
+                    kTempReg, is_instance_lbl, is_not_instance_lbl));
     __ Bind(&fall_through);
     return type_test_cache.raw();
   }
@@ -513,12 +493,9 @@
     // Uninstantiated type class is known at compile time, but the type
     // arguments are determined at runtime by the instantiator.
     const Register kTempReg = R10;
-    return GenerateCallSubtypeTestStub(kTestTypeThreeArgs,
-                                       kInstanceReg,
-                                       kTypeArgumentsReg,
-                                       kTempReg,
-                                       is_instance_lbl,
-                                       is_not_instance_lbl);
+    return GenerateCallSubtypeTestStub(kTestTypeThreeArgs, kInstanceReg,
+                                       kTypeArgumentsReg, kTempReg,
+                                       is_instance_lbl, is_not_instance_lbl);
   }
   return SubtypeTestCache::null();
 }
@@ -550,29 +527,22 @@
     // function type) of a non-parameterized class or with a raw dst type of
     // a parameterized class.
     if (type.IsFunctionType() || (type_class.NumTypeArguments() > 0)) {
-      return GenerateInstantiatedTypeWithArgumentsTest(token_pos,
-                                                       type,
-                                                       is_instance_lbl,
-                                                       is_not_instance_lbl);
+      return GenerateInstantiatedTypeWithArgumentsTest(
+          token_pos, type, is_instance_lbl, is_not_instance_lbl);
       // Fall through to runtime call.
     }
-    const bool has_fall_through =
-        GenerateInstantiatedTypeNoArgumentsTest(token_pos,
-                                                type,
-                                                is_instance_lbl,
-                                                is_not_instance_lbl);
+    const bool has_fall_through = GenerateInstantiatedTypeNoArgumentsTest(
+        token_pos, type, is_instance_lbl, is_not_instance_lbl);
     if (has_fall_through) {
       // If test non-conclusive so far, try the inlined type-test cache.
       // 'type' is known at compile time.
       return GenerateSubtype1TestCacheLookup(
-           token_pos, type_class, is_instance_lbl, is_not_instance_lbl);
+          token_pos, type_class, is_instance_lbl, is_not_instance_lbl);
     } else {
       return SubtypeTestCache::null();
     }
   }
-  return GenerateUninstantiatedTypeTest(token_pos,
-                                        type,
-                                        is_instance_lbl,
+  return GenerateUninstantiatedTypeTest(token_pos, type, is_instance_lbl,
                                         is_not_instance_lbl);
 }
 
@@ -613,25 +583,21 @@
 
   // Generate inline instanceof test.
   SubtypeTestCache& test_cache = SubtypeTestCache::ZoneHandle(zone());
-  test_cache = GenerateInlineInstanceof(token_pos, type,
-                                        &is_instance, &is_not_instance);
+  test_cache =
+      GenerateInlineInstanceof(token_pos, type, &is_instance, &is_not_instance);
 
   // test_cache is null if there is no fall-through.
   Label done;
   if (!test_cache.IsNull()) {
     // Generate runtime call.
-    __ movq(RDX, Address(RSP, 0));  // Get instantiator type arguments.
+    __ movq(RDX, Address(RSP, 0));         // Get instantiator type arguments.
     __ PushObject(Object::null_object());  // Make room for the result.
-    __ pushq(RAX);  // Push the instance.
-    __ PushObject(type);  // Push the type.
-    __ pushq(RDX);  // Instantiator type arguments.
+    __ pushq(RAX);                         // Push the instance.
+    __ PushObject(type);                   // Push the type.
+    __ pushq(RDX);                         // Instantiator type arguments.
     __ LoadUniqueObject(RAX, test_cache);
     __ pushq(RAX);
-    GenerateRuntimeCall(token_pos,
-                        deopt_id,
-                        kInstanceofRuntimeEntry,
-                        4,
-                        locs);
+    GenerateRuntimeCall(token_pos, deopt_id, kInstanceofRuntimeEntry, 4, locs);
     // Pop the parameters supplied to the runtime entry. The result of the
     // instanceof runtime call will be left as the result of the operation.
     __ Drop(4);
@@ -688,34 +654,31 @@
   // Generate throw new TypeError() if the type is malformed or malbounded.
   if (dst_type.IsMalformedOrMalbounded()) {
     __ PushObject(Object::null_object());  // Make room for the result.
-    __ pushq(RAX);  // Push the source object.
-    __ PushObject(dst_name);  // Push the name of the destination.
-    __ PushObject(dst_type);  // Push the type of the destination.
-    GenerateRuntimeCall(token_pos,
-                        deopt_id,
-                        kBadTypeErrorRuntimeEntry,
-                        3,
+    __ pushq(RAX);                         // Push the source object.
+    __ PushObject(dst_name);               // Push the name of the destination.
+    __ PushObject(dst_type);               // Push the type of the destination.
+    GenerateRuntimeCall(token_pos, deopt_id, kBadTypeErrorRuntimeEntry, 3,
                         locs);
     // We should never return here.
     __ int3();
 
     __ Bind(&is_assignable);  // For a null object.
-    __ popq(RDX);  // Remove pushed instantiator type arguments.
+    __ popq(RDX);             // Remove pushed instantiator type arguments.
     return;
   }
 
   // Generate inline type check, linking to runtime call if not assignable.
   SubtypeTestCache& test_cache = SubtypeTestCache::ZoneHandle(zone());
-  test_cache = GenerateInlineInstanceof(token_pos, dst_type,
-                                        &is_assignable, &runtime_call);
+  test_cache = GenerateInlineInstanceof(token_pos, dst_type, &is_assignable,
+                                        &runtime_call);
 
   __ Bind(&runtime_call);
-  __ movq(RDX, Address(RSP, 0));  // Get instantiator type arguments.
+  __ movq(RDX, Address(RSP, 0));         // Get instantiator type arguments.
   __ PushObject(Object::null_object());  // Make room for the result.
-  __ pushq(RAX);  // Push the source object.
-  __ PushObject(dst_type);  // Push the type of the destination.
-  __ pushq(RDX);  // Instantiator type arguments.
-  __ PushObject(dst_name);  // Push the name of the destination.
+  __ pushq(RAX);                         // Push the source object.
+  __ PushObject(dst_type);               // Push the type of the destination.
+  __ pushq(RDX);                         // Instantiator type arguments.
+  __ PushObject(dst_name);               // Push the name of the destination.
   __ LoadUniqueObject(RAX, test_cache);
   __ pushq(RAX);
   GenerateRuntimeCall(token_pos, deopt_id, kTypeCheckRuntimeEntry, 5, locs);
@@ -784,8 +747,8 @@
   // Let RBX point to the last passed positional argument, i.e. to
   // fp[kParamEndSlotFromFp + num_args - (num_pos_args - 1)].
   __ subq(RBX, RCX);
-  __ leaq(RBX, Address(RBP, RBX, TIMES_4,
-                       (kParamEndSlotFromFp + 1) * kWordSize));
+  __ leaq(RBX,
+          Address(RBP, RBX, TIMES_4, (kParamEndSlotFromFp + 1) * kWordSize));
 
   // Let RDI point to the last copied positional argument, i.e. to
   // fp[kFirstLocalSlotFromFp - (num_pos_args - 1)].
@@ -812,9 +775,9 @@
   // Copy or initialize optional named arguments.
   Label all_arguments_processed;
 #ifdef DEBUG
-    const bool check_correct_named_args = true;
+  const bool check_correct_named_args = true;
 #else
-    const bool check_correct_named_args = function.IsClosureFunction();
+  const bool check_correct_named_args = function.IsClosureFunction();
 #endif
   if (num_opt_named_params > 0) {
     // Start by alphabetically sorting the names of the optional parameters.
@@ -842,8 +805,7 @@
     __ SmiUntag(RCX);
     // Let RBX point to the first passed argument, i.e. to
     // fp[kParamEndSlotFromFp + num_args]; num_args (RBX) is Smi.
-    __ leaq(RBX,
-            Address(RBP, RBX, TIMES_4, kParamEndSlotFromFp * kWordSize));
+    __ leaq(RBX, Address(RBP, RBX, TIMES_4, kParamEndSlotFromFp * kWordSize));
     // Let RDI point to the entry of the first named argument.
     __ leaq(RDI,
             FieldAddress(R10, ArgumentsDescriptor::first_named_entry_offset()));
@@ -861,8 +823,7 @@
       __ movq(RAX, Address(RDI, ArgumentsDescriptor::position_offset()));
       // RAX is arg_pos as Smi.
       // Point to next named entry.
-      __ AddImmediate(
-          RDI, Immediate(ArgumentsDescriptor::named_entry_size()));
+      __ AddImmediate(RDI, Immediate(ArgumentsDescriptor::named_entry_size()));
       __ negq(RAX);
       Address argument_addr(RBX, RAX, TIMES_4, 0);  // RAX is a negative Smi.
       __ movq(RAX, argument_addr);
@@ -946,8 +907,8 @@
   __ LoadObject(R12, Object::null_object());
   Label null_args_loop, null_args_loop_condition;
   __ jmp(&null_args_loop_condition, Assembler::kNearJump);
-  const Address original_argument_addr(
-      RBP, RCX, TIMES_8, (kParamEndSlotFromFp + 1) * kWordSize);
+  const Address original_argument_addr(RBP, RCX, TIMES_8,
+                                       (kParamEndSlotFromFp + 1) * kWordSize);
   __ Bind(&null_args_loop);
   __ movq(original_argument_addr, R12);
   __ Bind(&null_args_loop_condition);
@@ -985,9 +946,8 @@
 // needs to be updated to match.
 void FlowGraphCompiler::EmitFrameEntry() {
   if (flow_graph().IsCompiledForOsr()) {
-    intptr_t extra_slots = StackSize()
-        - flow_graph().num_stack_locals()
-        - flow_graph().num_copied_params();
+    intptr_t extra_slots = StackSize() - flow_graph().num_stack_locals() -
+                           flow_graph().num_copied_params();
     ASSERT(extra_slots >= 0);
     __ EnterOsrFrame(extra_slots * kWordSize);
   } else {
@@ -995,8 +955,7 @@
     __ LoadPoolPointer(new_pp);
 
     const Function& function = parsed_function().function();
-    if (CanOptimizeFunction() &&
-        function.IsOptimizable() &&
+    if (CanOptimizeFunction() && function.IsOptimizable() &&
         (!is_optimizing() || may_reoptimize())) {
       __ Comment("Invocation Count Check");
       const Register function_reg = RDI;
@@ -1008,13 +967,10 @@
       if (!is_optimizing()) {
         __ incl(FieldAddress(function_reg, Function::usage_counter_offset()));
       }
-      __ cmpl(
-          FieldAddress(function_reg, Function::usage_counter_offset()),
-          Immediate(GetOptimizationThreshold()));
+      __ cmpl(FieldAddress(function_reg, Function::usage_counter_offset()),
+              Immediate(GetOptimizationThreshold()));
       ASSERT(function_reg == RDI);
-      __ J(GREATER_EQUAL,
-           *StubCode::OptimizeFunction_entry(),
-           new_pp);
+      __ J(GREATER_EQUAL, *StubCode::OptimizeFunction_entry(), new_pp);
     }
     ASSERT(StackSize() >= 0);
     __ Comment("Enter frame");
@@ -1059,9 +1015,8 @@
       __ movq(RAX, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
       __ CompareImmediate(RAX, Immediate(Smi::RawValue(num_fixed_params)));
       __ j(NOT_EQUAL, &wrong_num_arguments, Assembler::kNearJump);
-      __ cmpq(RAX,
-              FieldAddress(R10,
-                           ArgumentsDescriptor::positional_count_offset()));
+      __ cmpq(RAX, FieldAddress(
+                       R10, ArgumentsDescriptor::positional_count_offset()));
       __ j(EQUAL, &correct_num_arguments, Assembler::kNearJump);
 
       __ Bind(&wrong_num_arguments);
@@ -1109,8 +1064,8 @@
         } else {
           const Context& empty_context = Context::ZoneHandle(
               zone(), isolate()->object_store()->empty_context());
-          __ StoreObject(
-              Address(RBP, (slot_base - i) * kWordSize), empty_context);
+          __ StoreObject(Address(RBP, (slot_base - i) * kWordSize),
+                         empty_context);
         }
       } else {
         ASSERT(num_locals > 1);
@@ -1211,20 +1166,16 @@
 }
 
 
-void FlowGraphCompiler::EmitUnoptimizedStaticCall(
-    intptr_t argument_count,
-    intptr_t deopt_id,
-    TokenPosition token_pos,
-    LocationSummary* locs,
-    const ICData& ic_data) {
+void FlowGraphCompiler::EmitUnoptimizedStaticCall(intptr_t argument_count,
+                                                  intptr_t deopt_id,
+                                                  TokenPosition token_pos,
+                                                  LocationSummary* locs,
+                                                  const ICData& ic_data) {
   const StubEntry* stub_entry =
       StubCode::UnoptimizedStaticCallEntry(ic_data.NumArgsTested());
   __ LoadObject(RBX, ic_data);
-  GenerateDartCall(deopt_id,
-                   token_pos,
-                   *stub_entry,
-                   RawPcDescriptors::kUnoptStaticCall,
-                   locs);
+  GenerateDartCall(deopt_id, token_pos, *stub_entry,
+                   RawPcDescriptors::kUnoptStaticCall, locs);
   __ Drop(argument_count, RCX);
 }
 
@@ -1243,13 +1194,12 @@
 }
 
 
-void FlowGraphCompiler::EmitOptimizedInstanceCall(
-    const StubEntry& stub_entry,
-    const ICData& ic_data,
-    intptr_t argument_count,
-    intptr_t deopt_id,
-    TokenPosition token_pos,
-    LocationSummary* locs) {
+void FlowGraphCompiler::EmitOptimizedInstanceCall(const StubEntry& stub_entry,
+                                                  const ICData& ic_data,
+                                                  intptr_t argument_count,
+                                                  intptr_t deopt_id,
+                                                  TokenPosition token_pos,
+                                                  LocationSummary* locs) {
   ASSERT(Array::Handle(zone(), ic_data.arguments_descriptor()).Length() > 0);
   // Each ICData propagated from unoptimized to optimized code contains the
   // function that corresponds to the Dart function of that IC call. Due
@@ -1259,10 +1209,7 @@
   // Pass the function explicitly, it is used in IC stub.
   __ LoadObject(RDI, parsed_function().function());
   __ LoadUniqueObject(RBX, ic_data);
-  GenerateDartCall(deopt_id,
-                   token_pos,
-                   stub_entry,
-                   RawPcDescriptors::kIcCall,
+  GenerateDartCall(deopt_id, token_pos, stub_entry, RawPcDescriptors::kIcCall,
                    locs);
   __ Drop(argument_count, RCX);
 }
@@ -1276,10 +1223,7 @@
                                          LocationSummary* locs) {
   ASSERT(Array::Handle(zone(), ic_data.arguments_descriptor()).Length() > 0);
   __ LoadUniqueObject(RBX, ic_data);
-  GenerateDartCall(deopt_id,
-                   token_pos,
-                   stub_entry,
-                   RawPcDescriptors::kIcCall,
+  GenerateDartCall(deopt_id, token_pos, stub_entry, RawPcDescriptors::kIcCall,
                    locs);
   __ Drop(argument_count, RCX);
 }
@@ -1297,7 +1241,8 @@
   const Array& arguments_descriptor =
       Array::ZoneHandle(zone(), ic_data.arguments_descriptor());
   ASSERT(!arguments_descriptor.IsNull() && (arguments_descriptor.Length() > 0));
-  const MegamorphicCache& cache = MegamorphicCache::ZoneHandle(zone(),
+  const MegamorphicCache& cache = MegamorphicCache::ZoneHandle(
+      zone(),
       MegamorphicCacheTable::Lookup(isolate(), name, arguments_descriptor));
   __ Comment("MegamorphicCall");
   // Load receiver into RDI.
@@ -1331,18 +1276,16 @@
     if (try_index == CatchClauseNode::kInvalidTryIndex) {
       try_index = CurrentTryIndex();
     }
-    pc_descriptors_list()->AddDescriptor(RawPcDescriptors::kOther,
-                                         assembler()->CodeSize(),
-                                         Thread::kNoDeoptId,
-                                         token_pos,
-                                         try_index);
+    pc_descriptors_list()->AddDescriptor(
+        RawPcDescriptors::kOther, assembler()->CodeSize(), Thread::kNoDeoptId,
+        token_pos, try_index);
   } else if (is_optimizing()) {
-    AddCurrentDescriptor(RawPcDescriptors::kOther,
-        Thread::kNoDeoptId, token_pos);
+    AddCurrentDescriptor(RawPcDescriptors::kOther, Thread::kNoDeoptId,
+                         token_pos);
     AddDeoptIndexAtCall(deopt_id_after);
   } else {
-    AddCurrentDescriptor(RawPcDescriptors::kOther,
-        Thread::kNoDeoptId, token_pos);
+    AddCurrentDescriptor(RawPcDescriptors::kOther, Thread::kNoDeoptId,
+                         token_pos);
     // Add deoptimization continuation point after the call and before the
     // arguments are removed.
     AddCurrentDescriptor(RawPcDescriptors::kDeopt, deopt_id_after, token_pos);
@@ -1351,15 +1294,14 @@
 }
 
 
-void FlowGraphCompiler::EmitSwitchableInstanceCall(
-    const ICData& ic_data,
-    intptr_t argument_count,
-    intptr_t deopt_id,
-    TokenPosition token_pos,
-    LocationSummary* locs) {
+void FlowGraphCompiler::EmitSwitchableInstanceCall(const ICData& ic_data,
+                                                   intptr_t argument_count,
+                                                   intptr_t deopt_id,
+                                                   TokenPosition token_pos,
+                                                   LocationSummary* locs) {
   ASSERT(ic_data.NumArgsTested() == 1);
-  const Code& initial_stub = Code::ZoneHandle(
-      StubCode::ICCallThroughFunction_entry()->code());
+  const Code& initial_stub =
+      Code::ZoneHandle(StubCode::ICCallThroughFunction_entry()->code());
 
   __ Comment("SwitchableCall");
   __ movq(RDI, Address(RSP, (argument_count - 1) * kWordSize));
@@ -1368,8 +1310,7 @@
   __ LoadUniqueObject(RBX, ic_data);
   __ call(RCX);
 
-  AddCurrentDescriptor(RawPcDescriptors::kOther,
-                       Thread::kNoDeoptId, token_pos);
+  AddCurrentDescriptor(RawPcDescriptors::kOther, Thread::kNoDeoptId, token_pos);
   RecordSafepoint(locs);
   const intptr_t deopt_id_after = Thread::ToDeoptAfter(deopt_id);
   if (is_optimizing()) {
@@ -1398,12 +1339,9 @@
   }
   // Do not use the code from the function, but let the code be patched so that
   // we can record the outgoing edges to other code.
-  GenerateStaticDartCall(deopt_id,
-                         token_pos,
+  GenerateStaticDartCall(deopt_id, token_pos,
                          *StubCode::CallStaticFunction_entry(),
-                         RawPcDescriptors::kOther,
-                         locs,
-                         function);
+                         RawPcDescriptors::kOther, locs, function);
   __ Drop(argument_count, RCX);
 }
 
@@ -1431,8 +1369,7 @@
       __ CallPatchable(*StubCode::UnoptimizedIdenticalWithNumberCheck_entry());
     }
     if (token_pos.IsReal()) {
-      AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall,
-                           Thread::kNoDeoptId,
+      AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall, Thread::kNoDeoptId,
                            token_pos);
     }
     // Stub returns result in flags (result of a cmpq, we need ZF computed).
@@ -1459,8 +1396,7 @@
       __ CallPatchable(*StubCode::UnoptimizedIdenticalWithNumberCheck_entry());
     }
     if (token_pos.IsReal()) {
-      AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall,
-                           Thread::kNoDeoptId,
+      AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall, Thread::kNoDeoptId,
                            token_pos);
     }
     // Stub returns result in flags (result of a cmpq, we need ZF computed).
@@ -1520,12 +1456,10 @@
   ASSERT(is_optimizing());
 
   __ Comment("EmitTestAndCall");
-  const Array& arguments_descriptor =
-      Array::ZoneHandle(zone(), ArgumentsDescriptor::New(argument_count,
-                                                         argument_names));
+  const Array& arguments_descriptor = Array::ZoneHandle(
+      zone(), ArgumentsDescriptor::New(argument_count, argument_names));
   // Load receiver into RAX.
-  __ movq(RAX,
-      Address(RSP, (argument_count - 1) * kWordSize));
+  __ movq(RAX, Address(RSP, (argument_count - 1) * kWordSize));
   __ LoadObject(R10, arguments_descriptor);
 
   const bool kFirstCheckIsSmi = ic_data.GetReceiverClassIdAt(0) == kSmiCid;
@@ -1544,14 +1478,11 @@
     }
     // Do not use the code from the function, but let the code be patched so
     // that we can record the outgoing edges to other code.
-    const Function& function = Function::ZoneHandle(
-        zone(), ic_data.GetTargetAt(0));
-    GenerateStaticDartCall(deopt_id,
-                           token_index,
+    const Function& function =
+        Function::ZoneHandle(zone(), ic_data.GetTargetAt(0));
+    GenerateStaticDartCall(deopt_id, token_index,
                            *StubCode::CallStaticFunction_entry(),
-                           RawPcDescriptors::kOther,
-                           locs,
-                           function);
+                           RawPcDescriptors::kOther, locs, function);
     __ Drop(argument_count, RCX);
     if (kNumChecks > 1) {
       __ jmp(match_found);
@@ -1597,12 +1528,9 @@
     // Do not use the code from the function, but let the code be patched so
     // that we can record the outgoing edges to other code.
     const Function& function = *sorted[i].target;
-    GenerateStaticDartCall(deopt_id,
-                           token_index,
+    GenerateStaticDartCall(deopt_id, token_index,
                            *StubCode::CallStaticFunction_entry(),
-                           RawPcDescriptors::kOther,
-                           locs,
-                           function);
+                           RawPcDescriptors::kOther, locs, function);
     __ Drop(argument_count, RCX);
     if (!kIsLastCheck) {
       __ jmp(match_found);
@@ -1672,7 +1600,8 @@
       if (constant.IsSmi() && (Smi::Cast(constant).Value() == 0)) {
         __ xorq(destination.reg(), destination.reg());
       } else if (constant.IsSmi() &&
-          (source.constant_instruction()->representation() == kUnboxedInt32)) {
+                 (source.constant_instruction()->representation() ==
+                  kUnboxedInt32)) {
         __ movl(destination.reg(), Immediate(Smi::Cast(constant).Value()));
       } else {
         __ LoadObject(destination.reg(), constant);
@@ -1683,7 +1612,7 @@
       } else {
         __ LoadObject(TMP, constant);
         __ movsd(destination.fpu_reg(),
-            FieldAddress(TMP, Double::value_offset()));
+                 FieldAddress(TMP, Double::value_offset()));
       }
     } else if (destination.IsDoubleStackSlot()) {
       if (Utils::DoublesBitEqual(Double::Cast(constant).value(), 0.0)) {
@@ -1727,17 +1656,15 @@
     __ movaps(source.fpu_reg(), destination.fpu_reg());
     __ movaps(destination.fpu_reg(), XMM0);
   } else if (source.IsFpuRegister() || destination.IsFpuRegister()) {
-    ASSERT(destination.IsDoubleStackSlot() ||
-           destination.IsQuadStackSlot() ||
-           source.IsDoubleStackSlot() ||
-           source.IsQuadStackSlot());
-    bool double_width = destination.IsDoubleStackSlot() ||
-                        source.IsDoubleStackSlot();
-    XmmRegister reg = source.IsFpuRegister() ? source.fpu_reg()
-                                             : destination.fpu_reg();
+    ASSERT(destination.IsDoubleStackSlot() || destination.IsQuadStackSlot() ||
+           source.IsDoubleStackSlot() || source.IsQuadStackSlot());
+    bool double_width =
+        destination.IsDoubleStackSlot() || source.IsDoubleStackSlot();
+    XmmRegister reg =
+        source.IsFpuRegister() ? source.fpu_reg() : destination.fpu_reg();
     Address slot_address = source.IsFpuRegister()
-        ? destination.ToStackSlotAddress()
-        : source.ToStackSlotAddress();
+                               ? destination.ToStackSlotAddress()
+                               : source.ToStackSlotAddress();
 
     if (double_width) {
       __ movsd(XMM0, slot_address);
diff --git a/runtime/vm/flow_graph_inliner.cc b/runtime/vm/flow_graph_inliner.cc
index 3b42c06..6d2ea72 100644
--- a/runtime/vm/flow_graph_inliner.cc
+++ b/runtime/vm/flow_graph_inliner.cc
@@ -24,41 +24,71 @@
 
 namespace dart {
 
-DEFINE_FLAG(int, deoptimization_counter_inlining_threshold, 12,
-    "How many times we allow deoptimization before we stop inlining.");
+DEFINE_FLAG(int,
+            deoptimization_counter_inlining_threshold,
+            12,
+            "How many times we allow deoptimization before we stop inlining.");
 DEFINE_FLAG(bool, trace_inlining, false, "Trace inlining");
 DEFINE_FLAG(charp, inlining_filter, NULL, "Inline only in named function");
 
 // Flags for inlining heuristics.
-DEFINE_FLAG(int, inline_getters_setters_smaller_than, 10,
-    "Always inline getters and setters that have fewer instructions");
-DEFINE_FLAG(int, inlining_depth_threshold, 6,
-    "Inline function calls up to threshold nesting depth");
-DEFINE_FLAG(int, inlining_size_threshold, 25,
+DEFINE_FLAG(int,
+            inline_getters_setters_smaller_than,
+            10,
+            "Always inline getters and setters that have fewer instructions");
+DEFINE_FLAG(int,
+            inlining_depth_threshold,
+            6,
+            "Inline function calls up to threshold nesting depth");
+DEFINE_FLAG(
+    int,
+    inlining_size_threshold,
+    25,
     "Always inline functions that have threshold or fewer instructions");
-DEFINE_FLAG(int, inlining_callee_call_sites_threshold, 1,
-    "Always inline functions containing threshold or fewer calls.");
-DEFINE_FLAG(int, inlining_callee_size_threshold, 80,
-    "Do not inline callees larger than threshold");
-DEFINE_FLAG(int, inlining_caller_size_threshold, 50000,
-    "Stop inlining once caller reaches the threshold.");
-DEFINE_FLAG(int, inlining_constant_arguments_count, 1,
-    "Inline function calls with sufficient constant arguments "
-    "and up to the increased threshold on instructions");
-DEFINE_FLAG(int, inlining_constant_arguments_max_size_threshold, 200,
+DEFINE_FLAG(int,
+            inlining_callee_call_sites_threshold,
+            1,
+            "Always inline functions containing threshold or fewer calls.");
+DEFINE_FLAG(int,
+            inlining_callee_size_threshold,
+            80,
+            "Do not inline callees larger than threshold");
+DEFINE_FLAG(int,
+            inlining_caller_size_threshold,
+            50000,
+            "Stop inlining once caller reaches the threshold.");
+DEFINE_FLAG(int,
+            inlining_constant_arguments_count,
+            1,
+            "Inline function calls with sufficient constant arguments "
+            "and up to the increased threshold on instructions");
+DEFINE_FLAG(
+    int,
+    inlining_constant_arguments_max_size_threshold,
+    200,
     "Do not inline callees larger than threshold if constant arguments");
-DEFINE_FLAG(int, inlining_constant_arguments_min_size_threshold, 60,
-    "Inline function calls with sufficient constant arguments "
-    "and up to the increased threshold on instructions");
-DEFINE_FLAG(int, inlining_hotness, 10,
-    "Inline only hotter calls, in percents (0 .. 100); "
-    "default 10%: calls above-equal 10% of max-count are inlined.");
-DEFINE_FLAG(int, inlining_recursion_depth_threshold, 1,
-    "Inline recursive function calls up to threshold recursion depth.");
-DEFINE_FLAG(int, max_inlined_per_depth, 500,
-    "Max. number of inlined calls per depth");
+DEFINE_FLAG(int,
+            inlining_constant_arguments_min_size_threshold,
+            60,
+            "Inline function calls with sufficient constant arguments "
+            "and up to the increased threshold on instructions");
+DEFINE_FLAG(int,
+            inlining_hotness,
+            10,
+            "Inline only hotter calls, in percents (0 .. 100); "
+            "default 10%: calls above-equal 10% of max-count are inlined.");
+DEFINE_FLAG(int,
+            inlining_recursion_depth_threshold,
+            1,
+            "Inline recursive function calls up to threshold recursion depth.");
+DEFINE_FLAG(int,
+            max_inlined_per_depth,
+            500,
+            "Max. number of inlined calls per depth");
 DEFINE_FLAG(bool, print_inlining_tree, false, "Print inlining tree");
-DEFINE_FLAG(bool, enable_inlining_annotations, false,
+DEFINE_FLAG(bool,
+            enable_inlining_annotations,
+            false,
             "Enable inlining annotations");
 
 DECLARE_FLAG(bool, compiler_stats);
@@ -80,10 +110,10 @@
 #define PRINT_INLINING_TREE(comment, caller, target, instance_call)            \
   do {                                                                         \
     if (FLAG_print_inlining_tree) {                                            \
-      inlined_info_.Add(InlinedInfo(                                           \
-          caller, target, inlining_depth_, instance_call, comment));           \
-      }                                                                        \
-  } while (false)                                                              \
+      inlined_info_.Add(InlinedInfo(caller, target, inlining_depth_,           \
+                                    instance_call, comment));                  \
+    }                                                                          \
+  } while (false)
 
 
 // Test if a call is recursive by looking in the deoptimization environment.
@@ -110,8 +140,7 @@
 struct NamedArgument {
   String* name;
   Value* value;
-  NamedArgument(String* name, Value* value)
-    : name(name), value(value) { }
+  NamedArgument(String* name, Value* value) : name(name), value(value) {}
 };
 
 
@@ -119,23 +148,18 @@
 // inlining.
 class GraphInfoCollector : public ValueObject {
  public:
-  GraphInfoCollector()
-      : call_site_count_(0),
-        instruction_count_(0) { }
+  GraphInfoCollector() : call_site_count_(0), instruction_count_(0) {}
 
   void Collect(const FlowGraph& graph) {
     call_site_count_ = 0;
     instruction_count_ = 0;
-    for (BlockIterator block_it = graph.postorder_iterator();
-         !block_it.Done();
+    for (BlockIterator block_it = graph.postorder_iterator(); !block_it.Done();
          block_it.Advance()) {
-      for (ForwardInstructionIterator it(block_it.Current());
-           !it.Done();
+      for (ForwardInstructionIterator it(block_it.Current()); !it.Done();
            it.Advance()) {
         ++instruction_count_;
         Instruction* current = it.Current();
-        if (current->IsStaticCall() ||
-            current->IsClosureCall()) {
+        if (current->IsStaticCall() || current->IsClosureCall()) {
           ++call_site_count_;
           continue;
         }
@@ -189,9 +213,7 @@
 class CallSites : public ValueObject {
  public:
   explicit CallSites(FlowGraph* flow_graph)
-      : static_calls_(),
-        closure_calls_(),
-        instance_calls_() { }
+      : static_calls_(), closure_calls_(), instance_calls_() {}
 
   struct InstanceCallInfo {
     PolymorphicInstanceCallInstr* call;
@@ -199,9 +221,7 @@
     const FlowGraph* caller_graph;
     InstanceCallInfo(PolymorphicInstanceCallInstr* call_arg,
                      FlowGraph* flow_graph)
-        : call(call_arg),
-          ratio(0.0),
-          caller_graph(flow_graph) {}
+        : call(call_arg), ratio(0.0), caller_graph(flow_graph) {}
     const Function& caller() const { return caller_graph->function(); }
   };
 
@@ -210,9 +230,7 @@
     double ratio;
     FlowGraph* caller_graph;
     StaticCallInfo(StaticCallInstr* value, FlowGraph* flow_graph)
-        : call(value),
-          ratio(0.0),
-          caller_graph(flow_graph) {}
+        : call(value), ratio(0.0), caller_graph(flow_graph) {}
     const Function& caller() const { return caller_graph->function(); }
   };
 
@@ -220,8 +238,7 @@
     ClosureCallInstr* call;
     FlowGraph* caller_graph;
     ClosureCallInfo(ClosureCallInstr* value, FlowGraph* flow_graph)
-        : call(value),
-          caller_graph(flow_graph) {}
+        : call(value), caller_graph(flow_graph) {}
     const Function& caller() const { return caller_graph->function(); }
   };
 
@@ -238,14 +255,12 @@
   }
 
   bool HasCalls() const {
-    return !(static_calls_.is_empty() &&
-             closure_calls_.is_empty() &&
+    return !(static_calls_.is_empty() && closure_calls_.is_empty() &&
              instance_calls_.is_empty());
   }
 
   intptr_t NumCalls() const {
-    return instance_calls_.length() +
-           static_calls_.length() +
+    return instance_calls_.length() + static_calls_.length() +
            closure_calls_.length();
   }
 
@@ -266,8 +281,9 @@
     GrowableArray<intptr_t> instance_call_counts(num_instance_calls);
     for (intptr_t i = 0; i < num_instance_calls; ++i) {
       const intptr_t aggregate_count =
-          instance_calls_[i + instance_call_start_ix].
-              call->ic_data().AggregateCount();
+          instance_calls_[i + instance_call_start_ix]
+              .call->ic_data()
+              .AggregateCount();
       instance_call_counts.Add(aggregate_count);
       if (aggregate_count > max_count) max_count = aggregate_count;
     }
@@ -278,9 +294,9 @@
       if (static_calls_[i + static_call_start_ix].call->ic_data() == NULL) {
         aggregate_count = 0;
       } else {
-        aggregate_count =
-            static_calls_[i + static_call_start_ix].
-                call->ic_data()->AggregateCount();
+        aggregate_count = static_calls_[i + static_call_start_ix]
+                              .call->ic_data()
+                              ->AggregateCount();
       }
       static_call_counts.Add(aggregate_count);
       if (aggregate_count > max_count) max_count = aggregate_count;
@@ -288,13 +304,17 @@
 
     // max_count can be 0 if none of the calls was executed.
     for (intptr_t i = 0; i < num_instance_calls; ++i) {
-      const double ratio = (max_count == 0) ?
-          0.0 : static_cast<double>(instance_call_counts[i]) / max_count;
+      const double ratio =
+          (max_count == 0)
+              ? 0.0
+              : static_cast<double>(instance_call_counts[i]) / max_count;
       instance_calls_[i + instance_call_start_ix].ratio = ratio;
     }
     for (intptr_t i = 0; i < num_static_calls; ++i) {
-      const double ratio = (max_count == 0) ?
-          0.0 : static_cast<double>(static_call_counts[i]) / max_count;
+      const double ratio =
+          (max_count == 0)
+              ? 0.0
+              : static_cast<double>(static_call_counts[i]) / max_count;
       static_calls_[i + static_call_start_ix].ratio = ratio;
     }
   }
@@ -304,12 +324,10 @@
       intptr_t depth,
       GrowableArray<InlinedInfo>* inlined_info) {
     const Function* caller = &graph->function();
-    Function& target  = Function::ZoneHandle();
-    for (BlockIterator block_it = graph->postorder_iterator();
-         !block_it.Done();
+    Function& target = Function::ZoneHandle();
+    for (BlockIterator block_it = graph->postorder_iterator(); !block_it.Done();
          block_it.Advance()) {
-      for (ForwardInstructionIterator it(block_it.Current());
-           !it.Done();
+      for (ForwardInstructionIterator it(block_it.Current()); !it.Done();
            it.Advance()) {
         Instruction* current = it.Current();
         Definition* call = NULL;
@@ -326,8 +344,8 @@
           // TODO(srdjan): Add data for closure calls.
         }
         if (call != NULL) {
-          inlined_info->Add(InlinedInfo(
-              caller, &target, depth + 1, call, "Too deep"));
+          inlined_info->Add(
+              InlinedInfo(caller, &target, depth + 1, call, "Too deep"));
         }
       }
     }
@@ -352,11 +370,9 @@
 
     const intptr_t instance_call_start_ix = instance_calls_.length();
     const intptr_t static_call_start_ix = static_calls_.length();
-    for (BlockIterator block_it = graph->postorder_iterator();
-         !block_it.Done();
+    for (BlockIterator block_it = graph->postorder_iterator(); !block_it.Done();
          block_it.Advance()) {
-      for (ForwardInstructionIterator it(block_it.Current());
-           !it.Done();
+      for (ForwardInstructionIterator it(block_it.Current()); !it.Done();
            it.Advance()) {
         Instruction* current = it.Current();
         if (current->IsPolymorphicInstanceCall()) {
@@ -371,11 +387,10 @@
             // not recognized.
             if (FLAG_print_inlining_tree) {
               const Function* caller = &graph->function();
-              const Function* target =
-                  &Function::ZoneHandle(
-                      instance_call->ic_data().GetTargetAt(0));
-              inlined_info->Add(InlinedInfo(
-                  caller, target, depth + 1, instance_call, "Too deep"));
+              const Function* target = &Function::ZoneHandle(
+                  instance_call->ic_data().GetTargetAt(0));
+              inlined_info->Add(InlinedInfo(caller, target, depth + 1,
+                                            instance_call, "Too deep"));
             }
           }
         } else if (current->IsStaticCall()) {
@@ -389,8 +404,8 @@
             if (FLAG_print_inlining_tree) {
               const Function* caller = &graph->function();
               const Function* target = &static_call->function();
-              inlined_info->Add(InlinedInfo(
-                  caller, target, depth + 1, static_call, "Too deep"));
+              inlined_info->Add(InlinedInfo(caller, target, depth + 1,
+                                            static_call, "Too deep"));
             }
           }
         } else if (current->IsClosureCall()) {
@@ -424,7 +439,7 @@
         parameter_stubs(NULL),
         exit_collector(NULL),
         caller(caller),
-        caller_inlining_id_(caller_inlining_id) { }
+        caller_inlining_id_(caller_inlining_id) {}
 
   Definition* call;
   GrowableArray<Value*>* arguments;
@@ -507,7 +522,7 @@
         collected_call_sites_(NULL),
         inlining_call_sites_(NULL),
         function_cache_(),
-        inlined_info_() { }
+        inlined_info_() {}
 
   FlowGraph* caller_graph() const { return caller_graph_; }
 
@@ -564,18 +579,17 @@
     collected_call_sites_ = &sites1;
     inlining_call_sites_ = &sites2;
     // Collect initial call sites.
-    collected_call_sites_->FindCallSites(caller_graph_,
-                                         inlining_depth_,
+    collected_call_sites_->FindCallSites(caller_graph_, inlining_depth_,
                                          &inlined_info_);
     while (collected_call_sites_->HasCalls()) {
-      TRACE_INLINING(THR_Print("  Depth %" Pd " ----------\n",
-                               inlining_depth_));
+      TRACE_INLINING(
+          THR_Print("  Depth %" Pd " ----------\n", inlining_depth_));
       if (collected_call_sites_->NumCalls() > FLAG_max_inlined_per_depth) {
         break;
       }
       if (FLAG_print_inlining_tree) {
-        THR_Print("**Depth % " Pd " calls to inline %" Pd "\n",
-            inlining_depth_, collected_call_sites_->NumCalls());
+        THR_Print("**Depth % " Pd " calls to inline %" Pd "\n", inlining_depth_,
+                  collected_call_sites_->NumCalls());
       }
       // Swap collected and inlining arrays and clear the new collecting array.
       call_sites_temp = collected_call_sites_;
@@ -602,7 +616,7 @@
 
   double GrowthFactor() const {
     return static_cast<double>(inlined_size_) /
-        static_cast<double>(initial_size_);
+           static_cast<double>(initial_size_);
   }
 
   // Helper to create a parameter stub from an actual argument.
@@ -611,9 +625,9 @@
                                   FlowGraph* graph) {
     ConstantInstr* constant = argument->definition()->AsConstant();
     if (constant != NULL) {
-      return new(Z) ConstantInstr(constant->value());
+      return new (Z) ConstantInstr(constant->value());
     } else {
-      ParameterInstr* param = new(Z) ParameterInstr(i, graph->graph_entry());
+      ParameterInstr* param = new (Z) ParameterInstr(i, graph->graph_entry());
       param->UpdateType(*argument->Type());
       return param;
     }
@@ -622,26 +636,24 @@
   bool TryInlining(const Function& function,
                    const Array& argument_names,
                    InlinedCallData* call_data) {
-    TRACE_INLINING(THR_Print("  => %s (deopt count %d)\n",
-                             function.ToCString(),
+    TRACE_INLINING(THR_Print("  => %s (deopt count %d)\n", function.ToCString(),
                              function.deoptimization_counter()));
 
     // Abort if the inlinable bit on the function is low.
     if (!function.CanBeInlined()) {
       TRACE_INLINING(THR_Print("     Bailout: not inlinable\n"));
-      PRINT_INLINING_TREE("Not inlinable",
-          &call_data->caller, &function, call_data->call);
+      PRINT_INLINING_TREE("Not inlinable", &call_data->caller, &function,
+                          call_data->call);
       return false;
     }
 
     // Don't inline any intrinsified functions in precompiled mode
     // to reduce code size and make sure we use the intrinsic code.
-    if (FLAG_precompiled_mode &&
-        function.is_intrinsic() &&
+    if (FLAG_precompiled_mode && function.is_intrinsic() &&
         !inliner_->AlwaysInline(function)) {
       TRACE_INLINING(THR_Print("     Bailout: intrinisic\n"));
-      PRINT_INLINING_TREE("intrinsic",
-          &call_data->caller, &function, call_data->call);
+      PRINT_INLINING_TREE("intrinsic", &call_data->caller, &function,
+                          call_data->call);
       return false;
     }
 
@@ -649,8 +661,8 @@
     // if a function was compiled.
     if (!FLAG_precompiled_mode && !function.was_compiled()) {
       TRACE_INLINING(THR_Print("     Bailout: not compiled yet\n"));
-      PRINT_INLINING_TREE("Not compiled",
-          &call_data->caller, &function, call_data->call);
+      PRINT_INLINING_TREE("Not compiled", &call_data->caller, &function,
+                          call_data->call);
       return false;
     }
 
@@ -658,8 +670,8 @@
     // but we need it for inlining.
     if (!FLAG_precompiled_mode && (function.ic_data_array() == Array::null())) {
       TRACE_INLINING(THR_Print("     Bailout: type feedback cleared\n"));
-      PRINT_INLINING_TREE("Not compiled",
-          &call_data->caller, &function, call_data->call);
+      PRINT_INLINING_TREE("Not compiled", &call_data->caller, &function,
+                          call_data->call);
       return false;
     }
 
@@ -669,7 +681,7 @@
       function.set_is_inlinable(false);
       TRACE_INLINING(THR_Print("     Bailout: deoptimization threshold\n"));
       PRINT_INLINING_TREE("Deoptimization threshold exceeded",
-          &call_data->caller, &function, call_data->call);
+                          &call_data->caller, &function, call_data->call);
       return false;
     }
 
@@ -682,19 +694,18 @@
 
     GrowableArray<Value*>* arguments = call_data->arguments;
     const intptr_t constant_arguments = CountConstants(*arguments);
-    if (!ShouldWeInline(function,
-                        function.optimized_instruction_count(),
+    if (!ShouldWeInline(function, function.optimized_instruction_count(),
                         function.optimized_call_site_count(),
                         constant_arguments)) {
-      TRACE_INLINING(THR_Print("     Bailout: early heuristics with "
-                               "code size:  %" Pd ", "
-                               "call sites: %" Pd ", "
-                               "const args: %" Pd "\n",
-                               function.optimized_instruction_count(),
-                               function.optimized_call_site_count(),
-                               constant_arguments));
-      PRINT_INLINING_TREE("Early heuristic",
-          &call_data->caller, &function, call_data->call);
+      TRACE_INLINING(
+          THR_Print("     Bailout: early heuristics with "
+                    "code size:  %" Pd ", "
+                    "call sites: %" Pd ", "
+                    "const args: %" Pd "\n",
+                    function.optimized_instruction_count(),
+                    function.optimized_call_site_count(), constant_arguments));
+      PRINT_INLINING_TREE("Early heuristic", &call_data->caller, &function,
+                          call_data->call);
       return false;
     }
 
@@ -705,8 +716,8 @@
     if (is_recursive_call &&
         inlining_recursion_depth_ >= FLAG_inlining_recursion_depth_threshold) {
       TRACE_INLINING(THR_Print("     Bailout: recursive function\n"));
-      PRINT_INLINING_TREE("Recursive function",
-          &call_data->caller, &function, call_data->call);
+      PRINT_INLINING_TREE("Recursive function", &call_data->caller, &function,
+                          call_data->call);
       return false;
     }
 
@@ -725,24 +736,24 @@
 
         if (Compiler::IsBackgroundCompilation()) {
           if (isolate->IsTopLevelParsing() ||
-                  (loading_invalidation_gen_at_start !=
-                   isolate->loading_invalidation_gen())) {
+              (loading_invalidation_gen_at_start !=
+               isolate->loading_invalidation_gen())) {
             // Loading occured while parsing. We need to abort here because
             // state changed while compiling.
-            Compiler::AbortBackgroundCompilation(Thread::kNoDeoptId,
-                "Loading occured while parsing in inliner");
+            Compiler::AbortBackgroundCompilation(
+                Thread::kNoDeoptId, "Loading occured while parsing in inliner");
           }
         }
 
         // Load IC data for the callee.
         ZoneGrowableArray<const ICData*>* ic_data_array =
-              new(Z) ZoneGrowableArray<const ICData*>();
+            new (Z) ZoneGrowableArray<const ICData*>();
         const bool clone_ic_data = Compiler::IsBackgroundCompilation();
         function.RestoreICDataMap(ic_data_array, clone_ic_data);
         if (Compiler::IsBackgroundCompilation() &&
             (function.ic_data_array() == Array::null())) {
           Compiler::AbortBackgroundCompilation(Thread::kNoDeoptId,
-              "ICData cleared while inlining");
+                                               "ICData cleared while inlining");
         }
 
         // Parse the callee function.
@@ -755,27 +766,22 @@
 
         // Build the callee graph.
         InlineExitCollector* exit_collector =
-            new(Z) InlineExitCollector(caller_graph_, call);
+            new (Z) InlineExitCollector(caller_graph_, call);
         FlowGraph* callee_graph;
         if (UseKernelFrontEndFor(parsed_function)) {
           kernel::TreeNode* node = static_cast<kernel::TreeNode*>(
               parsed_function->function().kernel_function());
 
-          kernel::FlowGraphBuilder builder(node,
-                                           parsed_function,
-                                           *ic_data_array,
-                                           exit_collector,
-                                           Compiler::kNoOSRDeoptId,
-                                           caller_graph_->max_block_id() + 1);
+          kernel::FlowGraphBuilder builder(
+              node, parsed_function, *ic_data_array, exit_collector,
+              Compiler::kNoOSRDeoptId, caller_graph_->max_block_id() + 1);
           {
             CSTAT_TIMER_SCOPE(thread(), graphinliner_build_timer);
             callee_graph = builder.BuildGraph();
           }
         } else {
-          FlowGraphBuilder builder(*parsed_function,
-                                   *ic_data_array,
-                                   exit_collector,
-                                   Compiler::kNoOSRDeoptId);
+          FlowGraphBuilder builder(*parsed_function, *ic_data_array,
+                                   exit_collector, Compiler::kNoOSRDeoptId);
           builder.SetInitialBlockId(caller_graph_->max_block_id());
           {
             CSTAT_TIMER_SCOPE(thread(), graphinliner_build_timer);
@@ -788,13 +794,12 @@
         // without linking between the caller and callee graphs.
         // TODO(zerny): Put more information in the stubs, eg, type information.
         ZoneGrowableArray<Definition*>* param_stubs =
-            new(Z) ZoneGrowableArray<Definition*>(
-                function.NumParameters());
+            new (Z) ZoneGrowableArray<Definition*>(function.NumParameters());
 
         // Create a parameter stub for each fixed positional parameter.
         for (intptr_t i = 0; i < function.num_fixed_parameters(); ++i) {
-          param_stubs->Add(CreateParameterStub(i, (*arguments)[i],
-                                               callee_graph));
+          param_stubs->Add(
+              CreateParameterStub(i, (*arguments)[i], callee_graph));
         }
 
         // If the callee has optional parameters, rebuild the argument and stub
@@ -802,15 +807,13 @@
         // parameters.
         if (function.HasOptionalParameters()) {
           TRACE_INLINING(THR_Print("     adjusting for optional parameters\n"));
-          if (!AdjustForOptionalParameters(*parsed_function,
-                                           argument_names,
-                                           arguments,
-                                           param_stubs,
+          if (!AdjustForOptionalParameters(*parsed_function, argument_names,
+                                           arguments, param_stubs,
                                            callee_graph)) {
             function.set_is_inlinable(false);
             TRACE_INLINING(THR_Print("     Bailout: optional arg mismatch\n"));
-            PRINT_INLINING_TREE("Optional arg mismatch",
-                &call_data->caller, &function, call_data->call);
+            PRINT_INLINING_TREE("Optional arg mismatch", &call_data->caller,
+                                &function, call_data->call);
             return false;
           }
         }
@@ -848,8 +851,7 @@
           // Deopt-ids overlap between caller and callee.
           if (FLAG_precompiled_mode) {
 #ifdef DART_PRECOMPILER
-            AotOptimizer optimizer(inliner_->precompiler_,
-                                   callee_graph,
+            AotOptimizer optimizer(inliner_->precompiler_, callee_graph,
                                    inliner_->use_speculative_inlining_,
                                    inliner_->inlining_black_list_);
             optimizer.PopulateWithICData();
@@ -921,22 +923,22 @@
             function.set_is_inlinable(false);
           }
           thread()->set_deopt_id(prev_deopt_id);
-          TRACE_INLINING(THR_Print("     Bailout: heuristics with "
-                                   "code size:  %" Pd ", "
-                                   "call sites: %" Pd ", "
-                                   "const args: %" Pd "\n",
-                                   size,
-                                   call_site_count,
-                                   constants_count));
-          PRINT_INLINING_TREE("Heuristic fail",
-              &call_data->caller, &function, call_data->call);
+          TRACE_INLINING(
+              THR_Print("     Bailout: heuristics with "
+                        "code size:  %" Pd ", "
+                        "call sites: %" Pd ", "
+                        "const args: %" Pd "\n",
+                        size, call_site_count, constants_count));
+          PRINT_INLINING_TREE("Heuristic fail", &call_data->caller, &function,
+                              call_data->call);
           return false;
         }
 
         // Inline dispatcher methods regardless of the current depth.
-        const intptr_t depth =
-            (function.IsInvokeFieldDispatcher() ||
-             function.IsNoSuchMethodDispatcher()) ? 0 : inlining_depth_;
+        const intptr_t depth = (function.IsInvokeFieldDispatcher() ||
+                                function.IsNoSuchMethodDispatcher())
+                                   ? 0
+                                   : inlining_depth_;
         collected_call_sites_->FindCallSites(callee_graph, depth,
                                              &inlined_info_);
 
@@ -962,21 +964,21 @@
         const ZoneGrowableArray<const Field*>& callee_guarded_fields =
             *callee_graph->parsed_function().guarded_fields();
         for (intptr_t i = 0; i < callee_guarded_fields.length(); ++i) {
-          caller_graph()->
-              parsed_function().AddToGuardedFields(callee_guarded_fields[i]);
+          caller_graph()->parsed_function().AddToGuardedFields(
+              callee_guarded_fields[i]);
         }
         // When inlined, we add the deferred prefixes of the callee to the
         // caller's list of deferred prefixes.
         caller_graph()->AddToDeferredPrefixes(
             callee_graph->deferred_prefixes());
 
-        FlowGraphInliner::SetInliningId(callee_graph,
+        FlowGraphInliner::SetInliningId(
+            callee_graph,
             inliner_->NextInlineId(callee_graph->function(),
                                    call_data->call->token_pos(),
                                    call_data->caller_inlining_id_));
         TRACE_INLINING(THR_Print("     Success\n"));
-        PRINT_INLINING_TREE(NULL,
-            &call_data->caller, &function, call);
+        PRINT_INLINING_TREE(NULL, &call_data->caller, &function, call);
         return true;
       } else {
         error = thread()->sticky_error();
@@ -985,13 +987,12 @@
         if (error.IsLanguageError() &&
             (LanguageError::Cast(error).kind() == Report::kBailout)) {
           if (error.raw() == Object::background_compilation_error().raw()) {
-             // Fall through to exit the compilation, and retry it later.
+            // Fall through to exit the compilation, and retry it later.
           } else {
             thread()->set_deopt_id(prev_deopt_id);
-            TRACE_INLINING(THR_Print("     Bailout: %s\n",
-                                     error.ToErrorCString()));
-            PRINT_INLINING_TREE("Bailout",
-                &call_data->caller, &function, call);
+            TRACE_INLINING(
+                THR_Print("     Bailout: %s\n", error.ToErrorCString()));
+            PRINT_INLINING_TREE("Bailout", &call_data->caller, &function, call);
             return false;
           }
         } else {
@@ -1007,8 +1008,7 @@
     // In background compilation we may abort compilation as the state
     // changes while compiling. Propagate that 'error' and retry compilation
     // later.
-    ASSERT(FLAG_precompiled_mode ||
-           Compiler::IsBackgroundCompilation() ||
+    ASSERT(FLAG_precompiled_mode || Compiler::IsBackgroundCompilation() ||
            error.IsUnhandledException());
     Thread::Current()->long_jump_base()->Jump(1, error);
     UNREACHABLE();
@@ -1018,10 +1018,8 @@
   void PrintInlinedInfo(const Function& top) {
     if (inlined_info_.length() > 0) {
       THR_Print("Inlining into: '%s' growth: %f (%" Pd " -> %" Pd ")\n",
-          top.ToFullyQualifiedCString(),
-          GrowthFactor(),
-          initial_size_,
-          inlined_size_);
+                top.ToFullyQualifiedCString(), GrowthFactor(), initial_size_,
+                inlined_size_);
       PrintInlinedInfoFor(top, 1);
     }
   }
@@ -1051,9 +1049,8 @@
         for (int t = 0; t < depth; t++) {
           THR_Print("  ");
         }
-        THR_Print("%" Pd " %s\n",
-            info.call_instr->GetDeoptId(),
-            info.inlined->ToQualifiedCString());
+        THR_Print("%" Pd " %s\n", info.call_instr->GetDeoptId(),
+                  info.inlined->ToQualifiedCString());
         PrintInlinedInfoFor(*info.inlined, depth + 1);
         call_instructions_printed.Add(info.call_instr->GetDeoptId());
       }
@@ -1071,10 +1068,8 @@
         for (int t = 0; t < depth; t++) {
           THR_Print("  ");
         }
-        THR_Print("NO %" Pd " %s - %s\n",
-            info.call_instr->GetDeoptId(),
-            info.inlined->ToQualifiedCString(),
-            info.bailout_reason);
+        THR_Print("NO %" Pd " %s - %s\n", info.call_instr->GetDeoptId(),
+                  info.inlined->ToQualifiedCString(), info.bailout_reason);
         call_instructions_printed.Add(info.call_instr->GetDeoptId());
       }
     }
@@ -1120,14 +1115,12 @@
       CurrentContextInstr* context = (*defns)[i]->AsCurrentContext();
       if ((context != NULL) && context->HasUses()) {
         ASSERT(call->IsClosureCall());
-        LoadFieldInstr* context_load = new(Z) LoadFieldInstr(
-            new Value((*arguments)[0]->definition()),
-            Closure::context_offset(),
+        LoadFieldInstr* context_load = new (Z) LoadFieldInstr(
+            new Value((*arguments)[0]->definition()), Closure::context_offset(),
             AbstractType::ZoneHandle(zone(), 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->set_ssa_temp_index(caller_graph_->alloc_ssa_temp_index());
         context_load->InsertBefore(callee_entry->next());
         context->ReplaceUsesWith(context_load);
       }
@@ -1157,7 +1150,7 @@
     }
     *in_cache = false;
     ParsedFunction* parsed_function =
-        new(Z) ParsedFunction(thread(), function);
+        new (Z) ParsedFunction(thread(), function);
     if (!UseKernelFrontEndFor(parsed_function)) {
       Parser::ParseFunction(parsed_function);
       parsed_function->AllocateVariables();
@@ -1174,13 +1167,12 @@
       const Function& target = call->function();
       if (!inliner_->AlwaysInline(target) &&
           (call_info[call_idx].ratio * 100) < FLAG_inlining_hotness) {
-        TRACE_INLINING(THR_Print(
-            "  => %s (deopt count %d)\n     Bailout: cold %f\n",
-            target.ToCString(),
-            target.deoptimization_counter(),
-            call_info[call_idx].ratio));
-        PRINT_INLINING_TREE("Too cold",
-            &call_info[call_idx].caller(), &call->function(), call);
+        TRACE_INLINING(
+            THR_Print("  => %s (deopt count %d)\n     Bailout: cold %f\n",
+                      target.ToCString(), target.deoptimization_counter(),
+                      call_info[call_idx].ratio));
+        PRINT_INLINING_TREE("Too cold", &call_info[call_idx].caller(),
+                            &call->function(), call);
         continue;
       }
       GrowableArray<Value*> arguments(call->ArgumentCount());
@@ -1199,8 +1191,8 @@
   void InlineClosureCalls() {
     const GrowableArray<CallSites::ClosureCallInfo>& call_info =
         inlining_call_sites_->closure_calls();
-    TRACE_INLINING(THR_Print("  Closure Calls (%" Pd ")\n",
-        call_info.length()));
+    TRACE_INLINING(
+        THR_Print("  Closure Calls (%" Pd ")\n", call_info.length()));
     for (intptr_t call_idx = 0; call_idx < call_info.length(); ++call_idx) {
       ClosureCallInstr* call = call_info[call_idx].call;
       // Find the closure of the callee.
@@ -1214,8 +1206,7 @@
       }
       ConstantInstr* constant =
           call->ArgumentAt(0)->OriginalDefinition()->AsConstant();
-      if ((constant != NULL) &&
-          constant->value().IsClosure()) {
+      if ((constant != NULL) && constant->value().IsClosure()) {
         target ^= Closure::Cast(constant->value()).function();
       }
 
@@ -1230,9 +1221,7 @@
       InlinedCallData call_data(
           call, &arguments, call_info[call_idx].caller(),
           call_info[call_idx].caller_graph->inlining_id());
-      if (TryInlining(target,
-                      call->argument_names(),
-                      &call_data)) {
+      if (TryInlining(target, call->argument_names(), &call_data)) {
         InlineCall(&call_data);
       }
     }
@@ -1248,9 +1237,9 @@
       if (call->with_checks()) {
         // PolymorphicInliner introduces deoptimization paths.
         if (!call->complete() && !FLAG_polymorphic_with_deopt) {
-          TRACE_INLINING(THR_Print(
-              "  => %s\n     Bailout: call with checks\n",
-              call->instance_call()->function_name().ToCString()));
+          TRACE_INLINING(
+              THR_Print("  => %s\n     Bailout: call with checks\n",
+                        call->instance_call()->function_name().ToCString()));
           continue;
         }
         const Function& cl = call_info[call_idx].caller();
@@ -1265,13 +1254,12 @@
       const Function& target = Function::ZoneHandle(ic_data.GetTargetAt(0));
       if (!inliner_->AlwaysInline(target) &&
           (call_info[call_idx].ratio * 100) < FLAG_inlining_hotness) {
-        TRACE_INLINING(THR_Print(
-            "  => %s (deopt count %d)\n     Bailout: cold %f\n",
-            target.ToCString(),
-            target.deoptimization_counter(),
-            call_info[call_idx].ratio));
-        PRINT_INLINING_TREE("Too cold",
-            &call_info[call_idx].caller(), &target, call);
+        TRACE_INLINING(
+            THR_Print("  => %s (deopt count %d)\n     Bailout: cold %f\n",
+                      target.ToCString(), target.deoptimization_counter(),
+                      call_info[call_idx].ratio));
+        PRINT_INLINING_TREE("Too cold", &call_info[call_idx].caller(), &target,
+                            call);
         continue;
       }
       GrowableArray<Value*> arguments(call->ArgumentCount());
@@ -1281,8 +1269,7 @@
       InlinedCallData call_data(
           call, &arguments, call_info[call_idx].caller(),
           call_info[call_idx].caller_graph->inlining_id());
-      if (TryInlining(target,
-                      call->instance_call()->argument_names(),
+      if (TryInlining(target, call->instance_call()->argument_names(),
                       &call_data)) {
         InlineCall(&call_data);
       }
@@ -1318,7 +1305,7 @@
       for (intptr_t i = arg_count; i < param_count; ++i) {
         const Instance& object =
             parsed_function.DefaultParameterValueAt(i - fixed_param_count);
-        ConstantInstr* constant = new(Z) ConstantInstr(object);
+        ConstantInstr* constant = new (Z) ConstantInstr(object);
         arguments->Add(NULL);
         param_stubs->Add(constant);
       }
@@ -1407,11 +1394,9 @@
       inlined_variants_(num_variants_),
       non_inlined_variants_(num_variants_),
       inlined_entries_(num_variants_),
-      exit_collector_(new(Z)
-          InlineExitCollector(owner->caller_graph(), call)),
+      exit_collector_(new (Z) InlineExitCollector(owner->caller_graph(), call)),
       caller_function_(caller_function),
-      caller_inlining_id_(caller_inlining_id) {
-}
+      caller_inlining_id_(caller_inlining_id) {}
 
 
 Isolate* PolymorphicInliner::isolate() const {
@@ -1463,7 +1448,7 @@
             new TargetEntryInstr(owner_->caller_graph()->allocate_block_id(),
                                  old_target->try_index());
         new_target->InheritDeoptTarget(zone(), new_join);
-        GotoInstr* new_goto = new(Z) GotoInstr(new_join);
+        GotoInstr* new_goto = new (Z) GotoInstr(new_join);
         new_goto->InheritDeoptTarget(zone(), new_join);
         new_target->LinkTo(new_goto);
         new_target->set_last_instruction(new_goto);
@@ -1498,7 +1483,7 @@
 
 
 bool PolymorphicInliner::TryInliningPoly(intptr_t receiver_cid,
-                                        const Function& target) {
+                                         const Function& target) {
   if ((!FLAG_precompiled_mode ||
        owner_->inliner_->use_speculative_inlining()) &&
       TryInlineRecognizedMethod(receiver_cid, target)) {
@@ -1510,11 +1495,9 @@
   for (int i = 0; i < call_->ArgumentCount(); ++i) {
     arguments.Add(call_->PushArgumentAt(i)->value());
   }
-  InlinedCallData call_data(call_, &arguments,
-                            caller_function_,
+  InlinedCallData call_data(call_, &arguments, caller_function_,
                             caller_inlining_id_);
-  if (!owner_->TryInlining(target,
-                           call_->instance_call()->argument_names(),
+  if (!owner_->TryInlining(target, call_->instance_call()->argument_names(),
                            &call_data)) {
     return false;
   }
@@ -1529,8 +1512,7 @@
   // hoisted above the inlined entry.
   ASSERT(arguments.length() > 0);
   Value* actual = arguments[0];
-  RedefinitionInstr* redefinition = new(Z)
-      RedefinitionInstr(actual->Copy(Z));
+  RedefinitionInstr* redefinition = new (Z) RedefinitionInstr(actual->Copy(Z));
   redefinition->set_ssa_temp_index(
       owner_->caller_graph()->alloc_ssa_temp_index());
   redefinition->UpdateType(CompileType::FromCid(receiver_cid));
@@ -1556,11 +1538,10 @@
     CurrentContextInstr* context = (*defns)[i]->AsCurrentContext();
     if ((context != NULL) && context->HasUses()) {
       ASSERT(call_data.call->IsClosureCall());
-      LoadFieldInstr* context_load = new(Z) LoadFieldInstr(
-          new Value(redefinition),
-          Closure::context_offset(),
-          AbstractType::ZoneHandle(zone(), AbstractType::null()),
-          call_data.call->token_pos());
+      LoadFieldInstr* context_load = new (Z)
+          LoadFieldInstr(new Value(redefinition), Closure::context_offset(),
+                         AbstractType::ZoneHandle(zone(), 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());
@@ -1572,8 +1553,7 @@
 }
 
 
-static Instruction* AppendInstruction(Instruction* first,
-                                      Instruction* second) {
+static Instruction* AppendInstruction(Instruction* first, Instruction* second) {
   for (intptr_t i = second->InputCount() - 1; i >= 0; --i) {
     Value* input = second->InputAt(i);
     input->definition()->AddInputUse(input);
@@ -1591,40 +1571,31 @@
   // the inlined body from being hoisted above the inlined entry.
   GrowableArray<Definition*> arguments(call_->ArgumentCount());
   Definition* receiver = call_->ArgumentAt(0);
-    RedefinitionInstr* redefinition =
-        new(Z) RedefinitionInstr(new(Z) Value(receiver));
-    redefinition->set_ssa_temp_index(
-        owner_->caller_graph()->alloc_ssa_temp_index());
+  RedefinitionInstr* redefinition =
+      new (Z) RedefinitionInstr(new (Z) Value(receiver));
+  redefinition->set_ssa_temp_index(
+      owner_->caller_graph()->alloc_ssa_temp_index());
   if (FlowGraphInliner::TryInlineRecognizedMethod(
-          owner_->caller_graph(),
-          receiver_cid,
-          target,
-          call_,
-          redefinition,
+          owner_->caller_graph(), receiver_cid, target, call_, redefinition,
           call_->instance_call()->token_pos(),
-          *call_->instance_call()->ic_data(),
-          &entry, &last)) {
+          *call_->instance_call()->ic_data(), &entry, &last)) {
     // Create a graph fragment.
     redefinition->InsertAfter(entry);
     InlineExitCollector* exit_collector =
-        new(Z) InlineExitCollector(owner_->caller_graph(), call_);
+        new (Z) InlineExitCollector(owner_->caller_graph(), call_);
 
-    ReturnInstr* result =
-        new(Z) ReturnInstr(call_->instance_call()->token_pos(),
-            new(Z) Value(last));
+    ReturnInstr* result = new (Z)
+        ReturnInstr(call_->instance_call()->token_pos(), new (Z) Value(last));
     owner_->caller_graph()->AppendTo(
-        last,
-        result,
+        last, result,
         call_->env(),  // Return can become deoptimization target.
         FlowGraph::kEffect);
     entry->set_last_instruction(result);
     exit_collector->AddExit(result);
     ParsedFunction* temp_parsed_function =
         new ParsedFunction(Thread::Current(), target);
-    GraphEntryInstr* graph_entry =
-        new(Z) GraphEntryInstr(*temp_parsed_function,
-                               entry,
-                               Compiler::kNoOSRDeoptId);
+    GraphEntryInstr* graph_entry = new (Z)
+        GraphEntryInstr(*temp_parsed_function, entry, Compiler::kNoOSRDeoptId);
     // Update polymorphic inliner state.
     inlined_entries_.Add(graph_entry);
     exit_collector_->Union(exit_collector);
@@ -1643,9 +1614,8 @@
 TargetEntryInstr* PolymorphicInliner::BuildDecisionGraph() {
   // Start with a fresh target entry.
   TargetEntryInstr* entry =
-      new(Z) TargetEntryInstr(
-          owner_->caller_graph()->allocate_block_id(),
-          call_->GetBlock()->try_index());
+      new (Z) TargetEntryInstr(owner_->caller_graph()->allocate_block_id(),
+                               call_->GetBlock()->try_index());
   entry->InheritDeoptTarget(zone(), call_);
 
   // This function uses a cursor (a pointer to the 'current' instruction) to
@@ -1658,7 +1628,7 @@
   // There are at least two variants including non-inlined ones, so we have
   // at least one branch on the class id.
   LoadClassIdInstr* load_cid =
-      new(Z) LoadClassIdInstr(new(Z) Value(receiver));
+      new (Z) LoadClassIdInstr(new (Z) Value(receiver));
   load_cid->set_ssa_temp_index(owner_->caller_graph()->alloc_ssa_temp_index());
   cursor = AppendInstruction(cursor, load_cid);
   for (intptr_t i = 0; i < inlined_variants_.length(); ++i) {
@@ -1670,14 +1640,13 @@
       // we know that we have covered all possible classes.
       if (!call_->complete()) {
         RedefinitionInstr* cid_redefinition =
-            new RedefinitionInstr(new(Z) Value(load_cid));
+            new RedefinitionInstr(new (Z) Value(load_cid));
         cid_redefinition->set_ssa_temp_index(
             owner_->caller_graph()->alloc_ssa_temp_index());
         cursor = AppendInstruction(cursor, cid_redefinition);
-        CheckClassIdInstr* check_class_id = new(Z) CheckClassIdInstr(
-            new(Z) Value(cid_redefinition),
-            inlined_variants_[i].cid,
-            call_->deopt_id());
+        CheckClassIdInstr* check_class_id = new (Z)
+            CheckClassIdInstr(new (Z) Value(cid_redefinition),
+                              inlined_variants_[i].cid, call_->deopt_id());
         check_class_id->InheritDeoptTarget(zone(), call_);
         cursor = AppendInstruction(cursor, check_class_id);
       }
@@ -1689,8 +1658,7 @@
       if (callee_entry->IsGraphEntry()) {
         // Unshared.  Graft the normal entry on after the check class
         // instruction.
-        TargetEntryInstr* target =
-            callee_entry->AsGraphEntry()->normal_entry();
+        TargetEntryInstr* target = callee_entry->AsGraphEntry()->normal_entry();
         cursor->LinkTo(target->next());
         target->ReplaceAsPredecessorWith(current_block);
         // Unuse all inputs of the graph entry and the normal entry. They are
@@ -1699,9 +1667,7 @@
         target->UnuseAllInputs();
         // All blocks that were dominated by the normal entry are now
         // dominated by the current block.
-        for (intptr_t j = 0;
-             j < target->dominated_blocks().length();
-             ++j) {
+        for (intptr_t j = 0; j < target->dominated_blocks().length(); ++j) {
           BlockEntryInstr* block = target->dominated_blocks()[j];
           current_block->AddDominatedBlock(block);
         }
@@ -1728,12 +1694,10 @@
       ConstantInstr* cid_constant = new ConstantInstr(cid);
       cid_constant->set_ssa_temp_index(
           owner_->caller_graph()->alloc_ssa_temp_index());
-      StrictCompareInstr* compare =
-          new StrictCompareInstr(call_->instance_call()->token_pos(),
-                                 Token::kEQ_STRICT,
-                                 new Value(load_cid),
-                                 new Value(cid_constant),
-                                 false);  // No number check.
+      StrictCompareInstr* compare = new StrictCompareInstr(
+          call_->instance_call()->token_pos(), Token::kEQ_STRICT,
+          new Value(load_cid), new Value(cid_constant),
+          false);  // No number check.
       BranchInstr* branch = new BranchInstr(compare);
       branch->InheritDeoptTarget(zone(), call_);
       AppendInstruction(AppendInstruction(cursor, cid_constant), branch);
@@ -1754,8 +1718,7 @@
         // Shared inlined body and this is the first entry.  We have already
         // constructed a join and this target jumps to it.
         true_target = callee_entry->AsTargetEntry();
-        BlockEntryInstr* join =
-            true_target->last_instruction()->SuccessorAt(0);
+        BlockEntryInstr* join = true_target->last_instruction()->SuccessorAt(0);
         current_block->AddDominatedBlock(join);
       } else {
         // Shared inlined body and this is a subsequent entry.  We have
@@ -1799,33 +1762,28 @@
       cursor = push;
     }
     const ICData& old_checks = call_->ic_data();
-    const ICData& new_checks = ICData::ZoneHandle(
-        ICData::New(Function::Handle(old_checks.Owner()),
-                    String::Handle(old_checks.target_name()),
-                    Array::Handle(old_checks.arguments_descriptor()),
-                    old_checks.deopt_id(),
-                    1,        // Number of args tested.
-                    false));  // is_static_call
+    const ICData& new_checks = ICData::ZoneHandle(ICData::New(
+        Function::Handle(old_checks.Owner()),
+        String::Handle(old_checks.target_name()),
+        Array::Handle(old_checks.arguments_descriptor()), old_checks.deopt_id(),
+        1,        // Number of args tested.
+        false));  // is_static_call
     for (intptr_t i = 0; i < non_inlined_variants_.length(); ++i) {
       new_checks.AddReceiverCheck(non_inlined_variants_[i].cid,
                                   *non_inlined_variants_[i].target,
                                   non_inlined_variants_[i].count);
     }
     PolymorphicInstanceCallInstr* fallback_call =
-        new PolymorphicInstanceCallInstr(call_->instance_call(),
-                                         new_checks,
+        new PolymorphicInstanceCallInstr(call_->instance_call(), new_checks,
                                          /* with_checks = */ true,
                                          call_->complete());
     fallback_call->set_ssa_temp_index(
         owner_->caller_graph()->alloc_ssa_temp_index());
     fallback_call->InheritDeoptTarget(zone(), call_);
-    ReturnInstr* fallback_return =
-        new ReturnInstr(call_->instance_call()->token_pos(),
-                        new Value(fallback_call));
-    fallback_return->InheritDeoptTargetAfter(
-        owner_->caller_graph(),
-        call_,
-        fallback_call);
+    ReturnInstr* fallback_return = new ReturnInstr(
+        call_->instance_call()->token_pos(), new Value(fallback_call));
+    fallback_return->InheritDeoptTargetAfter(owner_->caller_graph(), call_,
+                                             fallback_call);
     AppendInstruction(AppendInstruction(cursor, fallback_call),
                       fallback_return);
     exit_collector_->AddExit(fallback_return);
@@ -1844,8 +1802,7 @@
 
 void PolymorphicInliner::Inline() {
   // Consider the polymorphic variants in order by frequency.
-  FlowGraphCompiler::SortICDataByCount(call_->ic_data(),
-                                       &variants_,
+  FlowGraphCompiler::SortICDataByCount(call_->ic_data(), &variants_,
                                        /* drop_smi = */ false);
   for (intptr_t var_idx = 0; var_idx < variants_.length(); ++var_idx) {
     const Function& target = *variants_[var_idx].target;
@@ -1935,10 +1892,8 @@
   ASSERT(flow_graph->inlining_id() < 0);
   flow_graph->set_inlining_id(inlining_id);
   for (BlockIterator block_it = flow_graph->postorder_iterator();
-       !block_it.Done();
-       block_it.Advance()) {
-    for (ForwardInstructionIterator it(block_it.Current());
-         !it.Done();
+       !block_it.Done(); block_it.Advance()) {
+    for (ForwardInstructionIterator it(block_it.Current()); !it.Done();
          it.Advance()) {
       Instruction* current = it.Current();
       // Do not overwrite owner function.
@@ -1963,8 +1918,8 @@
   const char* kAlwaysInlineAnnotation = "AlwaysInline";
   if (FLAG_enable_inlining_annotations &&
       HasAnnotation(function, kAlwaysInlineAnnotation)) {
-    TRACE_INLINING(THR_Print("AlwaysInline annotation for %s\n",
-                             function.ToCString()));
+    TRACE_INLINING(
+        THR_Print("AlwaysInline annotation for %s\n", function.ToCString()));
     return true;
   }
 
@@ -1994,11 +1949,10 @@
 
   TRACE_INLINING(THR_Print("Inlining calls in %s\n", top.ToCString()));
 
-  if (FLAG_support_il_printer &&
-      trace_inlining() &&
+  if (FLAG_support_il_printer && trace_inlining() &&
       (FLAG_print_flow_graph || FLAG_print_flow_graph_optimized)) {
-    THR_Print("Before Inlining of %s\n", flow_graph_->
-              function().ToFullyQualifiedCString());
+    THR_Print("Before Inlining of %s\n",
+              flow_graph_->function().ToFullyQualifiedCString());
     FlowGraphPrinter printer(*flow_graph_);
     printer.PrintBlocks();
   }
@@ -2015,8 +1969,8 @@
       THR_Print("Inlining growth factor: %f\n", inliner.GrowthFactor());
       if (FLAG_support_il_printer &&
           (FLAG_print_flow_graph || FLAG_print_flow_graph_optimized)) {
-        THR_Print("After Inlining of %s\n", flow_graph_->
-                  function().ToFullyQualifiedCString());
+        THR_Print("After Inlining of %s\n",
+                  flow_graph_->function().ToFullyQualifiedCString());
         FlowGraphPrinter printer(*flow_graph_);
         printer.PrintBlocks();
       }
@@ -2079,54 +2033,36 @@
                                        Definition* index,
                                        Instruction** cursor) {
   // Insert array length load and bounds check.
-  LoadFieldInstr* length =
-      new(Z) LoadFieldInstr(
-          new(Z) Value(*array),
-          CheckArrayBoundInstr::LengthOffsetFor(array_cid),
-          Type::ZoneHandle(Z, Type::SmiType()),
-          call->token_pos());
+  LoadFieldInstr* length = new (Z) LoadFieldInstr(
+      new (Z) Value(*array), CheckArrayBoundInstr::LengthOffsetFor(array_cid),
+      Type::ZoneHandle(Z, Type::SmiType()), call->token_pos());
   length->set_is_immutable(
       CheckArrayBoundInstr::IsFixedLengthArrayType(array_cid));
   length->set_result_cid(kSmiCid);
   length->set_recognized_kind(
       LoadFieldInstr::RecognizedKindFromArrayCid(array_cid));
-  *cursor = flow_graph->AppendTo(*cursor,
-                                 length,
-                                 NULL,
-                                 FlowGraph::kValue);
+  *cursor = flow_graph->AppendTo(*cursor, length, NULL, FlowGraph::kValue);
 
-  *cursor = flow_graph->AppendTo(*cursor,
-                                 new(Z) CheckArrayBoundInstr(
-                                     new(Z) Value(length),
-                                     new(Z) Value(index),
-                                     call->deopt_id()),
-                                 call->env(),
-                                 FlowGraph::kEffect);
+  *cursor = flow_graph->AppendTo(
+      *cursor,
+      new (Z) CheckArrayBoundInstr(new (Z) Value(length), new (Z) Value(index),
+                                   call->deopt_id()),
+      call->env(), FlowGraph::kEffect);
 
   if (array_cid == kGrowableObjectArrayCid) {
     // Insert data elements load.
-    LoadFieldInstr* elements =
-        new(Z) LoadFieldInstr(
-            new(Z) Value(*array),
-            GrowableObjectArray::data_offset(),
-            Object::dynamic_type(),
-            call->token_pos());
+    LoadFieldInstr* elements = new (Z) LoadFieldInstr(
+        new (Z) Value(*array), GrowableObjectArray::data_offset(),
+        Object::dynamic_type(), call->token_pos());
     elements->set_result_cid(kArrayCid);
-    *cursor = flow_graph->AppendTo(*cursor,
-                                   elements,
-                                   NULL,
-                                   FlowGraph::kValue);
+    *cursor = flow_graph->AppendTo(*cursor, elements, NULL, FlowGraph::kValue);
     // Load from the data from backing store which is a fixed-length array.
     *array = elements;
     array_cid = kArrayCid;
   } else if (RawObject::IsExternalTypedDataClassId(array_cid)) {
-    LoadUntaggedInstr* elements =
-        new(Z) LoadUntaggedInstr(new(Z) Value(*array),
-                                 ExternalTypedData::data_offset());
-    *cursor = flow_graph->AppendTo(*cursor,
-                                   elements,
-                                   NULL,
-                                   FlowGraph::kValue);
+    LoadUntaggedInstr* elements = new (Z) LoadUntaggedInstr(
+        new (Z) Value(*array), ExternalTypedData::data_offset());
+    *cursor = flow_graph->AppendTo(*cursor, elements, NULL, FlowGraph::kValue);
     *array = elements;
   }
   return array_cid;
@@ -2140,12 +2076,10 @@
                                   TokenPosition token_pos) {
   if ((unary_checks.NumberOfUsedChecks() == 1) &&
       unary_checks.HasReceiverClassId(kSmiCid)) {
-    return new(Z) CheckSmiInstr(new(Z) Value(to_check),
-                                deopt_id,
-                                token_pos);
+    return new (Z) CheckSmiInstr(new (Z) Value(to_check), deopt_id, token_pos);
   }
-  return new(Z) CheckClassInstr(
-      new(Z) Value(to_check), deopt_id, unary_checks, token_pos);
+  return new (Z) CheckClassInstr(new (Z) Value(to_check), deopt_id,
+                                 unary_checks, token_pos);
 }
 
 
@@ -2159,16 +2093,12 @@
 
   Definition* array = receiver;
   Definition* index = call->ArgumentAt(1);
-  *entry = new(Z) TargetEntryInstr(flow_graph->allocate_block_id(),
-                                   call->GetBlock()->try_index());
+  *entry = new (Z) TargetEntryInstr(flow_graph->allocate_block_id(),
+                                    call->GetBlock()->try_index());
   (*entry)->InheritDeoptTarget(Z, call);
   Instruction* cursor = *entry;
 
-  array_cid = PrepareInlineIndexedOp(flow_graph,
-                                     call,
-                                     array_cid,
-                                     &array,
-                                     index,
+  array_cid = PrepareInlineIndexedOp(flow_graph, call, array_cid, &array, index,
                                      &cursor);
 
   intptr_t deopt_id = Thread::kNoDeoptId;
@@ -2180,23 +2110,16 @@
 
   // Array load and return.
   intptr_t index_scale = Instance::ElementSizeFor(array_cid);
-  *last = new(Z) LoadIndexedInstr(new(Z) Value(array),
-                                  new(Z) Value(index),
-                                  index_scale,
-                                  array_cid,
-                                  kAlignedAccess,
-                                  deopt_id,
-                                  call->token_pos());
+  *last = new (Z)
+      LoadIndexedInstr(new (Z) Value(array), new (Z) Value(index), index_scale,
+                       array_cid, kAlignedAccess, deopt_id, call->token_pos());
   cursor = flow_graph->AppendTo(
-      cursor,
-      *last,
-      deopt_id != Thread::kNoDeoptId ? call->env() : NULL,
+      cursor, *last, deopt_id != Thread::kNoDeoptId ? call->env() : NULL,
       FlowGraph::kValue);
 
   if (array_cid == kTypedDataFloat32ArrayCid) {
-    *last = new(Z) FloatToDoubleInstr(new(Z) Value(*last), deopt_id);
-    flow_graph->AppendTo(cursor,
-                         *last,
+    *last = new (Z) FloatToDoubleInstr(new (Z) Value(*last), deopt_id);
+    flow_graph->AppendTo(cursor, *last,
                          deopt_id != Thread::kNoDeoptId ? call->env() : NULL,
                          FlowGraph::kValue);
   }
@@ -2219,8 +2142,8 @@
   Definition* index = call->ArgumentAt(1);
   Definition* stored_value = call->ArgumentAt(2);
 
-  *entry = new(Z) TargetEntryInstr(flow_graph->allocate_block_id(),
-                                   call->GetBlock()->try_index());
+  *entry = new (Z) TargetEntryInstr(flow_graph->allocate_block_id(),
+                                    call->GetBlock()->try_index());
   (*entry)->InheritDeoptTarget(Z, call);
   Instruction* cursor = *entry;
   if (flow_graph->isolate()->type_checks()) {
@@ -2233,17 +2156,14 @@
     switch (array_cid) {
       case kArrayCid:
       case kGrowableObjectArrayCid: {
-        const Class& instantiator_class =  Class::Handle(Z, target.Owner());
+        const Class& instantiator_class = Class::Handle(Z, target.Owner());
         intptr_t type_arguments_field_offset =
             instantiator_class.type_arguments_field_offset();
-        LoadFieldInstr* load_type_args =
-            new(Z) LoadFieldInstr(new(Z) Value(array),
-                                  type_arguments_field_offset,
-                                  Type::ZoneHandle(Z),  // No type.
-                                  call->token_pos());
-        cursor = flow_graph->AppendTo(cursor,
-                                      load_type_args,
-                                      NULL,
+        LoadFieldInstr* load_type_args = new (Z)
+            LoadFieldInstr(new (Z) Value(array), type_arguments_field_offset,
+                           Type::ZoneHandle(Z),  // No type.
+                           call->token_pos());
+        cursor = flow_graph->AppendTo(cursor, load_type_args, NULL,
                                       FlowGraph::kValue);
 
         type_args = load_type_args;
@@ -2260,7 +2180,7 @@
       case kTypedDataUint32ArrayCid:
       case kTypedDataInt64ArrayCid:
         ASSERT(value_type.IsIntType());
-        // Fall through.
+      // Fall through.
       case kTypedDataFloat32ArrayCid:
       case kTypedDataFloat64ArrayCid: {
         type_args = flow_graph->constant_null();
@@ -2288,94 +2208,62 @@
         // TODO(fschneider): Add support for other array types.
         UNREACHABLE();
     }
-    AssertAssignableInstr* assert_value =
-        new(Z) AssertAssignableInstr(token_pos,
-                                     new(Z) Value(stored_value),
-                                     new(Z) Value(type_args),
-                                     value_type,
-                                     Symbols::Value(),
-                                     call->deopt_id());
-    cursor = flow_graph->AppendTo(cursor,
-                                  assert_value,
-                                  call->env(),
+    AssertAssignableInstr* assert_value = new (Z) AssertAssignableInstr(
+        token_pos, new (Z) Value(stored_value), new (Z) Value(type_args),
+        value_type, Symbols::Value(), call->deopt_id());
+    cursor = flow_graph->AppendTo(cursor, assert_value, call->env(),
                                   FlowGraph::kValue);
   }
 
-  array_cid = PrepareInlineIndexedOp(flow_graph,
-                                     call,
-                                     array_cid,
-                                     &array,
-                                     index,
+  array_cid = PrepareInlineIndexedOp(flow_graph, call, array_cid, &array, index,
                                      &cursor);
 
   // Check if store barrier is needed. Byte arrays don't need a store barrier.
   StoreBarrierType needs_store_barrier =
       (RawObject::IsTypedDataClassId(array_cid) ||
        RawObject::IsTypedDataViewClassId(array_cid) ||
-       RawObject::IsExternalTypedDataClassId(array_cid)) ? kNoStoreBarrier
-                                                         : kEmitStoreBarrier;
+       RawObject::IsExternalTypedDataClassId(array_cid))
+          ? kNoStoreBarrier
+          : kEmitStoreBarrier;
 
   // No need to class check stores to Int32 and Uint32 arrays because
   // we insert unboxing instructions below which include a class check.
   if ((array_cid != kTypedDataUint32ArrayCid) &&
-      (array_cid != kTypedDataInt32ArrayCid) &&
-      !value_check.IsNull()) {
+      (array_cid != kTypedDataInt32ArrayCid) && !value_check.IsNull()) {
     // No store barrier needed because checked value is a smi, an unboxed mint,
     // an unboxed double, an unboxed Float32x4, or unboxed Int32x4.
     needs_store_barrier = kNoStoreBarrier;
-    Instruction* check = GetCheckClass(flow_graph,
-                                       stored_value,
-                                       value_check,
-                                       call->deopt_id(),
-                                       call->token_pos());
-    cursor = flow_graph->AppendTo(cursor,
-                                  check,
-                                  call->env(),
-                                  FlowGraph::kEffect);
+    Instruction* check = GetCheckClass(flow_graph, stored_value, value_check,
+                                       call->deopt_id(), call->token_pos());
+    cursor =
+        flow_graph->AppendTo(cursor, check, call->env(), FlowGraph::kEffect);
   }
 
   if (array_cid == kTypedDataFloat32ArrayCid) {
-    stored_value =
-        new(Z) DoubleToFloatInstr(
-            new(Z) Value(stored_value), call->deopt_id());
-    cursor = flow_graph->AppendTo(cursor,
-                                  stored_value,
-                                  NULL,
-                                  FlowGraph::kValue);
+    stored_value = new (Z)
+        DoubleToFloatInstr(new (Z) Value(stored_value), call->deopt_id());
+    cursor =
+        flow_graph->AppendTo(cursor, stored_value, NULL, FlowGraph::kValue);
   } else if (array_cid == kTypedDataInt32ArrayCid) {
-    stored_value = new(Z) UnboxInt32Instr(
-        UnboxInt32Instr::kTruncate,
-        new(Z) Value(stored_value),
-        call->deopt_id());
-    cursor = flow_graph->AppendTo(cursor,
-                                  stored_value,
-                                  call->env(),
+    stored_value =
+        new (Z) UnboxInt32Instr(UnboxInt32Instr::kTruncate,
+                                new (Z) Value(stored_value), call->deopt_id());
+    cursor = flow_graph->AppendTo(cursor, stored_value, call->env(),
                                   FlowGraph::kValue);
   } else if (array_cid == kTypedDataUint32ArrayCid) {
-    stored_value = new(Z) UnboxUint32Instr(
-        new(Z) Value(stored_value),
-        call->deopt_id());
+    stored_value =
+        new (Z) UnboxUint32Instr(new (Z) Value(stored_value), call->deopt_id());
     ASSERT(stored_value->AsUnboxInteger()->is_truncating());
-    cursor = flow_graph->AppendTo(cursor,
-                                  stored_value,
-                                  call->env(),
+    cursor = flow_graph->AppendTo(cursor, stored_value, call->env(),
                                   FlowGraph::kValue);
   }
 
   const intptr_t index_scale = Instance::ElementSizeFor(array_cid);
-  *last = new(Z) StoreIndexedInstr(new(Z) Value(array),
-                                   new(Z) Value(index),
-                                   new(Z) Value(stored_value),
-                                   needs_store_barrier,
-                                   index_scale,
-                                   array_cid,
-                                   kAlignedAccess,
-                                   call->deopt_id(),
-                                   call->token_pos());
-  flow_graph->AppendTo(cursor,
-                       *last,
-                       call->env(),
-                       FlowGraph::kEffect);
+  *last = new (Z) StoreIndexedInstr(
+      new (Z) Value(array), new (Z) Value(index), new (Z) Value(stored_value),
+      needs_store_barrier, index_scale, array_cid, kAlignedAccess,
+      call->deopt_id(), call->token_pos());
+  flow_graph->AppendTo(cursor, *last, call->env(), FlowGraph::kEffect);
   return true;
 }
 
@@ -2391,15 +2279,13 @@
   Definition* left = call->ArgumentAt(0);
   Definition* right = call->ArgumentAt(1);
 
-  *entry = new(Z) TargetEntryInstr(flow_graph->allocate_block_id(),
-                                   call->GetBlock()->try_index());
+  *entry = new (Z) TargetEntryInstr(flow_graph->allocate_block_id(),
+                                    call->GetBlock()->try_index());
   (*entry)->InheritDeoptTarget(Z, call);
   // Arguments are checked. No need for class check.
-  BinaryDoubleOpInstr* double_bin_op =
-      new(Z) BinaryDoubleOpInstr(op_kind,
-                                 new(Z) Value(left),
-                                 new(Z) Value(right),
-                                 call->deopt_id(), call->token_pos());
+  BinaryDoubleOpInstr* double_bin_op = new (Z)
+      BinaryDoubleOpInstr(op_kind, new (Z) Value(left), new (Z) Value(right),
+                          call->deopt_id(), call->token_pos());
   flow_graph->AppendTo(*entry, double_bin_op, call->env(), FlowGraph::kValue);
   *last = double_bin_op;
 
@@ -2417,18 +2303,14 @@
   }
   Definition* d = call->ArgumentAt(0);
 
-  *entry = new(Z) TargetEntryInstr(flow_graph->allocate_block_id(),
-                                   call->GetBlock()->try_index());
+  *entry = new (Z) TargetEntryInstr(flow_graph->allocate_block_id(),
+                                    call->GetBlock()->try_index());
   (*entry)->InheritDeoptTarget(Z, call);
   // Arguments are checked. No need for class check.
 
-  DoubleTestOpInstr* double_test_op =
-      new(Z) DoubleTestOpInstr(kind,
-                               new(Z) Value(d),
-                               call->deopt_id(),
-                               call->token_pos());
-  flow_graph->AppendTo(
-      *entry, double_test_op, call->env(), FlowGraph::kValue);
+  DoubleTestOpInstr* double_test_op = new (Z) DoubleTestOpInstr(
+      kind, new (Z) Value(d), call->deopt_id(), call->token_pos());
+  flow_graph->AppendTo(*entry, double_test_op, call->env(), FlowGraph::kValue);
   *last = double_test_op;
 
   return true;
@@ -2442,15 +2324,13 @@
   Definition* left = call->ArgumentAt(0);
   Definition* right = call->ArgumentAt(1);
 
-  *entry = new(Z) TargetEntryInstr(flow_graph->allocate_block_id(),
-                                   call->GetBlock()->try_index());
+  *entry = new (Z) TargetEntryInstr(flow_graph->allocate_block_id(),
+                                    call->GetBlock()->try_index());
   (*entry)->InheritDeoptTarget(Z, call);
   // Right arguments is known to be smi: other._bitAndFromSmi(this);
   BinarySmiOpInstr* smi_op =
-      new(Z) BinarySmiOpInstr(Token::kBIT_AND,
-                              new(Z) Value(left),
-                              new(Z) Value(right),
-                              call->deopt_id());
+      new (Z) BinarySmiOpInstr(Token::kBIT_AND, new (Z) Value(left),
+                               new (Z) Value(right), call->deopt_id());
   flow_graph->AppendTo(*entry, smi_op, call->env(), FlowGraph::kValue);
   *last = smi_op;
 
@@ -2467,16 +2347,13 @@
   Definition* array = call->ArgumentAt(0);
   Definition* value = call->ArgumentAt(1);
 
-  *entry = new(Z) TargetEntryInstr(flow_graph->allocate_block_id(),
-                                   call->GetBlock()->try_index());
+  *entry = new (Z) TargetEntryInstr(flow_graph->allocate_block_id(),
+                                    call->GetBlock()->try_index());
   (*entry)->InheritDeoptTarget(Z, call);
 
   // This is an internal method, no need to check argument types.
-  StoreInstanceFieldInstr* store = new(Z) StoreInstanceFieldInstr(
-      offset,
-      new(Z) Value(array),
-      new(Z) Value(value),
-      store_barrier_type,
+  StoreInstanceFieldInstr* store = new (Z) StoreInstanceFieldInstr(
+      offset, new (Z) Value(array), new (Z) Value(value), store_barrier_type,
       call->token_pos());
   flow_graph->AppendTo(*entry, store, call->env(), FlowGraph::kEffect);
   *last = store;
@@ -2485,37 +2362,28 @@
 }
 
 
-static void PrepareInlineByteArrayBaseOp(
-    FlowGraph* flow_graph,
-    Instruction* call,
-    intptr_t array_cid,
-    intptr_t view_cid,
-    Definition** array,
-    Definition* byte_index,
-    Instruction** cursor) {
-  LoadFieldInstr* length =
-      new(Z) LoadFieldInstr(
-          new(Z) Value(*array),
-          CheckArrayBoundInstr::LengthOffsetFor(array_cid),
-          Type::ZoneHandle(Z, Type::SmiType()),
-          call->token_pos());
+static void PrepareInlineByteArrayBaseOp(FlowGraph* flow_graph,
+                                         Instruction* call,
+                                         intptr_t array_cid,
+                                         intptr_t view_cid,
+                                         Definition** array,
+                                         Definition* byte_index,
+                                         Instruction** cursor) {
+  LoadFieldInstr* length = new (Z) LoadFieldInstr(
+      new (Z) Value(*array), CheckArrayBoundInstr::LengthOffsetFor(array_cid),
+      Type::ZoneHandle(Z, Type::SmiType()), call->token_pos());
   length->set_is_immutable(true);
   length->set_result_cid(kSmiCid);
   length->set_recognized_kind(
       LoadFieldInstr::RecognizedKindFromArrayCid(array_cid));
-  *cursor = flow_graph->AppendTo(*cursor,
-                                 length,
-                                 NULL,
-                                 FlowGraph::kValue);
+  *cursor = flow_graph->AppendTo(*cursor, length, NULL, FlowGraph::kValue);
 
   intptr_t element_size = Instance::ElementSizeFor(array_cid);
   ConstantInstr* bytes_per_element =
       flow_graph->GetConstant(Smi::Handle(Z, Smi::New(element_size)));
-  BinarySmiOpInstr* len_in_bytes =
-      new(Z) BinarySmiOpInstr(Token::kMUL,
-                              new(Z) Value(length),
-                              new(Z) Value(bytes_per_element),
-                              call->deopt_id());
+  BinarySmiOpInstr* len_in_bytes = new (Z)
+      BinarySmiOpInstr(Token::kMUL, new (Z) Value(length),
+                       new (Z) Value(bytes_per_element), call->deopt_id());
   *cursor = flow_graph->AppendTo(*cursor, len_in_bytes, call->env(),
                                  FlowGraph::kValue);
 
@@ -2525,42 +2393,31 @@
   if (adjustment > 0) {
     ConstantInstr* length_adjustment =
         flow_graph->GetConstant(Smi::Handle(Z, Smi::New(adjustment)));
-    adjusted_length =
-        new(Z) BinarySmiOpInstr(Token::kSUB,
-                                new(Z) Value(len_in_bytes),
-                                new(Z) Value(length_adjustment),
-                                call->deopt_id());
+    adjusted_length = new (Z)
+        BinarySmiOpInstr(Token::kSUB, new (Z) Value(len_in_bytes),
+                         new (Z) Value(length_adjustment), call->deopt_id());
     *cursor = flow_graph->AppendTo(*cursor, adjusted_length, call->env(),
                                    FlowGraph::kValue);
   }
 
   // Check adjusted_length > 0.
-  ConstantInstr* zero =
-      flow_graph->GetConstant(Smi::Handle(Z, Smi::New(0)));
-  *cursor = flow_graph->AppendTo(*cursor,
-                                 new(Z) CheckArrayBoundInstr(
-                                     new(Z) Value(adjusted_length),
-                                     new(Z) Value(zero),
-                                     call->deopt_id()),
-                                 call->env(),
-                                 FlowGraph::kEffect);
+  ConstantInstr* zero = flow_graph->GetConstant(Smi::Handle(Z, Smi::New(0)));
+  *cursor = flow_graph->AppendTo(
+      *cursor,
+      new (Z) CheckArrayBoundInstr(new (Z) Value(adjusted_length),
+                                   new (Z) Value(zero), call->deopt_id()),
+      call->env(), FlowGraph::kEffect);
   // Check 0 <= byte_index < adjusted_length.
-  *cursor = flow_graph->AppendTo(*cursor,
-                                 new(Z) CheckArrayBoundInstr(
-                                     new(Z) Value(adjusted_length),
-                                     new(Z) Value(byte_index),
-                                     call->deopt_id()),
-                                 call->env(),
-                                 FlowGraph::kEffect);
+  *cursor = flow_graph->AppendTo(
+      *cursor,
+      new (Z) CheckArrayBoundInstr(new (Z) Value(adjusted_length),
+                                   new (Z) Value(byte_index), call->deopt_id()),
+      call->env(), FlowGraph::kEffect);
 
   if (RawObject::IsExternalTypedDataClassId(array_cid)) {
-    LoadUntaggedInstr* elements =
-        new(Z) LoadUntaggedInstr(new(Z) Value(*array),
-                                 ExternalTypedData::data_offset());
-    *cursor = flow_graph->AppendTo(*cursor,
-                                   elements,
-                                   NULL,
-                                   FlowGraph::kValue);
+    LoadUntaggedInstr* elements = new (Z) LoadUntaggedInstr(
+        new (Z) Value(*array), ExternalTypedData::data_offset());
+    *cursor = flow_graph->AppendTo(*cursor, elements, NULL, FlowGraph::kValue);
     *array = elements;
   }
 }
@@ -2576,18 +2433,13 @@
   ASSERT(array_cid != kIllegalCid);
   Definition* array = receiver;
   Definition* index = call->ArgumentAt(1);
-  *entry = new(Z) TargetEntryInstr(flow_graph->allocate_block_id(),
-                                   call->GetBlock()->try_index());
+  *entry = new (Z) TargetEntryInstr(flow_graph->allocate_block_id(),
+                                    call->GetBlock()->try_index());
   (*entry)->InheritDeoptTarget(Z, call);
   Instruction* cursor = *entry;
 
-  PrepareInlineByteArrayBaseOp(flow_graph,
-                               call,
-                               array_cid,
-                               view_cid,
-                               &array,
-                               index,
-                               &cursor);
+  PrepareInlineByteArrayBaseOp(flow_graph, call, array_cid, view_cid, &array,
+                               index, &cursor);
 
   intptr_t deopt_id = Thread::kNoDeoptId;
   if ((array_cid == kTypedDataInt32ArrayCid) ||
@@ -2596,23 +2448,16 @@
     deopt_id = (kSmiBits >= 32) ? Thread::kNoDeoptId : call->deopt_id();
   }
 
-  *last = new(Z) LoadIndexedInstr(new(Z) Value(array),
-                                  new(Z) Value(index),
-                                  1,
-                                  view_cid,
-                                  kUnalignedAccess,
-                                  deopt_id,
-                                  call->token_pos());
+  *last = new (Z)
+      LoadIndexedInstr(new (Z) Value(array), new (Z) Value(index), 1, view_cid,
+                       kUnalignedAccess, deopt_id, call->token_pos());
   cursor = flow_graph->AppendTo(
-      cursor,
-      *last,
-      deopt_id != Thread::kNoDeoptId ? call->env() : NULL,
+      cursor, *last, deopt_id != Thread::kNoDeoptId ? call->env() : NULL,
       FlowGraph::kValue);
 
   if (view_cid == kTypedDataFloat32ArrayCid) {
-    *last = new(Z) FloatToDoubleInstr(new(Z) Value(*last), deopt_id);
-    flow_graph->AppendTo(cursor,
-                         *last,
+    *last = new (Z) FloatToDoubleInstr(new (Z) Value(*last), deopt_id);
+    flow_graph->AppendTo(cursor, *last,
                          deopt_id != Thread::kNoDeoptId ? call->env() : NULL,
                          FlowGraph::kValue);
   }
@@ -2631,18 +2476,13 @@
   ASSERT(array_cid != kIllegalCid);
   Definition* array = receiver;
   Definition* index = call->ArgumentAt(1);
-  *entry = new(Z) TargetEntryInstr(flow_graph->allocate_block_id(),
-                                   call->GetBlock()->try_index());
+  *entry = new (Z) TargetEntryInstr(flow_graph->allocate_block_id(),
+                                    call->GetBlock()->try_index());
   (*entry)->InheritDeoptTarget(Z, call);
   Instruction* cursor = *entry;
 
-  PrepareInlineByteArrayBaseOp(flow_graph,
-                               call,
-                               array_cid,
-                               view_cid,
-                               &array,
-                               index,
-                               &cursor);
+  PrepareInlineByteArrayBaseOp(flow_graph, call, array_cid, view_cid, &array,
+                               index, &cursor);
 
   // Extract the instance call so we can use the function_name in the stored
   // value check ICData.
@@ -2664,12 +2504,9 @@
     case kTypedDataInt16ArrayCid:
     case kTypedDataUint16ArrayCid: {
       // Check that value is always smi.
-      value_check = ICData::New(flow_graph->function(),
-                                i_call->function_name(),
+      value_check = ICData::New(flow_graph->function(), i_call->function_name(),
                                 Object::empty_array(),  // Dummy args. descr.
-                                Thread::kNoDeoptId,
-                                1,
-                                false);
+                                Thread::kNoDeoptId, 1, false);
       value_check.AddReceiverCheck(kSmiCid, target);
       break;
     }
@@ -2677,46 +2514,35 @@
     case kTypedDataUint32ArrayCid:
       // On 64-bit platforms assume that stored value is always a smi.
       if (kSmiBits >= 32) {
-        value_check = ICData::New(flow_graph->function(),
-                                  i_call->function_name(),
-                                  Object::empty_array(),  // Dummy args. descr.
-                                  Thread::kNoDeoptId,
-                                  1,
-                                  false);
+        value_check =
+            ICData::New(flow_graph->function(), i_call->function_name(),
+                        Object::empty_array(),  // Dummy args. descr.
+                        Thread::kNoDeoptId, 1, false);
         value_check.AddReceiverCheck(kSmiCid, target);
       }
       break;
     case kTypedDataFloat32ArrayCid:
     case kTypedDataFloat64ArrayCid: {
       // Check that value is always double.
-      value_check = ICData::New(flow_graph->function(),
-                                i_call->function_name(),
+      value_check = ICData::New(flow_graph->function(), i_call->function_name(),
                                 Object::empty_array(),  // Dummy args. descr.
-                                Thread::kNoDeoptId,
-                                1,
-                                false);
+                                Thread::kNoDeoptId, 1, false);
       value_check.AddReceiverCheck(kDoubleCid, target);
       break;
     }
     case kTypedDataInt32x4ArrayCid: {
       // Check that value is always Int32x4.
-      value_check = ICData::New(flow_graph->function(),
-                                i_call->function_name(),
+      value_check = ICData::New(flow_graph->function(), i_call->function_name(),
                                 Object::empty_array(),  // Dummy args. descr.
-                                Thread::kNoDeoptId,
-                                1,
-                                false);
+                                Thread::kNoDeoptId, 1, false);
       value_check.AddReceiverCheck(kInt32x4Cid, target);
       break;
     }
     case kTypedDataFloat32x4ArrayCid: {
       // Check that value is always Float32x4.
-      value_check = ICData::New(flow_graph->function(),
-                                i_call->function_name(),
+      value_check = ICData::New(flow_graph->function(), i_call->function_name(),
                                 Object::empty_array(),  // Dummy args. descr.
-                                Thread::kNoDeoptId,
-                                1,
-                                false);
+                                Thread::kNoDeoptId, 1, false);
       value_check.AddReceiverCheck(kFloat32x4Cid, target);
       break;
     }
@@ -2727,95 +2553,71 @@
 
   Definition* stored_value = call->ArgumentAt(2);
   if (!value_check.IsNull()) {
-    Instruction* check = GetCheckClass(flow_graph,
-                                       stored_value,
-                                       value_check,
-                                       call->deopt_id(),
-                                       call->token_pos());
-    cursor = flow_graph->AppendTo(cursor,
-                                  check,
-                                  call->env(),
-                                  FlowGraph::kEffect);
+    Instruction* check = GetCheckClass(flow_graph, stored_value, value_check,
+                                       call->deopt_id(), call->token_pos());
+    cursor =
+        flow_graph->AppendTo(cursor, check, call->env(), FlowGraph::kEffect);
   }
 
   if (view_cid == kTypedDataFloat32ArrayCid) {
-    stored_value = new(Z) DoubleToFloatInstr(
-        new(Z) Value(stored_value), call->deopt_id());
-    cursor = flow_graph->AppendTo(cursor,
-                                  stored_value,
-                                  NULL,
-                                  FlowGraph::kValue);
+    stored_value = new (Z)
+        DoubleToFloatInstr(new (Z) Value(stored_value), call->deopt_id());
+    cursor =
+        flow_graph->AppendTo(cursor, stored_value, NULL, FlowGraph::kValue);
   } else if (view_cid == kTypedDataInt32ArrayCid) {
-    stored_value = new(Z) UnboxInt32Instr(
-        UnboxInt32Instr::kTruncate,
-        new(Z) Value(stored_value),
-        call->deopt_id());
-    cursor = flow_graph->AppendTo(cursor,
-                                  stored_value,
-                                  call->env(),
+    stored_value =
+        new (Z) UnboxInt32Instr(UnboxInt32Instr::kTruncate,
+                                new (Z) Value(stored_value), call->deopt_id());
+    cursor = flow_graph->AppendTo(cursor, stored_value, call->env(),
                                   FlowGraph::kValue);
   } else if (view_cid == kTypedDataUint32ArrayCid) {
-    stored_value = new(Z) UnboxUint32Instr(
-        new(Z) Value(stored_value),
-        call->deopt_id());
+    stored_value =
+        new (Z) UnboxUint32Instr(new (Z) Value(stored_value), call->deopt_id());
     ASSERT(stored_value->AsUnboxInteger()->is_truncating());
-    cursor = flow_graph->AppendTo(cursor,
-                                  stored_value,
-                                  call->env(),
+    cursor = flow_graph->AppendTo(cursor, stored_value, call->env(),
                                   FlowGraph::kValue);
   }
 
   StoreBarrierType needs_store_barrier = kNoStoreBarrier;
-  *last = new(Z) StoreIndexedInstr(new(Z) Value(array),
-                                   new(Z) Value(index),
-                                   new(Z) Value(stored_value),
-                                   needs_store_barrier,
-                                   1,  // Index scale
-                                   view_cid,
-                                   kUnalignedAccess,
-                                   call->deopt_id(),
-                                   call->token_pos());
+  *last = new (Z) StoreIndexedInstr(
+      new (Z) Value(array), new (Z) Value(index), new (Z) Value(stored_value),
+      needs_store_barrier,
+      1,  // Index scale
+      view_cid, kUnalignedAccess, call->deopt_id(), call->token_pos());
 
-  flow_graph->AppendTo(cursor,
-                       *last,
-                       call->deopt_id() != Thread::kNoDeoptId ?
-                          call->env() : NULL,
-                       FlowGraph::kEffect);
+  flow_graph->AppendTo(
+      cursor, *last,
+      call->deopt_id() != Thread::kNoDeoptId ? call->env() : NULL,
+      FlowGraph::kEffect);
   return true;
 }
 
 
-
 // Returns the LoadIndexedInstr.
-static Definition* PrepareInlineStringIndexOp(
-    FlowGraph* flow_graph,
-    Instruction* call,
-    intptr_t cid,
-    Definition* str,
-    Definition* index,
-    Instruction* cursor) {
+static Definition* PrepareInlineStringIndexOp(FlowGraph* flow_graph,
+                                              Instruction* call,
+                                              intptr_t cid,
+                                              Definition* str,
+                                              Definition* index,
+                                              Instruction* cursor) {
   // Load the length of the string.
   // Treat length loads as mutable (i.e. affected by side effects) to avoid
   // hoisting them since we can't hoist the preceding class-check. This
   // is because of externalization of strings that affects their class-id.
-  LoadFieldInstr* length = new(Z) LoadFieldInstr(
-      new(Z) Value(str),
-      String::length_offset(),
-      Type::ZoneHandle(Z, Type::SmiType()),
-      str->token_pos());
+  LoadFieldInstr* length = new (Z)
+      LoadFieldInstr(new (Z) Value(str), String::length_offset(),
+                     Type::ZoneHandle(Z, Type::SmiType()), str->token_pos());
   length->set_result_cid(kSmiCid);
   length->set_is_immutable(!FLAG_support_externalizable_strings);
   length->set_recognized_kind(MethodRecognizer::kStringBaseLength);
 
   cursor = flow_graph->AppendTo(cursor, length, NULL, FlowGraph::kValue);
   // Bounds check.
-  cursor = flow_graph->AppendTo(cursor,
-                                new(Z) CheckArrayBoundInstr(
-                                    new(Z) Value(length),
-                                    new(Z) Value(index),
-                                    call->deopt_id()),
-                                call->env(),
-                                FlowGraph::kEffect);
+  cursor = flow_graph->AppendTo(
+      cursor,
+      new (Z) CheckArrayBoundInstr(new (Z) Value(length), new (Z) Value(index),
+                                   call->deopt_id()),
+      call->env(), FlowGraph::kEffect);
 
   // For external strings: Load backing store.
   if (cid == kExternalOneByteStringCid) {
@@ -2823,27 +2625,20 @@
                                 ExternalOneByteString::external_data_offset());
     cursor = flow_graph->AppendTo(cursor, str, NULL, FlowGraph::kValue);
     str = new LoadUntaggedInstr(
-        new Value(str),
-        RawExternalOneByteString::ExternalData::data_offset());
+        new Value(str), RawExternalOneByteString::ExternalData::data_offset());
     cursor = flow_graph->AppendTo(cursor, str, NULL, FlowGraph::kValue);
   } else if (cid == kExternalTwoByteStringCid) {
     str = new LoadUntaggedInstr(new Value(str),
                                 ExternalTwoByteString::external_data_offset());
     cursor = flow_graph->AppendTo(cursor, str, NULL, FlowGraph::kValue);
     str = new LoadUntaggedInstr(
-        new Value(str),
-        RawExternalTwoByteString::ExternalData::data_offset());
+        new Value(str), RawExternalTwoByteString::ExternalData::data_offset());
     cursor = flow_graph->AppendTo(cursor, str, NULL, FlowGraph::kValue);
   }
 
-  LoadIndexedInstr* load_indexed = new(Z) LoadIndexedInstr(
-      new(Z) Value(str),
-      new(Z) Value(index),
-      Instance::ElementSizeFor(cid),
-      cid,
-      kAlignedAccess,
-      Thread::kNoDeoptId,
-      call->token_pos());
+  LoadIndexedInstr* load_indexed = new (Z) LoadIndexedInstr(
+      new (Z) Value(str), new (Z) Value(index), Instance::ElementSizeFor(cid),
+      cid, kAlignedAccess, Thread::kNoDeoptId, call->token_pos());
 
   cursor = flow_graph->AppendTo(cursor, load_indexed, NULL, FlowGraph::kValue);
   ASSERT(cursor == load_indexed);
@@ -2851,26 +2646,25 @@
 }
 
 
-static bool InlineStringBaseCharAt(
-    FlowGraph* flow_graph,
-    Instruction* call,
-    intptr_t cid,
-    TargetEntryInstr** entry,
-    Definition** last) {
+static bool InlineStringBaseCharAt(FlowGraph* flow_graph,
+                                   Instruction* call,
+                                   intptr_t cid,
+                                   TargetEntryInstr** entry,
+                                   Definition** last) {
   if ((cid != kOneByteStringCid) && (cid != kExternalOneByteStringCid)) {
     return false;
   }
   Definition* str = call->ArgumentAt(0);
   Definition* index = call->ArgumentAt(1);
 
-  *entry = new(Z) TargetEntryInstr(flow_graph->allocate_block_id(),
-                                   call->GetBlock()->try_index());
+  *entry = new (Z) TargetEntryInstr(flow_graph->allocate_block_id(),
+                                    call->GetBlock()->try_index());
   (*entry)->InheritDeoptTarget(Z, call);
 
   *last = PrepareInlineStringIndexOp(flow_graph, call, cid, str, index, *entry);
 
   OneByteStringFromCharCodeInstr* char_at =
-      new(Z) OneByteStringFromCharCodeInstr(new(Z) Value(*last));
+      new (Z) OneByteStringFromCharCodeInstr(new (Z) Value(*last));
 
   flow_graph->AppendTo(*last, char_at, NULL, FlowGraph::kValue);
   *last = char_at;
@@ -2879,21 +2673,19 @@
 }
 
 
-static bool InlineStringCodeUnitAt(
-    FlowGraph* flow_graph,
-    Instruction* call,
-    intptr_t cid,
-    TargetEntryInstr** entry,
-    Definition** last) {
-  ASSERT((cid == kOneByteStringCid) ||
-         (cid == kTwoByteStringCid) ||
+static bool InlineStringCodeUnitAt(FlowGraph* flow_graph,
+                                   Instruction* call,
+                                   intptr_t cid,
+                                   TargetEntryInstr** entry,
+                                   Definition** last) {
+  ASSERT((cid == kOneByteStringCid) || (cid == kTwoByteStringCid) ||
          (cid == kExternalOneByteStringCid) ||
          (cid == kExternalTwoByteStringCid));
   Definition* str = call->ArgumentAt(0);
   Definition* index = call->ArgumentAt(1);
 
-  *entry = new(Z) TargetEntryInstr(flow_graph->allocate_block_id(),
-                                   call->GetBlock()->try_index());
+  *entry = new (Z) TargetEntryInstr(flow_graph->allocate_block_id(),
+                                    call->GetBlock()->try_index());
   (*entry)->InheritDeoptTarget(Z, call);
 
   *last = PrepareInlineStringIndexOp(flow_graph, call, cid, str, index, *entry);
@@ -2913,23 +2705,16 @@
 
   TargetEntryInstr* entry;
   Definition* last;
-  if (FlowGraphInliner::TryInlineRecognizedMethod(flow_graph,
-                                                  receiver_cid,
-                                                  target,
-                                                  call,
-                                                  call->ArgumentAt(0),
-                                                  call->token_pos(),
-                                                  *call->ic_data(),
-                                                  &entry, &last)) {
+  if (FlowGraphInliner::TryInlineRecognizedMethod(
+          flow_graph, receiver_cid, target, call, call->ArgumentAt(0),
+          call->token_pos(), *call->ic_data(), &entry, &last)) {
     // Insert receiver class check if needed.
     if (MethodRecognizer::PolymorphicTarget(target) ||
         flow_graph->InstanceCallNeedsClassCheck(call, target.kind())) {
       Instruction* check = GetCheckClass(
-          flow_graph,
-          call->ArgumentAt(0),
+          flow_graph, call->ArgumentAt(0),
           ICData::ZoneHandle(Z, call->ic_data()->AsUnaryClassChecks()),
-          call->deopt_id(),
-          call->token_pos());
+          call->deopt_id(), call->token_pos());
       flow_graph->InsertBefore(call, check, call->env(), FlowGraph::kEffect);
     }
 
@@ -2969,14 +2754,9 @@
     StaticCallInstr* call) {
   TargetEntryInstr* entry;
   Definition* last;
-  if (FlowGraphInliner::TryInlineRecognizedMethod(flow_graph,
-                                                  kIllegalCid,
-                                                  call->function(),
-                                                  call,
-                                                  call->ArgumentAt(0),
-                                                  call->token_pos(),
-                                                  *call->ic_data(),
-                                                  &entry, &last)) {
+  if (FlowGraphInliner::TryInlineRecognizedMethod(
+          flow_graph, kIllegalCid, call->function(), call, call->ArgumentAt(0),
+          call->token_pos(), *call->ic_data(), &entry, &last)) {
     // Remove the original push arguments.
     for (intptr_t i = 0; i < call->ArgumentCount(); ++i) {
       PushArgumentInstr* push = call->PushArgumentAt(i);
@@ -3015,8 +2795,8 @@
   if (!ShouldInlineSimd()) {
     return false;
   }
-  *entry = new(Z) TargetEntryInstr(flow_graph->allocate_block_id(),
-                                   call->GetBlock()->try_index());
+  *entry = new (Z) TargetEntryInstr(flow_graph->allocate_block_id(),
+                                    call->GetBlock()->try_index());
   (*entry)->InheritDeoptTarget(Z, call);
   Instruction* cursor = *entry;
   switch (kind) {
@@ -3024,16 +2804,15 @@
     case MethodRecognizer::kFloat32x4ShuffleY:
     case MethodRecognizer::kFloat32x4ShuffleZ:
     case MethodRecognizer::kFloat32x4ShuffleW: {
-      *last = new(Z) Simd32x4ShuffleInstr(kind,
-                                          new(Z) Value(call->ArgumentAt(0)),
-                                          0,  // mask ignored.
-                                          call->deopt_id());
+      *last =
+          new (Z) Simd32x4ShuffleInstr(kind, new (Z) Value(call->ArgumentAt(0)),
+                                       0,  // mask ignored.
+                                       call->deopt_id());
       break;
     }
     case MethodRecognizer::kFloat32x4GetSignMask: {
-      *last = new(Z) Simd32x4GetSignMaskInstr(kind,
-                                              new(Z) Value(call->ArgumentAt(0)),
-                                              call->deopt_id());
+      *last = new (Z) Simd32x4GetSignMaskInstr(
+          kind, new (Z) Value(call->ArgumentAt(0)), call->deopt_id());
       break;
     }
     case MethodRecognizer::kFloat32x4Equal:
@@ -3044,20 +2823,16 @@
     case MethodRecognizer::kFloat32x4NotEqual: {
       Definition* left = call->ArgumentAt(0);
       Definition* right = call->ArgumentAt(1);
-      *last = new(Z) Float32x4ComparisonInstr(kind,
-                                              new(Z) Value(left),
-                                              new(Z) Value(right),
-                                              call->deopt_id());
+      *last = new (Z) Float32x4ComparisonInstr(
+          kind, new (Z) Value(left), new (Z) Value(right), call->deopt_id());
       break;
     }
     case MethodRecognizer::kFloat32x4Min:
     case MethodRecognizer::kFloat32x4Max: {
       Definition* left = call->ArgumentAt(0);
       Definition* right = call->ArgumentAt(1);
-      *last = new(Z) Float32x4MinMaxInstr(kind,
-                                          new(Z) Value(left),
-                                          new(Z) Value(right),
-                                          call->deopt_id());
+      *last = new (Z) Float32x4MinMaxInstr(
+          kind, new (Z) Value(left), new (Z) Value(right), call->deopt_id());
       break;
     }
     case MethodRecognizer::kFloat32x4Scale: {
@@ -3066,19 +2841,16 @@
       // Left and right values are swapped when handed to the instruction,
       // this is done so that the double value is loaded into the output
       // register and can be destroyed.
-      *last = new(Z) Float32x4ScaleInstr(kind,
-                                         new(Z) Value(right),
-                                         new(Z) Value(left),
-                                         call->deopt_id());
+      *last = new (Z) Float32x4ScaleInstr(
+          kind, new (Z) Value(right), new (Z) Value(left), call->deopt_id());
       break;
     }
     case MethodRecognizer::kFloat32x4Sqrt:
     case MethodRecognizer::kFloat32x4ReciprocalSqrt:
     case MethodRecognizer::kFloat32x4Reciprocal: {
       Definition* left = call->ArgumentAt(0);
-      *last = new(Z) Float32x4SqrtInstr(kind,
-                                        new(Z) Value(left),
-                                        call->deopt_id());
+      *last = new (Z)
+          Float32x4SqrtInstr(kind, new (Z) Value(left), call->deopt_id());
       break;
     }
     case MethodRecognizer::kFloat32x4WithX:
@@ -3087,39 +2859,34 @@
     case MethodRecognizer::kFloat32x4WithW: {
       Definition* left = call->ArgumentAt(0);
       Definition* right = call->ArgumentAt(1);
-      *last = new(Z) Float32x4WithInstr(kind,
-                                        new(Z) Value(left),
-                                        new(Z) Value(right),
-                                        call->deopt_id());
+      *last = new (Z) Float32x4WithInstr(
+          kind, new (Z) Value(left), new (Z) Value(right), call->deopt_id());
       break;
     }
     case MethodRecognizer::kFloat32x4Absolute:
     case MethodRecognizer::kFloat32x4Negate: {
       Definition* left = call->ArgumentAt(0);
-      *last = new(Z) Float32x4ZeroArgInstr(kind,
-                                           new(Z) Value(left),
-                                           call->deopt_id());
+      *last = new (Z)
+          Float32x4ZeroArgInstr(kind, new (Z) Value(left), call->deopt_id());
       break;
     }
     case MethodRecognizer::kFloat32x4Clamp: {
       Definition* left = call->ArgumentAt(0);
       Definition* lower = call->ArgumentAt(1);
       Definition* upper = call->ArgumentAt(2);
-      *last = new(Z) Float32x4ClampInstr(
-          new(Z) Value(left),
-          new(Z) Value(lower),
-          new(Z) Value(upper),
-          call->deopt_id());
+      *last =
+          new (Z) Float32x4ClampInstr(new (Z) Value(left), new (Z) Value(lower),
+                                      new (Z) Value(upper), call->deopt_id());
       break;
     }
     default:
       UNREACHABLE();
       return false;
   }
-  flow_graph->AppendTo(cursor, *last,
-                       call->deopt_id() != Thread::kNoDeoptId ?
-                       call->env() : NULL,
-                       FlowGraph::kValue);
+  flow_graph->AppendTo(
+      cursor, *last,
+      call->deopt_id() != Thread::kNoDeoptId ? call->env() : NULL,
+      FlowGraph::kValue);
   return true;
 }
 
@@ -3146,8 +2913,8 @@
   if (!ShouldInlineSimd()) {
     return false;
   }
-  *entry = new(Z) TargetEntryInstr(flow_graph->allocate_block_id(),
-                                   call->GetBlock()->try_index());
+  *entry = new (Z) TargetEntryInstr(flow_graph->allocate_block_id(),
+                                    call->GetBlock()->try_index());
   (*entry)->InheritDeoptTarget(Z, call);
   Instruction* cursor = *entry;
   Definition* mask_definition = call->ArgumentAt(1);
@@ -3155,15 +2922,12 @@
   if (!CheckMask(mask_definition, &mask)) {
     return false;
   }
-  *last = new(Z) Simd32x4ShuffleInstr(
-      kind,
-      new(Z) Value(call->ArgumentAt(0)),
-      mask,
-      call->deopt_id());
-  flow_graph->AppendTo(cursor, *last,
-                       call->deopt_id() != Thread::kNoDeoptId ?
-                       call->env() : NULL,
-                       FlowGraph::kValue);
+  *last = new (Z) Simd32x4ShuffleInstr(kind, new (Z) Value(call->ArgumentAt(0)),
+                                       mask, call->deopt_id());
+  flow_graph->AppendTo(
+      cursor, *last,
+      call->deopt_id() != Thread::kNoDeoptId ? call->env() : NULL,
+      FlowGraph::kValue);
   return true;
 }
 
@@ -3176,8 +2940,8 @@
   if (!ShouldInlineSimd()) {
     return false;
   }
-  *entry = new(Z) TargetEntryInstr(flow_graph->allocate_block_id(),
-                                   call->GetBlock()->try_index());
+  *entry = new (Z) TargetEntryInstr(flow_graph->allocate_block_id(),
+                                    call->GetBlock()->try_index());
   (*entry)->InheritDeoptTarget(Z, call);
   Instruction* cursor = *entry;
   Definition* mask_definition = call->ArgumentAt(2);
@@ -3185,21 +2949,17 @@
   if (!CheckMask(mask_definition, &mask)) {
     return false;
   }
-  *last = new(Z) Simd32x4ShuffleMixInstr(
-      kind,
-      new(Z) Value(call->ArgumentAt(0)),
-      new(Z) Value(call->ArgumentAt(1)),
-      mask,
-      call->deopt_id());
-  flow_graph->AppendTo(cursor, *last,
-                       call->deopt_id() != Thread::kNoDeoptId ?
-                       call->env() : NULL,
-                       FlowGraph::kValue);
+  *last = new (Z) Simd32x4ShuffleMixInstr(
+      kind, new (Z) Value(call->ArgumentAt(0)),
+      new (Z) Value(call->ArgumentAt(1)), mask, call->deopt_id());
+  flow_graph->AppendTo(
+      cursor, *last,
+      call->deopt_id() != Thread::kNoDeoptId ? call->env() : NULL,
+      FlowGraph::kValue);
   return true;
 }
 
 
-
 static bool InlineInt32x4Method(FlowGraph* flow_graph,
                                 Instruction* call,
                                 MethodRecognizer::Kind kind,
@@ -3208,8 +2968,8 @@
   if (!ShouldInlineSimd()) {
     return false;
   }
-  *entry = new(Z) TargetEntryInstr(flow_graph->allocate_block_id(),
-                                   call->GetBlock()->try_index());
+  *entry = new (Z) TargetEntryInstr(flow_graph->allocate_block_id(),
+                                    call->GetBlock()->try_index());
   (*entry)->InheritDeoptTarget(Z, call);
   Instruction* cursor = *entry;
   switch (kind) {
@@ -3217,48 +2977,40 @@
     case MethodRecognizer::kInt32x4GetFlagY:
     case MethodRecognizer::kInt32x4GetFlagZ:
     case MethodRecognizer::kInt32x4GetFlagW: {
-      *last = new(Z) Int32x4GetFlagInstr(
-          kind,
-          new(Z) Value(call->ArgumentAt(0)),
-          call->deopt_id());
+      *last = new (Z) Int32x4GetFlagInstr(
+          kind, new (Z) Value(call->ArgumentAt(0)), call->deopt_id());
       break;
     }
     case MethodRecognizer::kInt32x4GetSignMask: {
-      *last = new(Z) Simd32x4GetSignMaskInstr(
-          kind,
-          new(Z) Value(call->ArgumentAt(0)),
-          call->deopt_id());
+      *last = new (Z) Simd32x4GetSignMaskInstr(
+          kind, new (Z) Value(call->ArgumentAt(0)), call->deopt_id());
       break;
     }
     case MethodRecognizer::kInt32x4Select: {
       Definition* mask = call->ArgumentAt(0);
       Definition* trueValue = call->ArgumentAt(1);
       Definition* falseValue = call->ArgumentAt(2);
-      *last = new(Z) Int32x4SelectInstr(
-          new(Z) Value(mask),
-          new(Z) Value(trueValue),
-          new(Z) Value(falseValue),
-          call->deopt_id());
+      *last = new (Z)
+          Int32x4SelectInstr(new (Z) Value(mask), new (Z) Value(trueValue),
+                             new (Z) Value(falseValue), call->deopt_id());
       break;
     }
     case MethodRecognizer::kInt32x4WithFlagX:
     case MethodRecognizer::kInt32x4WithFlagY:
     case MethodRecognizer::kInt32x4WithFlagZ:
     case MethodRecognizer::kInt32x4WithFlagW: {
-      *last = new(Z) Int32x4SetFlagInstr(
-          kind,
-          new(Z) Value(call->ArgumentAt(0)),
-          new(Z) Value(call->ArgumentAt(1)),
-          call->deopt_id());
+      *last = new (Z) Int32x4SetFlagInstr(
+          kind, new (Z) Value(call->ArgumentAt(0)),
+          new (Z) Value(call->ArgumentAt(1)), call->deopt_id());
       break;
     }
     default:
       return false;
   }
-  flow_graph->AppendTo(cursor, *last,
-                       call->deopt_id() != Thread::kNoDeoptId ?
-                       call->env() : NULL,
-                       FlowGraph::kValue);
+  flow_graph->AppendTo(
+      cursor, *last,
+      call->deopt_id() != Thread::kNoDeoptId ? call->env() : NULL,
+      FlowGraph::kValue);
   return true;
 }
 
@@ -3271,26 +3023,25 @@
   if (!ShouldInlineSimd()) {
     return false;
   }
-  *entry = new(Z) TargetEntryInstr(flow_graph->allocate_block_id(),
-                                   call->GetBlock()->try_index());
+  *entry = new (Z) TargetEntryInstr(flow_graph->allocate_block_id(),
+                                    call->GetBlock()->try_index());
   (*entry)->InheritDeoptTarget(Z, call);
   Instruction* cursor = *entry;
   switch (kind) {
     case MethodRecognizer::kFloat64x2GetX:
     case MethodRecognizer::kFloat64x2GetY: {
-      *last = new(Z) Simd64x2ShuffleInstr(
-          kind,
-          new(Z) Value(call->ArgumentAt(0)),
-          0,  // mask is ignored.
-          call->deopt_id());
+      *last =
+          new (Z) Simd64x2ShuffleInstr(kind, new (Z) Value(call->ArgumentAt(0)),
+                                       0,  // mask is ignored.
+                                       call->deopt_id());
       break;
     }
     case MethodRecognizer::kFloat64x2Negate:
     case MethodRecognizer::kFloat64x2Abs:
     case MethodRecognizer::kFloat64x2Sqrt:
     case MethodRecognizer::kFloat64x2GetSignMask: {
-      *last = new(Z) Float64x2ZeroArgInstr(
-          kind, new(Z) Value(call->ArgumentAt(0)), call->deopt_id());
+      *last = new (Z) Float64x2ZeroArgInstr(
+          kind, new (Z) Value(call->ArgumentAt(0)), call->deopt_id());
       break;
     }
     case MethodRecognizer::kFloat64x2Scale:
@@ -3300,20 +3051,18 @@
     case MethodRecognizer::kFloat64x2Max: {
       Definition* left = call->ArgumentAt(0);
       Definition* right = call->ArgumentAt(1);
-      *last = new(Z) Float64x2OneArgInstr(kind,
-                                          new(Z) Value(left),
-                                          new(Z) Value(right),
-                                          call->deopt_id());
+      *last = new (Z) Float64x2OneArgInstr(
+          kind, new (Z) Value(left), new (Z) Value(right), call->deopt_id());
       break;
     }
     default:
       UNREACHABLE();
       return false;
   }
-  flow_graph->AppendTo(cursor, *last,
-                       call->deopt_id() != Thread::kNoDeoptId ?
-                       call->env() : NULL,
-                       FlowGraph::kValue);
+  flow_graph->AppendTo(
+      cursor, *last,
+      call->deopt_id() != Thread::kNoDeoptId ? call->env() : NULL,
+      FlowGraph::kValue);
   return true;
 }
 
@@ -3326,81 +3075,75 @@
   if (!ShouldInlineSimd()) {
     return false;
   }
-  *entry = new(Z) TargetEntryInstr(flow_graph->allocate_block_id(),
-                                   call->GetBlock()->try_index());
+  *entry = new (Z) TargetEntryInstr(flow_graph->allocate_block_id(),
+                                    call->GetBlock()->try_index());
   (*entry)->InheritDeoptTarget(Z, call);
   Instruction* cursor = *entry;
   switch (kind) {
     case MethodRecognizer::kFloat32x4Zero:
-      *last = new(Z) Float32x4ZeroInstr();
+      *last = new (Z) Float32x4ZeroInstr();
       break;
     case MethodRecognizer::kFloat32x4Splat:
-      *last = new(Z) Float32x4SplatInstr(new(Z) Value(call->ArgumentAt(1)),
-                                         call->deopt_id());
+      *last = new (Z) Float32x4SplatInstr(new (Z) Value(call->ArgumentAt(1)),
+                                          call->deopt_id());
       break;
     case MethodRecognizer::kFloat32x4Constructor:
-      *last = new(Z) Float32x4ConstructorInstr(
-          new(Z) Value(call->ArgumentAt(1)),
-          new(Z) Value(call->ArgumentAt(2)),
-          new(Z) Value(call->ArgumentAt(3)),
-          new(Z) Value(call->ArgumentAt(4)),
-          call->deopt_id());
+      *last = new (Z) Float32x4ConstructorInstr(
+          new (Z) Value(call->ArgumentAt(1)),
+          new (Z) Value(call->ArgumentAt(2)),
+          new (Z) Value(call->ArgumentAt(3)),
+          new (Z) Value(call->ArgumentAt(4)), call->deopt_id());
       break;
     case MethodRecognizer::kFloat32x4FromInt32x4Bits:
-      *last = new(Z) Int32x4ToFloat32x4Instr(new(Z) Value(call->ArgumentAt(1)),
-                                             call->deopt_id());
+      *last = new (Z) Int32x4ToFloat32x4Instr(
+          new (Z) Value(call->ArgumentAt(1)), call->deopt_id());
       break;
-    case  MethodRecognizer::kFloat32x4FromFloat64x2:
-      *last = new(Z) Float64x2ToFloat32x4Instr(
-          new(Z) Value(call->ArgumentAt(1)),
-          call->deopt_id());
+    case MethodRecognizer::kFloat32x4FromFloat64x2:
+      *last = new (Z) Float64x2ToFloat32x4Instr(
+          new (Z) Value(call->ArgumentAt(1)), call->deopt_id());
       break;
     case MethodRecognizer::kFloat64x2Zero:
-      *last = new(Z) Float64x2ZeroInstr();
+      *last = new (Z) Float64x2ZeroInstr();
       break;
     case MethodRecognizer::kFloat64x2Splat:
-      *last = new(Z) Float64x2SplatInstr(new(Z) Value(call->ArgumentAt(1)),
-                                         call->deopt_id());
+      *last = new (Z) Float64x2SplatInstr(new (Z) Value(call->ArgumentAt(1)),
+                                          call->deopt_id());
       break;
     case MethodRecognizer::kFloat64x2Constructor:
-      *last = new(Z) Float64x2ConstructorInstr(
-          new(Z) Value(call->ArgumentAt(1)),
-          new(Z) Value(call->ArgumentAt(2)),
-          call->deopt_id());
+      *last = new (Z) Float64x2ConstructorInstr(
+          new (Z) Value(call->ArgumentAt(1)),
+          new (Z) Value(call->ArgumentAt(2)), call->deopt_id());
       break;
     case MethodRecognizer::kFloat64x2FromFloat32x4:
-      *last = new(Z) Float32x4ToFloat64x2Instr(
-          new(Z) Value(call->ArgumentAt(1)),
-          call->deopt_id());
+      *last = new (Z) Float32x4ToFloat64x2Instr(
+          new (Z) Value(call->ArgumentAt(1)), call->deopt_id());
       break;
     case MethodRecognizer::kInt32x4BoolConstructor:
-      *last = new(Z) Int32x4BoolConstructorInstr(
-          new(Z) Value(call->ArgumentAt(1)),
-          new(Z) Value(call->ArgumentAt(2)),
-          new(Z) Value(call->ArgumentAt(3)),
-          new(Z) Value(call->ArgumentAt(4)),
-          call->deopt_id());
+      *last = new (Z) Int32x4BoolConstructorInstr(
+          new (Z) Value(call->ArgumentAt(1)),
+          new (Z) Value(call->ArgumentAt(2)),
+          new (Z) Value(call->ArgumentAt(3)),
+          new (Z) Value(call->ArgumentAt(4)), call->deopt_id());
       break;
     case MethodRecognizer::kInt32x4Constructor:
-      *last = new(Z) Int32x4ConstructorInstr(
-          new(Z) Value(call->ArgumentAt(1)),
-          new(Z) Value(call->ArgumentAt(2)),
-          new(Z) Value(call->ArgumentAt(3)),
-          new(Z) Value(call->ArgumentAt(4)),
-          call->deopt_id());
+      *last = new (Z) Int32x4ConstructorInstr(
+          new (Z) Value(call->ArgumentAt(1)),
+          new (Z) Value(call->ArgumentAt(2)),
+          new (Z) Value(call->ArgumentAt(3)),
+          new (Z) Value(call->ArgumentAt(4)), call->deopt_id());
       break;
     case MethodRecognizer::kInt32x4FromFloat32x4Bits:
-      *last = new(Z) Float32x4ToInt32x4Instr(new(Z) Value(call->ArgumentAt(1)),
-                                             call->deopt_id());
+      *last = new (Z) Float32x4ToInt32x4Instr(
+          new (Z) Value(call->ArgumentAt(1)), call->deopt_id());
       break;
     default:
       UNREACHABLE();
       return false;
   }
-  flow_graph->AppendTo(cursor, *last,
-                       call->deopt_id() != Thread::kNoDeoptId ?
-                       call->env() : NULL,
-                       FlowGraph::kValue);
+  flow_graph->AppendTo(
+      cursor, *last,
+      call->deopt_id() != Thread::kNoDeoptId ? call->env() : NULL,
+      FlowGraph::kValue);
   return true;
 }
 
@@ -3413,35 +3156,33 @@
   if (!CanUnboxDouble()) {
     return false;
   }
-  *entry = new(Z) TargetEntryInstr(flow_graph->allocate_block_id(),
-                                   call->GetBlock()->try_index());
+  *entry = new (Z) TargetEntryInstr(flow_graph->allocate_block_id(),
+                                    call->GetBlock()->try_index());
   (*entry)->InheritDeoptTarget(Z, call);
   Instruction* cursor = *entry;
 
   switch (kind) {
     case MethodRecognizer::kMathSqrt: {
-      *last = new(Z) MathUnaryInstr(MathUnaryInstr::kSqrt,
-                                    new(Z) Value(call->ArgumentAt(0)),
-                                    call->deopt_id());
+      *last = new (Z)
+          MathUnaryInstr(MathUnaryInstr::kSqrt,
+                         new (Z) Value(call->ArgumentAt(0)), call->deopt_id());
       break;
     }
     default: {
       ZoneGrowableArray<Value*>* args =
-          new(Z) ZoneGrowableArray<Value*>(call->ArgumentCount());
+          new (Z) ZoneGrowableArray<Value*>(call->ArgumentCount());
       for (intptr_t i = 0; i < call->ArgumentCount(); i++) {
-        args->Add(new(Z) Value(call->ArgumentAt(i)));
+        args->Add(new (Z) Value(call->ArgumentAt(i)));
       }
-      *last = new(Z) InvokeMathCFunctionInstr(args,
-                                              call->deopt_id(),
-                                              kind,
-                                              call->token_pos());
+      *last = new (Z) InvokeMathCFunctionInstr(args, call->deopt_id(), kind,
+                                               call->token_pos());
       break;
     }
   }
-  flow_graph->AppendTo(cursor, *last,
-                       call->deopt_id() != Thread::kNoDeoptId ?
-                       call->env() : NULL,
-                       FlowGraph::kValue);
+  flow_graph->AppendTo(
+      cursor, *last,
+      call->deopt_id() != Thread::kNoDeoptId ? call->env() : NULL,
+      FlowGraph::kValue);
   return true;
 }
 
@@ -3551,132 +3292,113 @@
                               token_pos, value_check, entry, last);
     case MethodRecognizer::kByteArrayBaseGetInt8:
       return InlineByteArrayBaseLoad(flow_graph, call, receiver, receiver_cid,
-                                     kTypedDataInt8ArrayCid,
-                                     entry, last);
+                                     kTypedDataInt8ArrayCid, entry, last);
     case MethodRecognizer::kByteArrayBaseGetUint8:
       return InlineByteArrayBaseLoad(flow_graph, call, receiver, receiver_cid,
-                                     kTypedDataUint8ArrayCid,
-                                     entry, last);
+                                     kTypedDataUint8ArrayCid, entry, last);
     case MethodRecognizer::kByteArrayBaseGetInt16:
       return InlineByteArrayBaseLoad(flow_graph, call, receiver, receiver_cid,
-                                     kTypedDataInt16ArrayCid,
-                                     entry, last);
+                                     kTypedDataInt16ArrayCid, entry, last);
     case MethodRecognizer::kByteArrayBaseGetUint16:
       return InlineByteArrayBaseLoad(flow_graph, call, receiver, receiver_cid,
-                                     kTypedDataUint16ArrayCid,
-                                     entry, last);
+                                     kTypedDataUint16ArrayCid, entry, last);
     case MethodRecognizer::kByteArrayBaseGetInt32:
       if (!CanUnboxInt32()) {
         return false;
       }
       return InlineByteArrayBaseLoad(flow_graph, call, receiver, receiver_cid,
-                                     kTypedDataInt32ArrayCid,
-                                     entry, last);
+                                     kTypedDataInt32ArrayCid, entry, last);
     case MethodRecognizer::kByteArrayBaseGetUint32:
       if (!CanUnboxInt32()) {
         return false;
       }
       return InlineByteArrayBaseLoad(flow_graph, call, receiver, receiver_cid,
-                                     kTypedDataUint32ArrayCid,
-                                     entry, last);
+                                     kTypedDataUint32ArrayCid, entry, last);
     case MethodRecognizer::kByteArrayBaseGetFloat32:
       if (!CanUnboxDouble()) {
         return false;
       }
       return InlineByteArrayBaseLoad(flow_graph, call, receiver, receiver_cid,
-                                     kTypedDataFloat32ArrayCid,
-                                     entry, last);
+                                     kTypedDataFloat32ArrayCid, entry, last);
     case MethodRecognizer::kByteArrayBaseGetFloat64:
       if (!CanUnboxDouble()) {
         return false;
       }
       return InlineByteArrayBaseLoad(flow_graph, call, receiver, receiver_cid,
-                                     kTypedDataFloat64ArrayCid,
-                                     entry, last);
+                                     kTypedDataFloat64ArrayCid, entry, last);
     case MethodRecognizer::kByteArrayBaseGetFloat32x4:
       if (!ShouldInlineSimd()) {
         return false;
       }
       return InlineByteArrayBaseLoad(flow_graph, call, receiver, receiver_cid,
-                                     kTypedDataFloat32x4ArrayCid,
-                                     entry, last);
+                                     kTypedDataFloat32x4ArrayCid, entry, last);
     case MethodRecognizer::kByteArrayBaseGetInt32x4:
       if (!ShouldInlineSimd()) {
         return false;
       }
       return InlineByteArrayBaseLoad(flow_graph, call, receiver, receiver_cid,
-                                     kTypedDataInt32x4ArrayCid,
-                                     entry, last);
+                                     kTypedDataInt32x4ArrayCid, entry, last);
     case MethodRecognizer::kByteArrayBaseSetInt8:
       return InlineByteArrayBaseStore(flow_graph, target, call, receiver,
                                       receiver_cid, kTypedDataInt8ArrayCid,
                                       entry, last);
     case MethodRecognizer::kByteArrayBaseSetUint8:
       return InlineByteArrayBaseStore(flow_graph, target, call, receiver,
-                                      receiver_cid,
-                                      kTypedDataUint8ArrayCid,
+                                      receiver_cid, kTypedDataUint8ArrayCid,
                                       entry, last);
     case MethodRecognizer::kByteArrayBaseSetInt16:
       return InlineByteArrayBaseStore(flow_graph, target, call, receiver,
-                                      receiver_cid,
-                                      kTypedDataInt16ArrayCid,
+                                      receiver_cid, kTypedDataInt16ArrayCid,
                                       entry, last);
     case MethodRecognizer::kByteArrayBaseSetUint16:
       return InlineByteArrayBaseStore(flow_graph, target, call, receiver,
-                                      receiver_cid,
-                                      kTypedDataUint16ArrayCid,
+                                      receiver_cid, kTypedDataUint16ArrayCid,
                                       entry, last);
     case MethodRecognizer::kByteArrayBaseSetInt32:
       return InlineByteArrayBaseStore(flow_graph, target, call, receiver,
-                                      receiver_cid,
-                                      kTypedDataInt32ArrayCid,
+                                      receiver_cid, kTypedDataInt32ArrayCid,
                                       entry, last);
     case MethodRecognizer::kByteArrayBaseSetUint32:
       return InlineByteArrayBaseStore(flow_graph, target, call, receiver,
-                                      receiver_cid,
-                                      kTypedDataUint32ArrayCid,
+                                      receiver_cid, kTypedDataUint32ArrayCid,
                                       entry, last);
     case MethodRecognizer::kByteArrayBaseSetFloat32:
       if (!CanUnboxDouble()) {
         return false;
       }
       return InlineByteArrayBaseStore(flow_graph, target, call, receiver,
-                                      receiver_cid,
-                                      kTypedDataFloat32ArrayCid,
+                                      receiver_cid, kTypedDataFloat32ArrayCid,
                                       entry, last);
     case MethodRecognizer::kByteArrayBaseSetFloat64:
       if (!CanUnboxDouble()) {
         return false;
       }
       return InlineByteArrayBaseStore(flow_graph, target, call, receiver,
-                                      receiver_cid,
-                                      kTypedDataFloat64ArrayCid,
+                                      receiver_cid, kTypedDataFloat64ArrayCid,
                                       entry, last);
     case MethodRecognizer::kByteArrayBaseSetFloat32x4:
       if (!ShouldInlineSimd()) {
         return false;
       }
       return InlineByteArrayBaseStore(flow_graph, target, call, receiver,
-                                      receiver_cid,
-                                      kTypedDataFloat32x4ArrayCid,
+                                      receiver_cid, kTypedDataFloat32x4ArrayCid,
                                       entry, last);
     case MethodRecognizer::kByteArrayBaseSetInt32x4:
       if (!ShouldInlineSimd()) {
         return false;
       }
       return InlineByteArrayBaseStore(flow_graph, target, call, receiver,
-                                      receiver_cid,
-                                      kTypedDataInt32x4ArrayCid,
+                                      receiver_cid, kTypedDataInt32x4ArrayCid,
                                       entry, last);
     case MethodRecognizer::kOneByteStringCodeUnitAt:
     case MethodRecognizer::kTwoByteStringCodeUnitAt:
     case MethodRecognizer::kExternalOneByteStringCodeUnitAt:
     case MethodRecognizer::kExternalTwoByteStringCodeUnitAt:
-      return InlineStringCodeUnitAt(
-          flow_graph, call, receiver_cid, entry, last);
+      return InlineStringCodeUnitAt(flow_graph, call, receiver_cid, entry,
+                                    last);
     case MethodRecognizer::kStringBaseCharAt:
-      return InlineStringBaseCharAt(
-          flow_graph, call, receiver_cid, entry, last);
+      return InlineStringBaseCharAt(flow_graph, call, receiver_cid, entry,
+                                    last);
     case MethodRecognizer::kDoubleAdd:
       return InlineDoubleOp(flow_graph, Token::kADD, call, entry, last);
     case MethodRecognizer::kDoubleSub:
@@ -3691,15 +3413,15 @@
     case MethodRecognizer::kGrowableArraySetData:
       ASSERT(receiver_cid == kGrowableObjectArrayCid);
       ASSERT(ic_data.NumberOfChecks() == 1);
-      return InlineGrowableArraySetter(
-          flow_graph, GrowableObjectArray::data_offset(), kEmitStoreBarrier,
-          call, entry, last);
+      return InlineGrowableArraySetter(flow_graph,
+                                       GrowableObjectArray::data_offset(),
+                                       kEmitStoreBarrier, call, entry, last);
     case MethodRecognizer::kGrowableArraySetLength:
       ASSERT(receiver_cid == kGrowableObjectArrayCid);
       ASSERT(ic_data.NumberOfChecks() == 1);
-      return InlineGrowableArraySetter(
-          flow_graph, GrowableObjectArray::length_offset(), kNoStoreBarrier,
-          call, entry, last);
+      return InlineGrowableArraySetter(flow_graph,
+                                       GrowableObjectArray::length_offset(),
+                                       kNoStoreBarrier, call, entry, last);
     case MethodRecognizer::kSmi_bitAndFromSmi:
       return InlineSmiBitAndFromSmi(flow_graph, call, entry, last);
 
@@ -3787,8 +3509,8 @@
       return InlineMathCFunction(flow_graph, call, kind, entry, last);
 
     case MethodRecognizer::kObjectConstructor: {
-      *entry = new(Z) TargetEntryInstr(flow_graph->allocate_block_id(),
-                                       call->GetBlock()->try_index());
+      *entry = new (Z) TargetEntryInstr(flow_graph->allocate_block_id(),
+                                        call->GetBlock()->try_index());
       (*entry)->InheritDeoptTarget(Z, call);
       ASSERT(!call->HasUses());
       *last = NULL;  // Empty body.
@@ -3796,22 +3518,21 @@
     }
 
     case MethodRecognizer::kObjectArrayAllocate: {
-      Value* num_elements = new(Z) Value(call->ArgumentAt(1));
+      Value* num_elements = new (Z) Value(call->ArgumentAt(1));
       if (num_elements->BindsToConstant() &&
           num_elements->BoundConstant().IsSmi()) {
-        intptr_t length =
-            Smi::Cast(num_elements->BoundConstant()).Value();
+        intptr_t length = Smi::Cast(num_elements->BoundConstant()).Value();
         if (length >= 0 && length <= Array::kMaxElements) {
-          Value* type = new(Z) Value(call->ArgumentAt(0));
-          *entry = new(Z) TargetEntryInstr(flow_graph->allocate_block_id(),
-                                           call->GetBlock()->try_index());
+          Value* type = new (Z) Value(call->ArgumentAt(0));
+          *entry = new (Z) TargetEntryInstr(flow_graph->allocate_block_id(),
+                                            call->GetBlock()->try_index());
           (*entry)->InheritDeoptTarget(Z, call);
           *last =
-              new(Z) CreateArrayInstr(call->token_pos(), type, num_elements);
-          flow_graph->AppendTo(*entry, *last,
-                               call->deopt_id() != Thread::kNoDeoptId ?
-                               call->env() : NULL,
-                               FlowGraph::kValue);
+              new (Z) CreateArrayInstr(call->token_pos(), type, num_elements);
+          flow_graph->AppendTo(
+              *entry, *last,
+              call->deopt_id() != Thread::kNoDeoptId ? call->env() : NULL,
+              FlowGraph::kValue);
           return true;
         }
       }
@@ -3827,23 +3548,23 @@
       } else if (RawObject::IsIntegerClassId(receiver_cid)) {
         type = Type::IntType();
       } else if (receiver_cid != kClosureCid) {
-        const Class& cls = Class::Handle(Z,
-            flow_graph->isolate()->class_table()->At(receiver_cid));
+        const Class& cls = Class::Handle(
+            Z, flow_graph->isolate()->class_table()->At(receiver_cid));
         if (!cls.IsGeneric()) {
           type = cls.CanonicalType();
         }
       }
 
       if (!type.IsNull()) {
-          *entry = new(Z) TargetEntryInstr(flow_graph->allocate_block_id(),
-                                           call->GetBlock()->try_index());
-          (*entry)->InheritDeoptTarget(Z, call);
-          *last = new(Z) ConstantInstr(type);
-          flow_graph->AppendTo(*entry, *last,
-                               call->deopt_id() != Thread::kNoDeoptId ?
-                               call->env() : NULL,
-                               FlowGraph::kValue);
-          return true;
+        *entry = new (Z) TargetEntryInstr(flow_graph->allocate_block_id(),
+                                          call->GetBlock()->try_index());
+        (*entry)->InheritDeoptTarget(Z, call);
+        *last = new (Z) ConstantInstr(type);
+        flow_graph->AppendTo(
+            *entry, *last,
+            call->deopt_id() != Thread::kNoDeoptId ? call->env() : NULL,
+            FlowGraph::kValue);
+        return true;
       }
       return false;
     }
@@ -3851,27 +3572,22 @@
     case MethodRecognizer::kOneByteStringSetAt: {
       // This is an internal method, no need to check argument types nor
       // range.
-      *entry = new(Z) TargetEntryInstr(flow_graph->allocate_block_id(),
-                                       call->GetBlock()->try_index());
+      *entry = new (Z) TargetEntryInstr(flow_graph->allocate_block_id(),
+                                        call->GetBlock()->try_index());
       (*entry)->InheritDeoptTarget(Z, call);
       Definition* str = call->ArgumentAt(0);
       Definition* index = call->ArgumentAt(1);
       Definition* value = call->ArgumentAt(2);
-      *last = new(Z) StoreIndexedInstr(
-          new(Z) Value(str),
-          new(Z) Value(index),
-          new(Z) Value(value),
-          kNoStoreBarrier,
-          1,  // Index scale
-          kOneByteStringCid,
-          kAlignedAccess,
-          call->deopt_id(),
-          call->token_pos());
-      flow_graph->AppendTo(*entry,
-                           *last,
-                           call->deopt_id() != Thread::kNoDeoptId ?
-                              call->env() : NULL,
-                           FlowGraph::kEffect);
+      *last =
+          new (Z) StoreIndexedInstr(new (Z) Value(str), new (Z) Value(index),
+                                    new (Z) Value(value), kNoStoreBarrier,
+                                    1,  // Index scale
+                                    kOneByteStringCid, kAlignedAccess,
+                                    call->deopt_id(), call->token_pos());
+      flow_graph->AppendTo(
+          *entry, *last,
+          call->deopt_id() != Thread::kNoDeoptId ? call->env() : NULL,
+          FlowGraph::kEffect);
       return true;
     }
 
diff --git a/runtime/vm/flow_graph_range_analysis.cc b/runtime/vm/flow_graph_range_analysis.cc
index 1e7afbd..28ec325 100644
--- a/runtime/vm/flow_graph_range_analysis.cc
+++ b/runtime/vm/flow_graph_range_analysis.cc
@@ -9,11 +9,15 @@
 
 namespace dart {
 
-DEFINE_FLAG(bool, array_bounds_check_elimination, true,
-    "Eliminate redundant bounds checks.");
+DEFINE_FLAG(bool,
+            array_bounds_check_elimination,
+            true,
+            "Eliminate redundant bounds checks.");
 DEFINE_FLAG(bool, trace_range_analysis, false, "Trace range analysis progress");
-DEFINE_FLAG(bool, trace_integer_ir_selection, false,
-    "Print integer IR selection optimization pass.");
+DEFINE_FLAG(bool,
+            trace_integer_ir_selection,
+            false,
+            "Print integer IR selection optimization pass.");
 DECLARE_FLAG(bool, trace_constant_propagation);
 
 // Quick access to the locally defined isolate() and zone() methods.
@@ -81,7 +85,7 @@
         initial_value_(initial_value),
         increment_(increment),
         limit_(limit),
-        bound_(NULL) { }
+        bound_(NULL) {}
 
   PhiInstr* phi() const { return phi_; }
   Definition* initial_value() const { return initial_value_; }
@@ -108,8 +112,7 @@
 static ConstraintInstr* FindBoundingConstraint(PhiInstr* phi,
                                                Definition* defn) {
   ConstraintInstr* limit = NULL;
-  for (ConstraintInstr* constraint = defn->AsConstraint();
-       constraint != NULL;
+  for (ConstraintInstr* constraint = defn->AsConstraint(); constraint != NULL;
        constraint = constraint->value()->definition()->AsConstraint()) {
     if (constraint->target() == NULL) {
       continue;  // Only interested in non-artifical constraints.
@@ -140,25 +143,22 @@
 
   const intptr_t backedge_idx =
       loop_info->Contains(phi->block()->PredecessorAt(0)->preorder_number())
-          ? 0 : 1;
+          ? 0
+          : 1;
 
-  Definition* initial_value =
-      phi->InputAt(1 - backedge_idx)->definition();
+  Definition* initial_value = phi->InputAt(1 - backedge_idx)->definition();
 
   BinarySmiOpInstr* increment =
-      UnwrapConstraint(phi->InputAt(backedge_idx)->definition())->
-          AsBinarySmiOp();
+      UnwrapConstraint(phi->InputAt(backedge_idx)->definition())
+          ->AsBinarySmiOp();
 
-  if ((increment != NULL) &&
-      (increment->op_kind() == Token::kADD) &&
+  if ((increment != NULL) && (increment->op_kind() == Token::kADD) &&
       (UnwrapConstraint(increment->left()->definition()) == phi) &&
       increment->right()->BindsToConstant() &&
       increment->right()->BoundConstant().IsSmi() &&
       (Smi::Cast(increment->right()->BoundConstant()).Value() == 1)) {
     return new InductionVariableInfo(
-        phi,
-        initial_value,
-        increment,
+        phi, initial_value, increment,
         FindBoundingConstraint(phi, increment->left()->definition()));
   }
 
@@ -170,8 +170,7 @@
   GrowableArray<InductionVariableInfo*> loop_variables;
 
   for (BlockIterator block_it = flow_graph_->reverse_postorder_iterator();
-       !block_it.Done();
-       block_it.Advance()) {
+       !block_it.Done(); block_it.Advance()) {
     BlockEntryInstr* block = block_it.Current();
 
     JoinEntryInstr* join = block->AsJoinEntry();
@@ -185,9 +184,8 @@
         if (info != NULL) {
           if (FLAG_support_il_printer && FLAG_trace_range_analysis) {
             THR_Print("Simple loop variable: %s bound <%s>\n",
-                       current->ToCString(),
-                       info->limit() != NULL ?
-                           info->limit()->ToCString() : "?");
+                      current->ToCString(),
+                      info->limit() != NULL ? info->limit()->ToCString() : "?");
           }
 
           loop_variables.Add(info);
@@ -225,15 +223,15 @@
   }
 
   for (BlockIterator block_it = flow_graph_->reverse_postorder_iterator();
-       !block_it.Done();
-       block_it.Advance()) {
+       !block_it.Done(); block_it.Advance()) {
     BlockEntryInstr* block = block_it.Current();
 
 
     if (block->IsGraphEntry() || block->IsCatchBlockEntry()) {
-      const GrowableArray<Definition*>& initial = block->IsGraphEntry()
-          ? *block->AsGraphEntry()->initial_definitions()
-          : *block->AsCatchBlockEntry()->initial_definitions();
+      const GrowableArray<Definition*>& initial =
+          block->IsGraphEntry()
+              ? *block->AsGraphEntry()->initial_definitions()
+              : *block->AsCatchBlockEntry()->initial_definitions();
       for (intptr_t i = 0; i < initial.length(); ++i) {
         Definition* current = initial[i];
         if (IsIntegerDefinition(current)) {
@@ -252,8 +250,7 @@
       }
     }
 
-    for (ForwardInstructionIterator instr_it(block);
-         !instr_it.Done();
+    for (ForwardInstructionIterator instr_it(block); !instr_it.Done();
          instr_it.Advance()) {
       Instruction* current = instr_it.Current();
       Definition* defn = current->AsDefinition();
@@ -305,9 +302,7 @@
 void RangeAnalysis::RenameDominatedUses(Definition* def,
                                         Instruction* dom,
                                         Definition* other) {
-  for (Value::Iterator it(def->input_use_list());
-       !it.Done();
-       it.Advance()) {
+  for (Value::Iterator it(def->input_use_list()); !it.Done(); it.Advance()) {
     Value* use = it.Current();
 
     // Skip dead phis.
@@ -324,12 +319,18 @@
 // comparison: a (op) b === b (op') a.
 static Token::Kind FlipComparison(Token::Kind op) {
   switch (op) {
-    case Token::kEQ: return Token::kEQ;
-    case Token::kNE: return Token::kNE;
-    case Token::kLT: return Token::kGT;
-    case Token::kGT: return Token::kLT;
-    case Token::kLTE: return Token::kGTE;
-    case Token::kGTE: return Token::kLTE;
+    case Token::kEQ:
+      return Token::kEQ;
+    case Token::kNE:
+      return Token::kNE;
+    case Token::kLT:
+      return Token::kGT;
+    case Token::kGT:
+      return Token::kLT;
+    case Token::kLTE:
+      return Token::kGTE;
+    case Token::kGTE:
+      return Token::kLTE;
     default:
       UNREACHABLE();
       return Token::kILLEGAL;
@@ -345,22 +346,22 @@
 Range* RangeAnalysis::ConstraintSmiRange(Token::Kind op, Definition* boundary) {
   switch (op) {
     case Token::kEQ:
-      return new(Z) Range(RangeBoundary::FromDefinition(boundary),
-                          RangeBoundary::FromDefinition(boundary));
+      return new (Z) Range(RangeBoundary::FromDefinition(boundary),
+                           RangeBoundary::FromDefinition(boundary));
     case Token::kNE:
-      return new(Z) Range(Range::Full(RangeBoundary::kRangeBoundarySmi));
+      return new (Z) Range(Range::Full(RangeBoundary::kRangeBoundarySmi));
     case Token::kLT:
-      return new(Z) Range(RangeBoundary::MinSmi(),
-                          RangeBoundary::FromDefinition(boundary, -1));
+      return new (Z) Range(RangeBoundary::MinSmi(),
+                           RangeBoundary::FromDefinition(boundary, -1));
     case Token::kGT:
-      return new(Z) Range(RangeBoundary::FromDefinition(boundary, 1),
-                          RangeBoundary::MaxSmi());
+      return new (Z) Range(RangeBoundary::FromDefinition(boundary, 1),
+                           RangeBoundary::MaxSmi());
     case Token::kLTE:
-      return new(Z) Range(RangeBoundary::MinSmi(),
-                          RangeBoundary::FromDefinition(boundary));
+      return new (Z) Range(RangeBoundary::MinSmi(),
+                           RangeBoundary::FromDefinition(boundary));
     case Token::kGTE:
-      return new(Z) Range(RangeBoundary::FromDefinition(boundary),
-                          RangeBoundary::MaxSmi());
+      return new (Z) Range(RangeBoundary::FromDefinition(boundary),
+                           RangeBoundary::MaxSmi());
     default:
       UNREACHABLE();
       return NULL;
@@ -386,8 +387,7 @@
     constraint = constraint->next()->AsConstraint();
   }
 
-  constraint = new(Z) ConstraintInstr(
-      use->CopyWithType(), constraint_range);
+  constraint = new (Z) ConstraintInstr(use->CopyWithType(), constraint_range);
 
   flow_graph_->InsertAfter(after, constraint, NULL, FlowGraph::kValue);
   RenameDominatedUses(defn, constraint, constraint);
@@ -417,21 +417,17 @@
 
     // Constrain definition at the true successor.
     ConstraintInstr* true_constraint =
-        InsertConstraintFor(use,
-                            defn,
-                            ConstraintSmiRange(op_kind, boundary),
+        InsertConstraintFor(use, defn, ConstraintSmiRange(op_kind, boundary),
                             branch->true_successor());
     if (true_constraint != NULL) {
       true_constraint->set_target(branch->true_successor());
     }
 
     // Constrain definition with a negated condition at the false successor.
-    ConstraintInstr* false_constraint =
-        InsertConstraintFor(
-            use,
-            defn,
-            ConstraintSmiRange(Token::NegateComparison(op_kind), boundary),
-            branch->false_successor());
+    ConstraintInstr* false_constraint = InsertConstraintFor(
+        use, defn,
+        ConstraintSmiRange(Token::NegateComparison(op_kind), boundary),
+        branch->false_successor());
     if (false_constraint != NULL) {
       false_constraint->set_target(branch->false_successor());
     }
@@ -444,8 +440,7 @@
 
 
 void RangeAnalysis::InsertConstraintsFor(Definition* defn) {
-  for (Value* use = defn->input_use_list();
-       use != NULL;
+  for (Value* use = defn->input_use_list(); use != NULL;
        use = use->next_use()) {
     if (use->instruction()->IsBranch()) {
       if (ConstrainValueAfterBranch(use, defn)) {
@@ -461,24 +456,21 @@
 }
 
 
-void RangeAnalysis::ConstrainValueAfterCheckArrayBound(
-    Value* use,
-    Definition* defn) {
+void RangeAnalysis::ConstrainValueAfterCheckArrayBound(Value* use,
+                                                       Definition* defn) {
   CheckArrayBoundInstr* check = use->instruction()->AsCheckArrayBound();
   intptr_t use_index = use->use_index();
 
   Range* constraint_range = NULL;
   if (use_index == CheckArrayBoundInstr::kIndexPos) {
     Definition* length = check->length()->definition();
-    constraint_range = new(Z) Range(
-        RangeBoundary::FromConstant(0),
-        RangeBoundary::FromDefinition(length, -1));
+    constraint_range = new (Z) Range(RangeBoundary::FromConstant(0),
+                                     RangeBoundary::FromDefinition(length, -1));
   } else {
     ASSERT(use_index == CheckArrayBoundInstr::kLengthPos);
     Definition* index = check->index()->definition();
-    constraint_range = new(Z) Range(
-        RangeBoundary::FromDefinition(index, 1),
-        RangeBoundary::MaxSmi());
+    constraint_range = new (Z)
+        Range(RangeBoundary::FromDefinition(index, 1), RangeBoundary::MaxSmi());
   }
   InsertConstraintFor(use, defn, constraint_range, check);
 }
@@ -543,17 +535,14 @@
   a = UnwrapConstraint(a);
   b = UnwrapConstraint(b);
   return (a == b) ||
-      (a->AllowsCSE() &&
-       a->Dependencies().IsNone() &&
-       b->AllowsCSE() &&
-       b->Dependencies().IsNone() &&
-       a->Equals(b));
+         (a->AllowsCSE() && a->Dependencies().IsNone() && b->AllowsCSE() &&
+          b->Dependencies().IsNone() && a->Equals(b));
 }
 
 
 static bool DependOnSameSymbol(const RangeBoundary& a, const RangeBoundary& b) {
   return a.IsSymbol() && b.IsSymbol() &&
-      AreEqualDefinitions(a.symbol(), b.symbol());
+         AreEqualDefinitions(a.symbol(), b.symbol());
 }
 
 
@@ -570,8 +559,9 @@
     if (min.LowerBound().Overflowed(size)) {
       return RangeBoundary::MinConstant(size);
     } else if (DependOnSameSymbol(min, new_min)) {
-      return min.offset() <= new_min.offset() ?
-          min : RangeBoundary::MinConstant(size);
+      return min.offset() <= new_min.offset()
+                 ? min
+                 : RangeBoundary::MinConstant(size);
     } else if (min.UpperBound(size) <= new_min.LowerBound(size)) {
       return min;
     }
@@ -580,8 +570,9 @@
   min = Range::ConstantMin(range, size);
   new_min = Range::ConstantMin(new_range, size);
 
-  return (min.ConstantValue() <= new_min.ConstantValue()) ?
-      min : RangeBoundary::MinConstant(size);
+  return (min.ConstantValue() <= new_min.ConstantValue())
+             ? min
+             : RangeBoundary::MinConstant(size);
 }
 
 // Given the current range of a phi and a newly computed range check
@@ -597,8 +588,9 @@
     if (max.UpperBound().Overflowed(size)) {
       return RangeBoundary::MaxConstant(size);
     } else if (DependOnSameSymbol(max, new_max)) {
-      return max.offset() >= new_max.offset() ?
-          max : RangeBoundary::MaxConstant(size);
+      return max.offset() >= new_max.offset()
+                 ? max
+                 : RangeBoundary::MaxConstant(size);
     } else if (max.LowerBound(size) >= new_max.UpperBound(size)) {
       return max;
     }
@@ -607,8 +599,9 @@
   max = Range::ConstantMax(range, size);
   new_max = Range::ConstantMax(new_range, size);
 
-  return (max.ConstantValue() >= new_max.ConstantValue()) ?
-      max : RangeBoundary::MaxConstant(size);
+  return (max.ConstantValue() >= new_max.ConstantValue())
+             ? max
+             : RangeBoundary::MaxConstant(size);
 }
 
 
@@ -650,9 +643,12 @@
 
 char RangeAnalysis::OpPrefix(JoinOperator op) {
   switch (op) {
-    case WIDEN: return 'W';
-    case NARROW: return 'N';
-    case NONE: return 'I';
+    case WIDEN:
+      return 'W';
+    case NARROW:
+      return 'N';
+    case NONE:
+      return 'I';
   }
   UNREACHABLE();
   return ' ';
@@ -695,11 +691,8 @@
     if (!range.Equals(defn->range())) {
 #ifndef PRODUCT
       if (FLAG_support_il_printer && FLAG_trace_range_analysis) {
-        THR_Print("%c [%" Pd "] %s:  %s => %s\n",
-                  OpPrefix(op),
-                  iteration,
-                  defn->ToCString(),
-                  Range::ToCString(defn->range()),
+        THR_Print("%c [%" Pd "] %s:  %s => %s\n", OpPrefix(op), iteration,
+                  defn->ToCString(), Range::ToCString(defn->range()),
                   Range::ToCString(&range));
       }
 #endif  // !PRODUCT
@@ -714,8 +707,7 @@
 
 void RangeAnalysis::CollectDefinitions(BitVector* set) {
   for (BlockIterator block_it = flow_graph_->reverse_postorder_iterator();
-       !block_it.Done();
-       block_it.Advance()) {
+       !block_it.Done(); block_it.Advance()) {
     BlockEntryInstr* block = block_it.Current();
 
     JoinEntryInstr* join = block->AsJoinEntry();
@@ -730,8 +722,7 @@
 
     for (ForwardInstructionIterator it(block); !it.Done(); it.Advance()) {
       Definition* defn = it.Current()->AsDefinition();
-      if ((defn != NULL) &&
-          defn->HasSSATemp() &&
+      if ((defn != NULL) && defn->HasSSATemp() &&
           set->Contains(defn->ssa_temp_index())) {
         definitions_.Add(defn);
       }
@@ -764,8 +755,8 @@
   }
   Zone* zone = flow_graph_->zone();
   // Initialize bitvector for quick filtering of int values.
-  BitVector* set = new(zone) BitVector(zone,
-      flow_graph_->current_ssa_temp_index());
+  BitVector* set =
+      new (zone) BitVector(zone, flow_graph_->current_ssa_temp_index());
   for (intptr_t i = 0; i < values_.length(); i++) {
     set->Add(values_[i]->ssa_temp_index());
   }
@@ -857,9 +848,7 @@
   }
 
   // Clear the list of emitted instructions.
-  void Start() {
-    emitted_.Clear();
-  }
+  void Start() { emitted_.Clear(); }
 
   // Given the floating instruction attempt to schedule it into one of the
   // loop preheaders that dominates given post_dominator instruction.
@@ -868,7 +857,7 @@
   // any loop containing post_dominator).
   // Resulting schedule should be equivalent to one obtained by inserting
   // instructions right before post_dominator and running CSE and LICM passes.
-  template<typename T>
+  template <typename T>
   T* Emit(T* instruction, Instruction* post_dominator) {
     return static_cast<T*>(EmitRecursively(instruction, post_dominator));
   }
@@ -882,10 +871,9 @@
   }
 
  private:
-  typedef DirectChainedHashMap<PointerKeyValueTrait<Instruction> >  Map;
+  typedef DirectChainedHashMap<PointerKeyValueTrait<Instruction> > Map;
 
-  Instruction* EmitRecursively(Instruction* instruction,
-                               Instruction* sink) {
+  Instruction* EmitRecursively(Instruction* instruction, Instruction* sink) {
     // Schedule all unscheduled inputs and unwrap all constrained inputs.
     for (intptr_t i = 0; i < instruction->InputCount(); i++) {
       Definition* defn = instruction->InputAt(i)->definition();
@@ -913,8 +901,7 @@
     // If the instruction is still in the graph (it could have been
     // un-scheduled by a rollback action) and it dominates the sink - use it.
     Instruction* emitted = map_.LookupValue(instruction);
-    if (emitted != NULL &&
-        !emitted->WasEliminated() &&
+    if (emitted != NULL && !emitted->WasEliminated() &&
         sink->IsDominatedBy(emitted)) {
       return emitted;
     }
@@ -955,11 +942,9 @@
 
   void EmitTo(BlockEntryInstr* block, Instruction* instr) {
     GotoInstr* last = block->last_instruction()->AsGoto();
-    flow_graph_->InsertBefore(last,
-                              instr,
-                              last->env(),
-                              instr->IsDefinition() ? FlowGraph::kValue
-                                                    : FlowGraph::kEffect);
+    flow_graph_->InsertBefore(
+        last, instr, last->env(),
+        instr->IsDefinition() ? FlowGraph::kValue : FlowGraph::kEffect);
     instr->CopyDeoptIdFrom(*last);
     instr->env()->set_deopt_id(instr->deopt_id_);
 
@@ -986,11 +971,10 @@
 // operations.
 class BoundsCheckGeneralizer {
  public:
-  BoundsCheckGeneralizer(RangeAnalysis* range_analysis,
-                         FlowGraph* flow_graph)
+  BoundsCheckGeneralizer(RangeAnalysis* range_analysis, FlowGraph* flow_graph)
       : range_analysis_(range_analysis),
         flow_graph_(flow_graph),
-        scheduler_(flow_graph) { }
+        scheduler_(flow_graph) {}
 
   void TryGeneralize(CheckArrayBoundInstr* check,
                      const RangeBoundary& array_length) {
@@ -1026,10 +1010,10 @@
     if (!FindNonPositiveSymbols(&non_positive_symbols, upper_bound)) {
 #ifndef PRODUCT
       if (FLAG_support_il_printer && FLAG_trace_range_analysis) {
-        THR_Print("Failed to generalize %s index to %s"
-                  " (can't ensure positivity)\n",
-                  check->ToCString(),
-                  IndexBoundToCString(upper_bound));
+        THR_Print(
+            "Failed to generalize %s index to %s"
+            " (can't ensure positivity)\n",
+            check->ToCString(), IndexBoundToCString(upper_bound));
       }
 #endif  // !PRODUCT
       return;
@@ -1040,32 +1024,31 @@
     // symbols are positive.
     GrowableArray<ConstraintInstr*> positive_constraints(
         non_positive_symbols.length());
-    Range* positive_range = new Range(
-        RangeBoundary::FromConstant(0),
-        RangeBoundary::MaxConstant(RangeBoundary::kRangeBoundarySmi));
+    Range* positive_range =
+        new Range(RangeBoundary::FromConstant(0),
+                  RangeBoundary::MaxConstant(RangeBoundary::kRangeBoundarySmi));
     for (intptr_t i = 0; i < non_positive_symbols.length(); i++) {
       Definition* symbol = non_positive_symbols[i];
-      positive_constraints.Add(new ConstraintInstr(
-          new Value(symbol),
-          positive_range));
+      positive_constraints.Add(
+          new ConstraintInstr(new Value(symbol), positive_range));
     }
 
     Definition* lower_bound =
-      ConstructLowerBound(check->index()->definition(), check);
+        ConstructLowerBound(check->index()->definition(), check);
     // No need to simplify lower bound before applying constraints as
     // we are not going to emit it.
     lower_bound = ApplyConstraints(lower_bound, check, &positive_constraints);
     range_analysis_->AssignRangesRecursively(lower_bound);
 
     if (!RangeUtils::IsPositive(lower_bound->range())) {
-      // Can't prove that lower bound is positive even with additional checks
-      // against potentially non-positive symbols. Give up.
+// Can't prove that lower bound is positive even with additional checks
+// against potentially non-positive symbols. Give up.
 #ifndef PRODUCT
       if (FLAG_support_il_printer && FLAG_trace_range_analysis) {
-        THR_Print("Failed to generalize %s index to %s"
-                  " (lower bound is not positive)\n",
-                  check->ToCString(),
-                  IndexBoundToCString(upper_bound));
+        THR_Print(
+            "Failed to generalize %s index to %s"
+            " (lower bound is not positive)\n",
+            check->ToCString(), IndexBoundToCString(upper_bound));
       }
 #endif  // !PRODUCT
       return;
@@ -1073,8 +1056,7 @@
 
 #ifndef PRODUCT
     if (FLAG_support_il_printer && FLAG_trace_range_analysis) {
-      THR_Print("For %s computed index bounds [%s, %s]\n",
-                check->ToCString(),
+      THR_Print("For %s computed index bounds [%s, %s]\n", check->ToCString(),
                 IndexBoundToCString(lower_bound),
                 IndexBoundToCString(upper_bound));
     }
@@ -1088,8 +1070,7 @@
         flow_graph_->GetConstant(Smi::Handle(Smi::New(Smi::kMaxValue)));
     for (intptr_t i = 0; i < non_positive_symbols.length(); i++) {
       CheckArrayBoundInstr* precondition = new CheckArrayBoundInstr(
-          new Value(max_smi),
-          new Value(non_positive_symbols[i]),
+          new Value(max_smi), new Value(non_positive_symbols[i]),
           Thread::kNoDeoptId);
       precondition->mark_generalized();
       precondition = scheduler_.Emit(precondition, check);
@@ -1103,9 +1084,8 @@
     }
 
     CheckArrayBoundInstr* new_check = new CheckArrayBoundInstr(
-          new Value(UnwrapConstraint(check->length()->definition())),
-          new Value(upper_bound),
-          Thread::kNoDeoptId);
+        new Value(UnwrapConstraint(check->length()->definition())),
+        new Value(upper_bound), Thread::kNoDeoptId);
     new_check->mark_generalized();
     if (new_check->IsRedundant(array_length)) {
       if (FLAG_trace_range_analysis) {
@@ -1131,8 +1111,7 @@
   }
 
   static void RemoveGeneralizedCheck(CheckArrayBoundInstr* check) {
-    BinarySmiOpInstr* binary_op =
-        check->index()->definition()->AsBinarySmiOp();
+    BinarySmiOpInstr* binary_op = check->index()->definition()->AsBinarySmiOp();
     if (binary_op != NULL) {
       binary_op->set_can_overflow(false);
     }
@@ -1143,9 +1122,7 @@
   BinarySmiOpInstr* MakeBinaryOp(Token::Kind op_kind,
                                  Definition* left,
                                  Definition* right) {
-    return new BinarySmiOpInstr(op_kind,
-                                new Value(left),
-                                new Value(right),
+    return new BinarySmiOpInstr(op_kind, new Value(left), new Value(right),
                                 Thread::kNoDeoptId);
   }
 
@@ -1167,21 +1144,19 @@
     }
   }
 
-  typedef Definition* (BoundsCheckGeneralizer::*PhiBoundFunc)(
-      PhiInstr*, Instruction*);
+  typedef Definition* (BoundsCheckGeneralizer::*PhiBoundFunc)(PhiInstr*,
+                                                              Instruction*);
 
   // Construct symbolic lower bound for a value at the given point.
   Definition* ConstructLowerBound(Definition* value, Instruction* point) {
     return ConstructBound(&BoundsCheckGeneralizer::InductionVariableLowerBound,
-                          value,
-                          point);
+                          value, point);
   }
 
   // Construct symbolic upper bound for a value at the given point.
   Definition* ConstructUpperBound(Definition* value, Instruction* point) {
     return ConstructBound(&BoundsCheckGeneralizer::InductionVariableUpperBound,
-                          value,
-                          point);
+                          value, point);
   }
 
   // Construct symbolic bound for a value at the given point:
@@ -1212,11 +1187,11 @@
           (bin_op->op_kind() == Token::kSUB)) {
         Definition* new_left =
             ConstructBound(phi_bound_func, bin_op->left()->definition(), point);
-        Definition* new_right = (bin_op->op_kind() != Token::kSUB)
-            ? ConstructBound(phi_bound_func,
-                             bin_op->right()->definition(),
-                             point)
-            : UnwrapConstraint(bin_op->right()->definition());
+        Definition* new_right =
+            (bin_op->op_kind() != Token::kSUB)
+                ? ConstructBound(phi_bound_func, bin_op->right()->definition(),
+                                 point)
+                : UnwrapConstraint(bin_op->right()->definition());
 
         if ((new_left != UnwrapConstraint(bin_op->left()->definition())) ||
             (new_right != UnwrapConstraint(bin_op->right()->definition()))) {
@@ -1228,8 +1203,7 @@
     return value;
   }
 
-  Definition* InductionVariableUpperBound(PhiInstr* phi,
-                                          Instruction* point) {
+  Definition* InductionVariableUpperBound(PhiInstr* phi, Instruction* point) {
     const InductionVariableInfo& info = *phi->induction_variable_info();
     if (info.bound() == phi) {
       if (point->IsDominatedBy(info.limit())) {
@@ -1255,13 +1229,11 @@
         //
         //          y <= y0 + (M - x0)
         //
-        Definition* limit = RangeBoundaryToDefinition(
-            bound_info.limit()->constraint()->max());
-        BinarySmiOpInstr* loop_length =
-            MakeBinaryOp(Token::kSUB,
-                         ConstructUpperBound(limit, point),
-                         ConstructLowerBound(bound_info.initial_value(),
-                                             point));
+        Definition* limit =
+            RangeBoundaryToDefinition(bound_info.limit()->constraint()->max());
+        BinarySmiOpInstr* loop_length = MakeBinaryOp(
+            Token::kSUB, ConstructUpperBound(limit, point),
+            ConstructLowerBound(bound_info.initial_value(), point));
         return MakeBinaryOp(Token::kADD,
                             ConstructUpperBound(info.initial_value(), point),
                             loop_length);
@@ -1271,8 +1243,7 @@
     return phi;
   }
 
-  Definition* InductionVariableLowerBound(PhiInstr* phi,
-                                          Instruction* point) {
+  Definition* InductionVariableLowerBound(PhiInstr* phi, Instruction* point) {
     // Given induction variable
     //
     //          x <- phi(x0, x + 1)
@@ -1396,8 +1367,7 @@
           if (right_changed) binary_op->right()->set_definition(right);
           *defn = binary_op;
         } else {
-          *defn = MakeBinaryOp(binary_op->op_kind(),
-                               UnwrapConstraint(left),
+          *defn = MakeBinaryOp(binary_op->op_kind(), UnwrapConstraint(left),
                                UnwrapConstraint(right));
         }
       }
@@ -1448,7 +1418,7 @@
       }
 
       return FindNonPositiveSymbols(symbols, binary_op->left()->definition()) &&
-        FindNonPositiveSymbols(symbols, binary_op->right()->definition());
+             FindNonPositiveSymbols(symbols, binary_op->right()->definition());
     }
     UNREACHABLE();
     return false;
@@ -1458,8 +1428,7 @@
   // instruction.
   static Definition* FindInnermostConstraint(Definition* defn,
                                              Instruction* post_dominator) {
-    for (Value* use = defn->input_use_list();
-         use != NULL;
+    for (Value* use = defn->input_use_list(); use != NULL;
          use = use->next_use()) {
       ConstraintInstr* constraint = use->instruction()->AsConstraint();
       if ((constraint != NULL) && post_dominator->IsDominatedBy(constraint)) {
@@ -1492,10 +1461,8 @@
     }
 
     for (intptr_t i = 0; i < defn->InputCount(); i++) {
-      defn->InputAt(i)->set_definition(
-          ApplyConstraints(defn->InputAt(i)->definition(),
-                           post_dominator,
-                           constraints));
+      defn->InputAt(i)->set_definition(ApplyConstraints(
+          defn->InputAt(i)->definition(), post_dominator, constraints));
     }
 
     return defn;
@@ -1542,8 +1509,7 @@
     // check earlier, or we're compiling precompiled code (no
     // optimistic hoisting of checks possible)
     const bool try_generalization =
-        function.allows_bounds_check_generalization() &&
-        !FLAG_precompiled_mode;
+        function.allows_bounds_check_generalization() && !FLAG_precompiled_mode;
 
     BoundsCheckGeneralizer generalizer(this, flow_graph_);
 
@@ -1617,17 +1583,14 @@
 static void NarrowBinaryMintOp(BinaryMintOpInstr* mint_op) {
   if (RangeUtils::Fits(mint_op->range(), RangeBoundary::kRangeBoundaryInt32) &&
       RangeUtils::Fits(mint_op->left()->definition()->range(),
-                  RangeBoundary::kRangeBoundaryInt32) &&
+                       RangeBoundary::kRangeBoundaryInt32) &&
       RangeUtils::Fits(mint_op->right()->definition()->range(),
-                  RangeBoundary::kRangeBoundaryInt32) &&
-      BinaryInt32OpInstr::IsSupported(mint_op->op_kind(),
-                                      mint_op->left(),
+                       RangeBoundary::kRangeBoundaryInt32) &&
+      BinaryInt32OpInstr::IsSupported(mint_op->op_kind(), mint_op->left(),
                                       mint_op->right())) {
-    BinaryInt32OpInstr* int32_op =
-        new BinaryInt32OpInstr(mint_op->op_kind(),
-                               mint_op->left()->CopyWithType(),
-                               mint_op->right()->CopyWithType(),
-                               mint_op->DeoptimizationTarget());
+    BinaryInt32OpInstr* int32_op = new BinaryInt32OpInstr(
+        mint_op->op_kind(), mint_op->left()->CopyWithType(),
+        mint_op->right()->CopyWithType(), mint_op->DeoptimizationTarget());
     int32_op->set_range(*mint_op->range());
     int32_op->set_can_overflow(false);
     mint_op->ReplaceWith(int32_op, NULL);
@@ -1638,17 +1601,14 @@
 static void NarrowShiftMintOp(ShiftMintOpInstr* mint_op) {
   if (RangeUtils::Fits(mint_op->range(), RangeBoundary::kRangeBoundaryInt32) &&
       RangeUtils::Fits(mint_op->left()->definition()->range(),
-                  RangeBoundary::kRangeBoundaryInt32) &&
+                       RangeBoundary::kRangeBoundaryInt32) &&
       RangeUtils::Fits(mint_op->right()->definition()->range(),
-                  RangeBoundary::kRangeBoundaryInt32) &&
-      BinaryInt32OpInstr::IsSupported(mint_op->op_kind(),
-                                      mint_op->left(),
+                       RangeBoundary::kRangeBoundaryInt32) &&
+      BinaryInt32OpInstr::IsSupported(mint_op->op_kind(), mint_op->left(),
                                       mint_op->right())) {
-    BinaryInt32OpInstr* int32_op =
-        new BinaryInt32OpInstr(mint_op->op_kind(),
-                               mint_op->left()->CopyWithType(),
-                               mint_op->right()->CopyWithType(),
-                               mint_op->DeoptimizationTarget());
+    BinaryInt32OpInstr* int32_op = new BinaryInt32OpInstr(
+        mint_op->op_kind(), mint_op->left()->CopyWithType(),
+        mint_op->right()->CopyWithType(), mint_op->DeoptimizationTarget());
     int32_op->set_range(*mint_op->range());
     int32_op->set_can_overflow(false);
     mint_op->ReplaceWith(int32_op, NULL);
@@ -1672,7 +1632,7 @@
   ASSERT(flow_graph_ != NULL);
   zone_ = flow_graph_->zone();
   selected_uint32_defs_ =
-      new(zone_) BitVector(zone_, flow_graph_->current_ssa_temp_index());
+      new (zone_) BitVector(zone_, flow_graph_->current_ssa_temp_index());
 }
 
 
@@ -1696,11 +1656,8 @@
   // TODO(johnmccutchan): Consider Smi operations, to avoid unnecessary tagging
   // & untagged of intermediate results.
   // TODO(johnmccutchan): Consider phis.
-  return def->IsBoxInt64() ||
-         def->IsUnboxInt64() ||
-         def->IsBinaryMintOp() ||
-         def->IsShiftMintOp()  ||
-         def->IsUnaryMintOp();
+  return def->IsBoxInt64() || def->IsUnboxInt64() || def->IsBinaryMintOp() ||
+         def->IsShiftMintOp() || def->IsUnaryMintOp();
 }
 
 
@@ -1710,19 +1667,17 @@
   }
 
   for (BlockIterator block_it = flow_graph_->reverse_postorder_iterator();
-       !block_it.Done();
-       block_it.Advance()) {
+       !block_it.Done(); block_it.Advance()) {
     BlockEntryInstr* block = block_it.Current();
 
-    for (ForwardInstructionIterator instr_it(block);
-         !instr_it.Done();
+    for (ForwardInstructionIterator instr_it(block); !instr_it.Done();
          instr_it.Advance()) {
       Instruction* current = instr_it.Current();
       Definition* defn = current->AsDefinition();
       if ((defn != NULL) && defn->HasSSATemp()) {
         if (IsPotentialUint32Definition(defn)) {
           if (FLAG_support_il_printer && FLAG_trace_integer_ir_selection) {
-           THR_Print("Adding %s\n", current->ToCString());
+            THR_Print("Adding %s\n", current->ToCString());
           }
           potential_uint32_defs_.Add(defn);
         }
@@ -1772,13 +1727,10 @@
 
 
 bool IntegerInstructionSelector::AllUsesAreUint32Narrowing(Value* list_head) {
-  for (Value::Iterator it(list_head);
-       !it.Done();
-       it.Advance()) {
+  for (Value::Iterator it(list_head); !it.Done(); it.Advance()) {
     Value* use = it.Current();
     Definition* defn = use->instruction()->AsDefinition();
-    if ((defn == NULL) ||
-        !defn->HasSSATemp() ||
+    if ((defn == NULL) || !defn->HasSSATemp() ||
         !selected_uint32_defs_->Contains(defn->ssa_temp_index())) {
       return false;
     }
@@ -1865,28 +1817,28 @@
     Value* left = op->left()->CopyWithType();
     Value* right = op->right()->CopyWithType();
     intptr_t deopt_id = op->DeoptimizationTarget();
-    return new(Z) BinaryUint32OpInstr(op_kind, left, right, deopt_id);
+    return new (Z) BinaryUint32OpInstr(op_kind, left, right, deopt_id);
   } else if (def->IsBoxInt64()) {
     Value* value = def->AsBoxInt64()->value()->CopyWithType();
-    return new(Z) BoxUint32Instr(value);
+    return new (Z) BoxUint32Instr(value);
   } else if (def->IsUnboxInt64()) {
     UnboxInstr* unbox = def->AsUnboxInt64();
     Value* value = unbox->value()->CopyWithType();
     intptr_t deopt_id = unbox->DeoptimizationTarget();
-    return new(Z) UnboxUint32Instr(value, deopt_id);
+    return new (Z) UnboxUint32Instr(value, deopt_id);
   } else if (def->IsUnaryMintOp()) {
     UnaryMintOpInstr* op = def->AsUnaryMintOp();
     Token::Kind op_kind = op->op_kind();
     Value* value = op->value()->CopyWithType();
     intptr_t deopt_id = op->DeoptimizationTarget();
-    return new(Z) UnaryUint32OpInstr(op_kind, value, deopt_id);
+    return new (Z) UnaryUint32OpInstr(op_kind, value, deopt_id);
   } else if (def->IsShiftMintOp()) {
     ShiftMintOpInstr* op = def->AsShiftMintOp();
     Token::Kind op_kind = op->op_kind();
     Value* left = op->left()->CopyWithType();
     Value* right = op->right()->CopyWithType();
     intptr_t deopt_id = op->DeoptimizationTarget();
-    return new(Z) ShiftUint32OpInstr(op_kind, left, right, deopt_id);
+    return new (Z) ShiftUint32OpInstr(op_kind, left, right, deopt_id);
   }
   UNREACHABLE();
   return NULL;
@@ -1907,7 +1859,7 @@
     ASSERT(replacement != NULL);
     if (FLAG_support_il_printer && FLAG_trace_integer_ir_selection) {
       THR_Print("Replacing %s with %s\n", defn->ToCString(),
-                                          replacement->ToCString());
+                replacement->ToCString());
     }
     if (!Range::IsUnknown(defn->range())) {
       replacement->set_range(*defn->range());
@@ -1932,8 +1884,7 @@
   }
   if (IsConstant()) return *this;
   return Add(Range::ConstantMinSmi(symbol()->range()),
-             RangeBoundary::FromConstant(offset_),
-             NegativeInfinity());
+             RangeBoundary::FromConstant(offset_), NegativeInfinity());
 }
 
 
@@ -1944,8 +1895,7 @@
   if (IsConstant()) return *this;
 
   return Add(Range::ConstantMaxSmi(symbol()->range()),
-             RangeBoundary::FromConstant(offset_),
-             PositiveInfinity());
+             RangeBoundary::FromConstant(offset_), PositiveInfinity());
 }
 
 
@@ -2038,8 +1988,7 @@
   int64_t limit = 64 - shift_count;
   int64_t value = value_boundary.ConstantValue();
 
-  if ((value == 0) ||
-      (shift_count == 0) ||
+  if ((value == 0) || (shift_count == 0) ||
       ((limit > 0) && Utils::IsInt(static_cast<int>(limit), value))) {
     // Result stays in 64 bit range.
     int64_t result = value << shift_count;
@@ -2186,9 +2135,7 @@
     return b;
   }
 
-  if (CanonicalizeForComparison(&a,
-                                &b,
-                                &CanonicalizeMinBoundary,
+  if (CanonicalizeForComparison(&a, &b, &CanonicalizeMinBoundary,
                                 RangeBoundary::NegativeInfinity())) {
     return (a.offset() <= b.offset()) ? a : b;
   }
@@ -2215,9 +2162,7 @@
     return b;
   }
 
-  if (CanonicalizeForComparison(&a,
-                                &b,
-                                &CanonicalizeMaxBoundary,
+  if (CanonicalizeForComparison(&a, &b, &CanonicalizeMaxBoundary,
                                 RangeBoundary::PositiveInfinity())) {
     return (a.offset() >= b.offset()) ? a : b;
   }
@@ -2251,9 +2196,7 @@
     return a;
   }
 
-  if (CanonicalizeForComparison(&a,
-                                &b,
-                                &CanonicalizeMinBoundary,
+  if (CanonicalizeForComparison(&a, &b, &CanonicalizeMinBoundary,
                                 RangeBoundary::NegativeInfinity())) {
     return (a.offset() >= b.offset()) ? a : b;
   }
@@ -2279,9 +2222,7 @@
     return a;
   }
 
-  if (CanonicalizeForComparison(&a,
-                                &b,
-                                &CanonicalizeMaxBoundary,
+  if (CanonicalizeForComparison(&a, &b, &CanonicalizeMaxBoundary,
                                 RangeBoundary::PositiveInfinity())) {
     return (a.offset() <= b.offset()) ? a : b;
   }
@@ -2307,31 +2248,30 @@
 bool Range::OnlyLessThanOrEqualTo(int64_t val) const {
   const RangeBoundary upper_bound = max().UpperBound();
   return !upper_bound.IsPositiveInfinity() &&
-      (upper_bound.ConstantValue() <= val);
+         (upper_bound.ConstantValue() <= val);
 }
 
 
 bool Range::OnlyGreaterThanOrEqualTo(int64_t val) const {
   const RangeBoundary lower_bound = min().LowerBound();
   return !lower_bound.IsNegativeInfinity() &&
-      (lower_bound.ConstantValue() >= val);
+         (lower_bound.ConstantValue() >= val);
 }
 
 
 // Inclusive.
 bool Range::IsWithin(int64_t min_int, int64_t max_int) const {
-  return OnlyGreaterThanOrEqualTo(min_int) &&
-      OnlyLessThanOrEqualTo(max_int);
+  return OnlyGreaterThanOrEqualTo(min_int) && OnlyLessThanOrEqualTo(max_int);
 }
 
 
 bool Range::Overlaps(int64_t min_int, int64_t max_int) const {
   RangeBoundary lower = min().LowerBound();
   RangeBoundary upper = max().UpperBound();
-  const int64_t this_min = lower.IsNegativeInfinity() ?
-      RangeBoundary::kMin : lower.ConstantValue();
-  const int64_t this_max = upper.IsPositiveInfinity() ?
-      RangeBoundary::kMax : upper.ConstantValue();
+  const int64_t this_min =
+      lower.IsNegativeInfinity() ? RangeBoundary::kMin : lower.ConstantValue();
+  const int64_t this_max =
+      upper.IsPositiveInfinity() ? RangeBoundary::kMax : upper.ConstantValue();
   if ((this_min <= min_int) && (min_int <= this_max)) return true;
   if ((this_min <= max_int) && (max_int <= this_max)) return true;
   if ((min_int < this_min) && (max_int > this_max)) return true;
@@ -2378,18 +2318,14 @@
                                      static_cast<int64_t>(0));
 
   *result_min = RangeBoundary::Shl(
-      left_min,
-      left_min.ConstantValue() > 0 ? right_min : right_max,
-      left_min.ConstantValue() > 0
-          ? RangeBoundary::PositiveInfinity()
-          : RangeBoundary::NegativeInfinity());
+      left_min, left_min.ConstantValue() > 0 ? right_min : right_max,
+      left_min.ConstantValue() > 0 ? RangeBoundary::PositiveInfinity()
+                                   : RangeBoundary::NegativeInfinity());
 
   *result_max = RangeBoundary::Shl(
-      left_max,
-      left_max.ConstantValue() > 0 ? right_max : right_min,
-      left_max.ConstantValue() > 0
-          ? RangeBoundary::PositiveInfinity()
-          : RangeBoundary::NegativeInfinity());
+      left_max, left_max.ConstantValue() > 0 ? right_max : right_min,
+      left_max.ConstantValue() > 0 ? RangeBoundary::PositiveInfinity()
+                                   : RangeBoundary::NegativeInfinity());
 }
 
 
@@ -2407,12 +2343,10 @@
                                      static_cast<int64_t>(0));
 
   *result_min = RangeBoundary::Shr(
-      left_min,
-      left_min.ConstantValue() > 0 ? right_max : right_min);
+      left_min, left_min.ConstantValue() > 0 ? right_max : right_min);
 
   *result_max = RangeBoundary::Shr(
-      left_max,
-      left_max.ConstantValue() > 0 ? right_min : right_max);
+      left_max, left_max.ConstantValue() > 0 ? right_min : right_max);
 }
 
 
@@ -2452,18 +2386,17 @@
                       const Range* right_range,
                       RangeBoundary* result_min,
                       RangeBoundary* result_max) {
-  const int bitsize =
-      Utils::Maximum(BitSize(left_range), BitSize(right_range));
+  const int bitsize = Utils::Maximum(BitSize(left_range), BitSize(right_range));
 
   if (left_range->IsPositive() && right_range->IsPositive()) {
     *result_min = RangeBoundary::FromConstant(0);
   } else {
-    *result_min = RangeBoundary::FromConstant(
-        static_cast<int64_t>(-1) << bitsize);
+    *result_min =
+        RangeBoundary::FromConstant(static_cast<int64_t>(-1) << bitsize);
   }
 
-  *result_max = RangeBoundary::FromConstant(
-      (static_cast<uint64_t>(1) << bitsize) - 1);
+  *result_max =
+      RangeBoundary::FromConstant((static_cast<uint64_t>(1) << bitsize) - 1);
 }
 
 
@@ -2486,13 +2419,13 @@
   ASSERT(result_min != NULL);
   ASSERT(result_max != NULL);
 
-  RangeBoundary left_min =
-    IsArrayLength(left_defn) ?
-        RangeBoundary::FromDefinition(left_defn) : left_range->min();
+  RangeBoundary left_min = IsArrayLength(left_defn)
+                               ? RangeBoundary::FromDefinition(left_defn)
+                               : left_range->min();
 
-  RangeBoundary left_max =
-    IsArrayLength(left_defn) ?
-        RangeBoundary::FromDefinition(left_defn) : left_range->max();
+  RangeBoundary left_max = IsArrayLength(left_defn)
+                               ? RangeBoundary::FromDefinition(left_defn)
+                               : left_range->max();
 
   if (!RangeBoundary::SymbolicAdd(left_min, right_range->min(), result_min)) {
     *result_min = RangeBoundary::Add(left_range->min().LowerBound(),
@@ -2517,18 +2450,18 @@
   ASSERT(result_min != NULL);
   ASSERT(result_max != NULL);
 
-  RangeBoundary left_min =
-    IsArrayLength(left_defn) ?
-        RangeBoundary::FromDefinition(left_defn) : left_range->min();
+  RangeBoundary left_min = IsArrayLength(left_defn)
+                               ? RangeBoundary::FromDefinition(left_defn)
+                               : left_range->min();
 
-  RangeBoundary left_max =
-    IsArrayLength(left_defn) ?
-        RangeBoundary::FromDefinition(left_defn) : left_range->max();
+  RangeBoundary left_max = IsArrayLength(left_defn)
+                               ? RangeBoundary::FromDefinition(left_defn)
+                               : left_range->max();
 
   if (!RangeBoundary::SymbolicSub(left_min, right_range->max(), result_min)) {
     *result_min = RangeBoundary::Sub(left_range->min().LowerBound(),
-                              right_range->max().UpperBound(),
-                              RangeBoundary::NegativeInfinity());
+                                     right_range->max().UpperBound(),
+                                     RangeBoundary::NegativeInfinity());
   }
   if (!RangeBoundary::SymbolicSub(left_max, right_range->min(), result_max)) {
     *result_max = RangeBoundary::Sub(left_range->max().UpperBound(),
@@ -2815,17 +2748,15 @@
   const RangeBoundary::RangeSize size = RangeSizeForPhi(this);
   for (intptr_t i = 0; i < InputCount(); i++) {
     Value* input = InputAt(i);
-    Join(range,
-         input->definition(),
-         GetInputRange(analysis, size, input),
+    Join(range, input->definition(), GetInputRange(analysis, size, input),
          size);
   }
 
   BlockEntryInstr* phi_block = GetBlock();
-  range->set_min(EnsureAcyclicSymbol(
-      phi_block, range->min(), RangeBoundary::MinSmi()));
-  range->set_max(EnsureAcyclicSymbol(
-      phi_block, range->max(), RangeBoundary::MaxSmi()));
+  range->set_min(
+      EnsureAcyclicSymbol(phi_block, range->min(), RangeBoundary::MinSmi()));
+  range->set_max(
+      EnsureAcyclicSymbol(phi_block, range->max(), RangeBoundary::MaxSmi()));
 }
 
 
@@ -2889,7 +2820,6 @@
 }
 
 
-
 void LoadIndexedInstr::InferRange(RangeAnalysis* analysis, Range* range) {
   switch (class_id()) {
     case kTypedDataInt8ArrayCid:
@@ -2954,8 +2884,8 @@
 void IfThenElseInstr::InferRange(RangeAnalysis* analysis, Range* range) {
   const intptr_t min = Utils::Minimum(if_true_, if_false_);
   const intptr_t max = Utils::Maximum(if_true_, if_false_);
-  *range = Range(RangeBoundary::FromConstant(min),
-                 RangeBoundary::FromConstant(max));
+  *range =
+      Range(RangeBoundary::FromConstant(min), RangeBoundary::FromConstant(max));
 }
 
 
@@ -2983,10 +2913,7 @@
     return;
   }
 
-  Range::BinaryOp(op_kind(),
-                  left_range,
-                  right_range,
-                  left()->definition(),
+  Range::BinaryOp(op_kind(), left_range, right_range, left()->definition(),
                   range);
   ASSERT(!Range::IsUnknown(range));
 
@@ -3006,29 +2933,25 @@
 void BinarySmiOpInstr::InferRange(RangeAnalysis* analysis, Range* range) {
   // TODO(vegorov) completely remove this once GetSmiRange is eliminated.
   InferRangeHelper(analysis->GetSmiRange(left()),
-                   analysis->GetSmiRange(right()),
-                   range);
+                   analysis->GetSmiRange(right()), range);
 }
 
 
 void BinaryInt32OpInstr::InferRange(RangeAnalysis* analysis, Range* range) {
   InferRangeHelper(analysis->GetSmiRange(left()),
-                   analysis->GetSmiRange(right()),
-                   range);
+                   analysis->GetSmiRange(right()), range);
 }
 
 
 void BinaryMintOpInstr::InferRange(RangeAnalysis* analysis, Range* range) {
   InferRangeHelper(left()->definition()->range(),
-                   right()->definition()->range(),
-                   range);
+                   right()->definition()->range(), range);
 }
 
 
 void ShiftMintOpInstr::InferRange(RangeAnalysis* analysis, Range* range) {
   InferRangeHelper(left()->definition()->range(),
-                   right()->definition()->range(),
-                   range);
+                   right()->definition()->range(), range);
 }
 
 
@@ -3096,11 +3019,9 @@
 
 void UnboxedIntConverterInstr::InferRange(RangeAnalysis* analysis,
                                           Range* range) {
-  ASSERT((from() == kUnboxedInt32) ||
-         (from() == kUnboxedMint) ||
+  ASSERT((from() == kUnboxedInt32) || (from() == kUnboxedMint) ||
          (from() == kUnboxedUint32));
-  ASSERT((to() == kUnboxedInt32) ||
-         (to() == kUnboxedMint) ||
+  ASSERT((to() == kUnboxedInt32) || (to() == kUnboxedMint) ||
          (to() == kUnboxedUint32));
   const Range* value_range = value()->definition()->range();
   if (Range::IsUnknown(value_range)) {
@@ -3109,9 +3030,9 @@
 
   if (to() == kUnboxedUint32) {
     // TODO(vegorov): improve range information for unboxing to Uint32.
-    *range = Range(
-        RangeBoundary::FromConstant(0),
-        RangeBoundary::FromConstant(static_cast<int64_t>(kMaxUint32)));
+    *range =
+        Range(RangeBoundary::FromConstant(0),
+              RangeBoundary::FromConstant(static_cast<int64_t>(kMaxUint32)));
   } else {
     *range = *value_range;
     if (to() == kUnboxedInt32) {
diff --git a/runtime/vm/flow_graph_range_analysis.h b/runtime/vm/flow_graph_range_analysis.h
index a1e1ba3..8dce8de 100644
--- a/runtime/vm/flow_graph_range_analysis.h
+++ b/runtime/vm/flow_graph_range_analysis.h
@@ -26,16 +26,16 @@
     kRangeBoundaryInt64,
   };
 
-  RangeBoundary() : kind_(kUnknown), value_(0), offset_(0) { }
+  RangeBoundary() : kind_(kUnknown), value_(0), offset_(0) {}
 
   RangeBoundary(const RangeBoundary& other)
       : ValueObject(),
         kind_(other.kind_),
         value_(other.value_),
-        offset_(other.offset_) { }
+        offset_(other.offset_) {}
 
   explicit RangeBoundary(int64_t val)
-      : kind_(kConstant), value_(val), offset_(0) { }
+      : kind_(kConstant), value_(val), offset_(0) {}
 
   RangeBoundary& operator=(const RangeBoundary& other) {
     kind_ = other.kind_;
@@ -48,9 +48,7 @@
   static const int64_t kMax = kMaxInt64;
 
   // Construct a RangeBoundary for a constant value.
-  static RangeBoundary FromConstant(int64_t val) {
-    return RangeBoundary(val);
-  }
+  static RangeBoundary FromConstant(int64_t val) { return RangeBoundary(val); }
 
   // Construct a RangeBoundary for -inf.
   static RangeBoundary NegativeInfinity() {
@@ -66,24 +64,16 @@
   static RangeBoundary FromDefinition(Definition* defn, int64_t offs = 0);
 
   // Construct a RangeBoundary for the constant MinSmi value.
-  static RangeBoundary MinSmi() {
-    return FromConstant(Smi::kMinValue);
-  }
+  static RangeBoundary MinSmi() { return FromConstant(Smi::kMinValue); }
 
   // Construct a RangeBoundary for the constant MaxSmi value.
-  static RangeBoundary MaxSmi() {
-    return FromConstant(Smi::kMaxValue);
-  }
+  static RangeBoundary MaxSmi() { return FromConstant(Smi::kMaxValue); }
 
   // Construct a RangeBoundary for the constant kMin value.
-  static RangeBoundary MinConstant() {
-    return FromConstant(kMin);
-  }
+  static RangeBoundary MinConstant() { return FromConstant(kMin); }
 
   // Construct a RangeBoundary for the constant kMax value.
-  static RangeBoundary MaxConstant() {
-    return FromConstant(kMax);
-  }
+  static RangeBoundary MaxConstant() { return FromConstant(kMax); }
 
   // Construct a RangeBoundary for the constant kMin value.
   static RangeBoundary MinConstant(RangeSize size) {
@@ -156,9 +146,7 @@
   }
 
   // Returns true if this outside mint range.
-  bool OverflowedMint() const {
-    return IsInfinity();
-  }
+  bool OverflowedMint() const { return IsInfinity(); }
 
   // -/+ infinity are clamped to MinConstant/MaxConstant of the given type.
   RangeBoundary Clamp(RangeSize size) const {
@@ -189,19 +177,17 @@
 
   bool IsMinimumOrBelow(RangeSize size) const {
     return IsNegativeInfinity() ||
-        (IsConstant() &&
-         (ConstantValue() <= RangeBoundary::MinConstant(size).ConstantValue()));
+           (IsConstant() && (ConstantValue() <=
+                             RangeBoundary::MinConstant(size).ConstantValue()));
   }
 
   bool IsMaximumOrAbove(RangeSize size) const {
     return IsPositiveInfinity() ||
-        (IsConstant() &&
-         (ConstantValue() >= RangeBoundary::MaxConstant(size).ConstantValue()));
+           (IsConstant() && (ConstantValue() >=
+                             RangeBoundary::MaxConstant(size).ConstantValue()));
   }
 
-  intptr_t kind() const {
-    return kind_;
-  }
+  intptr_t kind() const { return kind_; }
 
   // Kind tests.
   bool IsUnknown() const { return kind_ == kUnknown; }
@@ -212,9 +198,7 @@
   bool IsInfinity() const {
     return IsNegativeInfinity() || IsPositiveInfinity();
   }
-  bool IsConstantOrInfinity() const {
-    return IsConstant() || IsInfinity();
-  }
+  bool IsConstantOrInfinity() const { return IsConstant() || IsInfinity(); }
 
   // Returns the value of a kConstant RangeBoundary.
   int64_t ConstantValue() const;
@@ -226,9 +210,7 @@
   }
 
   // Offset from symbol.
-  int64_t offset() const {
-    return offset_;
-  }
+  int64_t offset() const { return offset_; }
 
   // Computes the LowerBound of this. Three cases:
   // IsInfinity() -> NegativeInfinity().
@@ -291,17 +273,13 @@
     return LowerBound().Clamp(size).ConstantValue();
   }
 
-  int64_t SmiUpperBound() const {
-    return UpperBound(kRangeBoundarySmi);
-  }
+  int64_t SmiUpperBound() const { return UpperBound(kRangeBoundarySmi); }
 
-  int64_t SmiLowerBound() const {
-    return LowerBound(kRangeBoundarySmi);
-  }
+  int64_t SmiLowerBound() const { return LowerBound(kRangeBoundarySmi); }
 
  private:
   RangeBoundary(Kind kind, int64_t value, int64_t offset)
-      : kind_(kind), value_(value), offset_(offset) { }
+      : kind_(kind), value_(value), offset_(offset) {}
 
   Kind kind_;
   int64_t value_;
@@ -311,16 +289,13 @@
 
 class Range : public ZoneAllocated {
  public:
-  Range() : min_(), max_() { }
+  Range() : min_(), max_() {}
   Range(RangeBoundary min, RangeBoundary max) : min_(min), max_(max) {
     ASSERT(min_.IsUnknown() == max_.IsUnknown());
   }
 
   Range(const Range& other)
-      : ZoneAllocated(),
-        min_(other.min_),
-        max_(other.max_) {
-  }
+      : ZoneAllocated(), min_(other.min_), max_(other.max_) {}
 
   Range& operator=(const Range& other) {
     min_ = other.min_;
@@ -348,18 +323,13 @@
     if (other == NULL) {
       return min_.IsUnknown();
     }
-    return min_.Equals(other->min_) &&
-        max_.Equals(other->max_);
+    return min_.Equals(other->min_) && max_.Equals(other->max_);
   }
 
   const RangeBoundary& min() const { return min_; }
   const RangeBoundary& max() const { return max_; }
-  void set_min(const RangeBoundary& value) {
-    min_ = value;
-  }
-  void set_max(const RangeBoundary& value) {
-    max_ = value;
-  }
+  void set_min(const RangeBoundary& value) { min_ = value; }
+  void set_max(const RangeBoundary& value) { max_ = value; }
 
   static RangeBoundary ConstantMinSmi(const Range* range) {
     return ConstantMin(range, RangeBoundary::kRangeBoundarySmi);
@@ -411,9 +381,7 @@
 
   bool IsUnsatisfiable() const;
 
-  bool IsFinite() const {
-    return !min_.IsInfinity() && !max_.IsInfinity();
-  }
+  bool IsFinite() const { return !min_.IsInfinity() && !max_.IsInfinity(); }
 
   Range Intersect(const Range* other) const {
     return Range(RangeBoundary::IntersectionMin(min(), other->min()),
@@ -488,7 +456,7 @@
 };
 
 
-class RangeUtils : public AllStatic  {
+class RangeUtils : public AllStatic {
  public:
   static bool Fits(Range* range, RangeBoundary::RangeSize size) {
     return !Range::IsUnknown(range) && range->Fits(size);
@@ -510,7 +478,7 @@
   explicit RangeAnalysis(FlowGraph* flow_graph)
       : flow_graph_(flow_graph),
         smi_range_(Range::Full(RangeBoundary::kRangeBoundarySmi)),
-        int64_range_(Range::Full(RangeBoundary::kRangeBoundaryInt64)) { }
+        int64_range_(Range::Full(RangeBoundary::kRangeBoundaryInt64)) {}
 
   // Infer ranges for all values and remove overflow checks from binary smi
   // operations when proven redundant.
@@ -534,11 +502,7 @@
   void AssignRangesRecursively(Definition* defn);
 
  private:
-  enum JoinOperator {
-    NONE,
-    WIDEN,
-    NARROW
-  };
+  enum JoinOperator { NONE, WIDEN, NARROW };
   static char OpPrefix(JoinOperator op);
 
   // Collect all values that were proven to be smi in smi_values_ array and all
diff --git a/runtime/vm/flow_graph_range_analysis_test.cc b/runtime/vm/flow_graph_range_analysis_test.cc
index 7ebd6b4..a15cea6 100644
--- a/runtime/vm/flow_graph_range_analysis_test.cc
+++ b/runtime/vm/flow_graph_range_analysis_test.cc
@@ -8,18 +8,14 @@
 namespace dart {
 
 TEST_CASE(RangeTests) {
-  Range* zero = new Range(
-      RangeBoundary::FromConstant(0),
-      RangeBoundary::FromConstant(0));
-  Range* positive = new Range(
-      RangeBoundary::FromConstant(0),
-      RangeBoundary::FromConstant(100));
-  Range* negative = new Range(
-      RangeBoundary::FromConstant(-1),
-      RangeBoundary::FromConstant(-100));
-  Range* range_x = new Range(
-      RangeBoundary::FromConstant(-15),
-      RangeBoundary::FromConstant(100));
+  Range* zero =
+      new Range(RangeBoundary::FromConstant(0), RangeBoundary::FromConstant(0));
+  Range* positive = new Range(RangeBoundary::FromConstant(0),
+                              RangeBoundary::FromConstant(100));
+  Range* negative = new Range(RangeBoundary::FromConstant(-1),
+                              RangeBoundary::FromConstant(-100));
+  Range* range_x = new Range(RangeBoundary::FromConstant(-15),
+                             RangeBoundary::FromConstant(100));
   EXPECT(positive->IsPositive());
   EXPECT(zero->Overlaps(0, 0));
   EXPECT(positive->Overlaps(0, 0));
@@ -29,15 +25,14 @@
   EXPECT(!range_x->IsWithin(-15, 99));
   EXPECT(!range_x->IsWithin(-14, 100));
 
-#define TEST_RANGE_OP_(Op, l_min, l_max, r_min, r_max, Clamp, res_min, res_max)\
+#define TEST_RANGE_OP_(Op, l_min, l_max, r_min, r_max, Clamp, res_min,         \
+                       res_max)                                                \
   {                                                                            \
     RangeBoundary min, max;                                                    \
-    Range* left_range = new Range(                                             \
-      RangeBoundary::FromConstant(l_min),                                      \
-      RangeBoundary::FromConstant(l_max));                                     \
-    Range* shift_range = new Range(                                            \
-      RangeBoundary::FromConstant(r_min),                                      \
-      RangeBoundary::FromConstant(r_max));                                     \
+    Range* left_range = new Range(RangeBoundary::FromConstant(l_min),          \
+                                  RangeBoundary::FromConstant(l_max));         \
+    Range* shift_range = new Range(RangeBoundary::FromConstant(r_min),         \
+                                   RangeBoundary::FromConstant(r_max));        \
     Op(left_range, shift_range, &min, &max);                                   \
     min = Clamp(min);                                                          \
     max = Clamp(max);                                                          \
@@ -53,52 +48,44 @@
 
 #define NO_CLAMP(b) (b)
 #define TEST_RANGE_OP(Op, l_min, l_max, r_min, r_max, result_min, result_max)  \
-  TEST_RANGE_OP_(Op, l_min, l_max, r_min, r_max,                               \
-                 NO_CLAMP, result_min, result_max)
+  TEST_RANGE_OP_(Op, l_min, l_max, r_min, r_max, NO_CLAMP, result_min,         \
+                 result_max)
 
 #define CLAMP_TO_SMI(b) (b.Clamp(RangeBoundary::kRangeBoundarySmi))
 #define TEST_RANGE_OP_SMI(Op, l_min, l_max, r_min, r_max, res_min, res_max)    \
-  TEST_RANGE_OP_(Op, l_min, l_max, r_min, r_max,                               \
-                 CLAMP_TO_SMI, res_min, res_max)
+  TEST_RANGE_OP_(Op, l_min, l_max, r_min, r_max, CLAMP_TO_SMI, res_min, res_max)
 
-  TEST_RANGE_OP(Range::Shl, -15, 100, 0, 2,
-                RangeBoundary(-60), RangeBoundary(400));
-  TEST_RANGE_OP(Range::Shl, -15, 100, -2, 2,
-                RangeBoundary(-60), RangeBoundary(400));
-  TEST_RANGE_OP(Range::Shl, -15, -10, 1, 2,
-                RangeBoundary(-60), RangeBoundary(-20));
-  TEST_RANGE_OP(Range::Shl, 5, 10, -2, 2,
-                RangeBoundary(5), RangeBoundary(40));
-  TEST_RANGE_OP(Range::Shl, -15, 100, 0, 64,
-                RangeBoundary::NegativeInfinity(),
+  TEST_RANGE_OP(Range::Shl, -15, 100, 0, 2, RangeBoundary(-60),
+                RangeBoundary(400));
+  TEST_RANGE_OP(Range::Shl, -15, 100, -2, 2, RangeBoundary(-60),
+                RangeBoundary(400));
+  TEST_RANGE_OP(Range::Shl, -15, -10, 1, 2, RangeBoundary(-60),
+                RangeBoundary(-20));
+  TEST_RANGE_OP(Range::Shl, 5, 10, -2, 2, RangeBoundary(5), RangeBoundary(40));
+  TEST_RANGE_OP(Range::Shl, -15, 100, 0, 64, RangeBoundary::NegativeInfinity(),
                 RangeBoundary::PositiveInfinity());
-  TEST_RANGE_OP(Range::Shl, -1, 1, 63, 63,
-                RangeBoundary(kMinInt64),
+  TEST_RANGE_OP(Range::Shl, -1, 1, 63, 63, RangeBoundary(kMinInt64),
                 RangeBoundary::PositiveInfinity());
   if (kBitsPerWord == 64) {
-    TEST_RANGE_OP_SMI(Range::Shl, -1, 1, 62, 62,
-                  RangeBoundary(kSmiMin),
-                  RangeBoundary(kSmiMax));
-    TEST_RANGE_OP_SMI(Range::Shl, -1, 1, 30, 30,
-                  RangeBoundary(-(1 << 30)),
-                  RangeBoundary(1 << 30));
+    TEST_RANGE_OP_SMI(Range::Shl, -1, 1, 62, 62, RangeBoundary(kSmiMin),
+                      RangeBoundary(kSmiMax));
+    TEST_RANGE_OP_SMI(Range::Shl, -1, 1, 30, 30, RangeBoundary(-(1 << 30)),
+                      RangeBoundary(1 << 30));
   } else {
-    TEST_RANGE_OP_SMI(Range::Shl, -1, 1, 30, 30,
-                  RangeBoundary(kSmiMin),
-                  RangeBoundary(kSmiMax));
-    TEST_RANGE_OP_SMI(Range::Shl, -1, 1, 62, 62,
-                  RangeBoundary(kSmiMin),
-                  RangeBoundary(kSmiMax));
+    TEST_RANGE_OP_SMI(Range::Shl, -1, 1, 30, 30, RangeBoundary(kSmiMin),
+                      RangeBoundary(kSmiMax));
+    TEST_RANGE_OP_SMI(Range::Shl, -1, 1, 62, 62, RangeBoundary(kSmiMin),
+                      RangeBoundary(kSmiMax));
   }
-  TEST_RANGE_OP(Range::Shl, 0, 100, 0, 64,
-                RangeBoundary(0), RangeBoundary::PositiveInfinity());
-  TEST_RANGE_OP(Range::Shl, -100, 0, 0, 64,
-                RangeBoundary::NegativeInfinity(), RangeBoundary(0));
+  TEST_RANGE_OP(Range::Shl, 0, 100, 0, 64, RangeBoundary(0),
+                RangeBoundary::PositiveInfinity());
+  TEST_RANGE_OP(Range::Shl, -100, 0, 0, 64, RangeBoundary::NegativeInfinity(),
+                RangeBoundary(0));
 
   TEST_RANGE_OP(Range::Shr, -8, 8, 1, 2, RangeBoundary(-4), RangeBoundary(4));
   TEST_RANGE_OP(Range::Shr, 1, 8, 1, 2, RangeBoundary(0), RangeBoundary(4));
-  TEST_RANGE_OP(Range::Shr, -16, -8, 1, 2,
-                RangeBoundary(-8), RangeBoundary(-2));
+  TEST_RANGE_OP(Range::Shr, -16, -8, 1, 2, RangeBoundary(-8),
+                RangeBoundary(-2));
   TEST_RANGE_OP(Range::Shr, 2, 4, -1, 1, RangeBoundary(1), RangeBoundary(4));
   TEST_RANGE_OP(Range::Shr, kMaxInt64, kMaxInt64, 0, 1,
                 RangeBoundary(kMaxInt64 >> 1), RangeBoundary(kMaxInt64));
@@ -232,10 +219,9 @@
   EXPECT(Range::ConstantAbsMax(&range_i) == 1);
 
   // RangeBOundary.Equals.
-  EXPECT(RangeBoundary::FromConstant(1).Equals(
-      RangeBoundary::FromConstant(1)));
-  EXPECT(!RangeBoundary::FromConstant(2).Equals(
-      RangeBoundary::FromConstant(1)));
+  EXPECT(RangeBoundary::FromConstant(1).Equals(RangeBoundary::FromConstant(1)));
+  EXPECT(
+      !RangeBoundary::FromConstant(2).Equals(RangeBoundary::FromConstant(1)));
   EXPECT(RangeBoundary::PositiveInfinity().Equals(
       RangeBoundary::PositiveInfinity()));
   EXPECT(!RangeBoundary::PositiveInfinity().Equals(
@@ -267,11 +253,7 @@
 
   {
     Range result;
-    Range::BinaryOp(Token::kADD,
-                    range_a,
-                    range_b,
-                    NULL,
-                    &result);
+    Range::BinaryOp(Token::kADD, range_a, range_b, NULL, &result);
     ASSERT(!Range::IsUnknown(&result));
     EXPECT(result.min().IsNegativeInfinity());
     EXPECT(result.max().IsPositiveInfinity());
@@ -280,16 +262,12 @@
   // Test that [5, 10] + [0, 5] = [5, 15].
   Range* range_c = new Range(RangeBoundary::FromConstant(5),
                              RangeBoundary::FromConstant(10));
-  Range* range_d = new Range(RangeBoundary::FromConstant(0),
-                             RangeBoundary::FromConstant(5));
+  Range* range_d =
+      new Range(RangeBoundary::FromConstant(0), RangeBoundary::FromConstant(5));
 
   {
     Range result;
-    Range::BinaryOp(Token::kADD,
-                    range_c,
-                    range_d,
-                    NULL,
-                    &result);
+    Range::BinaryOp(Token::kADD, range_c, range_d, NULL, &result);
     ASSERT(!Range::IsUnknown(&result));
     EXPECT(result.min().ConstantValue() == 5);
     EXPECT(result.max().ConstantValue() == 15);
@@ -302,11 +280,7 @@
                              RangeBoundary::FromConstant(0xf));
   {
     Range result;
-    Range::BinaryOp(Token::kBIT_AND,
-                    range_e,
-                    range_f,
-                    NULL,
-                    &result);
+    Range::BinaryOp(Token::kBIT_AND, range_e, range_f, NULL, &result);
     ASSERT(!Range::IsUnknown(&result));
     EXPECT(result.min().ConstantValue() == 0x0);
     EXPECT(result.max().ConstantValue() == 0xf);
@@ -318,12 +292,10 @@
 #define TEST_RANGE_ADD(l_min, l_max, r_min, r_max, result_min, result_max)     \
   {                                                                            \
     RangeBoundary min, max;                                                    \
-    Range* left_range = new Range(                                             \
-      RangeBoundary::FromConstant(l_min),                                      \
-      RangeBoundary::FromConstant(l_max));                                     \
-    Range* right_range = new Range(                                            \
-      RangeBoundary::FromConstant(r_min),                                      \
-      RangeBoundary::FromConstant(r_max));                                     \
+    Range* left_range = new Range(RangeBoundary::FromConstant(l_min),          \
+                                  RangeBoundary::FromConstant(l_max));         \
+    Range* right_range = new Range(RangeBoundary::FromConstant(r_min),         \
+                                   RangeBoundary::FromConstant(r_max));        \
     EXPECT(left_range->min().ConstantValue() == l_min);                        \
     EXPECT(left_range->max().ConstantValue() == l_max);                        \
     EXPECT(right_range->min().ConstantValue() == r_min);                       \
@@ -341,68 +313,56 @@
 
   // [kMaxInt32, kMaxInt32 + 15] + [10, 20] = [kMaxInt32 + 10, kMaxInt32 + 35].
   TEST_RANGE_ADD(static_cast<int64_t>(kMaxInt32),
-                 static_cast<int64_t>(kMaxInt32) + 15,
-                 static_cast<int64_t>(10),
+                 static_cast<int64_t>(kMaxInt32) + 15, static_cast<int64_t>(10),
                  static_cast<int64_t>(20),
                  RangeBoundary(static_cast<int64_t>(kMaxInt32) + 10),
                  RangeBoundary(static_cast<int64_t>(kMaxInt32) + 35));
 
   // [kMaxInt32 - 15, kMaxInt32 + 15] + [15, -15] = [kMaxInt32, kMaxInt32].
   TEST_RANGE_ADD(static_cast<int64_t>(kMaxInt32) - 15,
-                 static_cast<int64_t>(kMaxInt32) + 15,
-                 static_cast<int64_t>(15),
+                 static_cast<int64_t>(kMaxInt32) + 15, static_cast<int64_t>(15),
                  static_cast<int64_t>(-15),
                  RangeBoundary(static_cast<int64_t>(kMaxInt32)),
                  RangeBoundary(static_cast<int64_t>(kMaxInt32)));
 
   // [kMaxInt32, kMaxInt32 + 15] + [10, kMaxInt64] = [kMaxInt32 + 10, +inf].
   TEST_RANGE_ADD(static_cast<int64_t>(kMaxInt32),
-                 static_cast<int64_t>(kMaxInt32) + 15,
-                 static_cast<int64_t>(10),
+                 static_cast<int64_t>(kMaxInt32) + 15, static_cast<int64_t>(10),
                  static_cast<int64_t>(kMaxInt64),
                  RangeBoundary(static_cast<int64_t>(kMaxInt32) + 10),
                  RangeBoundary::PositiveInfinity());
 
   // [kMinInt64, kMaxInt32 + 15] + [10, 20] = [kMinInt64 + 10, kMaxInt32 + 35].
   TEST_RANGE_ADD(static_cast<int64_t>(kMinInt64),
-                 static_cast<int64_t>(kMaxInt32) + 15,
-                 static_cast<int64_t>(10),
+                 static_cast<int64_t>(kMaxInt32) + 15, static_cast<int64_t>(10),
                  static_cast<int64_t>(20),
                  RangeBoundary(static_cast<int64_t>(kMinInt64) + 10),
                  RangeBoundary(static_cast<int64_t>(kMaxInt32) + 35));
 
   // [0, 0] + [kMinInt64, kMaxInt64] = [kMinInt64, kMaxInt64].
-  TEST_RANGE_ADD(static_cast<int64_t>(0),
-                 static_cast<int64_t>(0),
+  TEST_RANGE_ADD(static_cast<int64_t>(0), static_cast<int64_t>(0),
                  static_cast<int64_t>(kMinInt64),
-                 static_cast<int64_t>(kMaxInt64),
-                 RangeBoundary(kMinInt64),
+                 static_cast<int64_t>(kMaxInt64), RangeBoundary(kMinInt64),
                  RangeBoundary(kMaxInt64));
 
   // Overflows.
 
   // [-1, 1] + [kMinInt64, kMaxInt64] = [-inf, +inf].
-  TEST_RANGE_ADD(static_cast<int64_t>(-1),
-                 static_cast<int64_t>(1),
-                 static_cast<int64_t>(kMinInt64),
-                 static_cast<int64_t>(kMaxInt64),
-                 RangeBoundary::NegativeInfinity(),
-                 RangeBoundary::PositiveInfinity());
+  TEST_RANGE_ADD(
+      static_cast<int64_t>(-1), static_cast<int64_t>(1),
+      static_cast<int64_t>(kMinInt64), static_cast<int64_t>(kMaxInt64),
+      RangeBoundary::NegativeInfinity(), RangeBoundary::PositiveInfinity());
 
   // [kMaxInt64, kMaxInt64] + [kMaxInt64, kMaxInt64] = [-inf, +inf].
-  TEST_RANGE_ADD(static_cast<int64_t>(kMaxInt64),
-                 static_cast<int64_t>(kMaxInt64),
-                 static_cast<int64_t>(kMaxInt64),
-                 static_cast<int64_t>(kMaxInt64),
-                 RangeBoundary::NegativeInfinity(),
-                 RangeBoundary::PositiveInfinity());
+  TEST_RANGE_ADD(
+      static_cast<int64_t>(kMaxInt64), static_cast<int64_t>(kMaxInt64),
+      static_cast<int64_t>(kMaxInt64), static_cast<int64_t>(kMaxInt64),
+      RangeBoundary::NegativeInfinity(), RangeBoundary::PositiveInfinity());
 
   // [kMaxInt64, kMaxInt64] + [1, 1] = [-inf, +inf].
   TEST_RANGE_ADD(static_cast<int64_t>(kMaxInt64),
-                 static_cast<int64_t>(kMaxInt64),
-                 static_cast<int64_t>(1),
-                 static_cast<int64_t>(1),
-                 RangeBoundary::NegativeInfinity(),
+                 static_cast<int64_t>(kMaxInt64), static_cast<int64_t>(1),
+                 static_cast<int64_t>(1), RangeBoundary::NegativeInfinity(),
                  RangeBoundary::PositiveInfinity());
 
 #undef TEST_RANGE_ADD
@@ -413,12 +373,10 @@
 #define TEST_RANGE_SUB(l_min, l_max, r_min, r_max, result_min, result_max)     \
   {                                                                            \
     RangeBoundary min, max;                                                    \
-    Range* left_range = new Range(                                             \
-      RangeBoundary::FromConstant(l_min),                                      \
-      RangeBoundary::FromConstant(l_max));                                     \
-    Range* right_range = new Range(                                            \
-      RangeBoundary::FromConstant(r_min),                                      \
-      RangeBoundary::FromConstant(r_max));                                     \
+    Range* left_range = new Range(RangeBoundary::FromConstant(l_min),          \
+                                  RangeBoundary::FromConstant(l_max));         \
+    Range* right_range = new Range(RangeBoundary::FromConstant(r_min),         \
+                                   RangeBoundary::FromConstant(r_max));        \
     EXPECT(left_range->min().ConstantValue() == l_min);                        \
     EXPECT(left_range->max().ConstantValue() == l_max);                        \
     EXPECT(right_range->min().ConstantValue() == r_min);                       \
@@ -436,34 +394,28 @@
 
   // [kMaxInt32, kMaxInt32 + 15] - [10, 20] = [kMaxInt32 - 20, kMaxInt32 + 5].
   TEST_RANGE_SUB(static_cast<int64_t>(kMaxInt32),
-                 static_cast<int64_t>(kMaxInt32) + 15,
-                 static_cast<int64_t>(10),
+                 static_cast<int64_t>(kMaxInt32) + 15, static_cast<int64_t>(10),
                  static_cast<int64_t>(20),
                  RangeBoundary(static_cast<int64_t>(kMaxInt32) - 20),
                  RangeBoundary(static_cast<int64_t>(kMaxInt32) + 5));
 
   // [kMintInt64, kMintInt64] - [1, 1] = [-inf, +inf].
   TEST_RANGE_SUB(static_cast<int64_t>(kMinInt64),
-                 static_cast<int64_t>(kMinInt64),
-                 static_cast<int64_t>(1),
-                 static_cast<int64_t>(1),
-                 RangeBoundary::NegativeInfinity(),
+                 static_cast<int64_t>(kMinInt64), static_cast<int64_t>(1),
+                 static_cast<int64_t>(1), RangeBoundary::NegativeInfinity(),
                  RangeBoundary::PositiveInfinity());
 
   // [1, 1] - [kMintInt64, kMintInt64] = [-inf, +inf].
-  TEST_RANGE_SUB(static_cast<int64_t>(1),
-                 static_cast<int64_t>(1),
-                 static_cast<int64_t>(kMinInt64),
-                 static_cast<int64_t>(kMinInt64),
-                 RangeBoundary::NegativeInfinity(),
-                 RangeBoundary::PositiveInfinity());
+  TEST_RANGE_SUB(
+      static_cast<int64_t>(1), static_cast<int64_t>(1),
+      static_cast<int64_t>(kMinInt64), static_cast<int64_t>(kMinInt64),
+      RangeBoundary::NegativeInfinity(), RangeBoundary::PositiveInfinity());
 
   // [kMaxInt32 + 10, kMaxInt32 + 20] - [-20, -20] =
   //     [kMaxInt32 + 30, kMaxInt32 + 40].
   TEST_RANGE_SUB(static_cast<int64_t>(kMaxInt32) + 10,
                  static_cast<int64_t>(kMaxInt32) + 20,
-                 static_cast<int64_t>(-20),
-                 static_cast<int64_t>(-20),
+                 static_cast<int64_t>(-20), static_cast<int64_t>(-20),
                  RangeBoundary(static_cast<int64_t>(kMaxInt32) + 30),
                  RangeBoundary(static_cast<int64_t>(kMaxInt32) + 40));
 
@@ -476,12 +428,10 @@
 #define TEST_RANGE_AND(l_min, l_max, r_min, r_max, result_min, result_max)     \
   {                                                                            \
     RangeBoundary min, max;                                                    \
-    Range* left_range = new Range(                                             \
-      RangeBoundary::FromConstant(l_min),                                      \
-      RangeBoundary::FromConstant(l_max));                                     \
-    Range* right_range = new Range(                                            \
-      RangeBoundary::FromConstant(r_min),                                      \
-      RangeBoundary::FromConstant(r_max));                                     \
+    Range* left_range = new Range(RangeBoundary::FromConstant(l_min),          \
+                                  RangeBoundary::FromConstant(l_max));         \
+    Range* right_range = new Range(RangeBoundary::FromConstant(r_min),         \
+                                   RangeBoundary::FromConstant(r_max));        \
     EXPECT(left_range->min().ConstantValue() == l_min);                        \
     EXPECT(left_range->max().ConstantValue() == l_max);                        \
     EXPECT(right_range->min().ConstantValue() == r_min);                       \
@@ -498,44 +448,32 @@
   }
 
   // [0xff, 0xfff] & [0xf, 0xf] = [0x0, 0xf].
-  TEST_RANGE_AND(static_cast<int64_t>(0xff),
-                 static_cast<int64_t>(0xfff),
-                 static_cast<int64_t>(0xf),
-                 static_cast<int64_t>(0xf),
-                 RangeBoundary(0),
-                 RangeBoundary(0xf));
+  TEST_RANGE_AND(static_cast<int64_t>(0xff), static_cast<int64_t>(0xfff),
+                 static_cast<int64_t>(0xf), static_cast<int64_t>(0xf),
+                 RangeBoundary(0), RangeBoundary(0xf));
 
   // [0xffffffff, 0xffffffff] & [0xfffffffff, 0xfffffffff] = [0x0, 0xfffffffff].
-  TEST_RANGE_AND(static_cast<int64_t>(0xffffffff),
-                 static_cast<int64_t>(0xffffffff),
-                 static_cast<int64_t>(0xfffffffff),
-                 static_cast<int64_t>(0xfffffffff),
-                 RangeBoundary(0),
-                 RangeBoundary(static_cast<int64_t>(0xfffffffff)));
+  TEST_RANGE_AND(
+      static_cast<int64_t>(0xffffffff), static_cast<int64_t>(0xffffffff),
+      static_cast<int64_t>(0xfffffffff), static_cast<int64_t>(0xfffffffff),
+      RangeBoundary(0), RangeBoundary(static_cast<int64_t>(0xfffffffff)));
 
   // [0xffffffff, 0xffffffff] & [-20, 20] = [0x0, 0xffffffff].
   TEST_RANGE_AND(static_cast<int64_t>(0xffffffff),
-                 static_cast<int64_t>(0xffffffff),
-                 static_cast<int64_t>(-20),
-                 static_cast<int64_t>(20),
-                 RangeBoundary(0),
+                 static_cast<int64_t>(0xffffffff), static_cast<int64_t>(-20),
+                 static_cast<int64_t>(20), RangeBoundary(0),
                  RangeBoundary(static_cast<int64_t>(0xffffffff)));
 
   // [-20, 20] & [0xffffffff, 0xffffffff] = [0x0, 0xffffffff].
-  TEST_RANGE_AND(static_cast<int64_t>(-20),
-                 static_cast<int64_t>(20),
+  TEST_RANGE_AND(static_cast<int64_t>(-20), static_cast<int64_t>(20),
                  static_cast<int64_t>(0xffffffff),
-                 static_cast<int64_t>(0xffffffff),
-                 RangeBoundary(0),
+                 static_cast<int64_t>(0xffffffff), RangeBoundary(0),
                  RangeBoundary(static_cast<int64_t>(0xffffffff)));
 
   // Test that [-20, 20] & [-20, 20] = [-32, 31].
-  TEST_RANGE_AND(static_cast<int64_t>(-20),
-                 static_cast<int64_t>(20),
-                 static_cast<int64_t>(-20),
-                 static_cast<int64_t>(20),
-                 RangeBoundary(-32),
-                 RangeBoundary(31));
+  TEST_RANGE_AND(static_cast<int64_t>(-20), static_cast<int64_t>(20),
+                 static_cast<int64_t>(-20), static_cast<int64_t>(20),
+                 RangeBoundary(-32), RangeBoundary(31));
 
 #undef TEST_RANGE_AND
 }
@@ -547,77 +485,77 @@
 
   // Constants.
   // MIN(0, 1) == 0
-  EXPECT(RangeBoundary::IntersectionMax(
-      RangeBoundary::FromConstant(0),
-      RangeBoundary::FromConstant(1)).ConstantValue() == 0);
+  EXPECT(RangeBoundary::IntersectionMax(RangeBoundary::FromConstant(0),
+                                        RangeBoundary::FromConstant(1))
+             .ConstantValue() == 0);
   // MIN(0, -1) == -1
-  EXPECT(RangeBoundary::IntersectionMax(
-      RangeBoundary::FromConstant(0),
-      RangeBoundary::FromConstant(-1)).ConstantValue() == -1);
+  EXPECT(RangeBoundary::IntersectionMax(RangeBoundary::FromConstant(0),
+                                        RangeBoundary::FromConstant(-1))
+             .ConstantValue() == -1);
 
   // MIN(1, 0) == 0
-  EXPECT(RangeBoundary::IntersectionMax(
-      RangeBoundary::FromConstant(1),
-      RangeBoundary::FromConstant(0)).ConstantValue() == 0);
+  EXPECT(RangeBoundary::IntersectionMax(RangeBoundary::FromConstant(1),
+                                        RangeBoundary::FromConstant(0))
+             .ConstantValue() == 0);
   // MIN(-1, 0) == -1
-  EXPECT(RangeBoundary::IntersectionMax(
-      RangeBoundary::FromConstant(-1),
-      RangeBoundary::FromConstant(0)).ConstantValue() == -1);
+  EXPECT(RangeBoundary::IntersectionMax(RangeBoundary::FromConstant(-1),
+                                        RangeBoundary::FromConstant(0))
+             .ConstantValue() == -1);
 
   // MAX(0, 1) == 1
-  EXPECT(RangeBoundary::IntersectionMin(
-      RangeBoundary::FromConstant(0),
-      RangeBoundary::FromConstant(1)).ConstantValue() == 1);
+  EXPECT(RangeBoundary::IntersectionMin(RangeBoundary::FromConstant(0),
+                                        RangeBoundary::FromConstant(1))
+             .ConstantValue() == 1);
 
   // MAX(0, -1) == 0
-  EXPECT(RangeBoundary::IntersectionMin(
-      RangeBoundary::FromConstant(0),
-      RangeBoundary::FromConstant(-1)).ConstantValue() == 0);
+  EXPECT(RangeBoundary::IntersectionMin(RangeBoundary::FromConstant(0),
+                                        RangeBoundary::FromConstant(-1))
+             .ConstantValue() == 0);
 
   // MAX(1, 0) == 1
-  EXPECT(RangeBoundary::IntersectionMin(
-      RangeBoundary::FromConstant(1),
-      RangeBoundary::FromConstant(0)).ConstantValue() == 1);
+  EXPECT(RangeBoundary::IntersectionMin(RangeBoundary::FromConstant(1),
+                                        RangeBoundary::FromConstant(0))
+             .ConstantValue() == 1);
   // MAX(-1, 0) == 0
-  EXPECT(RangeBoundary::IntersectionMin(
-      RangeBoundary::FromConstant(-1),
-      RangeBoundary::FromConstant(0)).ConstantValue() == 0);
+  EXPECT(RangeBoundary::IntersectionMin(RangeBoundary::FromConstant(-1),
+                                        RangeBoundary::FromConstant(0))
+             .ConstantValue() == 0);
 
   RangeBoundary n_infinity = RangeBoundary::NegativeInfinity();
   RangeBoundary p_infinity = RangeBoundary::PositiveInfinity();
 
   // Constants vs. infinity.
-  EXPECT(RangeBoundary::IntersectionMin(
-      n_infinity,
-      RangeBoundary::FromConstant(-1)).ConstantValue() == -1);
+  EXPECT(RangeBoundary::IntersectionMin(n_infinity,
+                                        RangeBoundary::FromConstant(-1))
+             .ConstantValue() == -1);
 
-  EXPECT(RangeBoundary::IntersectionMin(
-      RangeBoundary::FromConstant(-1),
-      n_infinity).ConstantValue() == -1);
+  EXPECT(RangeBoundary::IntersectionMin(RangeBoundary::FromConstant(-1),
+                                        n_infinity)
+             .ConstantValue() == -1);
 
-  EXPECT(RangeBoundary::IntersectionMin(
-      RangeBoundary::FromConstant(1),
-      n_infinity).ConstantValue() == 1);
+  EXPECT(
+      RangeBoundary::IntersectionMin(RangeBoundary::FromConstant(1), n_infinity)
+          .ConstantValue() == 1);
 
-  EXPECT(RangeBoundary::IntersectionMin(
-      n_infinity,
-      RangeBoundary::FromConstant(1)).ConstantValue() == 1);
+  EXPECT(
+      RangeBoundary::IntersectionMin(n_infinity, RangeBoundary::FromConstant(1))
+          .ConstantValue() == 1);
 
-  EXPECT(RangeBoundary::IntersectionMax(
-      p_infinity,
-      RangeBoundary::FromConstant(-1)).ConstantValue() == -1);
+  EXPECT(RangeBoundary::IntersectionMax(p_infinity,
+                                        RangeBoundary::FromConstant(-1))
+             .ConstantValue() == -1);
 
-  EXPECT(RangeBoundary::IntersectionMax(
-      RangeBoundary::FromConstant(-1),
-      p_infinity).ConstantValue() == -1);
+  EXPECT(RangeBoundary::IntersectionMax(RangeBoundary::FromConstant(-1),
+                                        p_infinity)
+             .ConstantValue() == -1);
 
-  EXPECT(RangeBoundary::IntersectionMax(
-      RangeBoundary::FromConstant(1),
-      p_infinity).ConstantValue() == 1);
+  EXPECT(
+      RangeBoundary::IntersectionMax(RangeBoundary::FromConstant(1), p_infinity)
+          .ConstantValue() == 1);
 
-  EXPECT(RangeBoundary::IntersectionMax(
-      p_infinity,
-      RangeBoundary::FromConstant(1)).ConstantValue() == 1);
+  EXPECT(
+      RangeBoundary::IntersectionMax(p_infinity, RangeBoundary::FromConstant(1))
+          .ConstantValue() == 1);
 }
 
 
@@ -627,82 +565,66 @@
   const RangeBoundary::RangeSize size = RangeBoundary::kRangeBoundarySmi;
 
   // Constants.
-  EXPECT(RangeBoundary::JoinMax(
-      RangeBoundary::FromConstant(0),
-      RangeBoundary::FromConstant(1),
-      size).ConstantValue() == 1);
-  EXPECT(RangeBoundary::JoinMax(
-      RangeBoundary::FromConstant(0),
-      RangeBoundary::FromConstant(-1),
-      size).ConstantValue() == 0);
-  EXPECT(RangeBoundary::JoinMax(
-      RangeBoundary::FromConstant(1),
-      RangeBoundary::FromConstant(0),
-      size).ConstantValue() == 1);
-  EXPECT(RangeBoundary::JoinMax(
-      RangeBoundary::FromConstant(-1),
-      RangeBoundary::FromConstant(0),
-      size).ConstantValue() == 0);
-  EXPECT(RangeBoundary::JoinMin(
-      RangeBoundary::FromConstant(0),
-      RangeBoundary::FromConstant(1),
-      size).ConstantValue() == 0);
-  EXPECT(RangeBoundary::JoinMin(
-      RangeBoundary::FromConstant(0),
-      RangeBoundary::FromConstant(-1),
-      size).ConstantValue() == -1);
-  EXPECT(RangeBoundary::JoinMin(
-      RangeBoundary::FromConstant(1),
-      RangeBoundary::FromConstant(0),
-      size).ConstantValue() == 0);
-  EXPECT(RangeBoundary::JoinMin(
-      RangeBoundary::FromConstant(-1),
-      RangeBoundary::FromConstant(0),
-      size).ConstantValue() == -1);
+  EXPECT(RangeBoundary::JoinMax(RangeBoundary::FromConstant(0),
+                                RangeBoundary::FromConstant(1), size)
+             .ConstantValue() == 1);
+  EXPECT(RangeBoundary::JoinMax(RangeBoundary::FromConstant(0),
+                                RangeBoundary::FromConstant(-1), size)
+             .ConstantValue() == 0);
+  EXPECT(RangeBoundary::JoinMax(RangeBoundary::FromConstant(1),
+                                RangeBoundary::FromConstant(0), size)
+             .ConstantValue() == 1);
+  EXPECT(RangeBoundary::JoinMax(RangeBoundary::FromConstant(-1),
+                                RangeBoundary::FromConstant(0), size)
+             .ConstantValue() == 0);
+  EXPECT(RangeBoundary::JoinMin(RangeBoundary::FromConstant(0),
+                                RangeBoundary::FromConstant(1), size)
+             .ConstantValue() == 0);
+  EXPECT(RangeBoundary::JoinMin(RangeBoundary::FromConstant(0),
+                                RangeBoundary::FromConstant(-1), size)
+             .ConstantValue() == -1);
+  EXPECT(RangeBoundary::JoinMin(RangeBoundary::FromConstant(1),
+                                RangeBoundary::FromConstant(0), size)
+             .ConstantValue() == 0);
+  EXPECT(RangeBoundary::JoinMin(RangeBoundary::FromConstant(-1),
+                                RangeBoundary::FromConstant(0), size)
+             .ConstantValue() == -1);
 
   RangeBoundary n_infinity = RangeBoundary::NegativeInfinity();
   RangeBoundary p_infinity = RangeBoundary::PositiveInfinity();
 
   // Constants vs. infinity.
-  EXPECT(RangeBoundary::JoinMin(
-      n_infinity,
-      RangeBoundary::FromConstant(-1),
-      size).IsMinimumOrBelow(size));
+  EXPECT(
+      RangeBoundary::JoinMin(n_infinity, RangeBoundary::FromConstant(-1), size)
+          .IsMinimumOrBelow(size));
 
-  EXPECT(RangeBoundary::JoinMin(
-      RangeBoundary::FromConstant(-1),
-      n_infinity,
-      size).IsMinimumOrBelow(size));
+  EXPECT(
+      RangeBoundary::JoinMin(RangeBoundary::FromConstant(-1), n_infinity, size)
+          .IsMinimumOrBelow(size));
 
-  EXPECT(RangeBoundary::JoinMin(
-      RangeBoundary::FromConstant(1),
-      n_infinity,
-      size).IsMinimumOrBelow(size));
+  EXPECT(
+      RangeBoundary::JoinMin(RangeBoundary::FromConstant(1), n_infinity, size)
+          .IsMinimumOrBelow(size));
 
-  EXPECT(RangeBoundary::JoinMin(
-      n_infinity,
-      RangeBoundary::FromConstant(1),
-      size).IsMinimumOrBelow(size));
+  EXPECT(
+      RangeBoundary::JoinMin(n_infinity, RangeBoundary::FromConstant(1), size)
+          .IsMinimumOrBelow(size));
 
-  EXPECT(RangeBoundary::JoinMax(
-      p_infinity,
-      RangeBoundary::FromConstant(-1),
-      size).IsMaximumOrAbove(size));
+  EXPECT(
+      RangeBoundary::JoinMax(p_infinity, RangeBoundary::FromConstant(-1), size)
+          .IsMaximumOrAbove(size));
 
-  EXPECT(RangeBoundary::JoinMax(
-      RangeBoundary::FromConstant(-1),
-      p_infinity,
-      size).IsMaximumOrAbove(size));
+  EXPECT(
+      RangeBoundary::JoinMax(RangeBoundary::FromConstant(-1), p_infinity, size)
+          .IsMaximumOrAbove(size));
 
-  EXPECT(RangeBoundary::JoinMax(
-      RangeBoundary::FromConstant(1),
-      p_infinity,
-      size).IsMaximumOrAbove(size));
+  EXPECT(
+      RangeBoundary::JoinMax(RangeBoundary::FromConstant(1), p_infinity, size)
+          .IsMaximumOrAbove(size));
 
-  EXPECT(RangeBoundary::JoinMax(
-      p_infinity,
-      RangeBoundary::FromConstant(1),
-      size).IsMaximumOrAbove(size));
+  EXPECT(
+      RangeBoundary::JoinMax(p_infinity, RangeBoundary::FromConstant(1), size)
+          .IsMaximumOrAbove(size));
 }
 
 }  // namespace dart
diff --git a/runtime/vm/flow_graph_type_propagator.cc b/runtime/vm/flow_graph_type_propagator.cc
index 4b953752..bc4a844 100644
--- a/runtime/vm/flow_graph_type_propagator.cc
+++ b/runtime/vm/flow_graph_type_propagator.cc
@@ -12,7 +12,9 @@
 
 namespace dart {
 
-DEFINE_FLAG(bool, trace_type_propagation, false,
+DEFINE_FLAG(bool,
+            trace_type_propagation,
+            false,
             "Trace flow graph type propagation");
 
 DECLARE_FLAG(bool, propagate_types);
@@ -22,8 +24,7 @@
 #ifndef PRODUCT
   Thread* thread = flow_graph->thread();
   TimelineStream* compiler_timeline = Timeline::GetCompilerStream();
-  TimelineDurationScope tds2(thread,
-                             compiler_timeline,
+  TimelineDurationScope tds2(thread, compiler_timeline,
                              "FlowGraphTypePropagator");
 #endif  // !PRODUCT
   FlowGraphTypePropagator propagator(flow_graph);
@@ -34,11 +35,13 @@
 FlowGraphTypePropagator::FlowGraphTypePropagator(FlowGraph* flow_graph)
     : FlowGraphVisitor(flow_graph->reverse_postorder()),
       flow_graph_(flow_graph),
-      visited_blocks_(new(flow_graph->zone()) BitVector(
-          flow_graph->zone(), flow_graph->reverse_postorder().length())),
+      visited_blocks_(new (flow_graph->zone())
+                          BitVector(flow_graph->zone(),
+                                    flow_graph->reverse_postorder().length())),
       types_(flow_graph->current_ssa_temp_index()),
-      in_worklist_(new(flow_graph->zone()) BitVector(
-          flow_graph->zone(), flow_graph->current_ssa_temp_index())),
+      in_worklist_(new (flow_graph->zone())
+                       BitVector(flow_graph->zone(),
+                                 flow_graph->current_ssa_temp_index())),
       asserts_(NULL),
       collected_asserts_(NULL) {
   for (intptr_t i = 0; i < flow_graph->current_ssa_temp_index(); i++) {
@@ -80,16 +83,14 @@
   while (!worklist_.is_empty()) {
     Definition* def = RemoveLastFromWorklist();
     if (FLAG_support_il_printer && FLAG_trace_type_propagation) {
-      THR_Print("recomputing type of v%" Pd ": %s\n",
-                def->ssa_temp_index(),
+      THR_Print("recomputing type of v%" Pd ": %s\n", def->ssa_temp_index(),
                 def->Type()->ToCString());
     }
     if (def->RecomputeType()) {
       if (FLAG_support_il_printer && FLAG_trace_type_propagation) {
         THR_Print("  ... new type %s\n", def->Type()->ToCString());
       }
-      for (Value::Iterator it(def->input_use_list());
-           !it.Done();
+      for (Value::Iterator it(def->input_use_list()); !it.Done();
            it.Advance()) {
         Instruction* instr = it.Current()->instruction();
 
@@ -218,8 +219,7 @@
   if (FLAG_support_il_printer && FLAG_trace_type_propagation) {
     THR_Print("reaching type to %s for v%" Pd " is %s\n",
               value->instruction()->ToCString(),
-              value->definition()->ssa_temp_index(),
-              type->ToCString());
+              value->definition()->ssa_temp_index(), type->ToCString());
   }
 }
 
@@ -264,8 +264,7 @@
 
 void FlowGraphTypePropagator::VisitInstanceCall(InstanceCallInstr* instr) {
   if (instr->has_unique_selector()) {
-    SetCid(instr->ArgumentAt(0),
-           instr->ic_data()->GetReceiverClassIdAt(0));
+    SetCid(instr->ArgumentAt(0), instr->ic_data()->GetReceiverClassIdAt(0));
   }
 }
 
@@ -273,8 +272,7 @@
 void FlowGraphTypePropagator::VisitPolymorphicInstanceCall(
     PolymorphicInstanceCallInstr* instr) {
   if (instr->instance_call()->has_unique_selector()) {
-    SetCid(instr->ArgumentAt(0),
-           instr->ic_data().GetReceiverClassIdAt(0));
+    SetCid(instr->ArgumentAt(0), instr->ic_data().GetReceiverClassIdAt(0));
   }
 }
 
@@ -282,16 +280,14 @@
 void FlowGraphTypePropagator::VisitGuardFieldClass(
     GuardFieldClassInstr* guard) {
   const intptr_t cid = guard->field().guarded_cid();
-  if ((cid == kIllegalCid) ||
-      (cid == kDynamicCid) ||
+  if ((cid == kIllegalCid) || (cid == kDynamicCid) ||
       Field::IsExternalizableCid(cid)) {
     return;
   }
 
   Definition* def = guard->value()->definition();
   CompileType* current = TypeOf(def);
-  if (current->IsNone() ||
-      (current->ToCid() != cid) ||
+  if (current->IsNone() || (current->ToCid() != cid) ||
       (current->is_nullable() && !guard->field().is_nullable())) {
     const bool is_nullable =
         guard->field().is_nullable() && current->is_nullable();
@@ -377,17 +373,14 @@
   if (check->IsCheckSmi()) {
     check_clone =
         new CheckSmiInstr(assert->value()->Copy(zone()),
-                          assert->env()->deopt_id(),
-                          check->token_pos());
+                          assert->env()->deopt_id(), check->token_pos());
     check_clone->AsCheckSmi()->set_licm_hoisted(
         check->AsCheckSmi()->licm_hoisted());
   } else {
     ASSERT(check->IsCheckClass());
-    check_clone =
-        new CheckClassInstr(assert->value()->Copy(zone()),
-                            assert->env()->deopt_id(),
-                            check->AsCheckClass()->unary_checks(),
-                            check->token_pos());
+    check_clone = new CheckClassInstr(
+        assert->value()->Copy(zone()), assert->env()->deopt_id(),
+        check->AsCheckClass()->unary_checks(), check->token_pos());
     check_clone->AsCheckClass()->set_licm_hoisted(
         check->AsCheckClass()->licm_hoisted());
   }
@@ -429,15 +422,15 @@
 
   const AbstractType* compile_type = ToAbstractType();
   const AbstractType* other_compile_type = other->ToAbstractType();
-  if (compile_type->IsMoreSpecificThan(
-          *other_compile_type, NULL, NULL, Heap::kOld)) {
+  if (compile_type->IsMoreSpecificThan(*other_compile_type, NULL, NULL,
+                                       Heap::kOld)) {
     type_ = other_compile_type;
-  } else if (other_compile_type->
-      IsMoreSpecificThan(*compile_type, NULL, NULL, Heap::kOld)) {
-  // Nothing to do.
+  } else if (other_compile_type->IsMoreSpecificThan(*compile_type, NULL, NULL,
+                                                    Heap::kOld)) {
+    // Nothing to do.
   } else {
-  // Can't unify.
-  type_ = &Object::dynamic_type();
+    // Can't unify.
+    type_ = &Object::dynamic_type();
   }
 }
 
@@ -528,7 +521,7 @@
                    thread->isolate()->all_classes_finalized()) {
           if (FLAG_trace_cha) {
             THR_Print("  **(CHA) Compile type not subclassed: %s\n",
-                type_class.ToCString());
+                      type_class.ToCString());
           }
           if (FLAG_use_cha_deopt) {
             cha->AddToGuardedClasses(type_class, /*subclass_count=*/0);
@@ -624,8 +617,8 @@
   // except generative constructors, which return the object being constructed.
   // It is therefore acceptable for void functions to return null.
   if (compile_type.IsNullType()) {
-    *is_instance = is_nullable ||
-        type.IsObjectType() || type.IsDynamicType() || type.IsVoidType();
+    *is_instance = is_nullable || type.IsObjectType() || type.IsDynamicType() ||
+                   type.IsVoidType();
     return true;
   }
 
@@ -680,9 +673,7 @@
   for (intptr_t i = 0; i < InputCount(); i++) {
     if (FLAG_support_il_printer && FLAG_trace_type_propagation) {
       THR_Print("  phi %" Pd " input %" Pd ": v%" Pd " has reaching type %s\n",
-                ssa_temp_index(),
-                i,
-                InputAt(i)->definition()->ssa_temp_index(),
+                ssa_temp_index(), i, InputAt(i)->definition()->ssa_temp_index(),
                 InputAt(i)->Type()->ToCString());
     }
     result.Union(InputAt(i)->Type());
@@ -744,7 +735,8 @@
         return CompileType::FromCid(function.string_specialization_cid());
       case RegExpMacroAssembler::kParamStartOffsetIndex:
         return CompileType::FromCid(kSmiCid);
-      default: UNREACHABLE();
+      default:
+        UNREACHABLE();
     }
     UNREACHABLE();
     return CompileType::Dynamic();
@@ -774,13 +766,14 @@
           if (FLAG_use_cha_deopt ||
               thread->isolate()->all_classes_finalized()) {
             if (FLAG_trace_cha) {
-              THR_Print("  **(CHA) Computing exact type of receiver, "
+              THR_Print(
+                  "  **(CHA) Computing exact type of receiver, "
                   "no subclasses: %s\n",
                   type_class.ToCString());
             }
             if (FLAG_use_cha_deopt) {
-              thread->cha()->AddToGuardedClasses(
-                  type_class, /*subclass_count=*/0);
+              thread->cha()->AddToGuardedClasses(type_class,
+                                                 /*subclass_count=*/0);
             }
             cid = type_class.id();
           }
@@ -811,8 +804,8 @@
   }
 
   if (value().IsInstance()) {
-    return CompileType::Create(cid,
-        AbstractType::ZoneHandle(Instance::Cast(value()).GetType()));
+    return CompileType::Create(
+        cid, AbstractType::ZoneHandle(Instance::Cast(value()).GetType()));
   } else {
     // Type info for non-instance objects.
     return CompileType::FromCid(cid);
@@ -884,29 +877,25 @@
 
 
 CompileType CurrentContextInstr::ComputeType() const {
-  return CompileType(CompileType::kNonNullable,
-                     kContextCid,
+  return CompileType(CompileType::kNonNullable, kContextCid,
                      &Object::dynamic_type());
 }
 
 
 CompileType CloneContextInstr::ComputeType() const {
-  return CompileType(CompileType::kNonNullable,
-                     kContextCid,
+  return CompileType(CompileType::kNonNullable, kContextCid,
                      &Object::dynamic_type());
 }
 
 
 CompileType AllocateContextInstr::ComputeType() const {
-  return CompileType(CompileType::kNonNullable,
-                     kContextCid,
+  return CompileType(CompileType::kNonNullable, kContextCid,
                      &Object::dynamic_type());
 }
 
 
 CompileType AllocateUninitializedContextInstr::ComputeType() const {
-  return CompileType(CompileType::kNonNullable,
-                     kContextCid,
+  return CompileType(CompileType::kNonNullable, kContextCid,
                      &Object::dynamic_type());
 }
 
@@ -915,8 +904,8 @@
   if (!HasSingleRecognizedTarget()) return CompileType::Dynamic();
   const Function& target = Function::Handle(ic_data().GetTargetAt(0));
   return (target.recognized_kind() != MethodRecognizer::kUnknown)
-      ? CompileType::FromCid(MethodRecognizer::ResultCid(target))
-      : CompileType::Dynamic();
+             ? CompileType::FromCid(MethodRecognizer::ResultCid(target))
+             : CompileType::Dynamic();
 }
 
 
@@ -930,9 +919,9 @@
     // from the function.
     const AbstractType& result_type =
         AbstractType::ZoneHandle(function().result_type());
-    return CompileType::FromAbstractType(result_type.IsVoidType()
-        ? AbstractType::ZoneHandle(Type::NullType())
-        : result_type);
+    return CompileType::FromAbstractType(
+        result_type.IsVoidType() ? AbstractType::ZoneHandle(Type::NullType())
+                                 : result_type);
   }
 
   return CompileType::Dynamic();
@@ -964,7 +953,7 @@
 
 
 CompileType StringToCharCodeInstr::ComputeType() const {
-    return CompileType::FromCid(kSmiCid);
+  return CompileType::FromCid(kSmiCid);
 }
 
 
@@ -988,8 +977,7 @@
     if (!FLAG_fields_may_be_reset) {
       const Instance& obj = Instance::Handle(field.StaticValue());
       if ((obj.raw() != Object::sentinel().raw()) &&
-          (obj.raw() != Object::transition_sentinel().raw()) &&
-          !obj.IsNull()) {
+          (obj.raw() != Object::transition_sentinel().raw()) && !obj.IsNull()) {
         is_nullable = CompileType::kNonNullable;
         cid = obj.GetClassId();
       }
@@ -1014,8 +1002,7 @@
 CompileType AllocateObjectInstr::ComputeType() const {
   if (!closure_function().IsNull()) {
     ASSERT(cls().id() == kClosureCid);
-    return CompileType(CompileType::kNonNullable,
-                       kClosureCid,
+    return CompileType(CompileType::kNonNullable, kClosureCid,
                        &Type::ZoneHandle(closure_function().SignatureType()));
   }
   // TODO(vegorov): Incorporate type arguments into the returned type.
@@ -1045,13 +1032,14 @@
   if (Isolate::Current()->type_checks() &&
       (type().IsFunctionType() ||
        (type().HasResolvedTypeClass() &&
-       !Field::IsExternalizableCid(Class::Handle(type().type_class()).id())))) {
+        !Field::IsExternalizableCid(
+            Class::Handle(type().type_class()).id())))) {
     abstract_type = &type();
   }
 
   if ((field_ != NULL) && (field_->guarded_cid() != kIllegalCid)) {
     bool is_nullable = field_->is_nullable();
-    intptr_t field_cid =  field_->guarded_cid();
+    intptr_t field_cid = field_->guarded_cid();
     if (Field::IsExternalizableCid(field_cid)) {
       // We cannot assume that the type of the value in the field has not
       // changed on the fly.
diff --git a/runtime/vm/flow_graph_type_propagator.h b/runtime/vm/flow_graph_type_propagator.h
index 421b76e..0e23e5e 100644
--- a/runtime/vm/flow_graph_type_propagator.h
+++ b/runtime/vm/flow_graph_type_propagator.h
@@ -77,13 +77,10 @@
   class RollbackEntry {
    public:
     // Default constructor needed for the container.
-    RollbackEntry()
-        : index_(), type_() {
-    }
+    RollbackEntry() : index_(), type_() {}
 
     RollbackEntry(intptr_t index, CompileType* type)
-        : index_(index), type_(type) {
-    }
+        : index_(index), type_(type) {}
 
     intptr_t index() const { return index_; }
     CompileType* type() const { return type_; }
diff --git a/runtime/vm/freelist.cc b/runtime/vm/freelist.cc
index ceae578..cdb83fa 100644
--- a/runtime/vm/freelist.cc
+++ b/runtime/vm/freelist.cc
@@ -77,10 +77,8 @@
   if ((index != kNumLists) && free_map_.Test(index)) {
     FreeListElement* element = DequeueElement(index);
     if (is_protected) {
-      bool status =
-          VirtualMemory::Protect(reinterpret_cast<void*>(element),
-                                 size,
-                                 VirtualMemory::kReadWrite);
+      bool status = VirtualMemory::Protect(reinterpret_cast<void*>(element),
+                                           size, VirtualMemory::kReadWrite);
       ASSERT(status);
     }
     return reinterpret_cast<uword>(element);
@@ -103,8 +101,7 @@
             size + FreeListElement::HeaderSizeFor(remainder_size);
         bool status =
             VirtualMemory::Protect(reinterpret_cast<void*>(element),
-                                   region_size,
-                                   VirtualMemory::kReadWrite);
+                                   region_size, VirtualMemory::kReadWrite);
         ASSERT(status);
       }
       SplitElementAfterAndEnqueue(element, size, is_protected);
@@ -127,8 +124,7 @@
         // the call to SplitElementAfterAndEnqueue.
         bool status =
             VirtualMemory::Protect(reinterpret_cast<void*>(current),
-                                   region_size,
-                                   VirtualMemory::kReadWrite);
+                                   region_size, VirtualMemory::kReadWrite);
         ASSERT(status);
       }
 
@@ -151,16 +147,14 @@
         if (target_is_protected) {
           bool status =
               VirtualMemory::Protect(reinterpret_cast<void*>(target_address),
-                                     kWordSize,
-                                     VirtualMemory::kReadWrite);
+                                     kWordSize, VirtualMemory::kReadWrite);
           ASSERT(status);
         }
         previous->set_next(current->next());
         if (target_is_protected) {
           bool status =
               VirtualMemory::Protect(reinterpret_cast<void*>(target_address),
-                                     kWordSize,
-                                     VirtualMemory::kReadExecute);
+                                     kWordSize, VirtualMemory::kReadExecute);
           ASSERT(status);
         }
       }
@@ -220,8 +214,8 @@
   FreeListElement* next = free_lists_[index];
   if (next == NULL && index != kNumLists) {
     free_map_.Set(index, true);
-    last_free_small_size_ = Utils::Maximum(last_free_small_size_,
-                                           index << kObjectAlignmentLog2);
+    last_free_small_size_ =
+        Utils::Maximum(last_free_small_size_, index << kObjectAlignmentLog2);
   }
   element->set_next(next);
   free_lists_[index] = element;
@@ -273,13 +267,12 @@
     small_objects += list_length;
     intptr_t list_bytes = list_length * i * kObjectAlignment;
     small_bytes += list_bytes;
-    OS::Print("small %3d [%8d bytes] : "
-              "%8" Pd " objs; %8.1f KB; %8.1f cum KB\n",
-              i,
-              i * kObjectAlignment,
-              list_length,
-              list_bytes / static_cast<double>(KB),
-              small_bytes / static_cast<double>(KB));
+    OS::Print(
+        "small %3d [%8d bytes] : "
+        "%8" Pd " objs; %8.1f KB; %8.1f cum KB\n",
+        i, i * kObjectAlignment, list_length,
+        list_bytes / static_cast<double>(KB),
+        small_bytes / static_cast<double>(KB));
   }
 }
 
@@ -333,11 +326,10 @@
     intptr_t list_length = pair->second();
     intptr_t list_bytes = list_length * size;
     large_bytes += list_bytes;
-    OS::Print("large %3" Pd " [%8" Pd " bytes] : "
+    OS::Print("large %3" Pd " [%8" Pd
+              " bytes] : "
               "%8" Pd " objs; %8.1f KB; %8.1f cum KB\n",
-              size / kObjectAlignment,
-              size,
-              list_length,
+              size / kObjectAlignment, size, list_length,
               list_bytes / static_cast<double>(KB),
               large_bytes / static_cast<double>(KB));
   }
@@ -373,8 +365,7 @@
       !VirtualMemory::InSamePage(remainder_address - 1, remainder_address)) {
     bool status =
         VirtualMemory::Protect(reinterpret_cast<void*>(remainder_address),
-                               remainder_size,
-                               VirtualMemory::kReadExecute);
+                               remainder_size, VirtualMemory::kReadExecute);
     ASSERT(status);
   }
 }
diff --git a/runtime/vm/freelist.h b/runtime/vm/freelist.h
index 22744a1..068c4e2 100644
--- a/runtime/vm/freelist.h
+++ b/runtime/vm/freelist.h
@@ -22,16 +22,10 @@
 // A FreeListElement never has its header mark bit set.
 class FreeListElement {
  public:
-  FreeListElement* next() const {
-    return next_;
-  }
-  uword next_address() const {
-    return reinterpret_cast<uword>(&next_);
-  }
+  FreeListElement* next() const { return next_; }
+  uword next_address() const { return reinterpret_cast<uword>(&next_); }
 
-  void set_next(FreeListElement* next) {
-    next_ = next;
-  }
+  void set_next(FreeListElement* next) { next_ = next; }
 
   intptr_t Size() {
     intptr_t size = RawObject::SizeTag::decode(tags_);
@@ -48,7 +42,7 @@
   // Used to allocate class for free list elements in Object::InitOnce.
   class FakeInstance {
    public:
-    FakeInstance() { }
+    FakeInstance() {}
     static cpp_vtable vtable() { return 0; }
     static intptr_t InstanceSize() { return 0; }
     static intptr_t NextFieldOffset() { return -kWordSize; }
diff --git a/runtime/vm/freelist_test.cc b/runtime/vm/freelist_test.cc
index 1945a30..2d0aab9 100644
--- a/runtime/vm/freelist_test.cc
+++ b/runtime/vm/freelist_test.cc
@@ -11,8 +11,7 @@
 static uword Allocate(FreeList* free_list, intptr_t size, bool is_protected) {
   uword result = free_list->TryAllocate(size, is_protected);
   if (result && is_protected) {
-    bool status = VirtualMemory::Protect(reinterpret_cast<void*>(result),
-                                         size,
+    bool status = VirtualMemory::Protect(reinterpret_cast<void*>(result), size,
                                          VirtualMemory::kReadExecute);
     ASSERT(status);
   }
@@ -25,15 +24,13 @@
                  intptr_t size,
                  bool is_protected) {
   if (is_protected) {
-    bool status = VirtualMemory::Protect(reinterpret_cast<void*>(address),
-                                         size,
+    bool status = VirtualMemory::Protect(reinterpret_cast<void*>(address), size,
                                          VirtualMemory::kReadWrite);
     ASSERT(status);
   }
   free_list->Free(address, size);
   if (is_protected) {
-    bool status = VirtualMemory::Protect(reinterpret_cast<void*>(address),
-                                         size,
+    bool status = VirtualMemory::Protect(reinterpret_cast<void*>(address), size,
                                          VirtualMemory::kReadExecute);
     ASSERT(status);
   }
@@ -133,9 +130,7 @@
 
   // Allocate small objects.
   for (intptr_t i = 0; i < blob->size() / kObjectSize; i++) {
-    objects[i] = Allocate(free_list,
-                          kObjectSize,
-                          true);  // is_protected
+    objects[i] = Allocate(free_list, kObjectSize, true);  // is_protected
   }
 
   // All space is occupied. Expect failed allocation.
diff --git a/runtime/vm/gc_marker.cc b/runtime/vm/gc_marker.cc
index 76cdd5e..86c5ae3 100644
--- a/runtime/vm/gc_marker.cc
+++ b/runtime/vm/gc_marker.cc
@@ -25,9 +25,7 @@
  public:
   SkippedCodeFunctions() {}
 
-  void Add(RawFunction* func) {
-    skipped_code_functions_.Add(func);
-  }
+  void Add(RawFunction* func) { skipped_code_functions_.Add(func); }
 
   void DetachCode() {
 #if defined(DART_PRECOMPILED_RUNTIME)
@@ -42,9 +40,8 @@
         // If the code wasn't strongly visited through other references
         // after skipping the function's code pointer, then we disconnect the
         // code from the function.
-        func->StorePointer(
-            &(func->ptr()->code_),
-            StubCode::LazyCompile_entry()->code());
+        func->StorePointer(&(func->ptr()->code_),
+                           StubCode::LazyCompile_entry()->code());
         uword entry_point = StubCode::LazyCompile_entry()->EntryPoint();
         func->ptr()->entry_point_ = entry_point;
         if (FLAG_log_code_drop) {
@@ -141,14 +138,14 @@
 };
 
 
-template<bool sync>
+template <bool sync>
 class MarkingVisitorBase : public ObjectPointerVisitor {
  public:
   MarkingVisitorBase(Isolate* isolate,
-                 Heap* heap,
-                 PageSpace* page_space,
-                 MarkingStack* marking_stack,
-                 SkippedCodeFunctions* skipped_code_functions)
+                     Heap* heap,
+                     PageSpace* page_space,
+                     MarkingStack* marking_stack,
+                     SkippedCodeFunctions* skipped_code_functions)
       : ObjectPointerVisitor(isolate),
         thread_(Thread::Current()),
         heap_(heap),
@@ -177,9 +174,7 @@
     return class_stats_count_[class_id];
   }
 
-  intptr_t live_size(intptr_t class_id) {
-    return class_stats_size_[class_id];
-  }
+  intptr_t live_size(intptr_t class_id) { return class_stats_size_[class_id]; }
 
   bool ProcessPendingWeakProperties() {
     bool marked = false;
@@ -250,9 +245,7 @@
     }
   }
 
-  bool visit_function_code() const {
-    return skipped_code_functions_ == NULL;
-  }
+  bool visit_function_code() const { return skipped_code_functions_ == NULL; }
 
   virtual void add_skipped_code_function(RawFunction* func) {
     ASSERT(!visit_function_code());
@@ -272,8 +265,7 @@
   intptr_t ProcessWeakProperty(RawWeakProperty* raw_weak) {
     // The fate of the weak property is determined by its key.
     RawObject* raw_key = raw_weak->ptr()->key_;
-    if (raw_key->IsHeapObject() &&
-        raw_key->IsOldObject() &&
+    if (raw_key->IsHeapObject() && raw_key->IsOldObject() &&
         !raw_key->IsMarked()) {
       // Key was white. Enqueue the weak property.
       EnqueueWeakProperty(raw_weak);
@@ -313,9 +305,9 @@
  private:
   void PushMarked(RawObject* raw_obj) {
     ASSERT(raw_obj->IsHeapObject());
-    ASSERT((FLAG_verify_before_gc || FLAG_verify_before_gc) ?
-           page_space_->Contains(RawObject::ToAddr(raw_obj)) :
-           true);
+    ASSERT((FLAG_verify_before_gc || FLAG_verify_before_gc)
+               ? page_space_->Contains(RawObject::ToAddr(raw_obj))
+               : true);
 
     // Push the marked object on the marking stack.
     ASSERT(raw_obj->IsMarked());
@@ -438,8 +430,8 @@
 
 class MarkingWeakVisitor : public HandleVisitor {
  public:
-  MarkingWeakVisitor(Thread* thread, FinalizationQueue* queue) :
-      HandleVisitor(thread), queue_(queue) { }
+  MarkingWeakVisitor(Thread* thread, FinalizationQueue* queue)
+      : HandleVisitor(thread), queue_(queue) {}
 
   void VisitHandle(uword addr) {
     FinalizablePersistentHandle* handle =
@@ -476,7 +468,8 @@
 
 void GCMarker::IterateRoots(Isolate* isolate,
                             ObjectPointerVisitor* visitor,
-                            intptr_t slice_index, intptr_t num_slices) {
+                            intptr_t slice_index,
+                            intptr_t num_slices) {
   ASSERT(0 <= slice_index && slice_index < num_slices);
   if ((slice_index == 0) || (num_slices <= 1)) {
     isolate->VisitObjectPointers(visitor,
@@ -499,11 +492,9 @@
 
 
 void GCMarker::ProcessWeakTables(PageSpace* page_space) {
-  for (int sel = 0;
-       sel < Heap::kNumWeakSelectors;
-       sel++) {
-    WeakTable* table = heap_->GetWeakTable(
-        Heap::kOld, static_cast<Heap::WeakSelector>(sel));
+  for (int sel = 0; sel < Heap::kNumWeakSelectors; sel++) {
+    WeakTable* table =
+        heap_->GetWeakTable(Heap::kOld, static_cast<Heap::WeakSelector>(sel));
     intptr_t size = table->size();
     for (intptr_t i = 0; i < size; i++) {
       if (table->IsValidEntryAt(i)) {
@@ -520,8 +511,8 @@
 
 class ObjectIdRingClearPointerVisitor : public ObjectPointerVisitor {
  public:
-  explicit ObjectIdRingClearPointerVisitor(Isolate* isolate) :
-      ObjectPointerVisitor(isolate) {}
+  explicit ObjectIdRingClearPointerVisitor(Isolate* isolate)
+      : ObjectPointerVisitor(isolate) {}
 
 
   void VisitPointers(RawObject** first, RawObject** last) {
@@ -571,8 +562,7 @@
         collect_code_(collect_code),
         task_index_(task_index),
         num_tasks_(num_tasks),
-        num_busy_(num_busy) {
-  }
+        num_busy_(num_busy) {}
 
   virtual void Run() {
     bool result =
@@ -584,7 +574,7 @@
       StackZone stack_zone(thread);
       Zone* zone = stack_zone.GetZone();
       SkippedCodeFunctions* skipped_code_functions =
-          collect_code_ ? new(zone) SkippedCodeFunctions() : NULL;
+          collect_code_ ? new (zone) SkippedCodeFunctions() : NULL;
       SyncMarkingVisitor visitor(isolate_, heap_, page_space_, marking_stack_,
                                  skipped_code_functions);
       // Phase 1: Iterate over roots and drain marking stack in tasks.
@@ -648,8 +638,8 @@
 
       // Phase 3: Finalize results from all markers (detach code, etc.).
       if (FLAG_log_marker_tasks) {
-        THR_Print("Task %" Pd " marked %" Pd " bytes.\n",
-                  task_index_, visitor.marked_bytes());
+        THR_Print("Task %" Pd " marked %" Pd " bytes.\n", task_index_,
+                  visitor.marked_bytes());
       }
       marker_->FinalizeResultsFrom(&visitor);
     }
@@ -675,7 +665,7 @@
 };
 
 
-template<class MarkingVisitorType>
+template <class MarkingVisitorType>
 void GCMarker::FinalizeResultsFrom(MarkingVisitorType* visitor) {
   {
     MutexLocker ml(&stats_mutex_);
@@ -714,7 +704,7 @@
     if (num_tasks == 0) {
       // Mark everything on main thread.
       SkippedCodeFunctions* skipped_code_functions =
-          collect_code ? new(zone) SkippedCodeFunctions() : NULL;
+          collect_code ? new (zone) SkippedCodeFunctions() : NULL;
       UnsyncMarkingVisitor mark(isolate, heap_, page_space, &marking_stack,
                                 skipped_code_functions);
       IterateRoots(isolate, &mark, 0, 1);
@@ -738,8 +728,7 @@
       // All marking done; detach code, etc.
       FinalizeResultsFrom(&mark);
     } else {
-      ThreadBarrier barrier(num_tasks + 1,
-                            heap_->barrier(),
+      ThreadBarrier barrier(num_tasks + 1, heap_->barrier(),
                             heap_->barrier_done());
       // Used to coordinate draining among tasks; all start out as 'busy'.
       uintptr_t num_busy = num_tasks;
@@ -747,8 +736,7 @@
       for (intptr_t i = 0; i < num_tasks; ++i) {
         MarkTask* mark_task =
             new MarkTask(this, isolate, heap_, page_space, &marking_stack,
-                         &barrier, collect_code,
-                         i, num_tasks, &num_busy);
+                         &barrier, collect_code, i, num_tasks, &num_busy);
         ThreadPool* pool = Dart::thread_pool();
         pool->Run(mark_task);
       }
diff --git a/runtime/vm/gc_marker.h b/runtime/vm/gc_marker.h
index 5a5f2ea..ace01c4 100644
--- a/runtime/vm/gc_marker.h
+++ b/runtime/vm/gc_marker.h
@@ -22,9 +22,8 @@
 // of the mark-sweep collection. The marking bit used is defined in RawObject.
 class GCMarker : public ValueObject {
  public:
-  explicit GCMarker(Heap* heap)
-      : heap_(heap), marked_bytes_(0) { }
-  ~GCMarker() { }
+  explicit GCMarker(Heap* heap) : heap_(heap), marked_bytes_(0) {}
+  ~GCMarker() {}
 
   void MarkObjects(Isolate* isolate,
                    PageSpace* page_space,
@@ -38,15 +37,16 @@
   void Epilogue(Isolate* isolate, bool invoke_api_callbacks);
   void IterateRoots(Isolate* isolate,
                     ObjectPointerVisitor* visitor,
-                    intptr_t slice_index, intptr_t num_slices);
+                    intptr_t slice_index,
+                    intptr_t num_slices);
   void IterateWeakRoots(Isolate* isolate, HandleVisitor* visitor);
-  template<class MarkingVisitorType>
+  template <class MarkingVisitorType>
   void IterateWeakReferences(Isolate* isolate, MarkingVisitorType* visitor);
   void ProcessWeakTables(PageSpace* page_space);
   void ProcessObjectIdTable(Isolate* isolate);
 
   // Called by anyone: finalize and accumulate stats from 'visitor'.
-  template<class MarkingVisitorType>
+  template <class MarkingVisitorType>
   void FinalizeResultsFrom(MarkingVisitorType* visitor);
 
   Heap* heap_;
diff --git a/runtime/vm/gc_sweeper.cc b/runtime/vm/gc_sweeper.cc
index 40ee3db..f779b49 100644
--- a/runtime/vm/gc_sweeper.cc
+++ b/runtime/vm/gc_sweeper.cc
@@ -114,8 +114,8 @@
   }
 
   virtual void Run() {
-    bool result = Thread::EnterIsolateAsHelper(task_isolate_,
-                                               Thread::kSweeperTask);
+    bool result =
+        Thread::EnterIsolateAsHelper(task_isolate_, Thread::kSweeperTask);
     ASSERT(result);
     {
       Thread* thread = Thread::Current();
@@ -168,11 +168,8 @@
                                 HeapPage* first,
                                 HeapPage* last,
                                 FreeList* freelist) {
-  SweeperTask* task =
-      new SweeperTask(isolate,
-                      isolate->heap()->old_space(),
-                      first, last,
-                      freelist);
+  SweeperTask* task = new SweeperTask(isolate, isolate->heap()->old_space(),
+                                      first, last, freelist);
   ThreadPool* pool = Dart::thread_pool();
   pool->Run(task);
 }
diff --git a/runtime/vm/globals.h b/runtime/vm/globals.h
index e65cb7d..e3045ed 100644
--- a/runtime/vm/globals.h
+++ b/runtime/vm/globals.h
@@ -25,12 +25,12 @@
 // N=30 (32-bit build) or N=62 (64-bit build).
 const intptr_t kSmiBits = kBitsPerWord - 2;
 const intptr_t kSmiMax = (static_cast<intptr_t>(1) << kSmiBits) - 1;
-const intptr_t kSmiMin =  -(static_cast<intptr_t>(1) << kSmiBits);
+const intptr_t kSmiMin = -(static_cast<intptr_t>(1) << kSmiBits);
 
 // Hard coded from above but for 32-bit architectures.
 const intptr_t kSmiBits32 = kBitsPerInt32 - 2;
 const intptr_t kSmiMax32 = (static_cast<intptr_t>(1) << kSmiBits32) - 1;
-const intptr_t kSmiMin32 =  -(static_cast<intptr_t>(1) << kSmiBits32);
+const intptr_t kSmiMin32 = -(static_cast<intptr_t>(1) << kSmiBits32);
 
 #define kPosInfinity bit_cast<double>(DART_UINT64_C(0x7ff0000000000000))
 #define kNegInfinity bit_cast<double>(DART_UINT64_C(0xfff0000000000000))
@@ -39,9 +39,9 @@
 // size_t which represents the number of elements of the given
 // array. You should only use ARRAY_SIZE on statically allocated
 // arrays.
-#define ARRAY_SIZE(array)                                       \
-  ((sizeof(array) / sizeof(*(array))) /                         \
-  static_cast<intptr_t>(!(sizeof(array) % sizeof(*(array)))))
+#define ARRAY_SIZE(array)                                                      \
+  ((sizeof(array) / sizeof(*(array))) /                                        \
+   static_cast<intptr_t>(!(sizeof(array) % sizeof(*(array)))))  // NOLINT
 
 
 // The expression OFFSET_OF(type, field) computes the byte-offset of
@@ -56,12 +56,14 @@
 const intptr_t kOffsetOfPtr = 32;
 
 #define OFFSET_OF(type, field)                                                 \
-  (reinterpret_cast<intptr_t>(&(reinterpret_cast<type*>(kOffsetOfPtr)->field)) \
-      - kOffsetOfPtr)
+  (reinterpret_cast<intptr_t>(                                                 \
+       &(reinterpret_cast<type*>(kOffsetOfPtr)->field)) -                      \
+   kOffsetOfPtr)  // NOLINT
 
 #define OFFSET_OF_RETURNED_VALUE(type, accessor)                               \
   (reinterpret_cast<intptr_t>(                                                 \
-      (reinterpret_cast<type*>(kOffsetOfPtr)->accessor())) - kOffsetOfPtr)
+       (reinterpret_cast<type*>(kOffsetOfPtr)->accessor())) -                  \
+   kOffsetOfPtr)  // NOLINT
 
 #define OPEN_ARRAY_START(type, align)                                          \
   do {                                                                         \
@@ -98,8 +100,12 @@
 // Macros to get the contents of the fp register.
 #if defined(TARGET_OS_WINDOWS)
 
+// clang-format off
 #if defined(HOST_ARCH_IA32)
-#define COPY_FP_REGISTER(fp) __asm { mov fp, ebp };  // NOLINT
+#define COPY_FP_REGISTER(fp)                                                   \
+  __asm { mov fp, ebp}                                                         \
+  ;  // NOLINT
+// clang-format on
 #elif defined(HOST_ARCH_X64)
 #define COPY_FP_REGISTER(fp) UNIMPLEMENTED();
 #else
@@ -110,19 +116,19 @@
 
 // Assume GCC-like inline syntax is valid.
 #if defined(HOST_ARCH_IA32)
-#define COPY_FP_REGISTER(fp) asm volatile ("movl %%ebp, %0" : "=r" (fp) );
+#define COPY_FP_REGISTER(fp) asm volatile("movl %%ebp, %0" : "=r"(fp));
 #elif defined(HOST_ARCH_X64)
-#define COPY_FP_REGISTER(fp) asm volatile ("movq %%rbp, %0" : "=r" (fp) );
+#define COPY_FP_REGISTER(fp) asm volatile("movq %%rbp, %0" : "=r"(fp));
 #elif defined(HOST_ARCH_ARM)
-#  if defined(TARGET_OS_MAC)
-#define COPY_FP_REGISTER(fp) asm volatile ("mov %0, r7" : "=r" (fp) );
-#  else
-#define COPY_FP_REGISTER(fp) asm volatile ("mov %0, r11" : "=r" (fp) );
-#  endif
+#if defined(TARGET_OS_MAC)
+#define COPY_FP_REGISTER(fp) asm volatile("mov %0, r7" : "=r"(fp));
+#else
+#define COPY_FP_REGISTER(fp) asm volatile("mov %0, r11" : "=r"(fp));
+#endif
 #elif defined(HOST_ARCH_ARM64)
-#define COPY_FP_REGISTER(fp) asm volatile ("mov %0, x29" : "=r" (fp) );
+#define COPY_FP_REGISTER(fp) asm volatile("mov %0, x29" : "=r"(fp));
 #elif defined(HOST_ARCH_MIPS)
-#define COPY_FP_REGISTER(fp) asm volatile ("move %0, $fp" : "=r" (fp) );
+#define COPY_FP_REGISTER(fp) asm volatile("move %0, $fp" : "=r"(fp));
 #else
 #error Unknown host architecture.
 #endif
diff --git a/runtime/vm/growable_array.h b/runtime/vm/growable_array.h
index 09df060..b2d03e0 100644
--- a/runtime/vm/growable_array.h
+++ b/runtime/vm/growable_array.h
@@ -17,7 +17,7 @@
 
 namespace dart {
 
-template<typename T, typename B, typename Allocator = Zone>
+template <typename T, typename B, typename Allocator = Zone>
 class BaseGrowableArray : public B {
  public:
   explicit BaseGrowableArray(Allocator* allocator)
@@ -31,9 +31,7 @@
     }
   }
 
-  ~BaseGrowableArray() {
-    allocator_->template Free<T>(data_, capacity_);
-  }
+  ~BaseGrowableArray() { allocator_->template Free<T>(data_, capacity_); }
 
   intptr_t length() const { return length_; }
   T* data() const { return data_; }
@@ -63,9 +61,7 @@
     return data_[index];
   }
 
-  const T& At(intptr_t index) const {
-    return operator[](index);
-  }
+  const T& At(intptr_t index) const { return operator[](index); }
 
   T& Last() const {
     ASSERT(length_ > 0);
@@ -78,9 +74,7 @@
     }
   }
 
-  void Clear() {
-    length_ = 0;
-  }
+  void Clear() { length_ = 0; }
 
   void InsertAt(intptr_t idx, const T& value) {
     Resize(length() + 1);
@@ -140,15 +134,15 @@
 };
 
 
-template<typename T, typename B, typename Allocator>
-inline void BaseGrowableArray<T, B, Allocator>::Sort(
-    int compare(const T*, const T*)) {
+template <typename T, typename B, typename Allocator>
+inline void BaseGrowableArray<T, B, Allocator>::Sort(int compare(const T*,
+                                                                 const T*)) {
   typedef int (*CompareFunction)(const void*, const void*);
   qsort(data_, length_, sizeof(T), reinterpret_cast<CompareFunction>(compare));
 }
 
 
-template<typename T, typename B, typename Allocator>
+template <typename T, typename B, typename Allocator>
 void BaseGrowableArray<T, B, Allocator>::Resize(intptr_t new_length) {
   if (new_length > capacity_) {
     intptr_t new_capacity = Utils::RoundUpToPowerOfTwo(new_length);
@@ -162,7 +156,7 @@
 }
 
 
-template<typename T, typename B, typename Allocator>
+template <typename T, typename B, typename Allocator>
 void BaseGrowableArray<T, B, Allocator>::SetLength(intptr_t new_length) {
   if (new_length > capacity_) {
     T* new_data = allocator_->template Alloc<T>(new_length);
@@ -174,57 +168,51 @@
 }
 
 
-template<typename T>
+template <typename T>
 class GrowableArray : public BaseGrowableArray<T, ValueObject> {
  public:
   GrowableArray(Zone* zone, intptr_t initial_capacity)
-      : BaseGrowableArray<T, ValueObject>(
-          initial_capacity, ASSERT_NOTNULL(zone)) {}
+      : BaseGrowableArray<T, ValueObject>(initial_capacity,
+                                          ASSERT_NOTNULL(zone)) {}
   explicit GrowableArray(intptr_t initial_capacity)
       : BaseGrowableArray<T, ValueObject>(
-          initial_capacity,
-          ASSERT_NOTNULL(Thread::Current()->zone())) {}
+            initial_capacity,
+            ASSERT_NOTNULL(Thread::Current()->zone())) {}
   GrowableArray()
       : BaseGrowableArray<T, ValueObject>(
-          ASSERT_NOTNULL(Thread::Current()->zone())) {}
+            ASSERT_NOTNULL(Thread::Current()->zone())) {}
 };
 
 
-template<typename T>
+template <typename T>
 class ZoneGrowableArray : public BaseGrowableArray<T, ZoneAllocated> {
  public:
   ZoneGrowableArray(Zone* zone, intptr_t initial_capacity)
-      : BaseGrowableArray<T, ZoneAllocated>(
-          initial_capacity, ASSERT_NOTNULL(zone)) {}
+      : BaseGrowableArray<T, ZoneAllocated>(initial_capacity,
+                                            ASSERT_NOTNULL(zone)) {}
   explicit ZoneGrowableArray(intptr_t initial_capacity)
       : BaseGrowableArray<T, ZoneAllocated>(
-          initial_capacity,
-          ASSERT_NOTNULL(Thread::Current()->zone())) {}
+            initial_capacity,
+            ASSERT_NOTNULL(Thread::Current()->zone())) {}
   ZoneGrowableArray()
       : BaseGrowableArray<T, ZoneAllocated>(
-          ASSERT_NOTNULL(Thread::Current()->zone())) {}
+            ASSERT_NOTNULL(Thread::Current()->zone())) {}
 };
 
 
 // T must be a Handle type.
-template<typename T, typename B>
+template <typename T, typename B>
 class BaseGrowableHandlePtrArray : public B {
  public:
   BaseGrowableHandlePtrArray(Zone* zone, intptr_t initial_capacity)
       : zone_(zone), array_(zone, initial_capacity) {}
 
   // Use unique zone handles to store objects.
-  void Add(const T& t) {
-    array_.Add(&T::ZoneHandle(zone_, t.raw()));
-  }
+  void Add(const T& t) { array_.Add(&T::ZoneHandle(zone_, t.raw())); }
 
-  T& operator[](intptr_t index) const {
-    return *array_[index];
-  }
+  T& operator[](intptr_t index) const { return *array_[index]; }
 
-  const T& At(intptr_t index) const {
-    return operator[](index);
-  }
+  const T& At(intptr_t index) const { return operator[](index); }
 
   void SetAt(intptr_t index, const T& t) {
     array_[index] = &T::ZoneHandle(zone_, t.raw());
@@ -242,25 +230,24 @@
 };
 
 
-template<typename T>
-class GrowableHandlePtrArray :
-    public BaseGrowableHandlePtrArray<T, ValueObject> {
+template <typename T>
+class GrowableHandlePtrArray
+    : public BaseGrowableHandlePtrArray<T, ValueObject> {
  public:
   GrowableHandlePtrArray(Zone* zone, intptr_t initial_capacity)
       : BaseGrowableHandlePtrArray<T, ValueObject>(zone, initial_capacity) {}
 };
 
 
-template<typename T>
-class ZoneGrowableHandlePtrArray :
-    public BaseGrowableHandlePtrArray<T, ZoneAllocated> {
+template <typename T>
+class ZoneGrowableHandlePtrArray
+    : public BaseGrowableHandlePtrArray<T, ZoneAllocated> {
  public:
   ZoneGrowableHandlePtrArray(Zone* zone, intptr_t initial_capacity)
       : BaseGrowableHandlePtrArray<T, ZoneAllocated>(zone, initial_capacity) {}
 };
 
 
-
 class Malloc : public AllStatic {
  public:
   template <class T>
@@ -283,13 +270,12 @@
 class EmptyBase {};
 
 
-template<typename T>
+template <typename T>
 class MallocGrowableArray : public BaseGrowableArray<T, EmptyBase, Malloc> {
  public:
   explicit MallocGrowableArray(intptr_t initial_capacity)
       : BaseGrowableArray<T, EmptyBase, Malloc>(initial_capacity, NULL) {}
-  MallocGrowableArray()
-      : BaseGrowableArray<T, EmptyBase, Malloc>(NULL) {}
+  MallocGrowableArray() : BaseGrowableArray<T, EmptyBase, Malloc>(NULL) {}
 };
 
 }  // namespace dart
diff --git a/runtime/vm/growable_array_test.cc b/runtime/vm/growable_array_test.cc
index fedb9c8..4a9782d 100644
--- a/runtime/vm/growable_array_test.cc
+++ b/runtime/vm/growable_array_test.cc
@@ -8,7 +8,7 @@
 
 namespace dart {
 
-template<class GrowableArrayInt, class GrowableArrayInt64>
+template <class GrowableArrayInt, class GrowableArrayInt64>
 void TestGrowableArray() {
   GrowableArrayInt g;
   EXPECT_EQ(0, g.length());
@@ -64,14 +64,12 @@
 
 
 TEST_CASE(GrowableArray) {
-  TestGrowableArray<GrowableArray<int>,
-                    GrowableArray<int64_t> >();
+  TestGrowableArray<GrowableArray<int>, GrowableArray<int64_t> >();
 }
 
 
 TEST_CASE(MallocGrowableArray) {
-  TestGrowableArray<MallocGrowableArray<int>,
-                    MallocGrowableArray<int64_t> >();
+  TestGrowableArray<MallocGrowableArray<int>, MallocGrowableArray<int64_t> >();
 }
 
 
diff --git a/runtime/vm/guard_field_test.cc b/runtime/vm/guard_field_test.cc
index 0e0972b..54815b8 100644
--- a/runtime/vm/guard_field_test.cc
+++ b/runtime/vm/guard_field_test.cc
@@ -9,12 +9,13 @@
 
 namespace dart {
 
-RawField* LookupField(Dart_Handle library, const char* class_name,
+RawField* LookupField(Dart_Handle library,
+                      const char* class_name,
                       const char* field_name) {
   RawLibrary* raw_library = Library::RawCast(Api::UnwrapHandle(library));
   Library& lib = Library::ZoneHandle(raw_library);
-  const String& classname = String::Handle(Symbols::New(Thread::Current(),
-                                                        class_name));
+  const String& classname =
+      String::Handle(Symbols::New(Thread::Current(), class_name));
   Class& cls = Class::Handle(lib.LookupClass(classname));
   EXPECT(!cls.IsNull());  // No ambiguity error expected.
 
diff --git a/runtime/vm/gypi_contents.gni b/runtime/vm/gypi_contents.gni
new file mode 100644
index 0000000..403efdf
--- /dev/null
+++ b/runtime/vm/gypi_contents.gni
@@ -0,0 +1,52 @@
+# Copyright (c) 2016, 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.
+
+_core_library_names = [
+  "async",
+  "core",
+  "collection",
+  "convert",
+  "developer",
+  "internal",
+  "isolate",
+  "math",
+  "mirrors",
+  "profiler",
+  "typed_data",
+  "vmservice",
+]
+
+_core_library_gypis = [
+  "../platform/platform_headers.gypi",
+  "../platform/platform_sources.gypi",
+  "../vm/vm_sources.gypi",
+  "../lib/async_sources.gypi",
+  "../lib/core_sources.gypi",
+  "../lib/collection_sources.gypi",
+  "../lib/convert_sources.gypi",
+  "../lib/developer_sources.gypi",
+  "../lib/internal_sources.gypi",
+  "../lib/isolate_sources.gypi",
+  "../lib/math_sources.gypi",
+  "../lib/mirrors_sources.gypi",
+  "../lib/typed_data_sources.gypi",
+  "../lib/vmservice_sources.gypi",
+  "../../sdk/lib/async/async_sources.gypi",
+  "../../sdk/lib/collection/collection_sources.gypi",
+  "../../sdk/lib/convert/convert_sources.gypi",
+  "../../sdk/lib/core/core_sources.gypi",
+  "../../sdk/lib/developer/developer_sources.gypi",
+  "../../sdk/lib/internal/internal_sources.gypi",
+  "../../sdk/lib/isolate/isolate_sources.gypi",
+  "../../sdk/lib/math/math_sources.gypi",
+  "../../sdk/lib/mirrors/mirrors_sources.gypi",
+  "../../sdk/lib/profiler/profiler_sources.gypi",
+  "../../sdk/lib/vmservice/vmservice_sources.gypi",
+  "../bin/io_sources.gypi",
+]
+
+processed_gypis = exec_script("../../tools/process_gypis.py",
+                              _core_library_names,
+                              "scope",
+                              _core_library_gypis)
diff --git a/runtime/vm/handles.cc b/runtime/vm/handles.cc
index bf2697a..f3818d7 100644
--- a/runtime/vm/handles.cc
+++ b/runtime/vm/handles.cc
@@ -21,20 +21,18 @@
 
 
 VMHandles::~VMHandles() {
-    if (FLAG_trace_handles) {
-      OS::PrintErr("***   Handle Counts for 0x(%" Px
-                   "):Zone = %d,Scoped = %d\n",
-                   reinterpret_cast<intptr_t>(this),
-                   CountZoneHandles(), CountScopedHandles());
-      OS::PrintErr("*** Deleting VM handle block 0x%" Px "\n",
-                   reinterpret_cast<intptr_t>(this));
-    }
+  if (FLAG_trace_handles) {
+    OS::PrintErr("***   Handle Counts for 0x(%" Px "):Zone = %d,Scoped = %d\n",
+                 reinterpret_cast<intptr_t>(this), CountZoneHandles(),
+                 CountScopedHandles());
+    OS::PrintErr("*** Deleting VM handle block 0x%" Px "\n",
+                 reinterpret_cast<intptr_t>(this));
+  }
 }
 
 
 void VMHandles::VisitObjectPointers(ObjectPointerVisitor* visitor) {
-  return Handles<kVMHandleSizeInWords,
-                 kVMHandlesPerChunk,
+  return Handles<kVMHandleSizeInWords, kVMHandlesPerChunk,
                  kOffsetOfRawPtr>::VisitObjectPointers(visitor);
 }
 
@@ -49,24 +47,21 @@
 
 uword VMHandles::AllocateHandle(Zone* zone) {
   DEBUG_ASSERT(!IsCurrentApiNativeScope(zone));
-  return Handles<kVMHandleSizeInWords,
-                 kVMHandlesPerChunk,
+  return Handles<kVMHandleSizeInWords, kVMHandlesPerChunk,
                  kOffsetOfRawPtr>::AllocateHandle(zone);
 }
 
 
 uword VMHandles::AllocateZoneHandle(Zone* zone) {
   DEBUG_ASSERT(!IsCurrentApiNativeScope(zone));
-  return Handles<kVMHandleSizeInWords,
-                 kVMHandlesPerChunk,
+  return Handles<kVMHandleSizeInWords, kVMHandlesPerChunk,
                  kOffsetOfRawPtr>::AllocateZoneHandle(zone);
 }
 
 
 bool VMHandles::IsZoneHandle(uword handle) {
-  return Handles<kVMHandleSizeInWords,
-                 kVMHandlesPerChunk,
-                 kOffsetOfRawPtr >::IsZoneHandle(handle);
+  return Handles<kVMHandleSizeInWords, kVMHandlesPerChunk,
+                 kOffsetOfRawPtr>::IsZoneHandle(handle);
 }
 
 
diff --git a/runtime/vm/handles.h b/runtime/vm/handles.h
index 1b4c7bd..b96a3bf 100644
--- a/runtime/vm/handles.h
+++ b/runtime/vm/handles.h
@@ -84,11 +84,8 @@
   Handles()
       : zone_blocks_(NULL),
         first_scoped_block_(NULL),
-        scoped_blocks_(&first_scoped_block_) {
-  }
-  ~Handles() {
-    DeleteAll();
-  }
+        scoped_blocks_(&first_scoped_block_) {}
+  ~Handles() { DeleteAll(); }
 
   // Visit all object pointers stored in the various handles.
   void VisitObjectPointers(ObjectPointerVisitor* visitor);
@@ -148,8 +145,7 @@
   class HandlesBlock {
    public:
     explicit HandlesBlock(HandlesBlock* next)
-        : next_handle_slot_(0),
-          next_block_(next) { }
+        : next_handle_slot_(0), next_block_(next) {}
     ~HandlesBlock();
 
     // Reinitializes handle block for reuse.
@@ -200,7 +196,7 @@
    private:
     uword data_[kHandleSizeInWords * kHandlesPerChunk];  // Handles area.
     intptr_t next_handle_slot_;  // Next slot for allocation in current block.
-    HandlesBlock* next_block_;  // Link to next block of handles.
+    HandlesBlock* next_block_;   // Link to next block of handles.
 
     DISALLOW_COPY_AND_ASSIGN(HandlesBlock);
   };
@@ -231,9 +227,9 @@
   void ZapFreeScopedHandles();
 #endif
 
-  HandlesBlock* zone_blocks_;  // List of zone handles.
+  HandlesBlock* zone_blocks_;        // List of zone handles.
   HandlesBlock first_scoped_block_;  // First block of scoped handles.
-  HandlesBlock* scoped_blocks_;  // List of scoped handles.
+  HandlesBlock* scoped_blocks_;      // List of scoped handles.
 
   friend class HandleScope;
   friend class Dart;
@@ -253,9 +249,8 @@
  public:
   static const int kOffsetOfRawPtrInHandle = kOffsetOfRawPtr;
 
-  VMHandles() : Handles<kVMHandleSizeInWords,
-                        kVMHandlesPerChunk,
-                        kOffsetOfRawPtr>() {
+  VMHandles()
+      : Handles<kVMHandleSizeInWords, kVMHandlesPerChunk, kOffsetOfRawPtr>() {
     if (FLAG_trace_handles) {
       OS::PrintErr("*** Starting a new VM handle block 0x%" Px "\n",
                    reinterpret_cast<intptr_t>(this));
@@ -314,7 +309,7 @@
 
 // Macro to start a new Handle scope.
 #define HANDLESCOPE(thread)                                                    \
-    dart::HandleScope vm_internal_handles_scope_(thread);
+  dart::HandleScope vm_internal_handles_scope_(thread);
 
 
 // The class NoHandleScope is used in critical regions of the virtual machine
@@ -338,12 +333,12 @@
  private:
   DISALLOW_COPY_AND_ASSIGN(NoHandleScope);
 };
-#else  // defined(DEBUG)
+#else   // defined(DEBUG)
 class NoHandleScope : public ValueObject {
  public:
-  explicit NoHandleScope(Thread* thread) { }
-  NoHandleScope() { }
-  ~NoHandleScope() { }
+  explicit NoHandleScope(Thread* thread) {}
+  NoHandleScope() {}
+  ~NoHandleScope() {}
 
  private:
   DISALLOW_COPY_AND_ASSIGN(NoHandleScope);
@@ -352,7 +347,7 @@
 
 // Macro to start a no handles scope in the code.
 #define NOHANDLESCOPE(thread)                                                  \
-    dart::NoHandleScope no_vm_internal_handles_scope_(thread);
+  dart::NoHandleScope no_vm_internal_handles_scope_(thread);
 
 }  // namespace dart
 
diff --git a/runtime/vm/handles_impl.h b/runtime/vm/handles_impl.h
index eb7be5e..3adf2fe 100644
--- a/runtime/vm/handles_impl.h
+++ b/runtime/vm/handles_impl.h
@@ -12,10 +12,8 @@
 namespace dart {
 
 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr>
-void Handles<kHandleSizeInWords,
-             kHandlesPerChunk,
-             kOffsetOfRawPtr>::VisitObjectPointers(
-    ObjectPointerVisitor* visitor) {
+void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>::
+    VisitObjectPointers(ObjectPointerVisitor* visitor) {
   // Visit all zone handles.
   HandlesBlock* block = zone_blocks_;
   while (block != NULL) {
@@ -29,10 +27,8 @@
 
 
 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr>
-void Handles<kHandleSizeInWords,
-             kHandlesPerChunk,
-             kOffsetOfRawPtr>::VisitScopedHandles(
-    ObjectPointerVisitor* visitor) {
+void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>::
+    VisitScopedHandles(ObjectPointerVisitor* visitor) {
   HandlesBlock* block = &first_scoped_block_;
   do {
     block->VisitObjectPointers(visitor);
@@ -46,9 +42,8 @@
 
 
 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr>
-void Handles<kHandleSizeInWords,
-             kHandlesPerChunk,
-             kOffsetOfRawPtr>::Visit(HandleVisitor* visitor) {
+void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>::Visit(
+    HandleVisitor* visitor) {
   // Visit all zone handles.
   HandlesBlock* block = zone_blocks_;
   while (block != NULL) {
@@ -66,9 +61,7 @@
 
 
 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr>
-void Handles<kHandleSizeInWords,
-             kHandlesPerChunk,
-             kOffsetOfRawPtr>::Reset() {
+void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>::Reset() {
   // Delete all the extra zone handle blocks allocated and reinit the first
   // zone block.
   if (zone_blocks_ != NULL) {
@@ -88,9 +81,8 @@
 // allocate a handle in that scope. The function assumes that a
 // current handle scope exists. It asserts for this appropriately.
 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr>
-uword Handles<kHandleSizeInWords,
-              kHandlesPerChunk,
-              kOffsetOfRawPtr>::AllocateHandle(Zone* zone) {
+uword Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>::
+    AllocateHandle(Zone* zone) {
 #if defined(DEBUG)
   Thread* thread = Thread::Current();
   ASSERT(thread->top_handle_scope() != NULL);
@@ -105,9 +97,8 @@
 // The function assumes that 'zone' is the current zone and asserts for
 // this appropriately.
 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr>
-uword Handles<kHandleSizeInWords,
-              kHandlesPerChunk,
-              kOffsetOfRawPtr>::AllocateZoneHandle(Zone* zone) {
+uword Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>::
+    AllocateZoneHandle(Zone* zone) {
 #if defined(DEBUG)
   Thread* thread = Thread::Current();
   ASSERT(thread->zone() == zone);
@@ -123,9 +114,8 @@
 // Figure out the current zone using the current Thread and
 // check if the specified handle has been allocated in this zone.
 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr>
-bool Handles<kHandleSizeInWords,
-             kHandlesPerChunk,
-             kOffsetOfRawPtr>::IsZoneHandle(uword handle) {
+bool Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>::
+    IsZoneHandle(uword handle) {
   // TODO(5411412): Accessing the current thread is a performance problem,
   // consider passing it down as a parameter.
   Thread* thread = Thread::Current();
@@ -138,9 +128,8 @@
 
 
 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr>
-void Handles<kHandleSizeInWords,
-             kHandlesPerChunk,
-             kOffsetOfRawPtr>::DeleteAll() {
+void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>::
+    DeleteAll() {
   // Delete all the zone allocated handle blocks.
   // GCTrace does not need to trace this call to DeleteHandleBlocks,
   // since the individual zone deletions will be caught
@@ -157,10 +146,8 @@
 
 
 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr>
-void Handles<kHandleSizeInWords,
-             kHandlesPerChunk,
-             kOffsetOfRawPtr>::DeleteHandleBlocks(
-    HandlesBlock* blocks) {
+void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>::
+    DeleteHandleBlocks(HandlesBlock* blocks) {
   while (blocks != NULL) {
     HandlesBlock* block = blocks;
     blocks = blocks->next_block();
@@ -170,13 +157,12 @@
 
 
 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr>
-void Handles<kHandleSizeInWords,
-             kHandlesPerChunk,
-             kOffsetOfRawPtr>::SetupNextScopeBlock() {
+void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>::
+    SetupNextScopeBlock() {
   if (FLAG_trace_handles) {
     OS::PrintErr("***   Handle Counts for (0x%" Px "):Zone = %d,Scoped = %d\n",
-                 reinterpret_cast<intptr_t>(this),
-                 CountZoneHandles(), CountScopedHandles());
+                 reinterpret_cast<intptr_t>(this), CountZoneHandles(),
+                 CountScopedHandles());
   }
   if (scoped_blocks_->next_block() == NULL) {
     scoped_blocks_->set_next_block(new HandlesBlock(NULL));
@@ -193,9 +179,8 @@
 // handle blocks to check if the handle is valid, please
 // use this only in ASSERT code for verification purposes.
 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr>
-bool Handles<kHandleSizeInWords,
-             kHandlesPerChunk,
-             kOffsetOfRawPtr>::IsValidScopedHandle(uword handle) const {
+bool Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>::
+    IsValidScopedHandle(uword handle) const {
   const HandlesBlock* iterator = &first_scoped_block_;
   while (iterator != NULL) {
     if (iterator->IsValidHandle(handle)) {
@@ -208,9 +193,8 @@
 
 
 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr>
-bool Handles<kHandleSizeInWords,
-             kHandlesPerChunk,
-             kOffsetOfRawPtr>::IsValidZoneHandle(uword handle) const {
+bool Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>::
+    IsValidZoneHandle(uword handle) const {
   const HandlesBlock* iterator = zone_blocks_;
   while (iterator != NULL) {
     if (iterator->IsValidHandle(handle)) {
@@ -223,13 +207,12 @@
 
 
 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr>
-void Handles<kHandleSizeInWords,
-             kHandlesPerChunk,
-             kOffsetOfRawPtr>::SetupNextZoneBlock() {
+void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>::
+    SetupNextZoneBlock() {
   if (FLAG_trace_handles) {
     OS::PrintErr("***   Handle Counts for (0x%" Px "):Zone = %d,Scoped = %d\n",
-                 reinterpret_cast<intptr_t>(this),
-                 CountZoneHandles(), CountScopedHandles());
+                 reinterpret_cast<intptr_t>(this), CountZoneHandles(),
+                 CountScopedHandles());
   }
   zone_blocks_ = new HandlesBlock(zone_blocks_);
   ASSERT(zone_blocks_ != NULL);
@@ -238,9 +221,8 @@
 
 #if defined(DEBUG)
 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr>
-void Handles<kHandleSizeInWords,
-             kHandlesPerChunk,
-             kOffsetOfRawPtr>::VerifyScopedHandleState() {
+void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>::
+    VerifyScopedHandleState() {
   HandlesBlock* block = &first_scoped_block_;
   const intptr_t end_index = (kHandleSizeInWords * kHandlesPerChunk);
   do {
@@ -254,9 +236,8 @@
 
 
 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr>
-void Handles<kHandleSizeInWords,
-             kHandlesPerChunk,
-             kOffsetOfRawPtr>::ZapFreeScopedHandles() {
+void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>::
+    ZapFreeScopedHandles() {
   HandlesBlock* block = scoped_blocks_;
   while (block != NULL) {
     block->ZapFreeHandles();
@@ -267,9 +248,8 @@
 
 
 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr>
-int Handles<kHandleSizeInWords,
-            kHandlesPerChunk,
-            kOffsetOfRawPtr>::CountScopedHandles() const {
+int Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>::
+    CountScopedHandles() const {
   int count = 0;
   const HandlesBlock* block = &first_scoped_block_;
   do {
@@ -285,9 +265,8 @@
 
 
 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr>
-int Handles<kHandleSizeInWords,
-            kHandlesPerChunk,
-            kOffsetOfRawPtr>::CountZoneHandles() const {
+int Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>::
+    CountZoneHandles() const {
   int count = 0;
   const HandlesBlock* block = zone_blocks_;
   while (block != NULL) {
@@ -299,9 +278,8 @@
 
 
 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr>
-Handles<kHandleSizeInWords,
-        kHandlesPerChunk,
-        kOffsetOfRawPtr>::HandlesBlock::~HandlesBlock() {
+Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>::HandlesBlock::
+    ~HandlesBlock() {
 #if defined(DEBUG)
   ReInit();
 #endif
@@ -309,9 +287,8 @@
 
 
 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr>
-void Handles<kHandleSizeInWords,
-             kHandlesPerChunk,
-             kOffsetOfRawPtr>::HandlesBlock::ReInit() {
+void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>::
+    HandlesBlock::ReInit() {
   next_handle_slot_ = 0;
   next_block_ = NULL;
 #if defined(DEBUG)
@@ -321,22 +298,19 @@
 
 
 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr>
-void Handles<kHandleSizeInWords,
-             kHandlesPerChunk,
-             kOffsetOfRawPtr>::HandlesBlock::VisitObjectPointers(
-                 ObjectPointerVisitor* visitor) {
+void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>::
+    HandlesBlock::VisitObjectPointers(ObjectPointerVisitor* visitor) {
   ASSERT(visitor != NULL);
   for (intptr_t i = 0; i < next_handle_slot_; i += kHandleSizeInWords) {
     visitor->VisitPointer(
-        reinterpret_cast<RawObject**>(&data_[i + kOffsetOfRawPtr/kWordSize]));
+        reinterpret_cast<RawObject**>(&data_[i + kOffsetOfRawPtr / kWordSize]));
   }
 }
 
 
 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr>
-void Handles<kHandleSizeInWords,
-             kHandlesPerChunk,
-             kOffsetOfRawPtr>::HandlesBlock::Visit(HandleVisitor* visitor) {
+void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>::
+    HandlesBlock::Visit(HandleVisitor* visitor) {
   ASSERT(visitor != NULL);
   for (intptr_t i = 0; i < next_handle_slot_; i += kHandleSizeInWords) {
     visitor->VisitHandle(reinterpret_cast<uword>(&data_[i]));
@@ -346,13 +320,11 @@
 
 #if defined(DEBUG)
 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr>
-void Handles<kHandleSizeInWords,
-             kHandlesPerChunk,
-             kOffsetOfRawPtr>::HandlesBlock::ZapFreeHandles() {
+void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>::
+    HandlesBlock::ZapFreeHandles() {
   // Reinitialize the handle area to some uninitialized value.
   for (intptr_t i = next_handle_slot_;
-       i < (kHandleSizeInWords * kHandlesPerChunk);
-       i++) {
+       i < (kHandleSizeInWords * kHandlesPerChunk); i++) {
     data_[i] = kZapUninitializedWord;
   }
 }
@@ -360,9 +332,8 @@
 
 
 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr>
-int Handles<kHandleSizeInWords,
-            kHandlesPerChunk,
-            kOffsetOfRawPtr>::HandlesBlock::HandleCount() const {
+int Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>::
+    HandlesBlock::HandleCount() const {
   return (next_handle_slot_ / kHandleSizeInWords);
 }
 
diff --git a/runtime/vm/hash_map.h b/runtime/vm/hash_map.h
index 88d45ff..5aa5343 100644
--- a/runtime/vm/hash_map.h
+++ b/runtime/vm/hash_map.h
@@ -10,7 +10,7 @@
 
 namespace dart {
 
-template<typename KeyValueTrait, typename B, typename Allocator = Zone>
+template <typename KeyValueTrait, typename B, typename Allocator = Zone>
 class BaseDirectChainedHashMap : public B {
  public:
   explicit BaseDirectChainedHashMap(Allocator* allocator)
@@ -71,7 +71,7 @@
     intptr_t array_index_;
     intptr_t list_index_;
 
-    template<typename T, typename Bs, typename A>
+    template <typename T, typename Bs, typename A>
     friend class BaseDirectChainedHashMap;
   };
 
@@ -80,7 +80,7 @@
  protected:
   // A linked list of T values.  Stored in arrays.
   struct HashMapListElement {
-    HashMapListElement() : kv(), next(kNil) { }
+    HashMapListElement() : kv(), next(kNil) {}
     typename KeyValueTrait::Pair kv;
     intptr_t next;  // Index in the array of the next list element.
   };
@@ -101,7 +101,7 @@
 
   intptr_t array_size_;
   intptr_t lists_size_;
-  intptr_t count_;  // The number of values stored in the HashMap.
+  intptr_t count_;             // The number of values stored in the HashMap.
   HashMapListElement* array_;  // Primary store - contains the first value
   // with a given hash.  Colliding elements are stored in linked lists.
   HashMapListElement* lists_;  // The linked lists containing hash collisions.
@@ -110,28 +110,28 @@
 };
 
 
-template<typename KeyValueTrait, typename B, typename Allocator>
-BaseDirectChainedHashMap<KeyValueTrait, B, Allocator>::
-    BaseDirectChainedHashMap(const BaseDirectChainedHashMap& other)
-  : B(),
-    array_size_(other.array_size_),
-    lists_size_(other.lists_size_),
-    count_(other.count_),
-    array_(other.allocator_->template Alloc<HashMapListElement>(
-        other.array_size_)),
-    lists_(other.allocator_->template Alloc<HashMapListElement>(
-        other.lists_size_)),
-    free_list_head_(other.free_list_head_),
-    allocator_(other.allocator_) {
+template <typename KeyValueTrait, typename B, typename Allocator>
+BaseDirectChainedHashMap<KeyValueTrait, B, Allocator>::BaseDirectChainedHashMap(
+    const BaseDirectChainedHashMap& other)
+    : B(),
+      array_size_(other.array_size_),
+      lists_size_(other.lists_size_),
+      count_(other.count_),
+      array_(other.allocator_->template Alloc<HashMapListElement>(
+          other.array_size_)),
+      lists_(other.allocator_->template Alloc<HashMapListElement>(
+          other.lists_size_)),
+      free_list_head_(other.free_list_head_),
+      allocator_(other.allocator_) {
   memmove(array_, other.array_, array_size_ * sizeof(HashMapListElement));
   memmove(lists_, other.lists_, lists_size_ * sizeof(HashMapListElement));
 }
 
 
-template<typename KeyValueTrait, typename B, typename Allocator>
+template <typename KeyValueTrait, typename B, typename Allocator>
 typename KeyValueTrait::Pair*
-    BaseDirectChainedHashMap<KeyValueTrait, B, Allocator>::
-        Lookup(typename KeyValueTrait::Key key) const {
+BaseDirectChainedHashMap<KeyValueTrait, B, Allocator>::Lookup(
+    typename KeyValueTrait::Key key) const {
   const typename KeyValueTrait::Value kNoValue =
       KeyValueTrait::ValueOf(typename KeyValueTrait::Pair());
 
@@ -154,10 +154,10 @@
 }
 
 
-template<typename KeyValueTrait, typename B, typename Allocator>
+template <typename KeyValueTrait, typename B, typename Allocator>
 typename KeyValueTrait::Value
-    BaseDirectChainedHashMap<KeyValueTrait, B, Allocator>::
-        LookupValue(typename KeyValueTrait::Key key) const {
+BaseDirectChainedHashMap<KeyValueTrait, B, Allocator>::LookupValue(
+    typename KeyValueTrait::Key key) const {
   const typename KeyValueTrait::Value kNoValue =
       KeyValueTrait::ValueOf(typename KeyValueTrait::Pair());
   typename KeyValueTrait::Pair* pair = Lookup(key);
@@ -165,9 +165,9 @@
 }
 
 
-template<typename KeyValueTrait, typename B, typename Allocator>
+template <typename KeyValueTrait, typename B, typename Allocator>
 typename KeyValueTrait::Pair*
-    BaseDirectChainedHashMap<KeyValueTrait, B, Allocator>::Iterator::Next() {
+BaseDirectChainedHashMap<KeyValueTrait, B, Allocator>::Iterator::Next() {
   const typename KeyValueTrait::Value kNoValue =
       KeyValueTrait::ValueOf(typename KeyValueTrait::Pair());
 
@@ -200,7 +200,7 @@
 }
 
 
-template<typename KeyValueTrait, typename B, typename Allocator>
+template <typename KeyValueTrait, typename B, typename Allocator>
 void BaseDirectChainedHashMap<KeyValueTrait, B, Allocator>::Resize(
     intptr_t new_size) {
   const typename KeyValueTrait::Value kNoValue =
@@ -250,7 +250,7 @@
 }
 
 
-template<typename KeyValueTrait, typename B, typename Allocator>
+template <typename KeyValueTrait, typename B, typename Allocator>
 void BaseDirectChainedHashMap<KeyValueTrait, B, Allocator>::ResizeLists(
     intptr_t new_size) {
   ASSERT(new_size > lists_size_);
@@ -276,9 +276,9 @@
 }
 
 
-template<typename KeyValueTrait, typename B, typename Allocator>
-void BaseDirectChainedHashMap<KeyValueTrait, B, Allocator>::
-    Insert(typename KeyValueTrait::Pair kv) {
+template <typename KeyValueTrait, typename B, typename Allocator>
+void BaseDirectChainedHashMap<KeyValueTrait, B, Allocator>::Insert(
+    typename KeyValueTrait::Pair kv) {
   const typename KeyValueTrait::Value kNoValue =
       KeyValueTrait::ValueOf(typename KeyValueTrait::Pair());
 
@@ -308,16 +308,17 @@
 }
 
 
-template<typename KeyValueTrait>
+template <typename KeyValueTrait>
 class DirectChainedHashMap
     : public BaseDirectChainedHashMap<KeyValueTrait, ValueObject> {
  public:
-  DirectChainedHashMap() : BaseDirectChainedHashMap<KeyValueTrait, ValueObject>(
-          ASSERT_NOTNULL(Thread::Current()->zone())) {}
+  DirectChainedHashMap()
+      : BaseDirectChainedHashMap<KeyValueTrait, ValueObject>(
+            ASSERT_NOTNULL(Thread::Current()->zone())) {}
 };
 
 
-template<typename KeyValueTrait>
+template <typename KeyValueTrait>
 class MallocDirectChainedHashMap
     : public BaseDirectChainedHashMap<KeyValueTrait, EmptyBase, Malloc> {
  public:
@@ -326,32 +327,24 @@
 };
 
 
-template<typename T>
+template <typename T>
 class PointerKeyValueTrait {
  public:
   typedef T* Value;
   typedef T* Key;
   typedef T* Pair;
 
-  static Key KeyOf(Pair kv) {
-    return kv;
-  }
+  static Key KeyOf(Pair kv) { return kv; }
 
-  static Value ValueOf(Pair kv) {
-    return kv;
-  }
+  static Value ValueOf(Pair kv) { return kv; }
 
-  static inline intptr_t Hashcode(Key key) {
-    return key->Hashcode();
-  }
+  static inline intptr_t Hashcode(Key key) { return key->Hashcode(); }
 
-  static inline bool IsKeyEqual(Pair kv, Key key) {
-    return kv->Equals(key);
-  }
+  static inline bool IsKeyEqual(Pair kv, Key key) { return kv->Equals(key); }
 };
 
 
-template<typename T>
+template <typename T>
 class NumbersKeyValueTrait {
  public:
   typedef T Value;
@@ -365,7 +358,7 @@
 };
 
 
-template<typename K, typename V>
+template <typename K, typename V>
 class RawPointerKeyValueTrait {
  public:
   typedef K* Key;
diff --git a/runtime/vm/hash_map_test.cc b/runtime/vm/hash_map_test.cc
index 7830b85..b3afdde 100644
--- a/runtime/vm/hash_map_test.cc
+++ b/runtime/vm/hash_map_test.cc
@@ -10,9 +10,10 @@
 
 class TestValue {
  public:
-  explicit TestValue(intptr_t x) : x_(x) { }
+  explicit TestValue(intptr_t x) : x_(x) {}
   intptr_t Hashcode() const { return x_ & 1; }
   bool Equals(TestValue* other) { return x_ == other->x_; }
+
  private:
   intptr_t x_;
 };
diff --git a/runtime/vm/hash_table.h b/runtime/vm/hash_table.h
index 5835b22..05d69fc 100644
--- a/runtime/vm/hash_table.h
+++ b/runtime/vm/hash_table.h
@@ -72,7 +72,7 @@
 //    uword Hash(const Key& key) for any number of desired lookup key types.
 //  kPayloadSize: number of components of the payload in each entry.
 //  kMetaDataSize: number of elements reserved (e.g., for iteration order data).
-template<typename KeyTraits, intptr_t kPayloadSize, intptr_t kMetaDataSize>
+template <typename KeyTraits, intptr_t kPayloadSize, intptr_t kMetaDataSize>
 class HashTable : public ValueObject {
  public:
   typedef KeyTraits Traits;
@@ -127,12 +127,12 @@
     data_->SetAt(kOccupiedEntriesIndex, *smi_handle_);
     data_->SetAt(kDeletedEntriesIndex, *smi_handle_);
 
-NOT_IN_PRODUCT(
+#if !defined(PRODUCT)
     data_->SetAt(kNumGrowsIndex, *smi_handle_);
     data_->SetAt(kNumLT5LookupsIndex, *smi_handle_);
     data_->SetAt(kNumLT25LookupsIndex, *smi_handle_);
     data_->SetAt(kNumGT25LookupsIndex, *smi_handle_);
-)  // !PRODUCT
+#endif  // !defined(PRODUCT)
 
     for (intptr_t i = kHeaderSize; i < data_->Length(); ++i) {
       data_->SetAt(i, Object::sentinel());
@@ -140,13 +140,13 @@
   }
 
   // Returns whether 'key' matches any key in the table.
-  template<typename Key>
+  template <typename Key>
   bool ContainsKey(const Key& key) const {
     return FindKey(key) != -1;
   }
 
   // Returns the entry that matches 'key', or -1 if none exists.
-  template<typename Key>
+  template <typename Key>
   intptr_t FindKey(const Key& key) const {
     const intptr_t num_entries = NumEntries();
     ASSERT(NumOccupied() < num_entries);
@@ -179,7 +179,7 @@
   // - an occupied entry matching 'key', and returns true, or
   // - an unused/deleted entry where a matching key may be inserted,
   //   and returns false.
-  template<typename Key>
+  template <typename Key>
   bool FindKeyOrDeletedOrUnused(const Key& key, intptr_t* entry) const {
     const intptr_t num_entries = NumEntries();
     ASSERT(entry != NULL);
@@ -271,23 +271,13 @@
   intptr_t NumUnused() const {
     return NumEntries() - NumOccupied() - NumDeleted();
   }
-  intptr_t NumOccupied() const {
-    return GetSmiValueAt(kOccupiedEntriesIndex);
-  }
-  intptr_t NumDeleted() const {
-    return GetSmiValueAt(kDeletedEntriesIndex);
-  }
-  Object& KeyHandle() const {
-    return *key_handle_;
-  }
-  Smi& SmiHandle() const {
-    return *smi_handle_;
-  }
+  intptr_t NumOccupied() const { return GetSmiValueAt(kOccupiedEntriesIndex); }
+  intptr_t NumDeleted() const { return GetSmiValueAt(kDeletedEntriesIndex); }
+  Object& KeyHandle() const { return *key_handle_; }
+  Smi& SmiHandle() const { return *smi_handle_; }
 
-NOT_IN_PRODUCT(
-  intptr_t NumGrows() const {
-    return GetSmiValueAt(kNumGrowsIndex);
-  }
+#if !defined(PRODUCT)
+  intptr_t NumGrows() const { return GetSmiValueAt(kNumGrowsIndex); }
   intptr_t NumLT5Collisions() const {
     return GetSmiValueAt(kNumLT5LookupsIndex);
   }
@@ -297,9 +287,7 @@
   intptr_t NumGT25Collisions() const {
     return GetSmiValueAt(kNumGT25LookupsIndex);
   }
-  void UpdateGrowth() const {
-    AdjustSmiValueAt(kNumGrowsIndex, 1);
-  }
+  void UpdateGrowth() const { AdjustSmiValueAt(kNumGrowsIndex, 1); }
   void UpdateCollisions(intptr_t collisions) const {
     if (data_->raw()->IsVMHeapObject()) {
       return;
@@ -316,6 +304,7 @@
     if (!KeyTraits::ReportStats()) {
       return;
     }
+    // clang-format off
     OS::Print("Stats for %s table :\n"
               " Size of table = %" Pd ",Number of Occupied entries = %" Pd "\n"
               " Number of Grows = %" Pd "\n"
@@ -326,8 +315,9 @@
               NumEntries(), NumOccupied(),
               NumGrows(),
               NumLT5Collisions(), NumLT25Collisions(), NumGT25Collisions());
+    // clang-format on
   }
-)  // !PRODUCT
+#endif  // !PRODUCT
 
  protected:
   static const intptr_t kOccupiedEntriesIndex = 0;
@@ -389,7 +379,7 @@
 
 
 // Table with unspecified iteration order. No payload overhead or metadata.
-template<typename KeyTraits, intptr_t kUserPayloadSize>
+template <typename KeyTraits, intptr_t kUserPayloadSize>
 class UnorderedHashTable : public HashTable<KeyTraits, kUserPayloadSize, 0> {
  public:
   typedef HashTable<KeyTraits, kUserPayloadSize, 0> BaseTable;
@@ -413,9 +403,7 @@
       }
       return false;
     }
-    intptr_t Current() {
-      return entry_;
-    }
+    intptr_t Current() { return entry_; }
 
    private:
     const UnorderedHashTable* table_;
@@ -429,16 +417,17 @@
 class HashTables : public AllStatic {
  public:
   // Allocates and initializes a table.
-  template<typename Table>
+  template <typename Table>
   static RawArray* New(intptr_t initial_capacity,
                        Heap::Space space = Heap::kNew) {
-    Table table(Thread::Current()->zone(), Array::New(
-        Table::ArrayLengthForNumOccupied(initial_capacity), space));
+    Table table(
+        Thread::Current()->zone(),
+        Array::New(Table::ArrayLengthForNumOccupied(initial_capacity), space));
     table.Initialize();
     return table.Release().raw();
   }
 
-  template<typename Table>
+  template <typename Table>
   static RawArray* New(const Array& array) {
     Table table(Thread::Current()->zone(), array.raw());
     table.Initialize();
@@ -447,7 +436,7 @@
 
   // Clears 'to' and inserts all elements from 'from', in iteration order.
   // The tables must have the same user payload size.
-  template<typename From, typename To>
+  template <typename From, typename To>
   static void Copy(const From& from, const To& to) {
     COMPILE_ASSERT(From::kPayloadSize == To::kPayloadSize);
     to.Initialize();
@@ -469,25 +458,24 @@
     }
   }
 
-  template<typename Table>
+  template <typename Table>
   static void EnsureLoadFactor(double low, double high, const Table& table) {
     double current = (1 + table.NumOccupied() + table.NumDeleted()) /
-        static_cast<double>(table.NumEntries());
+                     static_cast<double>(table.NumEntries());
     if (low <= current && current < high) {
       return;
     }
     double target = (low + high) / 2.0;
     intptr_t new_capacity = (1 + table.NumOccupied()) / target;
-    Table new_table(New<Table>(
-        new_capacity,
-        table.data_->IsOld() ? Heap::kOld : Heap::kNew));
+    Table new_table(New<Table>(new_capacity,
+                               table.data_->IsOld() ? Heap::kOld : Heap::kNew));
     Copy(table, new_table);
     *table.data_ = new_table.Release().raw();
     NOT_IN_PRODUCT(table.UpdateGrowth(); table.PrintStats();)
   }
 
   // Serializes a table by concatenating its entries as an array.
-  template<typename Table>
+  template <typename Table>
   static RawArray* ToArray(const Table& table, bool include_payload) {
     const intptr_t entry_size = include_payload ? (1 + Table::kPayloadSize) : 1;
     Array& result = Array::Handle(Array::New(table.NumOccupied() * entry_size));
@@ -510,7 +498,7 @@
 };
 
 
-template<typename BaseIterTable>
+template <typename BaseIterTable>
 class HashMap : public BaseIterTable {
  public:
   explicit HashMap(RawArray* data)
@@ -518,7 +506,7 @@
   HashMap(Zone* zone, RawArray* data) : BaseIterTable(zone, data) {}
   HashMap(Object* key, Smi* value, Array* data)
       : BaseIterTable(key, value, data) {}
-  template<typename Key>
+  template <typename Key>
   RawObject* GetOrNull(const Key& key, bool* present = NULL) const {
     intptr_t entry = BaseIterTable::FindKey(key);
     if (present != NULL) {
@@ -537,7 +525,7 @@
     return present;
   }
   // Update the value of an existing key. Note that 'key' need not be an Object.
-  template<typename Key>
+  template <typename Key>
   void UpdateValue(const Key& key, const Object& value) const {
     intptr_t entry = BaseIterTable::FindKey(key);
     ASSERT(entry != -1);
@@ -558,7 +546,7 @@
     }
   }
   // Like InsertOrGetValue, but calls NewKey to allocate a key object if needed.
-  template<typename Key>
+  template <typename Key>
   RawObject* InsertNewOrGetValue(const Key& key,
                                  const Object& value_if_absent) const {
     EnsureCapacity();
@@ -574,7 +562,7 @@
     }
   }
 
-  template<typename Key>
+  template <typename Key>
   bool Remove(const Key& key) const {
     intptr_t entry = BaseIterTable::FindKey(key);
     if (entry == -1) {
@@ -585,9 +573,7 @@
     }
   }
 
-  void Clear() const {
-    BaseIterTable::Initialize();
-  }
+  void Clear() const { BaseIterTable::Initialize(); }
 
  protected:
   void EnsureCapacity() const {
@@ -598,7 +584,7 @@
 };
 
 
-template<typename KeyTraits>
+template <typename KeyTraits>
 class UnorderedHashMap : public HashMap<UnorderedHashTable<KeyTraits, 1> > {
  public:
   typedef HashMap<UnorderedHashTable<KeyTraits, 1> > BaseMap;
@@ -610,7 +596,7 @@
 };
 
 
-template<typename BaseIterTable>
+template <typename BaseIterTable>
 class HashSet : public BaseIterTable {
  public:
   explicit HashSet(RawArray* data)
@@ -642,7 +628,7 @@
   }
 
   // Like InsertOrGet, but calls NewKey to allocate a key object if needed.
-  template<typename Key>
+  template <typename Key>
   RawObject* InsertNewOrGet(const Key& key) const {
     EnsureCapacity();
     intptr_t entry = -1;
@@ -656,7 +642,7 @@
     }
   }
 
-  template<typename Key>
+  template <typename Key>
   RawObject* GetOrNull(const Key& key, bool* present = NULL) const {
     intptr_t entry = BaseIterTable::FindKey(key);
     if (present != NULL) {
@@ -665,7 +651,7 @@
     return (entry == -1) ? Object::null() : BaseIterTable::GetKey(entry);
   }
 
-  template<typename Key>
+  template <typename Key>
   bool Remove(const Key& key) const {
     intptr_t entry = BaseIterTable::FindKey(key);
     if (entry == -1) {
@@ -676,9 +662,7 @@
     }
   }
 
-  void Clear() const {
-    BaseIterTable::Initialize();
-  }
+  void Clear() const { BaseIterTable::Initialize(); }
 
  protected:
   void EnsureCapacity() const {
@@ -689,7 +673,7 @@
 };
 
 
-template<typename KeyTraits>
+template <typename KeyTraits>
 class UnorderedHashSet : public HashSet<UnorderedHashTable<KeyTraits, 0> > {
  public:
   typedef HashSet<UnorderedHashTable<KeyTraits, 0> > BaseSet;
diff --git a/runtime/vm/hash_table_test.cc b/runtime/vm/hash_table_test.cc
index 2d597b1..9c8daca 100644
--- a/runtime/vm/hash_table_test.cc
+++ b/runtime/vm/hash_table_test.cc
@@ -26,23 +26,17 @@
   static bool IsMatch(const char* key, const Object& obj) {
     return String::Cast(obj).Equals(key);
   }
-  static uword Hash(const char* key) {
-    return static_cast<uword>(strlen(key));
-  }
+  static uword Hash(const char* key) { return static_cast<uword>(strlen(key)); }
   static bool IsMatch(const Object& a, const Object& b) {
     return a.IsString() && b.IsString() &&
-        String::Cast(a).Equals(String::Cast(b));
+           String::Cast(a).Equals(String::Cast(b));
   }
-  static uword Hash(const Object& obj) {
-    return String::Cast(obj).Length();
-  }
-  static RawObject* NewKey(const char* key) {
-    return String::New(key);
-  }
+  static uword Hash(const Object& obj) { return String::Cast(obj).Length(); }
+  static RawObject* NewKey(const char* key) { return String::New(key); }
 };
 
 
-template<typename Table>
+template <typename Table>
 void Validate(const Table& table) {
   // Verify consistency of entry state tracking.
   intptr_t num_entries = table.NumEntries();
@@ -135,7 +129,7 @@
 // Checks that 'expected' and 'actual' are equal sets. If 'ordered' is true,
 // it also verifies that their iteration orders match, i.e., that actual's
 // insertion order coincides with lexicographic order.
-template<typename Set>
+template <typename Set>
 void VerifyStringSetsEqual(const std::set<std::string>& expected,
                            const Set& actual,
                            bool ordered) {
@@ -158,15 +152,15 @@
   if (!ordered) {
     std::sort(actual_vec.begin(), actual_vec.end());
   }
-  EXPECT(std::equal(actual_vec.begin(), actual_vec.end(),
-                    expected_vec.begin()));
+  EXPECT(
+      std::equal(actual_vec.begin(), actual_vec.end(), expected_vec.begin()));
 }
 
 
 // Checks that 'expected' and 'actual' are equal maps. If 'ordered' is true,
 // it also verifies that their iteration orders match, i.e., that actual's
 // insertion order coincides with lexicographic order.
-template<typename Map>
+template <typename Map>
 void VerifyStringMapsEqual(const std::map<std::string, int>& expected,
                            const Map& actual,
                            bool ordered) {
@@ -200,7 +194,7 @@
 }
 
 
-template<typename Set>
+template <typename Set>
 void TestSet(intptr_t initial_capacity, bool ordered) {
   std::set<std::string> expected;
   Set actual(HashTables::New<Set>(initial_capacity));
@@ -226,7 +220,7 @@
 }
 
 
-template<typename Map>
+template <typename Map>
 void TestMap(intptr_t initial_capacity, bool ordered) {
   std::map<std::string, int> expected;
   Map actual(HashTables::New<Map>(initial_capacity));
@@ -258,8 +252,7 @@
 
 
 TEST_CASE(Sets) {
-  for (intptr_t initial_capacity = 0;
-       initial_capacity < 32;
+  for (intptr_t initial_capacity = 0; initial_capacity < 32;
        ++initial_capacity) {
     TestSet<UnorderedHashSet<TestTraits> >(initial_capacity, false);
   }
@@ -267,8 +260,7 @@
 
 
 TEST_CASE(Maps) {
-  for (intptr_t initial_capacity = 0;
-       initial_capacity < 32;
+  for (intptr_t initial_capacity = 0; initial_capacity < 32;
        ++initial_capacity) {
     TestMap<UnorderedHashMap<TestTraits> >(initial_capacity, false);
   }
diff --git a/runtime/vm/heap.cc b/runtime/vm/heap.cc
index 97a6da6..a6a4daa 100644
--- a/runtime/vm/heap.cc
+++ b/runtime/vm/heap.cc
@@ -39,9 +39,7 @@
       gc_new_space_in_progress_(false),
       gc_old_space_in_progress_(false) {
   UpdateGlobalMaxUsed();
-  for (int sel = 0;
-       sel < kNumWeakSelectors;
-       sel++) {
+  for (int sel = 0; sel < kNumWeakSelectors; sel++) {
     new_weak_tables_[sel] = new WeakTable();
     old_weak_tables_[sel] = new WeakTable();
   }
@@ -53,9 +51,7 @@
   delete barrier_;
   delete barrier_done_;
 
-  for (int sel = 0;
-       sel < kNumWeakSelectors;
-       sel++) {
+  for (int sel = 0; sel < kNumWeakSelectors; sel++) {
     delete new_weak_tables_[sel];
     delete old_weak_tables_[sel];
   }
@@ -139,8 +135,8 @@
     return addr;
   }
   // Give up allocating this object.
-  OS::PrintErr(
-      "Exhausted heap space, trying to allocate %" Pd " bytes.\n", size);
+  OS::PrintErr("Exhausted heap space, trying to allocate %" Pd " bytes.\n",
+               size);
   return 0;
 }
 
@@ -179,8 +175,7 @@
 }
 
 bool Heap::Contains(uword addr) const {
-  return new_space_.Contains(addr) ||
-      old_space_.Contains(addr);
+  return new_space_.Contains(addr) || old_space_.Contains(addr);
 }
 
 
@@ -303,8 +298,7 @@
 bool Heap::BeginNewSpaceGC(Thread* thread) {
   MonitorLocker ml(&gc_in_progress_monitor_);
   bool start_gc_on_thread = true;
-  while (gc_new_space_in_progress_ ||
-         gc_old_space_in_progress_) {
+  while (gc_new_space_in_progress_ || gc_old_space_in_progress_) {
     start_gc_on_thread = !gc_new_space_in_progress_;
     ml.WaitWithSafepointCheck(thread);
   }
@@ -327,8 +321,7 @@
 bool Heap::BeginOldSpaceGC(Thread* thread) {
   MonitorLocker ml(&gc_in_progress_monitor_);
   bool start_gc_on_thread = true;
-  while (gc_new_space_in_progress_ ||
-         gc_old_space_in_progress_) {
+  while (gc_new_space_in_progress_ || gc_old_space_in_progress_) {
     start_gc_on_thread = !gc_old_space_in_progress_;
     ml.WaitWithSafepointCheck(thread);
   }
@@ -511,9 +504,7 @@
                 intptr_t max_old_gen_words,
                 intptr_t max_external_words) {
   ASSERT(isolate->heap() == NULL);
-  Heap* heap = new Heap(isolate,
-                        max_new_gen_words,
-                        max_old_gen_words,
+  Heap* heap = new Heap(isolate, max_new_gen_words, max_old_gen_words,
                         max_external_words);
   isolate->set_heap(heap);
 }
@@ -528,12 +519,12 @@
 ObjectSet* Heap::CreateAllocatedObjectSet(
     Zone* zone,
     MarkExpectation mark_expectation) const {
-  ObjectSet* allocated_set = new(zone) ObjectSet(zone);
+  ObjectSet* allocated_set = new (zone) ObjectSet(zone);
 
   this->AddRegionsToObjectSet(allocated_set);
   {
-    VerifyObjectVisitor object_visitor(
-        isolate(), allocated_set, mark_expectation);
+    VerifyObjectVisitor object_visitor(isolate(), allocated_set,
+                                       mark_expectation);
     this->VisitObjects(&object_visitor);
   }
 
@@ -541,8 +532,8 @@
   vm_isolate->heap()->AddRegionsToObjectSet(allocated_set);
   {
     // VM isolate heap is premarked.
-    VerifyObjectVisitor vm_object_visitor(
-        isolate(), allocated_set, kRequireMarked);
+    VerifyObjectVisitor vm_object_visitor(isolate(), allocated_set,
+                                          kRequireMarked);
     vm_isolate->heap()->VisitObjects(&vm_object_visitor);
   }
 
@@ -558,8 +549,8 @@
 
 bool Heap::VerifyGC(MarkExpectation mark_expectation) const {
   StackZone stack_zone(Thread::Current());
-  ObjectSet* allocated_set = CreateAllocatedObjectSet(stack_zone.GetZone(),
-                                                      mark_expectation);
+  ObjectSet* allocated_set =
+      CreateAllocatedObjectSet(stack_zone.GetZone(), mark_expectation);
   VerifyPointersVisitor visitor(isolate(), allocated_set);
   VisitObjectPointers(&visitor);
 
@@ -569,12 +560,12 @@
 
 
 void Heap::PrintSizes() const {
-  OS::PrintErr("New space (%" Pd64 "k of %" Pd64 "k) "
-               "Old space (%" Pd64 "k of %" Pd64 "k)\n",
-               (UsedInWords(kNew) / KBInWords),
-               (CapacityInWords(kNew) / KBInWords),
-               (UsedInWords(kOld) / KBInWords),
-               (CapacityInWords(kOld) / KBInWords));
+  OS::PrintErr(
+      "New space (%" Pd64 "k of %" Pd64
+      "k) "
+      "Old space (%" Pd64 "k of %" Pd64 "k)\n",
+      (UsedInWords(kNew) / KBInWords), (CapacityInWords(kNew) / KBInWords),
+      (UsedInWords(kOld) / KBInWords), (CapacityInWords(kOld) / KBInWords));
 }
 
 
@@ -584,14 +575,14 @@
 
 
 int64_t Heap::CapacityInWords(Space space) const {
-  return space == kNew ? new_space_.CapacityInWords() :
-                         old_space_.CapacityInWords();
+  return space == kNew ? new_space_.CapacityInWords()
+                       : old_space_.CapacityInWords();
 }
 
 
 int64_t Heap::ExternalInWords(Space space) const {
-  return space == kNew ? new_space_.ExternalInWords() :
-                         old_space_.ExternalInWords();
+  return space == kNew ? new_space_.ExternalInWords()
+                       : old_space_.ExternalInWords();
 }
 
 
@@ -639,13 +630,13 @@
 
 int64_t Heap::HashCount() const {
   return new_weak_tables_[kHashes]->count() +
-      old_weak_tables_[kHashes]->count();
+         old_weak_tables_[kHashes]->count();
 }
 
 
 int64_t Heap::ObjectIdCount() const {
   return new_weak_tables_[kObjectIds]->count() +
-      old_weak_tables_[kObjectIds]->count();
+         old_weak_tables_[kObjectIds]->count();
 }
 
 
@@ -734,12 +725,14 @@
 
   if ((FLAG_verbose_gc_hdr != 0) &&
       (((stats_.num_ - 1) % FLAG_verbose_gc_hdr) == 0)) {
-    OS::PrintErr("[    GC    |  space  | count | start | gc time | "
-                 "new gen (KB) | old gen (KB) | timers | data ]\n"
-                 "[ (isolate)| (reason)|       |  (s)  |   (ms)  | "
-                 "used,cap,ext | used,cap,ext |  (ms)  |      ]\n");
+    OS::PrintErr(
+        "[    GC    |  space  | count | start | gc time | "
+        "new gen (KB) | old gen (KB) | timers | data ]\n"
+        "[ (isolate)| (reason)|       |  (s)  |   (ms)  | "
+        "used,cap,ext | used,cap,ext |  (ms)  |      ]\n");
   }
 
+  // clang-format off
   const char* space_str = stats_.space_ == kNew ? "Scavenge" : "Mark-Sweep";
   OS::PrintErr(
     "[ GC(%" Pd64 "): %s(%s), "  // GC(isolate), space(reason)
@@ -780,6 +773,7 @@
     stats_.data_[1],
     stats_.data_[2],
     stats_.data_[3]);
+  // clang-format on
 }
 
 
@@ -789,55 +783,31 @@
     return;
   }
   event->SetNumArguments(12);
-  event->FormatArgument(0,
-                        "Before.New.Used (kB)",
-                        "%" Pd "",
+  event->FormatArgument(0, "Before.New.Used (kB)", "%" Pd "",
                         RoundWordsToKB(stats_.before_.new_.used_in_words));
-  event->FormatArgument(1,
-                        "After.New.Used (kB)",
-                        "%" Pd "",
+  event->FormatArgument(1, "After.New.Used (kB)", "%" Pd "",
                         RoundWordsToKB(stats_.after_.new_.used_in_words));
-  event->FormatArgument(2,
-                        "Before.Old.Used (kB)",
-                        "%" Pd "",
+  event->FormatArgument(2, "Before.Old.Used (kB)", "%" Pd "",
                         RoundWordsToKB(stats_.before_.old_.used_in_words));
-  event->FormatArgument(3,
-                        "After.Old.Used (kB)",
-                        "%" Pd "",
+  event->FormatArgument(3, "After.Old.Used (kB)", "%" Pd "",
                         RoundWordsToKB(stats_.after_.old_.used_in_words));
 
-  event->FormatArgument(4,
-                        "Before.New.Capacity (kB)",
-                        "%" Pd "",
+  event->FormatArgument(4, "Before.New.Capacity (kB)", "%" Pd "",
                         RoundWordsToKB(stats_.before_.new_.capacity_in_words));
-  event->FormatArgument(5,
-                        "After.New.Capacity (kB)",
-                        "%" Pd "",
+  event->FormatArgument(5, "After.New.Capacity (kB)", "%" Pd "",
                         RoundWordsToKB(stats_.after_.new_.capacity_in_words));
-  event->FormatArgument(6,
-                        "Before.Old.Capacity (kB)",
-                        "%" Pd "",
+  event->FormatArgument(6, "Before.Old.Capacity (kB)", "%" Pd "",
                         RoundWordsToKB(stats_.before_.old_.capacity_in_words));
-  event->FormatArgument(7,
-                        "After.Old.Capacity (kB)",
-                        "%" Pd "",
+  event->FormatArgument(7, "After.Old.Capacity (kB)", "%" Pd "",
                         RoundWordsToKB(stats_.after_.old_.capacity_in_words));
 
-  event->FormatArgument(8,
-                        "Before.New.External (kB)",
-                        "%" Pd "",
+  event->FormatArgument(8, "Before.New.External (kB)", "%" Pd "",
                         RoundWordsToKB(stats_.before_.new_.external_in_words));
-  event->FormatArgument(9,
-                        "After.New.External (kB)",
-                        "%" Pd "",
+  event->FormatArgument(9, "After.New.External (kB)", "%" Pd "",
                         RoundWordsToKB(stats_.after_.new_.external_in_words));
-  event->FormatArgument(10,
-                        "Before.Old.External (kB)",
-                        "%" Pd "",
+  event->FormatArgument(10, "Before.Old.External (kB)", "%" Pd "",
                         RoundWordsToKB(stats_.before_.old_.external_in_words));
-  event->FormatArgument(11,
-                        "After.Old.External (kB)",
-                        "%" Pd "",
+  event->FormatArgument(11, "After.Old.External (kB)", "%" Pd "",
                         RoundWordsToKB(stats_.after_.old_.external_in_words));
 #endif  // !defined(PRODUCT)
 }
@@ -845,15 +815,15 @@
 
 NoHeapGrowthControlScope::NoHeapGrowthControlScope()
     : StackResource(Thread::Current()) {
-    Heap* heap = reinterpret_cast<Isolate*>(isolate())->heap();
-    current_growth_controller_state_ = heap->GrowthControlState();
-    heap->DisableGrowthControl();
+  Heap* heap = reinterpret_cast<Isolate*>(isolate())->heap();
+  current_growth_controller_state_ = heap->GrowthControlState();
+  heap->DisableGrowthControl();
 }
 
 
 NoHeapGrowthControlScope::~NoHeapGrowthControlScope() {
-    Heap* heap = reinterpret_cast<Isolate*>(isolate())->heap();
-    heap->SetGrowthControlState(current_growth_controller_state_);
+  Heap* heap = reinterpret_cast<Isolate*>(isolate())->heap();
+  heap->SetGrowthControlState(current_growth_controller_state_);
 }
 
 
diff --git a/runtime/vm/heap.h b/runtime/vm/heap.h
index 30210bc..3e05e13 100644
--- a/runtime/vm/heap.h
+++ b/runtime/vm/heap.h
@@ -33,17 +33,9 @@
     kCode,
   };
 
-  enum WeakSelector {
-    kPeers = 0,
-    kHashes,
-    kObjectIds,
-    kNumWeakSelectors
-  };
+  enum WeakSelector { kPeers = 0, kHashes, kObjectIds, kNumWeakSelectors };
 
-  enum ApiCallbacks {
-    kIgnoreApiCallbacks,
-    kInvokeApiCallbacks
-  };
+  enum ApiCallbacks { kIgnoreApiCallbacks, kInvokeApiCallbacks };
 
   enum GCReason {
     kNewSpace,
@@ -211,7 +203,7 @@
     if (space == kNew) {
       return new_weak_tables_[selector];
     }
-    ASSERT(space ==kOld);
+    ASSERT(space == kOld);
     return old_weak_tables_[selector];
   }
   void SetWeakTable(Space space, WeakSelector selector, WeakTable* value) {
@@ -272,13 +264,12 @@
       int64_t micros_;
       SpaceUsage new_;
       SpaceUsage old_;
+
      private:
       DISALLOW_COPY_AND_ASSIGN(Data);
     };
 
-    enum {
-      kDataEntries = 4
-    };
+    enum { kDataEntries = 4 };
 
     Data before_;
     Data after_;
@@ -312,10 +303,12 @@
   bool VerifyGC(MarkExpectation mark_expectation = kForbidMarked) const;
 
   // Helper functions for garbage collection.
-  void CollectNewSpaceGarbage(
-      Thread* thread, ApiCallbacks api_callbacks, GCReason reason);
-  void CollectOldSpaceGarbage(
-      Thread* thread, ApiCallbacks api_callbacks, GCReason reason);
+  void CollectNewSpaceGarbage(Thread* thread,
+                              ApiCallbacks api_callbacks,
+                              GCReason reason);
+  void CollectOldSpaceGarbage(Thread* thread,
+                              ApiCallbacks api_callbacks,
+                              GCReason reason);
 
   // GC stats collection.
   void RecordBeforeGC(Space space, GCReason reason);
@@ -355,10 +348,10 @@
   bool gc_new_space_in_progress_;
   bool gc_old_space_in_progress_;
 
-  friend class Become;  // VisitObjectPointers
+  friend class Become;       // VisitObjectPointers
   friend class Precompiler;  // VisitObjects
   friend class ServiceEvent;
-  friend class PageSpace;  // VerifyGC
+  friend class PageSpace;             // VerifyGC
   friend class IsolateReloadContext;  // VisitObjects
 
   DISALLOW_COPY_AND_ASSIGN(Heap);
@@ -369,6 +362,7 @@
  public:
   HeapIterationScope();
   ~HeapIterationScope();
+
  private:
   NoSafepointScope no_safepoint_scope_;
   PageSpace* old_space_;
@@ -381,6 +375,7 @@
  public:
   NoHeapGrowthControlScope();
   ~NoHeapGrowthControlScope();
+
  private:
   bool current_growth_controller_state_;
   DISALLOW_COPY_AND_ASSIGN(NoHeapGrowthControlScope);
diff --git a/runtime/vm/heap_test.cc b/runtime/vm/heap_test.cc
index 7454cf4..939225f 100644
--- a/runtime/vm/heap_test.cc
+++ b/runtime/vm/heap_test.cc
@@ -15,9 +15,9 @@
 
 TEST_CASE(OldGC) {
   const char* kScriptChars =
-  "main() {\n"
-  "  return [1, 2, 3];\n"
-  "}\n";
+      "main() {\n"
+      "  return [1, 2, 3];\n"
+      "}\n";
   FLAG_verbose_gc = true;
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
   Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
@@ -35,9 +35,9 @@
 TEST_CASE(OldGC_Unsync) {
   FLAG_marker_tasks = 0;
   const char* kScriptChars =
-  "main() {\n"
-  "  return [1, 2, 3];\n"
-  "}\n";
+      "main() {\n"
+      "  return [1, 2, 3];\n"
+      "}\n";
   FLAG_verbose_gc = true;
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
   Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
@@ -54,9 +54,9 @@
 
 TEST_CASE(LargeSweep) {
   const char* kScriptChars =
-  "main() {\n"
-  "  return new List(8 * 1024 * 1024);\n"
-  "}\n";
+      "main() {\n"
+      "  return new List(8 * 1024 * 1024);\n"
+      "}\n";
   FLAG_verbose_gc = true;
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
   Dart_EnterScope();
@@ -101,15 +101,15 @@
 
 TEST_CASE(ClassHeapStats) {
   const char* kScriptChars =
-  "class A {\n"
-  "  var a;\n"
-  "  var b;\n"
-  "}\n"
-  ""
-  "main() {\n"
-  "  var x = new A();\n"
-  "  return new A();\n"
-  "}\n";
+      "class A {\n"
+      "  var a;\n"
+      "  var b;\n"
+      "}\n"
+      ""
+      "main() {\n"
+      "  var x = new A();\n"
+      "  return new A();\n"
+      "}\n";
   Dart_Handle h_lib = TestCase::LoadTestScript(kScriptChars, NULL);
   Isolate* isolate = Isolate::Current();
   ClassTable* class_table = isolate->class_table();
@@ -126,8 +126,7 @@
   ASSERT(!cls.IsNull());
   intptr_t cid = cls.id();
   ClassHeapStats* class_stats =
-      ClassHeapStatsTestHelper::GetHeapStatsForCid(class_table,
-                                                   cid);
+      ClassHeapStatsTestHelper::GetHeapStatsForCid(class_table, cid);
   // Verify preconditions:
   EXPECT_EQ(0, class_stats->pre_gc.old_count);
   EXPECT_EQ(0, class_stats->post_gc.old_count);
@@ -196,20 +195,19 @@
 
 TEST_CASE(ArrayHeapStats) {
   const char* kScriptChars =
-  "List f(int len) {\n"
-  "  return new List(len);\n"
-  "}\n"
-  ""
-  "main() {\n"
-  "  return f(1234);\n"
-  "}\n";
+      "List f(int len) {\n"
+      "  return new List(len);\n"
+      "}\n"
+      ""
+      "main() {\n"
+      "  return f(1234);\n"
+      "}\n";
   Dart_Handle h_lib = TestCase::LoadTestScript(kScriptChars, NULL);
   Isolate* isolate = Isolate::Current();
   ClassTable* class_table = isolate->class_table();
   intptr_t cid = kArrayCid;
   ClassHeapStats* class_stats =
-      ClassHeapStatsTestHelper::GetHeapStatsForCid(class_table,
-                                                   cid);
+      ClassHeapStatsTestHelper::GetHeapStatsForCid(class_table, cid);
   Dart_EnterScope();
   // Invoke 'main' twice, since initial compilation might trigger extra array
   // allocations.
@@ -242,11 +240,10 @@
     EXPECT_GT(Thread::Current()->no_safepoint_scope_depth(), 0);
 #endif
   }
-  virtual ~FindOnly() { }
+  virtual ~FindOnly() {}
 
-  virtual bool FindObject(RawObject* obj) const {
-    return obj == target_;
-  }
+  virtual bool FindObject(RawObject* obj) const { return obj == target_; }
+
  private:
   RawObject* target_;
 };
@@ -254,8 +251,8 @@
 
 class FindNothing : public FindObjectVisitor {
  public:
-  FindNothing() { }
-  virtual ~FindNothing() { }
+  FindNothing() {}
+  virtual ~FindNothing() {}
   virtual bool FindObject(RawObject* obj) const { return false; }
 };
 
diff --git a/runtime/vm/il_printer.cc b/runtime/vm/il_printer.cc
index 01515639..bfee006 100644
--- a/runtime/vm/il_printer.cc
+++ b/runtime/vm/il_printer.cc
@@ -13,11 +13,15 @@
 
 #ifndef PRODUCT
 
-DEFINE_FLAG(bool, display_sorted_ic_data, false,
-    "Calls display a unary, sorted-by count form of ICData");
+DEFINE_FLAG(bool,
+            display_sorted_ic_data,
+            false,
+            "Calls display a unary, sorted-by count form of ICData");
 DEFINE_FLAG(bool, print_environments, false, "Print SSA environments.");
-DEFINE_FLAG(charp, print_flow_graph_filter, NULL,
-    "Print only IR of functions with matching names");
+DEFINE_FLAG(charp,
+            print_flow_graph_filter,
+            NULL,
+            "Print only IR of functions with matching names");
 
 DECLARE_FLAG(bool, trace_inlining_intervals);
 
@@ -32,8 +36,7 @@
 void BufferFormatter::VPrint(const char* format, va_list args) {
   intptr_t available = size_ - position_;
   if (available <= 0) return;
-  intptr_t written =
-      OS::VSNPrint(buffer_ + position_, available, format, args);
+  intptr_t written = OS::VSNPrint(buffer_ + position_, available, format, args);
   if (written >= 0) {
     position_ += (available <= written) ? available : written;
   }
@@ -65,8 +68,8 @@
     const intptr_t token_len = strlen(token);
     if (token[token_len - 1] == '%') {
       if (function_name_len > token_len) {
-        const char* suffix = function_name +
-            (function_name_len - token_len + 1);
+        const char* suffix =
+            function_name + (function_name_len - token_len + 1);
         if (strncmp(suffix, token, token_len - 1) == 0) {
           found = true;
           break;
@@ -154,17 +157,16 @@
                                       const AbstractType& dst_type,
                                       const String& dst_name,
                                       bool eliminated) {
-    const char* compile_type_name = "unknown";
-    if (value != NULL && value->reaching_type_ != NULL) {
-      compile_type_name = value->reaching_type_->ToCString();
-    }
-    THR_Print("%s type check: compile type %s is %s specific than "
-              "type '%s' of '%s'.\n",
-                         eliminated ? "Eliminated" : "Generated",
-                         compile_type_name,
-                         eliminated ? "more" : "not more",
-                         String::Handle(dst_type.Name()).ToCString(),
-                         dst_name.ToCString());
+  const char* compile_type_name = "unknown";
+  if (value != NULL && value->reaching_type_ != NULL) {
+    compile_type_name = value->reaching_type_->ToCString();
+  }
+  THR_Print(
+      "%s type check: compile type %s is %s specific than "
+      "type '%s' of '%s'.\n",
+      eliminated ? "Eliminated" : "Generated", compile_type_name,
+      eliminated ? "more" : "not more",
+      String::Handle(dst_type.Name()).ToCString(), dst_name.ToCString());
 }
 
 
@@ -231,14 +233,13 @@
                                     const ICData& ic_data_orig) {
   const ICData& ic_data =
       ICData::Handle(ic_data_orig.AsUnaryClassChecksSortedByCount());
-  f->Print(" IC[n:%" Pd"; ", ic_data.NumberOfChecks());
+  f->Print(" IC[n:%" Pd "; ", ic_data.NumberOfChecks());
   for (intptr_t i = 0; i < ic_data.NumberOfChecks(); i++) {
     const intptr_t count = ic_data.GetCountAt(i);
     const intptr_t cid = ic_data.GetReceiverClassIdAt(i);
     const Class& cls =
         Class::Handle(Isolate::Current()->class_table()->At(cid));
-    f->Print("%s : %" Pd ", ",
-        String::Handle(cls.Name()).ToCString(), count);
+    f->Print("%s : %" Pd ", ", String::Handle(cls.Name()).ToCString(), count);
   }
   f->Print("]");
 }
@@ -259,7 +260,7 @@
   if (definition.HasSSATemp()) {
     if (definition.HasPairRepresentation()) {
       f->Print("(v%" Pd ", v%" Pd ")", definition.ssa_temp_index(),
-                                       definition.ssa_temp_index() + 1);
+               definition.ssa_temp_index() + 1);
     } else {
       f->Print("v%" Pd "", definition.ssa_temp_index());
     }
@@ -332,8 +333,7 @@
 void Value::PrintTo(BufferFormatter* f) const {
   PrintUse(f, *definition());
 
-  if ((reaching_type_ != NULL) &&
-      (reaching_type_ != definition()->type_)) {
+  if ((reaching_type_ != NULL) && (reaching_type_ != definition()->type_)) {
     f->Print(" ");
     reaching_type_->PrintTo(f);
   }
@@ -423,9 +423,7 @@
 
 void AssertAssignableInstr::PrintOperandsTo(BufferFormatter* f) const {
   value()->PrintTo(f);
-  f->Print(", %s, '%s'",
-           dst_type().ToCString(),
-           dst_name().ToCString());
+  f->Print(", %s, '%s'", dst_type().ToCString(), dst_name().ToCString());
   f->Print(" instantiator_type_arguments(");
   instantiator_type_arguments()->PrintTo(f);
   f->Print(")");
@@ -498,8 +496,8 @@
   left()->PrintTo(f);
   f->Print(" %s [", Token::Str(kind()));
   for (intptr_t i = 0; i < cid_results().length(); i += 2) {
-    f->Print("0x%" Px ":%s ",
-        cid_results()[i], cid_results()[i + 1] == 0 ? "false" : "true");
+    f->Print("0x%" Px ":%s ", cid_results()[i],
+             cid_results()[i + 1] == 0 ? "false" : "true");
   }
   f->Print("] ");
 }
@@ -538,8 +536,7 @@
 
 
 void GuardFieldInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%s %s, ",
-           String::Handle(field().name()).ToCString(),
+  f->Print("%s %s, ", String::Handle(field().name()).ToCString(),
            field().GuardedPropertiesAsCString());
   value()->PrintTo(f);
 }
@@ -549,8 +546,7 @@
   if (field().IsNull()) {
     f->Print("{%" Pd "}, ", offset_in_bytes());
   } else {
-    f->Print("%s {%" Pd "}, ",
-             String::Handle(field().name()).ToCString(),
+    f->Print("%s {%" Pd "}, ", String::Handle(field().name()).ToCString(),
              field().Offset());
   }
   instance()->PrintTo(f);
@@ -561,9 +557,7 @@
 
 void IfThenElseInstr::PrintOperandsTo(BufferFormatter* f) const {
   comparison()->PrintOperandsTo(f);
-  f->Print(" ? %" Pd " : %" Pd,
-           if_true_,
-           if_false_);
+  f->Print(" ? %" Pd " : %" Pd, if_true_, if_false_);
 }
 
 
@@ -580,9 +574,8 @@
 
 void InstanceOfInstr::PrintOperandsTo(BufferFormatter* f) const {
   value()->PrintTo(f);
-  f->Print(" %s %s",
-            negate_result() ? "ISNOT" : "IS",
-            String::Handle(type().Name()).ToCString());
+  f->Print(" %s %s", negate_result() ? "ISNOT" : "IS",
+           String::Handle(type().Name()).ToCString());
   f->Print(" type-arg(");
   instantiator_type_arguments()->PrintTo(f);
   f->Print(")");
@@ -629,12 +622,11 @@
     const char* expected = "?";
     if (field()->guarded_cid() != kIllegalCid) {
       const Class& cls = Class::Handle(
-            Isolate::Current()->class_table()->At(field()->guarded_cid()));
+          Isolate::Current()->class_table()->At(field()->guarded_cid()));
       expected = String::Handle(cls.Name()).ToCString();
     }
 
-    f->Print(" [%s %s]",
-             field()->is_nullable() ? "nullable" : "non-nullable",
+    f->Print(" [%s %s]", field()->is_nullable() ? "nullable" : "non-nullable",
              expected);
   }
 
@@ -991,7 +983,7 @@
   value()->PrintTo(f);
 
   const Class& cls =
-    Class::Handle(Isolate::Current()->class_table()->At(cid()));
+      Class::Handle(Isolate::Current()->class_table()->At(cid()));
   f->Print(", %s", String::Handle(cls.ScrubbedName()).ToCString());
 }
 
@@ -1032,8 +1024,8 @@
 
 void JoinEntryInstr::PrintTo(BufferFormatter* f) const {
   if (try_index() != CatchClauseNode::kInvalidTryIndex) {
-    f->Print("B%" Pd "[join try_idx %" Pd "]:%" Pd " pred(",
-             block_id(), try_index(), GetDeoptId());
+    f->Print("B%" Pd "[join try_idx %" Pd "]:%" Pd " pred(", block_id(),
+             try_index(), GetDeoptId());
   } else {
     f->Print("B%" Pd "[join]:%" Pd " pred(", block_id(), GetDeoptId());
   }
@@ -1082,7 +1074,7 @@
 }
 
 
-static const char *RepresentationToCString(Representation rep) {
+static const char* RepresentationToCString(Representation rep) {
   switch (rep) {
     case kTagged:
       return "tagged";
@@ -1117,8 +1109,8 @@
 
 void PhiInstr::PrintTo(BufferFormatter* f) const {
   if (HasPairRepresentation()) {
-    f->Print("(v%" Pd ", v%" Pd ") <- phi(",
-             ssa_temp_index(), ssa_temp_index() + 1);
+    f->Print("(v%" Pd ", v%" Pd ") <- phi(", ssa_temp_index(),
+             ssa_temp_index() + 1);
   } else {
     f->Print("v%" Pd " <- phi(", ssa_temp_index());
   }
@@ -1137,8 +1129,7 @@
     range_->PrintTo(f);
   }
 
-  if (representation() != kNoRepresentation &&
-      representation() != kTagged) {
+  if (representation() != kNoRepresentation && representation() != kTagged) {
     f->Print(" %s", RepresentationToCString(representation()));
   }
 
@@ -1158,10 +1149,8 @@
 
 
 void UnboxedIntConverterInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%s->%s%s, ",
-           RepresentationToCString(from()),
-           RepresentationToCString(to()),
-           is_truncating() ? "[tr]" : "");
+  f->Print("%s->%s%s, ", RepresentationToCString(from()),
+           RepresentationToCString(to()), is_truncating() ? "[tr]" : "");
   Definition::PrintOperandsTo(f);
 }
 
@@ -1178,8 +1167,8 @@
 
 void TargetEntryInstr::PrintTo(BufferFormatter* f) const {
   if (try_index() != CatchClauseNode::kInvalidTryIndex) {
-    f->Print("B%" Pd "[target try_idx %" Pd "]:%" Pd,
-             block_id(), try_index(), GetDeoptId());
+    f->Print("B%" Pd "[target try_idx %" Pd "]:%" Pd, block_id(), try_index(),
+             GetDeoptId());
   } else {
     f->Print("B%" Pd "[target]:%" Pd, block_id(), GetDeoptId());
   }
@@ -1245,9 +1234,8 @@
   f->Print("if ");
   comparison()->PrintTo(f);
 
-  f->Print(" goto (%" Pd ", %" Pd ")",
-            true_successor()->block_id(),
-            false_successor()->block_id());
+  f->Print(" goto (%" Pd ", %" Pd ")", true_successor()->block_id(),
+           false_successor()->block_id());
 }
 
 
diff --git a/runtime/vm/il_printer.h b/runtime/vm/il_printer.h
index 88496fb..7b27a61 100644
--- a/runtime/vm/il_printer.h
+++ b/runtime/vm/il_printer.h
@@ -13,9 +13,7 @@
 class BufferFormatter : public ValueObject {
  public:
   BufferFormatter(char* buffer, intptr_t size)
-    : position_(0),
-      buffer_(buffer),
-      size_(size) { }
+      : position_(0), buffer_(buffer), size_(size) {}
 
   void VPrint(const char* format, va_list args);
   void Print(const char* format, ...) PRINTF_ATTRIBUTE(2, 3);
@@ -37,11 +35,11 @@
  public:
   static const intptr_t kPrintAll = -1;
 
-  FlowGraphPrinter(const FlowGraph& flow_graph,
-                   bool print_locations = false)
+  explicit FlowGraphPrinter(const FlowGraph& flow_graph,
+                            bool print_locations = false)
       : function_(flow_graph.function()),
         block_order_(flow_graph.reverse_postorder()),
-        print_locations_(print_locations) { }
+        print_locations_(print_locations) {}
 
   // Print the instructions in a block terminated by newlines.  Add "goto N"
   // to the end of the block if it ends with an unconditional jump to
diff --git a/runtime/vm/instructions.h b/runtime/vm/instructions.h
index 8b14145..be8c604 100644
--- a/runtime/vm/instructions.h
+++ b/runtime/vm/instructions.h
@@ -28,9 +28,7 @@
 class Object;
 class Code;
 
-bool DecodeLoadObjectFromPoolOrThread(uword pc,
-                                      const Code& code,
-                                      Object* obj);
+bool DecodeLoadObjectFromPoolOrThread(uword pc, const Code& code, Object* obj);
 
 }  // namespace dart
 
diff --git a/runtime/vm/instructions_arm.cc b/runtime/vm/instructions_arm.cc
index 1541f40..8de71db 100644
--- a/runtime/vm/instructions_arm.cc
+++ b/runtime/vm/instructions_arm.cc
@@ -26,10 +26,8 @@
   ASSERT(*(reinterpret_cast<uword*>(end_) - 1) == 0xe12fff3e);
 
   Register reg;
-  ic_data_load_end_ =
-      InstructionPattern::DecodeLoadWordFromPool(end_ - 2 * Instr::kInstrSize,
-                                                 &reg,
-                                                 &target_code_pool_index_);
+  ic_data_load_end_ = InstructionPattern::DecodeLoadWordFromPool(
+      end_ - 2 * Instr::kInstrSize, &reg, &target_code_pool_index_);
   ASSERT(reg == CODE_REG);
 }
 
@@ -44,13 +42,10 @@
   ASSERT(*(reinterpret_cast<uword*>(end_) - 1) == 0xe12fff3e);
 
   Register reg;
-  uword native_function_load_end =
-      InstructionPattern::DecodeLoadWordFromPool(end_ - 2 * Instr::kInstrSize,
-                                                 &reg,
-                                                 &target_code_pool_index_);
+  uword native_function_load_end = InstructionPattern::DecodeLoadWordFromPool(
+      end_ - 2 * Instr::kInstrSize, &reg, &target_code_pool_index_);
   ASSERT(reg == CODE_REG);
-  InstructionPattern::DecodeLoadWordFromPool(native_function_load_end,
-                                             &reg,
+  InstructionPattern::DecodeLoadWordFromPool(native_function_load_end, &reg,
                                              &native_function_pool_index_);
   ASSERT(reg == R9);
 }
@@ -76,7 +71,7 @@
 
 void NativeCallPattern::set_native_function(NativeFunction func) const {
   object_pool_.SetRawValueAt(native_function_pool_index_,
-      reinterpret_cast<uword>(func));
+                             reinterpret_cast<uword>(func));
 }
 
 
@@ -156,8 +151,10 @@
 }
 
 
-static bool IsLoadWithOffset(int32_t instr, Register base,
-                             intptr_t* offset, Register* dst) {
+static bool IsLoadWithOffset(int32_t instr,
+                             Register base,
+                             intptr_t* offset,
+                             Register* dst) {
   if ((instr & 0xffff0000) == (0xe5900000 | (base << 16))) {
     // ldr reg, [base, #+offset]
     *offset = instr & 0xfff;
@@ -203,9 +200,7 @@
 }
 
 
-bool DecodeLoadObjectFromPoolOrThread(uword pc,
-                                      const Code& code,
-                                      Object* obj) {
+bool DecodeLoadObjectFromPoolOrThread(uword pc, const Code& code, Object* obj) {
   ASSERT(code.ContainsInstructionAt(pc));
 
   int32_t instr = Instr::At(pc)->InstructionBits();
@@ -230,9 +225,7 @@
 RawICData* CallPattern::IcData() {
   if (ic_data_.IsNull()) {
     Register reg;
-    InstructionPattern::DecodeLoadObject(ic_data_load_end_,
-                                         object_pool_,
-                                         &reg,
+    InstructionPattern::DecodeLoadObject(ic_data_load_end_, object_pool_, &reg,
                                          &ic_data_);
     ASSERT(reg == R9);
   }
@@ -260,14 +253,11 @@
   ASSERT(*(reinterpret_cast<uword*>(pc) - 1) == 0xe12fff3e);
 
   Register reg;
-  uword data_load_end =
-      InstructionPattern::DecodeLoadWordFromPool(pc - Instr::kInstrSize,
-                                                 &reg,
-                                                 &data_pool_index_);
+  uword data_load_end = InstructionPattern::DecodeLoadWordFromPool(
+      pc - Instr::kInstrSize, &reg, &data_pool_index_);
   ASSERT(reg == R9);
   InstructionPattern::DecodeLoadWordFromPool(data_load_end - Instr::kInstrSize,
-                                             &reg,
-                                             &target_pool_index_);
+                                             &reg, &target_pool_index_);
   ASSERT(reg == CODE_REG);
 }
 
@@ -278,8 +268,7 @@
 
 
 RawCode* SwitchableCallPattern::target() const {
-  return reinterpret_cast<RawCode*>(
-      object_pool_.ObjectAt(target_pool_index_));
+  return reinterpret_cast<RawCode*>(object_pool_.ObjectAt(target_pool_index_));
 }
 
 
@@ -295,9 +284,7 @@
 }
 
 
-ReturnPattern::ReturnPattern(uword pc)
-    : pc_(pc) {
-}
+ReturnPattern::ReturnPattern(uword pc) : pc_(pc) {}
 
 
 bool ReturnPattern::IsValid() const {
@@ -305,8 +292,8 @@
   const int32_t B4 = 1 << 4;
   const int32_t B21 = 1 << 21;
   const int32_t B24 = 1 << 24;
-  int32_t instruction = (static_cast<int32_t>(AL) << kConditionShift) |
-                         B24 | B21 | (0xfff << 8) | B4 |
+  int32_t instruction = (static_cast<int32_t>(AL) << kConditionShift) | B24 |
+                        B21 | (0xfff << 8) | B4 |
                         (static_cast<int32_t>(LR) << kRmShift);
   const ARMVersion version = TargetCPUFeatures::arm_version();
   if ((version == ARMv5TE) || (version == ARMv6)) {
diff --git a/runtime/vm/instructions_arm.h b/runtime/vm/instructions_arm.h
index efaa73b..c4f4811 100644
--- a/runtime/vm/instructions_arm.h
+++ b/runtime/vm/instructions_arm.h
@@ -121,9 +121,7 @@
   // bx_lr = 1.
   static const int kLengthInBytes = 1 * Instr::kInstrSize;
 
-  int pattern_length_in_bytes() const {
-    return kLengthInBytes;
-  }
+  int pattern_length_in_bytes() const { return kLengthInBytes; }
 
   bool IsValid() const;
 
diff --git a/runtime/vm/instructions_arm64.cc b/runtime/vm/instructions_arm64.cc
index 0895ae9..b7b26b5 100644
--- a/runtime/vm/instructions_arm64.cc
+++ b/runtime/vm/instructions_arm64.cc
@@ -26,10 +26,8 @@
   ASSERT(*(reinterpret_cast<uint32_t*>(end_) - 1) == 0xd63f0200);
 
   Register reg;
-  ic_data_load_end_ =
-      InstructionPattern::DecodeLoadWordFromPool(end_ - 2 * Instr::kInstrSize,
-                                                 &reg,
-                                                 &target_code_pool_index_);
+  ic_data_load_end_ = InstructionPattern::DecodeLoadWordFromPool(
+      end_ - 2 * Instr::kInstrSize, &reg, &target_code_pool_index_);
   ASSERT(reg == CODE_REG);
 }
 
@@ -44,13 +42,10 @@
   ASSERT(*(reinterpret_cast<uint32_t*>(end_) - 1) == 0xd63f0200);
 
   Register reg;
-  uword native_function_load_end =
-      InstructionPattern::DecodeLoadWordFromPool(end_ - 2 * Instr::kInstrSize,
-                                                 &reg,
-                                                 &target_code_pool_index_);
+  uword native_function_load_end = InstructionPattern::DecodeLoadWordFromPool(
+      end_ - 2 * Instr::kInstrSize, &reg, &target_code_pool_index_);
   ASSERT(reg == CODE_REG);
-  InstructionPattern::DecodeLoadWordFromPool(native_function_load_end,
-                                             &reg,
+  InstructionPattern::DecodeLoadWordFromPool(native_function_load_end, &reg,
                                              &native_function_pool_index_);
   ASSERT(reg == R5);
 }
@@ -76,7 +71,7 @@
 
 void NativeCallPattern::set_native_function(NativeFunction func) const {
   object_pool_.SetRawValueAt(native_function_pool_index_,
-      reinterpret_cast<uword>(func));
+                             reinterpret_cast<uword>(func));
 }
 
 
@@ -210,7 +205,7 @@
 
   // Last instruction is always an ldr into a 64-bit X register.
   ASSERT(instr->IsLoadStoreRegOp() && (instr->Bit(22) == 1) &&
-        (instr->Bits(30, 2) == 3));
+         (instr->Bits(30, 2) == 3));
 
   // Grab the destination register from the ldr instruction.
   *reg = instr->RtField();
@@ -261,9 +256,7 @@
 }
 
 
-bool DecodeLoadObjectFromPoolOrThread(uword pc,
-                                      const Code& code,
-                                      Object* obj) {
+bool DecodeLoadObjectFromPoolOrThread(uword pc, const Code& code, Object* obj) {
   ASSERT(code.ContainsInstructionAt(pc));
 
   Instr* instr = Instr::At(pc);
@@ -299,7 +292,7 @@
   Instr* instr = Instr::At(start);
   const int32_t upper12 = offset & 0x00fff000;
   const int32_t lower12 = offset & 0x00000fff;
-  ASSERT((offset & 0xff000000) == 0);  // Can't encode > 24 bits.
+  ASSERT((offset & 0xff000000) == 0);        // Can't encode > 24 bits.
   ASSERT(((lower12 >> 3) << 3) == lower12);  // 8-byte aligned.
   instr->SetImm12Bits(instr->InstructionBits(), lower12 >> 3);
 
@@ -313,9 +306,7 @@
 RawICData* CallPattern::IcData() {
   if (ic_data_.IsNull()) {
     Register reg;
-    InstructionPattern::DecodeLoadObject(ic_data_load_end_,
-                                         object_pool_,
-                                         &reg,
+    InstructionPattern::DecodeLoadObject(ic_data_load_end_, object_pool_, &reg,
                                          &ic_data_);
     ASSERT(reg == R5);
   }
@@ -344,14 +335,11 @@
   ASSERT(*(reinterpret_cast<uint32_t*>(pc) - 1) == 0xd63f0200);
 
   Register reg;
-  uword data_load_end =
-      InstructionPattern::DecodeLoadWordFromPool(pc - Instr::kInstrSize,
-                                                 &reg,
-                                                 &data_pool_index_);
+  uword data_load_end = InstructionPattern::DecodeLoadWordFromPool(
+      pc - Instr::kInstrSize, &reg, &data_pool_index_);
   ASSERT(reg == R5);
   InstructionPattern::DecodeLoadWordFromPool(data_load_end - Instr::kInstrSize,
-                                             &reg,
-                                             &target_pool_index_);
+                                             &reg, &target_pool_index_);
   ASSERT(reg == CODE_REG);
 }
 
@@ -362,8 +350,7 @@
 
 
 RawCode* SwitchableCallPattern::target() const {
-  return reinterpret_cast<RawCode*>(
-      object_pool_.ObjectAt(target_pool_index_));
+  return reinterpret_cast<RawCode*>(object_pool_.ObjectAt(target_pool_index_));
 }
 
 
@@ -379,9 +366,7 @@
 }
 
 
-ReturnPattern::ReturnPattern(uword pc)
-    : pc_(pc) {
-}
+ReturnPattern::ReturnPattern(uword pc) : pc_(pc) {}
 
 
 bool ReturnPattern::IsValid() const {
diff --git a/runtime/vm/instructions_arm64.h b/runtime/vm/instructions_arm64.h
index e86a306..01808fc 100644
--- a/runtime/vm/instructions_arm64.h
+++ b/runtime/vm/instructions_arm64.h
@@ -128,9 +128,7 @@
   // bx_lr = 1.
   static const int kLengthInBytes = 1 * Instr::kInstrSize;
 
-  int pattern_length_in_bytes() const {
-    return kLengthInBytes;
-  }
+  int pattern_length_in_bytes() const { return kLengthInBytes; }
 
   bool IsValid() const;
 
diff --git a/runtime/vm/instructions_arm64_test.cc b/runtime/vm/instructions_arm64_test.cc
index 7ad4fb9..648ee17 100644
--- a/runtime/vm/instructions_arm64_test.cc
+++ b/runtime/vm/instructions_arm64_test.cc
@@ -28,10 +28,8 @@
   // in the code, points to the Ret instruction above, i.e. one instruction
   // before the end of the code buffer.
   uword end = test->payload_start() + test->code().Size();
-  CallPattern call(end - Instr::kInstrSize,
-                   test->code());
-  EXPECT_EQ(StubCode::InvokeDartCode_entry()->code(),
-            call.TargetCode());
+  CallPattern call(end - Instr::kInstrSize, test->code());
+  EXPECT_EQ(StubCode::InvokeDartCode_entry()->code(), call.TargetCode());
 }
 
 
diff --git a/runtime/vm/instructions_dbc.cc b/runtime/vm/instructions_dbc.cc
index b3f50ad..7667a5f 100644
--- a/runtime/vm/instructions_dbc.cc
+++ b/runtime/vm/instructions_dbc.cc
@@ -38,8 +38,9 @@
 }
 
 
-static bool GetLoadedObjectAt(
-    uword pc, const ObjectPool& object_pool, Object* obj) {
+static bool GetLoadedObjectAt(uword pc,
+                              const ObjectPool& object_pool,
+                              Object* obj) {
   Instr instr = Bytecode::At(pc);
   if (HasLoadFromPool(instr)) {
     uint16_t index = Bytecode::DecodeD(instr);
@@ -96,7 +97,7 @@
 
 void NativeCallPattern::set_native_function(NativeFunction func) const {
   object_pool_.SetRawValueAt(native_function_pool_index_,
-      reinterpret_cast<uword>(func));
+                             reinterpret_cast<uword>(func));
 }
 
 
@@ -140,9 +141,7 @@
 }
 
 
-bool DecodeLoadObjectFromPoolOrThread(uword pc,
-                                      const Code& code,
-                                      Object* obj) {
+bool DecodeLoadObjectFromPoolOrThread(uword pc, const Code& code, Object* obj) {
   ASSERT(code.ContainsInstructionAt(pc));
   const ObjectPool& pool = ObjectPool::Handle(code.object_pool());
   return GetLoadedObjectAt(pc, pool, obj);
@@ -170,8 +169,9 @@
 
 
 void CallPattern::InsertDeoptCallAt(uword pc) {
-  const uint8_t argc = Bytecode::IsCallOpcode(Bytecode::At(pc)) ?
-      Bytecode::DecodeArgc(Bytecode::At(pc)) : 0;
+  const uint8_t argc = Bytecode::IsCallOpcode(Bytecode::At(pc))
+                           ? Bytecode::DecodeArgc(Bytecode::At(pc))
+                           : 0;
   *reinterpret_cast<Instr*>(pc) = Bytecode::Encode(Bytecode::kDeopt, argc, 0);
 }
 
@@ -190,8 +190,7 @@
 
 
 RawCode* SwitchableCallPattern::target() const {
-  return reinterpret_cast<RawCode*>(
-      object_pool_.ObjectAt(target_pool_index_));
+  return reinterpret_cast<RawCode*>(object_pool_.ObjectAt(target_pool_index_));
 }
 
 
diff --git a/runtime/vm/instructions_ia32.cc b/runtime/vm/instructions_ia32.cc
index fa36c84..d774b99 100644
--- a/runtime/vm/instructions_ia32.cc
+++ b/runtime/vm/instructions_ia32.cc
@@ -13,9 +13,7 @@
 
 namespace dart {
 
-bool DecodeLoadObjectFromPoolOrThread(uword pc,
-                                      const Code& code,
-                                      Object* obj) {
+bool DecodeLoadObjectFromPoolOrThread(uword pc, const Code& code, Object* obj) {
   ASSERT(code.ContainsInstructionAt(pc));
   return false;
 }
diff --git a/runtime/vm/instructions_ia32.h b/runtime/vm/instructions_ia32.h
index 4be887f..d408a5a 100644
--- a/runtime/vm/instructions_ia32.h
+++ b/runtime/vm/instructions_ia32.h
@@ -23,11 +23,10 @@
 
 // Template class for all instruction pattern classes.
 // P has to specify a static pattern and a pattern length method.
-template<class P> class InstructionPattern : public ValueObject {
+template <class P>
+class InstructionPattern : public ValueObject {
  public:
-  explicit InstructionPattern(uword pc) : start_(pc) {
-    ASSERT(pc != 0);
-  }
+  explicit InstructionPattern(uword pc) : start_(pc) { ASSERT(pc != 0); }
 
   // Call to check if the instruction pattern at 'pc' match the instruction.
   // 'P::pattern()' returns the expected byte pattern in form of an integer
@@ -67,9 +66,8 @@
   explicit CallPattern(uword pc) : InstructionPattern(pc) {}
   uword TargetAddress() const {
     ASSERT(this->IsValid());
-    return this->start() +
-        CallPattern::pattern_length_in_bytes() +
-        *reinterpret_cast<uword*>(this->start() + 1);
+    return this->start() + CallPattern::pattern_length_in_bytes() +
+           *reinterpret_cast<uword*>(this->start() + 1);
   }
 
   void SetTargetAddress(uword new_target) const {
@@ -97,7 +95,7 @@
   explicit ReturnPattern(uword pc) : InstructionPattern(pc) {}
 
   static const int* pattern() {
-    static const int kReturnPattern[kLengthInBytes] = { 0xC3 };
+    static const int kReturnPattern[kLengthInBytes] = {0xC3};
     return kReturnPattern;
   }
   static int pattern_length_in_bytes() { return kLengthInBytes; }
@@ -114,7 +112,7 @@
   explicit ProloguePattern(uword pc) : InstructionPattern(pc) {}
 
   static const int* pattern() {
-    static const int kProloguePattern[kLengthInBytes] = { 0x55, 0x89, 0xe5 };
+    static const int kProloguePattern[kLengthInBytes] = {0x55, 0x89, 0xe5};
     return kProloguePattern;
   }
 
@@ -126,13 +124,13 @@
 
 
 // mov ebp, esp
-class SetFramePointerPattern :
-    public InstructionPattern<SetFramePointerPattern> {
+class SetFramePointerPattern
+    : public InstructionPattern<SetFramePointerPattern> {
  public:
   explicit SetFramePointerPattern(uword pc) : InstructionPattern(pc) {}
 
   static const int* pattern() {
-    static const int kFramePointerPattern[kLengthInBytes] = { 0x89, 0xe5 };
+    static const int kFramePointerPattern[kLengthInBytes] = {0x89, 0xe5};
     return kFramePointerPattern;
   }
 
diff --git a/runtime/vm/instructions_mips.cc b/runtime/vm/instructions_mips.cc
index 547b6fe..3c60538 100644
--- a/runtime/vm/instructions_mips.cc
+++ b/runtime/vm/instructions_mips.cc
@@ -25,10 +25,8 @@
   ASSERT(*(reinterpret_cast<uword*>(end_) - 2) == 0x0320f809);
   Register reg;
   // The end of the pattern is the instruction after the delay slot of the jalr.
-  ic_data_load_end_ =
-      InstructionPattern::DecodeLoadWordFromPool(end_ - (3 * Instr::kInstrSize),
-                                                 &reg,
-                                                 &target_code_pool_index_);
+  ic_data_load_end_ = InstructionPattern::DecodeLoadWordFromPool(
+      end_ - (3 * Instr::kInstrSize), &reg, &target_code_pool_index_);
   ASSERT(reg == CODE_REG);
 }
 
@@ -123,9 +121,7 @@
 }
 
 
-bool DecodeLoadObjectFromPoolOrThread(uword pc,
-                                      const Code& code,
-                                      Object* obj) {
+bool DecodeLoadObjectFromPoolOrThread(uword pc, const Code& code, Object* obj) {
   ASSERT(code.ContainsInstructionAt(pc));
 
   Instr* instr = Instr::At(pc);
@@ -151,9 +147,7 @@
 RawICData* CallPattern::IcData() {
   if (ic_data_.IsNull()) {
     Register reg;
-    InstructionPattern::DecodeLoadObject(ic_data_load_end_,
-                                         object_pool_,
-                                         &reg,
+    InstructionPattern::DecodeLoadObject(ic_data_load_end_, object_pool_, &reg,
                                          &ic_data_);
     ASSERT(reg == S5);
   }
@@ -183,13 +177,10 @@
   ASSERT(*(reinterpret_cast<uword*>(end_) - 2) == 0x0320f809);
 
   Register reg;
-  uword native_function_load_end =
-      InstructionPattern::DecodeLoadWordFromPool(end_ - 3 * Instr::kInstrSize,
-                                                 &reg,
-                                                 &target_code_pool_index_);
+  uword native_function_load_end = InstructionPattern::DecodeLoadWordFromPool(
+      end_ - 3 * Instr::kInstrSize, &reg, &target_code_pool_index_);
   ASSERT(reg == CODE_REG);
-  InstructionPattern::DecodeLoadWordFromPool(native_function_load_end,
-                                             &reg,
+  InstructionPattern::DecodeLoadWordFromPool(native_function_load_end, &reg,
                                              &native_function_pool_index_);
   ASSERT(reg == T5);
 }
@@ -215,7 +206,7 @@
 
 void NativeCallPattern::set_native_function(NativeFunction func) const {
   object_pool_.SetRawValueAt(native_function_pool_index_,
-      reinterpret_cast<uword>(func));
+                             reinterpret_cast<uword>(func));
 }
 
 
@@ -229,14 +220,11 @@
   ASSERT(*(reinterpret_cast<uword*>(pc) - 2) == 0x0320f809);
 
   Register reg;
-  uword data_load_end =
-      InstructionPattern::DecodeLoadWordFromPool(pc - 2 * Instr::kInstrSize,
-                                                 &reg,
-                                                 &data_pool_index_);
+  uword data_load_end = InstructionPattern::DecodeLoadWordFromPool(
+      pc - 2 * Instr::kInstrSize, &reg, &data_pool_index_);
   ASSERT(reg == S5);
   InstructionPattern::DecodeLoadWordFromPool(data_load_end - Instr::kInstrSize,
-                                             &reg,
-                                             &target_pool_index_);
+                                             &reg, &target_pool_index_);
   ASSERT(reg == CODE_REG);
 }
 
@@ -247,8 +235,7 @@
 
 
 RawCode* SwitchableCallPattern::target() const {
-  return reinterpret_cast<RawCode*>(
-      object_pool_.ObjectAt(target_pool_index_));
+  return reinterpret_cast<RawCode*>(object_pool_.ObjectAt(target_pool_index_));
 }
 
 
@@ -264,15 +251,12 @@
 }
 
 
-ReturnPattern::ReturnPattern(uword pc)
-    : pc_(pc) {
-}
+ReturnPattern::ReturnPattern(uword pc) : pc_(pc) {}
 
 
 bool ReturnPattern::IsValid() const {
   Instr* jr = Instr::At(pc_);
-  return (jr->OpcodeField() == SPECIAL) &&
-         (jr->FunctionField() == JR) &&
+  return (jr->OpcodeField() == SPECIAL) && (jr->FunctionField() == JR) &&
          (jr->RsField() == RA);
 }
 
diff --git a/runtime/vm/instructions_mips.h b/runtime/vm/instructions_mips.h
index 83907cb..4223857 100644
--- a/runtime/vm/instructions_mips.h
+++ b/runtime/vm/instructions_mips.h
@@ -121,9 +121,7 @@
   // jr(RA) = 1
   static const int kLengthInBytes = 1 * Instr::kInstrSize;
 
-  int pattern_length_in_bytes() const {
-    return kLengthInBytes;
-  }
+  int pattern_length_in_bytes() const { return kLengthInBytes; }
 
   bool IsValid() const;
 
diff --git a/runtime/vm/instructions_x64.cc b/runtime/vm/instructions_x64.cc
index efebc15..bc0553d 100644
--- a/runtime/vm/instructions_x64.cc
+++ b/runtime/vm/instructions_x64.cc
@@ -14,9 +14,7 @@
 
 namespace dart {
 
-bool DecodeLoadObjectFromPoolOrThread(uword pc,
-                                      const Code& code,
-                                      Object* obj) {
+bool DecodeLoadObjectFromPoolOrThread(uword pc, const Code& code, Object* obj) {
   ASSERT(code.ContainsInstructionAt(pc));
 
   uint8_t* bytes = reinterpret_cast<uint8_t*>(pc);
diff --git a/runtime/vm/instructions_x64.h b/runtime/vm/instructions_x64.h
index ba86ee4..56add2e 100644
--- a/runtime/vm/instructions_x64.h
+++ b/runtime/vm/instructions_x64.h
@@ -27,11 +27,10 @@
 
 // Template class for all instruction pattern classes.
 // P has to specify a static pattern and a pattern length method.
-template<class P> class InstructionPattern : public ValueObject {
+template <class P>
+class InstructionPattern : public ValueObject {
  public:
-  explicit InstructionPattern(uword pc) : start_(pc) {
-    ASSERT(pc != 0);
-  }
+  explicit InstructionPattern(uword pc) : start_(pc) { ASSERT(pc != 0); }
 
   // Call to check if the instruction pattern at 'pc' match the instruction.
   // 'P::pattern()' returns the expected byte pattern in form of an integer
@@ -71,7 +70,7 @@
   explicit ReturnPattern(uword pc) : InstructionPattern(pc) {}
 
   static const int* pattern() {
-    static const int kReturnPattern[kLengthInBytes] = { 0xC3 };
+    static const int kReturnPattern[kLengthInBytes] = {0xC3};
     return kReturnPattern;
   }
 
@@ -89,8 +88,8 @@
   explicit ProloguePattern(uword pc) : InstructionPattern(pc) {}
 
   static const int* pattern() {
-    static const int kProloguePattern[kLengthInBytes] =
-        { 0x55, 0x48, 0x89, 0xe5 };
+    static const int kProloguePattern[kLengthInBytes] = {0x55, 0x48, 0x89,
+                                                         0xe5};
     return kProloguePattern;
   }
 
@@ -102,14 +101,13 @@
 
 
 // mov rbp, rsp
-class SetFramePointerPattern :
-    public InstructionPattern<SetFramePointerPattern> {
+class SetFramePointerPattern
+    : public InstructionPattern<SetFramePointerPattern> {
  public:
   explicit SetFramePointerPattern(uword pc) : InstructionPattern(pc) {}
 
   static const int* pattern() {
-    static const int kFramePointerPattern[kLengthInBytes] =
-        { 0x48, 0x89, 0xe5 };
+    static const int kFramePointerPattern[kLengthInBytes] = {0x48, 0x89, 0xe5};
     return kFramePointerPattern;
   }
 
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc
index 20362bd..49126f9 100644
--- a/runtime/vm/intermediate_language.cc
+++ b/runtime/vm/intermediate_language.cc
@@ -29,12 +29,18 @@
 
 namespace dart {
 
-DEFINE_FLAG(bool, propagate_ic_data, true,
-    "Propagate IC data from unoptimized to optimized IC calls.");
-DEFINE_FLAG(bool, two_args_smi_icd, true,
-    "Generate special IC stubs for two args Smi operations");
-DEFINE_FLAG(bool, unbox_numeric_fields, !USING_DBC,
-    "Support unboxed double and float32x4 fields.");
+DEFINE_FLAG(bool,
+            propagate_ic_data,
+            true,
+            "Propagate IC data from unoptimized to optimized IC calls.");
+DEFINE_FLAG(bool,
+            two_args_smi_icd,
+            true,
+            "Generate special IC stubs for two args Smi operations");
+DEFINE_FLAG(bool,
+            unbox_numeric_fields,
+            !USING_DBC,
+            "Support unboxed double and float32x4 fields.");
 DECLARE_FLAG(bool, eliminate_type_checks);
 DECLARE_FLAG(bool, support_externalizable_strings);
 
@@ -55,8 +61,7 @@
       ssa_temp_index_(-1),
       input_use_list_(NULL),
       env_use_list_(NULL),
-      constant_value_(NULL) {
-}
+      constant_value_(NULL) {}
 
 
 // A value in the constant propagation lattice.
@@ -190,8 +195,7 @@
   const intptr_t len = checks.NumberOfChecks();
   for (intptr_t i = 0; i < len; i++) {
     if (checks.IsUsedAt(i)) {
-      if (Field::IsExternalizableCid(
-              checks.GetReceiverClassIdAt(i))) {
+      if (Field::IsExternalizableCid(checks.GetReceiverClassIdAt(i))) {
         return false;
       }
     }
@@ -202,15 +206,15 @@
 
 EffectSet CheckClassInstr::Dependencies() const {
   // Externalization of strings via the API can change the class-id.
-  return !AreAllChecksImmutable(unary_checks()) ?
-      EffectSet::Externalization() : EffectSet::None();
+  return !AreAllChecksImmutable(unary_checks()) ? EffectSet::Externalization()
+                                                : EffectSet::None();
 }
 
 
 EffectSet CheckClassIdInstr::Dependencies() const {
   // Externalization of strings via the API can change the class-id.
-  return Field::IsExternalizableCid(cid_) ?
-      EffectSet::Externalization() : EffectSet::None();
+  return Field::IsExternalizableCid(cid_) ? EffectSet::Externalization()
+                                          : EffectSet::None();
 }
 
 
@@ -277,16 +281,14 @@
 
 
 bool LoadFieldInstr::IsUnboxedLoad() const {
-  return FLAG_unbox_numeric_fields
-      && (field() != NULL)
-      && FlowGraphCompiler::IsUnboxedField(*field());
+  return FLAG_unbox_numeric_fields && (field() != NULL) &&
+         FlowGraphCompiler::IsUnboxedField(*field());
 }
 
 
 bool LoadFieldInstr::IsPotentialUnboxedLoad() const {
-  return FLAG_unbox_numeric_fields
-      && (field() != NULL)
-      && FlowGraphCompiler::IsPotentialUnboxedField(*field());
+  return FLAG_unbox_numeric_fields && (field() != NULL) &&
+         FlowGraphCompiler::IsPotentialUnboxedField(*field());
 }
 
 
@@ -309,21 +311,19 @@
 
 
 bool StoreInstanceFieldInstr::IsUnboxedStore() const {
-  return FLAG_unbox_numeric_fields
-      && !field().IsNull()
-      && FlowGraphCompiler::IsUnboxedField(field());
+  return FLAG_unbox_numeric_fields && !field().IsNull() &&
+         FlowGraphCompiler::IsUnboxedField(field());
 }
 
 
 bool StoreInstanceFieldInstr::IsPotentialUnboxedStore() const {
-  return FLAG_unbox_numeric_fields
-      && !field().IsNull()
-      && FlowGraphCompiler::IsPotentialUnboxedField(field());
+  return FLAG_unbox_numeric_fields && !field().IsNull() &&
+         FlowGraphCompiler::IsPotentialUnboxedField(field());
 }
 
 
 Representation StoreInstanceFieldInstr::RequiredInputRepresentation(
-  intptr_t index) const {
+    intptr_t index) const {
   ASSERT((index == 0) || (index == 1));
   if ((index == 1) && IsUnboxedStore()) {
     const intptr_t cid = field().UnboxedFieldCid();
@@ -365,7 +365,7 @@
   StrictCompareInstr* other_op = other->AsStrictCompare();
   ASSERT(other_op != NULL);
   return ComparisonInstr::AttributesEqual(other) &&
-    (needs_number_check() == other_op->needs_number_check());
+         (needs_number_check() == other_op->needs_number_check());
 }
 
 
@@ -373,7 +373,7 @@
   MathMinMaxInstr* other_op = other->AsMathMinMax();
   ASSERT(other_op != NULL);
   return (op_kind() == other_op->op_kind()) &&
-      (result_cid() == other_op->result_cid());
+         (result_cid() == other_op->result_cid());
 }
 
 
@@ -381,8 +381,8 @@
   ASSERT(other->tag() == tag());
   BinaryIntegerOpInstr* other_op = other->AsBinaryIntegerOp();
   return (op_kind() == other_op->op_kind()) &&
-      (can_overflow() == other_op->can_overflow()) &&
-      (is_truncating() == other_op->is_truncating());
+         (can_overflow() == other_op->can_overflow()) &&
+         (is_truncating() == other_op->is_truncating());
 }
 
 
@@ -396,10 +396,10 @@
   ASSERT(other_load != NULL);
   if (field() != NULL) {
     return (other_load->field() != NULL) &&
-        (field()->raw() == other_load->field()->raw());
+           (field()->raw() == other_load->field()->raw());
   }
   return (other_load->field() == NULL) &&
-      (offset_in_bytes() == other_load->offset_in_bytes());
+         (offset_in_bytes() == other_load->offset_in_bytes());
 }
 
 
@@ -417,7 +417,8 @@
 
 EffectSet LoadStaticFieldInstr::Dependencies() const {
   return (StaticField().is_final() && !FLAG_fields_may_be_reset)
-      ? EffectSet::None() : EffectSet::All();
+             ? EffectSet::None()
+             : EffectSet::All();
 }
 
 
@@ -439,8 +440,7 @@
 
 
 ConstantInstr::ConstantInstr(const Object& value, TokenPosition token_pos)
-    : value_(value),
-      token_pos_(token_pos) {
+    : value_(value), token_pos_(token_pos) {
   // Check that the value is not an incorrect Integer representation.
   ASSERT(!value.IsBigint() || !Bigint::Cast(value).FitsIntoSmi());
   ASSERT(!value.IsBigint() || !Bigint::Cast(value).FitsIntoInt64());
@@ -502,8 +502,7 @@
       osr_id_(osr_id),
       entry_count_(0),
       spill_slot_count_(0),
-      fixed_slot_count_(0) {
-}
+      fixed_slot_count_(0) {}
 
 
 ConstantInstr* GraphEntryInstr::constant_null() {
@@ -535,9 +534,9 @@
 // ==== Support for visiting flow graphs.
 
 #define DEFINE_ACCEPT(ShortName)                                               \
-void ShortName##Instr::Accept(FlowGraphVisitor* visitor) {                     \
-  visitor->Visit##ShortName(this);                                             \
-}
+  void ShortName##Instr::Accept(FlowGraphVisitor* visitor) {                   \
+    visitor->Visit##ShortName(this);                                           \
+  }
 
 FOR_EACH_INSTRUCTION(DEFINE_ACCEPT)
 
@@ -622,7 +621,8 @@
   // instruction.
   ASSERT(previous() != NULL);
   Instruction* result = previous();
-  while (!result->IsBlockEntry()) result = result->previous();
+  while (!result->IsBlockEntry())
+    result = result->previous();
   return result->AsBlockEntry();
 }
 
@@ -654,8 +654,7 @@
 
 
 bool Value::NeedsStoreBuffer() {
-  if (Type()->IsNull() ||
-      (Type()->ToNullableCid() == kSmiCid) ||
+  if (Type()->IsNull() || (Type()->ToNullableCid() == kSmiCid) ||
       (Type()->ToNullableCid() == kBoolCid)) {
     return false;
   }
@@ -794,12 +793,10 @@
                                           Definition* result) {
   ASSERT(call->env() != NULL);
   deopt_id_ = Thread::ToDeoptAfter(call->deopt_id_);
-  call->env()->DeepCopyAfterTo(flow_graph->zone(),
-                               this,
-                               call->ArgumentCount(),
-                               flow_graph->constant_dead(),
-                               result != NULL ? result
-                                              : flow_graph->constant_dead());
+  call->env()->DeepCopyAfterTo(
+      flow_graph->zone(), this, call->ArgumentCount(),
+      flow_graph->constant_dead(),
+      result != NULL ? result : flow_graph->constant_dead());
   env()->set_deopt_id(deopt_id_);
 }
 
@@ -923,10 +920,9 @@
 
 
 // Base class implementation used for JoinEntry and TargetEntry.
-bool BlockEntryInstr::DiscoverBlock(
-    BlockEntryInstr* predecessor,
-    GrowableArray<BlockEntryInstr*>* preorder,
-    GrowableArray<intptr_t>* parent) {
+bool BlockEntryInstr::DiscoverBlock(BlockEntryInstr* predecessor,
+                                    GrowableArray<BlockEntryInstr*>* preorder,
+                                    GrowableArray<intptr_t>* parent) {
   // If this block has a predecessor (i.e., is not the graph entry) we can
   // assume the preorder array is non-empty.
   ASSERT((predecessor == NULL) || !preorder->is_empty());
@@ -1011,9 +1007,7 @@
 
   // Recursively search the successors.
   for (intptr_t i = instr->SuccessorCount() - 1; i >= 0; --i) {
-    if (instr->SuccessorAt(i)->PruneUnreachable(graph_entry,
-                                                instr,
-                                                osr_id,
+    if (instr->SuccessorAt(i)->PruneUnreachable(graph_entry, instr, osr_id,
                                                 block_marks)) {
       return true;
     }
@@ -1096,8 +1090,7 @@
       Value* pred_use = phi->InputAt(old_index);
       // Move uses between old and new.
       intptr_t step = (old_index < new_index) ? 1 : -1;
-      for (intptr_t use_idx = old_index;
-           use_idx != new_index;
+      for (intptr_t use_idx = old_index; use_idx != new_index;
            use_idx += step) {
         phi->SetInputAt(use_idx, phi->InputAt(use_idx + step));
       }
@@ -1116,9 +1109,7 @@
     }
   }
   UnuseAllInputs();
-  for (ForwardInstructionIterator it(this);
-       !it.Done();
-       it.Advance()) {
+  for (ForwardInstructionIterator it(this); !it.Done(); it.Advance()) {
     it.Current()->UnuseAllInputs();
   }
 }
@@ -1239,24 +1230,22 @@
 
 
 bool UnboxedIntConverterInstr::CanDeoptimize() const {
-  return (to() == kUnboxedInt32) &&
-      !is_truncating() &&
-      !RangeUtils::Fits(value()->definition()->range(),
-                        RangeBoundary::kRangeBoundaryInt32);
+  return (to() == kUnboxedInt32) && !is_truncating() &&
+         !RangeUtils::Fits(value()->definition()->range(),
+                           RangeBoundary::kRangeBoundaryInt32);
 }
 
 
 bool UnboxInt32Instr::CanDeoptimize() const {
   const intptr_t value_cid = value()->Type()->ToCid();
   if (value_cid == kSmiCid) {
-    return (kSmiBits > 32) &&
-        !is_truncating() &&
-        !RangeUtils::Fits(value()->definition()->range(),
-                          RangeBoundary::kRangeBoundaryInt32);
+    return (kSmiBits > 32) && !is_truncating() &&
+           !RangeUtils::Fits(value()->definition()->range(),
+                             RangeBoundary::kRangeBoundaryInt32);
   } else if (value_cid == kMintCid) {
     return !is_truncating() &&
-        !RangeUtils::Fits(value()->definition()->range(),
-                          RangeBoundary::kRangeBoundaryInt32);
+           !RangeUtils::Fits(value()->definition()->range(),
+                             RangeBoundary::kRangeBoundaryInt32);
   } else if (is_truncating() && value()->definition()->IsBoxInteger()) {
     return false;
   } else if ((kSmiBits < 32) && value()->Type()->IsInt()) {
@@ -1293,7 +1282,7 @@
 
     case Token::kSHL:
       return can_overflow() ||
-          !RangeUtils::IsPositive(right()->definition()->range());
+             !RangeUtils::IsPositive(right()->definition()->range());
 
     case Token::kMOD: {
       UNREACHABLE();
@@ -1317,7 +1306,7 @@
 
     case Token::kSHL:
       return can_overflow() ||
-          !RangeUtils::IsPositive(right()->definition()->range());
+             !RangeUtils::IsPositive(right()->definition()->range());
 
     case Token::kMOD: {
       Range* right_range = this->right()->definition()->range();
@@ -1355,8 +1344,8 @@
 
 
 static int64_t RepresentationMask(Representation r) {
-  return static_cast<int64_t>(
-      static_cast<uint64_t>(-1) >> (64 - RepresentationBits(r)));
+  return static_cast<int64_t>(static_cast<uint64_t>(-1) >>
+                              (64 - RepresentationBits(r)));
 }
 
 
@@ -1403,10 +1392,9 @@
 }
 
 
-static Definition* CanonicalizeCommutativeDoubleArithmetic(
-    Token::Kind op,
-    Value* left,
-    Value* right) {
+static Definition* CanonicalizeCommutativeDoubleArithmetic(Token::Kind op,
+                                                           Value* left,
+                                                           Value* right) {
   int64_t left_value;
   if (!ToIntegerConstant(left, &left_value)) {
     return NULL;
@@ -1442,9 +1430,7 @@
   // Must only be used in Float32 StoreIndexedInstr or FloatToDoubleInstr or
   // Phis introduce by load forwarding.
   ASSERT(env_use_list() == NULL);
-  for (Value* use = input_use_list();
-       use != NULL;
-       use = use->next_use()) {
+  for (Value* use = input_use_list(); use != NULL; use = use->next_use()) {
     ASSERT(use->instruction()->IsPhi() ||
            use->instruction()->IsFloatToDouble() ||
            (use->instruction()->IsStoreIndexed() &&
@@ -1483,10 +1469,9 @@
 
   if ((op_kind() == Token::kMUL) &&
       (left()->definition() == right()->definition())) {
-    MathUnaryInstr* math_unary =
-        new MathUnaryInstr(MathUnaryInstr::kDoubleSquare,
-                           new Value(left()->definition()),
-                           DeoptimizationTarget());
+    MathUnaryInstr* math_unary = new MathUnaryInstr(
+        MathUnaryInstr::kDoubleSquare, new Value(left()->definition()),
+        DeoptimizationTarget());
     flow_graph->InsertBefore(this, math_unary, env(), FlowGraph::kValue);
     return math_unary;
   }
@@ -1632,8 +1617,7 @@
 
   switch (op_kind()) {
     case Token::kNEGATE:
-      result = value.ArithmeticOp(Token::kMUL,
-                                  Smi::Handle(zone, Smi::New(-1)),
+      result = value.ArithmeticOp(Token::kMUL, Smi::Handle(zone, Smi::New(-1)),
                                   Heap::kOld);
       break;
 
@@ -1677,7 +1661,7 @@
       if (right.IsSmi() && right.AsInt64Value() == 0) {
         break;  // Will throw.
       }
-      // Fall through.
+    // Fall through.
     case Token::kADD:
     case Token::kSUB:
     case Token::kMUL: {
@@ -1687,9 +1671,8 @@
     case Token::kSHL:
     case Token::kSHR:
       if (left.IsSmi() && right.IsSmi() && (Smi::Cast(right).Value() >= 0)) {
-        result = Smi::Cast(left).ShiftOp(op_kind(),
-                                         Smi::Cast(right),
-                                         Heap::kOld);
+        result =
+            Smi::Cast(left).ShiftOp(op_kind(), Smi::Cast(right), Heap::kOld);
       }
       break;
     case Token::kBIT_AND:
@@ -1728,8 +1711,7 @@
                                                        const Integer& result) {
   Definition* result_defn = flow_graph->GetConstant(result);
   if (representation() != kTagged) {
-    result_defn = UnboxInstr::Create(representation(),
-                                     new Value(result_defn),
+    result_defn = UnboxInstr::Create(representation(), new Value(result_defn),
                                      GetDeoptId());
     flow_graph->InsertBefore(this, result_defn, env(), FlowGraph::kValue);
   }
@@ -1749,11 +1731,9 @@
       case Token::kBIT_AND:
       case Token::kBIT_OR:
       case Token::kBIT_XOR:
-        replacement =
-            new BinarySmiOpInstr(op_kind(),
-                                 new Value(left()->definition()),
-                                 new Value(right()->definition()),
-                                 Thread::kNoDeoptId);
+        replacement = new BinarySmiOpInstr(
+            op_kind(), new Value(left()->definition()),
+            new Value(right()->definition()), Thread::kNoDeoptId);
       default:
         break;
     }
@@ -1766,8 +1746,8 @@
 }
 
 
-ComparisonInstr* CheckedSmiComparisonInstr::CopyWithNewOperands(
-    Value* left, Value* right) {
+ComparisonInstr* CheckedSmiComparisonInstr::CopyWithNewOperands(Value* left,
+                                                                Value* right) {
   UNREACHABLE();
   return NULL;
 }
@@ -1778,17 +1758,13 @@
       (right()->Type()->ToCid() == kSmiCid)) {
     Definition* replacement = NULL;
     if (Token::IsRelationalOperator(kind())) {
-      replacement = new RelationalOpInstr(token_pos(), kind(),
-                                          new Value(left()->definition()),
-                                          new Value(right()->definition()),
-                                          kSmiCid,
-                                          Thread::kNoDeoptId);
+      replacement = new RelationalOpInstr(
+          token_pos(), kind(), new Value(left()->definition()),
+          new Value(right()->definition()), kSmiCid, Thread::kNoDeoptId);
     } else if (Token::IsEqualityOperator(kind())) {
-      replacement = new EqualityCompareInstr(token_pos(), kind(),
-                                             new Value(left()->definition()),
-                                             new Value(right()->definition()),
-                                             kSmiCid,
-                                             Thread::kNoDeoptId);
+      replacement = new EqualityCompareInstr(
+          token_pos(), kind(), new Value(left()->definition()),
+          new Value(right()->definition()), kSmiCid, Thread::kNoDeoptId);
     }
     if (replacement != NULL) {
       flow_graph->InsertBefore(this, replacement, env(), FlowGraph::kValue);
@@ -1803,20 +1779,17 @@
   // If both operands are constants evaluate this expression. Might
   // occur due to load forwarding after constant propagation pass
   // have already been run.
-  if (left()->BindsToConstant() &&
-      left()->BoundConstant().IsInteger() &&
-      right()->BindsToConstant() &&
-      right()->BoundConstant().IsInteger()) {
-    const Integer& result = Integer::Handle(
-        Evaluate(Integer::Cast(left()->BoundConstant()),
-                 Integer::Cast(right()->BoundConstant())));
+  if (left()->BindsToConstant() && left()->BoundConstant().IsInteger() &&
+      right()->BindsToConstant() && right()->BoundConstant().IsInteger()) {
+    const Integer& result =
+        Integer::Handle(Evaluate(Integer::Cast(left()->BoundConstant()),
+                                 Integer::Cast(right()->BoundConstant())));
     if (!result.IsNull()) {
       return CreateConstantResult(flow_graph, result);
     }
   }
 
-  if (left()->BindsToConstant() &&
-      !right()->BindsToConstant() &&
+  if (left()->BindsToConstant() && !right()->BindsToConstant() &&
       IsCommutative(op_kind())) {
     Value* l = left();
     Value* r = right();
@@ -1854,15 +1827,10 @@
       } else if (rhs == 2) {
         ConstantInstr* constant_1 =
             flow_graph->GetConstant(Smi::Handle(Smi::New(1)));
-        BinaryIntegerOpInstr* shift =
-            BinaryIntegerOpInstr::Make(representation(),
-                                       Token::kSHL,
-                                       left()->CopyWithType(),
-                                       new Value(constant_1),
-                                       GetDeoptId(),
-                                       can_overflow(),
-                                       is_truncating(),
-                                       range());
+        BinaryIntegerOpInstr* shift = BinaryIntegerOpInstr::Make(
+            representation(), Token::kSHL, left()->CopyWithType(),
+            new Value(constant_1), GetDeoptId(), can_overflow(),
+            is_truncating(), range());
         if (shift != NULL) {
           flow_graph->InsertBefore(this, shift, env(), FlowGraph::kValue);
           return shift;
@@ -1893,12 +1861,9 @@
       if (rhs == 0) {
         return left()->definition();
       } else if (rhs == range_mask) {
-        UnaryIntegerOpInstr* bit_not =
-            UnaryIntegerOpInstr::Make(representation(),
-                                      Token::kBIT_NOT,
-                                      left()->CopyWithType(),
-                                      GetDeoptId(),
-                                      range());
+        UnaryIntegerOpInstr* bit_not = UnaryIntegerOpInstr::Make(
+            representation(), Token::kBIT_NOT, left()->CopyWithType(),
+            GetDeoptId(), range());
         if (bit_not != NULL) {
           flow_graph->InsertBefore(this, bit_not, env(), FlowGraph::kValue);
           return bit_not;
@@ -1916,12 +1881,9 @@
       if (rhs == 1) {
         return left()->definition();
       } else if (rhs == -1) {
-        UnaryIntegerOpInstr* negation =
-            UnaryIntegerOpInstr::Make(representation(),
-                                      Token::kNEGATE,
-                                      left()->CopyWithType(),
-                                      GetDeoptId(),
-                                      range());
+        UnaryIntegerOpInstr* negation = UnaryIntegerOpInstr::Make(
+            representation(), Token::kNEGATE, left()->CopyWithType(),
+            GetDeoptId(), range());
         if (negation != NULL) {
           flow_graph->InsertBefore(this, negation, env(), FlowGraph::kValue);
           return negation;
@@ -2095,14 +2057,13 @@
 
   ConstantInstr* constant_type_args =
       instantiator_type_arguments()->definition()->AsConstant();
-  if (constant_type_args != NULL &&
-      !constant_type_args->value().IsNull() &&
+  if (constant_type_args != NULL && !constant_type_args->value().IsNull() &&
       constant_type_args->value().IsTypeArguments()) {
     const TypeArguments& instantiator_type_args =
         TypeArguments::Cast(constant_type_args->value());
     Error& bound_error = Error::Handle();
-    AbstractType& new_dst_type = AbstractType::Handle(
-        dst_type().InstantiateFrom(
+    AbstractType& new_dst_type =
+        AbstractType::Handle(dst_type().InstantiateFrom(
             instantiator_type_args, &bound_error, NULL, NULL, Heap::kOld));
     if (new_dst_type.IsMalformedOrMalbounded() || !bound_error.IsNull()) {
       return this;
@@ -2113,8 +2074,7 @@
     new_dst_type = new_dst_type.Canonicalize();
     set_dst_type(new_dst_type);
 
-    if (new_dst_type.IsDynamicType() ||
-        new_dst_type.IsObjectType() ||
+    if (new_dst_type.IsDynamicType() || new_dst_type.IsObjectType() ||
         (FLAG_eliminate_type_checks &&
          value()->Type()->IsAssignableTo(new_dst_type))) {
       return value()->definition();
@@ -2136,8 +2096,8 @@
                                                           bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   return locs;
 }
 
@@ -2218,10 +2178,7 @@
     }
 
     if (replacement != this) {
-      flow_graph->InsertBefore(this,
-                               replacement,
-                               NULL,
-                               FlowGraph::kValue);
+      flow_graph->InsertBefore(this, replacement, NULL, FlowGraph::kValue);
     }
 
     return replacement;
@@ -2246,7 +2203,8 @@
 
     const Object& val = value()->BoundConstant();
     if (val.IsSmi()) {
-      const Double& double_val = Double::ZoneHandle(flow_graph->zone(),
+      const Double& double_val = Double::ZoneHandle(
+          flow_graph->zone(),
           Double::NewCanonical(Smi::Cast(val).AsDoubleValue()));
       uc = new UnboxedConstantInstr(double_val, kUnboxedDouble);
     } else if (val.IsDouble()) {
@@ -2275,11 +2233,10 @@
       return box_defn->value()->definition();
     } else {
       UnboxedIntConverterInstr* converter = new UnboxedIntConverterInstr(
-          from_representation,
-          representation(),
+          from_representation, representation(),
           box_defn->value()->CopyWithType(),
-          (representation() == kUnboxedInt32) ?
-              GetDeoptId() : Thread::kNoDeoptId);
+          (representation() == kUnboxedInt32) ? GetDeoptId()
+                                              : Thread::kNoDeoptId);
       // TODO(vegorov): marking resulting converter as truncating when
       // unboxing can't deoptimize is a workaround for the missing
       // deoptimization environment when we insert converter after
@@ -2308,8 +2265,7 @@
   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());
+      const int64_t value = static_cast<int64_t>(Smi::Cast(c->value()).Value());
       if (!Utils::IsInt(32, value)) {
         return this;
       }
@@ -2339,9 +2295,7 @@
     }
 
     UnboxedIntConverterInstr* converter = new UnboxedIntConverterInstr(
-        box_defn->from(),
-        representation(),
-        box_defn->value()->CopyWithType(),
+        box_defn->from(), representation(), box_defn->value()->CopyWithType(),
         (to() == kUnboxedInt32) ? GetDeoptId() : Thread::kNoDeoptId);
     if ((representation() == kUnboxedInt32) && is_truncating()) {
       converter->mark_truncating();
@@ -2351,22 +2305,16 @@
   }
 
   UnboxInt64Instr* unbox_defn = value()->definition()->AsUnboxInt64();
-  if (unbox_defn != NULL &&
-      (from() == kUnboxedMint) &&
-      (to() == kUnboxedInt32) &&
-      unbox_defn->HasOnlyInputUse(value())) {
+  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);
+                            unbox_defn->value()->CopyWithType(), GetDeoptId());
+    flow_graph->InsertBefore(this, replacement, env(), FlowGraph::kValue);
     return replacement;
   }
 
@@ -2376,8 +2324,7 @@
 
 Definition* BooleanNegateInstr::Canonicalize(FlowGraph* flow_graph) {
   Definition* defn = value()->definition();
-  if (defn->IsComparison() &&
-      defn->HasOnlyUse(value()) &&
+  if (defn->IsComparison() && defn->HasOnlyUse(value()) &&
       defn->Type()->ToCid() == kBoolCid) {
     defn->AsComparison()->NegateComparison();
     return defn;
@@ -2387,20 +2334,19 @@
 
 
 static bool MayBeBoxableNumber(intptr_t cid) {
-  return (cid == kDynamicCid) ||
-         (cid == kMintCid) ||
-         (cid == kBigintCid) ||
+  return (cid == kDynamicCid) || (cid == kMintCid) || (cid == kBigintCid) ||
          (cid == kDoubleCid);
 }
 
 
 static bool MaybeNumber(CompileType* type) {
-  ASSERT(Type::Handle(Type::Number()).IsMoreSpecificThan(
-             Type::Handle(Type::Number()), NULL, NULL, Heap::kOld));
-  return type->ToAbstractType()->IsDynamicType()
-      || type->ToAbstractType()->IsObjectType()
-      || type->ToAbstractType()->IsTypeParameter()
-      || type->IsMoreSpecificThan(Type::Handle(Type::Number()));
+  ASSERT(Type::Handle(Type::Number())
+             .IsMoreSpecificThan(Type::Handle(Type::Number()), NULL, NULL,
+                                 Heap::kOld));
+  return type->ToAbstractType()->IsDynamicType() ||
+         type->ToAbstractType()->IsObjectType() ||
+         type->ToAbstractType()->IsTypeParameter() ||
+         type->IsMoreSpecificThan(Type::Handle(Type::Number()));
 }
 
 
@@ -2414,7 +2360,7 @@
   // is not a subtype of num, no need for number checks.
   if (compare->needs_number_check()) {
     if (!MayBeBoxableNumber(compare->left()->Type()->ToCid()) ||
-        !MayBeBoxableNumber(compare->right()->Type()->ToCid()))  {
+        !MayBeBoxableNumber(compare->right()->Type()->ToCid())) {
       compare->set_needs_number_check(false);
     } else if (!MaybeNumber(compare->left()->Type()) ||
                !MaybeNumber(compare->right()->Type())) {
@@ -2438,31 +2384,25 @@
   Definition* other_defn = other->definition();
   Token::Kind kind = compare->kind();
   // Handle e === true.
-  if ((kind == Token::kEQ_STRICT) &&
-      (constant.raw() == Bool::True().raw()) &&
+  if ((kind == Token::kEQ_STRICT) && (constant.raw() == Bool::True().raw()) &&
       can_merge) {
     return other_defn;
   }
   // Handle e !== false.
-  if ((kind == Token::kNE_STRICT) &&
-      (constant.raw() == Bool::False().raw()) &&
+  if ((kind == Token::kNE_STRICT) && (constant.raw() == Bool::False().raw()) &&
       can_merge) {
     return other_defn;
   }
   // Handle e !== true.
-  if ((kind == Token::kNE_STRICT) &&
-      (constant.raw() == Bool::True().raw()) &&
-      other_defn->IsComparison() &&
-      can_merge &&
+  if ((kind == Token::kNE_STRICT) && (constant.raw() == Bool::True().raw()) &&
+      other_defn->IsComparison() && can_merge &&
       other_defn->HasOnlyUse(other)) {
     *negated = true;
     return other_defn;
   }
   // Handle e === false.
-  if ((kind == Token::kEQ_STRICT) &&
-      (constant.raw() == Bool::False().raw()) &&
-      other_defn->IsComparison() &&
-      can_merge &&
+  if ((kind == Token::kEQ_STRICT) && (constant.raw() == Bool::False().raw()) &&
+      other_defn->IsComparison() && can_merge &&
       other_defn->HasOnlyUse(other)) {
     *negated = true;
     return other_defn;
@@ -2472,9 +2412,8 @@
 
 
 static bool BindsToGivenConstant(Value* v, intptr_t expected) {
-  return v->BindsToConstant() &&
-      v->BoundConstant().IsSmi() &&
-      (Smi::Cast(v->BoundConstant()).Value() == expected);
+  return v->BindsToConstant() && v->BoundConstant().IsSmi() &&
+         (Smi::Cast(v->BoundConstant()).Value() == expected);
 }
 
 
@@ -2491,8 +2430,7 @@
 
 
   BinarySmiOpInstr* mask_op = left->definition()->AsBinarySmiOp();
-  if ((mask_op == NULL) ||
-      (mask_op->op_kind() != Token::kBIT_AND) ||
+  if ((mask_op == NULL) || (mask_op->op_kind() != Token::kBIT_AND) ||
       !mask_op->HasOnlyUse(left)) {
     return false;
   }
@@ -2521,15 +2459,13 @@
   // Only handle strict-compares.
   if (comparison()->IsStrictCompare()) {
     bool negated = false;
-    Definition* replacement =
-        CanonicalizeStrictCompare(comparison()->AsStrictCompare(),
-                                  &negated, /* is_branch = */ true);
+    Definition* replacement = CanonicalizeStrictCompare(
+        comparison()->AsStrictCompare(), &negated, /* is_branch = */ true);
     if (replacement == comparison()) {
       return this;
     }
     ComparisonInstr* comp = replacement->AsComparison();
-    if ((comp == NULL) ||
-        comp->CanDeoptimize() ||
+    if ((comp == NULL) || comp->CanDeoptimize() ||
         comp->HasUnmatchedInputRepresentations()) {
       return this;
     }
@@ -2562,12 +2498,10 @@
              comparison()->operation_cid() == kSmiCid) {
     BinarySmiOpInstr* bit_and = NULL;
     bool negate = false;
-    if (RecognizeTestPattern(comparison()->left(),
-                             comparison()->right(),
+    if (RecognizeTestPattern(comparison()->left(), comparison()->right(),
                              &negate)) {
       bit_and = comparison()->left()->definition()->AsBinarySmiOp();
-    } else if (RecognizeTestPattern(comparison()->right(),
-                                    comparison()->left(),
+    } else if (RecognizeTestPattern(comparison()->right(), comparison()->left(),
                                     &negate)) {
       bit_and = comparison()->right()->definition()->AsBinarySmiOp();
     }
@@ -2579,8 +2513,7 @@
           comparison()->token_pos(),
           negate ? Token::NegateComparison(comparison()->kind())
                  : comparison()->kind(),
-          bit_and->left()->Copy(zone),
-          bit_and->right()->Copy(zone));
+          bit_and->left()->Copy(zone), bit_and->right()->Copy(zone));
       ASSERT(!CanDeoptimize());
       RemoveEnvironment();
       flow_graph->CopyDeoptTarget(this, bit_and);
@@ -2618,8 +2551,7 @@
 Instruction* CheckClassIdInstr::Canonicalize(FlowGraph* flow_graph) {
   if (value()->BindsToConstant()) {
     const Object& constant_value = value()->BoundConstant();
-    if (constant_value.IsSmi() &&
-        Smi::Cast(constant_value).Value() == cid_) {
+    if (constant_value.IsSmi() && Smi::Cast(constant_value).Value() == cid_) {
       return NULL;
     }
   }
@@ -2637,8 +2569,8 @@
   for (intptr_t i = 0; i < data.length(); i += 2) {
     if (data[i] == cid) {
       return (data[i + 1] == true_result)
-          ? flow_graph->GetConstant(Bool::True())
-          : flow_graph->GetConstant(Bool::False());
+                 ? flow_graph->GetConstant(Bool::True())
+                 : flow_graph->GetConstant(Bool::False());
     }
   }
 
@@ -2689,8 +2621,7 @@
       LoadFieldInstr::IsFixedLengthArrayCid(call->Type()->ToCid())) {
     length = call->ArgumentAt(1)->AsConstant();
   }
-  if ((length != NULL) &&
-      length->value().IsSmi() &&
+  if ((length != NULL) && length->value().IsSmi() &&
       Smi::Cast(length->value()).Value() == expected_length) {
     return NULL;  // Expected length matched.
   }
@@ -2700,7 +2631,7 @@
 
 
 Instruction* CheckSmiInstr::Canonicalize(FlowGraph* flow_graph) {
-  return (value()->Type()->ToCid() == kSmiCid) ?  NULL : this;
+  return (value()->Type()->ToCid() == kSmiCid) ? NULL : this;
 }
 
 
@@ -2742,8 +2673,8 @@
                                intptr_t deopt_id) {
   switch (to) {
     case kUnboxedInt32:
-      return new UnboxInt32Instr(
-          UnboxInt32Instr::kNoTruncation, value, deopt_id);
+      return new UnboxInt32Instr(UnboxInt32Instr::kNoTruncation, value,
+                                 deopt_id);
 
     case kUnboxedUint32:
       return new UnboxUint32Instr(value, deopt_id);
@@ -2806,8 +2737,7 @@
 void JoinEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   __ Bind(compiler->GetJumpLabel(this));
   if (!compiler->is_optimizing()) {
-    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
-                                   GetDeoptId(),
+    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, GetDeoptId(),
                                    TokenPosition::kNoSource);
   }
   if (HasParallelMove()) {
@@ -2837,8 +2767,7 @@
     // The deoptimization descriptor points after the edge counter code for
     // uniformity with ARM and MIPS, where we can reuse pattern matching
     // code that matches backwards from the end of the pattern.
-    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
-                                   GetDeoptId(),
+    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, GetDeoptId(),
                                    TokenPosition::kNoSource);
   }
   if (HasParallelMove()) {
@@ -2882,7 +2811,8 @@
 
 
 LocationSummary* IndirectEntryInstr::MakeLocationSummary(
-    Zone* zone, bool optimizing) const {
+    Zone* zone,
+    bool optimizing) const {
   return JoinEntryInstr::MakeLocationSummary(zone, optimizing);
 }
 
@@ -2962,7 +2892,8 @@
 
 
 LocationSummary* MaterializeObjectInstr::MakeLocationSummary(
-    Zone* zone, bool optimizing) const {
+    Zone* zone,
+    bool optimizing) const {
   UNREACHABLE();
   return NULL;
 }
@@ -3006,14 +2937,10 @@
 LocationSummary* DropTempsInstr::MakeLocationSummary(Zone* zone,
                                                      bool optimizing) const {
   return (InputCount() == 1)
-      ? LocationSummary::Make(zone,
-                              1,
-                              Location::SameAsFirstInput(),
-                              LocationSummary::kNoCall)
-      : LocationSummary::Make(zone,
-                              0,
-                              Location::NoLocation(),
-                              LocationSummary::kNoCall);
+             ? LocationSummary::Make(zone, 1, Location::SameAsFirstInput(),
+                                     LocationSummary::kNoCall)
+             : LocationSummary::Make(zone, 0, Location::NoLocation(),
+                                     LocationSummary::kNoCall);
 }
 
 
@@ -3043,9 +2970,7 @@
                                        Value* left,
                                        Value* right,
                                        bool needs_number_check)
-    : TemplateComparison(token_pos,
-                         kind,
-                         Thread::Current()->GetNextDeoptId()),
+    : TemplateComparison(token_pos, kind, Thread::Current()->GetNextDeoptId()),
       needs_number_check_(needs_number_check) {
   ASSERT((kind == Token::kEQ_STRICT) || (kind == Token::kNE_STRICT));
   SetInputAt(0, left);
@@ -3066,15 +2991,20 @@
     return 0;
   }
   switch (kind) {
-    case Token::kADD: return StubCode::SmiAddInlineCache_entry();
-    case Token::kSUB: return StubCode::SmiSubInlineCache_entry();
-    case Token::kEQ:  return StubCode::SmiEqualInlineCache_entry();
-    default:          return NULL;
+    case Token::kADD:
+      return StubCode::SmiAddInlineCache_entry();
+    case Token::kSUB:
+      return StubCode::SmiSubInlineCache_entry();
+    case Token::kEQ:
+      return StubCode::SmiEqualInlineCache_entry();
+    default:
+      return NULL;
   }
 }
 #else
-static void TryFastPathSmiOp(
-    FlowGraphCompiler* compiler, ICData* call_ic_data, const String& name) {
+static void TryFastPathSmiOp(FlowGraphCompiler* compiler,
+                             ICData* call_ic_data,
+                             const String& name) {
   if (!FLAG_two_args_smi_icd) {
     return;
   }
@@ -3092,7 +3022,7 @@
     }
   } else if (name.raw() == Symbols::LAngleBracket().raw()) {
     if (call_ic_data->AddSmiSmiCheckForFastSmiStubs()) {
-     __ LessThanTOS();
+      __ LessThanTOS();
     }
   } else if (name.raw() == Symbols::RAngleBracket().raw()) {
     if (call_ic_data->AddSmiSmiCheckForFastSmiStubs()) {
@@ -3120,9 +3050,8 @@
   const ICData* call_ic_data = NULL;
   if (!FLAG_propagate_ic_data || !compiler->is_optimizing() ||
       (ic_data() == NULL)) {
-    const Array& arguments_descriptor =
-        Array::Handle(zone, ArgumentsDescriptor::New(ArgumentCount(),
-                                                     argument_names()));
+    const Array& arguments_descriptor = Array::Handle(
+        zone, ArgumentsDescriptor::New(ArgumentCount(), argument_names()));
     call_ic_data = compiler->GetOrAddInstanceCallICData(
         deopt_id(), function_name(), arguments_descriptor,
         checked_argument_count());
@@ -3136,18 +3065,12 @@
     if (ic_data()->NumberOfUsedChecks() > 0) {
       const ICData& unary_ic_data =
           ICData::ZoneHandle(zone, ic_data()->AsUnaryClassChecks());
-      compiler->GenerateInstanceCall(deopt_id(),
-                                     token_pos(),
-                                     ArgumentCount(),
-                                     locs(),
-                                     unary_ic_data);
+      compiler->GenerateInstanceCall(deopt_id(), token_pos(), ArgumentCount(),
+                                     locs(), unary_ic_data);
     } else {
       // Call was not visited yet, use original ICData in order to populate it.
-      compiler->GenerateInstanceCall(deopt_id(),
-                                     token_pos(),
-                                     ArgumentCount(),
-                                     locs(),
-                                     *call_ic_data);
+      compiler->GenerateInstanceCall(deopt_id(), token_pos(), ArgumentCount(),
+                                     locs(), *call_ic_data);
     }
   } else {
     // Unoptimized code.
@@ -3164,11 +3087,8 @@
       compiler->EmitInstanceCall(*stub_entry, *call_ic_data, ArgumentCount(),
                                  deopt_id(), token_pos(), locs());
     } else {
-      compiler->GenerateInstanceCall(deopt_id(),
-                                     token_pos(),
-                                     ArgumentCount(),
-                                     locs(),
-                                     *call_ic_data);
+      compiler->GenerateInstanceCall(deopt_id(), token_pos(), ArgumentCount(),
+                                     locs(), *call_ic_data);
     }
   }
 #else
@@ -3201,8 +3121,7 @@
       UNIMPLEMENTED();
       break;
   }
-  compiler->AddCurrentDescriptor(RawPcDescriptors::kIcCall,
-                                 deopt_id(),
+  compiler->AddCurrentDescriptor(RawPcDescriptors::kIcCall, deopt_id(),
                                  token_pos());
   compiler->RecordAfterCall(this);
 
@@ -3217,9 +3136,8 @@
   if (FLAG_precompiled_mode && with_checks()) return false;
 
   return ic_data().HasOneTarget() &&
-      (MethodRecognizer::RecognizeKind(
-          Function::Handle(ic_data().GetTargetAt(0))) !=
-       MethodRecognizer::kUnknown);
+         (MethodRecognizer::RecognizeKind(Function::Handle(
+              ic_data().GetTargetAt(0))) != MethodRecognizer::kUnknown);
 }
 
 
@@ -3231,23 +3149,17 @@
   if (!with_checks()) {
     ASSERT(ic_data().HasOneTarget());
     const Function& target = Function::ZoneHandle(ic_data().GetTargetAt(0));
-    compiler->GenerateStaticCall(deopt_id(),
-                                 instance_call()->token_pos(),
-                                 target,
-                                 instance_call()->ArgumentCount(),
-                                 instance_call()->argument_names(),
-                                 locs(),
+    compiler->GenerateStaticCall(deopt_id(), instance_call()->token_pos(),
+                                 target, instance_call()->ArgumentCount(),
+                                 instance_call()->argument_names(), locs(),
                                  ICData::Handle());
     return;
   }
 
-  compiler->EmitPolymorphicInstanceCall(ic_data(),
-                                        instance_call()->ArgumentCount(),
-                                        instance_call()->argument_names(),
-                                        deopt_id(),
-                                        instance_call()->token_pos(),
-                                        locs(),
-                                        complete());
+  compiler->EmitPolymorphicInstanceCall(
+      ic_data(), instance_call()->ArgumentCount(),
+      instance_call()->argument_names(), deopt_id(),
+      instance_call()->token_pos(), locs(), complete());
 }
 #endif
 
@@ -3323,9 +3235,8 @@
   const ICData* call_ic_data = NULL;
   if (!FLAG_propagate_ic_data || !compiler->is_optimizing() ||
       (ic_data() == NULL)) {
-    const Array& arguments_descriptor =
-        Array::Handle(ArgumentsDescriptor::New(ArgumentCount(),
-                                               argument_names()));
+    const Array& arguments_descriptor = Array::Handle(
+        ArgumentsDescriptor::New(ArgumentCount(), argument_names()));
     MethodRecognizer::Kind recognized_kind =
         MethodRecognizer::RecognizeKind(function());
     int num_args_checked = 0;
@@ -3338,35 +3249,28 @@
       default:
         break;
     }
-    call_ic_data = compiler->GetOrAddStaticCallICData(deopt_id(),
-                                                      function(),
-                                                      arguments_descriptor,
-                                                      num_args_checked);
+    call_ic_data = compiler->GetOrAddStaticCallICData(
+        deopt_id(), function(), arguments_descriptor, num_args_checked);
   } else {
     call_ic_data = &ICData::ZoneHandle(ic_data()->raw());
   }
 
 #if !defined(TARGET_ARCH_DBC)
-  compiler->GenerateStaticCall(deopt_id(),
-                               token_pos(),
-                               function(),
-                               ArgumentCount(),
-                               argument_names(),
-                               locs(),
+  compiler->GenerateStaticCall(deopt_id(), token_pos(), function(),
+                               ArgumentCount(), argument_names(), locs(),
                                *call_ic_data);
 #else
   const Array& arguments_descriptor =
-      (ic_data() == NULL) ?
-        Array::Handle(ArgumentsDescriptor::New(ArgumentCount(),
-                                               argument_names())) :
-        Array::Handle(ic_data()->arguments_descriptor());
+      (ic_data() == NULL) ? Array::Handle(ArgumentsDescriptor::New(
+                                ArgumentCount(), argument_names()))
+                          : Array::Handle(ic_data()->arguments_descriptor());
   const intptr_t argdesc_kidx = __ AddConstant(arguments_descriptor);
 
   if (compiler->is_optimizing()) {
     __ PushConstant(function());
     __ StaticCall(ArgumentCount(), argdesc_kidx);
-    compiler->AddCurrentDescriptor(RawPcDescriptors::kOther,
-        deopt_id(), token_pos());
+    compiler->AddCurrentDescriptor(RawPcDescriptors::kOther, deopt_id(),
+                                   token_pos());
     compiler->RecordAfterCall(this);
     __ PopLocal(locs()->out(0).reg());
   } else {
@@ -3374,7 +3278,7 @@
     __ PushConstant(ic_data_kidx);
     __ IndirectStaticCall(ArgumentCount(), argdesc_kidx);
     compiler->AddCurrentDescriptor(RawPcDescriptors::kUnoptStaticCall,
-        deopt_id(), token_pos());
+                                   deopt_id(), token_pos());
     compiler->RecordAfterCall(this);
   }
 #endif  // !defined(TARGET_ARCH_DBC)
@@ -3382,13 +3286,10 @@
 
 
 void AssertAssignableInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  compiler->GenerateAssertAssignable(token_pos(),
-                                     deopt_id(),
-                                     dst_type(),
-                                     dst_name(),
-                                     locs());
+  compiler->GenerateAssertAssignable(token_pos(), deopt_id(), dst_type(),
+                                     dst_name(), locs());
 
-  // DBC does not use LocationSummaries in the same way as other architectures.
+// DBC does not use LocationSummaries in the same way as other architectures.
 #if !defined(TARGET_ARCH_DBC)
   ASSERT(locs()->in(0).reg() == locs()->out(0).reg());
 #endif  // !defined(TARGET_ARCH_DBC)
@@ -3397,7 +3298,7 @@
 
 LocationSummary* DeoptimizeInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
-  return new(zone) LocationSummary(zone, 0, 0, LocationSummary::kNoCall);
+  return new (zone) LocationSummary(zone, 0, 0, LocationSummary::kNoCall);
 }
 
 
@@ -3415,13 +3316,10 @@
                                intptr_t fixed_parameter_count,
                                const ParsedFunction& parsed_function) {
   Environment* env =
-      new(zone) Environment(definitions.length(),
-                               fixed_parameter_count,
-                               Thread::kNoDeoptId,
-                               parsed_function,
-                               NULL);
+      new (zone) Environment(definitions.length(), fixed_parameter_count,
+                             Thread::kNoDeoptId, parsed_function, NULL);
   for (intptr_t i = 0; i < definitions.length(); ++i) {
-    env->values_.Add(new(zone) Value(definitions[i]));
+    env->values_.Add(new (zone) Value(definitions[i]));
   }
   return env;
 }
@@ -3429,12 +3327,9 @@
 
 Environment* Environment::DeepCopy(Zone* zone, intptr_t length) const {
   ASSERT(length <= values_.length());
-  Environment* copy = new(zone) Environment(
-      length,
-      fixed_parameter_count_,
-      deopt_id_,
-      parsed_function_,
-      (outer_ == NULL) ? NULL : outer_->DeepCopy(zone));
+  Environment* copy = new (zone)
+      Environment(length, fixed_parameter_count_, deopt_id_, parsed_function_,
+                  (outer_ == NULL) ? NULL : outer_->DeepCopy(zone));
   if (locations_ != NULL) {
     Location* new_locations = zone->Alloc<Location>(length);
     copy->set_locations(new_locations);
@@ -3475,9 +3370,9 @@
 
   Environment* copy = DeepCopy(zone, values_.length() - argc);
   for (intptr_t i = 0; i < argc; i++) {
-    copy->values_.Add(new(zone) Value(dead));
+    copy->values_.Add(new (zone) Value(dead));
   }
-  copy->values_.Add(new(zone) Value(result));
+  copy->values_.Add(new (zone) Value(result));
 
   instr->SetEnvironment(copy);
   for (Environment::DeepIterator it(copy); !it.Done(); it.Advance()) {
@@ -3515,50 +3410,34 @@
 
 ComparisonInstr* EqualityCompareInstr::CopyWithNewOperands(Value* new_left,
                                                            Value* new_right) {
-  return new EqualityCompareInstr(token_pos(),
-                                  kind(),
-                                  new_left,
-                                  new_right,
-                                  operation_cid(),
-                                  deopt_id());
+  return new EqualityCompareInstr(token_pos(), kind(), new_left, new_right,
+                                  operation_cid(), deopt_id());
 }
 
 
 ComparisonInstr* RelationalOpInstr::CopyWithNewOperands(Value* new_left,
                                                         Value* new_right) {
-  return new RelationalOpInstr(token_pos(),
-                               kind(),
-                               new_left,
-                               new_right,
-                               operation_cid(),
-                               deopt_id());
+  return new RelationalOpInstr(token_pos(), kind(), new_left, new_right,
+                               operation_cid(), deopt_id());
 }
 
 
 ComparisonInstr* StrictCompareInstr::CopyWithNewOperands(Value* new_left,
                                                          Value* new_right) {
-  return new StrictCompareInstr(token_pos(),
-                                kind(),
-                                new_left,
-                                new_right,
+  return new StrictCompareInstr(token_pos(), kind(), new_left, new_right,
                                 needs_number_check());
 }
 
 
-
 ComparisonInstr* TestSmiInstr::CopyWithNewOperands(Value* new_left,
                                                    Value* new_right) {
   return new TestSmiInstr(token_pos(), kind(), new_left, new_right);
 }
 
 
-
 ComparisonInstr* TestCidsInstr::CopyWithNewOperands(Value* new_left,
                                                     Value* new_right) {
-  return new TestCidsInstr(token_pos(),
-                           kind(),
-                           new_left,
-                           cid_results(),
+  return new TestCidsInstr(token_pos(), kind(), new_left, cid_results(),
                            deopt_id());
 }
 
@@ -3595,8 +3474,8 @@
   if (comparison->IsStrictCompare()) {
     // Strict comparison with number checks calls a stub and is not supported
     // by if-conversion.
-    return is_smi_result
-        && !comparison->AsStrictCompare()->needs_number_check();
+    return is_smi_result &&
+           !comparison->AsStrictCompare()->needs_number_check();
   }
   if (comparison->operation_cid() != kSmiCid) {
     // Non-smi comparisons are not supported by if-conversion.
@@ -3626,8 +3505,9 @@
 
 
 Instruction* CheckArrayBoundInstr::Canonicalize(FlowGraph* flow_graph) {
-  return IsRedundant(RangeBoundary::FromDefinition(length()->definition())) ?
-      NULL : this;
+  return IsRedundant(RangeBoundary::FromDefinition(length()->definition()))
+             ? NULL
+             : this;
 }
 
 
@@ -3661,12 +3541,9 @@
     const Class& cls =
         Class::Handle(Library::LookupCoreClass(Symbols::StringBase()));
     ASSERT(!cls.IsNull());
-    function_ =
-        Resolver::ResolveStatic(
-            cls,
-            Library::PrivateCoreLibName(Symbols::Interpolate()),
-            kNumberOfArguments,
-            kNoArgumentNames);
+    function_ = Resolver::ResolveStatic(
+        cls, Library::PrivateCoreLibName(Symbols::Interpolate()),
+        kNumberOfArguments, kNoArgumentNames);
   }
   ASSERT(!function_.IsNull());
   return function_;
@@ -3705,8 +3582,7 @@
     pieces.Add(Object::null_string());
   }
 
-  for (Value::Iterator it(create_array->input_use_list());
-       !it.Done();
+  for (Value::Iterator it(create_array->input_use_list()); !it.Done();
        it.Advance()) {
     Instruction* curr = it.Current()->instruction();
     if (curr == this) continue;
@@ -3728,10 +3604,10 @@
       } else if (obj.IsSmi()) {
         const char* cstr = obj.ToCString();
         pieces.SetAt(store_index,
-            String::Handle(zone, String::New(cstr, Heap::kOld)));
+                     String::Handle(zone, String::New(cstr, Heap::kOld)));
       } else if (obj.IsBool()) {
-        pieces.SetAt(store_index,
-            Bool::Cast(obj).value() ? Symbols::True() : Symbols::False());
+        pieces.SetAt(store_index, Bool::Cast(obj).value() ? Symbols::True()
+                                                          : Symbols::False());
       } else if (obj.IsNull()) {
         pieces.SetAt(store_index, Symbols::Null());
       } else {
@@ -3742,8 +3618,8 @@
     }
   }
 
-  const String& concatenated = String::ZoneHandle(zone,
-      Symbols::FromConcatAll(thread, pieces));
+  const String& concatenated =
+      String::ZoneHandle(zone, Symbols::FromConcatAll(thread, pieces));
   return flow_graph->GetConstant(concatenated);
 }
 
@@ -3791,7 +3667,6 @@
 }
 
 
-
 StoreIndexedInstr::StoreIndexedInstr(Value* array,
                                      Value* index,
                                      Value* value,
@@ -3859,60 +3734,88 @@
 }
 
 // Use expected function signatures to help MSVC compiler resolve overloading.
-typedef double (*UnaryMathCFunction) (double x);
-typedef double (*BinaryMathCFunction) (double x, double y);
+typedef double (*UnaryMathCFunction)(double x);
+typedef double (*BinaryMathCFunction)(double x, double y);
 
-DEFINE_RAW_LEAF_RUNTIME_ENTRY(LibcPow, 2, true /* is_float */,
-    reinterpret_cast<RuntimeFunction>(
-        static_cast<BinaryMathCFunction>(&pow)));
+DEFINE_RAW_LEAF_RUNTIME_ENTRY(
+    LibcPow,
+    2,
+    true /* is_float */,
+    reinterpret_cast<RuntimeFunction>(static_cast<BinaryMathCFunction>(&pow)));
 
-DEFINE_RAW_LEAF_RUNTIME_ENTRY(DartModulo, 2, true /* is_float */,
+DEFINE_RAW_LEAF_RUNTIME_ENTRY(
+    DartModulo,
+    2,
+    true /* is_float */,
     reinterpret_cast<RuntimeFunction>(
         static_cast<BinaryMathCFunction>(&DartModulo)));
 
-DEFINE_RAW_LEAF_RUNTIME_ENTRY(LibcAtan2, 2, true /* is_float */,
+DEFINE_RAW_LEAF_RUNTIME_ENTRY(
+    LibcAtan2,
+    2,
+    true /* is_float */,
     reinterpret_cast<RuntimeFunction>(
         static_cast<BinaryMathCFunction>(&atan2_ieee)));
 
-DEFINE_RAW_LEAF_RUNTIME_ENTRY(LibcFloor, 1, true /* is_float */,
-    reinterpret_cast<RuntimeFunction>(
-        static_cast<UnaryMathCFunction>(&floor)));
+DEFINE_RAW_LEAF_RUNTIME_ENTRY(
+    LibcFloor,
+    1,
+    true /* is_float */,
+    reinterpret_cast<RuntimeFunction>(static_cast<UnaryMathCFunction>(&floor)));
 
-DEFINE_RAW_LEAF_RUNTIME_ENTRY(LibcCeil, 1, true /* is_float */,
-    reinterpret_cast<RuntimeFunction>(
-        static_cast<UnaryMathCFunction>(&ceil)));
+DEFINE_RAW_LEAF_RUNTIME_ENTRY(
+    LibcCeil,
+    1,
+    true /* is_float */,
+    reinterpret_cast<RuntimeFunction>(static_cast<UnaryMathCFunction>(&ceil)));
 
-DEFINE_RAW_LEAF_RUNTIME_ENTRY(LibcTrunc, 1, true /* is_float */,
-    reinterpret_cast<RuntimeFunction>(
-        static_cast<UnaryMathCFunction>(&trunc)));
+DEFINE_RAW_LEAF_RUNTIME_ENTRY(
+    LibcTrunc,
+    1,
+    true /* is_float */,
+    reinterpret_cast<RuntimeFunction>(static_cast<UnaryMathCFunction>(&trunc)));
 
-DEFINE_RAW_LEAF_RUNTIME_ENTRY(LibcRound, 1, true /* is_float */,
-    reinterpret_cast<RuntimeFunction>(
-        static_cast<UnaryMathCFunction>(&round)));
+DEFINE_RAW_LEAF_RUNTIME_ENTRY(
+    LibcRound,
+    1,
+    true /* is_float */,
+    reinterpret_cast<RuntimeFunction>(static_cast<UnaryMathCFunction>(&round)));
 
-DEFINE_RAW_LEAF_RUNTIME_ENTRY(LibcCos, 1, true /* is_float */,
-    reinterpret_cast<RuntimeFunction>(
-        static_cast<UnaryMathCFunction>(&cos)));
+DEFINE_RAW_LEAF_RUNTIME_ENTRY(
+    LibcCos,
+    1,
+    true /* is_float */,
+    reinterpret_cast<RuntimeFunction>(static_cast<UnaryMathCFunction>(&cos)));
 
-DEFINE_RAW_LEAF_RUNTIME_ENTRY(LibcSin, 1, true /* is_float */,
-    reinterpret_cast<RuntimeFunction>(
-        static_cast<UnaryMathCFunction>(&sin)));
+DEFINE_RAW_LEAF_RUNTIME_ENTRY(
+    LibcSin,
+    1,
+    true /* is_float */,
+    reinterpret_cast<RuntimeFunction>(static_cast<UnaryMathCFunction>(&sin)));
 
-DEFINE_RAW_LEAF_RUNTIME_ENTRY(LibcAsin, 1, true /* is_float */,
-    reinterpret_cast<RuntimeFunction>(
-        static_cast<UnaryMathCFunction>(&asin)));
+DEFINE_RAW_LEAF_RUNTIME_ENTRY(
+    LibcAsin,
+    1,
+    true /* is_float */,
+    reinterpret_cast<RuntimeFunction>(static_cast<UnaryMathCFunction>(&asin)));
 
-DEFINE_RAW_LEAF_RUNTIME_ENTRY(LibcAcos, 1, true /* is_float */,
-    reinterpret_cast<RuntimeFunction>(
-        static_cast<UnaryMathCFunction>(&acos)));
+DEFINE_RAW_LEAF_RUNTIME_ENTRY(
+    LibcAcos,
+    1,
+    true /* is_float */,
+    reinterpret_cast<RuntimeFunction>(static_cast<UnaryMathCFunction>(&acos)));
 
-DEFINE_RAW_LEAF_RUNTIME_ENTRY(LibcTan, 1, true /* is_float */,
-    reinterpret_cast<RuntimeFunction>(
-        static_cast<UnaryMathCFunction>(&tan)));
+DEFINE_RAW_LEAF_RUNTIME_ENTRY(
+    LibcTan,
+    1,
+    true /* is_float */,
+    reinterpret_cast<RuntimeFunction>(static_cast<UnaryMathCFunction>(&tan)));
 
-DEFINE_RAW_LEAF_RUNTIME_ENTRY(LibcAtan, 1, true /* is_float */,
-    reinterpret_cast<RuntimeFunction>(
-        static_cast<UnaryMathCFunction>(&atan)));
+DEFINE_RAW_LEAF_RUNTIME_ENTRY(
+    LibcAtan,
+    1,
+    true /* is_float */,
+    reinterpret_cast<RuntimeFunction>(static_cast<UnaryMathCFunction>(&atan)));
 
 
 const RuntimeEntry& InvokeMathCFunctionInstr::TargetFunction() const {
@@ -3952,9 +3855,12 @@
 
 const char* MathUnaryInstr::KindToCString(MathUnaryKind kind) {
   switch (kind) {
-    case kIllegal:       return "illegal";
-    case kSqrt:          return "sqrt";
-    case kDoubleSquare:  return "double-square";
+    case kIllegal:
+      return "illegal";
+    case kSqrt:
+      return "sqrt";
+    case kDoubleSquare:
+      return "double-square";
   }
   UNREACHABLE();
   return "";
@@ -3969,9 +3875,7 @@
 MergedMathInstr::MergedMathInstr(ZoneGrowableArray<Value*>* inputs,
                                  intptr_t deopt_id,
                                  MergedMathInstr::Kind kind)
-    : PureDefinition(deopt_id),
-      inputs_(inputs),
-      kind_(kind) {
+    : PureDefinition(deopt_id), inputs_(inputs), kind_(kind) {
   ASSERT(inputs_->length() == InputCountFor(kind_));
   for (intptr_t i = 0; i < inputs_->length(); ++i) {
     ASSERT((*inputs)[i] != NULL);
@@ -3983,18 +3887,26 @@
 
 intptr_t MergedMathInstr::OutputIndexOf(MethodRecognizer::Kind kind) {
   switch (kind) {
-    case MethodRecognizer::kMathSin: return 1;
-    case MethodRecognizer::kMathCos: return 0;
-    default: UNIMPLEMENTED(); return -1;
+    case MethodRecognizer::kMathSin:
+      return 1;
+    case MethodRecognizer::kMathCos:
+      return 0;
+    default:
+      UNIMPLEMENTED();
+      return -1;
   }
 }
 
 
 intptr_t MergedMathInstr::OutputIndexOf(Token::Kind token) {
   switch (token) {
-    case Token::kTRUNCDIV: return 0;
-    case Token::kMOD: return 1;
-    default: UNIMPLEMENTED(); return -1;
+    case Token::kTRUNCDIV:
+      return 0;
+    case Token::kMOD:
+      return 1;
+    default:
+      UNIMPLEMENTED();
+      return -1;
   }
 }
 
@@ -4009,13 +3921,10 @@
   NativeFunction native_function = NativeEntry::ResolveNative(
       library, native_name(), num_params, &auto_setup_scope);
   if (native_function == NULL) {
-    Report::MessageF(Report::kError,
-                     Script::Handle(function().script()),
-                     function().token_pos(),
-                     Report::AtLocation,
+    Report::MessageF(Report::kError, Script::Handle(function().script()),
+                     function().token_pos(), Report::AtLocation,
                      "native function '%s' (%" Pd " arguments) cannot be found",
-                     native_name().ToCString(),
-                     function().NumParameters());
+                     native_name().ToCString(), function().NumParameters());
   }
   set_native_c_function(native_function);
   function().SetIsNativeAutoSetupScope(auto_setup_scope);
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index add487e..0aa3af3 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -53,18 +53,18 @@
   static const bool kNonNullable = false;
 
   CompileType(bool is_nullable, intptr_t cid, const AbstractType* type)
-      : is_nullable_(is_nullable), cid_(cid), type_(type) { }
+      : is_nullable_(is_nullable), cid_(cid), type_(type) {}
 
   CompileType(const CompileType& other)
       : ValueObject(),
         is_nullable_(other.is_nullable_),
         cid_(other.cid_),
-        type_(other.type_) { }
+        type_(other.type_) {}
 
   CompileType& operator=(const CompileType& other) {
     is_nullable_ = other.is_nullable_;
     cid_ = other.cid_;
-    type_ =  other.type_;
+    type_ = other.type_;
     return *this;
   }
 
@@ -96,8 +96,7 @@
   // given type.
   bool IsAssignableTo(const AbstractType& type) {
     bool is_instance;
-    return CanComputeIsInstanceOf(type, kNullable, &is_instance) &&
-           is_instance;
+    return CanComputeIsInstanceOf(type, kNullable, &is_instance) && is_instance;
   }
 
   // Create a new CompileType representing given combination of class id and
@@ -151,19 +150,16 @@
   // Returns true if this and other types are the same.
   bool IsEqualTo(CompileType* other) {
     return (is_nullable_ == other->is_nullable_) &&
-        (ToNullableCid() == other->ToNullableCid()) &&
-        (ToAbstractType()->Equals(*other->ToAbstractType()));
+           (ToNullableCid() == other->ToNullableCid()) &&
+           (ToAbstractType()->Equals(*other->ToAbstractType()));
   }
 
-  bool IsNone() const {
-    return (cid_ == kIllegalCid) && (type_ == NULL);
-  }
+  bool IsNone() const { return (cid_ == kIllegalCid) && (type_ == NULL); }
 
   bool IsInt() {
-    return !is_nullable() &&
-      ((ToCid() == kSmiCid) ||
-       (ToCid() == kMintCid) ||
-       ((type_ != NULL) && (type_->Equals(Type::Handle(Type::IntType())))));
+    return !is_nullable() && ((ToCid() == kSmiCid) || (ToCid() == kMintCid) ||
+                              ((type_ != NULL) &&
+                               (type_->Equals(Type::Handle(Type::IntType())))));
   }
 
   void PrintTo(BufferFormatter* f) const;
@@ -188,12 +184,10 @@
     return zone_type->ToCompileType();
   }
 
-  CompileType* ToCompileType() {
-    return &type_;
-  }
+  CompileType* ToCompileType() { return &type_; }
 
  protected:
-  explicit ZoneCompileType(const CompileType& type) : type_(type) { }
+  explicit ZoneCompileType(const CompileType& type) : type_(type) {}
 
   CompileType type_;
 };
@@ -203,14 +197,14 @@
 // another compile type.
 class ConstrainedCompileType : public ZoneCompileType {
  public:
-  virtual ~ConstrainedCompileType() { }
+  virtual ~ConstrainedCompileType() {}
 
   // Recompute compile type.
   virtual void Update() = 0;
 
  protected:
   explicit ConstrainedCompileType(const CompileType& type)
-      : ZoneCompileType(type) { }
+      : ZoneCompileType(type) {}
 };
 
 
@@ -221,11 +215,9 @@
 class NotNullConstrainedCompileType : public ConstrainedCompileType {
  public:
   explicit NotNullConstrainedCompileType(CompileType* source)
-      : ConstrainedCompileType(source->CopyNonNullable()), source_(source) { }
+      : ConstrainedCompileType(source->CopyNonNullable()), source_(source) {}
 
-  virtual void Update() {
-    type_ = source_->CopyNonNullable();
-  }
+  virtual void Update() { type_ = source_->CopyNonNullable(); }
 
  private:
   CompileType* source_;
@@ -240,9 +232,7 @@
     kLastEffect = kExternalization
   };
 
-  EffectSet(const EffectSet& other)
-      : ValueObject(), effects_(other.effects_) {
-  }
+  EffectSet(const EffectSet& other) : ValueObject(), effects_(other.effects_) {}
 
   bool IsNone() const { return effects_ == kNoEffects; }
 
@@ -252,14 +242,12 @@
     return EffectSet(kExternalization);
   }
 
-  static EffectSet Externalization() {
-    return EffectSet(kExternalization);
-  }
+  static EffectSet Externalization() { return EffectSet(kExternalization); }
 
   bool ToInt() { return effects_; }
 
  private:
-  explicit EffectSet(intptr_t effects) : effects_(effects) { }
+  explicit EffectSet(intptr_t effects) : effects_(effects) {}
 
   intptr_t effects_;
 };
@@ -279,6 +267,7 @@
       current_ = next_;
       if (next_ != NULL) next_ = next_->next_use();
     }
+
    private:
     Value* current_;
     Value* next_;
@@ -290,7 +279,7 @@
         next_use_(NULL),
         instruction_(NULL),
         use_index_(-1),
-        reaching_type_(NULL) { }
+        reaching_type_(NULL) {}
 
   Definition* definition() const { return definition_; }
   void set_definition(Definition* definition) { definition_ = definition; }
@@ -318,7 +307,7 @@
   inline void BindTo(Definition* definition);
   inline void BindToEnvironment(Definition* definition);
 
-  Value* Copy(Zone* zone) { return new(zone) Value(definition_); }
+  Value* Copy(Zone* zone) { return new (zone) Value(definition_); }
 
   // This function must only be used when the new Value is dominated by
   // the original Value.
@@ -330,9 +319,7 @@
 
   CompileType* Type();
 
-  void SetReachingType(CompileType* type) {
-    reaching_type_ = type;
-  }
+  void SetReachingType(CompileType* type) { reaching_type_ = type; }
 
   void PrintTo(BufferFormatter* f) const;
 
@@ -372,10 +359,10 @@
 
 // An embedded container with N elements of type T.  Used (with partial
 // specialization for N=0) because embedded arrays cannot have size 0.
-template<typename T, intptr_t N>
+template <typename T, intptr_t N>
 class EmbeddedArray {
  public:
-  EmbeddedArray() : elements_() { }
+  EmbeddedArray() : elements_() {}
 
   intptr_t length() const { return N; }
 
@@ -389,20 +376,16 @@
     return elements_[i];
   }
 
-  const T& At(intptr_t i) const {
-    return (*this)[i];
-  }
+  const T& At(intptr_t i) const { return (*this)[i]; }
 
-  void SetAt(intptr_t i, const T& val) {
-    (*this)[i] = val;
-  }
+  void SetAt(intptr_t i, const T& val) { (*this)[i] = val; }
 
  private:
   T elements_[N];
 };
 
 
-template<typename T>
+template <typename T>
 class EmbeddedArray<T, 0> {
  public:
   intptr_t length() const { return 0; }
@@ -572,7 +555,7 @@
   M(UnboxInteger)                                                              \
   M(Comparison)                                                                \
   M(UnaryIntegerOp)                                                            \
-  M(BinaryIntegerOp)                                                           \
+  M(BinaryIntegerOp)
 
 #define FORWARD_DECLARATION(type) class type##Instr;
 FOR_EACH_INSTRUCTION(FORWARD_DECLARATION)
@@ -581,7 +564,7 @@
 
 #define DEFINE_INSTRUCTION_TYPE_CHECK(type)                                    \
   virtual type##Instr* As##type() { return this; }                             \
-  virtual const char* DebugName() const { return #type; }                      \
+  virtual const char* DebugName() const { return #type; }
 
 // Functions required in all concrete instruction classes.
 #define DECLARE_INSTRUCTION_NO_BACKEND(type)                                   \
@@ -590,25 +573,24 @@
   DEFINE_INSTRUCTION_TYPE_CHECK(type)
 
 #define DECLARE_INSTRUCTION_BACKEND()                                          \
-  virtual LocationSummary* MakeLocationSummary(Zone* zone,                     \
-                                               bool optimizing) const;         \
-  virtual void EmitNativeCode(FlowGraphCompiler* compiler);                    \
+  virtual LocationSummary* MakeLocationSummary(Zone* zone, bool optimizing)    \
+      const;                                                                   \
+  virtual void EmitNativeCode(FlowGraphCompiler* compiler);
 
 // Functions required in all concrete instruction classes.
 #define DECLARE_INSTRUCTION(type)                                              \
   DECLARE_INSTRUCTION_NO_BACKEND(type)                                         \
-  DECLARE_INSTRUCTION_BACKEND()                                                \
+  DECLARE_INSTRUCTION_BACKEND()
 
 #ifndef PRODUCT
-#define PRINT_TO_SUPPORT                                                       \
-    virtual void PrintTo(BufferFormatter* f) const;
+#define PRINT_TO_SUPPORT virtual void PrintTo(BufferFormatter* f) const;
 #else
 #define PRINT_TO_SUPPORT
 #endif  // !PRODUCT
 
 #ifndef PRODUCT
 #define PRINT_OPERANDS_TO_SUPPORT                                              \
-    virtual void PrintOperandsTo(BufferFormatter* f) const;
+  virtual void PrintOperandsTo(BufferFormatter* f) const;
 #else
 #define PRINT_OPERANDS_TO_SUPPORT
 #endif  // !PRODUCT
@@ -616,9 +598,7 @@
 class Instruction : public ZoneAllocated {
  public:
 #define DECLARE_TAG(type) k##type,
-  enum Tag {
-    FOR_EACH_INSTRUCTION(DECLARE_TAG)
-  };
+  enum Tag { FOR_EACH_INSTRUCTION(DECLARE_TAG) };
 #undef DECLARE_TAG
 
   explicit Instruction(intptr_t deopt_id = Thread::kNoDeoptId)
@@ -628,9 +608,9 @@
         next_(NULL),
         env_(NULL),
         locs_(NULL),
-        inlining_id_(-1) { }
+        inlining_id_(-1) {}
 
-  virtual ~Instruction() { }
+  virtual ~Instruction() {}
 
   virtual Tag tag() const = 0;
 
@@ -642,9 +622,7 @@
   const ICData* GetICData(
       const ZoneGrowableArray<const ICData*>& ic_data_array) const;
 
-  virtual TokenPosition token_pos() const {
-    return TokenPosition::kNoSource;
-  }
+  virtual TokenPosition token_pos() const { return TokenPosition::kNoSource; }
 
   virtual intptr_t InputCount() const = 0;
   virtual Value* InputAt(intptr_t i) const = 0;
@@ -739,9 +717,9 @@
 #define INSTRUCTION_TYPE_CHECK(Name)                                           \
   DECLARE_INSTRUCTION_TYPE_CHECK(Name, Name##Instr)
 
-DECLARE_INSTRUCTION_TYPE_CHECK(Definition, Definition)
-FOR_EACH_INSTRUCTION(INSTRUCTION_TYPE_CHECK)
-FOR_EACH_ABSTRACT_INSTRUCTION(INSTRUCTION_TYPE_CHECK)
+  DECLARE_INSTRUCTION_TYPE_CHECK(Definition, Definition)
+  FOR_EACH_INSTRUCTION(INSTRUCTION_TYPE_CHECK)
+  FOR_EACH_ABSTRACT_INSTRUCTION(INSTRUCTION_TYPE_CHECK)
 
 #undef INSTRUCTION_TYPE_CHECK
 #undef DECLARE_INSTRUCTION_TYPE_CHECK
@@ -765,18 +743,14 @@
 
   static LocationSummary* MakeCallSummary(Zone* zone);
 
-  virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
-    UNIMPLEMENTED();
-  }
+  virtual void EmitNativeCode(FlowGraphCompiler* compiler) { UNIMPLEMENTED(); }
 
   Environment* env() const { return env_; }
   void SetEnvironment(Environment* deopt_env);
   void RemoveEnvironment();
 
   intptr_t lifetime_position() const { return lifetime_position_; }
-  void set_lifetime_position(intptr_t pos) {
-    lifetime_position_ = pos;
-  }
+  void set_lifetime_position(intptr_t pos) { lifetime_position_ = pos; }
 
   bool HasUnmatchedInputRepresentations() const;
 
@@ -786,13 +760,9 @@
   }
 
   // Representation of the value produced by this computation.
-  virtual Representation representation() const {
-    return kTagged;
-  }
+  virtual Representation representation() const { return kTagged; }
 
-  bool WasEliminated() const {
-    return next() == NULL;
-  }
+  bool WasEliminated() const { return next() == NULL; }
 
   // Returns deoptimization id that corresponds to the deoptimization target
   // that input operands conversions inserted for this instruction can jump
@@ -820,14 +790,10 @@
   // instruction.
   Instruction* AppendInstruction(Instruction* tail);
 
-  virtual bool AllowsDCE() const {
-    return false;
-  }
+  virtual bool AllowsDCE() const { return false; }
 
   // Returns true if CSE and LICM are allowed for this instruction.
-  virtual bool AllowsCSE() const {
-    return false;
-  }
+  virtual bool AllowsCSE() const { return false; }
 
   // Returns set of effects created by this instruction.
   virtual EffectSet Effects() const = 0;
@@ -876,9 +842,7 @@
     return CanDeoptimize() || CanBecomeDeoptimizationTarget();
   }
 
-  virtual bool CanBecomeDeoptimizationTarget() const {
-    return false;
-  }
+  virtual bool CanBecomeDeoptimizationTarget() const { return false; }
 
   void InheritDeoptTargetAfter(FlowGraph* flow_graph,
                                Definition* call,
@@ -902,23 +866,19 @@
   friend class CatchBlockEntryInstr;  // deopt_id_
 
   // Fetch deopt id without checking if this computation can deoptimize.
-  intptr_t GetDeoptId() const {
-    return deopt_id_;
-  }
+  intptr_t GetDeoptId() const { return deopt_id_; }
 
   void CopyDeoptIdFrom(const Instruction& instr) {
     deopt_id_ = instr.deopt_id_;
   }
 
  private:
-  friend class BranchInstr;  // For RawSetInputAt.
+  friend class BranchInstr;      // For RawSetInputAt.
   friend class IfThenElseInstr;  // For RawSetInputAt.
 
   virtual void RawSetInputAt(intptr_t i, Value* value) = 0;
 
-  enum {
-    kNoPlaceId = -1
-  };
+  enum { kNoPlaceId = -1 };
 
   intptr_t deopt_id_;
   union {
@@ -937,8 +897,7 @@
 
 class PureInstruction : public Instruction {
  public:
-  explicit PureInstruction(intptr_t deopt_id)
-      : Instruction(deopt_id) { }
+  explicit PureInstruction(intptr_t deopt_id) : Instruction(deopt_id) {}
 
   virtual bool AllowsCSE() const { return true; }
   virtual EffectSet Dependencies() const { return EffectSet::None(); }
@@ -961,25 +920,26 @@
 // Types to be used as CSETrait for TemplateInstruction/TemplateDefinition.
 // Pure instructions are those that allow CSE and have no effects and
 // no dependencies.
-template<typename DefaultBase, typename PureBase>
+template <typename DefaultBase, typename PureBase>
 struct Pure {
   typedef PureBase Base;
 };
 
 
-template<typename DefaultBase, typename PureBase>
+template <typename DefaultBase, typename PureBase>
 struct NoCSE {
   typedef DefaultBase Base;
 };
 
 
-template<intptr_t N,
-         typename ThrowsTrait,
-         template<typename Default, typename Pure> class CSETrait = NoCSE>
-class TemplateInstruction: public CSETrait<Instruction, PureInstruction>::Base {
+template <intptr_t N,
+          typename ThrowsTrait,
+          template <typename Default, typename Pure> class CSETrait = NoCSE>
+class TemplateInstruction
+    : public CSETrait<Instruction, PureInstruction>::Base {
  public:
   explicit TemplateInstruction(intptr_t deopt_id = Thread::kNoDeoptId)
-      : CSETrait<Instruction, PureInstruction>::Base(deopt_id), inputs_() { }
+      : CSETrait<Instruction, PureInstruction>::Base(deopt_id), inputs_() {}
 
   virtual intptr_t InputCount() const { return N; }
   virtual Value* InputAt(intptr_t i) const { return inputs_[i]; }
@@ -990,15 +950,13 @@
   EmbeddedArray<Value*, N> inputs_;
 
  private:
-  virtual void RawSetInputAt(intptr_t i, Value* value) {
-    inputs_[i] = value;
-  }
+  virtual void RawSetInputAt(intptr_t i, Value* value) { inputs_[i] = value; }
 };
 
 
 class MoveOperands : public ZoneAllocated {
  public:
-  MoveOperands(Location dest, Location src) : dest_(dest), src_(src) { }
+  MoveOperands(Location dest, Location src) : dest_(dest), src_(src) {}
 
   Location src() const { return src_; }
   Location dest() const { return dest_; }
@@ -1056,7 +1014,7 @@
 
 class ParallelMoveInstr : public TemplateInstruction<0, NoThrow> {
  public:
-  ParallelMoveInstr() : moves_(4) { }
+  ParallelMoveInstr() : moves_(4) {}
 
   DECLARE_INSTRUCTION(ParallelMove)
 
@@ -1093,7 +1051,7 @@
   PRINT_TO_SUPPORT
 
  private:
-  GrowableArray<MoveOperands*> moves_;   // Elements cannot be null.
+  GrowableArray<MoveOperands*> moves_;  // Elements cannot be null.
 
   DISALLOW_COPY_AND_ASSIGN(ParallelMoveInstr);
 };
@@ -1121,7 +1079,7 @@
   // the register allocator.
   void set_start_pos(intptr_t pos) { start_pos_ = pos; }
   intptr_t start_pos() const { return start_pos_; }
-  void  set_end_pos(intptr_t pos) { end_pos_ = pos; }
+  void set_end_pos(intptr_t pos) { end_pos_ = pos; }
   intptr_t end_pos() const { return end_pos_; }
 
   BlockEntryInstr* dominator() const { return dominator_; }
@@ -1142,13 +1100,9 @@
   Instruction* last_instruction() const { return last_instruction_; }
   void set_last_instruction(Instruction* instr) { last_instruction_ = instr; }
 
-  ParallelMoveInstr* parallel_move() const {
-    return parallel_move_;
-  }
+  ParallelMoveInstr* parallel_move() const { return parallel_move_; }
 
-  bool HasParallelMove() const {
-    return parallel_move_ != NULL;
-  }
+  bool HasParallelMove() const { return parallel_move_ != NULL; }
 
   bool HasNonRedundantParallelMove() const {
     return HasParallelMove() && !parallel_move()->IsRedundant();
@@ -1173,10 +1127,9 @@
   // block is recorded in each entry instruction.  Returns true when called the
   // first time on this particular block within one graph traversal, and false
   // on all successive calls.
-  bool DiscoverBlock(
-      BlockEntryInstr* predecessor,
-      GrowableArray<BlockEntryInstr*>* preorder,
-      GrowableArray<intptr_t>* parent);
+  bool DiscoverBlock(BlockEntryInstr* predecessor,
+                     GrowableArray<BlockEntryInstr*>* preorder,
+                     GrowableArray<intptr_t>* parent);
 
   // Perform a depth first search to prune code not reachable from an OSR
   // entry point.
@@ -1207,9 +1160,7 @@
   virtual bool MayThrow() const { return false; }
 
   intptr_t try_index() const { return try_index_; }
-  void set_try_index(intptr_t index) {
-    try_index_ = index;
-  }
+  void set_try_index(intptr_t index) { try_index_ = index; }
 
   // True for blocks inside a try { } region.
   bool InsideTryBlock() const {
@@ -1217,13 +1168,9 @@
   }
 
   BitVector* loop_info() const { return loop_info_; }
-  void set_loop_info(BitVector* loop_info) {
-    loop_info_ = loop_info;
-  }
+  void set_loop_info(BitVector* loop_info) { loop_info_ = loop_info; }
 
-  virtual BlockEntryInstr* GetBlock() {
-    return this;
-  }
+  virtual BlockEntryInstr* GetBlock() { return this; }
 
   virtual TokenPosition token_pos() const {
     return TokenPosition::kControlFlow;
@@ -1257,8 +1204,7 @@
         last_instruction_(NULL),
         offset_(-1),
         parallel_move_(NULL),
-        loop_info_(NULL) {
-  }
+        loop_info_(NULL) {}
 
  private:
   virtual void RawSetInputAt(intptr_t i, Value* value) { UNREACHABLE(); }
@@ -1394,9 +1340,7 @@
   }
   TargetEntryInstr* normal_entry() const { return normal_entry_; }
 
-  const ParsedFunction& parsed_function() const {
-    return parsed_function_;
-  }
+  const ParsedFunction& parsed_function() const { return parsed_function_; }
 
   const GrowableArray<CatchBlockEntryInstr*>& catch_entries() const {
     return catch_entries_;
@@ -1432,7 +1376,7 @@
   JoinEntryInstr(intptr_t block_id, intptr_t try_index)
       : BlockEntryInstr(block_id, try_index),
         predecessors_(2),  // Two is the assumed to be the common case.
-        phis_(NULL) { }
+        phis_(NULL) {}
 
   DECLARE_INSTRUCTION(JoinEntry)
 
@@ -1480,21 +1424,16 @@
 
 class PhiIterator : public ValueObject {
  public:
-  explicit PhiIterator(JoinEntryInstr* join)
-      : phis_(join->phis()), index_(0) { }
+  explicit PhiIterator(JoinEntryInstr* join) : phis_(join->phis()), index_(0) {}
 
   void Advance() {
     ASSERT(!Done());
     index_++;
   }
 
-  bool Done() const {
-    return (phis_ == NULL) || (index_ >= phis_->length());
-  }
+  bool Done() const { return (phis_ == NULL) || (index_ >= phis_->length()); }
 
-  PhiInstr* Current() const {
-    return (*phis_)[index_];
-  }
+  PhiInstr* Current() const { return (*phis_)[index_]; }
 
  private:
   ZoneGrowableArray<PhiInstr*>* phis_;
@@ -1507,7 +1446,7 @@
   TargetEntryInstr(intptr_t block_id, intptr_t try_index)
       : BlockEntryInstr(block_id, try_index),
         predecessor_(NULL),
-        edge_weight_(0.0) { }
+        edge_weight_(0.0) {}
 
   DECLARE_INSTRUCTION(TargetEntry)
 
@@ -1546,8 +1485,7 @@
   IndirectEntryInstr(intptr_t block_id,
                      intptr_t indirect_id,
                      intptr_t try_index)
-      : JoinEntryInstr(block_id, try_index),
-        indirect_id_(indirect_id) { }
+      : JoinEntryInstr(block_id, try_index), indirect_id_(indirect_id) {}
 
   DECLARE_INSTRUCTION(IndirectEntry)
 
@@ -1603,9 +1541,7 @@
 
   // Returns try index for the try block to which this catch handler
   // corresponds.
-  intptr_t catch_try_index() const {
-    return catch_try_index_;
-  }
+  intptr_t catch_try_index() const { return catch_try_index_; }
   GrowableArray<Definition*>* initial_definitions() {
     return &initial_definitions_;
   }
@@ -1669,8 +1605,7 @@
   }
 
   AliasIdentity(const AliasIdentity& other)
-      : ValueObject(), value_(other.value_) {
-  }
+      : ValueObject(), value_(other.value_) {}
 
   AliasIdentity& operator=(const AliasIdentity& other) {
     value_ = other.value_;
@@ -1678,7 +1613,7 @@
   }
 
  private:
-  explicit AliasIdentity(intptr_t value) : value_(value) { }
+  explicit AliasIdentity(intptr_t value) : value_(value) {}
 
   enum {
     kUnknown = 0,
@@ -1742,23 +1677,17 @@
   inline bool IsMintDefinition();
 
   bool IsInt32Definition() {
-    return IsBinaryInt32Op() ||
-           IsBoxInt32() ||
-           IsUnboxInt32() ||
+    return IsBinaryInt32Op() || IsBoxInt32() || IsUnboxInt32() ||
            IsUnboxedIntConverter();
   }
 
   // Compute compile type for this definition. It is safe to use this
   // approximation even before type propagator was run (e.g. during graph
   // building).
-  virtual CompileType ComputeType() const {
-    return CompileType::Dynamic();
-  }
+  virtual CompileType ComputeType() const { return CompileType::Dynamic(); }
 
   // Update CompileType of the definition. Returns true if the type has changed.
-  virtual bool RecomputeType() {
-    return false;
-  }
+  virtual bool RecomputeType() { return false; }
 
   PRINT_OPERANDS_TO_SUPPORT
   PRINT_TO_SUPPORT
@@ -1836,13 +1765,9 @@
     temp_index_ = reinterpret_cast<intptr_t>(other);
   }
 
-  virtual AliasIdentity Identity() const {
-    return AliasIdentity::Unknown();
-  }
+  virtual AliasIdentity Identity() const { return AliasIdentity::Unknown(); }
 
-  virtual void SetIdentity(AliasIdentity identity) {
-    UNREACHABLE();
-  }
+  virtual void SetIdentity(AliasIdentity identity) { UNREACHABLE(); }
 
   Definition* OriginalDefinition();
 
@@ -1884,8 +1809,7 @@
 
 class PureDefinition : public Definition {
  public:
-  explicit PureDefinition(intptr_t deopt_id)
-      : Definition(deopt_id) { }
+  explicit PureDefinition(intptr_t deopt_id) : Definition(deopt_id) {}
 
   virtual bool AllowsCSE() const { return true; }
   virtual EffectSet Dependencies() const { return EffectSet::None(); }
@@ -1894,13 +1818,13 @@
 };
 
 
-template<intptr_t N,
-         typename ThrowsTrait,
-         template<typename Impure, typename Pure> class CSETrait = NoCSE>
+template <intptr_t N,
+          typename ThrowsTrait,
+          template <typename Impure, typename Pure> class CSETrait = NoCSE>
 class TemplateDefinition : public CSETrait<Definition, PureDefinition>::Base {
  public:
   explicit TemplateDefinition(intptr_t deopt_id = Thread::kNoDeoptId)
-      : CSETrait<Definition, PureDefinition>::Base(deopt_id), inputs_() { }
+      : CSETrait<Definition, PureDefinition>::Base(deopt_id), inputs_() {}
 
   virtual intptr_t InputCount() const { return N; }
   virtual Value* InputAt(intptr_t i) const { return inputs_[i]; }
@@ -1914,9 +1838,7 @@
   friend class BranchInstr;
   friend class IfThenElseInstr;
 
-  virtual void RawSetInputAt(intptr_t i, Value* value) {
-    inputs_[i] = value;
-  }
+  virtual void RawSetInputAt(intptr_t i, Value* value) { inputs_[i] = value; }
 };
 
 
@@ -1933,13 +1855,13 @@
 class PhiInstr : public Definition {
  public:
   PhiInstr(JoinEntryInstr* block, intptr_t num_inputs)
-    : block_(block),
-      inputs_(num_inputs),
-      representation_(kTagged),
-      reaching_defs_(NULL),
-      loop_variable_info_(NULL),
-      is_alive_(false),
-      is_receiver_(kUnknownReceiver) {
+      : block_(block),
+        inputs_(num_inputs),
+        representation_(kTagged),
+        reaching_defs_(NULL),
+        loop_variable_info_(NULL),
+        is_alive_(false),
+        is_receiver_(kUnknownReceiver) {
     for (intptr_t i = 0; i < num_inputs; ++i) {
       inputs_.Add(NULL);
     }
@@ -1969,13 +1891,9 @@
     return representation_;
   }
 
-  virtual Representation representation() const {
-    return representation_;
-  }
+  virtual Representation representation() const { return representation_; }
 
-  virtual void set_representation(Representation r) {
-    representation_ = r;
-  }
+  virtual void set_representation(Representation r) { representation_ = r; }
 
   virtual intptr_t Hashcode() const {
     UNREACHABLE();
@@ -1986,9 +1904,7 @@
 
   virtual void InferRange(RangeAnalysis* analysis, Range* range);
 
-  BitVector* reaching_defs() const {
-    return reaching_defs_;
-  }
+  BitVector* reaching_defs() const { return reaching_defs_; }
 
   void set_reaching_defs(BitVector* reaching_defs) {
     reaching_defs_ = reaching_defs;
@@ -2009,19 +1925,13 @@
 
   PRINT_TO_SUPPORT
 
-  enum ReceiverType {
-    kUnknownReceiver = -1,
-    kNotReceiver = 0,
-    kReceiver = 1
-  };
+  enum ReceiverType { kUnknownReceiver = -1, kNotReceiver = 0, kReceiver = 1 };
 
   ReceiverType is_receiver() const {
     return static_cast<ReceiverType>(is_receiver_);
   }
 
-  void set_is_receiver(ReceiverType is_receiver) {
-    is_receiver_ = is_receiver;
-  }
+  void set_is_receiver(ReceiverType is_receiver) { is_receiver_ = is_receiver; }
 
  private:
   // Direct access to inputs_ in order to resize it due to unreachable
@@ -2047,7 +1957,7 @@
   ParameterInstr(intptr_t index,
                  BlockEntryInstr* block,
                  Register base_reg = FPREG)
-      : index_(index), base_reg_(base_reg), block_(block) { }
+      : index_(index), base_reg_(base_reg), block_(block) {}
 
   DECLARE_INSTRUCTION(Parameter)
 
@@ -2092,9 +2002,7 @@
 
 class PushArgumentInstr : public TemplateDefinition<1, NoThrow> {
  public:
-  explicit PushArgumentInstr(Value* value) {
-    SetInputAt(0, value);
-  }
+  explicit PushArgumentInstr(Value* value) { SetInputAt(0, value); }
 
   DECLARE_INSTRUCTION(PushArgument)
 
@@ -2156,8 +2064,7 @@
  public:
   explicit ThrowInstr(TokenPosition token_pos)
       : TemplateInstruction(Thread::Current()->GetNextDeoptId()),
-        token_pos_(token_pos) {
-  }
+        token_pos_(token_pos) {}
 
   DECLARE_INSTRUCTION(Throw)
 
@@ -2183,8 +2090,7 @@
   ReThrowInstr(TokenPosition token_pos, intptr_t catch_try_index)
       : TemplateInstruction(Thread::Current()->GetNextDeoptId()),
         token_pos_(token_pos),
-        catch_try_index_(catch_try_index) {
-  }
+        catch_try_index_(catch_try_index) {}
 
   DECLARE_INSTRUCTION(ReThrow)
 
@@ -2207,8 +2113,7 @@
 
 class StopInstr : public TemplateInstruction<0, NoThrow> {
  public:
-  explicit StopInstr(const char* message)
-      : message_(message) {
+  explicit StopInstr(const char* message) : message_(message) {
     ASSERT(message != NULL);
   }
 
@@ -2234,12 +2139,11 @@
 class GotoInstr : public TemplateInstruction<0, NoThrow> {
  public:
   explicit GotoInstr(JoinEntryInstr* entry)
-    : TemplateInstruction(Thread::Current()->GetNextDeoptId()),
-      block_(NULL),
-      successor_(entry),
-      edge_weight_(0.0),
-      parallel_move_(NULL) {
-  }
+      : TemplateInstruction(Thread::Current()->GetNextDeoptId()),
+        block_(NULL),
+        successor_(entry),
+        edge_weight_(0.0),
+        parallel_move_(NULL) {}
 
   DECLARE_INSTRUCTION(Goto)
 
@@ -2265,13 +2169,9 @@
 
   virtual EffectSet Effects() const { return EffectSet::None(); }
 
-  ParallelMoveInstr* parallel_move() const {
-    return parallel_move_;
-  }
+  ParallelMoveInstr* parallel_move() const { return parallel_move_; }
 
-  bool HasParallelMove() const {
-    return parallel_move_ != NULL;
-  }
+  bool HasParallelMove() const { return parallel_move_ != NULL; }
 
   bool HasNonRedundantParallelMove() const {
     return HasParallelMove() && !parallel_move()->IsRedundant();
@@ -2315,9 +2215,8 @@
 // to IndirectGoto as an input.
 class IndirectGotoInstr : public TemplateInstruction<1, NoThrow> {
  public:
-  IndirectGotoInstr(TypedData* offsets,
-                    Value* offset_from_start)
-    : offsets_(*offsets) {
+  IndirectGotoInstr(TypedData* offsets, Value* offset_from_start)
+      : offsets_(*offsets) {
     SetInputAt(0, offset_from_start);
   }
 
@@ -2374,17 +2273,13 @@
   virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler,
                                        BranchLabels labels) = 0;
 
-  void SetDeoptId(const Instruction& instr) {
-    CopyDeoptIdFrom(instr);
-  }
+  void SetDeoptId(const Instruction& instr) { CopyDeoptIdFrom(instr); }
 
   // Operation class id is computed from collected ICData.
   void set_operation_cid(intptr_t value) { operation_cid_ = value; }
   intptr_t operation_cid() const { return operation_cid_; }
 
-  virtual void NegateComparison() {
-    kind_ = Token::NegateComparison(kind_);
-  }
+  virtual void NegateComparison() { kind_ = Token::NegateComparison(kind_); }
 
   virtual bool CanBecomeDeoptimizationTarget() const { return true; }
   virtual intptr_t DeoptimizationTarget() const { return GetDeoptId(); }
@@ -2392,7 +2287,7 @@
   virtual bool AttributesEqual(Instruction* other) const {
     ComparisonInstr* other_comparison = other->AsComparison();
     return kind() == other_comparison->kind() &&
-        (operation_cid() == other_comparison->operation_cid());
+           (operation_cid() == other_comparison->operation_cid());
   }
 
   DEFINE_INSTRUCTION_TYPE_CHECK(Comparison)
@@ -2404,8 +2299,7 @@
       : Definition(deopt_id),
         token_pos_(token_pos),
         kind_(kind),
-        operation_cid_(kIllegalCid) {
-  }
+        operation_cid_(kIllegalCid) {}
 
  private:
   const TokenPosition token_pos_;
@@ -2425,22 +2319,23 @@
 
  protected:
   PureComparison(TokenPosition token_pos, Token::Kind kind, intptr_t deopt_id)
-      : ComparisonInstr(token_pos, kind, deopt_id) { }
+      : ComparisonInstr(token_pos, kind, deopt_id) {}
 };
 
 
-template<intptr_t N,
-         typename ThrowsTrait,
-         template<typename Impure, typename Pure> class CSETrait = NoCSE>
-class TemplateComparison : public CSETrait<
-    ComparisonInstr, PureComparison>::Base {
+template <intptr_t N,
+          typename ThrowsTrait,
+          template <typename Impure, typename Pure> class CSETrait = NoCSE>
+class TemplateComparison
+    : public CSETrait<ComparisonInstr, PureComparison>::Base {
  public:
   TemplateComparison(TokenPosition token_pos,
                      Token::Kind kind,
                      intptr_t deopt_id = Thread::kNoDeoptId)
-      : CSETrait<ComparisonInstr, PureComparison>::Base(
-            token_pos, kind, deopt_id),
-        inputs_() { }
+      : CSETrait<ComparisonInstr, PureComparison>::Base(token_pos,
+                                                        kind,
+                                                        deopt_id),
+        inputs_() {}
 
   virtual intptr_t InputCount() const { return N; }
   virtual Value* InputAt(intptr_t i) const { return inputs_[i]; }
@@ -2451,9 +2346,7 @@
   EmbeddedArray<Value*, N> inputs_;
 
  private:
-  virtual void RawSetInputAt(intptr_t i, Value* value) {
-    inputs_[i] = value;
-  }
+  virtual void RawSetInputAt(intptr_t i, Value* value) { inputs_[i] = value; }
 };
 
 
@@ -2493,9 +2386,7 @@
     return comparison()->CanBecomeDeoptimizationTarget();
   }
 
-  virtual EffectSet Effects() const {
-    return comparison()->Effects();
-  }
+  virtual EffectSet Effects() const { return comparison()->Effects(); }
 
   ComparisonInstr* comparison() const { return comparison_; }
   void SetComparison(ComparisonInstr* comp);
@@ -2521,23 +2412,17 @@
   }
 
   // Return compile type constrained by the comparison of this branch.
-  ConstrainedCompileType* constrained_type() const {
-    return constrained_type_;
-  }
+  ConstrainedCompileType* constrained_type() const { return constrained_type_; }
 
   void set_constant_target(TargetEntryInstr* target) {
     ASSERT(target == true_successor() || target == false_successor());
     constant_target_ = target;
   }
-  TargetEntryInstr* constant_target() const {
-    return constant_target_;
-  }
+  TargetEntryInstr* constant_target() const { return constant_target_; }
 
   virtual void InheritDeoptTarget(Zone* zone, Instruction* other);
 
-  virtual bool MayThrow() const {
-    return comparison()->MayThrow();
-  }
+  virtual bool MayThrow() const { return comparison()->MayThrow(); }
 
   TargetEntryInstr* true_successor() const { return true_successor_; }
   TargetEntryInstr* false_successor() const { return false_successor_; }
@@ -2569,15 +2454,11 @@
 class DeoptimizeInstr : public TemplateInstruction<0, NoThrow, Pure> {
  public:
   DeoptimizeInstr(ICData::DeoptReasonId deopt_reason, intptr_t deopt_id)
-      : TemplateInstruction(deopt_id),
-        deopt_reason_(deopt_reason) {
-  }
+      : TemplateInstruction(deopt_id), deopt_reason_(deopt_reason) {}
 
   virtual bool CanDeoptimize() const { return true; }
 
-  virtual bool AttributesEqual(Instruction* other) const {
-    return true;
-  }
+  virtual bool AttributesEqual(Instruction* other) const { return true; }
 
   DECLARE_INSTRUCTION(Deoptimize)
 
@@ -2590,9 +2471,7 @@
 
 class RedefinitionInstr : public TemplateDefinition<1, NoThrow> {
  public:
-  explicit RedefinitionInstr(Value* value) {
-    SetInputAt(0, value);
-  }
+  explicit RedefinitionInstr(Value* value) { SetInputAt(0, value); }
 
   DECLARE_INSTRUCTION(Redefinition)
 
@@ -2613,8 +2492,7 @@
 class ConstraintInstr : public TemplateDefinition<1, NoThrow> {
  public:
   ConstraintInstr(Value* value, Range* constraint)
-      : constraint_(constraint),
-        target_(NULL) {
+      : constraint_(constraint), target_(NULL) {
     SetInputAt(0, value);
   }
 
@@ -2639,12 +2517,8 @@
   // Constraints for branches have their target block stored in order
   // to find the comparison that generated the constraint:
   // target->predecessor->last_instruction->comparison.
-  void set_target(TargetEntryInstr* target) {
-    target_ = target;
-  }
-  TargetEntryInstr* target() const {
-    return target_;
-  }
+  void set_target(TargetEntryInstr* target) { target_ = target; }
+  TargetEntryInstr* target() const { return target_; }
 
   PRINT_OPERANDS_TO_SUPPORT
 
@@ -2694,9 +2568,7 @@
   explicit UnboxedConstantInstr(const Object& value,
                                 Representation representation);
 
-  virtual Representation representation() const {
-    return representation_;
-  }
+  virtual Representation representation() const { return representation_; }
 
   // Either NULL or the address of the unboxed constant.
   uword constant_address() const { return constant_address_; }
@@ -2802,8 +2674,7 @@
 class CurrentContextInstr : public TemplateDefinition<0, NoThrow> {
  public:
   CurrentContextInstr()
-      : TemplateDefinition(Thread::Current()->GetNextDeoptId()) {
-  }
+      : TemplateDefinition(Thread::Current()->GetNextDeoptId()) {}
 
   DECLARE_INSTRUCTION(CurrentContext)
   virtual CompileType ComputeType() const;
@@ -2898,18 +2769,14 @@
            Token::IsUnaryOperator(token_kind) ||
            Token::IsIndexOperator(token_kind) ||
            Token::IsTypeTestOperator(token_kind) ||
-           Token::IsTypeCastOperator(token_kind) ||
-           token_kind == Token::kGET ||
-           token_kind == Token::kSET ||
-           token_kind == Token::kILLEGAL);
+           Token::IsTypeCastOperator(token_kind) || token_kind == Token::kGET ||
+           token_kind == Token::kSET || token_kind == Token::kILLEGAL);
   }
 
   DECLARE_INSTRUCTION(InstanceCall)
 
   const ICData* ic_data() const { return ic_data_; }
-  bool HasICData() const {
-    return (ic_data() != NULL) && !ic_data()->IsNull();
-  }
+  bool HasICData() const { return (ic_data() != NULL) && !ic_data()->IsNull(); }
 
   // ICData can be replaced by optimizer.
   void set_ic_data(const ICData* value) { ic_data_ = value; }
@@ -2925,9 +2792,7 @@
   intptr_t checked_argument_count() const { return checked_argument_count_; }
 
   bool has_unique_selector() const { return has_unique_selector_; }
-  void set_has_unique_selector(bool b) {
-    has_unique_selector_ = b;
-  }
+  void set_has_unique_selector(bool b) { has_unique_selector_ = b; }
 
   virtual bool CanDeoptimize() const { return true; }
 
@@ -3037,8 +2902,7 @@
 
   virtual Definition* Canonicalize(FlowGraph* flow_graph);
 
-  virtual void EmitBranchCode(FlowGraphCompiler* compiler,
-                              BranchInstr* branch);
+  virtual void EmitBranchCode(FlowGraphCompiler* compiler, BranchInstr* branch);
 
   virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler,
                                        BranchLabels labels);
@@ -3085,8 +2949,7 @@
     return kTagged;
   }
 
-  virtual void EmitBranchCode(FlowGraphCompiler* compiler,
-                              BranchInstr* branch);
+  virtual void EmitBranchCode(FlowGraphCompiler* compiler, BranchInstr* branch);
 
   virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler,
                                        BranchLabels labels);
@@ -3135,8 +2998,7 @@
 
   virtual bool AttributesEqual(Instruction* other) const;
 
-  virtual void EmitBranchCode(FlowGraphCompiler* compiler,
-                              BranchInstr* branch);
+  virtual void EmitBranchCode(FlowGraphCompiler* compiler, BranchInstr* branch);
 
   virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler,
                                        BranchLabels labels);
@@ -3175,8 +3037,7 @@
 
   virtual bool CanDeoptimize() const { return false; }
 
-  virtual void EmitBranchCode(FlowGraphCompiler* compiler,
-                              BranchInstr* branch);
+  virtual void EmitBranchCode(FlowGraphCompiler* compiler, BranchInstr* branch);
 
   virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler,
                                        BranchLabels labels);
@@ -3218,8 +3079,7 @@
 
   virtual bool CanDeoptimize() const { return false; }
 
-  virtual void EmitBranchCode(FlowGraphCompiler* compiler,
-                              BranchInstr* branch);
+  virtual void EmitBranchCode(FlowGraphCompiler* compiler, BranchInstr* branch);
 
   virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler,
                                        BranchLabels labels);
@@ -3242,9 +3102,7 @@
 // materialization of true and false constants.
 class IfThenElseInstr : public Definition {
  public:
-  IfThenElseInstr(ComparisonInstr* comparison,
-                  Value* if_true,
-                  Value* if_false)
+  IfThenElseInstr(ComparisonInstr* comparison, Value* if_true, Value* if_false)
       : Definition(Thread::Current()->GetNextDeoptId()),
         comparison_(comparison),
         if_true_(Smi::Cast(if_true->BoundConstant()).Value()),
@@ -3266,9 +3124,7 @@
 
   Value* InputAt(intptr_t i) const { return comparison()->InputAt(i); }
 
-  virtual bool CanDeoptimize() const {
-    return comparison()->CanDeoptimize();
-  }
+  virtual bool CanDeoptimize() const { return comparison()->CanDeoptimize(); }
 
   virtual bool CanBecomeDeoptimizationTarget() const {
     return comparison()->CanBecomeDeoptimizationTarget();
@@ -3339,7 +3195,7 @@
     ic_data_ = GetICData(ic_data_array);
     ASSERT(function.IsZoneHandle());
     ASSERT(!function.IsNull());
-    ASSERT(argument_names.IsZoneHandle() ||  argument_names.InVMHeap());
+    ASSERT(argument_names.IsZoneHandle() || argument_names.InVMHeap());
   }
 
   StaticCallInstr(TokenPosition token_pos,
@@ -3358,14 +3214,12 @@
         identity_(AliasIdentity::Unknown()) {
     ASSERT(function.IsZoneHandle());
     ASSERT(!function.IsNull());
-    ASSERT(argument_names.IsZoneHandle() ||  argument_names.InVMHeap());
+    ASSERT(argument_names.IsZoneHandle() || argument_names.InVMHeap());
   }
 
   // ICData for static calls carries call count.
   const ICData* ic_data() const { return ic_data_; }
-  bool HasICData() const {
-    return (ic_data() != NULL) && !ic_data()->IsNull();
-  }
+  bool HasICData() const { return (ic_data() != NULL) && !ic_data()->IsNull(); }
 
   DECLARE_INSTRUCTION(StaticCall)
   virtual CompileType ComputeType() const;
@@ -3402,9 +3256,7 @@
     is_known_list_constructor_ = value;
   }
 
-  bool IsRecognizedFactory() const {
-    return is_known_list_constructor();
-  }
+  bool IsRecognizedFactory() const { return is_known_list_constructor(); }
 
   virtual AliasIdentity Identity() const { return identity_; }
   virtual void SetIdentity(AliasIdentity identity) { identity_ = identity; }
@@ -3430,9 +3282,8 @@
 
 class LoadLocalInstr : public TemplateDefinition<0, NoThrow> {
  public:
-  LoadLocalInstr(const LocalVariable& local,
-                 TokenPosition token_pos)
-      : local_(local), is_last_(false), token_pos_(token_pos) { }
+  LoadLocalInstr(const LocalVariable& local, TokenPosition token_pos)
+      : local_(local), is_last_(false), token_pos_(token_pos) {}
 
   DECLARE_INSTRUCTION(LoadLocal)
   virtual CompileType ComputeType() const;
@@ -3497,16 +3348,12 @@
     return false;
   }
 
-  virtual TokenPosition token_pos() const {
-    return TokenPosition::kTempMove;
-  }
+  virtual TokenPosition token_pos() const { return TokenPosition::kTempMove; }
 
   PRINT_OPERANDS_TO_SUPPORT
 
  private:
-  virtual void RawSetInputAt(intptr_t i, Value* value) {
-    value_ = value;
-  }
+  virtual void RawSetInputAt(intptr_t i, Value* value) { value_ = value; }
 
   const intptr_t num_temps_;
   Value* value_;
@@ -3565,7 +3412,7 @@
         native_c_function_(NULL),
         is_bootstrap_native_(false),
         link_lazily_(node->link_lazily()),
-        token_pos_(node->token_pos()) { }
+        token_pos_(node->token_pos()) {}
 
   NativeCallInstr(const String* name,
                   const Function* function,
@@ -3576,7 +3423,7 @@
         native_c_function_(NULL),
         is_bootstrap_native_(false),
         link_lazily_(link_lazily),
-        token_pos_(position) { }
+        token_pos_(position) {}
 
   DECLARE_INSTRUCTION(NativeCall)
 
@@ -3615,11 +3462,8 @@
 
 class DebugStepCheckInstr : public TemplateInstruction<0, NoThrow> {
  public:
-  DebugStepCheckInstr(TokenPosition token_pos,
-                      RawPcDescriptors::Kind stub_kind)
-      : token_pos_(token_pos),
-        stub_kind_(stub_kind) {
-  }
+  DebugStepCheckInstr(TokenPosition token_pos, RawPcDescriptors::Kind stub_kind)
+      : token_pos_(token_pos), stub_kind_(stub_kind) {}
 
   DECLARE_INSTRUCTION(DebugStepCheck)
 
@@ -3636,10 +3480,7 @@
 };
 
 
-enum StoreBarrierType {
-  kNoStoreBarrier,
-  kEmitStoreBarrier
-};
+enum StoreBarrierType { kNoStoreBarrier, kEmitStoreBarrier };
 
 
 class StoreInstanceFieldInstr : public TemplateDefinition<2, NoThrow> {
@@ -3677,10 +3518,7 @@
 
   void set_is_initialization(bool value) { is_initialization_ = value; }
 
-  enum {
-    kInstancePos = 0,
-    kValuePos = 1
-  };
+  enum { kInstancePos = 0, kValuePos = 1 };
 
   Value* instance() const { return inputs_[kInstancePos]; }
   Value* value() const { return inputs_[kValuePos]; }
@@ -3692,16 +3530,14 @@
   intptr_t offset_in_bytes() const { return offset_in_bytes_; }
 
   bool ShouldEmitStoreBarrier() const {
-    return value()->NeedsStoreBuffer()
-        && (emit_store_barrier_ == kEmitStoreBarrier);
+    return value()->NeedsStoreBuffer() &&
+           (emit_store_barrier_ == kEmitStoreBarrier);
   }
 
   virtual bool CanDeoptimize() const { return false; }
 
   // May require a deoptimization target for input conversions.
-  virtual intptr_t DeoptimizationTarget() const {
-    return GetDeoptId();
-  }
+  virtual intptr_t DeoptimizationTarget() const { return GetDeoptId(); }
 
   // Currently CSE/LICM don't operate on any instructions that can be affected
   // by stores/loads. LoadOptimizer handles loads separately. Hence stores
@@ -3739,11 +3575,8 @@
 
 class GuardFieldInstr : public TemplateInstruction<1, NoThrow, Pure> {
  public:
-  GuardFieldInstr(Value* value,
-                  const Field& field,
-                  intptr_t deopt_id)
-    : TemplateInstruction(deopt_id),
-      field_(field) {
+  GuardFieldInstr(Value* value, const Field& field, intptr_t deopt_id)
+      : TemplateInstruction(deopt_id), field_(field) {
     SetInputAt(0, value);
     CheckField(field);
   }
@@ -3769,9 +3602,7 @@
 
 class GuardFieldClassInstr : public GuardFieldInstr {
  public:
-  GuardFieldClassInstr(Value* value,
-                       const Field& field,
-                       intptr_t deopt_id)
+  GuardFieldClassInstr(Value* value, const Field& field, intptr_t deopt_id)
       : GuardFieldInstr(value, field, deopt_id) {
     CheckField(field);
   }
@@ -3789,9 +3620,7 @@
 
 class GuardFieldLengthInstr : public GuardFieldInstr {
  public:
-  GuardFieldLengthInstr(Value* value,
-                       const Field& field,
-                       intptr_t deopt_id)
+  GuardFieldLengthInstr(Value* value, const Field& field, intptr_t deopt_id)
       : GuardFieldInstr(value, field, deopt_id) {
     CheckField(field);
   }
@@ -3845,16 +3674,13 @@
   StoreStaticFieldInstr(const Field& field,
                         Value* value,
                         TokenPosition token_pos)
-      : field_(field),
-        token_pos_(token_pos) {
+      : field_(field), token_pos_(token_pos) {
     ASSERT(field.IsZoneHandle());
     SetInputAt(kValuePos, value);
     CheckField(field);
   }
 
-  enum {
-    kValuePos = 0
-  };
+  enum { kValuePos = 0 };
 
   DECLARE_INSTRUCTION(StoreStaticField)
 
@@ -4026,9 +3852,7 @@
 
   virtual bool CanDeoptimize() const { return false; }
 
-  virtual bool AttributesEqual(Instruction* other) const {
-    return true;
-  }
+  virtual bool AttributesEqual(Instruction* other) const { return true; }
 
  private:
   DISALLOW_COPY_AND_ASSIGN(OneByteStringFromCharCodeInstr);
@@ -4104,11 +3928,7 @@
                     TokenPosition token_pos);
   DECLARE_INSTRUCTION(StoreIndexed)
 
-  enum {
-    kArrayPos = 0,
-    kIndexPos = 1,
-    kValuePos = 2
-  };
+  enum { kArrayPos = 0, kIndexPos = 1, kValuePos = 2 };
 
   Value* array() const { return inputs_[kArrayPos]; }
   Value* index() const { return inputs_[kIndexPos]; }
@@ -4119,8 +3939,8 @@
   bool aligned() const { return alignment_ == kAlignedAccess; }
 
   bool ShouldEmitStoreBarrier() const {
-    return value()->NeedsStoreBuffer()
-        && (emit_store_barrier_ == kEmitStoreBarrier);
+    return value()->NeedsStoreBuffer() &&
+           (emit_store_barrier_ == kEmitStoreBarrier);
   }
 
   virtual bool CanDeoptimize() const { return false; }
@@ -4153,9 +3973,7 @@
 // Note overrideable, built-in: value ? false : true.
 class BooleanNegateInstr : public TemplateDefinition<1, NoThrow> {
  public:
-  explicit BooleanNegateInstr(Value* value) {
-    SetInputAt(0, value);
-  }
+  explicit BooleanNegateInstr(Value* value) { SetInputAt(0, value); }
 
   DECLARE_INSTRUCTION(BooleanNegate)
   virtual CompileType ComputeType() const;
@@ -4344,29 +4162,20 @@
   Definition* allocation() const { return allocation_; }
   const Class& cls() const { return cls_; }
 
-  intptr_t num_variables() const {
-    return num_variables_;
-  }
+  intptr_t num_variables() const { return num_variables_; }
 
   intptr_t FieldOffsetAt(intptr_t i) const {
-    return slots_[i]->IsField()
-        ? Field::Cast(*slots_[i]).Offset()
-        : Smi::Cast(*slots_[i]).Value();
+    return slots_[i]->IsField() ? Field::Cast(*slots_[i]).Offset()
+                                : Smi::Cast(*slots_[i]).Value();
   }
 
-  const Location& LocationAt(intptr_t i) {
-    return locations_[i];
-  }
+  const Location& LocationAt(intptr_t i) { return locations_[i]; }
 
   DECLARE_INSTRUCTION(MaterializeObject)
 
-  virtual intptr_t InputCount() const {
-    return values_->length();
-  }
+  virtual intptr_t InputCount() const { return values_->length(); }
 
-  virtual Value* InputAt(intptr_t i) const {
-    return (*values_)[i];
-  }
+  virtual Value* InputAt(intptr_t i) const { return (*values_)[i]; }
 
   // SelectRepresentations pass is run once more while MaterializeObject
   // instructions are still in the graph. To avoid any redundant boxing
@@ -4386,13 +4195,10 @@
 
   virtual bool MayThrow() const { return false; }
 
-  void RemapRegisters(intptr_t* cpu_reg_slots,
-                      intptr_t* fpu_reg_slots);
+  void RemapRegisters(intptr_t* cpu_reg_slots, intptr_t* fpu_reg_slots);
 
   bool was_visited_for_liveness() const { return visited_for_liveness_; }
-  void mark_visited_for_liveness() {
-    visited_for_liveness_ = true;
-  }
+  void mark_visited_for_liveness() { visited_for_liveness_ = true; }
 
   PRINT_OPERANDS_TO_SUPPORT
 
@@ -4422,15 +4228,12 @@
                    Value* num_elements)
       : TemplateDefinition(Thread::Current()->GetNextDeoptId()),
         token_pos_(token_pos),
-        identity_(AliasIdentity::Unknown())  {
+        identity_(AliasIdentity::Unknown()) {
     SetInputAt(kElementTypePos, element_type);
     SetInputAt(kLengthPos, num_elements);
   }
 
-  enum {
-    kElementTypePos = 0,
-    kLengthPos = 1
-  };
+  enum { kElementTypePos = 0, kLengthPos = 1 };
 
   DECLARE_INSTRUCTION(CreateArray)
   virtual CompileType ComputeType() const;
@@ -4467,9 +4270,7 @@
     SetInputAt(0, object);
   }
 
-  virtual Representation representation() const {
-    return kUntagged;
-  }
+  virtual Representation representation() const { return kUntagged; }
   DECLARE_INSTRUCTION(LoadUntagged)
   virtual CompileType ComputeType() const;
 
@@ -4496,13 +4297,9 @@
 
 class LoadClassIdInstr : public TemplateDefinition<1, NoThrow> {
  public:
-  explicit LoadClassIdInstr(Value* object) {
-    SetInputAt(0, object);
-  }
+  explicit LoadClassIdInstr(Value* object) { SetInputAt(0, object); }
 
-  virtual Representation representation() const {
-    return kTagged;
-  }
+  virtual Representation representation() const { return kTagged; }
   DECLARE_INSTRUCTION(LoadClassId)
   virtual CompileType ComputeType() const;
 
@@ -4579,9 +4376,7 @@
     recognized_kind_ = kind;
   }
 
-  MethodRecognizer::Kind recognized_kind() const {
-    return recognized_kind_;
-  }
+  MethodRecognizer::Kind recognized_kind() const { return recognized_kind_; }
 
   DECLARE_INSTRUCTION(LoadField)
   virtual CompileType ComputeType() const;
@@ -4636,8 +4431,7 @@
   DECLARE_INSTRUCTION(InstantiateType)
 
   Value* instantiator() const { return inputs_[0]; }
-  const AbstractType& type() const { return type_;
-  }
+  const AbstractType& type() const { return type_; }
   const Class& instantiator_class() const { return instantiator_class_; }
   virtual TokenPosition token_pos() const { return token_pos_; }
 
@@ -4673,9 +4467,7 @@
   DECLARE_INSTRUCTION(InstantiateTypeArguments)
 
   Value* instantiator() const { return inputs_[0]; }
-  const TypeArguments& type_arguments() const {
-    return type_arguments_;
-  }
+  const TypeArguments& type_arguments() const { return type_arguments_; }
   const Class& instantiator_class() const { return instantiator_class_; }
   virtual TokenPosition token_pos() const { return token_pos_; }
 
@@ -4698,10 +4490,8 @@
 
 class AllocateContextInstr : public TemplateDefinition<0, NoThrow> {
  public:
-  AllocateContextInstr(TokenPosition token_pos,
-                       intptr_t num_context_variables)
-      : token_pos_(token_pos),
-        num_context_variables_(num_context_variables) { }
+  AllocateContextInstr(TokenPosition token_pos, intptr_t num_context_variables)
+      : token_pos_(token_pos), num_context_variables_(num_context_variables) {}
 
   DECLARE_INSTRUCTION(AllocateContext)
   virtual CompileType ComputeType() const;
@@ -4732,9 +4522,7 @@
     CheckField(field);
   }
 
-  virtual TokenPosition token_pos() const {
-    return field_.token_pos();
-  }
+  virtual TokenPosition token_pos() const { return field_.token_pos(); }
   const Field& field() const { return field_; }
 
   DECLARE_INSTRUCTION(InitStaticField)
@@ -4874,9 +4662,7 @@
   virtual CompileType ComputeType() const;
 
   virtual bool CanDeoptimize() const { return false; }
-  virtual intptr_t DeoptimizationTarget() const {
-    return Thread::kNoDeoptId;
-  }
+  virtual intptr_t DeoptimizationTarget() const { return Thread::kNoDeoptId; }
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT(idx == 0);
@@ -4889,9 +4675,7 @@
 
   Definition* Canonicalize(FlowGraph* flow_graph);
 
-  virtual TokenPosition token_pos() const {
-    return TokenPosition::kBox;
-  }
+  virtual TokenPosition token_pos() const { return TokenPosition::kBox; }
 
  protected:
   BoxInstr(Representation from_representation, Value* value)
@@ -4913,7 +4697,7 @@
 class BoxIntegerInstr : public BoxInstr {
  public:
   BoxIntegerInstr(Representation representation, Value* value)
-      : BoxInstr(representation, value) { }
+      : BoxInstr(representation, value) {}
 
   virtual bool ValueFitsSmi() const;
 
@@ -4934,7 +4718,7 @@
 class BoxInteger32Instr : public BoxIntegerInstr {
  public:
   BoxInteger32Instr(Representation representation, Value* value)
-      : BoxIntegerInstr(representation, value) { }
+      : BoxIntegerInstr(representation, value) {}
 
   DECLARE_INSTRUCTION_BACKEND()
 
@@ -4946,7 +4730,7 @@
 class BoxInt32Instr : public BoxInteger32Instr {
  public:
   explicit BoxInt32Instr(Value* value)
-      : BoxInteger32Instr(kUnboxedInt32, value) { }
+      : BoxInteger32Instr(kUnboxedInt32, value) {}
 
   DECLARE_INSTRUCTION_NO_BACKEND(BoxInt32)
 
@@ -4958,7 +4742,7 @@
 class BoxUint32Instr : public BoxInteger32Instr {
  public:
   explicit BoxUint32Instr(Value* value)
-      : BoxInteger32Instr(kUnboxedUint32, value) { }
+      : BoxInteger32Instr(kUnboxedUint32, value) {}
 
   DECLARE_INSTRUCTION_NO_BACKEND(BoxUint32)
 
@@ -4969,8 +4753,7 @@
 
 class BoxInt64Instr : public BoxIntegerInstr {
  public:
-  explicit BoxInt64Instr(Value* value)
-      : BoxIntegerInstr(kUnboxedMint, value) { }
+  explicit BoxInt64Instr(Value* value) : BoxIntegerInstr(kUnboxedMint, value) {}
 
   virtual Definition* Canonicalize(FlowGraph* flow_graph);
 
@@ -4990,17 +4773,14 @@
   virtual bool CanDeoptimize() const {
     const intptr_t value_cid = value()->Type()->ToCid();
 
-    if (CanConvertSmi() &&
-        (value()->Type()->ToCid() == kSmiCid)) {
+    if (CanConvertSmi() && (value()->Type()->ToCid() == kSmiCid)) {
       return false;
     }
 
     return (value_cid != BoxCid());
   }
 
-  virtual Representation representation() const {
-    return representation_;
-  }
+  virtual Representation representation() const { return representation_; }
 
   DECLARE_INSTRUCTION(Unbox)
   virtual CompileType ComputeType() const;
@@ -5011,20 +4791,13 @@
 
   Definition* Canonicalize(FlowGraph* flow_graph);
 
-  virtual intptr_t DeoptimizationTarget() const {
-    return GetDeoptId();
-  }
+  virtual intptr_t DeoptimizationTarget() const { return GetDeoptId(); }
 
-  virtual TokenPosition token_pos() const {
-    return TokenPosition::kBox;
-  }
+  virtual TokenPosition token_pos() const { return TokenPosition::kBox; }
 
  protected:
-  UnboxInstr(Representation representation,
-             Value* value,
-             intptr_t deopt_id)
-      : TemplateDefinition(deopt_id),
-        representation_(representation) {
+  UnboxInstr(Representation representation, Value* value, intptr_t deopt_id)
+      : TemplateDefinition(deopt_id), representation_(representation) {
     SetInputAt(0, value);
   }
 
@@ -5033,13 +4806,9 @@
   void EmitLoadFromBox(FlowGraphCompiler* compiler);
   void EmitSmiConversion(FlowGraphCompiler* compiler);
 
-  intptr_t BoxCid() const {
-    return Boxing::BoxCid(representation_);
-  }
+  intptr_t BoxCid() const { return Boxing::BoxCid(representation_); }
 
-  intptr_t ValueOffset() const {
-    return Boxing::ValueOffset(representation_);
-  }
+  intptr_t ValueOffset() const { return Boxing::ValueOffset(representation_); }
 
   const Representation representation_;
 
@@ -5056,8 +4825,7 @@
                     Value* value,
                     intptr_t deopt_id)
       : UnboxInstr(representation, value, deopt_id),
-        is_truncating_(truncation_mode == kTruncate) {
-  }
+        is_truncating_(truncation_mode == kTruncate) {}
 
   bool is_truncating() const { return is_truncating_; }
 
@@ -5066,7 +4834,7 @@
   virtual bool AttributesEqual(Instruction* other) const {
     UnboxIntegerInstr* other_unbox = other->AsUnboxInteger();
     return UnboxInstr::AttributesEqual(other) &&
-        (other_unbox->is_truncating_ == is_truncating_);
+           (other_unbox->is_truncating_ == is_truncating_);
   }
 
   virtual Definition* Canonicalize(FlowGraph* flow_graph);
@@ -5088,7 +4856,7 @@
                       TruncationMode truncation_mode,
                       Value* value,
                       intptr_t deopt_id)
-      : UnboxIntegerInstr(representation, truncation_mode, value, deopt_id) { }
+      : UnboxIntegerInstr(representation, truncation_mode, value, deopt_id) {}
 
   DECLARE_INSTRUCTION_BACKEND()
 
@@ -5120,8 +4888,7 @@
   UnboxInt32Instr(TruncationMode truncation_mode,
                   Value* value,
                   intptr_t deopt_id)
-      : UnboxInteger32Instr(kUnboxedInt32, truncation_mode, value, deopt_id) {
-  }
+      : UnboxInteger32Instr(kUnboxedInt32, truncation_mode, value, deopt_id) {}
 
   virtual bool CanDeoptimize() const;
 
@@ -5139,8 +4906,7 @@
 class UnboxInt64Instr : public UnboxIntegerInstr {
  public:
   UnboxInt64Instr(Value* value, intptr_t deopt_id)
-      : UnboxIntegerInstr(kUnboxedMint, kNoTruncation, value, deopt_id) {
-  }
+      : UnboxIntegerInstr(kUnboxedMint, kNoTruncation, value, deopt_id) {}
 
   virtual void InferRange(RangeAnalysis* analysis, Range* range);
 
@@ -5152,12 +4918,8 @@
 
 
 bool Definition::IsMintDefinition() {
-  return (Type()->ToCid() == kMintCid) ||
-          IsBinaryMintOp() ||
-          IsUnaryMintOp() ||
-          IsShiftMintOp() ||
-          IsBoxInt64() ||
-          IsUnboxInt64();
+  return (Type()->ToCid() == kMintCid) || IsBinaryMintOp() || IsUnaryMintOp() ||
+         IsShiftMintOp() || IsBoxInt64() || IsUnboxInt64();
 }
 
 
@@ -5178,9 +4940,7 @@
 
   virtual bool CanDeoptimize() const { return false; }
 
-  virtual Representation representation() const {
-    return kUnboxedDouble;
-  }
+  virtual Representation representation() const { return kUnboxedDouble; }
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT(idx == 0);
@@ -5222,13 +4982,12 @@
 class CaseInsensitiveCompareUC16Instr
     : public TemplateDefinition<4, NoThrow, Pure> {
  public:
-  CaseInsensitiveCompareUC16Instr(
-      Value* str,
-      Value* lhs_index,
-      Value* rhs_index,
-      Value* length,
-      intptr_t cid)
-    : cid_(cid) {
+  CaseInsensitiveCompareUC16Instr(Value* str,
+                                  Value* lhs_index,
+                                  Value* rhs_index,
+                                  Value* length,
+                                  intptr_t cid)
+      : cid_(cid) {
     ASSERT(cid == kTwoByteStringCid || cid == kExternalTwoByteStringCid);
     ASSERT(index_scale() == 2);
     SetInputAt(0, str);
@@ -5249,9 +5008,7 @@
 
   virtual bool CanDeoptimize() const { return false; }
 
-  virtual Representation representation() const {
-    return kTagged;
-  }
+  virtual Representation representation() const { return kTagged; }
 
   DECLARE_INSTRUCTION(CaseInsensitiveCompareUC16)
   virtual CompileType ComputeType() const;
@@ -5333,9 +5090,7 @@
                       Value* right,
                       intptr_t deopt_id,
                       TokenPosition token_pos)
-      : TemplateDefinition(deopt_id),
-        op_kind_(op_kind),
-        token_pos_(token_pos) {
+      : TemplateDefinition(deopt_id), op_kind_(op_kind), token_pos_(token_pos) {
     SetInputAt(0, left);
     SetInputAt(1, right);
   }
@@ -5349,9 +5104,7 @@
 
   virtual bool CanDeoptimize() const { return false; }
 
-  virtual Representation representation() const {
-    return kUnboxedDouble;
-  }
+  virtual Representation representation() const { return kUnboxedDouble; }
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT((idx == 0) || (idx == 1));
@@ -5389,8 +5142,7 @@
                     Value* value,
                     intptr_t deopt_id,
                     TokenPosition token_pos)
-      : TemplateComparison(token_pos, Token::kEQ, deopt_id),
-        op_kind_(op_kind) {
+      : TemplateComparison(token_pos, Token::kEQ, deopt_id), op_kind_(op_kind) {
     SetInputAt(0, value);
   }
 
@@ -5413,14 +5165,13 @@
   virtual Definition* Canonicalize(FlowGraph* flow_graph);
 
   virtual bool AttributesEqual(Instruction* other) const {
-    return op_kind_ == other->AsDoubleTestOp()->op_kind()
-        && ComparisonInstr::AttributesEqual(other);
+    return op_kind_ == other->AsDoubleTestOp()->op_kind() &&
+           ComparisonInstr::AttributesEqual(other);
   }
 
   virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right);
 
-  virtual void EmitBranchCode(FlowGraphCompiler* compiler,
-                              BranchInstr* branch);
+  virtual void EmitBranchCode(FlowGraphCompiler* compiler, BranchInstr* branch);
 
   virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler,
                                        BranchLabels labels);
@@ -5450,9 +5201,7 @@
 
   virtual bool CanDeoptimize() const { return false; }
 
-  virtual Representation representation() const {
-    return kUnboxedFloat32x4;
-  }
+  virtual Representation representation() const { return kUnboxedFloat32x4; }
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT((idx == 0) || (idx == 1));
@@ -5483,7 +5232,8 @@
 
 class Simd32x4ShuffleInstr : public TemplateDefinition<1, NoThrow, Pure> {
  public:
-  Simd32x4ShuffleInstr(MethodRecognizer::Kind op_kind, Value* value,
+  Simd32x4ShuffleInstr(MethodRecognizer::Kind op_kind,
+                       Value* value,
                        intptr_t mask,
                        intptr_t deopt_id)
       : TemplateDefinition(deopt_id), op_kind_(op_kind), mask_(mask) {
@@ -5551,8 +5301,11 @@
 
 class Simd32x4ShuffleMixInstr : public TemplateDefinition<2, NoThrow, Pure> {
  public:
-  Simd32x4ShuffleMixInstr(MethodRecognizer::Kind op_kind, Value* xy,
-                           Value* zw, intptr_t mask, intptr_t deopt_id)
+  Simd32x4ShuffleMixInstr(MethodRecognizer::Kind op_kind,
+                          Value* xy,
+                          Value* zw,
+                          intptr_t mask,
+                          intptr_t deopt_id)
       : TemplateDefinition(deopt_id), op_kind_(op_kind), mask_(mask) {
     SetInputAt(0, xy);
     SetInputAt(1, zw);
@@ -5629,9 +5382,7 @@
 
   virtual bool CanDeoptimize() const { return false; }
 
-  virtual Representation representation() const {
-    return kUnboxedFloat32x4;
-  }
+  virtual Representation representation() const { return kUnboxedFloat32x4; }
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT(idx >= 0 && idx < 4);
@@ -5667,9 +5418,7 @@
 
   virtual bool CanDeoptimize() const { return false; }
 
-  virtual Representation representation() const {
-    return kUnboxedFloat32x4;
-  }
+  virtual Representation representation() const { return kUnboxedFloat32x4; }
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT(idx == 0);
@@ -5697,13 +5446,11 @@
 // TODO(vegorov) replace with UnboxedConstantInstr.
 class Float32x4ZeroInstr : public TemplateDefinition<0, NoThrow, Pure> {
  public:
-  Float32x4ZeroInstr() { }
+  Float32x4ZeroInstr() {}
 
   virtual bool CanDeoptimize() const { return false; }
 
-  virtual Representation representation() const {
-    return kUnboxedFloat32x4;
-  }
+  virtual Representation representation() const { return kUnboxedFloat32x4; }
 
   DECLARE_INSTRUCTION(Float32x4Zero)
   virtual CompileType ComputeType() const;
@@ -5733,9 +5480,7 @@
 
   virtual bool CanDeoptimize() const { return false; }
 
-  virtual Representation representation() const {
-    return kUnboxedInt32x4;
-  }
+  virtual Representation representation() const { return kUnboxedInt32x4; }
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT((idx == 0) || (idx == 1));
@@ -5782,9 +5527,7 @@
 
   virtual bool CanDeoptimize() const { return false; }
 
-  virtual Representation representation() const {
-    return kUnboxedFloat32x4;
-  }
+  virtual Representation representation() const { return kUnboxedFloat32x4; }
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT((idx == 0) || (idx == 1));
@@ -5831,9 +5574,7 @@
 
   virtual bool CanDeoptimize() const { return false; }
 
-  virtual Representation representation() const {
-    return kUnboxedFloat32x4;
-  }
+  virtual Representation representation() const { return kUnboxedFloat32x4; }
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT((idx == 0) || (idx == 1));
@@ -5880,9 +5621,7 @@
 
   virtual bool CanDeoptimize() const { return false; }
 
-  virtual Representation representation() const {
-    return kUnboxedFloat32x4;
-  }
+  virtual Representation representation() const { return kUnboxedFloat32x4; }
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT(idx == 0);
@@ -5917,8 +5656,7 @@
   Float32x4ZeroArgInstr(MethodRecognizer::Kind op_kind,
                         Value* left,
                         intptr_t deopt_id)
-      : TemplateDefinition(deopt_id),
-        op_kind_(op_kind) {
+      : TemplateDefinition(deopt_id), op_kind_(op_kind) {
     SetInputAt(0, left);
   }
 
@@ -5928,9 +5666,7 @@
 
   virtual bool CanDeoptimize() const { return false; }
 
-  virtual Representation representation() const {
-    return kUnboxedFloat32x4;
-  }
+  virtual Representation representation() const { return kUnboxedFloat32x4; }
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT(idx == 0);
@@ -5977,9 +5713,7 @@
 
   virtual bool CanDeoptimize() const { return false; }
 
-  virtual Representation representation() const {
-    return kUnboxedFloat32x4;
-  }
+  virtual Representation representation() const { return kUnboxedFloat32x4; }
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT((idx == 0) || (idx == 1) || (idx == 2));
@@ -6010,8 +5744,7 @@
                      Value* left,
                      Value* replacement,
                      intptr_t deopt_id)
-      : TemplateDefinition(deopt_id),
-        op_kind_(op_kind) {
+      : TemplateDefinition(deopt_id), op_kind_(op_kind) {
     SetInputAt(0, replacement);
     SetInputAt(1, left);
   }
@@ -6023,9 +5756,7 @@
 
   virtual bool CanDeoptimize() const { return false; }
 
-  virtual Representation representation() const {
-    return kUnboxedFloat32x4;
-  }
+  virtual Representation representation() const { return kUnboxedFloat32x4; }
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT((idx == 0) || (idx == 1));
@@ -6129,9 +5860,7 @@
 
   virtual bool CanDeoptimize() const { return false; }
 
-  virtual Representation representation() const {
-    return kUnboxedInt32x4;
-  }
+  virtual Representation representation() const { return kUnboxedInt32x4; }
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT(idx == 0);
@@ -6167,9 +5896,7 @@
 
   virtual bool CanDeoptimize() const { return false; }
 
-  virtual Representation representation() const {
-    return kUnboxedFloat64x2;
-  }
+  virtual Representation representation() const { return kUnboxedFloat64x2; }
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT(idx == 0);
@@ -6205,9 +5932,7 @@
 
   virtual bool CanDeoptimize() const { return false; }
 
-  virtual Representation representation() const {
-    return kUnboxedFloat32x4;
-  }
+  virtual Representation representation() const { return kUnboxedFloat32x4; }
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT(idx == 0);
@@ -6245,9 +5970,7 @@
 
   virtual bool CanDeoptimize() const { return false; }
 
-  virtual Representation representation() const {
-    return kUnboxedFloat64x2;
-  }
+  virtual Representation representation() const { return kUnboxedFloat64x2; }
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT(idx >= 0 && idx < 2);
@@ -6283,9 +6006,7 @@
 
   virtual bool CanDeoptimize() const { return false; }
 
-  virtual Representation representation() const {
-    return kUnboxedFloat64x2;
-  }
+  virtual Representation representation() const { return kUnboxedFloat64x2; }
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT(idx == 0);
@@ -6312,13 +6033,11 @@
 
 class Float64x2ZeroInstr : public TemplateDefinition<0, NoThrow, Pure> {
  public:
-  Float64x2ZeroInstr() { }
+  Float64x2ZeroInstr() {}
 
   virtual bool CanDeoptimize() const { return false; }
 
-  virtual Representation representation() const {
-    return kUnboxedFloat64x2;
-  }
+  virtual Representation representation() const { return kUnboxedFloat64x2; }
 
   DECLARE_INSTRUCTION(Float64x2Zero)
   virtual CompileType ComputeType() const;
@@ -6399,9 +6118,7 @@
 
   virtual bool CanDeoptimize() const { return false; }
 
-  virtual Representation representation() const {
-    return kUnboxedFloat64x2;
-  }
+  virtual Representation representation() const { return kUnboxedFloat64x2; }
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     if (idx == 0) {
@@ -6459,9 +6176,7 @@
 
   virtual bool CanDeoptimize() const { return false; }
 
-  virtual Representation representation() const {
-    return kUnboxedInt32x4;
-  }
+  virtual Representation representation() const { return kUnboxedInt32x4; }
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT((idx >= 0) && (idx < 4));
@@ -6508,9 +6223,7 @@
 
   virtual bool CanDeoptimize() const { return false; }
 
-  virtual Representation representation() const {
-    return kUnboxedInt32x4;
-  }
+  virtual Representation representation() const { return kUnboxedInt32x4; }
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT((idx >= 0) && (idx < 4));
@@ -6550,9 +6263,7 @@
 
   virtual bool CanDeoptimize() const { return false; }
 
-  virtual Representation representation() const {
-      return kTagged;
-  }
+  virtual Representation representation() const { return kTagged; }
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT(idx == 0);
@@ -6596,9 +6307,7 @@
 
   virtual bool CanDeoptimize() const { return false; }
 
-  virtual Representation representation() const {
-    return kTagged;
-  }
+  virtual Representation representation() const { return kTagged; }
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT(idx == 0);
@@ -6649,9 +6358,7 @@
 
   virtual bool CanDeoptimize() const { return false; }
 
-  virtual Representation representation() const {
-      return kUnboxedFloat32x4;
-  }
+  virtual Representation representation() const { return kUnboxedFloat32x4; }
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT((idx == 0) || (idx == 1) || (idx == 2));
@@ -6697,9 +6404,7 @@
 
   virtual bool CanDeoptimize() const { return false; }
 
-  virtual Representation representation() const {
-      return kUnboxedInt32x4;
-  }
+  virtual Representation representation() const { return kUnboxedInt32x4; }
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT((idx == 0) || (idx == 1));
@@ -6742,9 +6447,7 @@
 
   virtual bool CanDeoptimize() const { return false; }
 
-  virtual Representation representation() const {
-    return kUnboxedFloat32x4;
-  }
+  virtual Representation representation() const { return kUnboxedFloat32x4; }
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT(idx == 0);
@@ -6772,9 +6475,9 @@
 class BinaryInt32x4OpInstr : public TemplateDefinition<2, NoThrow, Pure> {
  public:
   BinaryInt32x4OpInstr(Token::Kind op_kind,
-                        Value* left,
-                        Value* right,
-                        intptr_t deopt_id)
+                       Value* left,
+                       Value* right,
+                       intptr_t deopt_id)
       : TemplateDefinition(deopt_id), op_kind_(op_kind) {
     SetInputAt(0, left);
     SetInputAt(1, right);
@@ -6787,9 +6490,7 @@
 
   virtual bool CanDeoptimize() const { return false; }
 
-  virtual Representation representation() const {
-    return kUnboxedInt32x4;
-  }
+  virtual Representation representation() const { return kUnboxedInt32x4; }
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT((idx == 0) || (idx == 1));
@@ -6836,9 +6537,7 @@
 
   virtual bool CanDeoptimize() const { return false; }
 
-  virtual Representation representation() const {
-    return kUnboxedFloat64x2;
-  }
+  virtual Representation representation() const { return kUnboxedFloat64x2; }
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT((idx == 0) || (idx == 1));
@@ -6869,12 +6568,9 @@
 
 class UnaryIntegerOpInstr : public TemplateDefinition<1, NoThrow, Pure> {
  public:
-  UnaryIntegerOpInstr(Token::Kind op_kind,
-                      Value* value,
-                      intptr_t deopt_id)
+  UnaryIntegerOpInstr(Token::Kind op_kind, Value* value, intptr_t deopt_id)
       : TemplateDefinition(deopt_id), op_kind_(op_kind) {
-    ASSERT((op_kind == Token::kNEGATE) ||
-           (op_kind == Token::kBIT_NOT));
+    ASSERT((op_kind == Token::kNEGATE) || (op_kind == Token::kBIT_NOT));
     SetInputAt(0, value);
   }
 
@@ -6911,9 +6607,7 @@
 // Handles both Smi operations: BIT_OR and NEGATE.
 class UnarySmiOpInstr : public UnaryIntegerOpInstr {
  public:
-  UnarySmiOpInstr(Token::Kind op_kind,
-                  Value* value,
-                  intptr_t deopt_id)
+  UnarySmiOpInstr(Token::Kind op_kind, Value* value, intptr_t deopt_id)
       : UnaryIntegerOpInstr(op_kind, value, deopt_id) {}
 
   virtual bool CanDeoptimize() const { return op_kind() == Token::kNEGATE; }
@@ -6929,9 +6623,7 @@
 
 class UnaryUint32OpInstr : public UnaryIntegerOpInstr {
  public:
-  UnaryUint32OpInstr(Token::Kind op_kind,
-                     Value* value,
-                     intptr_t deopt_id)
+  UnaryUint32OpInstr(Token::Kind op_kind, Value* value, intptr_t deopt_id)
       : UnaryIntegerOpInstr(op_kind, value, deopt_id) {
     ASSERT(op_kind == Token::kBIT_NOT);
   }
@@ -6940,9 +6632,7 @@
 
   virtual CompileType ComputeType() const;
 
-  virtual Representation representation() const {
-    return kUnboxedUint32;
-  }
+  virtual Representation representation() const { return kUnboxedUint32; }
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT(idx == 0);
@@ -6963,15 +6653,11 @@
     ASSERT(op_kind == Token::kBIT_NOT);
   }
 
-  virtual bool CanDeoptimize() const {
-    return false;
-  }
+  virtual bool CanDeoptimize() const { return false; }
 
   virtual CompileType ComputeType() const;
 
-  virtual Representation representation() const {
-    return kUnboxedMint;
-  }
+  virtual Representation representation() const { return kUnboxedMint; }
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT(idx == 0);
@@ -6991,9 +6677,7 @@
                     Value* left,
                     Value* right,
                     InstanceCallInstr* call)
-      : TemplateDefinition(call->deopt_id()),
-        call_(call),
-        op_kind_(op_kind) {
+      : TemplateDefinition(call->deopt_id()), call_(call), op_kind_(op_kind) {
     SetInputAt(0, left);
     SetInputAt(1, right);
   }
@@ -7052,8 +6736,7 @@
 
   DECLARE_INSTRUCTION(CheckedSmiComparison)
 
-  virtual void EmitBranchCode(FlowGraphCompiler* compiler,
-                              BranchInstr* branch);
+  virtual void EmitBranchCode(FlowGraphCompiler* compiler, BranchInstr* branch);
 
   virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler,
                                        BranchLabels labels);
@@ -7164,8 +6847,7 @@
                    Value* left,
                    Value* right,
                    intptr_t deopt_id)
-      : BinaryIntegerOpInstr(op_kind, left, right, deopt_id) {
-  }
+      : BinaryIntegerOpInstr(op_kind, left, right, deopt_id) {}
 
   virtual bool CanDeoptimize() const;
 
@@ -7215,9 +6897,7 @@
 
   virtual bool CanDeoptimize() const;
 
-  virtual Representation representation() const {
-    return kUnboxedInt32;
-  }
+  virtual Representation representation() const { return kUnboxedInt32; }
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT((idx == 0) || (idx == 1));
@@ -7244,13 +6924,9 @@
     mark_truncating();
   }
 
-  virtual bool CanDeoptimize() const {
-    return false;
-  }
+  virtual bool CanDeoptimize() const { return false; }
 
-  virtual Representation representation() const {
-    return kUnboxedUint32;
-  }
+  virtual Representation representation() const { return kUnboxedUint32; }
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT((idx == 0) || (idx == 1));
@@ -7278,9 +6954,7 @@
 
   virtual bool CanDeoptimize() const { return true; }
 
-  virtual Representation representation() const {
-    return kUnboxedUint32;
-  }
+  virtual Representation representation() const { return kUnboxedUint32; }
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT((idx == 0) || (idx == 1));
@@ -7302,18 +6976,15 @@
                     Value* left,
                     Value* right,
                     intptr_t deopt_id)
-      : BinaryIntegerOpInstr(op_kind, left, right, deopt_id) {
-  }
+      : BinaryIntegerOpInstr(op_kind, left, right, deopt_id) {}
 
   virtual bool CanDeoptimize() const {
-    return (can_overflow() && ((op_kind() == Token::kADD) ||
-                               (op_kind() == Token::kSUB)))
-        || (op_kind() == Token::kMUL);  // Deopt if inputs are not int32.
+    return (can_overflow() &&
+            ((op_kind() == Token::kADD) || (op_kind() == Token::kSUB))) ||
+           (op_kind() == Token::kMUL);  // Deopt if inputs are not int32.
   }
 
-  virtual Representation representation() const {
-    return kUnboxedMint;
-  }
+  virtual Representation representation() const { return kUnboxedMint; }
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT((idx == 0) || (idx == 1));
@@ -7341,13 +7012,11 @@
   }
 
   virtual bool CanDeoptimize() const {
-    return  has_shift_count_check()
-        || (can_overflow() && (op_kind() == Token::kSHL));
+    return has_shift_count_check() ||
+           (can_overflow() && (op_kind() == Token::kSHL));
   }
 
-  virtual Representation representation() const {
-    return kUnboxedMint;
-  }
+  virtual Representation representation() const { return kUnboxedMint; }
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT((idx == 0) || (idx == 1));
@@ -7369,9 +7038,7 @@
 // Handles only NEGATE.
 class UnaryDoubleOpInstr : public TemplateDefinition<1, NoThrow, Pure> {
  public:
-  UnaryDoubleOpInstr(Token::Kind op_kind,
-                     Value* value,
-                     intptr_t deopt_id)
+  UnaryDoubleOpInstr(Token::Kind op_kind, Value* value, intptr_t deopt_id)
       : TemplateDefinition(deopt_id), op_kind_(op_kind) {
     ASSERT(op_kind == Token::kNEGATE);
     SetInputAt(0, value);
@@ -7391,9 +7058,7 @@
     return GetDeoptId();
   }
 
-  virtual Representation representation() const {
-    return kUnboxedDouble;
-  }
+  virtual Representation representation() const { return kUnboxedDouble; }
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT(idx == 0);
@@ -7416,8 +7081,7 @@
   CheckStackOverflowInstr(TokenPosition token_pos, intptr_t loop_depth)
       : TemplateInstruction(Thread::Current()->GetNextDeoptId()),
         token_pos_(token_pos),
-        loop_depth_(loop_depth) {
-  }
+        loop_depth_(loop_depth) {}
 
   virtual TokenPosition token_pos() const { return token_pos_; }
   bool in_loop() const { return loop_depth_ > 0; }
@@ -7453,9 +7117,7 @@
   DECLARE_INSTRUCTION(SmiToDouble)
   virtual CompileType ComputeType() const;
 
-  virtual Representation representation() const {
-    return kUnboxedDouble;
-  }
+  virtual Representation representation() const { return kUnboxedDouble; }
 
   virtual bool CanDeoptimize() const { return false; }
 
@@ -7470,9 +7132,7 @@
 
 class Int32ToDoubleInstr : public TemplateDefinition<1, NoThrow, Pure> {
  public:
-  explicit Int32ToDoubleInstr(Value* value) {
-    SetInputAt(0, value);
-  }
+  explicit Int32ToDoubleInstr(Value* value) { SetInputAt(0, value); }
 
   Value* value() const { return inputs_[0]; }
 
@@ -7484,9 +7144,7 @@
     return kUnboxedInt32;
   }
 
-  virtual Representation representation() const {
-    return kUnboxedDouble;
-  }
+  virtual Representation representation() const { return kUnboxedDouble; }
 
   virtual bool CanDeoptimize() const { return false; }
 
@@ -7514,9 +7172,7 @@
     return kUnboxedMint;
   }
 
-  virtual Representation representation() const {
-    return kUnboxedDouble;
-  }
+  virtual Representation representation() const { return kUnboxedDouble; }
 
   virtual intptr_t DeoptimizationTarget() const {
     // Direct access since this instruction cannot deoptimize, and the deopt-id
@@ -7594,8 +7250,7 @@
   DoubleToDoubleInstr(Value* value,
                       MethodRecognizer::Kind recognized_kind,
                       intptr_t deopt_id)
-    : TemplateDefinition(deopt_id),
-      recognized_kind_(recognized_kind) {
+      : TemplateDefinition(deopt_id), recognized_kind_(recognized_kind) {
     SetInputAt(0, value);
   }
 
@@ -7608,9 +7263,7 @@
 
   virtual bool CanDeoptimize() const { return false; }
 
-  virtual Representation representation() const {
-    return kUnboxedDouble;
-  }
+  virtual Representation representation() const { return kUnboxedDouble; }
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT(idx == 0);
@@ -7630,7 +7283,7 @@
 };
 
 
-class DoubleToFloatInstr: public TemplateDefinition<1, NoThrow, Pure> {
+class DoubleToFloatInstr : public TemplateDefinition<1, NoThrow, Pure> {
  public:
   DoubleToFloatInstr(Value* value, intptr_t deopt_id)
       : TemplateDefinition(deopt_id) {
@@ -7669,7 +7322,7 @@
 };
 
 
-class FloatToDoubleInstr: public TemplateDefinition<1, NoThrow, Pure> {
+class FloatToDoubleInstr : public TemplateDefinition<1, NoThrow, Pure> {
  public:
   FloatToDoubleInstr(Value* value, intptr_t deopt_id)
       : TemplateDefinition(deopt_id) {
@@ -7684,9 +7337,7 @@
 
   virtual bool CanDeoptimize() const { return false; }
 
-  virtual Representation representation() const {
-    return kUnboxedDouble;
-  }
+  virtual Representation representation() const { return kUnboxedDouble; }
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT(idx == 0);
@@ -7724,9 +7375,7 @@
 
   virtual bool CanDeoptimize() const { return false; }
 
-  virtual Representation representation() const {
-    return kUnboxedDouble;
-  }
+  virtual Representation representation() const { return kUnboxedDouble; }
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT((0 <= idx) && (idx < InputCount()));
@@ -7735,13 +7384,9 @@
 
   virtual intptr_t DeoptimizationTarget() const { return GetDeoptId(); }
 
-  virtual intptr_t InputCount() const {
-    return inputs_->length();
-  }
+  virtual intptr_t InputCount() const { return inputs_->length(); }
 
-  virtual Value* InputAt(intptr_t i) const {
-    return (*inputs_)[i];
-  }
+  virtual Value* InputAt(intptr_t i) const { return (*inputs_)[i]; }
 
   virtual bool AttributesEqual(Instruction* other) const {
     InvokeMathCFunctionInstr* other_invoke = other->AsInvokeMathCFunction();
@@ -7791,9 +7436,7 @@
 
   intptr_t index() const { return index_; }
 
-  virtual Representation representation() const {
-    return definition_rep_;
-  }
+  virtual Representation representation() const { return definition_rep_; }
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT(idx == 0);
@@ -7848,9 +7491,7 @@
 
   virtual intptr_t InputCount() const { return inputs_->length(); }
 
-  virtual Value* InputAt(intptr_t i) const {
-    return (*inputs_)[i];
-  }
+  virtual Value* InputAt(intptr_t i) const { return (*inputs_)[i]; }
 
   static intptr_t OutputIndexOf(MethodRecognizer::Kind kind);
   static intptr_t OutputIndexOf(Token::Kind token);
@@ -7942,9 +7583,7 @@
 
   virtual Instruction* Canonicalize(FlowGraph* flow_graph);
 
-  bool IsNullCheck() const {
-    return  DeoptIfNull() || DeoptIfNotNull();
-  }
+  bool IsNullCheck() const { return DeoptIfNull() || DeoptIfNotNull(); }
 
   bool DeoptIfNull() const;
   bool DeoptIfNotNull() const;
@@ -8055,9 +7694,7 @@
 
   bool IsRedundant(const RangeBoundary& length);
 
-  void mark_generalized() {
-    generalized_ = true;
-  }
+  void mark_generalized() { generalized_ = true; }
 
   virtual Instruction* Canonicalize(FlowGraph* flow_graph);
 
@@ -8071,10 +7708,7 @@
   void set_licm_hoisted(bool value) { licm_hoisted_ = value; }
 
   // Give a name to the location/input indices.
-  enum {
-    kLengthPos = 0,
-    kIndexPos = 1
-  };
+  enum { kLengthPos = 0, kIndexPos = 1 };
 
  private:
   bool generalized_;
@@ -8103,10 +7737,7 @@
   virtual bool CanDeoptimize() const { return true; }
 
   // Give a name to the location/input indices.
-  enum {
-    kLengthPos = 0,
-    kIndexPos = 1
-  };
+  enum { kLengthPos = 0, kIndexPos = 1 };
 
  private:
   DISALLOW_COPY_AND_ASSIGN(GenericCheckBoundInstr);
@@ -8124,11 +7755,9 @@
         to_representation_(to),
         is_truncating_(to == kUnboxedUint32) {
     ASSERT(from != to);
-    ASSERT((from == kUnboxedMint) ||
-           (from == kUnboxedUint32) ||
+    ASSERT((from == kUnboxedMint) || (from == kUnboxedUint32) ||
            (from == kUnboxedInt32));
-    ASSERT((to == kUnboxedMint) ||
-           (to == kUnboxedUint32) ||
+    ASSERT((to == kUnboxedMint) || (to == kUnboxedUint32) ||
            (to == kUnboxedInt32));
     SetInputAt(0, value);
   }
@@ -8145,9 +7774,7 @@
 
   virtual bool CanDeoptimize() const;
 
-  virtual Representation representation() const {
-    return to();
-  }
+  virtual Representation representation() const { return to(); }
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT(idx == 0);
@@ -8159,9 +7786,8 @@
   virtual bool AttributesEqual(Instruction* other) const {
     ASSERT(other->IsUnboxedIntConverter());
     UnboxedIntConverterInstr* converter = other->AsUnboxedIntConverter();
-    return (converter->from() == from()) &&
-        (converter->to() == to()) &&
-        (converter->is_truncating() == is_truncating());
+    return (converter->from() == from()) && (converter->to() == to()) &&
+           (converter->is_truncating() == is_truncating());
   }
 
   virtual void InferRange(RangeAnalysis* analysis, Range* range);
@@ -8210,12 +7836,12 @@
   class ShallowIterator : public ValueObject {
    public:
     explicit ShallowIterator(Environment* environment)
-        : environment_(environment), index_(0) { }
+        : environment_(environment), index_(0) {}
 
     ShallowIterator(const ShallowIterator& other)
         : ValueObject(),
           environment_(other.environment_),
-          index_(other.index_) { }
+          index_(other.index_) {}
 
     ShallowIterator& operator=(const ShallowIterator& other) {
       environment_ = other.environment_;
@@ -8325,17 +7951,14 @@
 
   Environment* Outermost() {
     Environment* result = this;
-    while (result->outer() != NULL) result = result->outer();
+    while (result->outer() != NULL)
+      result = result->outer();
     return result;
   }
 
-  Value* ValueAt(intptr_t ix) const {
-    return values_[ix];
-  }
+  Value* ValueAt(intptr_t ix) const { return values_[ix]; }
 
-  intptr_t Length() const {
-    return values_.length();
-  }
+  intptr_t Length() const { return values_.length(); }
 
   Location LocationAt(intptr_t index) const {
     ASSERT((index >= 0) && (index < values_.length()));
@@ -8353,9 +7976,7 @@
     return env->ValueAt(index);
   }
 
-  intptr_t fixed_parameter_count() const {
-    return fixed_parameter_count_;
-  }
+  intptr_t fixed_parameter_count() const { return fixed_parameter_count_; }
 
   intptr_t CountArgsPushed() {
     intptr_t count = 0;
@@ -8369,9 +7990,7 @@
 
   const Function& function() const { return parsed_function_.function(); }
 
-  Environment* DeepCopy(Zone* zone) const {
-    return DeepCopy(zone, Length());
-  }
+  Environment* DeepCopy(Zone* zone) const { return DeepCopy(zone, Length()); }
 
   void DeepCopyTo(Zone* zone, Instruction* instr) const;
   void DeepCopyToOuter(Zone* zone, Instruction* instr) const;
@@ -8414,8 +8033,7 @@
         fixed_parameter_count_(fixed_parameter_count),
         deopt_id_(deopt_id),
         parsed_function_(parsed_function),
-        outer_(outer) {
-  }
+        outer_(outer) {}
 
 
   GrowableArray<Value*> values_;
@@ -8434,8 +8052,8 @@
 class FlowGraphVisitor : public ValueObject {
  public:
   explicit FlowGraphVisitor(const GrowableArray<BlockEntryInstr*>& block_order)
-      : current_iterator_(NULL), block_order_(block_order) { }
-  virtual ~FlowGraphVisitor() { }
+      : current_iterator_(NULL), block_order_(block_order) {}
+  virtual ~FlowGraphVisitor() {}
 
   ForwardInstructionIterator* current_iterator() const {
     return current_iterator_;
@@ -8445,10 +8063,10 @@
   // instructions in order from the block entry to exit.
   virtual void VisitBlocks();
 
-  // Visit functions for instruction classes, with an empty default
-  // implementation.
+// Visit functions for instruction classes, with an empty default
+// implementation.
 #define DECLARE_VISIT_INSTRUCTION(ShortName)                                   \
-  virtual void Visit##ShortName(ShortName##Instr* instr) { }
+  virtual void Visit##ShortName(ShortName##Instr* instr) {}
 
   FOR_EACH_INSTRUCTION(DECLARE_VISIT_INSTRUCTION)
 
@@ -8464,11 +8082,11 @@
 
 
 // Helper macros for platform ports.
-#define DEFINE_UNIMPLEMENTED_INSTRUCTION(Name)                                \
-  LocationSummary* Name::MakeLocationSummary(Zone* zone, bool opt) const {    \
-    UNIMPLEMENTED();                                                          \
-    return NULL;                                                              \
-  }                                                                           \
+#define DEFINE_UNIMPLEMENTED_INSTRUCTION(Name)                                 \
+  LocationSummary* Name::MakeLocationSummary(Zone* zone, bool opt) const {     \
+    UNIMPLEMENTED();                                                           \
+    return NULL;                                                               \
+  }                                                                            \
   void Name::EmitNativeCode(FlowGraphCompiler* compiler) { UNIMPLEMENTED(); }
 
 
diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc
index fd50a14..8d199c4 100644
--- a/runtime/vm/intermediate_language_arm.cc
+++ b/runtime/vm/intermediate_language_arm.cc
@@ -31,8 +31,8 @@
 // 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(Zone* zone) {
-  LocationSummary* result = new(zone) LocationSummary(
-      zone, 0, 0, LocationSummary::kCall);
+  LocationSummary* result =
+      new (zone) LocationSummary(zone, 0, 0, LocationSummary::kCall);
   result->set_out(0, Location::RegisterLocation(R0));
   return result;
 }
@@ -42,8 +42,8 @@
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::AnyOrConstant(value()));
   return locs;
 }
@@ -68,12 +68,11 @@
 }
 
 
-LocationSummary* ReturnInstr::MakeLocationSummary(Zone* zone,
-                                                  bool opt) const {
+LocationSummary* ReturnInstr::MakeLocationSummary(Zone* zone, bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RegisterLocation(R0));
   return locs;
 }
@@ -115,18 +114,30 @@
 
 static Condition NegateCondition(Condition condition) {
   switch (condition) {
-    case EQ: return NE;
-    case NE: return EQ;
-    case LT: return GE;
-    case LE: return GT;
-    case GT: return LE;
-    case GE: return LT;
-    case CC: return CS;
-    case LS: return HI;
-    case HI: return LS;
-    case CS: return CC;
-    case VC: return VS;
-    case VS: return VC;
+    case EQ:
+      return NE;
+    case NE:
+      return EQ;
+    case LT:
+      return GE;
+    case LE:
+      return GT;
+    case GT:
+      return LE;
+    case GE:
+      return LT;
+    case CC:
+      return CS;
+    case LS:
+      return HI;
+    case HI:
+      return LS;
+    case CS:
+      return CC;
+    case VC:
+      return VS;
+    case VS:
+      return VC;
     default:
       UNREACHABLE();
       return EQ;
@@ -159,7 +170,7 @@
   __ eor(result, result, Operand(result));
 
   // Emit comparison code. This must not overwrite the result register.
-  BranchLabels labels = { NULL, NULL, NULL };
+  BranchLabels labels = {NULL, NULL, NULL};
   Condition true_condition = comparison()->EmitComparisonCode(compiler, labels);
 
   const bool is_power_of_two_kind = IsPowerOfTwoKind(if_true_, if_false_);
@@ -191,8 +202,7 @@
     __ Lsl(result, result, Operand(shift + kSmiTagSize));
   } else {
     __ sub(result, result, Operand(1));
-    const int32_t val =
-        Smi::RawValue(true_value) - Smi::RawValue(false_value);
+    const int32_t val = Smi::RawValue(true_value) - Smi::RawValue(false_value);
     __ AndImmediate(result, result, val);
     if (false_value != 0) {
       __ AddImmediate(result, Smi::RawValue(false_value));
@@ -205,8 +215,8 @@
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(R0));  // Function.
   summary->set_out(0, Location::RegisterLocation(R0));
   return summary;
@@ -216,9 +226,8 @@
 void ClosureCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   // Load arguments descriptor in R4.
   int argument_count = ArgumentCount();
-  const Array& arguments_descriptor =
-      Array::ZoneHandle(ArgumentsDescriptor::New(argument_count,
-                                                 argument_names()));
+  const Array& arguments_descriptor = Array::ZoneHandle(
+      ArgumentsDescriptor::New(argument_count, argument_names()));
   __ LoadObject(R4, arguments_descriptor);
 
   // R4: Arguments descriptor.
@@ -241,8 +250,7 @@
   // Add deoptimization continuation point after the call and before the
   // arguments are removed.
   // In optimized code this descriptor is needed for exception handling.
-  compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
-                                 deopt_id_after,
+  compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, deopt_id_after,
                                  token_pos());
   __ Drop(argument_count);
 }
@@ -250,9 +258,7 @@
 
 LocationSummary* LoadLocalInstr::MakeLocationSummary(Zone* zone,
                                                      bool opt) const {
-  return LocationSummary::Make(zone,
-                               0,
-                               Location::RequiresRegister(),
+  return LocationSummary::Make(zone, 0, Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
 
@@ -265,9 +271,7 @@
 
 LocationSummary* StoreLocalInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
-  return LocationSummary::Make(zone,
-                               1,
-                               Location::SameAsFirstInput(),
+  return LocationSummary::Make(zone, 1, Location::SameAsFirstInput(),
                                LocationSummary::kNoCall);
 }
 
@@ -282,9 +286,7 @@
 
 LocationSummary* ConstantInstr::MakeLocationSummary(Zone* zone,
                                                     bool opt) const {
-  return LocationSummary::Make(zone,
-                               0,
-                               Location::RequiresRegister(),
+  return LocationSummary::Make(zone, 0, Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
 
@@ -302,8 +304,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = (representation_ == kUnboxedInt32) ? 0 : 1;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   if (representation_ == kUnboxedInt32) {
     locs->set_out(0, Location::RequiresRegister());
   } else {
@@ -347,8 +349,8 @@
                                                             bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(R0));  // Value.
   summary->set_in(1, Location::RegisterLocation(R1));  // Type arguments.
   summary->set_out(0, Location::RegisterLocation(R0));
@@ -360,8 +362,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(R0));
   locs->set_out(0, Location::RegisterLocation(R0));
   return locs;
@@ -390,11 +392,8 @@
   }
 
   __ Push(reg);  // Push the source object.
-  compiler->GenerateRuntimeCall(token_pos,
-                                deopt_id,
-                                kNonBoolTypeErrorRuntimeEntry,
-                                1,
-                                locs);
+  compiler->GenerateRuntimeCall(token_pos, deopt_id,
+                                kNonBoolTypeErrorRuntimeEntry, 1, locs);
   // We should never return here.
   __ bkpt(0);
   __ Bind(&done);
@@ -412,12 +411,18 @@
 
 static Condition TokenKindToSmiCondition(Token::Kind kind) {
   switch (kind) {
-    case Token::kEQ: return EQ;
-    case Token::kNE: return NE;
-    case Token::kLT: return LT;
-    case Token::kGT: return GT;
-    case Token::kLTE: return LE;
-    case Token::kGTE: return GE;
+    case Token::kEQ:
+      return EQ;
+    case Token::kNE:
+      return NE;
+    case Token::kLT:
+      return LT;
+    case Token::kGT:
+      return GT;
+    case Token::kLTE:
+      return LE;
+    case Token::kGTE:
+      return GE;
     default:
       UNREACHABLE();
       return VS;
@@ -430,8 +435,8 @@
   const intptr_t kNumInputs = 2;
   if (operation_cid() == kMintCid) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* locs = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::Pair(Location::RequiresRegister(),
                                    Location::RequiresRegister()));
     locs->set_in(1, Location::Pair(Location::RequiresRegister(),
@@ -441,8 +446,8 @@
   }
   if (operation_cid() == kDoubleCid) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* locs = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::RequiresFpuRegister());
     locs->set_in(1, Location::RequiresFpuRegister());
     locs->set_out(0, Location::RequiresRegister());
@@ -450,8 +455,8 @@
   }
   if (operation_cid() == kSmiCid) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* locs = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::RegisterOrConstant(left()));
     // Only one input can be a constant operand. The case of two constant
     // operands should be handled by constant propagation.
@@ -485,16 +490,26 @@
 
 static Condition FlipCondition(Condition condition) {
   switch (condition) {
-    case EQ: return EQ;
-    case NE: return NE;
-    case LT: return GT;
-    case LE: return GE;
-    case GT: return LT;
-    case GE: return LE;
-    case CC: return HI;
-    case LS: return CS;
-    case HI: return CC;
-    case CS: return LS;
+    case EQ:
+      return EQ;
+    case NE:
+      return NE;
+    case LT:
+      return GT;
+    case LE:
+      return GE;
+    case GT:
+      return LT;
+    case GE:
+      return LE;
+    case CC:
+      return HI;
+    case LS:
+      return CS;
+    case HI:
+      return CC;
+    case CS:
+      return LS;
     default:
       UNREACHABLE();
       return EQ;
@@ -544,12 +559,18 @@
 
 static Condition TokenKindToMintCondition(Token::Kind kind) {
   switch (kind) {
-    case Token::kEQ: return EQ;
-    case Token::kNE: return NE;
-    case Token::kLT: return LT;
-    case Token::kGT: return GT;
-    case Token::kLTE: return LE;
-    case Token::kGTE: return GE;
+    case Token::kEQ:
+      return EQ;
+    case Token::kNE:
+      return NE;
+    case Token::kLT:
+      return LT;
+    case Token::kGT:
+      return GT;
+    case Token::kLTE:
+      return LE;
+    case Token::kGTE:
+      return GE;
     default:
       UNREACHABLE();
       return VS;
@@ -623,12 +644,18 @@
 
 static Condition TokenKindToDoubleCondition(Token::Kind kind) {
   switch (kind) {
-    case Token::kEQ: return EQ;
-    case Token::kNE: return NE;
-    case Token::kLT: return LT;
-    case Token::kGT: return GT;
-    case Token::kLTE: return LE;
-    case Token::kGTE: return GE;
+    case Token::kEQ:
+      return EQ;
+    case Token::kNE:
+      return NE;
+    case Token::kLT:
+      return LT;
+    case Token::kGT:
+      return GT;
+    case Token::kLTE:
+      return LE;
+    case Token::kGTE:
+      return GE;
     default:
       UNREACHABLE();
       return VS;
@@ -667,7 +694,7 @@
   ASSERT((kind() == Token::kNE) || (kind() == Token::kEQ));
 
   // The ARM code does not use true- and false-labels here.
-  BranchLabels labels = { NULL, NULL, NULL };
+  BranchLabels labels = {NULL, NULL, NULL};
   Condition true_condition = EmitComparisonCode(compiler, labels);
 
   const Register result = locs()->out(0).reg();
@@ -695,20 +722,19 @@
   Condition true_condition = EmitComparisonCode(compiler, labels);
 
   if (operation_cid() == kDoubleCid) {
-    Label* nan_result = (true_condition == NE) ?
-        labels.true_label : labels.false_label;
+    Label* nan_result =
+        (true_condition == NE) ? labels.true_label : labels.false_label;
     __ b(nan_result, VS);
   }
   EmitBranchOnCondition(compiler, true_condition, labels);
 }
 
 
-LocationSummary* TestSmiInstr::MakeLocationSummary(Zone* zone,
-                                                   bool opt) const {
+LocationSummary* TestSmiInstr::MakeLocationSummary(Zone* zone, bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   // Only one input can be a constant operand. The case of two constant
   // operands should be handled by constant propagation.
@@ -723,8 +749,7 @@
   Location right = locs()->in(1);
   if (right.IsConstant()) {
     ASSERT(right.constant().IsSmi());
-    const int32_t imm =
-        reinterpret_cast<int32_t>(right.constant().raw());
+    const int32_t imm = reinterpret_cast<int32_t>(right.constant().raw());
     __ TestImmediate(left, imm);
   } else {
     __ tst(left, Operand(right.reg()));
@@ -752,8 +777,8 @@
                                                     bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   locs->set_temp(0, Location::RequiresRegister());
   locs->set_out(0, Location::RequiresRegister());
@@ -767,11 +792,11 @@
   const Register val_reg = locs()->in(0).reg();
   const Register cid_reg = locs()->temp(0).reg();
 
-  Label* deopt = CanDeoptimize()
-      ? compiler->AddDeoptStub(deopt_id(),
-                               ICData::kDeoptTestCids,
-                               licm_hoisted_ ? ICData::kHoisted : 0)
-      : NULL;
+  Label* deopt =
+      CanDeoptimize()
+          ? compiler->AddDeoptStub(deopt_id(), ICData::kDeoptTestCids,
+                                   licm_hoisted_ ? ICData::kHoisted : 0)
+          : NULL;
 
   const intptr_t true_result = (kind() == Token::kIS) ? 1 : 0;
   const ZoneGrowableArray<intptr_t>& data = cid_results();
@@ -813,7 +838,7 @@
 void TestCidsInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const Register result_reg = locs()->out(0).reg();
   Label is_true, is_false, done;
-  BranchLabels labels = { &is_true, &is_false, &is_false };
+  BranchLabels labels = {&is_true, &is_false, &is_false};
   EmitComparisonCode(compiler, labels);
   __ Bind(&is_false);
   __ LoadObject(result_reg, Bool::False());
@@ -830,8 +855,8 @@
   const intptr_t kNumTemps = 0;
   if (operation_cid() == kMintCid) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* locs = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::Pair(Location::RequiresRegister(),
                                    Location::RequiresRegister()));
     locs->set_in(1, Location::Pair(Location::RequiresRegister(),
@@ -840,16 +865,16 @@
     return locs;
   }
   if (operation_cid() == kDoubleCid) {
-    LocationSummary* summary = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresFpuRegister());
     summary->set_in(1, Location::RequiresFpuRegister());
     summary->set_out(0, Location::RequiresRegister());
     return summary;
   }
   ASSERT(operation_cid() == kSmiCid);
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RegisterOrConstant(left()));
   // Only one input can be a constant operand. The case of two constant
   // operands should be handled by constant propagation.
@@ -876,7 +901,7 @@
 
 void RelationalOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Label is_true, is_false;
-  BranchLabels labels = { &is_true, &is_false, &is_false };
+  BranchLabels labels = {&is_true, &is_false, &is_false};
   Condition true_condition = EmitComparisonCode(compiler, labels);
 
   const Register result = locs()->out(0).reg();
@@ -913,8 +938,8 @@
   if ((operation_cid() == kSmiCid) || (operation_cid() == kMintCid)) {
     EmitBranchOnCondition(compiler, true_condition, labels);
   } else if (operation_cid() == kDoubleCid) {
-    Label* nan_result = (true_condition == NE) ?
-        labels.true_label : labels.false_label;
+    Label* nan_result =
+        (true_condition == NE) ? labels.true_label : labels.false_label;
     __ b(nan_result, VS);
     EmitBranchOnCondition(compiler, true_condition, labels);
   }
@@ -935,8 +960,8 @@
   __ PushObject(Object::null_object());
   // Pass a pointer to the first argument in R2.
   if (!function().HasOptionalParameters()) {
-    __ AddImmediate(R2, FP, (kParamEndSlotFromFp +
-                             function().NumParameters()) * kWordSize);
+    __ AddImmediate(
+        R2, FP, (kParamEndSlotFromFp + function().NumParameters()) * kWordSize);
   } else {
     __ AddImmediate(R2, FP, kFirstLocalSlotFromFp * kWordSize);
   }
@@ -967,21 +992,18 @@
   __ LoadImmediate(R1, argc_tag);
   ExternalLabel label(entry);
   __ LoadNativeEntry(R9, &label, link_lazily() ? kPatchable : kNotPatchable);
-  compiler->GenerateCall(token_pos(),
-                         *stub_entry,
-                         RawPcDescriptors::kOther,
+  compiler->GenerateCall(token_pos(), *stub_entry, RawPcDescriptors::kOther,
                          locs());
   __ Pop(result);
 }
 
 
 LocationSummary* OneByteStringFromCharCodeInstr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   const intptr_t kNumInputs = 1;
   // TODO(fschneider): Allow immediate operands for the char code.
-  return LocationSummary::Make(zone,
-                               kNumInputs,
-                               Location::RequiresRegister(),
+  return LocationSummary::Make(zone, kNumInputs, Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
 
@@ -1001,9 +1023,7 @@
 LocationSummary* StringToCharCodeInstr::MakeLocationSummary(Zone* zone,
                                                             bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(zone,
-                               kNumInputs,
-                               Location::RequiresRegister(),
+  return LocationSummary::Make(zone, kNumInputs, Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
 
@@ -1024,8 +1044,8 @@
                                                              bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(R0));
   summary->set_out(0, Location::RegisterLocation(R0));
   return summary;
@@ -1037,12 +1057,8 @@
   __ Push(array);
   const int kNumberOfArguments = 1;
   const Array& kNoArgumentNames = Object::null_array();
-  compiler->GenerateStaticCall(deopt_id(),
-                               token_pos(),
-                               CallFunction(),
-                               kNumberOfArguments,
-                               kNoArgumentNames,
-                               locs(),
+  compiler->GenerateStaticCall(deopt_id(), token_pos(), CallFunction(),
+                               kNumberOfArguments, kNoArgumentNames, locs(),
                                ICData::Handle());
   ASSERT(locs()->out(0).reg() == R0);
 }
@@ -1051,9 +1067,7 @@
 LocationSummary* LoadUntaggedInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(zone,
-                               kNumInputs,
-                               Location::RequiresRegister(),
+  return LocationSummary::Make(zone, kNumInputs, Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
 
@@ -1073,9 +1087,7 @@
 LocationSummary* LoadClassIdInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(zone,
-                               kNumInputs,
-                               Location::RequiresRegister(),
+  return LocationSummary::Make(zone, kNumInputs, Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
 
@@ -1212,8 +1224,8 @@
                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = aligned() ? 0 : 1;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   bool needs_base = false;
   if (CanBeImmediateIndex(index(), class_id(), IsExternal(),
@@ -1224,9 +1236,9 @@
   } else {
     locs->set_in(1, Location::RequiresRegister());
   }
-  if ((representation() == kUnboxedDouble)    ||
+  if ((representation() == kUnboxedDouble) ||
       (representation() == kUnboxedFloat32x4) ||
-      (representation() == kUnboxedInt32x4)   ||
+      (representation() == kUnboxedInt32x4) ||
       (representation() == kUnboxedFloat64x2)) {
     if (class_id() == kTypedDataFloat32ArrayCid) {
       // Need register <= Q7 for float operations.
@@ -1262,22 +1274,22 @@
   Address element_address(kNoRegister);
   if (aligned()) {
     element_address = index.IsRegister()
-      ? __ ElementAddressForRegIndex(true,  // Load.
-                                     IsExternal(), class_id(), index_scale(),
-                                     array,
-                                     index.reg())
-      : __ ElementAddressForIntIndex(true,  // Load.
-                                     IsExternal(), class_id(), index_scale(),
-                                     array, Smi::Cast(index.constant()).Value(),
-                                     IP);  // Temp register.
+                          ? __ ElementAddressForRegIndex(
+                                true,  // Load.
+                                IsExternal(), class_id(), index_scale(), array,
+                                index.reg())
+                          : __ ElementAddressForIntIndex(
+                                true,  // Load.
+                                IsExternal(), class_id(), index_scale(), array,
+                                Smi::Cast(index.constant()).Value(),
+                                IP);  // Temp register.
     // Warning: element_address may use register IP as base.
   } else {
     if (index.IsRegister()) {
       __ LoadElementAddressForRegIndex(address,
                                        true,  // Load.
                                        IsExternal(), class_id(), index_scale(),
-                                       array,
-                                       index.reg());
+                                       array, index.reg());
     } else {
       __ LoadElementAddressForIntIndex(address,
                                        true,  // Load.
@@ -1287,9 +1299,9 @@
     }
   }
 
-  if ((representation() == kUnboxedDouble)    ||
+  if ((representation() == kUnboxedDouble) ||
       (representation() == kUnboxedFloat32x4) ||
-      (representation() == kUnboxedInt32x4)   ||
+      (representation() == kUnboxedInt32x4) ||
       (representation() == kUnboxedFloat64x2)) {
     const QRegister result = locs()->out(0).fpu_reg();
     const DRegister dresult0 = EvenDRegisterOf(result);
@@ -1326,7 +1338,7 @@
         } else {
           __ LoadWordUnaligned(result, address, TMP);
         }
-      break;
+        break;
       case kTypedDataUint32ArrayCid:
         ASSERT(representation() == kUnboxedUint32);
         if (aligned()) {
@@ -1334,7 +1346,7 @@
         } else {
           __ LoadWordUnaligned(result, address, TMP);
         }
-      break;
+        break;
       default:
         UNREACHABLE();
     }
@@ -1391,8 +1403,8 @@
 Representation StoreIndexedInstr::RequiredInputRepresentation(
     intptr_t idx) const {
   // Array can be a Dart object or a pointer to external data.
-  if (idx == 0)  return kNoRepresentation;  // Flexible input representation.
-  if (idx == 1) return kTagged;  // Index is a smi.
+  if (idx == 0) return kNoRepresentation;  // Flexible input representation.
+  if (idx == 1) return kTagged;            // Index is a smi.
   ASSERT(idx == 2);
   switch (class_id_) {
     case kArrayCid:
@@ -1435,8 +1447,8 @@
                           false,  // Store.
                           &needs_base)) {
     const intptr_t kNumTemps = aligned() ? (needs_base ? 1 : 0) : 2;
-    locs = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
 
     // CanBeImmediateIndex must return false for unsafe smis.
     locs->set_in(1, Location::Constant(index()->definition()->AsConstant()));
@@ -1449,8 +1461,8 @@
     }
   } else {
     const intptr_t kNumTemps = aligned() ? 0 : 2;
-    locs = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
 
     locs->set_in(1, Location::WritableRegister());
     if (!aligned()) {
@@ -1463,8 +1475,8 @@
   switch (class_id()) {
     case kArrayCid:
       locs->set_in(2, ShouldEmitStoreBarrier()
-                        ? Location::WritableRegister()
-                        : Location::RegisterOrConstant(value()));
+                          ? Location::WritableRegister()
+                          : Location::RegisterOrConstant(value()));
       break;
     case kExternalTypedDataUint8ArrayCid:
     case kExternalTypedDataUint8ClampedArrayCid:
@@ -1508,21 +1520,20 @@
   Address element_address(kNoRegister);
   if (aligned()) {
     element_address = index.IsRegister()
-      ? __ ElementAddressForRegIndex(false,  // Store.
-                                     IsExternal(), class_id(), index_scale(),
-                                     array,
-                                     index.reg())
-      : __ ElementAddressForIntIndex(false,  // Store.
-                                     IsExternal(), class_id(), index_scale(),
-                                     array, Smi::Cast(index.constant()).Value(),
-                                     temp);
+                          ? __ ElementAddressForRegIndex(
+                                false,  // Store.
+                                IsExternal(), class_id(), index_scale(), array,
+                                index.reg())
+                          : __ ElementAddressForIntIndex(
+                                false,  // Store.
+                                IsExternal(), class_id(), index_scale(), array,
+                                Smi::Cast(index.constant()).Value(), temp);
   } else {
     if (index.IsRegister()) {
       __ LoadElementAddressForRegIndex(temp,
                                        false,  // Store.
                                        IsExternal(), class_id(), index_scale(),
-                                       array,
-                                       index.reg());
+                                       array, index.reg());
     } else {
       __ LoadElementAddressForIntIndex(temp,
                                        false,  // Store.
@@ -1576,9 +1587,9 @@
       } else {
         const Register value = locs()->in(2).reg();
         __ LoadImmediate(IP, 0x1FE);  // Smi 0xFF.
-        __ cmp(value, Operand(IP));  // Compare Smi value and smi 0xFF.
+        __ cmp(value, Operand(IP));   // Compare Smi value and smi 0xFF.
         // Clamp to 0x00 or 0xFF respectively.
-        __ mov(IP, Operand(0), LE);  // IP = value <= 0x1FE ? 0 : 0x1FE.
+        __ mov(IP, Operand(0), LE);      // IP = value <= 0x1FE ? 0 : 0x1FE.
         __ mov(IP, Operand(value), LS);  // IP = value in range ? value : IP.
         __ SmiUntag(IP);
         __ strb(IP, element_address);
@@ -1638,11 +1649,10 @@
   const intptr_t value_cid = value()->Type()->ToCid();
   const intptr_t field_cid = field().guarded_cid();
 
-  const bool emit_full_guard =
-      !opt || (field_cid == kIllegalCid);
+  const bool emit_full_guard = !opt || (field_cid == kIllegalCid);
 
-  const bool needs_value_cid_temp_reg = emit_full_guard ||
-      ((value_cid == kDynamicCid) && (field_cid != kSmiCid));
+  const bool needs_value_cid_temp_reg =
+      emit_full_guard || ((value_cid == kDynamicCid) && (field_cid != kSmiCid));
 
   const bool needs_field_temp_reg = emit_full_guard;
 
@@ -1654,8 +1664,8 @@
     num_temps++;
   }
 
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, num_temps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, num_temps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
 
   for (intptr_t i = 0; i < num_temps; i++) {
@@ -1676,7 +1686,8 @@
   if (field_cid == kDynamicCid) {
     if (Compiler::IsBackgroundCompilation()) {
       // Field state changed while compiling.
-      Compiler::AbortBackgroundCompilation(deopt_id(),
+      Compiler::AbortBackgroundCompilation(
+          deopt_id(),
           "GuardFieldClassInstr: field state changed while compiling");
     }
     ASSERT(!compiler->is_optimizing());
@@ -1686,23 +1697,26 @@
   const bool emit_full_guard =
       !compiler->is_optimizing() || (field_cid == kIllegalCid);
 
-  const bool needs_value_cid_temp_reg = emit_full_guard ||
-      ((value_cid == kDynamicCid) && (field_cid != kSmiCid));
+  const bool needs_value_cid_temp_reg =
+      emit_full_guard || ((value_cid == kDynamicCid) && (field_cid != kSmiCid));
 
   const bool needs_field_temp_reg = emit_full_guard;
 
   const Register value_reg = locs()->in(0).reg();
 
-  const Register value_cid_reg = needs_value_cid_temp_reg ?
-      locs()->temp(0).reg() : kNoRegister;
+  const Register value_cid_reg =
+      needs_value_cid_temp_reg ? locs()->temp(0).reg() : kNoRegister;
 
-  const Register field_reg = needs_field_temp_reg ?
-      locs()->temp(locs()->temp_count() - 1).reg() : kNoRegister;
+  const Register field_reg = needs_field_temp_reg
+                                 ? locs()->temp(locs()->temp_count() - 1).reg()
+                                 : kNoRegister;
 
   Label ok, fail_label;
 
-  Label* deopt = compiler->is_optimizing() ?
-      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptGuardField) : NULL;
+  Label* deopt =
+      compiler->is_optimizing()
+          ? compiler->AddDeoptStub(deopt_id(), ICData::kDeoptGuardField)
+          : NULL;
 
   Label* fail = (deopt != NULL) ? deopt : &fail_label;
 
@@ -1710,8 +1724,8 @@
     __ LoadObject(field_reg, Field::ZoneHandle(field().Original()));
 
     FieldAddress field_cid_operand(field_reg, Field::guarded_cid_offset());
-    FieldAddress field_nullability_operand(
-        field_reg, Field::is_nullable_offset());
+    FieldAddress field_nullability_operand(field_reg,
+                                           Field::is_nullable_offset());
 
     if (value_cid == kDynamicCid) {
       LoadValueCid(compiler, value_cid_reg, value_reg);
@@ -1809,8 +1823,8 @@
   const intptr_t kNumInputs = 1;
   if (!opt || (field().guarded_list_length() == Field::kUnknownFixedLength)) {
     const intptr_t kNumTemps = 3;
-    LocationSummary* summary = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     // We need temporaries for field object, length offset and expected length.
     summary->set_temp(0, Location::RequiresRegister());
@@ -1821,8 +1835,8 @@
     // TODO(vegorov): can use TMP when length is small enough to fit into
     // immediate.
     const intptr_t kNumTemps = 1;
-    LocationSummary* summary = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     summary->set_temp(0, Location::RequiresRegister());
     return summary;
@@ -1835,15 +1849,18 @@
   if (field().guarded_list_length() == Field::kNoFixedLength) {
     if (Compiler::IsBackgroundCompilation()) {
       // Field state changed while compiling.
-      Compiler::AbortBackgroundCompilation(deopt_id(),
+      Compiler::AbortBackgroundCompilation(
+          deopt_id(),
           "GuardFieldLengthInstr: field state changed while compiling");
     }
     ASSERT(!compiler->is_optimizing());
     return;  // Nothing to emit.
   }
 
-  Label* deopt = compiler->is_optimizing() ?
-      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptGuardField) : NULL;
+  Label* deopt =
+      compiler->is_optimizing()
+          ? compiler->AddDeoptStub(deopt_id(), ICData::kDeoptGuardField)
+          : NULL;
 
   const Register value_reg = locs()->in(0).reg();
 
@@ -1857,10 +1874,12 @@
 
     __ LoadObject(field_reg, Field::ZoneHandle(field().Original()));
 
-    __ ldrsb(offset_reg, FieldAddress(field_reg,
-        Field::guarded_list_length_in_object_offset_offset()));
-    __ ldr(length_reg, FieldAddress(field_reg,
-        Field::guarded_list_length_offset()));
+    __ ldrsb(
+        offset_reg,
+        FieldAddress(field_reg,
+                     Field::guarded_list_length_in_object_offset_offset()));
+    __ ldr(length_reg,
+           FieldAddress(field_reg, Field::guarded_list_length_offset()));
 
     __ tst(offset_reg, Operand(offset_reg));
     __ b(&ok, MI);
@@ -1888,7 +1907,7 @@
     ASSERT(compiler->is_optimizing());
     ASSERT(field().guarded_list_length() >= 0);
     ASSERT(field().guarded_list_length_in_object_offset() !=
-        Field::kUnknownLengthOffset);
+           Field::kUnknownLengthOffset);
 
     const Register length_reg = locs()->temp(0).reg();
 
@@ -1907,14 +1926,11 @@
   BoxAllocationSlowPath(Instruction* instruction,
                         const Class& cls,
                         Register result)
-      : instruction_(instruction),
-        cls_(cls),
-        result_(result) { }
+      : instruction_(instruction), cls_(cls), result_(result) {}
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     if (Assembler::EmittingComments()) {
-      __ Comment("%s slow path allocation of %s",
-                 instruction_->DebugName(),
+      __ Comment("%s slow path allocation of %s", instruction_->DebugName(),
                  String::Handle(cls_.ScrubbedName()).ToCString());
     }
     __ Bind(entry_label());
@@ -1928,9 +1944,7 @@
 
     compiler->SaveLiveRegisters(locs);
     compiler->GenerateCall(TokenPosition::kNoSource,  // No token position.
-                           stub_entry,
-                           RawPcDescriptors::kOther,
-                           locs);
+                           stub_entry, RawPcDescriptors::kOther, locs);
     compiler->AddStubCallTarget(stub);
     __ MoveRegister(result_, R0);
     compiler->RestoreLiveRegisters(locs);
@@ -1943,19 +1957,13 @@
                        Register result,
                        Register temp) {
     if (compiler->intrinsic_mode()) {
-      __ TryAllocate(cls,
-                     compiler->intrinsic_slow_path_label(),
-                     result,
-                     temp);
+      __ TryAllocate(cls, compiler->intrinsic_slow_path_label(), result, temp);
     } else {
       BoxAllocationSlowPath* slow_path =
           new BoxAllocationSlowPath(instruction, cls, result);
       compiler->AddSlowPathCode(slow_path);
 
-      __ TryAllocate(cls,
-                     slow_path->entry_label(),
-                     result,
-                     temp);
+      __ TryAllocate(cls, slow_path->entry_label(), result, temp);
       __ Bind(slow_path->exit_label());
     }
   }
@@ -1967,14 +1975,12 @@
 };
 
 
-
-
 LocationSummary* LoadCodeUnitsInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const bool might_box = (representation() == kTagged) && !can_pack_into_smi();
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = might_box ? 1 : 0;
-  LocationSummary* summary = new(zone) LocationSummary(
+  LocationSummary* summary = new (zone) LocationSummary(
       zone, kNumInputs, kNumTemps,
       might_box ? LocationSummary::kCallOnSlowPath : LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
@@ -2002,7 +2008,7 @@
   const Location index = locs()->in(1);
 
   Address element_address = __ ElementAddressForRegIndex(
-        true,  IsExternal(), class_id(), index_scale(), str, index.reg());
+      true, IsExternal(), class_id(), index_scale(), str, index.reg());
   // Warning: element_address may use register IP as base.
 
   if (representation() == kUnboxedMint) {
@@ -2034,18 +2040,30 @@
       case kOneByteStringCid:
       case kExternalOneByteStringCid:
         switch (element_count()) {
-          case 1: __ ldrb(result, element_address); break;
-          case 2: __ ldrh(result, element_address); break;
-          case 4: __ ldr(result, element_address); break;
-          default: UNREACHABLE();
+          case 1:
+            __ ldrb(result, element_address);
+            break;
+          case 2:
+            __ ldrh(result, element_address);
+            break;
+          case 4:
+            __ ldr(result, element_address);
+            break;
+          default:
+            UNREACHABLE();
         }
         break;
       case kTwoByteStringCid:
       case kExternalTwoByteStringCid:
         switch (element_count()) {
-          case 1: __ ldrh(result, element_address); break;
-          case 2: __ ldr(result, element_address); break;
-          default: UNREACHABLE();
+          case 1:
+            __ ldrh(result, element_address);
+            break;
+          case 2:
+            __ ldr(result, element_address);
+            break;
+          default:
+            UNREACHABLE();
         }
         break;
       default:
@@ -2068,8 +2086,8 @@
       Label done;
       __ TestImmediate(value, 0xC0000000);
       __ b(&done, EQ);
-      BoxAllocationSlowPath::Allocate(
-          compiler, this, compiler->mint_class(), result, temp);
+      BoxAllocationSlowPath::Allocate(compiler, this, compiler->mint_class(),
+                                      result, temp);
       __ eor(temp, temp, Operand(temp));
       __ StoreToOffset(kWord, value, result,
                        Mint::value_offset() - kHeapObjectTag);
@@ -2085,14 +2103,13 @@
                                                               bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps =
-      (IsUnboxedStore() && opt) ? 2 :
-          ((IsPotentialUnboxedStore()) ? 3 : 0);
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps,
-          ((IsUnboxedStore() && opt && is_initialization()) ||
-           IsPotentialUnboxedStore())
-          ? LocationSummary::kCallOnSlowPath
-          : LocationSummary::kNoCall);
+      (IsUnboxedStore() && opt) ? 2 : ((IsPotentialUnboxedStore()) ? 3 : 0);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps,
+                      ((IsUnboxedStore() && opt && is_initialization()) ||
+                       IsPotentialUnboxedStore())
+                          ? LocationSummary::kCallOnSlowPath
+                          : LocationSummary::kNoCall);
 
   summary->set_in(0, Location::RequiresRegister());
   if (IsUnboxedStore() && opt) {
@@ -2100,17 +2117,16 @@
     summary->set_temp(0, Location::RequiresRegister());
     summary->set_temp(1, Location::RequiresRegister());
   } else if (IsPotentialUnboxedStore()) {
-    summary->set_in(1, ShouldEmitStoreBarrier()
-        ? Location::WritableRegister()
-        : Location::RequiresRegister());
+    summary->set_in(1, ShouldEmitStoreBarrier() ? Location::WritableRegister()
+                                                : Location::RequiresRegister());
     summary->set_temp(0, Location::RequiresRegister());
     summary->set_temp(1, Location::RequiresRegister());
     summary->set_temp(2, opt ? Location::RequiresFpuRegister()
                              : Location::FpuRegisterLocation(Q1));
   } else {
     summary->set_in(1, ShouldEmitStoreBarrier()
-                       ? Location::WritableRegister()
-                       : Location::RegisterOrConstant(value()));
+                           ? Location::WritableRegister()
+                           : Location::RegisterOrConstant(value()));
   }
   return summary;
 }
@@ -2128,8 +2144,7 @@
   __ CompareObject(box_reg, Object::null_object());
   __ b(&done, NE);
 
-  BoxAllocationSlowPath::Allocate(
-      compiler, instruction, cls, box_reg, temp);
+  BoxAllocationSlowPath::Allocate(compiler, instruction, cls, box_reg, temp);
 
   __ MoveRegister(temp, box_reg);
   __ StoreIntoObjectOffset(instance_reg, offset, temp);
@@ -2166,8 +2181,7 @@
           UNREACHABLE();
       }
 
-      BoxAllocationSlowPath::Allocate(
-          compiler, this, *cls, temp, temp2);
+      BoxAllocationSlowPath::Allocate(compiler, this, *cls, temp, temp2);
       __ MoveRegister(temp2, temp);
       __ StoreIntoObjectOffset(instance_reg, offset_in_bytes_, temp2);
     } else {
@@ -2181,12 +2195,12 @@
       case kFloat32x4Cid:
         __ Comment("UnboxedFloat32x4StoreInstanceFieldInstr");
         __ StoreMultipleDToOffset(value, 2, temp,
-            Float32x4::value_offset() - kHeapObjectTag);
+                                  Float32x4::value_offset() - kHeapObjectTag);
         break;
       case kFloat64x2Cid:
         __ Comment("UnboxedFloat64x2StoreInstanceFieldInstr");
         __ StoreMultipleDToOffset(value, 2, temp,
-            Float64x2::value_offset() - kHeapObjectTag);
+                                  Float64x2::value_offset() - kHeapObjectTag);
         break;
       default:
         UNREACHABLE();
@@ -2238,45 +2252,30 @@
     __ b(&store_pointer);
 
     if (!compiler->is_optimizing()) {
-        locs()->live_registers()->Add(locs()->in(0));
-        locs()->live_registers()->Add(locs()->in(1));
+      locs()->live_registers()->Add(locs()->in(0));
+      locs()->live_registers()->Add(locs()->in(1));
     }
 
     {
       __ Bind(&store_double);
-      EnsureMutableBox(compiler,
-                       this,
-                       temp,
-                       compiler->double_class(),
-                       instance_reg,
-                       offset_in_bytes_,
-                       temp2);
+      EnsureMutableBox(compiler, this, temp, compiler->double_class(),
+                       instance_reg, offset_in_bytes_, temp2);
       __ CopyDoubleField(temp, value_reg, TMP, temp2, fpu_temp);
       __ b(&skip_store);
     }
 
     {
       __ Bind(&store_float32x4);
-      EnsureMutableBox(compiler,
-                       this,
-                       temp,
-                       compiler->float32x4_class(),
-                       instance_reg,
-                       offset_in_bytes_,
-                       temp2);
+      EnsureMutableBox(compiler, this, temp, compiler->float32x4_class(),
+                       instance_reg, offset_in_bytes_, temp2);
       __ CopyFloat32x4Field(temp, value_reg, TMP, temp2, fpu_temp);
       __ b(&skip_store);
     }
 
     {
       __ Bind(&store_float64x2);
-      EnsureMutableBox(compiler,
-                       this,
-                       temp,
-                       compiler->float64x2_class(),
-                       instance_reg,
-                       offset_in_bytes_,
-                       temp2);
+      EnsureMutableBox(compiler, this, temp, compiler->float64x2_class(),
+                       instance_reg, offset_in_bytes_, temp2);
       __ CopyFloat64x2Field(temp, value_reg, TMP, temp2, fpu_temp);
       __ b(&skip_store);
     }
@@ -2286,19 +2285,15 @@
 
   if (ShouldEmitStoreBarrier()) {
     const Register value_reg = locs()->in(1).reg();
-    __ StoreIntoObjectOffset(instance_reg,
-                             offset_in_bytes_,
-                             value_reg,
+    __ StoreIntoObjectOffset(instance_reg, offset_in_bytes_, value_reg,
                              CanValueBeSmi());
   } else {
     if (locs()->in(1).IsConstant()) {
-      __ StoreIntoObjectNoBarrierOffset(instance_reg,
-                                        offset_in_bytes_,
+      __ StoreIntoObjectNoBarrierOffset(instance_reg, offset_in_bytes_,
                                         locs()->in(1).constant());
     } else {
       const Register value_reg = locs()->in(1).reg();
-      __ StoreIntoObjectNoBarrierOffset(instance_reg,
-                                        offset_in_bytes_,
+      __ StoreIntoObjectNoBarrierOffset(instance_reg, offset_in_bytes_,
                                         value_reg);
     }
   }
@@ -2310,8 +2305,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -2332,8 +2327,8 @@
 
 LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(Zone* zone,
                                                             bool opt) const {
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, 1, 1, LocationSummary::kNoCall);
+  LocationSummary* locs =
+      new (zone) LocationSummary(zone, 1, 1, LocationSummary::kNoCall);
   locs->set_in(0, value()->NeedsStoreBuffer() ? Location::WritableRegister()
                                               : Location::RequiresRegister());
   locs->set_temp(0, Location::RequiresRegister());
@@ -2347,10 +2342,8 @@
 
   __ LoadObject(temp, Field::ZoneHandle(Z, field().Original()));
   if (this->value()->NeedsStoreBuffer()) {
-    __ StoreIntoObject(temp,
-                       FieldAddress(temp, Field::static_value_offset()),
-                       value,
-                       CanValueBeSmi());
+    __ StoreIntoObject(temp, FieldAddress(temp, Field::static_value_offset()),
+                       value, CanValueBeSmi());
   } else {
     __ StoreIntoObjectNoBarrier(
         temp, FieldAddress(temp, Field::static_value_offset()), value);
@@ -2362,8 +2355,8 @@
                                                       bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(R0));
   summary->set_in(1, Location::RegisterLocation(R1));
   summary->set_out(0, Location::RegisterLocation(R0));
@@ -2375,10 +2368,7 @@
   ASSERT(locs()->in(0).reg() == R0);  // Value.
   ASSERT(locs()->in(1).reg() == R1);  // Instantiator type arguments.
 
-  compiler->GenerateInstanceOf(token_pos(),
-                               deopt_id(),
-                               type(),
-                               negate_result(),
+  compiler->GenerateInstanceOf(token_pos(), deopt_id(), type(), negate_result(),
                                locs());
   ASSERT(locs()->out(0).reg() == R0);
 }
@@ -2388,8 +2378,8 @@
                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(kElementTypePos, Location::RegisterLocation(R1));
   locs->set_in(kLengthPos, Location::RegisterLocation(R2));
   locs->set_out(0, Location::RegisterLocation(R0));
@@ -2399,9 +2389,9 @@
 
 // Inlines array allocation for known constant values.
 static void InlineArrayAllocation(FlowGraphCompiler* compiler,
-                                   intptr_t num_elements,
-                                   Label* slow_path,
-                                   Label* done) {
+                                  intptr_t num_elements,
+                                  Label* slow_path,
+                                  Label* done) {
   const int kInlineArraySize = 12;  // Same as kInlineInstanceSize.
   const Register kLengthReg = R2;
   const Register kElemTypeReg = R1;
@@ -2410,19 +2400,16 @@
   __ TryAllocateArray(kArrayCid, instance_size, slow_path,
                       R0,  // instance
                       R3,  // end address
-                      R8,
-                      R6);
+                      R8, R6);
   // R0: new object start as a tagged pointer.
   // R3: new object end address.
 
   // Store the type argument field.
-  __ StoreIntoObjectNoBarrier(R0,
-                              FieldAddress(R0, Array::type_arguments_offset()),
-                              kElemTypeReg);
+  __ StoreIntoObjectNoBarrier(
+      R0, FieldAddress(R0, Array::type_arguments_offset()), kElemTypeReg);
 
   // Set the length field.
-  __ StoreIntoObjectNoBarrier(R0,
-                              FieldAddress(R0, Array::length_offset()),
+  __ StoreIntoObjectNoBarrier(R0, FieldAddress(R0, Array::length_offset()),
                               kLengthReg);
 
   // Initialize all array elements to raw_null.
@@ -2462,8 +2449,7 @@
   ASSERT(locs()->in(kElementTypePos).reg() == kElemTypeReg);
   ASSERT(locs()->in(kLengthPos).reg() == kLengthReg);
 
-  if (compiler->is_optimizing() &&
-      !FLAG_precompiled_mode &&
+  if (compiler->is_optimizing() && !FLAG_precompiled_mode &&
       num_elements()->BindsToConstant() &&
       num_elements()->BoundConstant().IsSmi()) {
     const intptr_t length = Smi::Cast(num_elements()->BoundConstant()).Value();
@@ -2472,13 +2458,10 @@
       InlineArrayAllocation(compiler, length, &slow_path, &done);
       __ Bind(&slow_path);
       __ PushObject(Object::null_object());  // Make room for the result.
-      __ Push(kLengthReg);  // length.
+      __ Push(kLengthReg);                   // length.
       __ Push(kElemTypeReg);
-      compiler->GenerateRuntimeCall(token_pos(),
-                                    deopt_id(),
-                                    kAllocateArrayRuntimeEntry,
-                                    2,
-                                    locs());
+      compiler->GenerateRuntimeCall(token_pos(), deopt_id(),
+                                    kAllocateArrayRuntimeEntry, 2, locs());
       __ Drop(2);
       __ Pop(kResultReg);
       __ Bind(&done);
@@ -2488,10 +2471,8 @@
   const Code& stub = Code::ZoneHandle(compiler->zone(),
                                       StubCode::AllocateArray_entry()->code());
   compiler->AddStubCallTarget(stub);
-  compiler->GenerateCall(token_pos(),
-                         *StubCode::AllocateArray_entry(),
-                         RawPcDescriptors::kOther,
-                         locs());
+  compiler->GenerateCall(token_pos(), *StubCode::AllocateArray_entry(),
+                         RawPcDescriptors::kOther, locs());
   ASSERT(locs()->out(0).reg() == kResultReg);
 }
 
@@ -2500,14 +2481,12 @@
                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps =
-      (IsUnboxedLoad() && opt) ? 1 :
-          ((IsPotentialUnboxedLoad()) ? 3 : 0);
+      (IsUnboxedLoad() && opt) ? 1 : ((IsPotentialUnboxedLoad()) ? 3 : 0);
 
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps,
-          (opt && !IsPotentialUnboxedLoad())
-          ? LocationSummary::kNoCall
-          : LocationSummary::kCallOnSlowPath);
+  LocationSummary* locs = new (zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, (opt && !IsPotentialUnboxedLoad())
+                                       ? LocationSummary::kNoCall
+                                       : LocationSummary::kCallOnSlowPath);
 
   locs->set_in(0, Location::RequiresRegister());
 
@@ -2542,12 +2521,12 @@
       case kFloat32x4Cid:
         __ Comment("UnboxedFloat32x4LoadFieldInstr");
         __ LoadMultipleDFromOffset(result, 2, temp,
-            Float32x4::value_offset() - kHeapObjectTag);
+                                   Float32x4::value_offset() - kHeapObjectTag);
         break;
       case kFloat64x2Cid:
         __ Comment("UnboxedFloat64x2LoadFieldInstr");
         __ LoadMultipleDFromOffset(result, 2, temp,
-            Float64x2::value_offset() - kHeapObjectTag);
+                                   Float64x2::value_offset() - kHeapObjectTag);
         break;
       default:
         UNREACHABLE();
@@ -2598,12 +2577,8 @@
 
     {
       __ Bind(&load_double);
-      BoxAllocationSlowPath::Allocate(
-          compiler,
-          this,
-          compiler->double_class(),
-          result_reg,
-          temp);
+      BoxAllocationSlowPath::Allocate(compiler, this, compiler->double_class(),
+                                      result_reg, temp);
       __ ldr(temp, FieldAddress(instance_reg, offset_in_bytes()));
       __ CopyDoubleField(result_reg, temp, TMP, temp2, value);
       __ b(&done);
@@ -2612,11 +2587,7 @@
     {
       __ Bind(&load_float32x4);
       BoxAllocationSlowPath::Allocate(
-          compiler,
-          this,
-          compiler->float32x4_class(),
-          result_reg,
-          temp);
+          compiler, this, compiler->float32x4_class(), result_reg, temp);
       __ ldr(temp, FieldAddress(instance_reg, offset_in_bytes()));
       __ CopyFloat32x4Field(result_reg, temp, TMP, temp2, value);
       __ b(&done);
@@ -2625,11 +2596,7 @@
     {
       __ Bind(&load_float64x2);
       BoxAllocationSlowPath::Allocate(
-          compiler,
-          this,
-          compiler->float64x2_class(),
-          result_reg,
-          temp);
+          compiler, this, compiler->float64x2_class(), result_reg, temp);
       __ ldr(temp, FieldAddress(instance_reg, offset_in_bytes()));
       __ CopyFloat64x2Field(result_reg, temp, TMP, temp2, value);
       __ b(&done);
@@ -2646,8 +2613,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(R0));
   locs->set_out(0, Location::RegisterLocation(R0));
   return locs;
@@ -2663,23 +2630,21 @@
   __ PushObject(Object::null_object());  // Make room for the result.
   __ PushObject(type());
   __ Push(instantiator_reg);  // Push instantiator type arguments.
-  compiler->GenerateRuntimeCall(token_pos(),
-                                deopt_id(),
-                                kInstantiateTypeRuntimeEntry,
-                                2,
-                                locs());
-  __ Drop(2);  // Drop instantiator and uninstantiated type.
+  compiler->GenerateRuntimeCall(token_pos(), deopt_id(),
+                                kInstantiateTypeRuntimeEntry, 2, locs());
+  __ Drop(2);          // Drop instantiator and uninstantiated type.
   __ Pop(result_reg);  // Pop instantiated type.
   ASSERT(instantiator_reg == result_reg);
 }
 
 
 LocationSummary* InstantiateTypeArgumentsInstr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(R0));
   locs->set_out(0, Location::RegisterLocation(R0));
   return locs;
@@ -2732,12 +2697,10 @@
   __ PushObject(Object::null_object());  // Make room for the result.
   __ PushObject(type_arguments());
   __ Push(instantiator_reg);  // Push instantiator type arguments.
-  compiler->GenerateRuntimeCall(token_pos(),
-                                deopt_id(),
-                                kInstantiateTypeArgumentsRuntimeEntry,
-                                2,
+  compiler->GenerateRuntimeCall(token_pos(), deopt_id(),
+                                kInstantiateTypeArgumentsRuntimeEntry, 2,
                                 locs());
-  __ Drop(2);  // Drop instantiator and uninstantiated type arguments.
+  __ Drop(2);          // Drop instantiator and uninstantiated type arguments.
   __ Pop(result_reg);  // Pop instantiated type arguments.
   __ Bind(&type_arguments_instantiated);
 }
@@ -2749,7 +2712,7 @@
   ASSERT(opt);
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 3;
-  LocationSummary* locs = new(zone) LocationSummary(
+  LocationSummary* locs = new (zone) LocationSummary(
       zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   locs->set_temp(0, Location::RegisterLocation(R1));
   locs->set_temp(1, Location::RegisterLocation(R2));
@@ -2763,7 +2726,7 @@
  public:
   explicit AllocateContextSlowPath(
       AllocateUninitializedContextInstr* instruction)
-      : instruction_(instruction) { }
+      : instruction_(instruction) {}
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     __ Comment("AllocateContextSlowPath");
@@ -2780,8 +2743,7 @@
     compiler->AddStubCallTarget(stub);
     compiler->GenerateCall(instruction_->token_pos(),
                            *StubCode::AllocateContext_entry(),
-                           RawPcDescriptors::kOther,
-                           locs);
+                           RawPcDescriptors::kOther, locs);
     ASSERT(instruction_->locs()->out(0).reg() == R0);
     compiler->RestoreLiveRegisters(instruction_->locs());
     __ b(exit_label());
@@ -2805,9 +2767,7 @@
 
   __ TryAllocateArray(kContextCid, instance_size, slow_path->entry_label(),
                       result,  // instance
-                      temp0,
-                      temp1,
-                      temp2);
+                      temp0, temp1, temp2);
 
   // Setup up number of context variables field.
   __ LoadImmediate(temp0, num_context_variables());
@@ -2821,8 +2781,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 1;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_temp(0, Location::RegisterLocation(R1));
   locs->set_out(0, Location::RegisterLocation(R0));
   return locs;
@@ -2834,10 +2794,8 @@
   ASSERT(locs()->out(0).reg() == R0);
 
   __ LoadImmediate(R1, num_context_variables());
-  compiler->GenerateCall(token_pos(),
-                         *StubCode::AllocateContext_entry(),
-                         RawPcDescriptors::kOther,
-                         locs());
+  compiler->GenerateCall(token_pos(), *StubCode::AllocateContext_entry(),
+                         RawPcDescriptors::kOther, locs());
 }
 
 
@@ -2845,8 +2803,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(R0));
   locs->set_temp(0, Location::RegisterLocation(R1));
   return locs;
@@ -2868,11 +2826,8 @@
   __ Bind(&call_runtime);
   __ PushObject(Object::null_object());  // Make room for (unused) result.
   __ Push(field);
-  compiler->GenerateRuntimeCall(token_pos(),
-                                deopt_id(),
-                                kInitStaticFieldRuntimeEntry,
-                                1,
-                                locs());
+  compiler->GenerateRuntimeCall(token_pos(), deopt_id(),
+                                kInitStaticFieldRuntimeEntry, 1, locs());
   __ Drop(2);  // Remove argument and result placeholder.
   __ Bind(&no_call);
 }
@@ -2882,8 +2837,8 @@
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(R0));
   locs->set_out(0, Location::RegisterLocation(R0));
   return locs;
@@ -2896,12 +2851,9 @@
 
   __ PushObject(Object::null_object());  // Make room for the result.
   __ Push(context_value);
-  compiler->GenerateRuntimeCall(token_pos(),
-                                deopt_id(),
-                                kCloneContextRuntimeEntry,
-                                1,
-                                locs());
-  __ Drop(1);  // Remove argument.
+  compiler->GenerateRuntimeCall(token_pos(), deopt_id(),
+                                kCloneContextRuntimeEntry, 1, locs());
+  __ Drop(1);      // Remove argument.
   __ Pop(result);  // Get result (cloned context).
 }
 
@@ -2915,19 +2867,16 @@
 
 void CatchBlockEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   __ Bind(compiler->GetJumpLabel(this));
-  compiler->AddExceptionHandler(catch_try_index(),
-                                try_index(),
+  compiler->AddExceptionHandler(catch_try_index(), try_index(),
                                 compiler->assembler()->CodeSize(),
-                                catch_handler_types_,
-                                needs_stacktrace());
+                                catch_handler_types_, needs_stacktrace());
   // On lazy deoptimization we patch the optimized code here to enter the
   // deoptimization stub.
   const intptr_t deopt_id = Thread::ToDeoptAfter(GetDeoptId());
   if (compiler->is_optimizing()) {
     compiler->AddDeoptIndexAtCall(deopt_id);
   } else {
-    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
-                                   deopt_id,
+    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, deopt_id,
                                    TokenPosition::kNoSource);
   }
   if (HasParallelMove()) {
@@ -2969,10 +2918,10 @@
                              Context::variable_offset(stacktrace_var().index()),
                              kStackTraceObjectReg);
   } else {
-    __ StoreToOffset(kWord, kExceptionObjectReg,
-                     FP, exception_var().index() * kWordSize);
-    __ StoreToOffset(kWord, kStackTraceObjectReg,
-                     FP, stacktrace_var().index() * kWordSize);
+    __ StoreToOffset(kWord, kExceptionObjectReg, FP,
+                     exception_var().index() * kWordSize);
+    __ StoreToOffset(kWord, kStackTraceObjectReg, FP,
+                     stacktrace_var().index() * kWordSize);
   }
 }
 
@@ -2981,10 +2930,8 @@
                                                               bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs,
-                          kNumTemps,
-                          LocationSummary::kCallOnSlowPath);
+  LocationSummary* summary = new (zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   summary->set_temp(0, Location::RequiresRegister());
   return summary;
 }
@@ -2993,7 +2940,7 @@
 class CheckStackOverflowSlowPath : public SlowPathCode {
  public:
   explicit CheckStackOverflowSlowPath(CheckStackOverflowInstr* instruction)
-      : instruction_(instruction) { }
+      : instruction_(instruction) {}
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     if (FLAG_use_osr && osr_entry_label()->IsLinked()) {
@@ -3011,11 +2958,9 @@
     ASSERT(compiler->pending_deoptimization_env_ == NULL);
     Environment* env = compiler->SlowPathEnvironmentFor(instruction_);
     compiler->pending_deoptimization_env_ = env;
-    compiler->GenerateRuntimeCall(instruction_->token_pos(),
-                                  instruction_->deopt_id(),
-                                  kStackOverflowRuntimeEntry,
-                                  0,
-                                  instruction_->locs());
+    compiler->GenerateRuntimeCall(
+        instruction_->token_pos(), instruction_->deopt_id(),
+        kStackOverflowRuntimeEntry, 0, instruction_->locs());
 
     if (FLAG_use_osr && !compiler->is_optimizing() && instruction_->in_loop()) {
       // In unoptimized code, record loop stack checks as possible OSR entries.
@@ -3070,9 +3015,10 @@
   const LocationSummary& locs = *shift_left->locs();
   const Register left = locs.in(0).reg();
   const Register result = locs.out(0).reg();
-  Label* deopt = shift_left->CanDeoptimize() ?
-      compiler->AddDeoptStub(shift_left->deopt_id(), ICData::kDeoptBinarySmiOp)
-      : NULL;
+  Label* deopt = shift_left->CanDeoptimize()
+                     ? compiler->AddDeoptStub(shift_left->deopt_id(),
+                                              ICData::kDeoptBinarySmiOp)
+                     : NULL;
   if (locs.in(1).IsConstant()) {
     const Object& constant = locs.in(1).constant();
     ASSERT(constant.IsSmi());
@@ -3162,7 +3108,7 @@
 class CheckedSmiSlowPath : public SlowPathCode {
  public:
   CheckedSmiSlowPath(CheckedSmiOpInstr* instruction, intptr_t try_index)
-      : instruction_(instruction), try_index_(try_index) { }
+      : instruction_(instruction), try_index_(try_index) {}
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     if (Assembler::EmittingComments()) {
@@ -3177,12 +3123,9 @@
     __ Push(locs->in(0).reg());
     __ Push(locs->in(1).reg());
     compiler->EmitMegamorphicInstanceCall(
-        *instruction_->call()->ic_data(),
-        instruction_->call()->ArgumentCount(),
-        instruction_->call()->deopt_id(),
-        instruction_->call()->token_pos(),
-        locs,
-        try_index_,
+        *instruction_->call()->ic_data(), instruction_->call()->ArgumentCount(),
+        instruction_->call()->deopt_id(), instruction_->call()->token_pos(),
+        locs, try_index_,
         /* slow_path_argument_count = */ 2);
     __ mov(result, Operand(R0));
     compiler->RestoreLiveRegisters(locs);
@@ -3199,7 +3142,7 @@
                                                         bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
+  LocationSummary* summary = new (zone) LocationSummary(
       zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
@@ -3259,6 +3202,30 @@
     case Token::kBIT_XOR:
       __ eor(result, left, Operand(right));
       break;
+    case Token::kSHL:
+      ASSERT(result != left);
+      ASSERT(result != right);
+      __ CompareImmediate(right, Smi::RawValue(Smi::kBits));
+      __ b(slow_path->entry_label(), HI);
+
+      __ SmiUntag(TMP, right);
+      // Check for overflow by shifting left and shifting back arithmetically.
+      // If the result is different from the original, there was overflow.
+      __ Lsl(result, left, TMP);
+      __ cmp(left, Operand(result, ASR, TMP));
+      __ b(slow_path->entry_label(), NE);
+      break;
+    case Token::kSHR:
+      ASSERT(result != left);
+      ASSERT(result != right);
+      __ CompareImmediate(right, Smi::RawValue(Smi::kBits));
+      __ b(slow_path->entry_label(), HI);
+
+      __ SmiUntag(result, right);
+      __ SmiUntag(TMP, left);
+      __ Asr(result, TMP, result);
+      __ SmiTag(result);
+      break;
     default:
       UNREACHABLE();
   }
@@ -3275,7 +3242,7 @@
       : instruction_(instruction),
         try_index_(try_index),
         labels_(labels),
-        merged_(merged) { }
+        merged_(merged) {}
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     if (Assembler::EmittingComments()) {
@@ -3290,21 +3257,19 @@
     __ Push(locs->in(0).reg());
     __ Push(locs->in(1).reg());
     compiler->EmitMegamorphicInstanceCall(
-        *instruction_->call()->ic_data(),
-        instruction_->call()->ArgumentCount(),
-        instruction_->call()->deopt_id(),
-        instruction_->call()->token_pos(),
-        locs,
-        try_index_,
+        *instruction_->call()->ic_data(), instruction_->call()->ArgumentCount(),
+        instruction_->call()->deopt_id(), instruction_->call()->token_pos(),
+        locs, try_index_,
         /* slow_path_argument_count = */ 2);
     __ mov(result, Operand(R0));
     compiler->RestoreLiveRegisters(locs);
     if (merged_) {
       __ CompareObject(result, Bool::True());
-      __ b(instruction_->is_negated()
-           ? labels_.false_label : labels_.true_label, EQ);
-      __ b(instruction_->is_negated()
-           ? labels_.true_label : labels_.false_label);
+      __ b(
+          instruction_->is_negated() ? labels_.false_label : labels_.true_label,
+          EQ);
+      __ b(instruction_->is_negated() ? labels_.true_label
+                                      : labels_.false_label);
     } else {
       __ b(exit_label());
     }
@@ -3319,10 +3284,11 @@
 
 
 LocationSummary* CheckedSmiComparisonInstr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(zone) LocationSummary(
+  LocationSummary* summary = new (zone) LocationSummary(
       zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
@@ -3333,7 +3299,8 @@
 
 
 Condition CheckedSmiComparisonInstr::EmitComparisonCode(
-    FlowGraphCompiler* compiler, BranchLabels labels) {
+    FlowGraphCompiler* compiler,
+    BranchLabels labels) {
   return EmitSmiComparisonOp(compiler, locs(), kind());
 }
 
@@ -3360,11 +3327,9 @@
 void CheckedSmiComparisonInstr::EmitBranchCode(FlowGraphCompiler* compiler,
                                                BranchInstr* branch) {
   BranchLabels labels = compiler->CreateBranchLabels(branch);
-  CheckedSmiComparisonSlowPath* slow_path =
-      new CheckedSmiComparisonSlowPath(this,
-                                       compiler->CurrentTryIndex(),
-                                       labels,
-                                       /* merged = */ true);
+  CheckedSmiComparisonSlowPath* slow_path = new CheckedSmiComparisonSlowPath(
+      this, compiler->CurrentTryIndex(), labels,
+      /* merged = */ true);
   compiler->AddSlowPathCode(slow_path);
   EMIT_SMI_CHECK;
   Condition true_condition = EmitComparisonCode(compiler, labels);
@@ -3374,12 +3339,10 @@
 
 
 void CheckedSmiComparisonInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  BranchLabels labels = { NULL, NULL, NULL };
-  CheckedSmiComparisonSlowPath* slow_path =
-      new CheckedSmiComparisonSlowPath(this,
-                                       compiler->CurrentTryIndex(),
-                                       labels,
-                                       /* merged = */ false);
+  BranchLabels labels = {NULL, NULL, NULL};
+  CheckedSmiComparisonSlowPath* slow_path = new CheckedSmiComparisonSlowPath(
+      this, compiler->CurrentTryIndex(), labels,
+      /* merged = */ false);
   compiler->AddSlowPathCode(slow_path);
   EMIT_SMI_CHECK;
   Condition true_condition = EmitComparisonCode(compiler, labels);
@@ -3408,8 +3371,8 @@
              (op_kind() == Token::kSHR)) {
     num_temps = 1;
   }
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, num_temps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, num_temps, LocationSummary::kNoCall);
   if (op_kind() == Token::kTRUNCDIV) {
     summary->set_in(0, Location::RequiresRegister());
     if (RightIsPowerOfTwoConstant()) {
@@ -3556,7 +3519,7 @@
         const intptr_t kCountLimit = 0x1F;
         intptr_t value = Smi::Cast(constant).Value();
         __ Asr(result, left,
-            Operand(Utils::Minimum(value + kSmiTagSize, kCountLimit)));
+               Operand(Utils::Minimum(value + kSmiTagSize, kCountLimit)));
         __ SmiTag(result);
         break;
       }
@@ -3713,9 +3676,10 @@
   const LocationSummary& locs = *shift_left->locs();
   const Register left = locs.in(0).reg();
   const Register result = locs.out(0).reg();
-  Label* deopt = shift_left->CanDeoptimize() ?
-      compiler->AddDeoptStub(shift_left->deopt_id(), ICData::kDeoptBinarySmiOp)
-      : NULL;
+  Label* deopt = shift_left->CanDeoptimize()
+                     ? compiler->AddDeoptStub(shift_left->deopt_id(),
+                                              ICData::kDeoptBinarySmiOp)
+                     : NULL;
   ASSERT(locs.in(1).IsConstant());
   const Object& constant = locs.in(1).constant();
   ASSERT(constant.IsSmi());
@@ -3743,8 +3707,8 @@
       (op_kind() == Token::kSHR)) {
     num_temps = 1;
   }
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, num_temps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, num_temps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RegisterOrSmiConstant(right()));
   if (((op_kind() == Token::kSHL) && can_overflow()) ||
@@ -3918,8 +3882,8 @@
   ASSERT((left_cid != kDoubleCid) && (right_cid != kDoubleCid));
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   return summary;
@@ -3927,9 +3891,9 @@
 
 
 void CheckEitherNonSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label* deopt = compiler->AddDeoptStub(deopt_id(),
-                                        ICData::kDeoptBinaryDoubleOp,
-                                        licm_hoisted_ ? ICData::kHoisted : 0);
+  Label* deopt =
+      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryDoubleOp,
+                             licm_hoisted_ ? ICData::kHoisted : 0);
   intptr_t left_cid = left()->Type()->ToCid();
   intptr_t right_cid = right()->Type()->ToCid();
   const Register left = locs()->in(0).reg();
@@ -3948,14 +3912,11 @@
 }
 
 
-LocationSummary* BoxInstr::MakeLocationSummary(Zone* zone,
-                                                     bool opt) const {
+LocationSummary* BoxInstr::MakeLocationSummary(Zone* zone, bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs,
-                          kNumTemps,
-                          LocationSummary::kCallOnSlowPath);
+  LocationSummary* summary = new (zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_temp(0, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresRegister());
@@ -3967,23 +3928,19 @@
   const Register out_reg = locs()->out(0).reg();
   const DRegister value = EvenDRegisterOf(locs()->in(0).fpu_reg());
 
-  BoxAllocationSlowPath::Allocate(
-      compiler,
-      this,
-      compiler->BoxClassFor(from_representation()),
-      out_reg,
-      locs()->temp(0).reg());
+  BoxAllocationSlowPath::Allocate(compiler, this,
+                                  compiler->BoxClassFor(from_representation()),
+                                  out_reg, locs()->temp(0).reg());
 
   switch (from_representation()) {
     case kUnboxedDouble:
-      __ StoreDToOffset(
-          value, out_reg, ValueOffset() - kHeapObjectTag);
+      __ StoreDToOffset(value, out_reg, ValueOffset() - kHeapObjectTag);
       break;
     case kUnboxedFloat32x4:
     case kUnboxedFloat64x2:
     case kUnboxedInt32x4:
-      __ StoreMultipleDToOffset(
-          value, 2, out_reg, ValueOffset() - kHeapObjectTag);
+      __ StoreMultipleDToOffset(value, 2, out_reg,
+                                ValueOffset() - kHeapObjectTag);
       break;
     default:
       UNREACHABLE();
@@ -3992,13 +3949,12 @@
 }
 
 
-LocationSummary* UnboxInstr::MakeLocationSummary(Zone* zone,
-                                                       bool opt) const {
+LocationSummary* UnboxInstr::MakeLocationSummary(Zone* zone, bool opt) const {
   const bool needs_temp = CanDeoptimize();
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = needs_temp ? 1 : 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   if (needs_temp) {
     summary->set_temp(0, Location::RequiresRegister());
@@ -4019,21 +3975,15 @@
   switch (representation()) {
     case kUnboxedMint: {
       PairLocation* result = locs()->out(0).AsPairLocation();
-      __ LoadFieldFromOffset(kWord,
-                             result->At(0).reg(),
-                             box,
-                             ValueOffset());
-      __ LoadFieldFromOffset(kWord,
-                             result->At(1).reg(),
-                             box,
+      __ LoadFieldFromOffset(kWord, result->At(0).reg(), box, ValueOffset());
+      __ LoadFieldFromOffset(kWord, result->At(1).reg(), box,
                              ValueOffset() + kWordSize);
       break;
     }
 
     case kUnboxedDouble: {
       const DRegister result = EvenDRegisterOf(locs()->out(0).fpu_reg());
-      __ LoadDFromOffset(
-          result, box, ValueOffset() - kHeapObjectTag);
+      __ LoadDFromOffset(result, box, ValueOffset() - kHeapObjectTag);
       break;
     }
 
@@ -4041,8 +3991,8 @@
     case kUnboxedFloat64x2:
     case kUnboxedInt32x4: {
       const DRegister result = EvenDRegisterOf(locs()->out(0).fpu_reg());
-      __ LoadMultipleDFromOffset(
-          result, 2, box, ValueOffset() - kHeapObjectTag);
+      __ LoadMultipleDFromOffset(result, 2, box,
+                                 ValueOffset() - kHeapObjectTag);
       break;
     }
 
@@ -4090,8 +4040,8 @@
   } else {
     const Register box = locs()->in(0).reg();
     const Register temp = locs()->temp(0).reg();
-    Label* deopt = compiler->AddDeoptStub(GetDeoptId(),
-                                          ICData::kDeoptCheckClass);
+    Label* deopt =
+        compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptCheckClass);
     Label is_smi;
 
     if ((value()->Type()->ToNullableCid() == box_cid) &&
@@ -4119,17 +4069,15 @@
 
 
 LocationSummary* BoxInteger32Instr::MakeLocationSummary(Zone* zone,
-                                                   bool opt) const {
+                                                        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(zone) LocationSummary(
-      zone,
-      kNumInputs,
-      kNumTemps,
-      ValueFitsSmi() ? LocationSummary::kNoCall
-                     : LocationSummary::kCallOnSlowPath);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps,
+                      ValueFitsSmi() ? LocationSummary::kNoCall
+                                     : LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresRegister());
   if (!ValueFitsSmi()) {
     summary->set_temp(0, Location::RequiresRegister());
@@ -4157,25 +4105,16 @@
       __ TestImmediate(value, 0xC0000000);
     }
     __ b(&done, EQ);
-    BoxAllocationSlowPath::Allocate(
-        compiler,
-        this,
-        compiler->mint_class(),
-        out,
-        temp);
+    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,
+    __ StoreToOffset(kWord, value, out, Mint::value_offset() - kHeapObjectTag);
+    __ StoreToOffset(kWord, temp, out,
                      Mint::value_offset() - kHeapObjectTag + kWordSize);
     __ Bind(&done);
   }
@@ -4186,12 +4125,10 @@
                                                     bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = ValueFitsSmi() ? 0 : 1;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone,
-      kNumInputs,
-      kNumTemps,
-      ValueFitsSmi() ? LocationSummary::kNoCall
-                     : LocationSummary::kCallOnSlowPath);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps,
+                      ValueFitsSmi() ? LocationSummary::kNoCall
+                                     : LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::Pair(Location::RequiresRegister(),
                                     Location::RequiresRegister()));
   if (!ValueFitsSmi()) {
@@ -4223,19 +4160,11 @@
   __ cmp(value_hi, Operand(out_reg, ASR, 31), EQ);
   __ b(&done, EQ);
 
-  BoxAllocationSlowPath::Allocate(
-      compiler,
-      this,
-      compiler->mint_class(),
-      out_reg,
-      tmp);
-  __ StoreToOffset(kWord,
-                   value_lo,
-                   out_reg,
+  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,
+  __ StoreToOffset(kWord, value_hi, out_reg,
                    Mint::value_offset() - kHeapObjectTag + kWordSize);
   __ Bind(&done);
 }
@@ -4248,10 +4177,7 @@
                               Label* deopt) {
   __ LoadFieldFromOffset(kWord, result, mint, Mint::value_offset());
   if (deopt != NULL) {
-    __ LoadFieldFromOffset(kWord,
-                           temp,
-                           mint,
-                           Mint::value_offset() + kWordSize);
+    __ LoadFieldFromOffset(kWord, temp, mint, Mint::value_offset() + kWordSize);
     __ cmp(temp, Operand(result, ASR, kBitsPerWord - 1));
     __ b(deopt, NE);
   }
@@ -4265,8 +4191,8 @@
   ASSERT((representation() != kUnboxedUint32) || is_truncating());
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = CanDeoptimize() ? 1 : 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   if (kNumTemps > 0) {
     summary->set_temp(0, Location::RequiresRegister());
@@ -4281,8 +4207,10 @@
   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* deopt =
+      CanDeoptimize()
+          ? compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptUnboxInteger)
+          : NULL;
   Label* out_of_range = !is_truncating() ? deopt : NULL;
   ASSERT(value != out);
 
@@ -4310,8 +4238,8 @@
                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -4324,11 +4252,20 @@
   const DRegister right = EvenDRegisterOf(locs()->in(1).fpu_reg());
   const DRegister result = EvenDRegisterOf(locs()->out(0).fpu_reg());
   switch (op_kind()) {
-    case Token::kADD: __ vaddd(result, left, right); break;
-    case Token::kSUB: __ vsubd(result, left, right); break;
-    case Token::kMUL: __ vmuld(result, left, right); break;
-    case Token::kDIV: __ vdivd(result, left, right); break;
-    default: UNREACHABLE();
+    case Token::kADD:
+      __ vaddd(result, left, right);
+      break;
+    case Token::kSUB:
+      __ vsubd(result, left, right);
+      break;
+    case Token::kMUL:
+      __ vmuld(result, left, right);
+      break;
+    case Token::kDIV:
+      __ vdivd(result, left, right);
+      break;
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -4338,8 +4275,8 @@
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps =
       (op_kind() == MethodRecognizer::kDouble_getIsInfinite) ? 1 : 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   if (op_kind() == MethodRecognizer::kDouble_getIsInfinite) {
     summary->set_temp(0, Location::RequiresRegister());
@@ -4386,7 +4323,7 @@
 void DoubleTestOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   ASSERT(compiler->is_optimizing());
   Label is_true, is_false;
-  BranchLabels labels = { &is_true, &is_false, &is_false };
+  BranchLabels labels = {&is_true, &is_false, &is_false};
   Condition true_condition = EmitComparisonCode(compiler, labels);
   const Register result = locs()->out(0).reg();
   if (op_kind() == MethodRecognizer::kDouble_getIsNaN) {
@@ -4410,8 +4347,8 @@
                                                              bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -4425,11 +4362,20 @@
   const QRegister result = locs()->out(0).fpu_reg();
 
   switch (op_kind()) {
-    case Token::kADD: __ vaddqs(result, left, right); break;
-    case Token::kSUB: __ vsubqs(result, left, right); break;
-    case Token::kMUL: __ vmulqs(result, left, right); break;
-    case Token::kDIV: __ Vdivqs(result, left, right); break;
-    default: UNREACHABLE();
+    case Token::kADD:
+      __ vaddqs(result, left, right);
+      break;
+    case Token::kSUB:
+      __ vsubqs(result, left, right);
+      break;
+    case Token::kMUL:
+      __ vmulqs(result, left, right);
+      break;
+    case Token::kDIV:
+      __ Vdivqs(result, left, right);
+      break;
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -4438,8 +4384,8 @@
                                                              bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -4478,7 +4424,8 @@
       __ vdivd(result0, left0, right0);
       __ vdivd(result1, left1, right1);
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -4487,8 +4434,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   // Low (< Q7) Q registers are needed for the vcvtds and vmovs instructions.
   summary->set_in(0, Location::FpuRegisterLocation(Q5));
   summary->set_out(0, Location::FpuRegisterLocation(Q6));
@@ -4540,7 +4487,7 @@
         __ vdup(kWord, result, dvalue0, 1);
       } else if (mask_ == 0xAA) {
         __ vdup(kWord, result, dvalue1, 0);
-      } else  if (mask_ == 0xFF) {
+      } else if (mask_ == 0xFF) {
         __ vdup(kWord, result, dvalue1, 1);
       } else {
         // TODO(zra): Investigate better instruction sequences for other
@@ -4559,7 +4506,8 @@
         __ vmovs(sresult3, svalues[(mask_ >> 6) & 0x3]);
       }
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -4568,8 +4516,8 @@
                                                               bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   // Low (< Q7) Q registers are needed for the vcvtds and vmovs instructions.
   summary->set_in(0, Location::FpuRegisterLocation(Q4));
   summary->set_in(1, Location::FpuRegisterLocation(Q5));
@@ -4616,7 +4564,8 @@
       __ vmovs(sresult2, right_svalues[(mask_ >> 4) & 0x3]);
       __ vmovs(sresult3, right_svalues[(mask_ >> 6) & 0x3]);
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -4625,8 +4574,8 @@
                                                                bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::FpuRegisterLocation(Q5));
   summary->set_temp(0, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresRegister());
@@ -4663,11 +4612,12 @@
 
 
 LocationSummary* Float32x4ConstructorInstr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   const intptr_t kNumInputs = 4;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_in(2, Location::RequiresFpuRegister());
@@ -4699,8 +4649,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
 }
@@ -4716,8 +4666,8 @@
                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -4742,8 +4692,8 @@
                                                                bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -4778,7 +4728,8 @@
       __ vcgeqs(result, right, left);
       break;
 
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -4787,8 +4738,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -4808,7 +4759,8 @@
     case MethodRecognizer::kFloat32x4Max:
       __ vmaxqs(result, left, right);
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -4817,8 +4769,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   summary->set_temp(0, Location::RequiresFpuRegister());
@@ -4841,7 +4793,8 @@
     case MethodRecognizer::kFloat32x4ReciprocalSqrt:
       __ VreciprocalSqrtqs(result, left);
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -4850,8 +4803,8 @@
                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -4870,7 +4823,8 @@
       __ vdup(kWord, result, DTMP, 0);
       __ vmulqs(result, result, right);
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -4879,8 +4833,8 @@
                                                             bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -4898,7 +4852,8 @@
     case MethodRecognizer::kFloat32x4Absolute:
       __ vabsqs(result, left);
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -4907,8 +4862,8 @@
                                                           bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_in(2, Location::RequiresFpuRegister());
@@ -4931,8 +4886,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   // Low (< 7) Q registers are needed for the vmovs instruction.
@@ -4971,7 +4926,8 @@
     case MethodRecognizer::kFloat32x4WithW:
       __ vmovs(sresult3, STMP);
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -4980,8 +4936,8 @@
                                                               bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -5002,8 +4958,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -5027,7 +4983,8 @@
     case MethodRecognizer::kFloat64x2GetY:
       __ vmovd(dresult0, dvalue1);
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -5036,8 +4993,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
 }
@@ -5053,8 +5010,8 @@
                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -5078,11 +5035,12 @@
 
 
 LocationSummary* Float64x2ConstructorInstr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -5107,11 +5065,12 @@
 
 
 LocationSummary* Float64x2ToFloat32x4Instr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   // Low (< 7) Q registers are needed for the vcvtsd instruction.
   summary->set_out(0, Location::FpuRegisterLocation(Q6));
@@ -5138,11 +5097,12 @@
 
 
 LocationSummary* Float32x4ToFloat64x2Instr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   // Low (< 7) Q registers are needed for the vcvtsd instruction.
   summary->set_out(0, Location::FpuRegisterLocation(Q6));
@@ -5170,8 +5130,8 @@
                                                             bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
 
   if (representation() == kTagged) {
     ASSERT(op_kind() == MethodRecognizer::kFloat64x2GetSignMask);
@@ -5227,7 +5187,8 @@
       __ vsqrtd(dresult0, dvalue0);
       __ vsqrtd(dresult1, dvalue1);
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -5236,8 +5197,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -5300,17 +5261,18 @@
       __ Bind(&g1);
       break;
     }
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
 
-LocationSummary* Int32x4ConstructorInstr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+LocationSummary* Int32x4ConstructorInstr::MakeLocationSummary(Zone* zone,
+                                                              bool opt) const {
   const intptr_t kNumInputs = 4;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   summary->set_in(2, Location::RequiresRegister());
@@ -5335,11 +5297,12 @@
 
 
 LocationSummary* Int32x4BoolConstructorInstr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   const intptr_t kNumInputs = 4;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   summary->set_in(2, Location::RequiresRegister());
@@ -5382,8 +5345,8 @@
                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   // Low (< 7) Q registers are needed for the vmovrs instruction.
   summary->set_in(0, Location::FpuRegisterLocation(Q6));
   summary->set_out(0, Location::RequiresRegister());
@@ -5415,7 +5378,8 @@
     case MethodRecognizer::kInt32x4GetFlagW:
       __ vmovrs(result, svalue3);
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 
   __ tst(result, Operand(result));
@@ -5428,8 +5392,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_in(2, Location::RequiresFpuRegister());
@@ -5463,8 +5427,8 @@
                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -5500,7 +5464,8 @@
     case MethodRecognizer::kInt32x4WithFlagW:
       __ vmovdr(dresult1, 1, TMP);
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -5509,8 +5474,8 @@
                                                               bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -5531,8 +5496,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -5545,12 +5510,23 @@
   const QRegister right = locs()->in(1).fpu_reg();
   const QRegister result = locs()->out(0).fpu_reg();
   switch (op_kind()) {
-    case Token::kBIT_AND: __ vandq(result, left, right); break;
-    case Token::kBIT_OR: __ vorrq(result, left, right); break;
-    case Token::kBIT_XOR: __ veorq(result, left, right); break;
-    case Token::kADD: __ vaddqi(kWord, result, left, right); break;
-    case Token::kSUB: __ vsubqi(kWord, result, left, right); break;
-    default: UNREACHABLE();
+    case Token::kBIT_AND:
+      __ vandq(result, left, right);
+      break;
+    case Token::kBIT_OR:
+      __ vorrq(result, left, right);
+      break;
+    case Token::kBIT_XOR:
+      __ veorq(result, left, right);
+      break;
+    case Token::kADD:
+      __ vaddqi(kWord, result, left, right);
+      break;
+    case Token::kSUB:
+      __ vsubqi(kWord, result, left, right);
+      break;
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -5561,8 +5537,8 @@
          (kind() == MathUnaryInstr::kDoubleSquare));
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -5585,10 +5561,11 @@
 
 
 LocationSummary* CaseInsensitiveCompareUC16Instr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, InputCount(), kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, InputCount(), kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(R0));
   summary->set_in(1, Location::RegisterLocation(R1));
   summary->set_in(2, Location::RegisterLocation(R2));
@@ -5600,7 +5577,6 @@
 
 void CaseInsensitiveCompareUC16Instr::EmitNativeCode(
     FlowGraphCompiler* compiler) {
-
   // Call the function.
   __ CallRuntime(TargetFunction(), TargetFunction().argument_count());
 }
@@ -5611,8 +5587,8 @@
   if (result_cid() == kDoubleCid) {
     const intptr_t kNumInputs = 2;
     const intptr_t kNumTemps = 1;
-    LocationSummary* summary = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresFpuRegister());
     summary->set_in(1, Location::RequiresFpuRegister());
     // Reuse the left register so that code can be made shorter.
@@ -5623,8 +5599,8 @@
   ASSERT(result_cid() == kSmiCid);
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   // Reuse the left register so that code can be made shorter.
@@ -5696,8 +5672,8 @@
                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   // We make use of 3-operand instructions by not requiring result register
   // to be identical to first input register as on Intel.
@@ -5731,8 +5707,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -5750,8 +5726,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresRegister());
   result->set_out(0, Location::RequiresFpuRegister());
   return result;
@@ -5770,8 +5746,8 @@
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresRegister());
   result->set_out(0, Location::RequiresFpuRegister());
   return result;
@@ -5803,8 +5779,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* result = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   result->set_in(0, Location::RegisterLocation(R1));
   result->set_out(0, Location::RegisterLocation(R0));
   return result;
@@ -5842,13 +5818,10 @@
   const Function& target = Function::ZoneHandle(ic_data.GetTargetAt(0));
 
   const intptr_t kNumberOfArguments = 1;
-  compiler->GenerateStaticCall(deopt_id(),
-                               instance_call()->token_pos(),
-                               target,
+  compiler->GenerateStaticCall(deopt_id(), instance_call()->token_pos(), target,
                                kNumberOfArguments,
                                Object::null_array(),  // No argument names.,
-                               locs(),
-                               ICData::Handle());
+                               locs(), ICData::Handle());
   __ Bind(&done);
 }
 
@@ -5857,8 +5830,8 @@
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::RequiresRegister());
   return result;
@@ -5900,8 +5873,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   // Low (<= Q7) Q registers are needed for the conversion instructions.
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::FpuRegisterLocation(Q7));
@@ -5921,8 +5894,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   // Low (<= Q7) Q registers are needed for the conversion instructions.
   result->set_in(0, Location::FpuRegisterLocation(Q7));
   result->set_out(0, Location::RequiresFpuRegister());
@@ -5942,10 +5915,11 @@
                                                                bool opt) const {
   ASSERT((InputCount() == 1) || (InputCount() == 2));
   const intptr_t kNumTemps =
-      (TargetCPUFeatures::hardfp_supported()) ?
-        ((recognized_kind() == MethodRecognizer::kMathDoublePow) ? 1 : 0) : 4;
-  LocationSummary* result = new(zone) LocationSummary(
-      zone, InputCount(), kNumTemps, LocationSummary::kCall);
+      (TargetCPUFeatures::hardfp_supported())
+          ? ((recognized_kind() == MethodRecognizer::kMathDoublePow) ? 1 : 0)
+          : 4;
+  LocationSummary* result = new (zone)
+      LocationSummary(zone, InputCount(), kNumTemps, LocationSummary::kCall);
   result->set_in(0, Location::FpuRegisterLocation(Q0));
   if (InputCount() == 2) {
     result->set_in(1, Location::FpuRegisterLocation(Q1));
@@ -6004,7 +5978,7 @@
   __ vcmpdz(exp);
   __ vmstat();
   __ b(&check_base, VS);  // NaN -> check base.
-  __ b(&skip_call, EQ);  // exp is 0.0, result is 1.0.
+  __ b(&skip_call, EQ);   // exp is 0.0, result is 1.0.
 
   // exponent == 1.0 ?
   __ vcmpd(exp, result);
@@ -6134,27 +6108,27 @@
   // Only use this instruction in optimized code.
   ASSERT(opt);
   const intptr_t kNumInputs = 1;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, 0, LocationSummary::kNoCall);
+  LocationSummary* summary =
+      new (zone) LocationSummary(zone, kNumInputs, 0, LocationSummary::kNoCall);
   if (representation() == kUnboxedDouble) {
     if (index() == 0) {
-      summary->set_in(0, Location::Pair(Location::RequiresFpuRegister(),
-                                        Location::Any()));
+      summary->set_in(
+          0, Location::Pair(Location::RequiresFpuRegister(), Location::Any()));
     } else {
       ASSERT(index() == 1);
-      summary->set_in(0, Location::Pair(Location::Any(),
-                                        Location::RequiresFpuRegister()));
+      summary->set_in(
+          0, Location::Pair(Location::Any(), Location::RequiresFpuRegister()));
     }
     summary->set_out(0, Location::RequiresFpuRegister());
   } else {
     ASSERT(representation() == kTagged);
     if (index() == 0) {
-      summary->set_in(0, Location::Pair(Location::RequiresRegister(),
-                                        Location::Any()));
+      summary->set_in(
+          0, Location::Pair(Location::RequiresRegister(), Location::Any()));
     } else {
       ASSERT(index() == 1);
-      summary->set_in(0, Location::Pair(Location::Any(),
-                                        Location::RequiresRegister()));
+      summary->set_in(
+          0, Location::Pair(Location::Any(), Location::RequiresRegister()));
     }
     summary->set_out(0, Location::RequiresRegister());
   }
@@ -6184,8 +6158,8 @@
   if (kind() == MergedMathInstr::kTruncDivMod) {
     const intptr_t kNumInputs = 2;
     const intptr_t kNumTemps = 2;
-    LocationSummary* summary = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     summary->set_in(1, Location::RequiresRegister());
     summary->set_temp(0, Location::RequiresRegister());
@@ -6262,13 +6236,13 @@
 
 
 LocationSummary* PolymorphicInstanceCallInstr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   return MakeCallSummary(zone);
 }
 
 
-LocationSummary* BranchInstr::MakeLocationSummary(Zone* zone,
-                                                  bool opt) const {
+LocationSummary* BranchInstr::MakeLocationSummary(Zone* zone, bool opt) const {
   comparison()->InitializeLocationSummary(zone, opt);
   // Branches don't produce a result.
   comparison()->locs()->set_out(0, Location::NoLocation());
@@ -6286,8 +6260,8 @@
   const intptr_t kNumInputs = 1;
   const bool need_mask_temp = IsDenseSwitch() && !IsDenseMask(ComputeCidMask());
   const intptr_t kNumTemps = !IsNullCheck() ? (need_mask_temp ? 2 : 1) : 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   if (!IsNullCheck()) {
     summary->set_temp(0, Location::RequiresRegister());
@@ -6300,8 +6274,7 @@
 
 
 void CheckClassInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label* deopt = compiler->AddDeoptStub(deopt_id(),
-                                        ICData::kDeoptCheckClass,
+  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckClass,
                                         licm_hoisted_ ? ICData::kHoisted : 0);
   if (IsNullCheck()) {
     __ CompareObject(locs()->in(0).reg(), Object::null_object());
@@ -6343,8 +6316,7 @@
     }
   } else {
     GrowableArray<CidTarget> sorted_ic_data;
-    FlowGraphCompiler::SortICDataByCount(unary_checks(),
-                                         &sorted_ic_data,
+    FlowGraphCompiler::SortICDataByCount(unary_checks(), &sorted_ic_data,
                                          /* drop_smi = */ true);
     const intptr_t num_checks = sorted_ic_data.length();
     for (intptr_t i = 0; i < num_checks; i++) {
@@ -6366,8 +6338,8 @@
                                                     bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   return summary;
 }
@@ -6375,8 +6347,7 @@
 
 void CheckSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const Register value = locs()->in(0).reg();
-  Label* deopt = compiler->AddDeoptStub(deopt_id(),
-                                        ICData::kDeoptCheckSmi,
+  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckSmi,
                                         licm_hoisted_ ? ICData::kHoisted : 0);
   __ BranchIfNotSmi(value, deopt);
 }
@@ -6386,8 +6357,8 @@
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   return summary;
 }
@@ -6405,7 +6376,7 @@
                                                              bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
+  LocationSummary* locs = new (zone) LocationSummary(
       zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   locs->set_in(kLengthPos, Location::RequiresRegister());
   locs->set_in(kIndexPos, Location::RequiresRegister());
@@ -6416,7 +6387,7 @@
 class RangeErrorSlowPath : public SlowPathCode {
  public:
   RangeErrorSlowPath(GenericCheckBoundInstr* instruction, intptr_t try_index)
-      : instruction_(instruction), try_index_(try_index) { }
+      : instruction_(instruction), try_index_(try_index) {}
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     if (Assembler::EmittingComments()) {
@@ -6428,11 +6399,8 @@
     __ Push(locs->in(1).reg());
     __ CallRuntime(kRangeErrorRuntimeEntry, 2);
     compiler->pc_descriptors_list()->AddDescriptor(
-        RawPcDescriptors::kOther,
-        compiler->assembler()->CodeSize(),
-        instruction_->deopt_id(),
-        instruction_->token_pos(),
-        try_index_);
+        RawPcDescriptors::kOther, compiler->assembler()->CodeSize(),
+        instruction_->deopt_id(), instruction_->token_pos(), try_index_);
     compiler->RecordSafepoint(locs, 2);
     __ bkpt(0);
   }
@@ -6465,8 +6433,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(kLengthPos, Location::RegisterOrSmiConstant(length()));
   locs->set_in(kIndexPos, Location::RegisterOrSmiConstant(index()));
   return locs;
@@ -6476,10 +6444,8 @@
 void CheckArrayBoundInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   uint32_t flags = generalized_ ? ICData::kGeneralized : 0;
   flags |= licm_hoisted_ ? ICData::kHoisted : 0;
-  Label* deopt = compiler->AddDeoptStub(
-      deopt_id(),
-      ICData::kDeoptCheckArrayBound,
-      flags);
+  Label* deopt =
+      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckArrayBound, flags);
 
   Location length_loc = locs()->in(kLengthPos);
   Location index_loc = locs()->in(kIndexPos);
@@ -6529,8 +6495,8 @@
                                                         bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::Pair(Location::RequiresRegister(),
                                     Location::RequiresRegister()));
   summary->set_in(1, Location::Pair(Location::RequiresRegister(),
@@ -6568,9 +6534,9 @@
       break;
     }
     case Token::kBIT_XOR: {
-     __ eor(out_lo, left_lo, Operand(right_lo));
-     __ eor(out_hi, left_hi, Operand(right_hi));
-     break;
+      __ eor(out_lo, left_lo, Operand(right_lo));
+      __ eor(out_hi, left_hi, Operand(right_hi));
+      break;
     }
     case Token::kADD:
     case Token::kSUB: {
@@ -6609,8 +6575,8 @@
                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::Pair(Location::RequiresRegister(),
                                     Location::RequiresRegister()));
   summary->set_in(1, Location::WritableRegisterOrSmiConstant(right()));
@@ -6623,8 +6589,8 @@
 static const intptr_t kMintShiftCountLimit = 63;
 
 bool ShiftMintOpInstr::has_shift_count_check() const {
-  return !RangeUtils::IsWithin(
-      right()->definition()->range(), 0, kMintShiftCountLimit);
+  return !RangeUtils::IsWithin(right()->definition()->range(), 0,
+                               kMintShiftCountLimit);
 }
 
 
@@ -6754,8 +6720,8 @@
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::Pair(Location::RequiresRegister(),
                                     Location::RequiresRegister()));
   summary->set_out(0, Location::Pair(Location::RequiresRegister(),
@@ -6797,8 +6763,8 @@
                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresRegister());
@@ -6840,8 +6806,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RegisterOrSmiConstant(right()));
   summary->set_temp(0, Location::RequiresRegister());
@@ -6910,8 +6876,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -6933,8 +6899,8 @@
                                                                bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   if (from() == kUnboxedMint) {
     ASSERT((to() == kUnboxedUint32) || (to() == kUnboxedInt32));
     summary->set_in(0, Location::Pair(Location::RequiresRegister(),
@@ -7005,42 +6971,33 @@
 }
 
 
-LocationSummary* ThrowInstr::MakeLocationSummary(Zone* zone,
-                                                 bool opt) const {
-  return new(zone) LocationSummary(zone, 0, 0, LocationSummary::kCall);
+LocationSummary* ThrowInstr::MakeLocationSummary(Zone* zone, bool opt) const {
+  return new (zone) LocationSummary(zone, 0, 0, LocationSummary::kCall);
 }
 
 
 void ThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  compiler->GenerateRuntimeCall(token_pos(),
-                                deopt_id(),
-                                kThrowRuntimeEntry,
-                                1,
+  compiler->GenerateRuntimeCall(token_pos(), deopt_id(), kThrowRuntimeEntry, 1,
                                 locs());
   __ bkpt(0);
 }
 
 
-LocationSummary* ReThrowInstr::MakeLocationSummary(Zone* zone,
-                                                   bool opt) const {
-  return new(zone) LocationSummary(zone, 0, 0, LocationSummary::kCall);
+LocationSummary* ReThrowInstr::MakeLocationSummary(Zone* zone, bool opt) const {
+  return new (zone) LocationSummary(zone, 0, 0, LocationSummary::kCall);
 }
 
 
 void ReThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   compiler->SetNeedsStacktrace(catch_try_index());
-  compiler->GenerateRuntimeCall(token_pos(),
-                                deopt_id(),
-                                kReThrowRuntimeEntry,
-                                2,
-                                locs());
+  compiler->GenerateRuntimeCall(token_pos(), deopt_id(), kReThrowRuntimeEntry,
+                                2, locs());
   __ bkpt(0);
 }
 
 
-LocationSummary* StopInstr::MakeLocationSummary(Zone* zone,
-                                                bool opt) const {
-  return new(zone) LocationSummary(zone, 0, 0, LocationSummary::kNoCall);
+LocationSummary* StopInstr::MakeLocationSummary(Zone* zone, bool opt) const {
+  return new (zone) LocationSummary(zone, 0, 0, LocationSummary::kNoCall);
 }
 
 
@@ -7056,9 +7013,8 @@
 }
 
 
-LocationSummary* GotoInstr::MakeLocationSummary(Zone* zone,
-                                                bool opt) const {
-  return new(zone) LocationSummary(zone, 0, 0, LocationSummary::kNoCall);
+LocationSummary* GotoInstr::MakeLocationSummary(Zone* zone, bool opt) const {
+  return new (zone) LocationSummary(zone, 0, 0, LocationSummary::kNoCall);
 }
 
 
@@ -7069,8 +7025,7 @@
     }
     // Add a deoptimization descriptor for deoptimizing instructions that
     // may be inserted before this instruction.
-    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
-                                   GetDeoptId(),
+    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, GetDeoptId(),
                                    TokenPosition::kNoSource);
   }
   if (HasParallelMove()) {
@@ -7090,8 +7045,8 @@
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
 
-  LocationSummary* summary = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
 
   summary->set_in(0, Location::RequiresRegister());
   summary->set_temp(0, Location::RequiresRegister());
@@ -7109,10 +7064,9 @@
   __ AddImmediate(target_address_reg, target_address_reg, -entry_to_pc_offset);
   // Add the offset.
   Register offset_reg = locs()->in(0).reg();
-  Operand offset_opr =
-      (offset()->definition()->representation() == kTagged) ?
-      Operand(offset_reg, ASR, kSmiTagSize) :
-      Operand(offset_reg);
+  Operand offset_opr = (offset()->definition()->representation() == kTagged)
+                           ? Operand(offset_reg, ASR, kSmiTagSize)
+                           : Operand(offset_reg);
   __ add(target_address_reg, target_address_reg, offset_opr);
 
   // Jump to the absolute address.
@@ -7125,15 +7079,15 @@
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
   if (needs_number_check()) {
-    LocationSummary* locs = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+    LocationSummary* locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
     locs->set_in(0, Location::RegisterLocation(R0));
     locs->set_in(1, Location::RegisterLocation(R1));
     locs->set_out(0, Location::RegisterLocation(R0));
     return locs;
   }
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
 
   // If a constant has more than one use, make sure it is loaded in register
   // so that multiple immediate loads can be avoided.
@@ -7151,8 +7105,8 @@
     // Only one of the inputs can be a constant. Choose register if the first
     // one is a constant.
     locs->set_in(1, locs->in(0).IsConstant()
-        ? Location::RequiresRegister()
-        : Location::RegisterOrConstant(right()));
+                        ? Location::RequiresRegister()
+                        : Location::RegisterOrConstant(right()));
   }
   locs->set_out(0, Location::RequiresRegister());
   return locs;
@@ -7166,20 +7120,14 @@
   ASSERT(!left.IsConstant() || !right.IsConstant());
   Condition true_condition;
   if (left.IsConstant()) {
-    true_condition = compiler->EmitEqualityRegConstCompare(right.reg(),
-                                                           left.constant(),
-                                                           needs_number_check(),
-                                                           token_pos());
+    true_condition = compiler->EmitEqualityRegConstCompare(
+        right.reg(), left.constant(), needs_number_check(), token_pos());
   } else if (right.IsConstant()) {
-    true_condition = compiler->EmitEqualityRegConstCompare(left.reg(),
-                                                           right.constant(),
-                                                           needs_number_check(),
-                                                           token_pos());
+    true_condition = compiler->EmitEqualityRegConstCompare(
+        left.reg(), right.constant(), needs_number_check(), token_pos());
   } else {
-    true_condition = compiler->EmitEqualityRegRegCompare(left.reg(),
-                                                         right.reg(),
-                                                         needs_number_check(),
-                                                         token_pos());
+    true_condition = compiler->EmitEqualityRegRegCompare(
+        left.reg(), right.reg(), needs_number_check(), token_pos());
   }
   if (kind() != Token::kEQ_STRICT) {
     ASSERT(kind() == Token::kNE_STRICT);
@@ -7193,7 +7141,7 @@
   ASSERT(kind() == Token::kEQ_STRICT || kind() == Token::kNE_STRICT);
 
   // The ARM code does not use true- and false-labels here.
-  BranchLabels labels = { NULL, NULL, NULL };
+  BranchLabels labels = {NULL, NULL, NULL};
   Condition true_condition = EmitComparisonCode(compiler, labels);
 
   const Register result = locs()->out(0).reg();
@@ -7214,9 +7162,7 @@
 
 LocationSummary* BooleanNegateInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
-  return LocationSummary::Make(zone,
-                               1,
-                               Location::RequiresRegister(),
+  return LocationSummary::Make(zone, 1, Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
 
@@ -7241,9 +7187,7 @@
   const Code& stub = Code::ZoneHandle(
       compiler->zone(), StubCode::GetAllocationStubForClass(cls()));
   const StubEntry stub_entry(stub);
-  compiler->GenerateCall(token_pos(),
-                         stub_entry,
-                         RawPcDescriptors::kOther,
+  compiler->GenerateCall(token_pos(), stub_entry, RawPcDescriptors::kOther,
                          locs());
   compiler->AddStubCallTarget(stub);
   __ Drop(ArgumentCount());  // Discard arguments.
@@ -7258,12 +7202,12 @@
 }
 
 
-LocationSummary* GrowRegExpStackInstr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+LocationSummary* GrowRegExpStackInstr::MakeLocationSummary(Zone* zone,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(R0));
   locs->set_out(0, Location::RegisterLocation(R0));
   return locs;
@@ -7275,11 +7219,8 @@
   const Register result = locs()->out(0).reg();
   __ PushObject(Object::null_object());
   __ Push(typed_data);
-  compiler->GenerateRuntimeCall(TokenPosition::kNoSource,
-                                deopt_id(),
-                                kGrowRegExpStackRuntimeEntry,
-                                1,
-                                locs());
+  compiler->GenerateRuntimeCall(TokenPosition::kNoSource, deopt_id(),
+                                kGrowRegExpStackRuntimeEntry, 1, locs());
   __ Drop(1);
   __ Pop(result);
 }
diff --git a/runtime/vm/intermediate_language_arm64.cc b/runtime/vm/intermediate_language_arm64.cc
index 1e4baa2..55ab860 100644
--- a/runtime/vm/intermediate_language_arm64.cc
+++ b/runtime/vm/intermediate_language_arm64.cc
@@ -29,8 +29,8 @@
 // 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(Zone* zone) {
-  LocationSummary* result = new(zone) LocationSummary(
-      zone, 0, 0, LocationSummary::kCall);
+  LocationSummary* result =
+      new (zone) LocationSummary(zone, 0, 0, LocationSummary::kCall);
   result->set_out(0, Location::RegisterLocation(R0));
   return result;
 }
@@ -40,8 +40,8 @@
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::AnyOrConstant(value()));
   return locs;
 }
@@ -66,12 +66,11 @@
 }
 
 
-LocationSummary* ReturnInstr::MakeLocationSummary(Zone* zone,
-                                                  bool opt) const {
+LocationSummary* ReturnInstr::MakeLocationSummary(Zone* zone, bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RegisterLocation(R0));
   return locs;
 }
@@ -113,18 +112,30 @@
 
 static Condition NegateCondition(Condition condition) {
   switch (condition) {
-    case EQ: return NE;
-    case NE: return EQ;
-    case LT: return GE;
-    case LE: return GT;
-    case GT: return LE;
-    case GE: return LT;
-    case CC: return CS;
-    case LS: return HI;
-    case HI: return LS;
-    case CS: return CC;
-    case VS: return VC;
-    case VC: return VS;
+    case EQ:
+      return NE;
+    case NE:
+      return EQ;
+    case LT:
+      return GE;
+    case LE:
+      return GT;
+    case GT:
+      return LE;
+    case GE:
+      return LT;
+    case CC:
+      return CS;
+    case LS:
+      return HI;
+    case HI:
+      return LS;
+    case CS:
+      return CC;
+    case VS:
+      return VC;
+    case VC:
+      return VS;
     default:
       UNREACHABLE();
       return EQ;
@@ -154,7 +165,7 @@
   ASSERT(!left.IsConstant() || !right.IsConstant());
 
   // Emit comparison code. This must not overwrite the result register.
-  BranchLabels labels = { NULL, NULL, NULL };
+  BranchLabels labels = {NULL, NULL, NULL};
   Condition true_condition = comparison()->EmitComparisonCode(compiler, labels);
 
   const bool is_power_of_two_kind = IsPowerOfTwoKind(if_true_, if_false_);
@@ -186,8 +197,7 @@
     __ LslImmediate(result, result, shift + kSmiTagSize);
   } else {
     __ sub(result, result, Operand(1));
-    const int64_t val =
-        Smi::RawValue(true_value) - Smi::RawValue(false_value);
+    const int64_t val = Smi::RawValue(true_value) - Smi::RawValue(false_value);
     __ AndImmediate(result, result, val);
     if (false_value != 0) {
       __ AddImmediate(result, result, Smi::RawValue(false_value));
@@ -200,8 +210,8 @@
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(R0));  // Function.
   summary->set_out(0, Location::RegisterLocation(R0));
   return summary;
@@ -211,9 +221,8 @@
 void ClosureCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   // Load arguments descriptor in R4.
   int argument_count = ArgumentCount();
-  const Array& arguments_descriptor =
-      Array::ZoneHandle(ArgumentsDescriptor::New(argument_count,
-                                                 argument_names()));
+  const Array& arguments_descriptor = Array::ZoneHandle(
+      ArgumentsDescriptor::New(argument_count, argument_names()));
   __ LoadObject(R4, arguments_descriptor);
 
   // R4: Arguments descriptor.
@@ -237,8 +246,7 @@
   // Add deoptimization continuation point after the call and before the
   // arguments are removed.
   // In optimized code this descriptor is needed for exception handling.
-  compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
-                                 deopt_id_after,
+  compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, deopt_id_after,
                                  token_pos());
   __ Drop(argument_count);
 }
@@ -246,9 +254,7 @@
 
 LocationSummary* LoadLocalInstr::MakeLocationSummary(Zone* zone,
                                                      bool opt) const {
-  return LocationSummary::Make(zone,
-                               0,
-                               Location::RequiresRegister(),
+  return LocationSummary::Make(zone, 0, Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
 
@@ -261,9 +267,7 @@
 
 LocationSummary* StoreLocalInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
-  return LocationSummary::Make(zone,
-                               1,
-                               Location::SameAsFirstInput(),
+  return LocationSummary::Make(zone, 1, Location::SameAsFirstInput(),
                                LocationSummary::kNoCall);
 }
 
@@ -278,9 +282,7 @@
 
 LocationSummary* ConstantInstr::MakeLocationSummary(Zone* zone,
                                                     bool opt) const {
-  return LocationSummary::Make(zone,
-                               0,
-                               Location::RequiresRegister(),
+  return LocationSummary::Make(zone, 0, Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
 
@@ -297,12 +299,10 @@
 LocationSummary* UnboxedConstantInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 0;
-  const Location out = (representation_ == kUnboxedInt32) ?
-      Location::RequiresRegister() : Location::RequiresFpuRegister();
-  return LocationSummary::Make(zone,
-                               kNumInputs,
-                               out,
-                               LocationSummary::kNoCall);
+  const Location out = (representation_ == kUnboxedInt32)
+                           ? Location::RequiresRegister()
+                           : Location::RequiresFpuRegister();
+  return LocationSummary::Make(zone, kNumInputs, out, LocationSummary::kNoCall);
 }
 
 
@@ -334,8 +334,8 @@
                                                             bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(R0));  // Value.
   summary->set_in(1, Location::RegisterLocation(R1));  // Type arguments.
   summary->set_out(0, Location::RegisterLocation(R0));
@@ -347,8 +347,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(R0));
   locs->set_out(0, Location::RegisterLocation(R0));
   return locs;
@@ -377,11 +377,8 @@
   }
 
   __ Push(reg);  // Push the source object.
-  compiler->GenerateRuntimeCall(token_pos,
-                                deopt_id,
-                                kNonBoolTypeErrorRuntimeEntry,
-                                1,
-                                locs);
+  compiler->GenerateRuntimeCall(token_pos, deopt_id,
+                                kNonBoolTypeErrorRuntimeEntry, 1, locs);
   // We should never return here.
   __ brk(0);
   __ Bind(&done);
@@ -399,12 +396,18 @@
 
 static Condition TokenKindToSmiCondition(Token::Kind kind) {
   switch (kind) {
-    case Token::kEQ: return EQ;
-    case Token::kNE: return NE;
-    case Token::kLT: return LT;
-    case Token::kGT: return GT;
-    case Token::kLTE: return LE;
-    case Token::kGTE: return GE;
+    case Token::kEQ:
+      return EQ;
+    case Token::kNE:
+      return NE;
+    case Token::kLT:
+      return LT;
+    case Token::kGT:
+      return GT;
+    case Token::kLTE:
+      return LE;
+    case Token::kGTE:
+      return GE;
     default:
       UNREACHABLE();
       return VS;
@@ -414,16 +417,26 @@
 
 static Condition FlipCondition(Condition condition) {
   switch (condition) {
-    case EQ: return EQ;
-    case NE: return NE;
-    case LT: return GT;
-    case LE: return GE;
-    case GT: return LT;
-    case GE: return LE;
-    case CC: return HI;
-    case LS: return CS;
-    case HI: return CC;
-    case CS: return LS;
+    case EQ:
+      return EQ;
+    case NE:
+      return NE;
+    case LT:
+      return GT;
+    case LE:
+      return GE;
+    case GT:
+      return LT;
+    case GE:
+      return LE;
+    case CC:
+      return HI;
+    case LS:
+      return CS;
+    case HI:
+      return CC;
+    case CS:
+      return LS;
     default:
       UNREACHABLE();
       return EQ;
@@ -475,9 +488,9 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 2;
   if (operation_cid() == kDoubleCid) {
-    const intptr_t kNumTemps =  0;
-    LocationSummary* locs = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    const intptr_t kNumTemps = 0;
+    LocationSummary* locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::RequiresFpuRegister());
     locs->set_in(1, Location::RequiresFpuRegister());
     locs->set_out(0, Location::RequiresRegister());
@@ -485,8 +498,8 @@
   }
   if (operation_cid() == kSmiCid) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* locs = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::RegisterOrConstant(left()));
     // Only one input can be a constant operand. The case of two constant
     // operands should be handled by constant propagation.
@@ -504,12 +517,18 @@
 
 static Condition TokenKindToDoubleCondition(Token::Kind kind) {
   switch (kind) {
-    case Token::kEQ: return EQ;
-    case Token::kNE: return NE;
-    case Token::kLT: return LT;
-    case Token::kGT: return GT;
-    case Token::kLTE: return LE;
-    case Token::kGTE: return GE;
+    case Token::kEQ:
+      return EQ;
+    case Token::kNE:
+      return NE;
+    case Token::kLT:
+      return LT;
+    case Token::kGT:
+      return GT;
+    case Token::kLTE:
+      return LE;
+    case Token::kGTE:
+      return GE;
     default:
       UNREACHABLE();
       return VS;
@@ -542,7 +561,7 @@
 void EqualityCompareInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   ASSERT((kind() == Token::kEQ) || (kind() == Token::kNE));
   Label is_true, is_false;
-  BranchLabels labels = { &is_true, &is_false, &is_false };
+  BranchLabels labels = {&is_true, &is_false, &is_false};
   Condition true_condition = EmitComparisonCode(compiler, labels);
   if ((operation_cid() == kDoubleCid) && (true_condition != NE)) {
     // Special case for NaN comparison. Result is always false unless
@@ -578,12 +597,11 @@
 }
 
 
-LocationSummary* TestSmiInstr::MakeLocationSummary(Zone* zone,
-                                                   bool opt) const {
+LocationSummary* TestSmiInstr::MakeLocationSummary(Zone* zone, bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   // Only one input can be a constant operand. The case of two constant
   // operands should be handled by constant propagation.
@@ -598,8 +616,7 @@
   Location right = locs()->in(1);
   if (right.IsConstant()) {
     ASSERT(right.constant().IsSmi());
-    const int64_t imm =
-        reinterpret_cast<int64_t>(right.constant().raw());
+    const int64_t imm = reinterpret_cast<int64_t>(right.constant().raw());
     __ TestImmediate(left, imm);
   } else {
     __ tst(left, Operand(right.reg()));
@@ -627,8 +644,8 @@
                                                     bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   locs->set_temp(0, Location::RequiresRegister());
   locs->set_out(0, Location::RequiresRegister());
@@ -642,11 +659,11 @@
   const Register val_reg = locs()->in(0).reg();
   const Register cid_reg = locs()->temp(0).reg();
 
-  Label* deopt = CanDeoptimize()
-      ? compiler->AddDeoptStub(deopt_id(),
-                               ICData::kDeoptTestCids,
-                               licm_hoisted_ ? ICData::kHoisted : 0)
-      : NULL;
+  Label* deopt =
+      CanDeoptimize()
+          ? compiler->AddDeoptStub(deopt_id(), ICData::kDeoptTestCids,
+                                   licm_hoisted_ ? ICData::kHoisted : 0)
+          : NULL;
 
   const intptr_t true_result = (kind() == Token::kIS) ? 1 : 0;
   const ZoneGrowableArray<intptr_t>& data = cid_results();
@@ -688,7 +705,7 @@
 void TestCidsInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const Register result_reg = locs()->out(0).reg();
   Label is_true, is_false, done;
-  BranchLabels labels = { &is_true, &is_false, &is_false };
+  BranchLabels labels = {&is_true, &is_false, &is_false};
   EmitComparisonCode(compiler, labels);
   // TODO(zra): instead of branching, use the csel instruction to get
   // True or False into result.
@@ -706,16 +723,16 @@
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
   if (operation_cid() == kDoubleCid) {
-    LocationSummary* summary = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresFpuRegister());
     summary->set_in(1, Location::RequiresFpuRegister());
     summary->set_out(0, Location::RequiresRegister());
     return summary;
   }
   ASSERT(operation_cid() == kSmiCid);
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RegisterOrConstant(left()));
   // Only one input can be a constant operand. The case of two constant
   // operands should be handled by constant propagation.
@@ -740,7 +757,7 @@
 
 void RelationalOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Label is_true, is_false;
-  BranchLabels labels = { &is_true, &is_false, &is_false };
+  BranchLabels labels = {&is_true, &is_false, &is_false};
   Condition true_condition = EmitComparisonCode(compiler, labels);
   if ((operation_cid() == kDoubleCid) && (true_condition != NE)) {
     // Special case for NaN comparison. Result is always false unless
@@ -788,8 +805,8 @@
   __ PushObject(Object::null_object());
   // Pass a pointer to the first argument in R2.
   if (!function().HasOptionalParameters()) {
-    __ AddImmediate(R2, FP, (kParamEndSlotFromFp +
-                             function().NumParameters()) * kWordSize);
+    __ AddImmediate(
+        R2, FP, (kParamEndSlotFromFp + function().NumParameters()) * kWordSize);
   } else {
     __ AddImmediate(R2, FP, kFirstLocalSlotFromFp * kWordSize);
   }
@@ -820,21 +837,18 @@
   __ LoadImmediate(R1, argc_tag);
   ExternalLabel label(entry);
   __ LoadNativeEntry(R5, &label);
-  compiler->GenerateCall(token_pos(),
-                         *stub_entry,
-                         RawPcDescriptors::kOther,
+  compiler->GenerateCall(token_pos(), *stub_entry, RawPcDescriptors::kOther,
                          locs());
   __ Pop(result);
 }
 
 
 LocationSummary* OneByteStringFromCharCodeInstr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   const intptr_t kNumInputs = 1;
   // TODO(fschneider): Allow immediate operands for the char code.
-  return LocationSummary::Make(zone,
-                               kNumInputs,
-                               Location::RequiresRegister(),
+  return LocationSummary::Make(zone, kNumInputs, Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
 
@@ -846,8 +860,8 @@
   const Register result = locs()->out(0).reg();
 
   __ ldr(result, Address(THR, Thread::predefined_symbols_address_offset()));
-  __ AddImmediate(
-      result, result, Symbols::kNullCharCodeSymbolOffset * kWordSize);
+  __ AddImmediate(result, result,
+                  Symbols::kNullCharCodeSymbolOffset * kWordSize);
   __ SmiUntag(TMP, char_code);  // Untag to use scaled adress mode.
   __ ldr(result, Address(result, TMP, UXTX, Address::Scaled));
 }
@@ -856,9 +870,7 @@
 LocationSummary* StringToCharCodeInstr::MakeLocationSummary(Zone* zone,
                                                             bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(zone,
-                               kNumInputs,
-                               Location::RequiresRegister(),
+  return LocationSummary::Make(zone, kNumInputs, Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
 
@@ -880,8 +892,8 @@
                                                              bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(R0));
   summary->set_out(0, Location::RegisterLocation(R0));
   return summary;
@@ -893,12 +905,8 @@
   __ Push(array);
   const int kNumberOfArguments = 1;
   const Array& kNoArgumentNames = Object::null_array();
-  compiler->GenerateStaticCall(deopt_id(),
-                               token_pos(),
-                               CallFunction(),
-                               kNumberOfArguments,
-                               kNoArgumentNames,
-                               locs(),
+  compiler->GenerateStaticCall(deopt_id(), token_pos(), CallFunction(),
+                               kNumberOfArguments, kNoArgumentNames, locs(),
                                ICData::Handle());
   ASSERT(locs()->out(0).reg() == R0);
 }
@@ -907,9 +915,7 @@
 LocationSummary* LoadUntaggedInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(zone,
-                               kNumInputs,
-                               Location::RequiresRegister(),
+  return LocationSummary::Make(zone, kNumInputs, Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
 
@@ -929,9 +935,7 @@
 LocationSummary* LoadClassIdInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(zone,
-                               kNumInputs,
-                               Location::RequiresRegister(),
+  return LocationSummary::Make(zone, kNumInputs, Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
 
@@ -1031,13 +1035,13 @@
   }
   const int64_t index = Smi::Cast(constant->value()).AsInt64Value();
   const intptr_t scale = Instance::ElementSizeFor(cid);
-  const int64_t offset = index * scale +
+  const int64_t offset =
+      index * scale +
       (is_external ? 0 : (Instance::DataOffsetFor(cid) - kHeapObjectTag));
   if (!Utils::IsInt(32, offset)) {
     return false;
   }
-  return Address::CanHoldOffset(static_cast<int32_t>(offset),
-                                Address::Offset,
+  return Address::CanHoldOffset(static_cast<int32_t>(offset), Address::Offset,
                                 Address::OperandSizeFor(cid));
 }
 
@@ -1046,17 +1050,17 @@
                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = aligned() ? 0 : 1;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   if (CanBeImmediateIndex(index(), class_id(), IsExternal())) {
     locs->set_in(1, Location::Constant(index()->definition()->AsConstant()));
   } else {
     locs->set_in(1, Location::RequiresRegister());
   }
-  if ((representation() == kUnboxedDouble)    ||
+  if ((representation() == kUnboxedDouble) ||
       (representation() == kUnboxedFloat32x4) ||
-      (representation() == kUnboxedInt32x4)   ||
+      (representation() == kUnboxedInt32x4) ||
       (representation() == kUnboxedFloat64x2)) {
     locs->set_out(0, Location::RequiresFpuRegister());
   } else {
@@ -1077,13 +1081,14 @@
 
   Address element_address(TMP);  // Bad address.
   if (aligned()) {
-    element_address = index.IsRegister()
-        ? __ ElementAddressForRegIndex(true,  // Load.
-                                       IsExternal(), class_id(), index_scale(),
-                                       array, index.reg())
-        : __ ElementAddressForIntIndex(
-              IsExternal(), class_id(), index_scale(),
-              array, Smi::Cast(index.constant()).Value());
+    element_address =
+        index.IsRegister()
+            ? __ ElementAddressForRegIndex(true,  // Load.
+                                           IsExternal(), class_id(),
+                                           index_scale(), array, index.reg())
+            : __ ElementAddressForIntIndex(IsExternal(), class_id(),
+                                           index_scale(), array,
+                                           Smi::Cast(index.constant()).Value());
     // Warning: element_address may use register TMP as base.
   } else {
     if (index.IsRegister()) {
@@ -1092,16 +1097,15 @@
                                        IsExternal(), class_id(), index_scale(),
                                        array, index.reg());
     } else {
-      __ LoadElementAddressForIntIndex(address,
-                                       IsExternal(), class_id(), index_scale(),
-                                       array,
+      __ LoadElementAddressForIntIndex(address, IsExternal(), class_id(),
+                                       index_scale(), array,
                                        Smi::Cast(index.constant()).Value());
     }
   }
 
-  if ((representation() == kUnboxedDouble)    ||
+  if ((representation() == kUnboxedDouble) ||
       (representation() == kUnboxedFloat32x4) ||
-      (representation() == kUnboxedInt32x4)   ||
+      (representation() == kUnboxedInt32x4) ||
       (representation() == kUnboxedFloat64x2)) {
     const VRegister result = locs()->out(0).fpu_reg();
     switch (class_id()) {
@@ -1147,7 +1151,7 @@
         break;
       default:
         UNREACHABLE();
-      }
+    }
     return;
   }
 
@@ -1200,8 +1204,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresRegister());
@@ -1215,7 +1219,7 @@
   const Location index = locs()->in(1);
 
   Address element_address = __ ElementAddressForRegIndex(
-        true,  IsExternal(), class_id(), index_scale(), str, index.reg());
+      true, IsExternal(), class_id(), index_scale(), str, index.reg());
   // Warning: element_address may use register TMP as base.
 
   Register result = locs()->out(0).reg();
@@ -1223,19 +1227,31 @@
     case kOneByteStringCid:
     case kExternalOneByteStringCid:
       switch (element_count()) {
-        case 1: __ ldr(result, element_address, kUnsignedByte); break;
-        case 2: __ ldr(result, element_address, kUnsignedHalfword); break;
-        case 4: __ ldr(result, element_address, kUnsignedWord); break;
-        default: UNREACHABLE();
+        case 1:
+          __ ldr(result, element_address, kUnsignedByte);
+          break;
+        case 2:
+          __ ldr(result, element_address, kUnsignedHalfword);
+          break;
+        case 4:
+          __ ldr(result, element_address, kUnsignedWord);
+          break;
+        default:
+          UNREACHABLE();
       }
       __ SmiTag(result);
       break;
     case kTwoByteStringCid:
     case kExternalTwoByteStringCid:
       switch (element_count()) {
-        case 1: __ ldr(result, element_address, kUnsignedHalfword); break;
-        case 2: __ ldr(result, element_address, kUnsignedWord); break;
-        default: UNREACHABLE();
+        case 1:
+          __ ldr(result, element_address, kUnsignedHalfword);
+          break;
+        case 2:
+          __ ldr(result, element_address, kUnsignedWord);
+          break;
+        default:
+          UNREACHABLE();
       }
       __ SmiTag(result);
       break;
@@ -1249,8 +1265,8 @@
 Representation StoreIndexedInstr::RequiredInputRepresentation(
     intptr_t idx) const {
   // Array can be a Dart object or a pointer to external data.
-  if (idx == 0)  return kNoRepresentation;  // Flexible input representation.
-  if (idx == 1) return kTagged;  // Index is a smi.
+  if (idx == 0) return kNoRepresentation;  // Flexible input representation.
+  if (idx == 1) return kTagged;            // Index is a smi.
   ASSERT(idx == 2);
   switch (class_id_) {
     case kArrayCid:
@@ -1287,8 +1303,8 @@
                                                         bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = aligned() ? 0 : 2;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   if (CanBeImmediateIndex(index(), class_id(), IsExternal())) {
     locs->set_in(1, Location::Constant(index()->definition()->AsConstant()));
@@ -1298,8 +1314,8 @@
   switch (class_id()) {
     case kArrayCid:
       locs->set_in(2, ShouldEmitStoreBarrier()
-                        ? Location::WritableRegister()
-                        : Location::RegisterOrConstant(value()));
+                          ? Location::WritableRegister()
+                          : Location::RegisterOrConstant(value()));
       break;
     case kExternalTypedDataUint8ArrayCid:
     case kExternalTypedDataUint8ClampedArrayCid:
@@ -1343,13 +1359,14 @@
 
   Address element_address(TMP);  // Bad address.
   if (aligned()) {
-    element_address = index.IsRegister()
-      ? __ ElementAddressForRegIndex(false,  // Store.
-                                     IsExternal(), class_id(), index_scale(),
-                                     array, index.reg())
-      : __ ElementAddressForIntIndex(
-            IsExternal(), class_id(), index_scale(),
-            array, Smi::Cast(index.constant()).Value());
+    element_address =
+        index.IsRegister()
+            ? __ ElementAddressForRegIndex(false,  // Store.
+                                           IsExternal(), class_id(),
+                                           index_scale(), array, index.reg())
+            : __ ElementAddressForIntIndex(IsExternal(), class_id(),
+                                           index_scale(), array,
+                                           Smi::Cast(index.constant()).Value());
   } else {
     if (index.IsRegister()) {
       __ LoadElementAddressForRegIndex(address,
@@ -1357,9 +1374,8 @@
                                        IsExternal(), class_id(), index_scale(),
                                        array, index.reg());
     } else {
-      __ LoadElementAddressForIntIndex(address,
-                                       IsExternal(), class_id(), index_scale(),
-                                       array,
+      __ LoadElementAddressForIntIndex(address, IsExternal(), class_id(),
+                                       index_scale(), array,
                                        Smi::Cast(index.constant()).Value());
     }
   }
@@ -1412,7 +1428,7 @@
         const Register value = locs()->in(2).reg();
         __ CompareImmediate(value, 0x1FE);  // Smi value and smi 0xFF.
         // Clamp to 0x00 or 0xFF respectively.
-        __ csetm(TMP, GT);  // TMP = value > 0x1FE ? -1 : 0.
+        __ csetm(TMP, GT);             // TMP = value > 0x1FE ? -1 : 0.
         __ csel(TMP, value, TMP, LS);  // TMP = value in range ? value : TMP.
         __ SmiUntag(TMP);
         __ str(TMP, element_address, kUnsignedByte);
@@ -1492,11 +1508,10 @@
   const intptr_t value_cid = value()->Type()->ToCid();
   const intptr_t field_cid = field().guarded_cid();
 
-  const bool emit_full_guard =
-      !opt || (field_cid == kIllegalCid);
+  const bool emit_full_guard = !opt || (field_cid == kIllegalCid);
 
-  const bool needs_value_cid_temp_reg = emit_full_guard ||
-      ((value_cid == kDynamicCid) && (field_cid != kSmiCid));
+  const bool needs_value_cid_temp_reg =
+      emit_full_guard || ((value_cid == kDynamicCid) && (field_cid != kSmiCid));
 
   const bool needs_field_temp_reg = emit_full_guard;
 
@@ -1508,8 +1523,8 @@
     num_temps++;
   }
 
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, num_temps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, num_temps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
 
   for (intptr_t i = 0; i < num_temps; i++) {
@@ -1529,7 +1544,8 @@
   if (field_cid == kDynamicCid) {
     if (Compiler::IsBackgroundCompilation()) {
       // Field state changed while compiling.
-      Compiler::AbortBackgroundCompilation(deopt_id(),
+      Compiler::AbortBackgroundCompilation(
+          deopt_id(),
           "GuardFieldClassInstr: field state changed while compiling");
     }
     ASSERT(!compiler->is_optimizing());
@@ -1539,31 +1555,34 @@
   const bool emit_full_guard =
       !compiler->is_optimizing() || (field_cid == kIllegalCid);
 
-  const bool needs_value_cid_temp_reg = emit_full_guard ||
-      ((value_cid == kDynamicCid) && (field_cid != kSmiCid));
+  const bool needs_value_cid_temp_reg =
+      emit_full_guard || ((value_cid == kDynamicCid) && (field_cid != kSmiCid));
 
   const bool needs_field_temp_reg = emit_full_guard;
 
   const Register value_reg = locs()->in(0).reg();
 
-  const Register value_cid_reg = needs_value_cid_temp_reg ?
-      locs()->temp(0).reg() : kNoRegister;
+  const Register value_cid_reg =
+      needs_value_cid_temp_reg ? locs()->temp(0).reg() : kNoRegister;
 
-  const Register field_reg = needs_field_temp_reg ?
-      locs()->temp(locs()->temp_count() - 1).reg() : kNoRegister;
+  const Register field_reg = needs_field_temp_reg
+                                 ? locs()->temp(locs()->temp_count() - 1).reg()
+                                 : kNoRegister;
 
   Label ok, fail_label;
 
-  Label* deopt = compiler->is_optimizing() ?
-      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptGuardField) : NULL;
+  Label* deopt =
+      compiler->is_optimizing()
+          ? compiler->AddDeoptStub(deopt_id(), ICData::kDeoptGuardField)
+          : NULL;
 
   Label* fail = (deopt != NULL) ? deopt : &fail_label;
 
   if (emit_full_guard) {
     __ LoadObject(field_reg, Field::ZoneHandle(field().Original()));
 
-    FieldAddress field_cid_operand(
-        field_reg, Field::guarded_cid_offset(), kUnsignedWord);
+    FieldAddress field_cid_operand(field_reg, Field::guarded_cid_offset(),
+                                   kUnsignedWord);
     FieldAddress field_nullability_operand(
         field_reg, Field::is_nullable_offset(), kUnsignedWord);
 
@@ -1617,8 +1636,8 @@
       ASSERT(!compiler->is_optimizing());
       __ Bind(fail);
 
-      __ LoadFieldFromOffset(
-          TMP, field_reg, Field::guarded_cid_offset(), kUnsignedWord);
+      __ LoadFieldFromOffset(TMP, field_reg, Field::guarded_cid_offset(),
+                             kUnsignedWord);
       __ CompareImmediate(TMP, kDynamicCid);
       __ b(&ok, EQ);
 
@@ -1663,8 +1682,8 @@
   const intptr_t kNumInputs = 1;
   if (!opt || (field().guarded_list_length() == Field::kUnknownFixedLength)) {
     const intptr_t kNumTemps = 3;
-    LocationSummary* summary = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     // We need temporaries for field object, length offset and expected length.
     summary->set_temp(0, Location::RequiresRegister());
@@ -1672,8 +1691,8 @@
     summary->set_temp(2, Location::RequiresRegister());
     return summary;
   } else {
-    LocationSummary* summary = new(zone) LocationSummary(
-        zone, kNumInputs, 0, LocationSummary::kNoCall);
+    LocationSummary* summary = new (zone)
+        LocationSummary(zone, kNumInputs, 0, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     return summary;
   }
@@ -1685,15 +1704,18 @@
   if (field().guarded_list_length() == Field::kNoFixedLength) {
     if (Compiler::IsBackgroundCompilation()) {
       // Field state changed while compiling.
-      Compiler::AbortBackgroundCompilation(deopt_id(),
+      Compiler::AbortBackgroundCompilation(
+          deopt_id(),
           "GuardFieldLengthInstr: field state changed while compiling");
     }
     ASSERT(!compiler->is_optimizing());
     return;  // Nothing to emit.
   }
 
-  Label* deopt = compiler->is_optimizing() ?
-      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptGuardField) : NULL;
+  Label* deopt =
+      compiler->is_optimizing()
+          ? compiler->AddDeoptStub(deopt_id(), ICData::kDeoptGuardField)
+          : NULL;
 
   const Register value_reg = locs()->in(0).reg();
 
@@ -1711,8 +1733,8 @@
            FieldAddress(field_reg,
                         Field::guarded_list_length_in_object_offset_offset()),
            kByte);
-    __ ldr(length_reg, FieldAddress(field_reg,
-        Field::guarded_list_length_offset()));
+    __ ldr(length_reg,
+           FieldAddress(field_reg, Field::guarded_list_length_offset()));
 
     __ tst(offset_reg, Operand(offset_reg));
     __ b(&ok, MI);
@@ -1740,10 +1762,10 @@
     ASSERT(compiler->is_optimizing());
     ASSERT(field().guarded_list_length() >= 0);
     ASSERT(field().guarded_list_length_in_object_offset() !=
-        Field::kUnknownLengthOffset);
+           Field::kUnknownLengthOffset);
 
     __ ldr(TMP, FieldAddress(value_reg,
-                            field().guarded_list_length_in_object_offset()));
+                             field().guarded_list_length_in_object_offset()));
     __ CompareImmediate(TMP, Smi::RawValue(field().guarded_list_length()));
     __ b(deopt, NE);
   }
@@ -1755,19 +1777,16 @@
   BoxAllocationSlowPath(Instruction* instruction,
                         const Class& cls,
                         Register result)
-      : instruction_(instruction),
-        cls_(cls),
-        result_(result) { }
+      : instruction_(instruction), cls_(cls), result_(result) {}
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     if (Assembler::EmittingComments()) {
-      __ Comment("%s slow path allocation of %s",
-                 instruction_->DebugName(),
+      __ Comment("%s slow path allocation of %s", instruction_->DebugName(),
                  String::Handle(cls_.ScrubbedName()).ToCString());
     }
     __ Bind(entry_label());
-    const Code& stub = Code::ZoneHandle(compiler->zone(),
-        StubCode::GetAllocationStubForClass(cls_));
+    const Code& stub = Code::ZoneHandle(
+        compiler->zone(), StubCode::GetAllocationStubForClass(cls_));
     const StubEntry stub_entry(stub);
 
     LocationSummary* locs = instruction_->locs();
@@ -1776,9 +1795,7 @@
 
     compiler->SaveLiveRegisters(locs);
     compiler->GenerateCall(TokenPosition::kNoSource,  // No token position.
-                           stub_entry,
-                           RawPcDescriptors::kOther,
-                           locs);
+                           stub_entry, RawPcDescriptors::kOther, locs);
     compiler->AddStubCallTarget(stub);
     __ mov(result_, R0);
     compiler->RestoreLiveRegisters(locs);
@@ -1820,8 +1837,7 @@
   __ LoadFieldFromOffset(box_reg, instance_reg, offset);
   __ CompareObject(box_reg, Object::null_object());
   __ b(&done, NE);
-  BoxAllocationSlowPath::Allocate(
-      compiler, instruction, cls, box_reg, temp);
+  BoxAllocationSlowPath::Allocate(compiler, instruction, cls, box_reg, temp);
   __ mov(temp, box_reg);
   __ StoreIntoObjectOffset(instance_reg, offset, temp);
   __ Bind(&done);
@@ -1832,14 +1848,13 @@
                                                               bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps =
-      (IsUnboxedStore() && opt) ? 2 :
-          ((IsPotentialUnboxedStore()) ? 2 : 0);
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps,
-          ((IsUnboxedStore() && opt && is_initialization()) ||
-           IsPotentialUnboxedStore())
-          ? LocationSummary::kCallOnSlowPath
-          : LocationSummary::kNoCall);
+      (IsUnboxedStore() && opt) ? 2 : ((IsPotentialUnboxedStore()) ? 2 : 0);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps,
+                      ((IsUnboxedStore() && opt && is_initialization()) ||
+                       IsPotentialUnboxedStore())
+                          ? LocationSummary::kCallOnSlowPath
+                          : LocationSummary::kNoCall);
 
   summary->set_in(0, Location::RequiresRegister());
   if (IsUnboxedStore() && opt) {
@@ -1847,15 +1862,14 @@
     summary->set_temp(0, Location::RequiresRegister());
     summary->set_temp(1, Location::RequiresRegister());
   } else if (IsPotentialUnboxedStore()) {
-      summary->set_in(1, ShouldEmitStoreBarrier()
-          ? Location::WritableRegister()
-          :  Location::RequiresRegister());
-      summary->set_temp(0, Location::RequiresRegister());
-      summary->set_temp(1, Location::RequiresRegister());
+    summary->set_in(1, ShouldEmitStoreBarrier() ? Location::WritableRegister()
+                                                : Location::RequiresRegister());
+    summary->set_temp(0, Location::RequiresRegister());
+    summary->set_temp(1, Location::RequiresRegister());
   } else {
     summary->set_in(1, ShouldEmitStoreBarrier()
-                       ? Location::WritableRegister()
-                       : Location::RegisterOrConstant(value()));
+                           ? Location::WritableRegister()
+                           : Location::RegisterOrConstant(value()));
   }
   return summary;
 }
@@ -1938,9 +1952,8 @@
     __ CompareImmediate(temp2, kNullCid);
     __ b(&store_pointer, EQ);
 
-    __ LoadFromOffset(
-        temp2, temp, Field::kind_bits_offset() - kHeapObjectTag,
-        kUnsignedByte);
+    __ LoadFromOffset(temp2, temp, Field::kind_bits_offset() - kHeapObjectTag,
+                      kUnsignedByte);
     __ tsti(temp2, Immediate(1 << Field::kUnboxingCandidateBit));
     __ b(&store_pointer, EQ);
 
@@ -1963,19 +1976,14 @@
     __ b(&store_pointer);
 
     if (!compiler->is_optimizing()) {
-        locs()->live_registers()->Add(locs()->in(0));
-        locs()->live_registers()->Add(locs()->in(1));
+      locs()->live_registers()->Add(locs()->in(0));
+      locs()->live_registers()->Add(locs()->in(1));
     }
 
     {
       __ Bind(&store_double);
-      EnsureMutableBox(compiler,
-                       this,
-                       temp,
-                       compiler->double_class(),
-                       instance_reg,
-                       offset_in_bytes_,
-                       temp2);
+      EnsureMutableBox(compiler, this, temp, compiler->double_class(),
+                       instance_reg, offset_in_bytes_, temp2);
       __ LoadDFieldFromOffset(VTMP, value_reg, Double::value_offset());
       __ StoreDFieldToOffset(VTMP, temp, Double::value_offset());
       __ b(&skip_store);
@@ -1983,13 +1991,8 @@
 
     {
       __ Bind(&store_float32x4);
-      EnsureMutableBox(compiler,
-                       this,
-                       temp,
-                       compiler->float32x4_class(),
-                       instance_reg,
-                       offset_in_bytes_,
-                       temp2);
+      EnsureMutableBox(compiler, this, temp, compiler->float32x4_class(),
+                       instance_reg, offset_in_bytes_, temp2);
       __ LoadQFieldFromOffset(VTMP, value_reg, Float32x4::value_offset());
       __ StoreQFieldToOffset(VTMP, temp, Float32x4::value_offset());
       __ b(&skip_store);
@@ -1997,13 +2000,8 @@
 
     {
       __ Bind(&store_float64x2);
-      EnsureMutableBox(compiler,
-                       this,
-                       temp,
-                       compiler->float64x2_class(),
-                       instance_reg,
-                       offset_in_bytes_,
-                       temp2);
+      EnsureMutableBox(compiler, this, temp, compiler->float64x2_class(),
+                       instance_reg, offset_in_bytes_, temp2);
       __ LoadQFieldFromOffset(VTMP, value_reg, Float64x2::value_offset());
       __ StoreQFieldToOffset(VTMP, temp, Float64x2::value_offset());
       __ b(&skip_store);
@@ -2014,16 +2012,16 @@
 
   if (ShouldEmitStoreBarrier()) {
     const Register value_reg = locs()->in(1).reg();
-    __ StoreIntoObjectOffset(
-        instance_reg, offset_in_bytes_, value_reg, CanValueBeSmi());
+    __ StoreIntoObjectOffset(instance_reg, offset_in_bytes_, value_reg,
+                             CanValueBeSmi());
   } else {
     if (locs()->in(1).IsConstant()) {
-      __ StoreIntoObjectOffsetNoBarrier(
-          instance_reg, offset_in_bytes_, locs()->in(1).constant());
+      __ StoreIntoObjectOffsetNoBarrier(instance_reg, offset_in_bytes_,
+                                        locs()->in(1).constant());
     } else {
       const Register value_reg = locs()->in(1).reg();
-      __ StoreIntoObjectOffsetNoBarrier(
-          instance_reg, offset_in_bytes_, value_reg);
+      __ StoreIntoObjectOffsetNoBarrier(instance_reg, offset_in_bytes_,
+                                        value_reg);
     }
   }
   __ Bind(&skip_store);
@@ -2034,8 +2032,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -2056,8 +2054,8 @@
 
 LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(Zone* zone,
                                                             bool opt) const {
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, 1, 1, LocationSummary::kNoCall);
+  LocationSummary* locs =
+      new (zone) LocationSummary(zone, 1, 1, LocationSummary::kNoCall);
   locs->set_in(0, value()->NeedsStoreBuffer() ? Location::WritableRegister()
                                               : Location::RequiresRegister());
   locs->set_temp(0, Location::RequiresRegister());
@@ -2071,11 +2069,10 @@
 
   __ LoadObject(temp, Field::ZoneHandle(Z, field().Original()));
   if (this->value()->NeedsStoreBuffer()) {
-    __ StoreIntoObjectOffset(
-        temp, Field::static_value_offset(), value, CanValueBeSmi());
+    __ StoreIntoObjectOffset(temp, Field::static_value_offset(), value,
+                             CanValueBeSmi());
   } else {
-    __ StoreIntoObjectOffsetNoBarrier(temp,
-                                      Field::static_value_offset(),
+    __ StoreIntoObjectOffsetNoBarrier(temp, Field::static_value_offset(),
                                       value);
   }
 }
@@ -2085,8 +2082,8 @@
                                                       bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(R0));
   summary->set_in(1, Location::RegisterLocation(R1));
   summary->set_out(0, Location::RegisterLocation(R0));
@@ -2098,10 +2095,7 @@
   ASSERT(locs()->in(0).reg() == R0);  // Value.
   ASSERT(locs()->in(1).reg() == R1);  // Instantiator type arguments.
 
-  compiler->GenerateInstanceOf(token_pos(),
-                               deopt_id(),
-                               type(),
-                               negate_result(),
+  compiler->GenerateInstanceOf(token_pos(), deopt_id(), type(), negate_result(),
                                locs());
   ASSERT(locs()->out(0).reg() == R0);
 }
@@ -2111,8 +2105,8 @@
                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(kElementTypePos, Location::RegisterLocation(R1));
   locs->set_in(kLengthPos, Location::RegisterLocation(R2));
   locs->set_out(0, Location::RegisterLocation(R0));
@@ -2122,9 +2116,9 @@
 
 // Inlines array allocation for known constant values.
 static void InlineArrayAllocation(FlowGraphCompiler* compiler,
-                                   intptr_t num_elements,
-                                   Label* slow_path,
-                                   Label* done) {
+                                  intptr_t num_elements,
+                                  Label* slow_path,
+                                  Label* done) {
   const int kInlineArraySize = 12;  // Same as kInlineInstanceSize.
   const Register kLengthReg = R2;
   const Register kElemTypeReg = R1;
@@ -2133,19 +2127,16 @@
   __ TryAllocateArray(kArrayCid, instance_size, slow_path,
                       R0,  // instance
                       R3,  // end address
-                      R6,
-                      R8);
+                      R6, R8);
   // R0: new object start as a tagged pointer.
   // R3: new object end address.
 
   // Store the type argument field.
-  __ StoreIntoObjectNoBarrier(R0,
-                              FieldAddress(R0, Array::type_arguments_offset()),
-                              kElemTypeReg);
+  __ StoreIntoObjectNoBarrier(
+      R0, FieldAddress(R0, Array::type_arguments_offset()), kElemTypeReg);
 
   // Set the length field.
-  __ StoreIntoObjectNoBarrier(R0,
-                              FieldAddress(R0, Array::length_offset()),
+  __ StoreIntoObjectNoBarrier(R0, FieldAddress(R0, Array::length_offset()),
                               kLengthReg);
 
   // TODO(zra): Use stp once added.
@@ -2188,8 +2179,7 @@
   ASSERT(locs()->in(kElementTypePos).reg() == kElemTypeReg);
   ASSERT(locs()->in(kLengthPos).reg() == kLengthReg);
 
-  if (compiler->is_optimizing() &&
-      !FLAG_precompiled_mode &&
+  if (compiler->is_optimizing() && !FLAG_precompiled_mode &&
       num_elements()->BindsToConstant() &&
       num_elements()->BoundConstant().IsSmi()) {
     const intptr_t length = Smi::Cast(num_elements()->BoundConstant()).Value();
@@ -2198,13 +2188,10 @@
       InlineArrayAllocation(compiler, length, &slow_path, &done);
       __ Bind(&slow_path);
       __ PushObject(Object::null_object());  // Make room for the result.
-      __ Push(kLengthReg);  // length.
+      __ Push(kLengthReg);                   // length.
       __ Push(kElemTypeReg);
-      compiler->GenerateRuntimeCall(token_pos(),
-                                    deopt_id(),
-                                    kAllocateArrayRuntimeEntry,
-                                    2,
-                                    locs());
+      compiler->GenerateRuntimeCall(token_pos(), deopt_id(),
+                                    kAllocateArrayRuntimeEntry, 2, locs());
       __ Drop(2);
       __ Pop(kResultReg);
       __ Bind(&done);
@@ -2214,10 +2201,8 @@
   const Code& stub = Code::ZoneHandle(compiler->zone(),
                                       StubCode::AllocateArray_entry()->code());
   compiler->AddStubCallTarget(stub);
-  compiler->GenerateCall(token_pos(),
-                         *StubCode::AllocateArray_entry(),
-                         RawPcDescriptors::kOther,
-                         locs());
+  compiler->GenerateCall(token_pos(), *StubCode::AllocateArray_entry(),
+                         RawPcDescriptors::kOther, locs());
   ASSERT(locs()->out(0).reg() == kResultReg);
 }
 
@@ -2226,13 +2211,11 @@
                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps =
-      (IsUnboxedLoad() && opt) ? 1 :
-          ((IsPotentialUnboxedLoad()) ? 1 : 0);
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps,
-      (opt && !IsPotentialUnboxedLoad())
-          ? LocationSummary::kNoCall
-          : LocationSummary::kCallOnSlowPath);
+      (IsUnboxedLoad() && opt) ? 1 : ((IsPotentialUnboxedLoad()) ? 1 : 0);
+  LocationSummary* locs = new (zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, (opt && !IsPotentialUnboxedLoad())
+                                       ? LocationSummary::kNoCall
+                                       : LocationSummary::kCallOnSlowPath);
 
   locs->set_in(0, Location::RequiresRegister());
 
@@ -2283,8 +2266,8 @@
 
     __ LoadObject(result_reg, Field::ZoneHandle(field()->Original()));
 
-    FieldAddress field_cid_operand(
-        result_reg, Field::guarded_cid_offset(), kUnsignedWord);
+    FieldAddress field_cid_operand(result_reg, Field::guarded_cid_offset(),
+                                   kUnsignedWord);
     FieldAddress field_nullability_operand(
         result_reg, Field::is_nullable_offset(), kUnsignedWord);
 
@@ -2313,11 +2296,8 @@
 
     {
       __ Bind(&load_double);
-      BoxAllocationSlowPath::Allocate(compiler,
-                                      this,
-                                      compiler->double_class(),
-                                      result_reg,
-                                      temp);
+      BoxAllocationSlowPath::Allocate(compiler, this, compiler->double_class(),
+                                      result_reg, temp);
       __ LoadFieldFromOffset(temp, instance_reg, offset_in_bytes());
       __ LoadDFieldFromOffset(VTMP, temp, Double::value_offset());
       __ StoreDFieldToOffset(VTMP, result_reg, Double::value_offset());
@@ -2326,11 +2306,8 @@
 
     {
       __ Bind(&load_float32x4);
-      BoxAllocationSlowPath::Allocate(compiler,
-                                      this,
-                                      compiler->float32x4_class(),
-                                      result_reg,
-                                      temp);
+      BoxAllocationSlowPath::Allocate(
+          compiler, this, compiler->float32x4_class(), result_reg, temp);
       __ LoadFieldFromOffset(temp, instance_reg, offset_in_bytes());
       __ LoadQFieldFromOffset(VTMP, temp, Float32x4::value_offset());
       __ StoreQFieldToOffset(VTMP, result_reg, Float32x4::value_offset());
@@ -2339,11 +2316,8 @@
 
     {
       __ Bind(&load_float64x2);
-      BoxAllocationSlowPath::Allocate(compiler,
-                                      this,
-                                      compiler->float64x2_class(),
-                                      result_reg,
-                                      temp);
+      BoxAllocationSlowPath::Allocate(
+          compiler, this, compiler->float64x2_class(), result_reg, temp);
       __ LoadFieldFromOffset(temp, instance_reg, offset_in_bytes());
       __ LoadQFieldFromOffset(VTMP, temp, Float64x2::value_offset());
       __ StoreQFieldToOffset(VTMP, result_reg, Float64x2::value_offset());
@@ -2361,8 +2335,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(R0));
   locs->set_out(0, Location::RegisterLocation(R0));
   return locs;
@@ -2378,23 +2352,21 @@
   __ PushObject(Object::null_object());  // Make room for the result.
   __ PushObject(type());
   __ Push(instantiator_reg);  // Push instantiator type arguments.
-  compiler->GenerateRuntimeCall(token_pos(),
-                                deopt_id(),
-                                kInstantiateTypeRuntimeEntry,
-                                2,
-                                locs());
-  __ Drop(2);  // Drop instantiator and uninstantiated type.
+  compiler->GenerateRuntimeCall(token_pos(), deopt_id(),
+                                kInstantiateTypeRuntimeEntry, 2, locs());
+  __ Drop(2);          // Drop instantiator and uninstantiated type.
   __ Pop(result_reg);  // Pop instantiated type.
   ASSERT(instantiator_reg == result_reg);
 }
 
 
 LocationSummary* InstantiateTypeArgumentsInstr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(R0));
   locs->set_out(0, Location::RegisterLocation(R0));
   return locs;
@@ -2446,12 +2418,10 @@
   __ PushObject(Object::null_object());  // Make room for the result.
   __ PushObject(type_arguments());
   __ Push(instantiator_reg);  // Push instantiator type arguments.
-  compiler->GenerateRuntimeCall(token_pos(),
-                                deopt_id(),
-                                kInstantiateTypeArgumentsRuntimeEntry,
-                                2,
+  compiler->GenerateRuntimeCall(token_pos(), deopt_id(),
+                                kInstantiateTypeArgumentsRuntimeEntry, 2,
                                 locs());
-  __ Drop(2);  // Drop instantiator and uninstantiated type arguments.
+  __ Drop(2);          // Drop instantiator and uninstantiated type arguments.
   __ Pop(result_reg);  // Pop instantiated type arguments.
   __ Bind(&type_arguments_instantiated);
 }
@@ -2463,7 +2433,7 @@
   ASSERT(opt);
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 3;
-  LocationSummary* locs = new(zone) LocationSummary(
+  LocationSummary* locs = new (zone) LocationSummary(
       zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   locs->set_temp(0, Location::RegisterLocation(R1));
   locs->set_temp(1, Location::RegisterLocation(R2));
@@ -2477,7 +2447,7 @@
  public:
   explicit AllocateContextSlowPath(
       AllocateUninitializedContextInstr* instruction)
-      : instruction_(instruction) { }
+      : instruction_(instruction) {}
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     __ Comment("AllocateContextSlowPath");
@@ -2494,8 +2464,7 @@
     compiler->AddStubCallTarget(stub);
     compiler->GenerateCall(instruction_->token_pos(),
                            *StubCode::AllocateContext_entry(),
-                           RawPcDescriptors::kOther,
-                           locs);
+                           RawPcDescriptors::kOther, locs);
     ASSERT(instruction_->locs()->out(0).reg() == R0);
     compiler->RestoreLiveRegisters(instruction_->locs());
     __ b(exit_label());
@@ -2506,7 +2475,6 @@
 };
 
 
-
 void AllocateUninitializedContextInstr::EmitNativeCode(
     FlowGraphCompiler* compiler) {
   Register temp0 = locs()->temp(0).reg();
@@ -2520,9 +2488,7 @@
 
   __ TryAllocateArray(kContextCid, instance_size, slow_path->entry_label(),
                       result,  // instance
-                      temp0,
-                      temp1,
-                      temp2);
+                      temp0, temp1, temp2);
 
   // Setup up number of context variables field.
   __ LoadImmediate(temp0, num_context_variables());
@@ -2536,8 +2502,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 1;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_temp(0, Location::RegisterLocation(R1));
   locs->set_out(0, Location::RegisterLocation(R0));
   return locs;
@@ -2549,18 +2515,16 @@
   ASSERT(locs()->out(0).reg() == R0);
 
   __ LoadImmediate(R1, num_context_variables());
-  compiler->GenerateCall(token_pos(),
-                         *StubCode::AllocateContext_entry(),
-                         RawPcDescriptors::kOther,
-                         locs());
+  compiler->GenerateCall(token_pos(), *StubCode::AllocateContext_entry(),
+                         RawPcDescriptors::kOther, locs());
 }
 
 LocationSummary* InitStaticFieldInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(R0));
   locs->set_temp(0, Location::RegisterLocation(R1));
   return locs;
@@ -2582,11 +2546,8 @@
   __ Bind(&call_runtime);
   __ PushObject(Object::null_object());  // Make room for (unused) result.
   __ Push(field);
-  compiler->GenerateRuntimeCall(token_pos(),
-                                deopt_id(),
-                                kInitStaticFieldRuntimeEntry,
-                                1,
-                                locs());
+  compiler->GenerateRuntimeCall(token_pos(), deopt_id(),
+                                kInitStaticFieldRuntimeEntry, 1, locs());
   __ Drop(2);  // Remove argument and result placeholder.
   __ Bind(&no_call);
 }
@@ -2596,8 +2557,8 @@
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(R0));
   locs->set_out(0, Location::RegisterLocation(R0));
   return locs;
@@ -2610,12 +2571,9 @@
 
   __ PushObject(Object::null_object());  // Make room for the result.
   __ Push(context_value);
-  compiler->GenerateRuntimeCall(token_pos(),
-                                deopt_id(),
-                                kCloneContextRuntimeEntry,
-                                1,
-                                locs());
-  __ Drop(1);  // Remove argument.
+  compiler->GenerateRuntimeCall(token_pos(), deopt_id(),
+                                kCloneContextRuntimeEntry, 1, locs());
+  __ Drop(1);      // Remove argument.
   __ Pop(result);  // Get result (cloned context).
 }
 
@@ -2629,19 +2587,16 @@
 
 void CatchBlockEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   __ Bind(compiler->GetJumpLabel(this));
-  compiler->AddExceptionHandler(catch_try_index(),
-                                try_index(),
+  compiler->AddExceptionHandler(catch_try_index(), try_index(),
                                 compiler->assembler()->CodeSize(),
-                                catch_handler_types_,
-                                needs_stacktrace());
+                                catch_handler_types_, needs_stacktrace());
   // On lazy deoptimization we patch the optimized code here to enter the
   // deoptimization stub.
   const intptr_t deopt_id = Thread::ToDeoptAfter(GetDeoptId());
   if (compiler->is_optimizing()) {
     compiler->AddDeoptIndexAtCall(deopt_id);
   } else {
-    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
-                                   deopt_id,
+    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, deopt_id,
                                    TokenPosition::kNoSource);
   }
   if (HasParallelMove()) {
@@ -2657,10 +2612,10 @@
 
   // Restore stack and initialize the two exception variables:
   // exception and stack trace variables.
-  __ StoreToOffset(kExceptionObjectReg,
-                   FP, exception_var().index() * kWordSize);
-  __ StoreToOffset(kStackTraceObjectReg,
-                   FP, stacktrace_var().index() * kWordSize);
+  __ StoreToOffset(kExceptionObjectReg, FP,
+                   exception_var().index() * kWordSize);
+  __ StoreToOffset(kStackTraceObjectReg, FP,
+                   stacktrace_var().index() * kWordSize);
 }
 
 
@@ -2668,7 +2623,7 @@
                                                               bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(zone) LocationSummary(
+  LocationSummary* summary = new (zone) LocationSummary(
       zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   summary->set_temp(0, Location::RequiresRegister());
   return summary;
@@ -2678,7 +2633,7 @@
 class CheckStackOverflowSlowPath : public SlowPathCode {
  public:
   explicit CheckStackOverflowSlowPath(CheckStackOverflowInstr* instruction)
-      : instruction_(instruction) { }
+      : instruction_(instruction) {}
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     if (FLAG_use_osr && osr_entry_label()->IsLinked()) {
@@ -2696,11 +2651,9 @@
     ASSERT(compiler->pending_deoptimization_env_ == NULL);
     Environment* env = compiler->SlowPathEnvironmentFor(instruction_);
     compiler->pending_deoptimization_env_ = env;
-    compiler->GenerateRuntimeCall(instruction_->token_pos(),
-                                  instruction_->deopt_id(),
-                                  kStackOverflowRuntimeEntry,
-                                  0,
-                                  instruction_->locs());
+    compiler->GenerateRuntimeCall(
+        instruction_->token_pos(), instruction_->deopt_id(),
+        kStackOverflowRuntimeEntry, 0, instruction_->locs());
 
     if (FLAG_use_osr && !compiler->is_optimizing() && instruction_->in_loop()) {
       // In unoptimized code, record loop stack checks as possible OSR entries.
@@ -2741,8 +2694,7 @@
     __ LoadObject(temp, compiler->parsed_function().function());
     intptr_t threshold =
         FLAG_optimization_counter_threshold * (loop_depth() + 1);
-    __ LoadFieldFromOffset(
-        temp, temp, Function::usage_counter_offset(), kWord);
+    __ LoadFieldFromOffset(temp, temp, Function::usage_counter_offset(), kWord);
     __ CompareImmediate(temp, threshold);
     __ b(slow_path->osr_entry_label(), GE);
   }
@@ -2758,9 +2710,10 @@
   const LocationSummary& locs = *shift_left->locs();
   const Register left = locs.in(0).reg();
   const Register result = locs.out(0).reg();
-  Label* deopt = shift_left->CanDeoptimize() ?
-      compiler->AddDeoptStub(shift_left->deopt_id(), ICData::kDeoptBinarySmiOp)
-      : NULL;
+  Label* deopt = shift_left->CanDeoptimize()
+                     ? compiler->AddDeoptStub(shift_left->deopt_id(),
+                                              ICData::kDeoptBinarySmiOp)
+                     : NULL;
   if (locs.in(1).IsConstant()) {
     const Object& constant = locs.in(1).constant();
     ASSERT(constant.IsSmi());
@@ -2799,7 +2752,7 @@
           !RangeUtils::IsWithin(right_range, 0, max_right - 1);
       if (right_needs_check) {
         __ CompareImmediate(right,
-            reinterpret_cast<int64_t>(Smi::New(max_right)));
+                            reinterpret_cast<int64_t>(Smi::New(max_right)));
         __ b(deopt, CS);
       }
       __ SmiUntag(TMP, right);
@@ -2820,8 +2773,8 @@
         __ b(deopt, MI);
       }
 
-      __ CompareImmediate(
-          right, reinterpret_cast<int64_t>(Smi::New(Smi::kBits)));
+      __ CompareImmediate(right,
+                          reinterpret_cast<int64_t>(Smi::New(Smi::kBits)));
       __ csel(result, ZR, result, CS);
       __ SmiUntag(TMP, right);
       __ lslv(TMP, left, TMP);
@@ -2833,8 +2786,8 @@
   } else {
     if (right_needs_check) {
       ASSERT(shift_left->CanDeoptimize());
-      __ CompareImmediate(
-          right, reinterpret_cast<int64_t>(Smi::New(Smi::kBits)));
+      __ CompareImmediate(right,
+                          reinterpret_cast<int64_t>(Smi::New(Smi::kBits)));
       __ b(deopt, CS);
     }
     // Left is not a constant.
@@ -2855,7 +2808,7 @@
 class CheckedSmiSlowPath : public SlowPathCode {
  public:
   CheckedSmiSlowPath(CheckedSmiOpInstr* instruction, intptr_t try_index)
-      : instruction_(instruction), try_index_(try_index) { }
+      : instruction_(instruction), try_index_(try_index) {}
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     if (Assembler::EmittingComments()) {
@@ -2870,12 +2823,9 @@
     __ Push(locs->in(0).reg());
     __ Push(locs->in(1).reg());
     compiler->EmitMegamorphicInstanceCall(
-        *instruction_->call()->ic_data(),
-        instruction_->call()->ArgumentCount(),
-        instruction_->call()->deopt_id(),
-        instruction_->call()->token_pos(),
-        locs,
-        try_index_,
+        *instruction_->call()->ic_data(), instruction_->call()->ArgumentCount(),
+        instruction_->call()->deopt_id(), instruction_->call()->token_pos(),
+        locs, try_index_,
         /* slow_path_argument_count = */ 2);
     __ mov(result, R0);
     compiler->RestoreLiveRegisters(locs);
@@ -2892,7 +2842,7 @@
                                                         bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
+  LocationSummary* summary = new (zone) LocationSummary(
       zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
@@ -2954,6 +2904,31 @@
     case Token::kBIT_XOR:
       __ eor(result, left, Operand(right));
       break;
+    case Token::kSHL:
+      ASSERT(result != left);
+      ASSERT(result != right);
+      __ CompareImmediate(right,
+                          reinterpret_cast<int64_t>(Smi::New(Smi::kBits)));
+      __ b(slow_path->entry_label(), CS);
+
+      __ SmiUntag(TMP, right);
+      __ lslv(result, left, TMP);
+      __ asrv(TMP2, result, TMP);
+      __ CompareRegisters(left, TMP2);
+      __ b(slow_path->entry_label(), NE);  // Overflow.
+      break;
+    case Token::kSHR:
+      ASSERT(result != left);
+      ASSERT(result != right);
+      __ CompareImmediate(right,
+                          reinterpret_cast<int64_t>(Smi::New(Smi::kBits)));
+      __ b(slow_path->entry_label(), CS);
+
+      __ SmiUntag(result, right);
+      __ SmiUntag(TMP, left);
+      __ asrv(result, TMP, result);
+      __ SmiTag(result);
+      break;
     default:
       UNIMPLEMENTED();
   }
@@ -2970,7 +2945,7 @@
       : instruction_(instruction),
         try_index_(try_index),
         labels_(labels),
-        merged_(merged) { }
+        merged_(merged) {}
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     if (Assembler::EmittingComments()) {
@@ -2985,21 +2960,19 @@
     __ Push(locs->in(0).reg());
     __ Push(locs->in(1).reg());
     compiler->EmitMegamorphicInstanceCall(
-        *instruction_->call()->ic_data(),
-        instruction_->call()->ArgumentCount(),
-        instruction_->call()->deopt_id(),
-        instruction_->call()->token_pos(),
-        locs,
-        try_index_,
+        *instruction_->call()->ic_data(), instruction_->call()->ArgumentCount(),
+        instruction_->call()->deopt_id(), instruction_->call()->token_pos(),
+        locs, try_index_,
         /* slow_path_argument_count = */ 2);
     __ mov(result, R0);
     compiler->RestoreLiveRegisters(locs);
     if (merged_) {
       __ CompareObject(result, Bool::True());
-      __ b(instruction_->is_negated()
-           ? labels_.false_label : labels_.true_label, EQ);
-      __ b(instruction_->is_negated()
-           ? labels_.true_label : labels_.false_label);
+      __ b(
+          instruction_->is_negated() ? labels_.false_label : labels_.true_label,
+          EQ);
+      __ b(instruction_->is_negated() ? labels_.true_label
+                                      : labels_.false_label);
     } else {
       __ b(exit_label());
     }
@@ -3014,10 +2987,11 @@
 
 
 LocationSummary* CheckedSmiComparisonInstr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(zone) LocationSummary(
+  LocationSummary* summary = new (zone) LocationSummary(
       zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
@@ -3028,7 +3002,8 @@
 
 
 Condition CheckedSmiComparisonInstr::EmitComparisonCode(
-    FlowGraphCompiler* compiler, BranchLabels labels) {
+    FlowGraphCompiler* compiler,
+    BranchLabels labels) {
   return EmitSmiComparisonOp(compiler, locs(), kind());
 }
 
@@ -3055,11 +3030,9 @@
 void CheckedSmiComparisonInstr::EmitBranchCode(FlowGraphCompiler* compiler,
                                                BranchInstr* branch) {
   BranchLabels labels = compiler->CreateBranchLabels(branch);
-  CheckedSmiComparisonSlowPath* slow_path =
-      new CheckedSmiComparisonSlowPath(this,
-                                       compiler->CurrentTryIndex(),
-                                       labels,
-                                       /* merged = */ true);
+  CheckedSmiComparisonSlowPath* slow_path = new CheckedSmiComparisonSlowPath(
+      this, compiler->CurrentTryIndex(), labels,
+      /* merged = */ true);
   compiler->AddSlowPathCode(slow_path);
   EMIT_SMI_CHECK;
   Condition true_condition = EmitComparisonCode(compiler, labels);
@@ -3070,16 +3043,13 @@
 
 void CheckedSmiComparisonInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Label true_label, false_label, done;
-  BranchLabels labels = { &true_label, &false_label, &false_label };
-  CheckedSmiComparisonSlowPath* slow_path =
-      new CheckedSmiComparisonSlowPath(this,
-                                       compiler->CurrentTryIndex(),
-                                       labels,
-                                       /* merged = */ false);
+  BranchLabels labels = {&true_label, &false_label, &false_label};
+  CheckedSmiComparisonSlowPath* slow_path = new CheckedSmiComparisonSlowPath(
+      this, compiler->CurrentTryIndex(), labels,
+      /* merged = */ false);
   compiler->AddSlowPathCode(slow_path);
   EMIT_SMI_CHECK;
-  Condition true_condition =
-      EmitComparisonCode(compiler, labels);
+  Condition true_condition = EmitComparisonCode(compiler, labels);
   EmitBranchOnCondition(compiler, true_condition, labels);
   Register result = locs()->out(0).reg();
   __ Bind(&false_label);
@@ -3095,11 +3065,12 @@
 LocationSummary* BinarySmiOpInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
-  const intptr_t kNumTemps =
-      (((op_kind() == Token::kSHL) && can_overflow()) ||
-       (op_kind() == Token::kSHR)) ? 1 : 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  const intptr_t kNumTemps = (((op_kind() == Token::kSHL) && can_overflow()) ||
+                              (op_kind() == Token::kSHR))
+                                 ? 1
+                                 : 0;
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   if (op_kind() == Token::kTRUNCDIV) {
     summary->set_in(0, Location::RequiresRegister());
     if (RightIsPowerOfTwoConstant()) {
@@ -3215,8 +3186,8 @@
         // Asr operation masks the count to 6 bits.
         const intptr_t kCountLimit = 0x3F;
         intptr_t value = Smi::Cast(constant).Value();
-        __ AsrImmediate(
-            result, left, Utils::Minimum(value + kSmiTagSize, kCountLimit));
+        __ AsrImmediate(result, left,
+                        Utils::Minimum(value + kSmiTagSize, kCountLimit));
         __ SmiTag(result);
         break;
       }
@@ -3253,11 +3224,11 @@
       if (deopt == NULL) {
         __ mul(result, TMP, right);
       } else {
-          __ mul(result, TMP, right);
-          __ smulh(TMP, TMP, right);
-          // TMP: result bits 64..127.
-          __ cmp(TMP, Operand(result, ASR, 63));
-          __ b(deopt, NE);
+        __ mul(result, TMP, right);
+        __ smulh(TMP, TMP, right);
+        // TMP: result bits 64..127.
+        __ cmp(TMP, Operand(result, ASR, 63));
+        __ b(deopt, NE);
       }
       break;
     }
@@ -3376,8 +3347,8 @@
   ASSERT((left_cid != kDoubleCid) && (right_cid != kDoubleCid));
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   return summary;
@@ -3385,9 +3356,9 @@
 
 
 void CheckEitherNonSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label* deopt = compiler->AddDeoptStub(deopt_id(),
-                                        ICData::kDeoptBinaryDoubleOp,
-                                        licm_hoisted_ ? ICData::kHoisted : 0);
+  Label* deopt =
+      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryDoubleOp,
+                             licm_hoisted_ ? ICData::kHoisted : 0);
   intptr_t left_cid = left()->Type()->ToCid();
   intptr_t right_cid = right()->Type()->ToCid();
   const Register left = locs()->in(0).reg();
@@ -3406,11 +3377,10 @@
 }
 
 
-LocationSummary* BoxInstr::MakeLocationSummary(Zone* zone,
-                                               bool opt) const {
+LocationSummary* BoxInstr::MakeLocationSummary(Zone* zone, bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(zone) LocationSummary(
+  LocationSummary* summary = new (zone) LocationSummary(
       zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_temp(0, Location::RequiresRegister());
@@ -3424,12 +3394,9 @@
   const Register temp_reg = locs()->temp(0).reg();
   const VRegister value = locs()->in(0).fpu_reg();
 
-  BoxAllocationSlowPath::Allocate(
-      compiler,
-      this,
-      compiler->BoxClassFor(from_representation()),
-      out_reg,
-      temp_reg);
+  BoxAllocationSlowPath::Allocate(compiler, this,
+                                  compiler->BoxClassFor(from_representation()),
+                                  out_reg, temp_reg);
 
   switch (from_representation()) {
     case kUnboxedDouble:
@@ -3447,12 +3414,11 @@
 }
 
 
-LocationSummary* UnboxInstr::MakeLocationSummary(Zone* zone,
-                                                 bool opt) const {
+LocationSummary* UnboxInstr::MakeLocationSummary(Zone* zone, bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -3522,8 +3488,8 @@
     EmitSmiConversion(compiler);
   } else {
     const Register box = locs()->in(0).reg();
-    Label* deopt = compiler->AddDeoptStub(GetDeoptId(),
-                                          ICData::kDeoptCheckClass);
+    Label* deopt =
+        compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptCheckClass);
     Label is_smi;
 
     if ((value()->Type()->ToNullableCid() == box_cid) &&
@@ -3556,11 +3522,8 @@
          (from_representation() == kUnboxedUint32));
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone,
-      kNumInputs,
-      kNumTemps,
-      LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -3591,8 +3554,8 @@
                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -3603,8 +3566,10 @@
   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;
+  Label* deopt =
+      CanDeoptimize()
+          ? compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptUnboxInteger)
+          : NULL;
 
   if (value_cid == kSmiCid) {
     __ SmiUntag(out, value);
@@ -3646,8 +3611,8 @@
                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -3660,11 +3625,20 @@
   const VRegister right = locs()->in(1).fpu_reg();
   const VRegister result = locs()->out(0).fpu_reg();
   switch (op_kind()) {
-    case Token::kADD: __ faddd(result, left, right); break;
-    case Token::kSUB: __ fsubd(result, left, right); break;
-    case Token::kMUL: __ fmuld(result, left, right); break;
-    case Token::kDIV: __ fdivd(result, left, right); break;
-    default: UNREACHABLE();
+    case Token::kADD:
+      __ faddd(result, left, right);
+      break;
+    case Token::kSUB:
+      __ fsubd(result, left, right);
+      break;
+    case Token::kMUL:
+      __ fmuld(result, left, right);
+      break;
+    case Token::kDIV:
+      __ fdivd(result, left, right);
+      break;
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -3674,8 +3648,8 @@
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps =
       op_kind() == MethodRecognizer::kDouble_getIsInfinite ? 1 : 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   if (op_kind() == MethodRecognizer::kDouble_getIsInfinite) {
     summary->set_temp(0, Location::RequiresRegister());
@@ -3718,7 +3692,7 @@
 void DoubleTestOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   ASSERT(compiler->is_optimizing());
   Label is_true, is_false;
-  BranchLabels labels = { &is_true, &is_false, &is_false };
+  BranchLabels labels = {&is_true, &is_false, &is_false};
   Condition true_condition = EmitComparisonCode(compiler, labels);
   const Register result = locs()->out(0).reg();
   if (op_kind() == MethodRecognizer::kDouble_getIsNaN) {
@@ -3737,8 +3711,8 @@
                                                              bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -3752,11 +3726,20 @@
   const VRegister result = locs()->out(0).fpu_reg();
 
   switch (op_kind()) {
-    case Token::kADD: __ vadds(result, left, right); break;
-    case Token::kSUB: __ vsubs(result, left, right); break;
-    case Token::kMUL: __ vmuls(result, left, right); break;
-    case Token::kDIV: __ vdivs(result, left, right); break;
-    default: UNREACHABLE();
+    case Token::kADD:
+      __ vadds(result, left, right);
+      break;
+    case Token::kSUB:
+      __ vsubs(result, left, right);
+      break;
+    case Token::kMUL:
+      __ vmuls(result, left, right);
+      break;
+    case Token::kDIV:
+      __ vdivs(result, left, right);
+      break;
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -3765,8 +3748,8 @@
                                                              bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -3780,11 +3763,20 @@
   const VRegister result = locs()->out(0).fpu_reg();
 
   switch (op_kind()) {
-    case Token::kADD: __ vaddd(result, left, right); break;
-    case Token::kSUB: __ vsubd(result, left, right); break;
-    case Token::kMUL: __ vmuld(result, left, right); break;
-    case Token::kDIV: __ vdivd(result, left, right); break;
-    default: UNREACHABLE();
+    case Token::kADD:
+      __ vaddd(result, left, right);
+      break;
+    case Token::kSUB:
+      __ vsubd(result, left, right);
+      break;
+    case Token::kMUL:
+      __ vmuld(result, left, right);
+      break;
+    case Token::kDIV:
+      __ vdivd(result, left, right);
+      break;
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -3793,8 +3785,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new LocationSummary(zone, kNumInputs, kNumTemps,
+                                                 LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -3830,7 +3822,7 @@
         __ vdups(result, value, 1);
       } else if (mask_ == 0xAA) {
         __ vdups(result, value, 2);
-      } else  if (mask_ == 0xFF) {
+      } else if (mask_ == 0xFF) {
         __ vdups(result, value, 3);
       } else {
         __ vinss(result, 0, value, mask_ & 0x3);
@@ -3839,7 +3831,8 @@
         __ vinss(result, 3, value, (mask_ >> 6) & 0x3);
       }
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -3848,8 +3841,8 @@
                                                               bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new LocationSummary(zone, kNumInputs, kNumTemps,
+                                                 LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -3870,7 +3863,8 @@
       __ vinss(result, 2, right, (mask_ >> 4) & 0x3);
       __ vinss(result, 3, right, (mask_ >> 6) & 0x3);
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -3879,8 +3873,8 @@
                                                                bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary =  new LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new LocationSummary(zone, kNumInputs, kNumTemps,
+                                                 LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_temp(0, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresRegister());
@@ -3914,11 +3908,12 @@
 
 
 LocationSummary* Float32x4ConstructorInstr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   const intptr_t kNumInputs = 4;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_in(2, Location::RequiresFpuRegister());
@@ -3950,8 +3945,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
 }
@@ -3967,8 +3962,8 @@
                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -3991,8 +3986,8 @@
                                                                bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -4027,7 +4022,8 @@
       __ vcges(result, right, left);
       break;
 
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -4036,8 +4032,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -4057,7 +4053,8 @@
     case MethodRecognizer::kFloat32x4Max:
       __ vmaxs(result, left, right);
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -4066,8 +4063,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -4088,7 +4085,8 @@
     case MethodRecognizer::kFloat32x4ReciprocalSqrt:
       __ VRSqrts(result, left);
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -4097,8 +4095,8 @@
                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -4117,7 +4115,8 @@
       __ vdups(result, VTMP, 0);
       __ vmuls(result, result, right);
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -4126,8 +4125,8 @@
                                                             bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new LocationSummary(zone, kNumInputs, kNumTemps,
+                                                 LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -4145,7 +4144,8 @@
     case MethodRecognizer::kFloat32x4Absolute:
       __ vabss(result, left);
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -4154,8 +4154,8 @@
                                                           bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_in(2, Location::RequiresFpuRegister());
@@ -4178,8 +4178,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new LocationSummary(zone, kNumInputs, kNumTemps,
+                                                 LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -4210,7 +4210,8 @@
     case MethodRecognizer::kFloat32x4WithW:
       __ vinss(result, 3, VTMP, 0);
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -4219,8 +4220,8 @@
                                                               bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new LocationSummary(zone, kNumInputs, kNumTemps,
+                                                 LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -4241,8 +4242,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -4260,7 +4261,8 @@
     case MethodRecognizer::kFloat64x2GetY:
       __ vinsd(result, 0, value, 1);
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -4269,8 +4271,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
 }
@@ -4286,8 +4288,8 @@
                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -4302,11 +4304,12 @@
 
 
 LocationSummary* Float64x2ConstructorInstr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -4324,11 +4327,12 @@
 
 
 LocationSummary* Float64x2ToFloat32x4Instr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new LocationSummary(zone, kNumInputs, kNumTemps,
+                                                 LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -4353,11 +4357,12 @@
 
 
 LocationSummary* Float32x4ToFloat64x2Instr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new LocationSummary(zone, kNumInputs, kNumTemps,
+                                                 LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -4383,8 +4388,8 @@
                                                             bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
 
   if (representation() == kTagged) {
     ASSERT(op_kind() == MethodRecognizer::kFloat64x2GetSignMask);
@@ -4428,7 +4433,8 @@
     case MethodRecognizer::kFloat64x2Sqrt:
       __ vsqrtd(result, value);
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -4437,8 +4443,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new LocationSummary(zone, kNumInputs, kNumTemps,
+                                                 LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -4469,17 +4475,18 @@
     case MethodRecognizer::kFloat64x2Max:
       __ vmaxd(out, left, right);
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
 
-LocationSummary* Int32x4ConstructorInstr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+LocationSummary* Int32x4ConstructorInstr::MakeLocationSummary(Zone* zone,
+                                                              bool opt) const {
   const intptr_t kNumInputs = 4;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   summary->set_in(2, Location::RequiresRegister());
@@ -4504,11 +4511,12 @@
 
 
 LocationSummary* Int32x4BoolConstructorInstr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   const intptr_t kNumInputs = 4;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new LocationSummary(zone, kNumInputs, kNumTemps,
+                                                 LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   summary->set_in(2, Location::RequiresRegister());
@@ -4557,8 +4565,8 @@
                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new LocationSummary(zone, kNumInputs, kNumTemps,
+                                                 LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -4582,7 +4590,8 @@
     case MethodRecognizer::kInt32x4GetFlagW:
       __ vmovrs(result, value, 3);
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 
   __ tst(result, Operand(result));
@@ -4596,8 +4605,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new LocationSummary(zone, kNumInputs, kNumTemps,
+                                                 LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_in(2, Location::RequiresFpuRegister());
@@ -4631,8 +4640,8 @@
                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new LocationSummary(zone, kNumInputs, kNumTemps,
+                                                 LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -4665,7 +4674,8 @@
     case MethodRecognizer::kInt32x4WithFlagW:
       __ vinsw(result, 3, TMP);
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -4674,8 +4684,8 @@
                                                               bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new LocationSummary(zone, kNumInputs, kNumTemps,
+                                                 LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -4696,8 +4706,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new LocationSummary(zone, kNumInputs, kNumTemps,
+                                                 LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -4710,12 +4720,23 @@
   const VRegister right = locs()->in(1).fpu_reg();
   const VRegister result = locs()->out(0).fpu_reg();
   switch (op_kind()) {
-    case Token::kBIT_AND: __ vand(result, left, right); break;
-    case Token::kBIT_OR: __ vorr(result, left, right); break;
-    case Token::kBIT_XOR: __ veor(result, left, right); break;
-    case Token::kADD: __ vaddw(result, left, right); break;
-    case Token::kSUB: __ vsubw(result, left, right); break;
-    default: UNREACHABLE();
+    case Token::kBIT_AND:
+      __ vand(result, left, right);
+      break;
+    case Token::kBIT_OR:
+      __ vorr(result, left, right);
+      break;
+    case Token::kBIT_XOR:
+      __ veor(result, left, right);
+      break;
+    case Token::kADD:
+      __ vaddw(result, left, right);
+      break;
+    case Token::kSUB:
+      __ vsubw(result, left, right);
+      break;
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -4726,8 +4747,8 @@
          (kind() == MathUnaryInstr::kDoubleSquare));
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -4750,10 +4771,11 @@
 
 
 LocationSummary* CaseInsensitiveCompareUC16Instr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, InputCount(), kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, InputCount(), kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(R0));
   summary->set_in(1, Location::RegisterLocation(R1));
   summary->set_in(2, Location::RegisterLocation(R2));
@@ -4765,7 +4787,6 @@
 
 void CaseInsensitiveCompareUC16Instr::EmitNativeCode(
     FlowGraphCompiler* compiler) {
-
   // Call the function.
   __ CallRuntime(TargetFunction(), TargetFunction().argument_count());
 }
@@ -4776,8 +4797,8 @@
   if (result_cid() == kDoubleCid) {
     const intptr_t kNumInputs = 2;
     const intptr_t kNumTemps = 0;
-    LocationSummary* summary = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresFpuRegister());
     summary->set_in(1, Location::RequiresFpuRegister());
     // Reuse the left register so that code can be made shorter.
@@ -4787,8 +4808,8 @@
   ASSERT(result_cid() == kSmiCid);
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   // Reuse the left register so that code can be made shorter.
@@ -4861,8 +4882,8 @@
                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   // We make use of 3-operand instructions by not requiring result register
   // to be identical to first input register as on Intel.
@@ -4896,8 +4917,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -4912,11 +4933,11 @@
 
 
 LocationSummary* Int32ToDoubleInstr::MakeLocationSummary(Zone* zone,
-                                                       bool opt) const {
+                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresRegister());
   result->set_out(0, Location::RequiresFpuRegister());
   return result;
@@ -4934,8 +4955,8 @@
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresRegister());
   result->set_out(0, Location::RequiresFpuRegister());
   return result;
@@ -4966,8 +4987,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* result = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   result->set_in(0, Location::RegisterLocation(R1));
   result->set_out(0, Location::RegisterLocation(R0));
   return result;
@@ -5003,13 +5024,10 @@
   const Function& target = Function::ZoneHandle(ic_data.GetTargetAt(0));
 
   const intptr_t kNumberOfArguments = 1;
-  compiler->GenerateStaticCall(deopt_id(),
-                               instance_call()->token_pos(),
-                               target,
+  compiler->GenerateStaticCall(deopt_id(), instance_call()->token_pos(), target,
                                kNumberOfArguments,
                                Object::null_array(),  // No argument names.,
-                               locs(),
-                               ICData::Handle());
+                               locs(), ICData::Handle());
   __ Bind(&done);
 }
 
@@ -5018,8 +5036,8 @@
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::RequiresRegister());
   return result;
@@ -5060,8 +5078,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::RequiresFpuRegister());
   return result;
@@ -5079,8 +5097,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::RequiresFpuRegister());
   return result;
@@ -5099,8 +5117,8 @@
   ASSERT((InputCount() == 1) || (InputCount() == 2));
   const intptr_t kNumTemps =
       (recognized_kind() == MethodRecognizer::kMathDoublePow) ? 1 : 0;
-  LocationSummary* result = new(zone) LocationSummary(
-      zone, InputCount(), kNumTemps, LocationSummary::kCall);
+  LocationSummary* result = new (zone)
+      LocationSummary(zone, InputCount(), kNumTemps, LocationSummary::kCall);
   result->set_in(0, Location::FpuRegisterLocation(V0));
   if (InputCount() == 2) {
     result->set_in(1, Location::FpuRegisterLocation(V1));
@@ -5147,7 +5165,7 @@
   // exponent == 0.0 -> return 1.0;
   __ fcmpdz(exp);
   __ b(&check_base, VS);  // NaN -> check base.
-  __ b(&skip_call, EQ);  // exp is 0.0, result is 1.0.
+  __ b(&skip_call, EQ);   // exp is 0.0, result is 1.0.
 
   // exponent == 1.0 ?
   __ fcmpd(exp, result);
@@ -5240,27 +5258,27 @@
   // Only use this instruction in optimized code.
   ASSERT(opt);
   const intptr_t kNumInputs = 1;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, 0, LocationSummary::kNoCall);
+  LocationSummary* summary =
+      new (zone) LocationSummary(zone, kNumInputs, 0, LocationSummary::kNoCall);
   if (representation() == kUnboxedDouble) {
     if (index() == 0) {
-      summary->set_in(0, Location::Pair(Location::RequiresFpuRegister(),
-                                        Location::Any()));
+      summary->set_in(
+          0, Location::Pair(Location::RequiresFpuRegister(), Location::Any()));
     } else {
       ASSERT(index() == 1);
-      summary->set_in(0, Location::Pair(Location::Any(),
-                                        Location::RequiresFpuRegister()));
+      summary->set_in(
+          0, Location::Pair(Location::Any(), Location::RequiresFpuRegister()));
     }
     summary->set_out(0, Location::RequiresFpuRegister());
   } else {
     ASSERT(representation() == kTagged);
     if (index() == 0) {
-      summary->set_in(0, Location::Pair(Location::RequiresRegister(),
-                                        Location::Any()));
+      summary->set_in(
+          0, Location::Pair(Location::RequiresRegister(), Location::Any()));
     } else {
       ASSERT(index() == 1);
-      summary->set_in(0, Location::Pair(Location::Any(),
-                                        Location::RequiresRegister()));
+      summary->set_in(
+          0, Location::Pair(Location::Any(), Location::RequiresRegister()));
     }
     summary->set_out(0, Location::RequiresRegister());
   }
@@ -5290,8 +5308,8 @@
   if (kind() == MergedMathInstr::kTruncDivMod) {
     const intptr_t kNumInputs = 2;
     const intptr_t kNumTemps = 0;
-    LocationSummary* summary = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     summary->set_in(1, Location::RequiresRegister());
     // Output is a pair of registers.
@@ -5364,13 +5382,13 @@
 
 
 LocationSummary* PolymorphicInstanceCallInstr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   return MakeCallSummary(zone);
 }
 
 
-LocationSummary* BranchInstr::MakeLocationSummary(Zone* zone,
-                                                  bool opt) const {
+LocationSummary* BranchInstr::MakeLocationSummary(Zone* zone, bool opt) const {
   comparison()->InitializeLocationSummary(zone, opt);
   // Branches don't produce a result.
   comparison()->locs()->set_out(0, Location::NoLocation());
@@ -5388,8 +5406,8 @@
   const intptr_t kNumInputs = 1;
   const bool need_mask_temp = IsDenseSwitch() && !IsDenseMask(ComputeCidMask());
   const intptr_t kNumTemps = !IsNullCheck() ? (need_mask_temp ? 2 : 1) : 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   if (!IsNullCheck()) {
     summary->set_temp(0, Location::RequiresRegister());
@@ -5402,8 +5420,7 @@
 
 
 void CheckClassInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label* deopt = compiler->AddDeoptStub(deopt_id(),
-                                        ICData::kDeoptCheckClass,
+  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckClass,
                                         licm_hoisted_ ? ICData::kHoisted : 0);
   if (IsNullCheck()) {
     __ CompareObject(locs()->in(0).reg(), Object::null_object());
@@ -5446,8 +5463,7 @@
 
   } else {
     GrowableArray<CidTarget> sorted_ic_data;
-    FlowGraphCompiler::SortICDataByCount(unary_checks(),
-                                         &sorted_ic_data,
+    FlowGraphCompiler::SortICDataByCount(unary_checks(), &sorted_ic_data,
                                          /* drop_smi = */ true);
     const intptr_t num_checks = sorted_ic_data.length();
     for (intptr_t i = 0; i < num_checks; i++) {
@@ -5469,8 +5485,8 @@
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   return summary;
 }
@@ -5488,8 +5504,8 @@
                                                     bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   return summary;
 }
@@ -5497,19 +5513,17 @@
 
 void CheckSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const Register value = locs()->in(0).reg();
-  Label* deopt = compiler->AddDeoptStub(deopt_id(),
-                                        ICData::kDeoptCheckSmi,
+  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckSmi,
                                         licm_hoisted_ ? ICData::kHoisted : 0);
   __ BranchIfNotSmi(value, deopt);
 }
 
 
-
 LocationSummary* GenericCheckBoundInstr::MakeLocationSummary(Zone* zone,
                                                              bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
+  LocationSummary* locs = new (zone) LocationSummary(
       zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   locs->set_in(kLengthPos, Location::RequiresRegister());
   locs->set_in(kIndexPos, Location::RequiresRegister());
@@ -5520,7 +5534,7 @@
 class RangeErrorSlowPath : public SlowPathCode {
  public:
   RangeErrorSlowPath(GenericCheckBoundInstr* instruction, intptr_t try_index)
-      : instruction_(instruction), try_index_(try_index) { }
+      : instruction_(instruction), try_index_(try_index) {}
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     if (Assembler::EmittingComments()) {
@@ -5532,11 +5546,8 @@
     __ Push(locs->in(1).reg());
     __ CallRuntime(kRangeErrorRuntimeEntry, 2);
     compiler->pc_descriptors_list()->AddDescriptor(
-        RawPcDescriptors::kOther,
-        compiler->assembler()->CodeSize(),
-        instruction_->deopt_id(),
-        instruction_->token_pos(),
-        try_index_);
+        RawPcDescriptors::kOther, compiler->assembler()->CodeSize(),
+        instruction_->deopt_id(), instruction_->token_pos(), try_index_);
     compiler->RecordSafepoint(locs, 2);
     __ brk(0);
   }
@@ -5569,8 +5580,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(kLengthPos, Location::RegisterOrSmiConstant(length()));
   locs->set_in(kIndexPos, Location::RegisterOrSmiConstant(index()));
   return locs;
@@ -5580,10 +5591,8 @@
 void CheckArrayBoundInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   uint32_t flags = generalized_ ? ICData::kGeneralized : 0;
   flags |= licm_hoisted_ ? ICData::kHoisted : 0;
-  Label* deopt = compiler->AddDeoptStub(
-      deopt_id(),
-      ICData::kDeoptCheckArrayBound,
-      flags);
+  Label* deopt =
+      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckArrayBound, flags);
 
   Location length_loc = locs()->in(kLengthPos);
   Location index_loc = locs()->in(kIndexPos);
@@ -5703,8 +5712,8 @@
                                                                bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   if (from() == kUnboxedMint) {
     UNREACHABLE();
   } else if (to() == kUnboxedMint) {
@@ -5756,42 +5765,33 @@
 }
 
 
-LocationSummary* ThrowInstr::MakeLocationSummary(Zone* zone,
-                                                 bool opt) const {
-  return new(zone) LocationSummary(zone, 0, 0, LocationSummary::kCall);
+LocationSummary* ThrowInstr::MakeLocationSummary(Zone* zone, bool opt) const {
+  return new (zone) LocationSummary(zone, 0, 0, LocationSummary::kCall);
 }
 
 
 void ThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  compiler->GenerateRuntimeCall(token_pos(),
-                                deopt_id(),
-                                kThrowRuntimeEntry,
-                                1,
+  compiler->GenerateRuntimeCall(token_pos(), deopt_id(), kThrowRuntimeEntry, 1,
                                 locs());
   __ brk(0);
 }
 
 
-LocationSummary* ReThrowInstr::MakeLocationSummary(Zone* zone,
-                                                   bool opt) const {
-  return new(zone) LocationSummary(zone, 0, 0, LocationSummary::kCall);
+LocationSummary* ReThrowInstr::MakeLocationSummary(Zone* zone, bool opt) const {
+  return new (zone) LocationSummary(zone, 0, 0, LocationSummary::kCall);
 }
 
 
 void ReThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   compiler->SetNeedsStacktrace(catch_try_index());
-  compiler->GenerateRuntimeCall(token_pos(),
-                                deopt_id(),
-                                kReThrowRuntimeEntry,
-                                2,
-                                locs());
+  compiler->GenerateRuntimeCall(token_pos(), deopt_id(), kReThrowRuntimeEntry,
+                                2, locs());
   __ brk(0);
 }
 
 
-LocationSummary* StopInstr::MakeLocationSummary(Zone* zone,
-                                                bool opt) const {
-  return new(zone) LocationSummary(zone, 0, 0, LocationSummary::kNoCall);
+LocationSummary* StopInstr::MakeLocationSummary(Zone* zone, bool opt) const {
+  return new (zone) LocationSummary(zone, 0, 0, LocationSummary::kNoCall);
 }
 
 
@@ -5807,9 +5807,8 @@
 }
 
 
-LocationSummary* GotoInstr::MakeLocationSummary(Zone* zone,
-                                                bool opt) const {
-  return new(zone) LocationSummary(zone, 0, 0, LocationSummary::kNoCall);
+LocationSummary* GotoInstr::MakeLocationSummary(Zone* zone, bool opt) const {
+  return new (zone) LocationSummary(zone, 0, 0, LocationSummary::kNoCall);
 }
 
 
@@ -5820,8 +5819,7 @@
     }
     // Add a deoptimization descriptor for deoptimizing instructions that
     // may be inserted before this instruction.
-    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
-                                   GetDeoptId(),
+    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, GetDeoptId(),
                                    TokenPosition::kNoSource);
   }
   if (HasParallelMove()) {
@@ -5841,8 +5839,8 @@
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
 
-  LocationSummary* summary = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
 
   summary->set_in(0, Location::RequiresRegister());
   summary->set_temp(0, Location::RequiresRegister());
@@ -5865,10 +5863,9 @@
 
   // Add the offset.
   Register offset_reg = locs()->in(0).reg();
-  Operand offset_opr =
-      (offset()->definition()->representation() == kTagged) ?
-      Operand(offset_reg, ASR, kSmiTagSize) :
-      Operand(offset_reg);
+  Operand offset_opr = (offset()->definition()->representation() == kTagged)
+                           ? Operand(offset_reg, ASR, kSmiTagSize)
+                           : Operand(offset_reg);
   __ add(target_address_reg, target_address_reg, offset_opr);
 
   // Jump to the absolute address.
@@ -5881,15 +5878,15 @@
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
   if (needs_number_check()) {
-    LocationSummary* locs = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+    LocationSummary* locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
     locs->set_in(0, Location::RegisterLocation(R0));
     locs->set_in(1, Location::RegisterLocation(R1));
     locs->set_out(0, Location::RegisterLocation(R0));
     return locs;
   }
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RegisterOrConstant(left()));
   // Only one of the inputs can be a constant. Choose register if the first one
   // is a constant.
@@ -5908,20 +5905,14 @@
   ASSERT(!left.IsConstant() || !right.IsConstant());
   Condition true_condition;
   if (left.IsConstant()) {
-    true_condition = compiler->EmitEqualityRegConstCompare(right.reg(),
-                                                           left.constant(),
-                                                           needs_number_check(),
-                                                           token_pos());
+    true_condition = compiler->EmitEqualityRegConstCompare(
+        right.reg(), left.constant(), needs_number_check(), token_pos());
   } else if (right.IsConstant()) {
-    true_condition = compiler->EmitEqualityRegConstCompare(left.reg(),
-                                                           right.constant(),
-                                                           needs_number_check(),
-                                                           token_pos());
+    true_condition = compiler->EmitEqualityRegConstCompare(
+        left.reg(), right.constant(), needs_number_check(), token_pos());
   } else {
-    true_condition = compiler->EmitEqualityRegRegCompare(left.reg(),
-                                                         right.reg(),
-                                                         needs_number_check(),
-                                                         token_pos());
+    true_condition = compiler->EmitEqualityRegRegCompare(
+        left.reg(), right.reg(), needs_number_check(), token_pos());
   }
   if (kind() != Token::kEQ_STRICT) {
     ASSERT(kind() == Token::kNE_STRICT);
@@ -5936,7 +5927,7 @@
   ASSERT(kind() == Token::kEQ_STRICT || kind() == Token::kNE_STRICT);
 
   Label is_true, is_false;
-  BranchLabels labels = { &is_true, &is_false, &is_false };
+  BranchLabels labels = {&is_true, &is_false, &is_false};
   Condition true_condition = EmitComparisonCode(compiler, labels);
   EmitBranchOnCondition(compiler, true_condition, labels);
 
@@ -5963,9 +5954,7 @@
 
 LocationSummary* BooleanNegateInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
-  return LocationSummary::Make(zone,
-                               1,
-                               Location::RequiresRegister(),
+  return LocationSummary::Make(zone, 1, Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
 
@@ -5991,9 +5980,7 @@
   const Code& stub = Code::ZoneHandle(
       compiler->zone(), StubCode::GetAllocationStubForClass(cls()));
   const StubEntry stub_entry(stub);
-  compiler->GenerateCall(token_pos(),
-                         stub_entry,
-                         RawPcDescriptors::kOther,
+  compiler->GenerateCall(token_pos(), stub_entry, RawPcDescriptors::kOther,
                          locs());
   compiler->AddStubCallTarget(stub);
   __ Drop(ArgumentCount());  // Discard arguments.
@@ -6008,12 +5995,12 @@
 }
 
 
-LocationSummary* GrowRegExpStackInstr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+LocationSummary* GrowRegExpStackInstr::MakeLocationSummary(Zone* zone,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(R0));
   locs->set_out(0, Location::RegisterLocation(R0));
   return locs;
@@ -6025,11 +6012,8 @@
   const Register result = locs()->out(0).reg();
   __ PushObject(Object::null_object());
   __ Push(typed_data);
-  compiler->GenerateRuntimeCall(TokenPosition::kNoSource,
-                                deopt_id(),
-                                kGrowRegExpStackRuntimeEntry,
-                                1,
-                                locs());
+  compiler->GenerateRuntimeCall(TokenPosition::kNoSource, deopt_id(),
+                                kGrowRegExpStackRuntimeEntry, 1, locs());
   __ Drop(1);
   __ Pop(result);
 }
diff --git a/runtime/vm/intermediate_language_dbc.cc b/runtime/vm/intermediate_language_dbc.cc
index ec13a83..207153d 100644
--- a/runtime/vm/intermediate_language_dbc.cc
+++ b/runtime/vm/intermediate_language_dbc.cc
@@ -43,7 +43,7 @@
   M(BinaryUint32Op)                                                            \
   M(ShiftUint32Op)                                                             \
   M(UnaryUint32Op)                                                             \
-  M(UnboxedIntConverter)                                                       \
+  M(UnboxedIntConverter)
 
 // List of instructions that are not used by DBC.
 // Things we aren't planning to implement for DBC:
@@ -92,7 +92,7 @@
   M(Float64x2ZeroArg)                                                          \
   M(Float64x2OneArg)                                                           \
   M(CheckedSmiOp)                                                              \
-  M(CheckedSmiComparison)                                                      \
+  M(CheckedSmiComparison)
 
 // Location summaries actually are not used by the unoptimizing DBC compiler
 // because we don't allocate any registers.
@@ -102,11 +102,12 @@
     Location output = Location::NoLocation(),
     LocationSummary::ContainsCall contains_call = LocationSummary::kNoCall,
     intptr_t num_temps = 0) {
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, num_inputs, num_temps, contains_call);
+  LocationSummary* locs =
+      new (zone) LocationSummary(zone, num_inputs, num_temps, contains_call);
   for (intptr_t i = 0; i < num_inputs; i++) {
-    locs->set_in(i, (contains_call == LocationSummary::kNoCall) ?
-        Location::RequiresRegister() : Location::RegisterLocation(i));
+    locs->set_in(i, (contains_call == LocationSummary::kNoCall)
+                        ? Location::RequiresRegister()
+                        : Location::RegisterLocation(i));
   }
   for (intptr_t i = 0; i < num_temps; i++) {
     locs->set_temp(i, Location::RequiresRegister());
@@ -123,25 +124,25 @@
   LocationSummary* Name##Instr::MakeLocationSummary(Zone* zone, bool opt)      \
       const {                                                                  \
     return CreateLocationSummary(zone, __VA_ARGS__);                           \
-  }                                                                            \
+  }
 
 #define EMIT_NATIVE_CODE(Name, ...)                                            \
   DEFINE_MAKE_LOCATION_SUMMARY(Name, __VA_ARGS__);                             \
-  void Name##Instr::EmitNativeCode(FlowGraphCompiler* compiler)                \
+  void Name##Instr::EmitNativeCode(FlowGraphCompiler* compiler)
 
 #define DEFINE_UNIMPLEMENTED_MAKE_LOCATION_SUMMARY(Name)                       \
   LocationSummary* Name##Instr::MakeLocationSummary(Zone* zone, bool opt)      \
       const {                                                                  \
     if (!opt) UNIMPLEMENTED();                                                 \
     return NULL;                                                               \
-  }                                                                            \
+  }
 
 #define DEFINE_UNREACHABLE_MAKE_LOCATION_SUMMARY(Name)                         \
   LocationSummary* Name##Instr::MakeLocationSummary(Zone* zone, bool opt)      \
       const {                                                                  \
     UNREACHABLE();                                                             \
     return NULL;                                                               \
-  }                                                                            \
+  }
 
 #define DEFINE_UNIMPLEMENTED_EMIT_NATIVE_CODE(Name)                            \
   void Name##Instr::EmitNativeCode(FlowGraphCompiler* compiler) {              \
@@ -165,7 +166,7 @@
 
 #define DEFINE_UNIMPLEMENTED(Name)                                             \
   DEFINE_UNIMPLEMENTED_MAKE_LOCATION_SUMMARY(Name)                             \
-  DEFINE_UNIMPLEMENTED_EMIT_NATIVE_CODE(Name)                                  \
+  DEFINE_UNIMPLEMENTED_EMIT_NATIVE_CODE(Name)
 
 FOR_EACH_UNIMPLEMENTED_INSTRUCTION(DEFINE_UNIMPLEMENTED)
 
@@ -173,7 +174,7 @@
 
 #define DEFINE_UNREACHABLE(Name)                                               \
   DEFINE_UNREACHABLE_MAKE_LOCATION_SUMMARY(Name)                               \
-  DEFINE_UNREACHABLE_EMIT_NATIVE_CODE(Name)                                    \
+  DEFINE_UNREACHABLE_EMIT_NATIVE_CODE(Name)
 
 FOR_EACH_UNREACHABLE_INSTRUCTION(DEFINE_UNREACHABLE)
 
@@ -184,7 +185,9 @@
 DEFINE_UNIMPLEMENTED_EMIT_BRANCH_CODE(CheckedSmiComparison)
 
 
-EMIT_NATIVE_CODE(InstanceOf, 2, Location::SameAsFirstInput(),
+EMIT_NATIVE_CODE(InstanceOf,
+                 2,
+                 Location::SameAsFirstInput(),
                  LocationSummary::kCall) {
   SubtypeTestCache& test_cache = SubtypeTestCache::Handle();
   if (!type().IsVoidType() && type().IsInstantiated()) {
@@ -199,33 +202,32 @@
   __ PushConstant(type());
   __ PushConstant(test_cache);
   __ InstanceOf(negate_result() ? 1 : 0);
-  compiler->RecordSafepoint(locs());
-  compiler->AddCurrentDescriptor(RawPcDescriptors::kOther,
-                                 deopt_id(),
+  compiler->AddCurrentDescriptor(RawPcDescriptors::kOther, deopt_id(),
                                  token_pos());
-
+  compiler->RecordAfterCall(this);
   if (compiler->is_optimizing()) {
     __ PopLocal(locs()->out(0).reg());
   }
 }
 
 
-DEFINE_MAKE_LOCATION_SUMMARY(AssertAssignable, 2,
+DEFINE_MAKE_LOCATION_SUMMARY(AssertAssignable,
+                             2,
                              Location::SameAsFirstInput(),
                              LocationSummary::kCall);
 
 
 EMIT_NATIVE_CODE(AssertBoolean,
-                 1, Location::SameAsFirstInput(),
+                 1,
+                 Location::SameAsFirstInput(),
                  LocationSummary::kCall) {
   if (compiler->is_optimizing()) {
     __ Push(locs()->in(0).reg());
   }
   __ AssertBoolean(Isolate::Current()->type_checks() ? 1 : 0);
-  compiler->RecordSafepoint(locs());
-  compiler->AddCurrentDescriptor(RawPcDescriptors::kOther,
-                                 deopt_id(),
+  compiler->AddCurrentDescriptor(RawPcDescriptors::kOther, deopt_id(),
                                  token_pos());
+  compiler->RecordAfterCall(this);
   if (compiler->is_optimizing()) {
     __ Drop1();
   }
@@ -233,13 +235,12 @@
 
 
 EMIT_NATIVE_CODE(PolymorphicInstanceCall,
-                 0, Location::RegisterLocation(0),
+                 0,
+                 Location::RegisterLocation(0),
                  LocationSummary::kCall) {
   ASSERT(ic_data().NumArgsTested() == 1);
-  const Array& arguments_descriptor =
-      Array::Handle(ArgumentsDescriptor::New(
-          instance_call()->ArgumentCount(),
-          instance_call()->argument_names()));
+  const Array& arguments_descriptor = Array::Handle(ArgumentsDescriptor::New(
+      instance_call()->ArgumentCount(), instance_call()->argument_names()));
   const intptr_t argdesc_kidx = __ AddConstant(arguments_descriptor);
 
   // Push the target onto the stack.
@@ -247,19 +248,18 @@
     const intptr_t may_be_smi =
         (ic_data().GetReceiverClassIdAt(0) == kSmiCid) ? 1 : 0;
     GrowableArray<CidTarget> sorted_ic_data;
-    FlowGraphCompiler::SortICDataByCount(ic_data(),
-                                         &sorted_ic_data,
+    FlowGraphCompiler::SortICDataByCount(ic_data(), &sorted_ic_data,
                                          /* drop_smi = */ true);
     const intptr_t sorted_length = sorted_ic_data.length();
     if (!Utils::IsUint(8, sorted_length)) {
       Unsupported(compiler);
       UNREACHABLE();
     }
-    __ PushPolymorphicInstanceCall(
-        instance_call()->ArgumentCount(), sorted_length + may_be_smi);
+    __ PushPolymorphicInstanceCall(instance_call()->ArgumentCount(),
+                                   sorted_length + may_be_smi);
     if (may_be_smi == 1) {
-      const Function& target = Function::ZoneHandle(
-          compiler->zone(), ic_data().GetTargetAt(0));
+      const Function& target =
+          Function::ZoneHandle(compiler->zone(), ic_data().GetTargetAt(0));
       __ Nop(compiler->ToEmbeddableCid(kSmiCid, this));
       __ Nop(__ AddConstant(target));
     }
@@ -268,8 +268,8 @@
       __ Nop(compiler->ToEmbeddableCid(sorted_ic_data[i].cid, this));
       __ Nop(__ AddConstant(target));
     }
-    compiler->EmitDeopt(
-        deopt_id(), ICData::kDeoptPolymorphicInstanceCallTestFail, 0);
+    compiler->EmitDeopt(deopt_id(),
+                        ICData::kDeoptPolymorphicInstanceCallTestFail, 0);
   } else {
     ASSERT(ic_data().HasOneTarget());
     const Function& target = Function::ZoneHandle(ic_data().GetTargetAt(0));
@@ -278,8 +278,8 @@
 
   // Call the function.
   __ StaticCall(instance_call()->ArgumentCount(), argdesc_kidx);
-  compiler->AddCurrentDescriptor(RawPcDescriptors::kOther,
-      deopt_id(), instance_call()->token_pos());
+  compiler->AddCurrentDescriptor(RawPcDescriptors::kOther, deopt_id(),
+                                 instance_call()->token_pos());
   compiler->RecordAfterCall(this);
   __ PopLocal(locs()->out(0).reg());
 }
@@ -291,11 +291,11 @@
 
 
 EMIT_NATIVE_CODE(CheckStackOverflow,
-                 0, Location::NoLocation(),
+                 0,
+                 Location::NoLocation(),
                  LocationSummary::kCall) {
   __ CheckStack();
-  compiler->AddCurrentDescriptor(RawPcDescriptors::kOther,
-                                 deopt_id(),
+  compiler->AddCurrentDescriptor(RawPcDescriptors::kOther, deopt_id(),
                                  token_pos());
   compiler->RecordAfterCall(this);
 }
@@ -319,11 +319,11 @@
   ASSERT(!compiler->is_optimizing());
   ASSERT(local().index() != 0);
   if (HasTemp()) {
-    __ StoreLocal(
-      (local().index() > 0) ? (-local().index()) : (-local().index() - 1));
+    __ StoreLocal((local().index() > 0) ? (-local().index())
+                                        : (-local().index() - 1));
   } else {
-    __ PopLocal(
-      (local().index() > 0) ? (-local().index()) : (-local().index() - 1));
+    __ PopLocal((local().index() > 0) ? (-local().index())
+                                      : (-local().index() - 1));
   }
 }
 
@@ -376,12 +376,12 @@
 }
 
 
-LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(Zone* zone,
+                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   for (intptr_t i = 0; i < kNumInputs; i++) {
     locs->set_in(i, Location::RequiresRegister());
   }
@@ -408,8 +408,7 @@
 
 EMIT_NATIVE_CODE(LoadStaticField, 1, Location::RequiresRegister()) {
   if (compiler->is_optimizing()) {
-    __ LoadField(locs()->out(0).reg(),
-                 locs()->in(0).reg(),
+    __ LoadField(locs()->out(0).reg(), locs()->in(0).reg(),
                  Field::static_value_offset() / kWordSize);
   } else {
     const intptr_t kidx = __ AddConstant(StaticField());
@@ -418,9 +417,13 @@
 }
 
 
-EMIT_NATIVE_CODE(InitStaticField, 0) {
-  ASSERT(!compiler->is_optimizing());
-  __ InitStaticTOS();
+EMIT_NATIVE_CODE(InitStaticField, 1) {
+  if (compiler->is_optimizing()) {
+    __ Push(locs()->in(0).reg());
+    __ InitStaticTOS();
+  } else {
+    __ InitStaticTOS();
+  }
 }
 
 
@@ -433,9 +436,8 @@
   }
 
   intptr_t argument_count = ArgumentCount();
-  const Array& arguments_descriptor =
-      Array::ZoneHandle(ArgumentsDescriptor::New(argument_count,
-                                                 argument_names()));
+  const Array& arguments_descriptor = Array::ZoneHandle(
+      ArgumentsDescriptor::New(argument_count, argument_names()));
   const intptr_t argdesc_kidx =
       compiler->assembler()->AddConstant(arguments_descriptor);
   __ StaticCall(argument_count, argdesc_kidx);
@@ -477,8 +479,7 @@
 
 Condition StrictCompareInstr::EmitComparisonCode(FlowGraphCompiler* compiler,
                                                  BranchLabels labels) {
-  ASSERT((kind() == Token::kNE_STRICT) ||
-         (kind() == Token::kEQ_STRICT));
+  ASSERT((kind() == Token::kNE_STRICT) || (kind() == Token::kEQ_STRICT));
 
   Token::Kind comparison;
   Condition condition;
@@ -488,32 +489,31 @@
   } else {
     // Flip comparison to save a jump.
     condition = NEXT_IS_FALSE;
-    comparison = (kind() == Token::kEQ_STRICT) ? Token::kNE_STRICT
-                                               : Token::kEQ_STRICT;
+    comparison =
+        (kind() == Token::kEQ_STRICT) ? Token::kNE_STRICT : Token::kEQ_STRICT;
   }
 
   if (!compiler->is_optimizing()) {
-    const Bytecode::Opcode eq_op = needs_number_check() ?
-        Bytecode::kIfEqStrictNumTOS : Bytecode::kIfEqStrictTOS;
-    const Bytecode::Opcode ne_op = needs_number_check() ?
-        Bytecode::kIfNeStrictNumTOS : Bytecode::kIfNeStrictTOS;
+    const Bytecode::Opcode eq_op = needs_number_check()
+                                       ? Bytecode::kIfEqStrictNumTOS
+                                       : Bytecode::kIfEqStrictTOS;
+    const Bytecode::Opcode ne_op = needs_number_check()
+                                       ? Bytecode::kIfNeStrictNumTOS
+                                       : Bytecode::kIfNeStrictTOS;
     __ Emit(comparison == Token::kEQ_STRICT ? eq_op : ne_op);
   } else {
-    const Bytecode::Opcode eq_op = needs_number_check() ?
-        Bytecode::kIfEqStrictNum : Bytecode::kIfEqStrict;
-    const Bytecode::Opcode ne_op = needs_number_check() ?
-        Bytecode::kIfNeStrictNum : Bytecode::kIfNeStrict;
-    __ Emit(Bytecode::Encode(
-        (comparison == Token::kEQ_STRICT) ? eq_op : ne_op,
-        locs()->in(0).reg(),
-        locs()->in(1).reg()));
+    const Bytecode::Opcode eq_op =
+        needs_number_check() ? Bytecode::kIfEqStrictNum : Bytecode::kIfEqStrict;
+    const Bytecode::Opcode ne_op =
+        needs_number_check() ? Bytecode::kIfNeStrictNum : Bytecode::kIfNeStrict;
+    __ Emit(Bytecode::Encode((comparison == Token::kEQ_STRICT) ? eq_op : ne_op,
+                             locs()->in(0).reg(), locs()->in(1).reg()));
   }
 
   if (needs_number_check() && token_pos().IsReal()) {
     compiler->RecordSafepoint(locs());
     compiler->AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall,
-                                   Thread::kNoDeoptId,
-                                   token_pos());
+                                   Thread::kNoDeoptId, token_pos());
   }
 
   return condition;
@@ -522,8 +522,7 @@
 
 void StrictCompareInstr::EmitBranchCode(FlowGraphCompiler* compiler,
                                         BranchInstr* branch) {
-  ASSERT((kind() == Token::kEQ_STRICT) ||
-         (kind() == Token::kNE_STRICT));
+  ASSERT((kind() == Token::kEQ_STRICT) || (kind() == Token::kNE_STRICT));
 
   BranchLabels labels = compiler->CreateBranchLabels(branch);
   Condition true_condition = EmitComparisonCode(compiler, labels);
@@ -536,11 +535,10 @@
                  Location::RequiresRegister(),
                  needs_number_check() ? LocationSummary::kCall
                                       : LocationSummary::kNoCall) {
-  ASSERT((kind() == Token::kEQ_STRICT) ||
-         (kind() == Token::kNE_STRICT));
+  ASSERT((kind() == Token::kEQ_STRICT) || (kind() == Token::kNE_STRICT));
 
   Label is_true, is_false;
-  BranchLabels labels = { &is_true, &is_false, &is_false };
+  BranchLabels labels = {&is_true, &is_false, &is_false};
   Condition true_condition = EmitComparisonCode(compiler, labels);
   EmitBranchOnCondition(compiler, true_condition, labels);
   Label done;
@@ -563,8 +561,7 @@
 }
 
 
-LocationSummary* BranchInstr::MakeLocationSummary(Zone* zone,
-                                                  bool opt) const {
+LocationSummary* BranchInstr::MakeLocationSummary(Zone* zone, bool opt) const {
   comparison()->InitializeLocationSummary(zone, opt);
   if (!comparison()->HasLocs()) {
     return NULL;
@@ -584,8 +581,7 @@
   if (!compiler->is_optimizing()) {
     // Add a deoptimization descriptor for deoptimizing instructions that
     // may be inserted before this instruction.
-    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
-                                   GetDeoptId(),
+    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, GetDeoptId(),
                                    TokenPosition::kNoSource);
   }
   if (HasParallelMove()) {
@@ -601,8 +597,7 @@
 
 Condition TestSmiInstr::EmitComparisonCode(FlowGraphCompiler* compiler,
                                            BranchLabels labels) {
-  ASSERT((kind() == Token::kEQ) ||
-         (kind() == Token::kNE));
+  ASSERT((kind() == Token::kEQ) || (kind() == Token::kNE));
   Register left = locs()->in(0).reg();
   Register right = locs()->in(1).reg();
   __ TestSmi(left, right);
@@ -628,7 +623,7 @@
 
 
 Condition TestCidsInstr::EmitComparisonCode(FlowGraphCompiler* compiler,
-                                           BranchLabels labels) {
+                                            BranchLabels labels) {
   ASSERT((kind() == Token::kIS) || (kind() == Token::kISNOT));
   const Register value = locs()->in(0).reg();
   const intptr_t true_result = (kind() == Token::kIS) ? 1 : 0;
@@ -647,8 +642,7 @@
 
   // No match found, deoptimize or false.
   if (CanDeoptimize()) {
-    compiler->EmitDeopt(deopt_id(),
-                        ICData::kDeoptTestCids,
+    compiler->EmitDeopt(deopt_id(), ICData::kDeoptTestCids,
                         licm_hoisted_ ? ICData::kHoisted : 0);
   } else {
     Label* target = result ? labels.false_label : labels.true_label;
@@ -667,11 +661,13 @@
 }
 
 
-EMIT_NATIVE_CODE(TestCids, 1, Location::RequiresRegister(),
+EMIT_NATIVE_CODE(TestCids,
+                 1,
+                 Location::RequiresRegister(),
                  LocationSummary::kNoCall) {
   Register result_reg = locs()->out(0).reg();
   Label is_true, is_false, done;
-  BranchLabels labels = { &is_true, &is_false, &is_false };
+  BranchLabels labels = {&is_true, &is_false, &is_false};
   EmitComparisonCode(compiler, labels);
   __ Jump(&is_true);
   __ Bind(&is_false);
@@ -684,7 +680,8 @@
 
 
 EMIT_NATIVE_CODE(CreateArray,
-                 2, Location::RequiresRegister(),
+                 2,
+                 Location::RequiresRegister(),
                  LocationSummary::kCall) {
   if (compiler->is_optimizing()) {
     const Register length = locs()->in(kLengthPos).reg();
@@ -694,17 +691,20 @@
     __ Push(type_arguments);
     __ Push(length);
     __ CreateArrayTOS();
-    compiler->RecordSafepoint(locs());
+    compiler->RecordAfterCall(this);
     __ PopLocal(out);
   } else {
     __ CreateArrayTOS();
-    compiler->RecordSafepoint(locs());
+    compiler->RecordAfterCall(this);
   }
 }
 
 
-EMIT_NATIVE_CODE(StoreIndexed, 3, Location::NoLocation(),
-                 LocationSummary::kNoCall, 1) {
+EMIT_NATIVE_CODE(StoreIndexed,
+                 3,
+                 Location::NoLocation(),
+                 LocationSummary::kNoCall,
+                 1) {
   if (!compiler->is_optimizing()) {
     ASSERT(class_id() == kArrayCid);
     __ StoreIndexedTOS();
@@ -783,8 +783,11 @@
 }
 
 
-EMIT_NATIVE_CODE(LoadIndexed, 2, Location::RequiresRegister(),
-                 LocationSummary::kNoCall, 1) {
+EMIT_NATIVE_CODE(LoadIndexed,
+                 2,
+                 Location::RequiresRegister(),
+                 LocationSummary::kNoCall,
+                 1) {
   ASSERT(compiler->is_optimizing());
   const Register array = locs()->in(0).reg();
   const Register index = locs()->in(1).reg();
@@ -894,7 +897,8 @@
 
 
 EMIT_NATIVE_CODE(StringInterpolate,
-                 1, Location::RegisterLocation(0),
+                 1,
+                 Location::RegisterLocation(0),
                  LocationSummary::kCall) {
   if (compiler->is_optimizing()) {
     __ Push(locs()->in(0).reg());
@@ -913,7 +917,8 @@
 
 
 EMIT_NATIVE_CODE(NativeCall,
-                 0, Location::NoLocation(),
+                 0,
+                 Location::NoLocation(),
                  LocationSummary::kCall) {
   SetupNative();
 
@@ -933,14 +938,14 @@
     __ NativeCall();
   }
   compiler->RecordSafepoint(locs());
-  compiler->AddCurrentDescriptor(RawPcDescriptors::kOther,
-                                 Thread::kNoDeoptId,
+  compiler->AddCurrentDescriptor(RawPcDescriptors::kOther, Thread::kNoDeoptId,
                                  token_pos());
 }
 
 
 EMIT_NATIVE_CODE(OneByteStringFromCharCode,
-                 1, Location::RequiresRegister(),
+                 1,
+                 Location::RequiresRegister(),
                  LocationSummary::kNoCall) {
   ASSERT(compiler->is_optimizing());
   const Register char_code = locs()->in(0).reg();  // Char code is a smi.
@@ -950,7 +955,8 @@
 
 
 EMIT_NATIVE_CODE(StringToCharCode,
-                 1, Location::RequiresRegister(),
+                 1,
+                 Location::RequiresRegister(),
                  LocationSummary::kNoCall) {
   ASSERT(cid_ == kOneByteStringCid);
   const Register str = locs()->in(0).reg();
@@ -960,7 +966,8 @@
 
 
 EMIT_NATIVE_CODE(AllocateObject,
-                 0, Location::RequiresRegister(),
+                 0,
+                 Location::RequiresRegister(),
                  LocationSummary::kCall) {
   if (ArgumentCount() == 1) {
     // Allocate with type arguments.
@@ -975,8 +982,8 @@
         ASSERT(cls().id() != kIllegalCid);
         tags = RawObject::ClassIdTag::update(cls().id(), tags);
         if (Smi::IsValid(tags)) {
-          const intptr_t tags_kidx = __ AddConstant(
-              Smi::Handle(Smi::New(tags)));
+          const intptr_t tags_kidx =
+              __ AddConstant(Smi::Handle(Smi::New(tags)));
           __ AllocateTOpt(locs()->out(0).reg(), tags_kidx);
           __ Nop(cls().type_arguments_field_offset());
         }
@@ -984,16 +991,14 @@
       __ PushConstant(cls());
       __ AllocateT();
       compiler->AddCurrentDescriptor(RawPcDescriptors::kOther,
-                                     Thread::kNoDeoptId,
-                                     token_pos());
+                                     Thread::kNoDeoptId, token_pos());
       compiler->RecordSafepoint(locs());
       __ PopLocal(locs()->out(0).reg());
     } else {
       __ PushConstant(cls());
       __ AllocateT();
       compiler->AddCurrentDescriptor(RawPcDescriptors::kOther,
-                                     Thread::kNoDeoptId,
-                                     token_pos());
+                                     Thread::kNoDeoptId, token_pos());
       compiler->RecordSafepoint(locs());
     }
   } else if (compiler->is_optimizing()) {
@@ -1013,16 +1018,14 @@
     }
     const intptr_t kidx = __ AddConstant(cls());
     __ Allocate(kidx);
-    compiler->AddCurrentDescriptor(RawPcDescriptors::kOther,
-                                   Thread::kNoDeoptId,
+    compiler->AddCurrentDescriptor(RawPcDescriptors::kOther, Thread::kNoDeoptId,
                                    token_pos());
     compiler->RecordSafepoint(locs());
     __ PopLocal(locs()->out(0).reg());
   } else {
     const intptr_t kidx = __ AddConstant(cls());
     __ Allocate(kidx);
-    compiler->AddCurrentDescriptor(RawPcDescriptors::kOther,
-                                   Thread::kNoDeoptId,
+    compiler->AddCurrentDescriptor(RawPcDescriptors::kOther, Thread::kNoDeoptId,
                                    token_pos());
     compiler->RecordSafepoint(locs());
   }
@@ -1086,42 +1089,42 @@
 
 
 EMIT_NATIVE_CODE(AllocateContext,
-                 0, Location::RequiresRegister(),
+                 0,
+                 Location::RequiresRegister(),
                  LocationSummary::kCall) {
   ASSERT(!compiler->is_optimizing());
   __ AllocateContext(num_context_variables());
   compiler->RecordSafepoint(locs());
-  compiler->AddCurrentDescriptor(RawPcDescriptors::kOther,
-                                 Thread::kNoDeoptId,
+  compiler->AddCurrentDescriptor(RawPcDescriptors::kOther, Thread::kNoDeoptId,
                                  token_pos());
 }
 
 
 EMIT_NATIVE_CODE(AllocateUninitializedContext,
-                 0, Location::RequiresRegister(),
+                 0,
+                 Location::RequiresRegister(),
                  LocationSummary::kCall) {
   ASSERT(compiler->is_optimizing());
   __ AllocateUninitializedContext(locs()->out(0).reg(),
                                   num_context_variables());
   __ AllocateContext(num_context_variables());
   compiler->RecordSafepoint(locs());
-  compiler->AddCurrentDescriptor(RawPcDescriptors::kOther,
-                                 Thread::kNoDeoptId,
+  compiler->AddCurrentDescriptor(RawPcDescriptors::kOther, Thread::kNoDeoptId,
                                  token_pos());
   __ PopLocal(locs()->out(0).reg());
 }
 
 
 EMIT_NATIVE_CODE(CloneContext,
-                 1, Location::RequiresRegister(),
+                 1,
+                 Location::RequiresRegister(),
                  LocationSummary::kCall) {
   if (compiler->is_optimizing()) {
     __ Push(locs()->in(0).reg());
   }
   __ CloneContext();
   compiler->RecordSafepoint(locs());
-  compiler->AddCurrentDescriptor(RawPcDescriptors::kOther,
-                                 Thread::kNoDeoptId,
+  compiler->AddCurrentDescriptor(RawPcDescriptors::kOther, Thread::kNoDeoptId,
                                  token_pos());
   if (compiler->is_optimizing()) {
     __ PopLocal(locs()->out(0).reg());
@@ -1131,11 +1134,9 @@
 
 EMIT_NATIVE_CODE(CatchBlockEntry, 0) {
   __ Bind(compiler->GetJumpLabel(this));
-  compiler->AddExceptionHandler(catch_try_index(),
-                                try_index(),
+  compiler->AddExceptionHandler(catch_try_index(), try_index(),
                                 compiler->assembler()->CodeSize(),
-                                catch_handler_types_,
-                                needs_stacktrace());
+                                catch_handler_types_, needs_stacktrace());
 
   if (HasParallelMove()) {
     compiler->parallel_move_resolver()->EmitNativeCode(parallel_move());
@@ -1145,9 +1146,11 @@
     // of the allocatable register range.
     const intptr_t num_non_copied_params =
         compiler->flow_graph().num_non_copied_params();
-    const intptr_t exception_reg = kNumberOfCpuRegisters -
+    const intptr_t exception_reg =
+        kNumberOfCpuRegisters -
         (-exception_var().index() + num_non_copied_params);
-    const intptr_t stacktrace_reg = kNumberOfCpuRegisters -
+    const intptr_t stacktrace_reg =
+        kNumberOfCpuRegisters -
         (-stacktrace_var().index() + num_non_copied_params);
     __ MoveSpecial(exception_reg, Simulator::kExceptionSpecialIndex);
     __ MoveSpecial(stacktrace_reg, Simulator::kStacktraceSpecialIndex);
@@ -1163,8 +1166,7 @@
 
 EMIT_NATIVE_CODE(Throw, 0, Location::NoLocation(), LocationSummary::kCall) {
   __ Throw(0);
-  compiler->AddCurrentDescriptor(RawPcDescriptors::kOther,
-                                 deopt_id(),
+  compiler->AddCurrentDescriptor(RawPcDescriptors::kOther, deopt_id(),
                                  token_pos());
   compiler->RecordAfterCall(this);
   __ Trap();
@@ -1174,23 +1176,22 @@
 EMIT_NATIVE_CODE(ReThrow, 0, Location::NoLocation(), LocationSummary::kCall) {
   compiler->SetNeedsStacktrace(catch_try_index());
   __ Throw(1);
-  compiler->AddCurrentDescriptor(RawPcDescriptors::kOther,
-                                 deopt_id(),
+  compiler->AddCurrentDescriptor(RawPcDescriptors::kOther, deopt_id(),
                                  token_pos());
   compiler->RecordAfterCall(this);
   __ Trap();
 }
 
 EMIT_NATIVE_CODE(InstantiateType,
-                 1, Location::RequiresRegister(),
+                 1,
+                 Location::RequiresRegister(),
                  LocationSummary::kCall) {
   if (compiler->is_optimizing()) {
     __ Push(locs()->in(0).reg());
   }
   __ InstantiateType(__ AddConstant(type()));
   compiler->RecordSafepoint(locs());
-  compiler->AddCurrentDescriptor(RawPcDescriptors::kOther,
-                                 deopt_id(),
+  compiler->AddCurrentDescriptor(RawPcDescriptors::kOther, deopt_id(),
                                  token_pos());
   if (compiler->is_optimizing()) {
     __ PopLocal(locs()->out(0).reg());
@@ -1198,7 +1199,8 @@
 }
 
 EMIT_NATIVE_CODE(InstantiateTypeArguments,
-                 1, Location::RequiresRegister(),
+                 1,
+                 Location::RequiresRegister(),
                  LocationSummary::kCall) {
   if (compiler->is_optimizing()) {
     __ Push(locs()->in(0).reg());
@@ -1207,8 +1209,7 @@
       type_arguments().IsRawInstantiatedRaw(type_arguments().Length()),
       __ AddConstant(type_arguments()));
   compiler->RecordSafepoint(locs());
-  compiler->AddCurrentDescriptor(RawPcDescriptors::kOther,
-                                 deopt_id(),
+  compiler->AddCurrentDescriptor(RawPcDescriptors::kOther, deopt_id(),
                                  token_pos());
   if (compiler->is_optimizing()) {
     __ PopLocal(locs()->out(0).reg());
@@ -1230,8 +1231,8 @@
 
 
 LocationSummary* Instruction::MakeCallSummary(Zone* zone) {
-  LocationSummary* result = new(zone) LocationSummary(
-      zone, 0, 0, LocationSummary::kCall);
+  LocationSummary* result =
+      new (zone) LocationSummary(zone, 0, 0, LocationSummary::kCall);
   // TODO(vegorov) support allocating out registers for calls.
   // Currently we require them to be fixed.
   result->set_out(0, Location::RegisterLocation(0));
@@ -1258,8 +1259,8 @@
 
 
 bool ShiftMintOpInstr::has_shift_count_check() const {
-  return !RangeUtils::IsWithin(
-      right()->definition()->range(), 0, kMintShiftCountLimit);
+  return !RangeUtils::IsWithin(right()->definition()->range(), 0,
+                               kMintShiftCountLimit);
 }
 
 
@@ -1385,21 +1386,20 @@
 
 void Environment::DropArguments(intptr_t argc) {
 #if defined(DEBUG)
-    // Check that we are in the backend - register allocation has been run.
-    ASSERT(locations_ != NULL);
+  // Check that we are in the backend - register allocation has been run.
+  ASSERT(locations_ != NULL);
 
-    // Check that we are only dropping a valid number of instructions from the
-    // environment.
-    ASSERT(argc <= values_.length());
+  // Check that we are only dropping a valid number of instructions from the
+  // environment.
+  ASSERT(argc <= values_.length());
 #endif
-    values_.TruncateTo(values_.length() - argc);
+  values_.TruncateTo(values_.length() - argc);
 }
 
 
 EMIT_NATIVE_CODE(CheckSmi, 1) {
   __ CheckSmi(locs()->in(0).reg());
-  compiler->EmitDeopt(deopt_id(),
-                      ICData::kDeoptCheckSmi,
+  compiler->EmitDeopt(deopt_id(), ICData::kDeoptCheckSmi,
                       licm_hoisted_ ? ICData::kHoisted : 0);
 }
 
@@ -1414,8 +1414,7 @@
 
 
 EMIT_NATIVE_CODE(CheckClassId, 1) {
-  __ CheckClassId(locs()->in(0).reg(),
-                  compiler->ToEmbeddableCid(cid_, this));
+  __ CheckClassId(locs()->in(0).reg(), compiler->ToEmbeddableCid(cid_, this));
   compiler->EmitDeopt(deopt_id(), ICData::kDeoptCheckClass);
 }
 
@@ -1448,8 +1447,7 @@
       __ Nop(__ AddConstant(Smi::Handle(Smi::New(cid_mask))));
     } else {
       GrowableArray<CidTarget> sorted_ic_data;
-      FlowGraphCompiler::SortICDataByCount(unary_checks(),
-                                           &sorted_ic_data,
+      FlowGraphCompiler::SortICDataByCount(unary_checks(), &sorted_ic_data,
                                            /* drop_smi = */ true);
       const intptr_t sorted_length = sorted_ic_data.length();
       if (!Utils::IsUint(8, sorted_length)) {
@@ -1462,8 +1460,7 @@
       }
     }
   }
-  compiler->EmitDeopt(deopt_id(),
-                      ICData::kDeoptCheckClass,
+  compiler->EmitDeopt(deopt_id(), ICData::kDeoptCheckClass,
                       licm_hoisted_ ? ICData::kHoisted : 0);
 }
 
@@ -1561,8 +1558,7 @@
   }
   const intptr_t kidx = __ AddConstant(compiler->double_class());
   __ Allocate(kidx);
-  compiler->AddCurrentDescriptor(RawPcDescriptors::kOther,
-                                 Thread::kNoDeoptId,
+  compiler->AddCurrentDescriptor(RawPcDescriptors::kOther, Thread::kNoDeoptId,
                                  token_pos());
   compiler->RecordSafepoint(locs());
   __ PopLocal(out);
@@ -1581,7 +1577,7 @@
   } else if (CanConvertSmi() && (value_cid == kSmiCid)) {
     __ SmiToDouble(result, box);
   } else if ((value()->Type()->ToNullableCid() == box_cid) &&
-              value()->Type()->is_nullable()) {
+             value()->Type()->is_nullable()) {
     __ IfEqNull(box);
     compiler->EmitDeopt(GetDeoptId(), ICData::kDeoptCheckClass);
     __ UnboxDouble(result, box);
@@ -1647,11 +1643,20 @@
   const Register right = locs()->in(1).reg();
   const Register result = locs()->out(0).reg();
   switch (op_kind()) {
-    case Token::kADD: __ DAdd(result, left, right); break;
-    case Token::kSUB: __ DSub(result, left, right); break;
-    case Token::kMUL: __ DMul(result, left, right); break;
-    case Token::kDIV: __ DDiv(result, left, right); break;
-    default: UNREACHABLE();
+    case Token::kADD:
+      __ DAdd(result, left, right);
+      break;
+    case Token::kSUB:
+      __ DSub(result, left, right);
+      break;
+    case Token::kMUL:
+      __ DMul(result, left, right);
+      break;
+    case Token::kDIV:
+      __ DDiv(result, left, right);
+      break;
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -1679,8 +1684,8 @@
       UNREACHABLE();
   }
   const bool is_negated = kind() != Token::kEQ;
-  EmitBranchOnCondition(
-      compiler, is_negated ? NEXT_IS_FALSE : NEXT_IS_TRUE, labels);
+  EmitBranchOnCondition(compiler, is_negated ? NEXT_IS_FALSE : NEXT_IS_TRUE,
+                        labels);
 }
 
 
@@ -1759,7 +1764,8 @@
 
 
 EMIT_NATIVE_CODE(InvokeMathCFunction,
-                 InputCount(), Location::RequiresRegister()) {
+                 InputCount(),
+                 Location::RequiresRegister()) {
   const Register left = locs()->in(0).reg();
   const Register result = locs()->out(0).reg();
   if (recognized_kind() == MethodRecognizer::kMathDoublePow) {
@@ -1804,12 +1810,18 @@
 
 static Token::Kind FlipCondition(Token::Kind kind) {
   switch (kind) {
-    case Token::kEQ: return Token::kNE;
-    case Token::kNE: return Token::kEQ;
-    case Token::kLT: return Token::kGTE;
-    case Token::kGT: return Token::kLTE;
-    case Token::kLTE: return Token::kGT;
-    case Token::kGTE: return Token::kLT;
+    case Token::kEQ:
+      return Token::kNE;
+    case Token::kNE:
+      return Token::kEQ;
+    case Token::kLT:
+      return Token::kGTE;
+    case Token::kGT:
+      return Token::kLTE;
+    case Token::kLTE:
+      return Token::kGT;
+    case Token::kGTE:
+      return Token::kLT;
     default:
       UNREACHABLE();
       return Token::kNE;
@@ -1819,12 +1831,18 @@
 
 static Bytecode::Opcode OpcodeForSmiCondition(Token::Kind kind) {
   switch (kind) {
-    case Token::kEQ: return Bytecode::kIfEqStrict;
-    case Token::kNE: return Bytecode::kIfNeStrict;
-    case Token::kLT: return Bytecode::kIfLt;
-    case Token::kGT: return Bytecode::kIfGt;
-    case Token::kLTE: return Bytecode::kIfLe;
-    case Token::kGTE: return Bytecode::kIfGe;
+    case Token::kEQ:
+      return Bytecode::kIfEqStrict;
+    case Token::kNE:
+      return Bytecode::kIfNeStrict;
+    case Token::kLT:
+      return Bytecode::kIfLt;
+    case Token::kGT:
+      return Bytecode::kIfGt;
+    case Token::kLTE:
+      return Bytecode::kIfLe;
+    case Token::kGTE:
+      return Bytecode::kIfGe;
     default:
       UNREACHABLE();
       return Bytecode::kTrap;
@@ -1834,12 +1852,18 @@
 
 static Bytecode::Opcode OpcodeForDoubleCondition(Token::Kind kind) {
   switch (kind) {
-    case Token::kEQ: return Bytecode::kIfDEq;
-    case Token::kNE: return Bytecode::kIfDNe;
-    case Token::kLT: return Bytecode::kIfDLt;
-    case Token::kGT: return Bytecode::kIfDGt;
-    case Token::kLTE: return Bytecode::kIfDLe;
-    case Token::kGTE: return Bytecode::kIfDGe;
+    case Token::kEQ:
+      return Bytecode::kIfDEq;
+    case Token::kNE:
+      return Bytecode::kIfDNe;
+    case Token::kLT:
+      return Bytecode::kIfDLt;
+    case Token::kGT:
+      return Bytecode::kIfDGt;
+    case Token::kLTE:
+      return Bytecode::kIfDLe;
+    case Token::kGTE:
+      return Bytecode::kIfDGe;
     default:
       UNREACHABLE();
       return Bytecode::kTrap;
@@ -1903,7 +1927,7 @@
   // These labels are not used. They are arranged so that EmitComparisonCode
   // emits a test that executes the following instruction when the test
   // succeeds.
-  BranchLabels labels = { &is_true, &is_false, &is_false };
+  BranchLabels labels = {&is_true, &is_false, &is_false};
   const Register result = locs()->out(0).reg();
   __ LoadConstant(result, Bool::False());
   Condition true_condition = EmitComparisonCode(compiler, labels);
@@ -1935,7 +1959,7 @@
 EMIT_NATIVE_CODE(RelationalOp, 2, Location::RequiresRegister()) {
   ASSERT(compiler->is_optimizing());
   Label is_true, is_false;
-  BranchLabels labels = { &is_true, &is_false, &is_false };
+  BranchLabels labels = {&is_true, &is_false, &is_false};
   const Register result = locs()->out(0).reg();
   __ LoadConstant(result, Bool::False());
   Condition true_condition = EmitComparisonCode(compiler, labels);
@@ -1958,16 +1982,14 @@
   const intptr_t index_cid = this->index()->Type()->ToCid();
   if (index_cid != kSmiCid) {
     __ CheckSmi(index);
-    compiler->EmitDeopt(deopt_id(),
-                        ICData::kDeoptCheckArrayBound,
+    compiler->EmitDeopt(deopt_id(), ICData::kDeoptCheckArrayBound,
                         (generalized_ ? ICData::kGeneralized : 0) |
-                        (licm_hoisted_ ? ICData::kHoisted : 0));
+                            (licm_hoisted_ ? ICData::kHoisted : 0));
   }
   __ IfULe(length, index);
-  compiler->EmitDeopt(deopt_id(),
-                      ICData::kDeoptCheckArrayBound,
+  compiler->EmitDeopt(deopt_id(), ICData::kDeoptCheckArrayBound,
                       (generalized_ ? ICData::kGeneralized : 0) |
-                      (licm_hoisted_ ? ICData::kHoisted : 0));
+                          (licm_hoisted_ ? ICData::kHoisted : 0));
 }
 
 }  // namespace dart
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index e281ab5..2e94f65 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -30,8 +30,8 @@
 LocationSummary* Instruction::MakeCallSummary(Zone* zone) {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* result = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   result->set_out(0, Location::RegisterLocation(EAX));
   return result;
 }
@@ -41,8 +41,8 @@
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::AnyOrConstant(value()));
   return locs;
 }
@@ -65,12 +65,11 @@
 }
 
 
-LocationSummary* ReturnInstr::MakeLocationSummary(Zone* zone,
-                                                  bool opt) const {
+LocationSummary* ReturnInstr::MakeLocationSummary(Zone* zone, bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RegisterLocation(EAX));
   return locs;
 }
@@ -111,10 +110,9 @@
                                                      bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t stack_index = (local().index() < 0)
-      ? kFirstLocalSlotFromFp - local().index()
-      : kParamEndSlotFromFp - local().index();
-  return LocationSummary::Make(zone,
-                               kNumInputs,
+                                   ? kFirstLocalSlotFromFp - local().index()
+                                   : kParamEndSlotFromFp - local().index();
+  return LocationSummary::Make(zone, kNumInputs,
                                Location::StackSlot(stack_index),
                                LocationSummary::kNoCall);
 }
@@ -129,9 +127,7 @@
 LocationSummary* StoreLocalInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(zone,
-                               kNumInputs,
-                               Location::SameAsFirstInput(),
+  return LocationSummary::Make(zone, kNumInputs, Location::SameAsFirstInput(),
                                LocationSummary::kNoCall);
 }
 
@@ -147,8 +143,7 @@
 LocationSummary* ConstantInstr::MakeLocationSummary(Zone* zone,
                                                     bool opt) const {
   const intptr_t kNumInputs = 0;
-  return LocationSummary::Make(zone,
-                               kNumInputs,
+  return LocationSummary::Make(zone, kNumInputs,
                                Assembler::IsSafe(value())
                                    ? Location::Constant(this)
                                    : Location::RequiresRegister(),
@@ -172,8 +167,8 @@
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps =
       (constant_address() == 0) && (representation() != kUnboxedInt32) ? 1 : 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   if (representation() == kUnboxedDouble) {
     locs->set_out(0, Location::RequiresFpuRegister());
   } else {
@@ -218,8 +213,8 @@
                                                             bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(EAX));  // Value.
   summary->set_in(1, Location::RegisterLocation(EDX));  // Type arguments.
   summary->set_out(0, Location::RegisterLocation(EAX));
@@ -231,8 +226,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(EAX));
   locs->set_out(0, Location::RegisterLocation(EAX));
   return locs;
@@ -261,11 +256,8 @@
   }
 
   __ pushl(reg);  // Push the source object.
-  compiler->GenerateRuntimeCall(token_pos,
-                                deopt_id,
-                                kNonBoolTypeErrorRuntimeEntry,
-                                1,
-                                locs);
+  compiler->GenerateRuntimeCall(token_pos, deopt_id,
+                                kNonBoolTypeErrorRuntimeEntry, 1, locs);
   // We should never return here.
   __ int3();
   __ Bind(&done);
@@ -283,12 +275,18 @@
 
 static Condition TokenKindToSmiCondition(Token::Kind kind) {
   switch (kind) {
-    case Token::kEQ: return EQUAL;
-    case Token::kNE: return NOT_EQUAL;
-    case Token::kLT: return LESS;
-    case Token::kGT: return GREATER;
-    case Token::kLTE: return LESS_EQUAL;
-    case Token::kGTE: return GREATER_EQUAL;
+    case Token::kEQ:
+      return EQUAL;
+    case Token::kNE:
+      return NOT_EQUAL;
+    case Token::kLT:
+      return LESS;
+    case Token::kGT:
+      return GREATER;
+    case Token::kLTE:
+      return LESS_EQUAL;
+    case Token::kGTE:
+      return GREATER_EQUAL;
     default:
       UNREACHABLE();
       return OVERFLOW;
@@ -301,8 +299,8 @@
   const intptr_t kNumInputs = 2;
   if (operation_cid() == kMintCid) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* locs = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::Pair(Location::RequiresRegister(),
                                    Location::RequiresRegister()));
     locs->set_in(1, Location::Pair(Location::RequiresRegister(),
@@ -312,8 +310,8 @@
   }
   if (operation_cid() == kDoubleCid) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* locs = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::RequiresFpuRegister());
     locs->set_in(1, Location::RequiresFpuRegister());
     locs->set_out(0, Location::RequiresRegister());
@@ -321,8 +319,8 @@
   }
   if (operation_cid() == kSmiCid) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* locs = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::RegisterOrConstant(left()));
     // Only one input can be a constant operand. The case of two constant
     // operands should be handled by constant propagation.
@@ -359,16 +357,26 @@
 
 static Condition FlipCondition(Condition condition) {
   switch (condition) {
-    case EQUAL:         return EQUAL;
-    case NOT_EQUAL:     return NOT_EQUAL;
-    case LESS:          return GREATER;
-    case LESS_EQUAL:    return GREATER_EQUAL;
-    case GREATER:       return LESS;
-    case GREATER_EQUAL: return LESS_EQUAL;
-    case BELOW:         return ABOVE;
-    case BELOW_EQUAL:   return ABOVE_EQUAL;
-    case ABOVE:         return BELOW;
-    case ABOVE_EQUAL:   return BELOW_EQUAL;
+    case EQUAL:
+      return EQUAL;
+    case NOT_EQUAL:
+      return NOT_EQUAL;
+    case LESS:
+      return GREATER;
+    case LESS_EQUAL:
+      return GREATER_EQUAL;
+    case GREATER:
+      return LESS;
+    case GREATER_EQUAL:
+      return LESS_EQUAL;
+    case BELOW:
+      return ABOVE;
+    case BELOW_EQUAL:
+      return ABOVE_EQUAL;
+    case ABOVE:
+      return BELOW;
+    case ABOVE_EQUAL:
+      return BELOW_EQUAL;
     default:
       UNIMPLEMENTED();
       return EQUAL;
@@ -378,18 +386,30 @@
 
 static Condition NegateCondition(Condition condition) {
   switch (condition) {
-    case EQUAL:         return NOT_EQUAL;
-    case NOT_EQUAL:     return EQUAL;
-    case LESS:          return GREATER_EQUAL;
-    case LESS_EQUAL:    return GREATER;
-    case GREATER:       return LESS_EQUAL;
-    case GREATER_EQUAL: return LESS;
-    case BELOW:         return ABOVE_EQUAL;
-    case BELOW_EQUAL:   return ABOVE;
-    case ABOVE:         return BELOW_EQUAL;
-    case ABOVE_EQUAL:   return BELOW;
-    case PARITY_ODD:    return PARITY_EVEN;
-    case PARITY_EVEN:   return PARITY_ODD;
+    case EQUAL:
+      return NOT_EQUAL;
+    case NOT_EQUAL:
+      return EQUAL;
+    case LESS:
+      return GREATER_EQUAL;
+    case LESS_EQUAL:
+      return GREATER;
+    case GREATER:
+      return LESS_EQUAL;
+    case GREATER_EQUAL:
+      return LESS;
+    case BELOW:
+      return ABOVE_EQUAL;
+    case BELOW_EQUAL:
+      return ABOVE;
+    case ABOVE:
+      return BELOW_EQUAL;
+    case ABOVE_EQUAL:
+      return BELOW;
+    case PARITY_ODD:
+      return PARITY_EVEN;
+    case PARITY_EVEN:
+      return PARITY_ODD;
     default:
       UNIMPLEMENTED();
       return EQUAL;
@@ -442,12 +462,18 @@
 
 static Condition TokenKindToMintCondition(Token::Kind kind) {
   switch (kind) {
-    case Token::kEQ: return EQUAL;
-    case Token::kNE: return NOT_EQUAL;
-    case Token::kLT: return LESS;
-    case Token::kGT: return GREATER;
-    case Token::kLTE: return LESS_EQUAL;
-    case Token::kGTE: return GREATER_EQUAL;
+    case Token::kEQ:
+      return EQUAL;
+    case Token::kNE:
+      return NOT_EQUAL;
+    case Token::kLT:
+      return LESS;
+    case Token::kGT:
+      return GREATER;
+    case Token::kLTE:
+      return LESS_EQUAL;
+    case Token::kGTE:
+      return GREATER_EQUAL;
     default:
       UNREACHABLE();
       return OVERFLOW;
@@ -524,12 +550,18 @@
 
 static Condition TokenKindToDoubleCondition(Token::Kind kind) {
   switch (kind) {
-    case Token::kEQ: return EQUAL;
-    case Token::kNE: return NOT_EQUAL;
-    case Token::kLT: return BELOW;
-    case Token::kGT: return ABOVE;
-    case Token::kLTE: return BELOW_EQUAL;
-    case Token::kGTE: return ABOVE_EQUAL;
+    case Token::kEQ:
+      return EQUAL;
+    case Token::kNE:
+      return NOT_EQUAL;
+    case Token::kLT:
+      return BELOW;
+    case Token::kGT:
+      return ABOVE;
+    case Token::kLTE:
+      return BELOW_EQUAL;
+    case Token::kGTE:
+      return ABOVE_EQUAL;
     default:
       UNREACHABLE();
       return OVERFLOW;
@@ -547,8 +579,8 @@
   __ comisd(left, right);
 
   Condition true_condition = TokenKindToDoubleCondition(kind);
-  Label* nan_result = (true_condition == NOT_EQUAL)
-      ? labels.true_label : labels.false_label;
+  Label* nan_result =
+      (true_condition == NOT_EQUAL) ? labels.true_label : labels.false_label;
   __ j(PARITY_EVEN, nan_result);
   return true_condition;
 }
@@ -571,9 +603,9 @@
   ASSERT((kind() == Token::kNE) || (kind() == Token::kEQ));
 
   Label is_true, is_false;
-  BranchLabels labels = { &is_true, &is_false, &is_false };
+  BranchLabels labels = {&is_true, &is_false, &is_false};
   Condition true_condition = EmitComparisonCode(compiler, labels);
-  EmitBranchOnCondition(compiler,  true_condition, labels);
+  EmitBranchOnCondition(compiler, true_condition, labels);
 
   Register result = locs()->out(0).reg();
   Label done;
@@ -596,12 +628,11 @@
 }
 
 
-LocationSummary* TestSmiInstr::MakeLocationSummary(Zone* zone,
-                                                   bool opt) const {
+LocationSummary* TestSmiInstr::MakeLocationSummary(Zone* zone, bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   // Only one input can be a constant operand. The case of two constant
   // operands should be handled by constant propagation.
@@ -616,8 +647,7 @@
   Location right = locs()->in(1);
   if (right.IsConstant()) {
     ASSERT(right.constant().IsSmi());
-    const int32_t imm =
-        reinterpret_cast<int32_t>(right.constant().raw());
+    const int32_t imm = reinterpret_cast<int32_t>(right.constant().raw());
     __ testl(left, Immediate(imm));
   } else {
     __ testl(left, right.reg());
@@ -641,13 +671,12 @@
 }
 
 
-
 LocationSummary* TestCidsInstr::MakeLocationSummary(Zone* zone,
                                                     bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   locs->set_temp(0, Location::RequiresRegister());
   locs->set_out(0, Location::RequiresRegister());
@@ -661,11 +690,11 @@
   Register val_reg = locs()->in(0).reg();
   Register cid_reg = locs()->temp(0).reg();
 
-  Label* deopt = CanDeoptimize()
-      ? compiler->AddDeoptStub(deopt_id(),
-                               ICData::kDeoptTestCids,
-                               licm_hoisted_ ? ICData::kHoisted : 0)
-      : NULL;
+  Label* deopt =
+      CanDeoptimize()
+          ? compiler->AddDeoptStub(deopt_id(), ICData::kDeoptTestCids,
+                                   licm_hoisted_ ? ICData::kHoisted : 0)
+          : NULL;
 
   const intptr_t true_result = (kind() == Token::kIS) ? 1 : 0;
   const ZoneGrowableArray<intptr_t>& data = cid_results();
@@ -678,14 +707,14 @@
     const intptr_t test_cid = data[i];
     ASSERT(test_cid != kSmiCid);
     result = data[i + 1] == true_result;
-    __ cmpl(cid_reg,  Immediate(test_cid));
+    __ cmpl(cid_reg, Immediate(test_cid));
     __ j(EQUAL, result ? labels.true_label : labels.false_label);
   }
   // No match found, deoptimize or false.
   if (deopt == NULL) {
     Label* target = result ? labels.false_label : labels.true_label;
     if (target != labels.fall_through) {
-        __ jmp(target);
+      __ jmp(target);
     }
   } else {
     __ jmp(deopt);
@@ -706,7 +735,7 @@
 void TestCidsInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register result_reg = locs()->out(0).reg();
   Label is_true, is_false, done;
-  BranchLabels labels = { &is_true, &is_false, &is_false };
+  BranchLabels labels = {&is_true, &is_false, &is_false};
   EmitComparisonCode(compiler, labels);
   __ Bind(&is_false);
   __ LoadObject(result_reg, Bool::False());
@@ -723,8 +752,8 @@
   const intptr_t kNumTemps = 0;
   if (operation_cid() == kMintCid) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* locs = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::Pair(Location::RequiresRegister(),
                                    Location::RequiresRegister()));
     locs->set_in(1, Location::Pair(Location::RequiresRegister(),
@@ -733,16 +762,16 @@
     return locs;
   }
   if (operation_cid() == kDoubleCid) {
-    LocationSummary* summary = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresFpuRegister());
     summary->set_in(1, Location::RequiresFpuRegister());
     summary->set_out(0, Location::RequiresRegister());
     return summary;
   }
   ASSERT(operation_cid() == kSmiCid);
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RegisterOrConstant(left()));
   // Only one input can be a constant operand. The case of two constant
   // operands should be handled by constant propagation.
@@ -769,7 +798,7 @@
 
 void RelationalOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Label is_true, is_false;
-  BranchLabels labels = { &is_true, &is_false, &is_false };
+  BranchLabels labels = {&is_true, &is_false, &is_false};
   Condition true_condition = EmitComparisonCode(compiler, labels);
   EmitBranchOnCondition(compiler, true_condition, labels);
 
@@ -807,8 +836,9 @@
   __ PushObject(Object::null_object());
   // Pass a pointer to the first argument in EAX.
   if (!function().HasOptionalParameters()) {
-    __ leal(EAX, Address(EBP, (kParamEndSlotFromFp +
-                               function().NumParameters()) * kWordSize));
+    __ leal(EAX,
+            Address(EBP, (kParamEndSlotFromFp + function().NumParameters()) *
+                             kWordSize));
   } else {
     __ leal(EAX, Address(EBP, kFirstLocalSlotFromFp * kWordSize));
   }
@@ -819,15 +849,13 @@
     stub_entry = StubCode::CallBootstrapCFunction_entry();
     __ movl(ECX, Immediate(NativeEntry::LinkNativeCallEntry()));
   } else {
-    stub_entry = (is_bootstrap_native()) ?
-        StubCode::CallBootstrapCFunction_entry() :
-        StubCode::CallNativeCFunction_entry();
+    stub_entry = (is_bootstrap_native())
+                     ? StubCode::CallBootstrapCFunction_entry()
+                     : StubCode::CallNativeCFunction_entry();
     const ExternalLabel label(reinterpret_cast<uword>(native_c_function()));
     __ movl(ECX, Immediate(label.address()));
   }
-  compiler->GenerateCall(token_pos(),
-                         *stub_entry,
-                         RawPcDescriptors::kOther,
+  compiler->GenerateCall(token_pos(), *stub_entry, RawPcDescriptors::kOther,
                          locs());
   __ popl(result);
 }
@@ -847,12 +875,11 @@
 
 
 LocationSummary* OneByteStringFromCharCodeInstr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   const intptr_t kNumInputs = 1;
   // TODO(fschneider): Allow immediate operands for the char code.
-  return LocationSummary::Make(zone,
-                               kNumInputs,
-                               Location::RequiresRegister(),
+  return LocationSummary::Make(zone, kNumInputs, Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
 
@@ -863,8 +890,7 @@
   Register result = locs()->out(0).reg();
   __ movl(result,
           Immediate(reinterpret_cast<uword>(Symbols::PredefinedAddress())));
-  __ movl(result, Address(result,
-                          char_code,
+  __ movl(result, Address(result, char_code,
                           TIMES_HALF_WORD_SIZE,  // Char code is a smi.
                           Symbols::kNullCharCodeSymbolOffset * kWordSize));
 }
@@ -873,9 +899,7 @@
 LocationSummary* StringToCharCodeInstr::MakeLocationSummary(Zone* zone,
                                                             bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(zone,
-                               kNumInputs,
-                               Location::RequiresRegister(),
+  return LocationSummary::Make(zone, kNumInputs, Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
 
@@ -901,8 +925,8 @@
                                                              bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(EAX));
   summary->set_out(0, Location::RegisterLocation(EAX));
   return summary;
@@ -914,12 +938,8 @@
   __ pushl(array);
   const int kNumberOfArguments = 1;
   const Array& kNoArgumentNames = Object::null_array();
-  compiler->GenerateStaticCall(deopt_id(),
-                               token_pos(),
-                               CallFunction(),
-                               kNumberOfArguments,
-                               kNoArgumentNames,
-                               locs(),
+  compiler->GenerateStaticCall(deopt_id(), token_pos(), CallFunction(),
+                               kNumberOfArguments, kNoArgumentNames, locs(),
                                ICData::Handle());
   ASSERT(locs()->out(0).reg() == EAX);
 }
@@ -928,9 +948,7 @@
 LocationSummary* LoadUntaggedInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(zone,
-                               kNumInputs,
-                               Location::SameAsFirstInput(),
+  return LocationSummary::Make(zone, kNumInputs, Location::SameAsFirstInput(),
                                LocationSummary::kNoCall);
 }
 
@@ -950,9 +968,7 @@
 LocationSummary* LoadClassIdInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(zone,
-                               kNumInputs,
-                               Location::RequiresRegister(),
+  return LocationSummary::Make(zone, kNumInputs, Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
 
@@ -1062,8 +1078,8 @@
                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   if (CanBeImmediateIndex(index(), class_id())) {
     // CanBeImmediateIndex must return false for unsafe smis.
@@ -1071,9 +1087,8 @@
   } else {
     // The index is either untagged (element size == 1) or a smi (for all
     // element sizes > 1).
-    locs->set_in(1, (index_scale() == 1)
-                        ? Location::WritableRegister()
-                        : Location::RequiresRegister());
+    locs->set_in(1, (index_scale() == 1) ? Location::WritableRegister()
+                                         : Location::RequiresRegister());
   }
   if ((representation() == kUnboxedDouble) ||
       (representation() == kUnboxedFloat32x4) ||
@@ -1099,12 +1114,13 @@
   const Register array = locs()->in(0).reg();
   const Location index = locs()->in(1);
 
-  Address element_address = index.IsRegister()
-      ? Assembler::ElementAddressForRegIndex(
-            IsExternal(), class_id(), index_scale(), array, index.reg())
-      : Assembler::ElementAddressForIntIndex(
-            IsExternal(), class_id(), index_scale(),
-            array, Smi::Cast(index.constant()).Value());
+  Address element_address =
+      index.IsRegister()
+          ? Assembler::ElementAddressForRegIndex(
+                IsExternal(), class_id(), index_scale(), array, index.reg())
+          : Assembler::ElementAddressForIntIndex(
+                IsExternal(), class_id(), index_scale(), array,
+                Smi::Cast(index.constant()).Value());
 
   if ((representation() == kUnboxedDouble) ||
       (representation() == kUnboxedFloat32x4) ||
@@ -1142,11 +1158,11 @@
       case kTypedDataInt32ArrayCid:
         ASSERT(representation() == kUnboxedInt32);
         __ movl(result, element_address);
-      break;
+        break;
       case kTypedDataUint32ArrayCid:
         ASSERT(representation() == kUnboxedUint32);
         __ movl(result, element_address);
-      break;
+        break;
       default:
         UNREACHABLE();
     }
@@ -1196,8 +1212,8 @@
 Representation StoreIndexedInstr::RequiredInputRepresentation(
     intptr_t idx) const {
   // Array can be a Dart object or a pointer to external data.
-  if (idx == 0)  return kNoRepresentation;  // Flexible input representation.
-  if (idx == 1) return kTagged;  // Index is a smi.
+  if (idx == 0) return kNoRepresentation;  // Flexible input representation.
+  if (idx == 1) return kTagged;            // Index is a smi.
   ASSERT(idx == 2);
   switch (class_id_) {
     case kArrayCid:
@@ -1234,8 +1250,8 @@
                                                         bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   if (CanBeImmediateIndex(index(), class_id())) {
     // CanBeImmediateIndex must return false for unsafe smis.
@@ -1243,15 +1259,14 @@
   } else {
     // The index is either untagged (element size == 1) or a smi (for all
     // element sizes > 1).
-    locs->set_in(1, (index_scale() == 1)
-                        ? Location::WritableRegister()
-                        : Location::RequiresRegister());
+    locs->set_in(1, (index_scale() == 1) ? Location::WritableRegister()
+                                         : Location::RequiresRegister());
   }
   switch (class_id()) {
     case kArrayCid:
       locs->set_in(2, ShouldEmitStoreBarrier()
-                        ? Location::WritableRegister()
-                        : Location::RegisterOrConstant(value()));
+                          ? Location::WritableRegister()
+                          : Location::RegisterOrConstant(value()));
       break;
     case kExternalTypedDataUint8ArrayCid:
     case kExternalTypedDataUint8ClampedArrayCid:
@@ -1295,12 +1310,13 @@
   const Register array = locs()->in(0).reg();
   const Location index = locs()->in(1);
 
-  Address element_address = index.IsRegister()
-      ? Assembler::ElementAddressForRegIndex(
-            IsExternal(), class_id(), index_scale(), array, index.reg())
-      : Assembler::ElementAddressForIntIndex(
-            IsExternal(), class_id(), index_scale(),
-            array, Smi::Cast(index.constant()).Value());
+  Address element_address =
+      index.IsRegister()
+          ? Assembler::ElementAddressForRegIndex(
+                IsExternal(), class_id(), index_scale(), array, index.reg())
+          : Assembler::ElementAddressForIntIndex(
+                IsExternal(), class_id(), index_scale(), array,
+                Smi::Cast(index.constant()).Value());
 
   if ((index_scale() == 1) && index.IsRegister()) {
     __ SmiUntag(index.reg());
@@ -1343,8 +1359,7 @@
         } else if (value < 0) {
           value = 0;
         }
-        __ movb(element_address,
-                Immediate(static_cast<int8_t>(value)));
+        __ movb(element_address, Immediate(static_cast<int8_t>(value)));
       } else {
         ASSERT(locs()->in(2).reg() == EAX);
         Label store_value, store_0xff;
@@ -1399,7 +1414,7 @@
 
   const bool emit_full_guard = !opt || (field_cid == kIllegalCid);
   const bool needs_value_cid_temp_reg =
-    (value_cid == kDynamicCid) && (emit_full_guard || (field_cid != kSmiCid));
+      (value_cid == kDynamicCid) && (emit_full_guard || (field_cid != kSmiCid));
   const bool needs_field_temp_reg = emit_full_guard;
 
   intptr_t num_temps = 0;
@@ -1410,8 +1425,8 @@
     num_temps++;
   }
 
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, num_temps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, num_temps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
 
   for (intptr_t i = 0; i < num_temps; i++) {
@@ -1431,7 +1446,8 @@
   if (field_cid == kDynamicCid) {
     if (Compiler::IsBackgroundCompilation()) {
       // Field state changed while compiling.
-      Compiler::AbortBackgroundCompilation(deopt_id(),
+      Compiler::AbortBackgroundCompilation(
+          deopt_id(),
           "GuardFieldClassInstr: field state changed while compiling");
     }
     ASSERT(!compiler->is_optimizing());
@@ -1448,16 +1464,19 @@
 
   const Register value_reg = locs()->in(0).reg();
 
-  const Register value_cid_reg = needs_value_cid_temp_reg ?
-      locs()->temp(0).reg() : kNoRegister;
+  const Register value_cid_reg =
+      needs_value_cid_temp_reg ? locs()->temp(0).reg() : kNoRegister;
 
-  const Register field_reg = needs_field_temp_reg ?
-      locs()->temp(locs()->temp_count() - 1).reg() : kNoRegister;
+  const Register field_reg = needs_field_temp_reg
+                                 ? locs()->temp(locs()->temp_count() - 1).reg()
+                                 : kNoRegister;
 
   Label ok, fail_label;
 
-  Label* deopt = compiler->is_optimizing() ?
-      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptGuardField) : NULL;
+  Label* deopt =
+      compiler->is_optimizing()
+          ? compiler->AddDeoptStub(deopt_id(), ICData::kDeoptGuardField)
+          : NULL;
 
   Label* fail = (deopt != NULL) ? deopt : &fail_label;
 
@@ -1465,8 +1484,8 @@
     __ LoadObject(field_reg, Field::ZoneHandle(field().Original()));
 
     FieldAddress field_cid_operand(field_reg, Field::guarded_cid_offset());
-    FieldAddress field_nullability_operand(
-        field_reg, Field::is_nullable_offset());
+    FieldAddress field_nullability_operand(field_reg,
+                                           Field::is_nullable_offset());
 
     if (value_cid == kDynamicCid) {
       LoadValueCid(compiler, value_cid_reg, value_reg);
@@ -1569,8 +1588,8 @@
   const intptr_t kNumInputs = 1;
   if (!opt || (field().guarded_list_length() == Field::kUnknownFixedLength)) {
     const intptr_t kNumTemps = 3;
-    LocationSummary* summary = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     // We need temporaries for field object, length offset and expected length.
     summary->set_temp(0, Location::RequiresRegister());
@@ -1578,8 +1597,8 @@
     summary->set_temp(2, Location::RequiresRegister());
     return summary;
   } else {
-    LocationSummary* summary = new(zone) LocationSummary(
-        zone, kNumInputs, 0, LocationSummary::kNoCall);
+    LocationSummary* summary = new (zone)
+        LocationSummary(zone, kNumInputs, 0, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     return summary;
   }
@@ -1591,15 +1610,18 @@
   if (field().guarded_list_length() == Field::kNoFixedLength) {
     if (Compiler::IsBackgroundCompilation()) {
       // Field state changed while compiling.
-      Compiler::AbortBackgroundCompilation(deopt_id(),
+      Compiler::AbortBackgroundCompilation(
+          deopt_id(),
           "GuardFieldLengthInstr: field state changed while compiling");
     }
     ASSERT(!compiler->is_optimizing());
     return;  // Nothing to emit.
   }
 
-  Label* deopt = compiler->is_optimizing() ?
-      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptGuardField) : NULL;
+  Label* deopt =
+      compiler->is_optimizing()
+          ? compiler->AddDeoptStub(deopt_id(), ICData::kDeoptGuardField)
+          : NULL;
 
   const Register value_reg = locs()->in(0).reg();
 
@@ -1613,10 +1635,12 @@
 
     __ LoadObject(field_reg, Field::ZoneHandle(field().Original()));
 
-    __ movsxb(offset_reg, FieldAddress(field_reg,
-        Field::guarded_list_length_in_object_offset_offset()));
-    __ movl(length_reg, FieldAddress(field_reg,
-        Field::guarded_list_length_offset()));
+    __ movsxb(
+        offset_reg,
+        FieldAddress(field_reg,
+                     Field::guarded_list_length_in_object_offset_offset()));
+    __ movl(length_reg,
+            FieldAddress(field_reg, Field::guarded_list_length_offset()));
 
     __ cmpl(offset_reg, Immediate(0));
     __ j(NEGATIVE, &ok);
@@ -1643,11 +1667,11 @@
     ASSERT(compiler->is_optimizing());
     ASSERT(field().guarded_list_length() >= 0);
     ASSERT(field().guarded_list_length_in_object_offset() !=
-        Field::kUnknownLengthOffset);
+           Field::kUnknownLengthOffset);
 
-    __ cmpl(FieldAddress(value_reg,
-                         field().guarded_list_length_in_object_offset()),
-            Immediate(Smi::RawValue(field().guarded_list_length())));
+    __ cmpl(
+        FieldAddress(value_reg, field().guarded_list_length_in_object_offset()),
+        Immediate(Smi::RawValue(field().guarded_list_length())));
     __ j(NOT_EQUAL, deopt);
   }
 }
@@ -1658,14 +1682,11 @@
   BoxAllocationSlowPath(Instruction* instruction,
                         const Class& cls,
                         Register result)
-      : instruction_(instruction),
-        cls_(cls),
-        result_(result) { }
+      : instruction_(instruction), cls_(cls), result_(result) {}
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     if (Assembler::EmittingComments()) {
-      __ Comment("%s slow path allocation of %s",
-                 instruction_->DebugName(),
+      __ Comment("%s slow path allocation of %s", instruction_->DebugName(),
                  String::Handle(cls_.ScrubbedName()).ToCString());
     }
     __ Bind(entry_label());
@@ -1678,10 +1699,8 @@
     locs->live_registers()->Remove(Location::RegisterLocation(result_));
 
     compiler->SaveLiveRegisters(locs);
-    compiler->GenerateCall(TokenPosition::kNoSource,
-                           stub_entry,
-                           RawPcDescriptors::kOther,
-                           locs);
+    compiler->GenerateCall(TokenPosition::kNoSource, stub_entry,
+                           RawPcDescriptors::kOther, locs);
     compiler->AddStubCallTarget(stub);
     __ MoveRegister(result_, EAX);
     compiler->RestoreLiveRegisters(locs);
@@ -1694,20 +1713,14 @@
                        Register result,
                        Register temp) {
     if (compiler->intrinsic_mode()) {
-      __ TryAllocate(cls,
-                     compiler->intrinsic_slow_path_label(),
-                     Assembler::kFarJump,
-                     result,
-                     temp);
+      __ TryAllocate(cls, compiler->intrinsic_slow_path_label(),
+                     Assembler::kFarJump, result, temp);
     } else {
       BoxAllocationSlowPath* slow_path =
           new BoxAllocationSlowPath(instruction, cls, result);
       compiler->AddSlowPathCode(slow_path);
 
-      __ TryAllocate(cls,
-                     slow_path->entry_label(),
-                     Assembler::kFarJump,
-                     result,
+      __ TryAllocate(cls, slow_path->entry_label(), Assembler::kFarJump, result,
                      temp);
       __ Bind(slow_path->exit_label());
     }
@@ -1724,14 +1737,13 @@
                                                               bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps =
-      (IsUnboxedStore() && opt) ? 2 :
-          ((IsPotentialUnboxedStore()) ? 3 : 0);
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps,
-          ((IsUnboxedStore() && opt && is_initialization()) ||
-           IsPotentialUnboxedStore())
-          ? LocationSummary::kCallOnSlowPath
-          : LocationSummary::kNoCall);
+      (IsUnboxedStore() && opt) ? 2 : ((IsPotentialUnboxedStore()) ? 3 : 0);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps,
+                      ((IsUnboxedStore() && opt && is_initialization()) ||
+                       IsPotentialUnboxedStore())
+                          ? LocationSummary::kCallOnSlowPath
+                          : LocationSummary::kNoCall);
 
   summary->set_in(0, Location::RequiresRegister());
   if (IsUnboxedStore() && opt) {
@@ -1739,17 +1751,16 @@
     summary->set_temp(0, Location::RequiresRegister());
     summary->set_temp(1, Location::RequiresRegister());
   } else if (IsPotentialUnboxedStore()) {
-    summary->set_in(1, ShouldEmitStoreBarrier()
-        ? Location::WritableRegister()
-        :  Location::RequiresRegister());
+    summary->set_in(1, ShouldEmitStoreBarrier() ? Location::WritableRegister()
+                                                : Location::RequiresRegister());
     summary->set_temp(0, Location::RequiresRegister());
     summary->set_temp(1, Location::RequiresRegister());
     summary->set_temp(2, opt ? Location::RequiresFpuRegister()
                              : Location::FpuRegisterLocation(XMM1));
   } else {
     summary->set_in(1, ShouldEmitStoreBarrier()
-                       ? Location::WritableRegister()
-                       : Location::RegisterOrConstant(value()));
+                           ? Location::WritableRegister()
+                           : Location::RegisterOrConstant(value()));
   }
   return summary;
 }
@@ -1770,9 +1781,7 @@
   __ j(NOT_EQUAL, &done);
   BoxAllocationSlowPath::Allocate(compiler, instruction, cls, box_reg, temp);
   __ movl(temp, box_reg);
-  __ StoreIntoObject(instance_reg,
-                     FieldAddress(instance_reg, offset),
-                     temp);
+  __ StoreIntoObject(instance_reg, FieldAddress(instance_reg, offset), temp);
 
   __ Bind(&done);
 }
@@ -1809,8 +1818,7 @@
       BoxAllocationSlowPath::Allocate(compiler, this, *cls, temp, temp2);
       __ movl(temp2, temp);
       __ StoreIntoObject(instance_reg,
-                         FieldAddress(instance_reg, offset_in_bytes_),
-                         temp2);
+                         FieldAddress(instance_reg, offset_in_bytes_), temp2);
     } else {
       __ movl(temp, FieldAddress(instance_reg, offset_in_bytes_));
     }
@@ -1818,15 +1826,15 @@
       case kDoubleCid:
         __ Comment("UnboxedDoubleStoreInstanceFieldInstr");
         __ movsd(FieldAddress(temp, Double::value_offset()), value);
-      break;
+        break;
       case kFloat32x4Cid:
         __ Comment("UnboxedFloat32x4StoreInstanceFieldInstr");
         __ movups(FieldAddress(temp, Float32x4::value_offset()), value);
-      break;
+        break;
       case kFloat64x2Cid:
         __ Comment("UnboxedFloat64x2StoreInstanceFieldInstr");
         __ movups(FieldAddress(temp, Float64x2::value_offset()), value);
-      break;
+        break;
       default:
         UNREACHABLE();
     }
@@ -1884,13 +1892,8 @@
 
     {
       __ Bind(&store_double);
-      EnsureMutableBox(compiler,
-                       this,
-                       temp,
-                       compiler->double_class(),
-                       instance_reg,
-                       offset_in_bytes_,
-                       temp2);
+      EnsureMutableBox(compiler, this, temp, compiler->double_class(),
+                       instance_reg, offset_in_bytes_, temp2);
       __ movsd(fpu_temp, FieldAddress(value_reg, Double::value_offset()));
       __ movsd(FieldAddress(temp, Double::value_offset()), fpu_temp);
       __ jmp(&skip_store);
@@ -1898,13 +1901,8 @@
 
     {
       __ Bind(&store_float32x4);
-      EnsureMutableBox(compiler,
-                       this,
-                       temp,
-                       compiler->float32x4_class(),
-                       instance_reg,
-                       offset_in_bytes_,
-                       temp2);
+      EnsureMutableBox(compiler, this, temp, compiler->float32x4_class(),
+                       instance_reg, offset_in_bytes_, temp2);
       __ movups(fpu_temp, FieldAddress(value_reg, Float32x4::value_offset()));
       __ movups(FieldAddress(temp, Float32x4::value_offset()), fpu_temp);
       __ jmp(&skip_store);
@@ -1912,13 +1910,8 @@
 
     {
       __ Bind(&store_float64x2);
-      EnsureMutableBox(compiler,
-                       this,
-                       temp,
-                       compiler->float64x2_class(),
-                       instance_reg,
-                       offset_in_bytes_,
-                       temp2);
+      EnsureMutableBox(compiler, this, temp, compiler->float64x2_class(),
+                       instance_reg, offset_in_bytes_, temp2);
       __ movups(fpu_temp, FieldAddress(value_reg, Float64x2::value_offset()));
       __ movups(FieldAddress(temp, Float64x2::value_offset()), fpu_temp);
       __ jmp(&skip_store);
@@ -1930,15 +1923,13 @@
   if (ShouldEmitStoreBarrier()) {
     Register value_reg = locs()->in(1).reg();
     __ StoreIntoObject(instance_reg,
-                       FieldAddress(instance_reg, offset_in_bytes_),
-                       value_reg,
+                       FieldAddress(instance_reg, offset_in_bytes_), value_reg,
                        CanValueBeSmi());
   } else {
     if (locs()->in(1).IsConstant()) {
-      __ StoreIntoObjectNoBarrier(
-          instance_reg,
-          FieldAddress(instance_reg, offset_in_bytes_),
-          locs()->in(1).constant());
+      __ StoreIntoObjectNoBarrier(instance_reg,
+                                  FieldAddress(instance_reg, offset_in_bytes_),
+                                  locs()->in(1).constant());
     } else {
       Register value_reg = locs()->in(1).reg();
       __ StoreIntoObjectNoBarrier(instance_reg,
@@ -1954,8 +1945,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   // By specifying same register as input, our simple register allocator can
   // generate better code.
@@ -1978,8 +1969,8 @@
 
 LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(Zone* zone,
                                                             bool opt) const {
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, 1, 1, LocationSummary::kNoCall);
+  LocationSummary* locs =
+      new (zone) LocationSummary(zone, 1, 1, LocationSummary::kNoCall);
   locs->set_in(0, value()->NeedsStoreBuffer() ? Location::WritableRegister()
                                               : Location::RequiresRegister());
   locs->set_temp(0, Location::RequiresRegister());
@@ -1993,10 +1984,8 @@
 
   __ LoadObject(temp, Field::ZoneHandle(Z, field().Original()));
   if (this->value()->NeedsStoreBuffer()) {
-    __ StoreIntoObject(temp,
-                       FieldAddress(temp, Field::static_value_offset()),
-                       value,
-                       CanValueBeSmi());
+    __ StoreIntoObject(temp, FieldAddress(temp, Field::static_value_offset()),
+                       value, CanValueBeSmi());
   } else {
     __ StoreIntoObjectNoBarrier(
         temp, FieldAddress(temp, Field::static_value_offset()), value);
@@ -2008,8 +1997,8 @@
                                                       bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(EAX));
   summary->set_in(1, Location::RegisterLocation(EDX));
   summary->set_out(0, Location::RegisterLocation(EAX));
@@ -2021,10 +2010,7 @@
   ASSERT(locs()->in(0).reg() == EAX);  // Value.
   ASSERT(locs()->in(1).reg() == EDX);  // Instantiator type arguments.
 
-  compiler->GenerateInstanceOf(token_pos(),
-                               deopt_id(),
-                               type(),
-                               negate_result(),
+  compiler->GenerateInstanceOf(token_pos(), deopt_id(), type(), negate_result(),
                                locs());
   ASSERT(locs()->out(0).reg() == EAX);
 }
@@ -2036,8 +2022,8 @@
                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(ECX));
   locs->set_in(1, Location::RegisterLocation(EDX));
   locs->set_out(0, Location::RegisterLocation(EAX));
@@ -2058,18 +2044,16 @@
   // Instance in EAX.
   // Object end address in EBX.
   __ TryAllocateArray(kArrayCid, instance_size, slow_path, Assembler::kFarJump,
-                      EAX,  // instance
-                      EBX,  // end address
+                      EAX,   // instance
+                      EBX,   // end address
                       EDI);  // temp
 
   // Store the type argument field.
-  __ StoreIntoObjectNoBarrier(EAX,
-                              FieldAddress(EAX, Array::type_arguments_offset()),
-                              kElemTypeReg);
+  __ StoreIntoObjectNoBarrier(
+      EAX, FieldAddress(EAX, Array::type_arguments_offset()), kElemTypeReg);
 
   // Set the length field.
-  __ StoreIntoObjectNoBarrier(EAX,
-                              FieldAddress(EAX, Array::length_offset()),
+  __ StoreIntoObjectNoBarrier(EAX, FieldAddress(EAX, Array::length_offset()),
                               kLengthReg);
 
   // Initialize all array elements to raw_null.
@@ -2111,8 +2095,7 @@
   ASSERT(locs()->in(1).reg() == kLengthReg);
 
   Label slow_path, done;
-  if (compiler->is_optimizing() &&
-      num_elements()->BindsToConstant() &&
+  if (compiler->is_optimizing() && num_elements()->BindsToConstant() &&
       num_elements()->BoundConstant().IsSmi()) {
     const intptr_t length = Smi::Cast(num_elements()->BoundConstant()).Value();
     if ((length >= 0) && (length <= Array::kMaxElements)) {
@@ -2122,11 +2105,8 @@
       __ PushObject(Object::null_object());  // Make room for the result.
       __ pushl(kLengthReg);
       __ pushl(kElemTypeReg);
-      compiler->GenerateRuntimeCall(token_pos(),
-                                    deopt_id(),
-                                    kAllocateArrayRuntimeEntry,
-                                    2,
-                                    locs());
+      compiler->GenerateRuntimeCall(token_pos(), deopt_id(),
+                                    kAllocateArrayRuntimeEntry, 2, locs());
       __ Drop(2);
       __ popl(kResultReg);
       __ Bind(&done);
@@ -2138,10 +2118,8 @@
   const Code& stub = Code::ZoneHandle(compiler->zone(),
                                       StubCode::AllocateArray_entry()->code());
   compiler->AddStubCallTarget(stub);
-  compiler->GenerateCall(token_pos(),
-                         *StubCode::AllocateArray_entry(),
-                         RawPcDescriptors::kOther,
-                         locs());
+  compiler->GenerateCall(token_pos(), *StubCode::AllocateArray_entry(),
+                         RawPcDescriptors::kOther, locs());
   __ Bind(&done);
   ASSERT(locs()->out(0).reg() == kResultReg);
 }
@@ -2151,14 +2129,12 @@
                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps =
-      (IsUnboxedLoad() && opt) ? 1 :
-          ((IsPotentialUnboxedLoad()) ? 2 : 0);
+      (IsUnboxedLoad() && opt) ? 1 : ((IsPotentialUnboxedLoad()) ? 2 : 0);
 
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps,
-          (opt && !IsPotentialUnboxedLoad())
-          ? LocationSummary::kNoCall
-          : LocationSummary::kCallOnSlowPath);
+  LocationSummary* locs = new (zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, (opt && !IsPotentialUnboxedLoad())
+                                       ? LocationSummary::kNoCall
+                                       : LocationSummary::kCallOnSlowPath);
 
   locs->set_in(0, Location::RequiresRegister());
 
@@ -2240,8 +2216,8 @@
 
     {
       __ Bind(&load_double);
-      BoxAllocationSlowPath::Allocate(
-          compiler, this, compiler->double_class(), result, temp);
+      BoxAllocationSlowPath::Allocate(compiler, this, compiler->double_class(),
+                                      result, temp);
       __ movl(temp, FieldAddress(instance_reg, offset_in_bytes()));
       __ movsd(value, FieldAddress(temp, Double::value_offset()));
       __ movsd(FieldAddress(result, Double::value_offset()), value);
@@ -2279,8 +2255,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(EAX));
   locs->set_out(0, Location::RegisterLocation(EAX));
   return locs;
@@ -2296,23 +2272,21 @@
   __ PushObject(Object::null_object());  // Make room for the result.
   __ PushObject(type());
   __ pushl(instantiator_reg);  // Push instantiator type arguments.
-  compiler->GenerateRuntimeCall(token_pos(),
-                                deopt_id(),
-                                kInstantiateTypeRuntimeEntry,
-                                2,
-                                locs());
-  __ Drop(2);  // Drop instantiator and uninstantiated type.
+  compiler->GenerateRuntimeCall(token_pos(), deopt_id(),
+                                kInstantiateTypeRuntimeEntry, 2, locs());
+  __ Drop(2);           // Drop instantiator and uninstantiated type.
   __ popl(result_reg);  // Pop instantiated type.
   ASSERT(instantiator_reg == result_reg);
 }
 
 
 LocationSummary* InstantiateTypeArgumentsInstr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(EAX));
   locs->set_out(0, Location::RegisterLocation(EAX));
   return locs;
@@ -2368,12 +2342,10 @@
   __ PushObject(Object::null_object());  // Make room for the result.
   __ PushObject(type_arguments());
   __ pushl(instantiator_reg);  // Push instantiator type arguments.
-  compiler->GenerateRuntimeCall(token_pos(),
-                                deopt_id(),
-                                kInstantiateTypeArgumentsRuntimeEntry,
-                                2,
+  compiler->GenerateRuntimeCall(token_pos(), deopt_id(),
+                                kInstantiateTypeArgumentsRuntimeEntry, 2,
                                 locs());
-  __ Drop(2);  // Drop instantiator and uninstantiated type arguments.
+  __ Drop(2);           // Drop instantiator and uninstantiated type arguments.
   __ popl(result_reg);  // Pop instantiated type arguments.
   __ Bind(&type_arguments_instantiated);
 }
@@ -2385,7 +2357,7 @@
   ASSERT(opt);
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 2;
-  LocationSummary* locs = new(zone) LocationSummary(
+  LocationSummary* locs = new (zone) LocationSummary(
       zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   locs->set_temp(0, Location::RegisterLocation(ECX));
   locs->set_temp(1, Location::RegisterLocation(EDI));
@@ -2398,7 +2370,7 @@
  public:
   explicit AllocateContextSlowPath(
       AllocateUninitializedContextInstr* instruction)
-      : instruction_(instruction) { }
+      : instruction_(instruction) {}
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     __ Comment("AllocateContextSlowPath");
@@ -2415,8 +2387,7 @@
     compiler->AddStubCallTarget(stub);
     compiler->GenerateCall(instruction_->token_pos(),
                            *StubCode::AllocateContext_entry(),
-                           RawPcDescriptors::kOther,
-                           locs);
+                           RawPcDescriptors::kOther, locs);
     ASSERT(instruction_->locs()->out(0).reg() == EAX);
     compiler->RestoreLiveRegisters(instruction_->locs());
     __ jmp(exit_label());
@@ -2441,7 +2412,7 @@
   __ TryAllocateArray(kContextCid, instance_size, slow_path->entry_label(),
                       Assembler::kFarJump,
                       result,  // instance
-                      temp,  // end address
+                      temp,    // end address
                       temp2);  // temp
 
   // Setup up number of context variables field.
@@ -2456,8 +2427,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 1;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_temp(0, Location::RegisterLocation(EDX));
   locs->set_out(0, Location::RegisterLocation(EAX));
   return locs;
@@ -2469,10 +2440,8 @@
   ASSERT(locs()->out(0).reg() == EAX);
 
   __ movl(EDX, Immediate(num_context_variables()));
-  compiler->GenerateCall(token_pos(),
-                         *StubCode::AllocateContext_entry(),
-                         RawPcDescriptors::kOther,
-                         locs());
+  compiler->GenerateCall(token_pos(), *StubCode::AllocateContext_entry(),
+                         RawPcDescriptors::kOther, locs());
 }
 
 
@@ -2480,8 +2449,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(EAX));
   locs->set_temp(0, Location::RegisterLocation(ECX));
   return locs;
@@ -2504,11 +2473,8 @@
   __ Bind(&call_runtime);
   __ PushObject(Object::null_object());  // Make room for (unused) result.
   __ pushl(field);
-  compiler->GenerateRuntimeCall(token_pos(),
-                                deopt_id(),
-                                kInitStaticFieldRuntimeEntry,
-                                1,
-                                locs());
+  compiler->GenerateRuntimeCall(token_pos(), deopt_id(),
+                                kInitStaticFieldRuntimeEntry, 1, locs());
   __ Drop(2);  // Remove argument and unused result.
   __ Bind(&no_call);
 }
@@ -2518,8 +2484,8 @@
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(EAX));
   locs->set_out(0, Location::RegisterLocation(EAX));
   return locs;
@@ -2532,11 +2498,8 @@
 
   __ PushObject(Object::null_object());  // Make room for the result.
   __ pushl(context_value);
-  compiler->GenerateRuntimeCall(token_pos(),
-                                deopt_id(),
-                                kCloneContextRuntimeEntry,
-                                1,
-                                locs());
+  compiler->GenerateRuntimeCall(token_pos(), deopt_id(),
+                                kCloneContextRuntimeEntry, 1, locs());
   __ popl(result);  // Remove argument.
   __ popl(result);  // Get result (cloned context).
 }
@@ -2551,19 +2514,16 @@
 
 void CatchBlockEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   __ Bind(compiler->GetJumpLabel(this));
-  compiler->AddExceptionHandler(catch_try_index(),
-                                try_index(),
+  compiler->AddExceptionHandler(catch_try_index(), try_index(),
                                 compiler->assembler()->CodeSize(),
-                                catch_handler_types_,
-                                needs_stacktrace());
+                                catch_handler_types_, needs_stacktrace());
   // On lazy deoptimization we patch the optimized code here to enter the
   // deoptimization stub.
   const intptr_t deopt_id = Thread::ToDeoptAfter(GetDeoptId());
   if (compiler->is_optimizing()) {
     compiler->AddDeoptIndexAtCall(deopt_id);
   } else {
-    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
-                                   deopt_id,
+    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, deopt_id,
                                    TokenPosition::kNoSource);
   }
   if (HasParallelMove()) {
@@ -2590,10 +2550,8 @@
                                                               bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = opt ? 0 : 1;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs,
-                          kNumTemps,
-                          LocationSummary::kCallOnSlowPath);
+  LocationSummary* summary = new (zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   if (!opt) {
     summary->set_temp(0, Location::RequiresRegister());
   }
@@ -2604,7 +2562,7 @@
 class CheckStackOverflowSlowPath : public SlowPathCode {
  public:
   explicit CheckStackOverflowSlowPath(CheckStackOverflowInstr* instruction)
-      : instruction_(instruction) { }
+      : instruction_(instruction) {}
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     if (FLAG_use_osr && osr_entry_label()->IsLinked()) {
@@ -2621,11 +2579,9 @@
     ASSERT(compiler->pending_deoptimization_env_ == NULL);
     Environment* env = compiler->SlowPathEnvironmentFor(instruction_);
     compiler->pending_deoptimization_env_ = env;
-    compiler->GenerateRuntimeCall(instruction_->token_pos(),
-                                  instruction_->deopt_id(),
-                                  kStackOverflowRuntimeEntry,
-                                  0,
-                                  instruction_->locs());
+    compiler->GenerateRuntimeCall(
+        instruction_->token_pos(), instruction_->deopt_id(),
+        kStackOverflowRuntimeEntry, 0, instruction_->locs());
 
     if (FLAG_use_osr && !compiler->is_optimizing() && instruction_->in_loop()) {
       // In unoptimized code, record loop stack checks as possible OSR entries.
@@ -2681,9 +2637,10 @@
   Register left = locs.in(0).reg();
   Register result = locs.out(0).reg();
   ASSERT(left == result);
-  Label* deopt = shift_left->CanDeoptimize() ?
-      compiler->AddDeoptStub(shift_left->deopt_id(), ICData::kDeoptBinarySmiOp)
-      : NULL;
+  Label* deopt = shift_left->CanDeoptimize()
+                     ? compiler->AddDeoptStub(shift_left->deopt_id(),
+                                              ICData::kDeoptBinarySmiOp)
+                     : NULL;
   if (locs.in(1).IsConstant()) {
     const Object& constant = locs.in(1).constant();
     ASSERT(constant.IsSmi());
@@ -2730,7 +2687,7 @@
           !RangeUtils::IsWithin(right_range, 0, max_right - 1);
       if (right_needs_check) {
         __ cmpl(right,
-            Immediate(reinterpret_cast<int32_t>(Smi::New(max_right))));
+                Immediate(reinterpret_cast<int32_t>(Smi::New(max_right))));
         __ j(ABOVE_EQUAL, deopt);
       }
       __ SmiUntag(right);
@@ -2753,7 +2710,7 @@
       }
       Label done, is_not_zero;
       __ cmpl(right,
-          Immediate(reinterpret_cast<int32_t>(Smi::New(Smi::kBits))));
+              Immediate(reinterpret_cast<int32_t>(Smi::New(Smi::kBits))));
       __ j(BELOW, &is_not_zero, Assembler::kNearJump);
       __ xorl(left, left);
       __ jmp(&done, Assembler::kNearJump);
@@ -2769,7 +2726,7 @@
     if (right_needs_check) {
       ASSERT(shift_left->CanDeoptimize());
       __ cmpl(right,
-        Immediate(reinterpret_cast<int32_t>(Smi::New(Smi::kBits))));
+              Immediate(reinterpret_cast<int32_t>(Smi::New(Smi::kBits))));
       __ j(ABOVE_EQUAL, deopt);
     }
     // Left is not a constant.
@@ -2803,7 +2760,8 @@
 
 
 LocationSummary* CheckedSmiComparisonInstr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   // Only for precompiled code, not on ia32 currently.
   UNIMPLEMENTED();
   return NULL;
@@ -2811,7 +2769,8 @@
 
 
 Condition CheckedSmiComparisonInstr::EmitComparisonCode(
-    FlowGraphCompiler* compiler, BranchLabels labels) {
+    FlowGraphCompiler* compiler,
+    BranchLabels labels) {
   // Only for precompiled code, not on ia32 currently.
   UNIMPLEMENTED();
   return ZERO;
@@ -2841,8 +2800,8 @@
   const intptr_t kNumInputs = 2;
   if (op_kind() == Token::kTRUNCDIV) {
     const intptr_t kNumTemps = 1;
-    LocationSummary* summary = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     if (RightIsPowerOfTwoConstant()) {
       summary->set_in(0, Location::RequiresRegister());
       ConstantInstr* right_constant = right()->definition()->AsConstant();
@@ -2861,8 +2820,8 @@
     return summary;
   } else if (op_kind() == Token::kMOD) {
     const intptr_t kNumTemps = 1;
-    LocationSummary* summary = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     // Both inputs must be writable because they will be untagged.
     summary->set_in(0, Location::RegisterLocation(EDX));
     summary->set_in(1, Location::WritableRegister());
@@ -2872,8 +2831,8 @@
     return summary;
   } else if (op_kind() == Token::kSHR) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* summary = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), ECX));
     summary->set_out(0, Location::SameAsFirstInput());
@@ -2884,8 +2843,8 @@
     const bool shiftBy1 =
         (right_constant != NULL) && IsSmiValue(right_constant->value(), 1);
     const intptr_t kNumTemps = (can_overflow() && !shiftBy1) ? 1 : 0;
-    LocationSummary* summary = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), ECX));
     if (kNumTemps == 1) {
@@ -2895,8 +2854,8 @@
     return summary;
   } else {
     const intptr_t kNumTemps = 0;
-    LocationSummary* summary = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     ConstantInstr* constant = right()->definition()->AsConstant();
     if (constant != NULL) {
@@ -2910,7 +2869,7 @@
 }
 
 
-template<typename OperandType>
+template <typename OperandType>
 static void EmitIntegerArithmetic(FlowGraphCompiler* compiler,
                                   Token::Kind op_kind,
                                   Register left,
@@ -2967,13 +2926,9 @@
       case Token::kBIT_OR:
       case Token::kBIT_XOR:
       case Token::kMUL: {
-        const intptr_t imm = (op_kind() == Token::kMUL) ? value
-                                                        : Smi::RawValue(value);
-        EmitIntegerArithmetic(compiler,
-                              op_kind(),
-                              left,
-                              Immediate(imm),
-                              deopt);
+        const intptr_t imm =
+            (op_kind() == Token::kMUL) ? value : Smi::RawValue(value);
+        EmitIntegerArithmetic(compiler, op_kind(), left, Immediate(imm), deopt);
         break;
       }
 
@@ -3000,8 +2955,8 @@
       case Token::kSHR: {
         // sarl operation masks the count to 5 bits.
         const intptr_t kCountLimit = 0x1F;
-        __ sarl(left, Immediate(
-            Utils::Minimum(value + kSmiTagSize, kCountLimit)));
+        __ sarl(left,
+                Immediate(Utils::Minimum(value + kSmiTagSize, kCountLimit)));
         __ SmiTag(left);
         break;
       }
@@ -3051,7 +3006,7 @@
       ASSERT(result == EAX);
       __ SmiUntag(left);
       __ SmiUntag(right);
-      __ cdq();  // Sign extend EAX -> EDX:EAX.
+      __ cdq();         // Sign extend EAX -> EDX:EAX.
       __ idivl(right);  //  EAX: quotient, EDX: remainder.
       // Check the corner case of dividing the 'MIN_SMI' with -1, in which
       // case we cannot tag the result.
@@ -3073,7 +3028,7 @@
       __ SmiUntag(left);
       __ SmiUntag(right);
       __ movl(EAX, EDX);
-      __ cdq();  // Sign extend EAX -> EDX:EAX.
+      __ cdq();         // Sign extend EAX -> EDX:EAX.
       __ idivl(right);  //  EAX: quotient, EDX: remainder.
       //  res = left % right;
       //  if (res < 0) {
@@ -3156,20 +3111,20 @@
     UNREACHABLE();
     return NULL;
   } else if (op_kind() == Token::kMOD) {
-     UNREACHABLE();
+    UNREACHABLE();
     return NULL;
   } else if (op_kind() == Token::kSHR) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* summary = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), ECX));
     summary->set_out(0, Location::SameAsFirstInput());
     return summary;
   } else if (op_kind() == Token::kSHL) {
     const intptr_t kNumTemps = can_overflow() ? 1 : 0;
-    LocationSummary* summary = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), ECX));
     if (can_overflow()) {
@@ -3179,8 +3134,8 @@
     return summary;
   } else {
     const intptr_t kNumTemps = 0;
-    LocationSummary* summary = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     ConstantInstr* constant = right()->definition()->AsConstant();
     if (constant != NULL) {
@@ -3200,9 +3155,10 @@
   Register left = locs.in(0).reg();
   Register result = locs.out(0).reg();
   ASSERT(left == result);
-  Label* deopt = shift_left->CanDeoptimize() ?
-      compiler->AddDeoptStub(shift_left->deopt_id(), ICData::kDeoptBinarySmiOp)
-      : NULL;
+  Label* deopt = shift_left->CanDeoptimize()
+                     ? compiler->AddDeoptStub(shift_left->deopt_id(),
+                                              ICData::kDeoptBinarySmiOp)
+                     : NULL;
   ASSERT(locs.in(1).IsConstant());
 
   const Object& constant = locs.in(1).constant();
@@ -3236,7 +3192,7 @@
   ASSERT(left == result);
   Label* deopt = NULL;
   if (CanDeoptimize()) {
-    deopt  = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinarySmiOp);
+    deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinarySmiOp);
   }
 
   if (locs()->in(1).IsConstant()) {
@@ -3250,15 +3206,11 @@
       case Token::kBIT_AND:
       case Token::kBIT_OR:
       case Token::kBIT_XOR:
-        EmitIntegerArithmetic(compiler,
-                              op_kind(),
-                              left,
-                              Immediate(value),
+        EmitIntegerArithmetic(compiler, op_kind(), left, Immediate(value),
                               deopt);
         break;
 
 
-
       case Token::kTRUNCDIV: {
         UNREACHABLE();
         break;
@@ -3280,11 +3232,7 @@
 
   if (locs()->in(1).IsStackSlot()) {
     const Address& right = locs()->in(1).ToStackSlotAddress();
-    EmitIntegerArithmetic(compiler,
-                          op_kind(),
-                          left,
-                          right,
-                          deopt);
+    EmitIntegerArithmetic(compiler, op_kind(), left, right, deopt);
     return;
   }  // if locs()->in(1).IsStackSlot.
 
@@ -3297,11 +3245,7 @@
     case Token::kBIT_AND:
     case Token::kBIT_OR:
     case Token::kBIT_XOR:
-      EmitIntegerArithmetic(compiler,
-                            op_kind(),
-                            left,
-                            right,
-                            deopt);
+      EmitIntegerArithmetic(compiler, op_kind(), left, right, deopt);
       break;
 
     default:
@@ -3315,8 +3259,8 @@
                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = (op_kind() == Token::kMUL) ? 1 : 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   if (op_kind() == Token::kMUL) {
     summary->set_in(0, Location::RegisterLocation(EAX));
     summary->set_temp(0, Location::RegisterLocation(EDX));
@@ -3360,12 +3304,11 @@
   intptr_t right_cid = right()->Type()->ToCid();
   ASSERT((left_cid != kDoubleCid) && (right_cid != kDoubleCid));
   const intptr_t kNumInputs = 2;
-  const bool need_temp = (left()->definition() != right()->definition())
-                      && (left_cid != kSmiCid)
-                      && (right_cid != kSmiCid);
+  const bool need_temp = (left()->definition() != right()->definition()) &&
+                         (left_cid != kSmiCid) && (right_cid != kSmiCid);
   const intptr_t kNumTemps = need_temp ? 1 : 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   if (need_temp) summary->set_temp(0, Location::RequiresRegister());
@@ -3374,16 +3317,16 @@
 
 
 void CheckEitherNonSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label* deopt = compiler->AddDeoptStub(deopt_id(),
-                                        ICData::kDeoptBinaryDoubleOp,
-                                        licm_hoisted_ ? ICData::kHoisted : 0);
+  Label* deopt =
+      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryDoubleOp,
+                             licm_hoisted_ ? ICData::kHoisted : 0);
   intptr_t left_cid = left()->Type()->ToCid();
   intptr_t right_cid = right()->Type()->ToCid();
   Register left = locs()->in(0).reg();
   Register right = locs()->in(1).reg();
   if (this->left()->definition() == this->right()->definition()) {
     __ testl(left, Immediate(kSmiTagMask));
-  } else  if (left_cid == kSmiCid) {
+  } else if (left_cid == kSmiCid) {
     __ testl(right, Immediate(kSmiTagMask));
   } else if (right_cid == kSmiCid) {
     __ testl(left, Immediate(kSmiTagMask));
@@ -3397,11 +3340,10 @@
 }
 
 
-LocationSummary* BoxInstr::MakeLocationSummary(Zone* zone,
-                                                     bool opt) const {
+LocationSummary* BoxInstr::MakeLocationSummary(Zone* zone, bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(zone) LocationSummary(
+  LocationSummary* summary = new (zone) LocationSummary(
       zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_temp(0, Location::RequiresRegister());
@@ -3414,12 +3356,9 @@
   Register out_reg = locs()->out(0).reg();
   XmmRegister value = locs()->in(0).fpu_reg();
 
-  BoxAllocationSlowPath::Allocate(
-      compiler,
-      this,
-      compiler->BoxClassFor(from_representation()),
-      out_reg,
-      locs()->temp(0).reg());
+  BoxAllocationSlowPath::Allocate(compiler, this,
+                                  compiler->BoxClassFor(from_representation()),
+                                  out_reg, locs()->temp(0).reg());
 
   switch (from_representation()) {
     case kUnboxedDouble:
@@ -3437,15 +3376,15 @@
 }
 
 
-LocationSummary* UnboxInstr::MakeLocationSummary(Zone* zone,
-                                                       bool opt) const {
-  const bool needs_temp = CanDeoptimize() ||
+LocationSummary* UnboxInstr::MakeLocationSummary(Zone* zone, bool opt) const {
+  const bool needs_temp =
+      CanDeoptimize() ||
       (CanConvertSmi() && (value()->Type()->ToCid() == kSmiCid));
 
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = needs_temp ? 1 : 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   if (needs_temp) {
     summary->set_temp(0, Location::RequiresRegister());
@@ -3534,8 +3473,8 @@
   } else {
     const Register box = locs()->in(0).reg();
     const Register temp = locs()->temp(0).reg();
-    Label* deopt = compiler->AddDeoptStub(GetDeoptId(),
-                                          ICData::kDeoptCheckClass);
+    Label* deopt =
+        compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptCheckClass);
     Label is_smi;
 
     if ((value()->Type()->ToNullableCid() == box_cid) &&
@@ -3568,12 +3507,12 @@
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = ValueFitsSmi() ? 0 : 1;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps,
-      ValueFitsSmi() ? LocationSummary::kNoCall
-                     : LocationSummary::kCallOnSlowPath);
-  const bool needs_writable_input = ValueFitsSmi() ||
-      (from_representation() == kUnboxedUint32);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, 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());
   if (!ValueFitsSmi()) {
@@ -3605,8 +3544,8 @@
     // 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, locs()->temp(0).reg());
+    BoxAllocationSlowPath::Allocate(compiler, this, compiler->mint_class(), out,
+                                    locs()->temp(0).reg());
     __ movl(FieldAddress(out, Mint::value_offset()), value);
     if (from_representation() == kUnboxedInt32) {
       __ sarl(value, Immediate(31));  // Sign extend.
@@ -3624,12 +3563,10 @@
                                                     bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = ValueFitsSmi() ? 0 : 1;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs,
-                          kNumTemps,
-                          ValueFitsSmi()
-                              ? LocationSummary::kNoCall
-                              : LocationSummary::kCallOnSlowPath);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps,
+                      ValueFitsSmi() ? LocationSummary::kNoCall
+                                     : LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::Pair(Location::RequiresRegister(),
                                     Location::RequiresRegister()));
   if (!ValueFitsSmi()) {
@@ -3680,8 +3617,8 @@
   // 3. Restore lower half of input before using it.
   __ subl(value_lo, Immediate(0x40000000));
 
-  BoxAllocationSlowPath::Allocate(
-      compiler, this, compiler->mint_class(), out_reg, locs()->temp(0).reg());
+  BoxAllocationSlowPath::Allocate(compiler, this, compiler->mint_class(),
+                                  out_reg, locs()->temp(0).reg());
   __ movl(FieldAddress(out_reg, Mint::value_offset()), value_lo);
   __ movl(FieldAddress(out_reg, Mint::value_offset() + kWordSize), value_hi);
   __ Bind(&done);
@@ -3695,23 +3632,22 @@
   intptr_t kNumTemps = 0;
 
   if (CanDeoptimize()) {
-    if ((value_cid != kSmiCid) &&
-        (value_cid != kMintCid) &&
-        !is_truncating()) {
+    if ((value_cid != kSmiCid) && (value_cid != kMintCid) && !is_truncating()) {
       kNumTemps = 2;
     } else {
       kNumTemps = 1;
     }
   }
 
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, 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());
+  summary->set_out(0, ((value_cid == kSmiCid) || (value_cid != kMintCid))
+                          ? Location::SameAsFirstInput()
+                          : Location::RequiresRegister());
   return summary;
 }
 
@@ -3738,8 +3674,10 @@
   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* deopt =
+      CanDeoptimize()
+          ? compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptUnboxInteger)
+          : NULL;
   Label* out_of_range = !is_truncating() ? deopt : NULL;
 
   const intptr_t lo_offset = Mint::value_offset();
@@ -3750,12 +3688,8 @@
     __ 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);
+    LoadInt32FromMint(compiler, result, FieldAddress(value, lo_offset),
+                      FieldAddress(value, hi_offset), temp, out_of_range);
   } else if (!CanDeoptimize()) {
     ASSERT(value == result);
     Label done;
@@ -3773,12 +3707,8 @@
       __ 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);
+    LoadInt32FromMint(compiler, result, Address(value, TIMES_2, lo_offset),
+                      Address(value, TIMES_2, hi_offset), temp, out_of_range);
     __ Bind(&done);
   }
 }
@@ -3789,7 +3719,7 @@
   const bool might_box = (representation() == kTagged) && !can_pack_into_smi();
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = might_box ? 2 : 0;
-  LocationSummary* summary = new(zone) LocationSummary(
+  LocationSummary* summary = new (zone) LocationSummary(
       zone, kNumInputs, kNumTemps,
       might_box ? LocationSummary::kCallOnSlowPath : LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
@@ -3820,7 +3750,7 @@
   const Location index = locs()->in(1);
 
   Address element_address = Assembler::ElementAddressForRegIndex(
-        IsExternal(), class_id(), index_scale(), str, index.reg());
+      IsExternal(), class_id(), index_scale(), str, index.reg());
 
   if ((index_scale() == 1)) {
     __ SmiUntag(index.reg());
@@ -3856,18 +3786,30 @@
       case kOneByteStringCid:
       case kExternalOneByteStringCid:
         switch (element_count()) {
-          case 1: __ movzxb(result, element_address); break;
-          case 2: __ movzxw(result, element_address); break;
-          case 4: __ movl(result, element_address); break;
-          default: UNREACHABLE();
+          case 1:
+            __ movzxb(result, element_address);
+            break;
+          case 2:
+            __ movzxw(result, element_address);
+            break;
+          case 4:
+            __ movl(result, element_address);
+            break;
+          default:
+            UNREACHABLE();
         }
         break;
       case kTwoByteStringCid:
       case kExternalTwoByteStringCid:
         switch (element_count()) {
-          case 1: __ movzxw(result, element_address); break;
-          case 2: __ movl(result, element_address); break;
-          default: UNREACHABLE();
+          case 1:
+            __ movzxw(result, element_address);
+            break;
+          case 2:
+            __ movl(result, element_address);
+            break;
+          default:
+            UNREACHABLE();
         }
         break;
       default:
@@ -3890,8 +3832,8 @@
       Label done;
       __ testl(temp, Immediate(0xC0000000));
       __ j(ZERO, &done);
-      BoxAllocationSlowPath::Allocate(
-          compiler, this, compiler->mint_class(), result, temp2);
+      BoxAllocationSlowPath::Allocate(compiler, this, compiler->mint_class(),
+                                      result, temp2);
       __ movl(FieldAddress(result, Mint::value_offset()), temp);
       __ movl(FieldAddress(result, Mint::value_offset() + kWordSize),
               Immediate(0));
@@ -3905,8 +3847,8 @@
                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -3921,11 +3863,20 @@
   ASSERT(locs()->out(0).fpu_reg() == left);
 
   switch (op_kind()) {
-    case Token::kADD: __ addsd(left, right); break;
-    case Token::kSUB: __ subsd(left, right); break;
-    case Token::kMUL: __ mulsd(left, right); break;
-    case Token::kDIV: __ divsd(left, right); break;
-    default: UNREACHABLE();
+    case Token::kADD:
+      __ addsd(left, right);
+      break;
+    case Token::kSUB:
+      __ subsd(left, right);
+      break;
+    case Token::kMUL:
+      __ mulsd(left, right);
+      break;
+    case Token::kDIV:
+      __ divsd(left, right);
+      break;
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -3935,8 +3886,8 @@
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps =
       (op_kind() == MethodRecognizer::kDouble_getIsInfinite) ? 1 : 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   if (op_kind() == MethodRecognizer::kDouble_getIsInfinite) {
     summary->set_temp(0, Location::RequiresRegister());
@@ -3991,9 +3942,9 @@
 
 void DoubleTestOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Label is_true, is_false;
-  BranchLabels labels = { &is_true, &is_false, &is_false };
+  BranchLabels labels = {&is_true, &is_false, &is_false};
   Condition true_condition = EmitComparisonCode(compiler, labels);
-  EmitBranchOnCondition(compiler,  true_condition, labels);
+  EmitBranchOnCondition(compiler, true_condition, labels);
 
   Register result = locs()->out(0).reg();
   Label done;
@@ -4010,8 +3961,8 @@
                                                              bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -4026,11 +3977,20 @@
   ASSERT(locs()->out(0).fpu_reg() == left);
 
   switch (op_kind()) {
-    case Token::kADD: __ addps(left, right); break;
-    case Token::kSUB: __ subps(left, right); break;
-    case Token::kMUL: __ mulps(left, right); break;
-    case Token::kDIV: __ divps(left, right); break;
-    default: UNREACHABLE();
+    case Token::kADD:
+      __ addps(left, right);
+      break;
+    case Token::kSUB:
+      __ subps(left, right);
+      break;
+    case Token::kMUL:
+      __ mulps(left, right);
+      break;
+    case Token::kDIV:
+      __ divps(left, right);
+      break;
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -4039,8 +3999,8 @@
                                                              bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -4055,11 +4015,20 @@
   ASSERT(locs()->out(0).fpu_reg() == left);
 
   switch (op_kind()) {
-    case Token::kADD: __ addpd(left, right); break;
-    case Token::kSUB: __ subpd(left, right); break;
-    case Token::kMUL: __ mulpd(left, right); break;
-    case Token::kDIV: __ divpd(left, right); break;
-    default: UNREACHABLE();
+    case Token::kADD:
+      __ addpd(left, right);
+      break;
+    case Token::kSUB:
+      __ subpd(left, right);
+      break;
+    case Token::kMUL:
+      __ mulpd(left, right);
+      break;
+    case Token::kDIV:
+      __ divpd(left, right);
+      break;
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -4068,8 +4037,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4102,7 +4071,8 @@
     case MethodRecognizer::kInt32x4Shuffle:
       __ shufps(value, value, Immediate(mask_));
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -4111,8 +4081,8 @@
                                                               bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -4130,7 +4100,8 @@
     case MethodRecognizer::kInt32x4ShuffleMix:
       __ shufps(left, right, Immediate(mask_));
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -4139,8 +4110,8 @@
                                                                bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -4157,11 +4128,12 @@
 
 
 LocationSummary* Float32x4ConstructorInstr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   const intptr_t kNumInputs = 4;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_in(2, Location::RequiresFpuRegister());
@@ -4198,8 +4170,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
 }
@@ -4215,8 +4187,8 @@
                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4237,8 +4209,8 @@
                                                                bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -4272,7 +4244,8 @@
       __ cmppsle(left, right);
       break;
 
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -4281,8 +4254,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -4303,7 +4276,8 @@
     case MethodRecognizer::kFloat32x4Max:
       __ maxps(left, right);
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -4312,8 +4286,8 @@
                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -4333,7 +4307,8 @@
       __ shufps(left, left, Immediate(0x00));
       __ mulps(left, right);
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -4342,8 +4317,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4365,7 +4340,8 @@
     case MethodRecognizer::kFloat32x4ReciprocalSqrt:
       __ rsqrtps(left);
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -4374,8 +4350,8 @@
                                                             bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4393,7 +4369,8 @@
     case MethodRecognizer::kFloat32x4Absolute:
       __ absps(left);
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -4402,8 +4379,8 @@
                                                           bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_in(2, Location::RequiresFpuRegister());
@@ -4426,8 +4403,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -4486,7 +4463,8 @@
       __ movups(replacement, Address(ESP, 0));
       __ addl(ESP, Immediate(16));
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -4495,8 +4473,8 @@
                                                               bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4512,8 +4490,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4532,18 +4510,18 @@
     case MethodRecognizer::kFloat64x2GetY:
       __ shufpd(value, value, Immediate(0x33));
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
 
-
 LocationSummary* Float64x2ZeroInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
 }
@@ -4559,8 +4537,8 @@
                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4574,11 +4552,12 @@
 
 
 LocationSummary* Float64x2ConstructorInstr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -4598,11 +4577,12 @@
 
 
 LocationSummary* Float64x2ToFloat32x4Instr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4616,11 +4596,12 @@
 
 
 LocationSummary* Float32x4ToFloat64x2Instr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4637,8 +4618,8 @@
                                                             bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   if (representation() == kTagged) {
     ASSERT(op_kind() == MethodRecognizer::kFloat64x2GetSignMask);
@@ -4671,7 +4652,8 @@
       __ movmskpd(locs()->out(0).reg(), left);
       __ SmiTag(locs()->out(0).reg());
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -4680,8 +4662,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -4725,17 +4707,18 @@
     case MethodRecognizer::kFloat64x2Max:
       __ maxpd(left, right);
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
 
-LocationSummary* Int32x4ConstructorInstr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+LocationSummary* Int32x4ConstructorInstr::MakeLocationSummary(Zone* zone,
+                                                              bool opt) const {
   const intptr_t kNumInputs = 4;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   summary->set_in(2, Location::RequiresRegister());
@@ -4762,11 +4745,12 @@
 
 
 LocationSummary* Int32x4BoolConstructorInstr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   const intptr_t kNumInputs = 4;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   summary->set_in(2, Location::RequiresRegister());
@@ -4828,8 +4812,8 @@
                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -4857,7 +4841,8 @@
     case MethodRecognizer::kInt32x4GetFlagW:
       __ movl(result, Address(ESP, 12));
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
   __ addl(ESP, Immediate(16));
   __ testl(result, result);
@@ -4874,8 +4859,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_in(2, Location::RequiresFpuRegister());
@@ -4909,8 +4894,8 @@
                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -4934,26 +4919,27 @@
       __ jmp(&exitPath);
       __ Bind(&falsePath);
       __ movl(Address(ESP, 0), Immediate(0x0));
-    break;
+      break;
     case MethodRecognizer::kInt32x4WithFlagY:
       __ movl(Address(ESP, 4), Immediate(0xFFFFFFFF));
       __ jmp(&exitPath);
       __ Bind(&falsePath);
       __ movl(Address(ESP, 4), Immediate(0x0));
-    break;
+      break;
     case MethodRecognizer::kInt32x4WithFlagZ:
       __ movl(Address(ESP, 8), Immediate(0xFFFFFFFF));
       __ jmp(&exitPath);
       __ Bind(&falsePath);
       __ movl(Address(ESP, 8), Immediate(0x0));
-    break;
+      break;
     case MethodRecognizer::kInt32x4WithFlagW:
       __ movl(Address(ESP, 12), Immediate(0xFFFFFFFF));
       __ jmp(&exitPath);
       __ Bind(&falsePath);
       __ movl(Address(ESP, 12), Immediate(0x0));
-    break;
-    default: UNREACHABLE();
+      break;
+    default:
+      UNREACHABLE();
   }
   __ Bind(&exitPath);
   // Copy mask back to register.
@@ -4966,8 +4952,8 @@
                                                               bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4983,8 +4969,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -5015,7 +5001,8 @@
     case Token::kSUB:
       __ subpl(left, right);
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -5026,8 +5013,8 @@
          (kind() == MathUnaryInstr::kDoubleSquare));
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   if (kind() == MathUnaryInstr::kDoubleSquare) {
     summary->set_out(0, Location::SameAsFirstInput());
@@ -5052,10 +5039,11 @@
 
 
 LocationSummary* CaseInsensitiveCompareUC16Instr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, InputCount(), kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, InputCount(), kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(EAX));
   summary->set_in(1, Location::RegisterLocation(ECX));
   summary->set_in(2, Location::RegisterLocation(EDX));
@@ -5067,17 +5055,16 @@
 
 void CaseInsensitiveCompareUC16Instr::EmitNativeCode(
     FlowGraphCompiler* compiler) {
-
   // Save ESP. EDI is chosen because it is callee saved so we do not need to
   // back it up before calling into the runtime.
   static const Register kSavedSPReg = EDI;
   __ movl(kSavedSPReg, ESP);
   __ ReserveAlignedFrameSpace(kWordSize * TargetFunction().argument_count());
 
-  __ movl(Address(ESP, + 0 * kWordSize), locs()->in(0).reg());
-  __ movl(Address(ESP, + 1 * kWordSize), locs()->in(1).reg());
-  __ movl(Address(ESP, + 2 * kWordSize), locs()->in(2).reg());
-  __ movl(Address(ESP, + 3 * kWordSize), locs()->in(3).reg());
+  __ movl(Address(ESP, +0 * kWordSize), locs()->in(0).reg());
+  __ movl(Address(ESP, +1 * kWordSize), locs()->in(1).reg());
+  __ movl(Address(ESP, +2 * kWordSize), locs()->in(2).reg());
+  __ movl(Address(ESP, +3 * kWordSize), locs()->in(3).reg());
 
   // Call the function.
   __ CallRuntime(TargetFunction(), TargetFunction().argument_count());
@@ -5092,8 +5079,8 @@
   if (result_cid() == kDoubleCid) {
     const intptr_t kNumInputs = 2;
     const intptr_t kNumTemps = 1;
-    LocationSummary* summary = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresFpuRegister());
     summary->set_in(1, Location::RequiresFpuRegister());
     // Reuse the left register so that code can be made shorter.
@@ -5105,8 +5092,8 @@
   ASSERT(result_cid() == kSmiCid);
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   // Reuse the left register so that code can be made shorter.
@@ -5179,9 +5166,7 @@
 LocationSummary* UnarySmiOpInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(zone,
-                               kNumInputs,
-                               Location::SameAsFirstInput(),
+  return LocationSummary::Make(zone, kNumInputs, Location::SameAsFirstInput(),
                                LocationSummary::kNoCall);
 }
 
@@ -5210,8 +5195,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -5226,11 +5211,11 @@
 
 
 LocationSummary* Int32ToDoubleInstr::MakeLocationSummary(Zone* zone,
-                                                       bool opt) const {
+                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresRegister());
   result->set_out(0, Location::RequiresFpuRegister());
   return result;
@@ -5248,8 +5233,8 @@
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::WritableRegister());
   result->set_out(0, Location::RequiresFpuRegister());
   return result;
@@ -5268,8 +5253,8 @@
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::Pair(Location::RequiresRegister(),
                                    Location::RequiresRegister()));
   result->set_out(0, Location::RequiresFpuRegister());
@@ -5303,8 +5288,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* result = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   result->set_in(0, Location::RegisterLocation(ECX));
   result->set_out(0, Location::RegisterLocation(EAX));
   return result;
@@ -5334,13 +5319,10 @@
   const Function& target = Function::ZoneHandle(ic_data.GetTargetAt(0));
 
   const intptr_t kNumberOfArguments = 1;
-  compiler->GenerateStaticCall(deopt_id(),
-                               instance_call()->token_pos(),
-                               target,
+  compiler->GenerateStaticCall(deopt_id(), instance_call()->token_pos(), target,
                                kNumberOfArguments,
                                Object::null_array(),  // No argument names.
-                               locs(),
-                               ICData::Handle());
+                               locs(), ICData::Handle());
   __ Bind(&done);
 }
 
@@ -5349,8 +5331,8 @@
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::RequiresRegister());
   return result;
@@ -5373,8 +5355,8 @@
                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::RequiresFpuRegister());
   return result;
@@ -5386,13 +5368,13 @@
   XmmRegister result = locs()->out(0).fpu_reg();
   switch (recognized_kind()) {
     case MethodRecognizer::kDoubleTruncate:
-      __ roundsd(result, value,  Assembler::kRoundToZero);
+      __ roundsd(result, value, Assembler::kRoundToZero);
       break;
     case MethodRecognizer::kDoubleFloor:
-      __ roundsd(result, value,  Assembler::kRoundDown);
+      __ roundsd(result, value, Assembler::kRoundDown);
       break;
     case MethodRecognizer::kDoubleCeil:
-      __ roundsd(result, value,  Assembler::kRoundUp);
+      __ roundsd(result, value, Assembler::kRoundUp);
       break;
     default:
       UNREACHABLE();
@@ -5404,8 +5386,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::SameAsFirstInput());
   return result;
@@ -5421,8 +5403,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::SameAsFirstInput());
   return result;
@@ -5439,8 +5421,8 @@
   ASSERT((InputCount() == 1) || (InputCount() == 2));
   const intptr_t kNumTemps =
       (recognized_kind() == MethodRecognizer::kMathDoublePow) ? 3 : 1;
-  LocationSummary* result = new(zone) LocationSummary(
-      zone, InputCount(), kNumTemps, LocationSummary::kCall);
+  LocationSummary* result = new (zone)
+      LocationSummary(zone, InputCount(), kNumTemps, LocationSummary::kCall);
   // EDI is chosen because it is callee saved so we do not need to back it
   // up before calling into the runtime.
   result->set_temp(0, Location::RegisterLocation(EDI));
@@ -5488,7 +5470,7 @@
   XmmRegister zero_temp =
       locs->temp(InvokeMathCFunctionInstr::kDoubleTempIndex).fpu_reg();
 
-  __ xorps(zero_temp, zero_temp);   // 0.0.
+  __ xorps(zero_temp, zero_temp);  // 0.0.
   __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(1.0)));
   __ movsd(result, FieldAddress(temp, Double::value_offset()));
 
@@ -5617,27 +5599,27 @@
   // Only use this instruction in optimized code.
   ASSERT(opt);
   const intptr_t kNumInputs = 1;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, 0, LocationSummary::kNoCall);
+  LocationSummary* summary =
+      new (zone) LocationSummary(zone, kNumInputs, 0, LocationSummary::kNoCall);
   if (representation() == kUnboxedDouble) {
     if (index() == 0) {
-      summary->set_in(0, Location::Pair(Location::RequiresFpuRegister(),
-                                        Location::Any()));
+      summary->set_in(
+          0, Location::Pair(Location::RequiresFpuRegister(), Location::Any()));
     } else {
       ASSERT(index() == 1);
-      summary->set_in(0, Location::Pair(Location::Any(),
-                                        Location::RequiresFpuRegister()));
+      summary->set_in(
+          0, Location::Pair(Location::Any(), Location::RequiresFpuRegister()));
     }
     summary->set_out(0, Location::RequiresFpuRegister());
   } else {
     ASSERT(representation() == kTagged);
     if (index() == 0) {
-      summary->set_in(0, Location::Pair(Location::RequiresRegister(),
-                                        Location::Any()));
+      summary->set_in(
+          0, Location::Pair(Location::RequiresRegister(), Location::Any()));
     } else {
       ASSERT(index() == 1);
-      summary->set_in(0, Location::Pair(Location::Any(),
-                                        Location::RequiresRegister()));
+      summary->set_in(
+          0, Location::Pair(Location::Any(), Location::RequiresRegister()));
     }
     summary->set_out(0, Location::RequiresRegister());
   }
@@ -5667,8 +5649,8 @@
   if (kind() == MergedMathInstr::kTruncDivMod) {
     const intptr_t kNumInputs = 2;
     const intptr_t kNumTemps = 0;
-    LocationSummary* summary = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     // Both inputs must be writable because they will be untagged.
     summary->set_in(0, Location::RegisterLocation(EAX));
     summary->set_in(1, Location::WritableRegister());
@@ -5680,8 +5662,8 @@
   if (kind() == MergedMathInstr::kSinCos) {
     const intptr_t kNumInputs = 1;
     const intptr_t kNumTemps = 2;
-    LocationSummary* summary = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+    LocationSummary* summary = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
     // Because we always call into the runtime (LocationSummary::kCall) we
     // must specify each input, temp, and output register explicitly.
     summary->set_in(0, Location::FpuRegisterLocation(XMM1));
@@ -5698,17 +5680,20 @@
 }
 
 
-typedef void (*SinCosCFunction) (double x, double* res_sin, double* res_cos);
+typedef void (*SinCosCFunction)(double x, double* res_sin, double* res_cos);
 
 extern const RuntimeEntry kSinCosRuntimeEntry(
-    "libc_sincos", reinterpret_cast<RuntimeFunction>(
-        static_cast<SinCosCFunction>(&SinCos)), 1, true, true);
+    "libc_sincos",
+    reinterpret_cast<RuntimeFunction>(static_cast<SinCosCFunction>(&SinCos)),
+    1,
+    true,
+    true);
 
 
 void MergedMathInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Label* deopt = NULL;
   if (CanDeoptimize()) {
-    deopt  = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinarySmiOp);
+    deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinarySmiOp);
   }
 
   if (kind() == MergedMathInstr::kTruncDivMod) {
@@ -5730,7 +5715,7 @@
     ASSERT(result2 == EDX);
     __ SmiUntag(left);
     __ SmiUntag(right);
-    __ cdq();  // Sign extend EAX -> EDX:EAX.
+    __ cdq();         // Sign extend EAX -> EDX:EAX.
     __ idivl(right);  //  EAX: quotient, EDX: remainder.
     // Check the corner case of dividing the 'MIN_SMI' with -1, in which
     // case we cannot tag the result.
@@ -5821,13 +5806,13 @@
 
 
 LocationSummary* PolymorphicInstanceCallInstr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   return MakeCallSummary(zone);
 }
 
 
-LocationSummary* BranchInstr::MakeLocationSummary(Zone* zone,
-                                                  bool opt) const {
+LocationSummary* BranchInstr::MakeLocationSummary(Zone* zone, bool opt) const {
   comparison()->InitializeLocationSummary(zone, opt);
   // Branches don't produce a result.
   comparison()->locs()->set_out(0, Location::NoLocation());
@@ -5845,8 +5830,8 @@
   const intptr_t kNumInputs = 1;
   const bool need_mask_temp = IsDenseSwitch() && !IsDenseMask(ComputeCidMask());
   const intptr_t kNumTemps = !IsNullCheck() ? (need_mask_temp ? 2 : 1) : 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   if (!IsNullCheck()) {
     summary->set_temp(0, Location::RequiresRegister());
@@ -5859,8 +5844,7 @@
 
 
 void CheckClassInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label* deopt = compiler->AddDeoptStub(deopt_id(),
-                                        ICData::kDeoptCheckClass,
+  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckClass,
                                         licm_hoisted_ ? ICData::kHoisted : 0);
   if (IsNullCheck()) {
     const Immediate& raw_null =
@@ -5903,8 +5887,7 @@
     }
   } else {
     GrowableArray<CidTarget> sorted_ic_data;
-    FlowGraphCompiler::SortICDataByCount(unary_checks(),
-                                         &sorted_ic_data,
+    FlowGraphCompiler::SortICDataByCount(unary_checks(), &sorted_ic_data,
                                          /* drop_smi = */ true);
     const intptr_t num_checks = sorted_ic_data.length();
     const bool use_near_jump = num_checks < 5;
@@ -5931,8 +5914,8 @@
                                                     bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   return summary;
 }
@@ -5940,8 +5923,7 @@
 
 void CheckSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register value = locs()->in(0).reg();
-  Label* deopt = compiler->AddDeoptStub(deopt_id(),
-                                        ICData::kDeoptCheckSmi,
+  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckSmi,
                                         licm_hoisted_ ? ICData::kHoisted : 0);
   __ BranchIfNotSmi(value, deopt);
 }
@@ -5951,8 +5933,8 @@
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   return summary;
 }
@@ -5986,8 +5968,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   if (length()->definition()->IsConstant()) {
     locs->set_in(kLengthPos, Location::RegisterOrSmiConstant(length()));
   } else {
@@ -6001,10 +5983,8 @@
 void CheckArrayBoundInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   uint32_t flags = generalized_ ? ICData::kGeneralized : 0;
   flags |= licm_hoisted_ ? ICData::kHoisted : 0;
-  Label* deopt = compiler->AddDeoptStub(
-      deopt_id(),
-      ICData::kDeoptCheckArrayBound,
-      flags);
+  Label* deopt =
+      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckArrayBound, flags);
 
   Location length_loc = locs()->in(kLengthPos);
   Location index_loc = locs()->in(kIndexPos);
@@ -6074,13 +6054,13 @@
     case Token::kSUB:
     case Token::kMUL: {
       const intptr_t kNumTemps = (op_kind() == Token::kMUL) ? 1 : 0;
-      LocationSummary* summary = new(zone) LocationSummary(
+      LocationSummary* summary = new (zone) LocationSummary(
           zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
       summary->set_in(0, (op_kind() == Token::kMUL)
-          ? Location::Pair(Location::RegisterLocation(EAX),
-                           Location::RegisterLocation(EDX))
-          : Location::Pair(Location::RequiresRegister(),
-                           Location::RequiresRegister()));
+                             ? Location::Pair(Location::RegisterLocation(EAX),
+                                              Location::RegisterLocation(EDX))
+                             : Location::Pair(Location::RequiresRegister(),
+                                              Location::RequiresRegister()));
       summary->set_in(1, Location::Pair(Location::RequiresRegister(),
                                         Location::RequiresRegister()));
       summary->set_out(0, Location::SameAsFirstInput());
@@ -6171,8 +6151,8 @@
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps =
       (op_kind() == Token::kSHL) && CanDeoptimize() ? 2 : 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::Pair(Location::RequiresRegister(),
                                     Location::RequiresRegister()));
   summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), ECX));
@@ -6188,8 +6168,8 @@
 static const intptr_t kMintShiftCountLimit = 63;
 
 bool ShiftMintOpInstr::has_shift_count_check() const {
-  return !RangeUtils::IsWithin(
-      right()->definition()->range(), 0, kMintShiftCountLimit);
+  return !RangeUtils::IsWithin(right()->definition()->range(), 0,
+                               kMintShiftCountLimit);
 }
 
 
@@ -6215,7 +6195,7 @@
     switch (op_kind()) {
       case Token::kSHR: {
         if (shift > 31) {
-          __ movl(left_lo, left_hi);  // Shift by 32.
+          __ movl(left_lo, left_hi);        // Shift by 32.
           __ sarl(left_hi, Immediate(31));  // Sign extend left hi.
           if (shift > 32) {
             __ sarl(left_lo, Immediate(shift > 63 ? 31 : shift - 32));
@@ -6296,14 +6276,14 @@
         __ j(ABOVE, &large_shift);
 
         __ shrdl(left_lo, left_hi, ECX);  // Shift count in CL.
-        __ sarl(left_hi, ECX);  // Shift count in CL.
+        __ sarl(left_hi, ECX);            // Shift count in CL.
         __ jmp(&done, Assembler::kNearJump);
 
         __ Bind(&large_shift);
         // No need to subtract 32 from CL, only 5 bits used by sarl.
-        __ movl(left_lo, left_hi);  // Shift by 32.
+        __ movl(left_lo, left_hi);        // Shift by 32.
         __ sarl(left_hi, Immediate(31));  // Sign extend left hi.
-        __ sarl(left_lo, ECX);  // Shift count: CL % 32.
+        __ sarl(left_lo, ECX);            // Shift count: CL % 32.
         break;
       }
       case Token::kSHL: {
@@ -6315,7 +6295,7 @@
           __ j(ABOVE, &large_shift);
 
           __ shldl(left_hi, left_lo, ECX);  // Shift count in CL.
-          __ shll(left_lo, ECX);  // Shift count in CL.
+          __ shll(left_lo, ECX);            // Shift count in CL.
           // Check for overflow by shifting back the high 32 bits
           // and comparing with the input.
           __ movl(temp2, left_hi);
@@ -6327,7 +6307,7 @@
           __ Bind(&large_shift);
           // No need to subtract 32 from CL, only 5 bits used by shll.
           __ movl(left_hi, left_lo);  // Shift by 32.
-          __ shll(left_hi, ECX);  // Shift count: CL % 32.
+          __ shll(left_hi, ECX);      // Shift count: CL % 32.
           // Check for overflow by sign extending the high 32 bits
           // and comparing with the input.
           __ movl(temp2, left_hi);
@@ -6346,14 +6326,14 @@
           __ j(ABOVE, &large_shift);
 
           __ shldl(left_hi, left_lo, ECX);  // Shift count in CL.
-          __ shll(left_lo, ECX);  // Shift count in CL.
+          __ shll(left_lo, ECX);            // Shift count in CL.
           __ jmp(&done, Assembler::kNearJump);
 
           __ Bind(&large_shift);
           // No need to subtract 32 from CL, only 5 bits used by shll.
           __ movl(left_hi, left_lo);  // Shift by 32.
           __ xorl(left_lo, left_lo);  // Zero left_lo.
-          __ shll(left_hi, ECX);  // Shift count: CL % 32.
+          __ shll(left_hi, ECX);      // Shift count: CL % 32.
         }
         break;
       }
@@ -6369,8 +6349,8 @@
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::Pair(Location::RequiresRegister(),
                                     Location::RequiresRegister()));
   summary->set_out(0, Location::SameAsFirstInput());
@@ -6412,8 +6392,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), ECX));
   summary->set_out(0, Location::SameAsFirstInput());
@@ -6443,10 +6423,10 @@
     switch (op_kind()) {
       case Token::kSHR:
         __ shrl(left, Immediate(shift_value));
-      break;
+        break;
       case Token::kSHL:
         __ shll(left, Immediate(shift_value));
-      break;
+        break;
       default:
         UNREACHABLE();
     }
@@ -6475,11 +6455,11 @@
     case Token::kSHR:
       __ shrl(left, shifter);
       __ jmp(&done);
-    break;
+      break;
     case Token::kSHL:
       __ shll(left, shifter);
       __ jmp(&done);
-    break;
+      break;
     default:
       UNREACHABLE();
   }
@@ -6497,8 +6477,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -6519,17 +6499,17 @@
                                                                bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   if ((from() == kUnboxedInt32 || from() == kUnboxedUint32) &&
       (to() == kUnboxedInt32 || to() == kUnboxedUint32)) {
     summary->set_in(0, Location::RequiresRegister());
     summary->set_out(0, Location::SameAsFirstInput());
   } else if (from() == kUnboxedMint) {
-    summary->set_in(0, Location::Pair(
-        CanDeoptimize() ? Location::WritableRegister()
-                        : Location::RequiresRegister(),
-        Location::RequiresRegister()));
+    summary->set_in(
+        0, Location::Pair(CanDeoptimize() ? Location::WritableRegister()
+                                          : Location::RequiresRegister(),
+                          Location::RequiresRegister()));
     summary->set_out(0, Location::RequiresRegister());
   } else if (from() == kUnboxedUint32) {
     summary->set_in(0, Location::RequiresRegister());
@@ -6600,43 +6580,33 @@
 }
 
 
-LocationSummary* ThrowInstr::MakeLocationSummary(Zone* zone,
-                                                 bool opt) const {
-  return new(zone) LocationSummary(zone, 0, 0, LocationSummary::kCall);
+LocationSummary* ThrowInstr::MakeLocationSummary(Zone* zone, bool opt) const {
+  return new (zone) LocationSummary(zone, 0, 0, LocationSummary::kCall);
 }
 
 
-
 void ThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  compiler->GenerateRuntimeCall(token_pos(),
-                                deopt_id(),
-                                kThrowRuntimeEntry,
-                                1,
+  compiler->GenerateRuntimeCall(token_pos(), deopt_id(), kThrowRuntimeEntry, 1,
                                 locs());
   __ int3();
 }
 
 
-LocationSummary* ReThrowInstr::MakeLocationSummary(Zone* zone,
-                                                   bool opt) const {
-  return new(zone) LocationSummary(zone, 0, 0, LocationSummary::kCall);
+LocationSummary* ReThrowInstr::MakeLocationSummary(Zone* zone, bool opt) const {
+  return new (zone) LocationSummary(zone, 0, 0, LocationSummary::kCall);
 }
 
 
 void ReThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   compiler->SetNeedsStacktrace(catch_try_index());
-  compiler->GenerateRuntimeCall(token_pos(),
-                                deopt_id(),
-                                kReThrowRuntimeEntry,
-                                2,
-                                locs());
+  compiler->GenerateRuntimeCall(token_pos(), deopt_id(), kReThrowRuntimeEntry,
+                                2, locs());
   __ int3();
 }
 
 
-LocationSummary* StopInstr::MakeLocationSummary(Zone* zone,
-                                                bool opt) const {
-  return new(zone) LocationSummary(zone, 0, 0, LocationSummary::kNoCall);
+LocationSummary* StopInstr::MakeLocationSummary(Zone* zone, bool opt) const {
+  return new (zone) LocationSummary(zone, 0, 0, LocationSummary::kNoCall);
 }
 
 
@@ -6652,9 +6622,8 @@
 }
 
 
-LocationSummary* GotoInstr::MakeLocationSummary(Zone* zone,
-                                                bool opt) const {
-  return new(zone) LocationSummary(zone, 0, 0, LocationSummary::kNoCall);
+LocationSummary* GotoInstr::MakeLocationSummary(Zone* zone, bool opt) const {
+  return new (zone) LocationSummary(zone, 0, 0, LocationSummary::kNoCall);
 }
 
 
@@ -6665,8 +6634,7 @@
     }
     // Add a deoptimization descriptor for deoptimizing instructions that
     // may be inserted before this instruction.
-    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
-                                   GetDeoptId(),
+    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, GetDeoptId(),
                                    TokenPosition::kNoSource);
   }
   if (HasParallelMove()) {
@@ -6686,8 +6654,8 @@
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
 
-  LocationSummary* summary = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
 
   summary->set_in(0, Location::RequiresRegister());
   summary->set_temp(0, Location::RequiresRegister());
@@ -6704,7 +6672,7 @@
   // Load instructions object (active_instructions and Code::entry_point() may
   // not point to this instruction object any more; see Code::DisableDartCode).
   __ movl(target_reg,
-      FieldAddress(target_reg, Code::saved_instructions_offset()));
+          FieldAddress(target_reg, Code::saved_instructions_offset()));
   __ addl(target_reg, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
 
   // Add the offset.
@@ -6724,15 +6692,15 @@
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
   if (needs_number_check()) {
-    LocationSummary* locs = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+    LocationSummary* locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
     locs->set_in(0, Location::RegisterLocation(EAX));
     locs->set_in(1, Location::RegisterLocation(ECX));
     locs->set_out(0, Location::RegisterLocation(EAX));
     return locs;
   }
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RegisterOrConstant(left()));
   // Only one of the inputs can be a constant. Choose register if the first one
   // is a constant.
@@ -6751,20 +6719,14 @@
   ASSERT(!left.IsConstant() || !right.IsConstant());
   Condition true_condition;
   if (left.IsConstant()) {
-    true_condition = compiler->EmitEqualityRegConstCompare(right.reg(),
-                                                           left.constant(),
-                                                           needs_number_check(),
-                                                           token_pos());
+    true_condition = compiler->EmitEqualityRegConstCompare(
+        right.reg(), left.constant(), needs_number_check(), token_pos());
   } else if (right.IsConstant()) {
-    true_condition = compiler->EmitEqualityRegConstCompare(left.reg(),
-                                                           right.constant(),
-                                                           needs_number_check(),
-                                                           token_pos());
+    true_condition = compiler->EmitEqualityRegConstCompare(
+        left.reg(), right.constant(), needs_number_check(), token_pos());
   } else {
-    true_condition = compiler->EmitEqualityRegRegCompare(left.reg(),
-                                                         right.reg(),
-                                                         needs_number_check(),
-                                                         token_pos());
+    true_condition = compiler->EmitEqualityRegRegCompare(
+        left.reg(), right.reg(), needs_number_check(), token_pos());
   }
   if (kind() != Token::kEQ_STRICT) {
     ASSERT(kind() == Token::kNE_STRICT);
@@ -6778,7 +6740,7 @@
   ASSERT(kind() == Token::kEQ_STRICT || kind() == Token::kNE_STRICT);
 
   Label is_true, is_false;
-  BranchLabels labels = { &is_true, &is_false, &is_false };
+  BranchLabels labels = {&is_true, &is_false, &is_false};
   Condition true_condition = EmitComparisonCode(compiler, labels);
   EmitBranchOnCondition(compiler, true_condition, labels);
 
@@ -6827,7 +6789,7 @@
   __ xorl(EDX, EDX);
 
   // Emit comparison code. This must not overwrite the result register.
-  BranchLabels labels = { NULL, NULL, NULL };
+  BranchLabels labels = {NULL, NULL, NULL};
   Condition true_condition = comparison()->EmitComparisonCode(compiler, labels);
 
   const bool is_power_of_two_kind = IsPowerOfTwoKind(if_true_, if_false_);
@@ -6859,8 +6821,8 @@
     __ shll(EDX, Immediate(shift + kSmiTagSize));
   } else {
     __ decl(EDX);
-    __ andl(EDX, Immediate(
-        Smi::RawValue(true_value) - Smi::RawValue(false_value)));
+    __ andl(EDX,
+            Immediate(Smi::RawValue(true_value) - Smi::RawValue(false_value)));
     if (false_value != 0) {
       __ addl(EDX, Immediate(Smi::RawValue(false_value)));
     }
@@ -6872,8 +6834,8 @@
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(EAX));  // Function.
   summary->set_out(0, Location::RegisterLocation(EAX));
   return summary;
@@ -6883,9 +6845,8 @@
 void ClosureCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   // Load arguments descriptors.
   intptr_t argument_count = ArgumentCount();
-  const Array& arguments_descriptor =
-      Array::ZoneHandle(ArgumentsDescriptor::New(argument_count,
-                                                 argument_names()));
+  const Array& arguments_descriptor = Array::ZoneHandle(
+      ArgumentsDescriptor::New(argument_count, argument_names()));
   __ LoadObject(EDX, arguments_descriptor);
 
   // EBX: Code (compiled code or lazy compile stub).
@@ -6907,8 +6868,7 @@
   // Add deoptimization continuation point after the call and before the
   // arguments are removed.
   // In optimized code this descriptor is needed for exception handling.
-  compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
-                                 deopt_id_after,
+  compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, deopt_id_after,
                                  token_pos());
   __ Drop(argument_count);
 }
@@ -6916,9 +6876,7 @@
 
 LocationSummary* BooleanNegateInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
-  return LocationSummary::Make(zone,
-                               1,
-                               Location::RequiresRegister(),
+  return LocationSummary::Make(zone, 1, Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
 
@@ -6946,9 +6904,7 @@
   const Code& stub = Code::ZoneHandle(
       compiler->zone(), StubCode::GetAllocationStubForClass(cls()));
   const StubEntry stub_entry(stub);
-  compiler->GenerateCall(token_pos(),
-                         stub_entry,
-                         RawPcDescriptors::kOther,
+  compiler->GenerateCall(token_pos(), stub_entry, RawPcDescriptors::kOther,
                          locs());
   compiler->AddStubCallTarget(stub);
   __ Drop(ArgumentCount());  // Discard arguments.
@@ -6957,19 +6913,17 @@
 
 void DebugStepCheckInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   ASSERT(!compiler->is_optimizing());
-  compiler->GenerateCall(token_pos(),
-                         *StubCode::DebugStepCheck_entry(),
-                         stub_kind_,
-                         locs());
+  compiler->GenerateCall(token_pos(), *StubCode::DebugStepCheck_entry(),
+                         stub_kind_, locs());
 }
 
 
-LocationSummary* GrowRegExpStackInstr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+LocationSummary* GrowRegExpStackInstr::MakeLocationSummary(Zone* zone,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(EAX));
   locs->set_out(0, Location::RegisterLocation(EAX));
   return locs;
@@ -6981,11 +6935,8 @@
   const Register result = locs()->out(0).reg();
   __ PushObject(Object::null_object());
   __ pushl(typed_data);
-  compiler->GenerateRuntimeCall(TokenPosition::kNoSource,
-                                deopt_id(),
-                                kGrowRegExpStackRuntimeEntry,
-                                1,
-                                locs());
+  compiler->GenerateRuntimeCall(TokenPosition::kNoSource, deopt_id(),
+                                kGrowRegExpStackRuntimeEntry, 1, locs());
   __ Drop(1);
   __ popl(result);
 }
diff --git a/runtime/vm/intermediate_language_mips.cc b/runtime/vm/intermediate_language_mips.cc
index ed03d1d..6a2c623 100644
--- a/runtime/vm/intermediate_language_mips.cc
+++ b/runtime/vm/intermediate_language_mips.cc
@@ -29,8 +29,8 @@
 // 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(Zone* zone) {
-  LocationSummary* result = new(zone) LocationSummary(
-      zone, 0, 0, LocationSummary::kCall);
+  LocationSummary* result =
+      new (zone) LocationSummary(zone, 0, 0, LocationSummary::kCall);
   result->set_out(0, Location::RegisterLocation(V0));
   return result;
 }
@@ -40,8 +40,8 @@
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::AnyOrConstant(value()));
   return locs;
 }
@@ -67,12 +67,11 @@
 }
 
 
-LocationSummary* ReturnInstr::MakeLocationSummary(Zone* zone,
-                                                  bool opt) const {
+LocationSummary* ReturnInstr::MakeLocationSummary(Zone* zone, bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RegisterLocation(V0));
   return locs;
 }
@@ -111,18 +110,42 @@
 
 static Condition NegateCondition(Condition condition) {
   switch (condition.rel_op()) {
-    case AL: condition.set_rel_op(NV); break;
-    case NV: condition.set_rel_op(AL); break;
-    case EQ: condition.set_rel_op(NE); break;
-    case NE: condition.set_rel_op(EQ); break;
-    case LT: condition.set_rel_op(GE); break;
-    case LE: condition.set_rel_op(GT); break;
-    case GT: condition.set_rel_op(LE); break;
-    case GE: condition.set_rel_op(LT); break;
-    case ULT: condition.set_rel_op(UGE); break;
-    case ULE: condition.set_rel_op(UGT); break;
-    case UGT: condition.set_rel_op(ULE); break;
-    case UGE: condition.set_rel_op(ULT); break;
+    case AL:
+      condition.set_rel_op(NV);
+      break;
+    case NV:
+      condition.set_rel_op(AL);
+      break;
+    case EQ:
+      condition.set_rel_op(NE);
+      break;
+    case NE:
+      condition.set_rel_op(EQ);
+      break;
+    case LT:
+      condition.set_rel_op(GE);
+      break;
+    case LE:
+      condition.set_rel_op(GT);
+      break;
+    case GT:
+      condition.set_rel_op(LE);
+      break;
+    case GE:
+      condition.set_rel_op(LT);
+      break;
+    case ULT:
+      condition.set_rel_op(UGE);
+      break;
+    case ULE:
+      condition.set_rel_op(UGT);
+      break;
+    case UGT:
+      condition.set_rel_op(ULE);
+      break;
+    case UGE:
+      condition.set_rel_op(ULT);
+      break;
     default:
       UNREACHABLE();
   }
@@ -155,7 +178,7 @@
   __ LoadImmediate(result, Smi::RawValue(true_value));
 
   // Emit comparison code. This must not overwrite the result register.
-  BranchLabels labels = { NULL, NULL, NULL };  // Emit branch-free code.
+  BranchLabels labels = {NULL, NULL, NULL};  // Emit branch-free code.
   Condition true_condition = comparison()->EmitComparisonCode(compiler, labels);
   if (swapped) {
     true_condition = NegateCondition(true_condition);
@@ -166,11 +189,14 @@
   Register right = true_condition.right();
   bool zero_is_false = true;  // Zero in CMPRES1 indicates a false condition.
   switch (true_condition.rel_op()) {
-    case AL: return;  // Result holds true_value.
-    case NV: __ LoadImmediate(result, false_value); return;
+    case AL:
+      return;  // Result holds true_value.
+    case NV:
+      __ LoadImmediate(result, false_value);
+      return;
     case EQ:
       zero_is_false = false;
-      // fall through.
+    // fall through.
     case NE: {
       if (left == IMM) {
         __ XorImmediate(CMPRES1, right, true_condition.imm());
@@ -183,7 +209,7 @@
     }
     case GE:
       zero_is_false = false;
-      // fall through.
+    // fall through.
     case LT: {
       if (left == IMM) {
         __ slti(CMPRES1, right, Immediate(true_condition.imm() + 1));
@@ -197,7 +223,7 @@
     }
     case LE:
       zero_is_false = false;
-      // fall through.
+    // fall through.
     case GT: {
       if (left == IMM) {
         __ slti(CMPRES1, right, Immediate(true_condition.imm()));
@@ -211,7 +237,7 @@
     }
     case UGE:
       zero_is_false = false;
-      // fall through.
+    // fall through.
     case ULT: {
       ASSERT((left != IMM) && (right != IMM));  // No unsigned constants used.
       __ sltu(CMPRES1, left, right);
@@ -219,7 +245,7 @@
     }
     case ULE:
       zero_is_false = false;
-      // fall through.
+    // fall through.
     case UGT: {
       ASSERT((left != IMM) && (right != IMM));  // No unsigned constants used.
       __ sltu(CMPRES1, right, left);
@@ -250,8 +276,8 @@
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(T0));  // Function.
   summary->set_out(0, Location::RegisterLocation(V0));
   return summary;
@@ -261,9 +287,8 @@
 void ClosureCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   // Load arguments descriptor in S4.
   int argument_count = ArgumentCount();
-  const Array& arguments_descriptor =
-      Array::ZoneHandle(ArgumentsDescriptor::New(argument_count,
-                                                 argument_names()));
+  const Array& arguments_descriptor = Array::ZoneHandle(
+      ArgumentsDescriptor::New(argument_count, argument_names()));
   __ LoadObject(S4, arguments_descriptor);
 
   // Load closure function code in T2.
@@ -284,8 +309,7 @@
   // Add deoptimization continuation point after the call and before the
   // arguments are removed.
   // In optimized code this descriptor is needed for exception handling.
-  compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
-                                 deopt_id_after,
+  compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, deopt_id_after,
                                  token_pos());
   __ Drop(argument_count);
 }
@@ -293,9 +317,7 @@
 
 LocationSummary* LoadLocalInstr::MakeLocationSummary(Zone* zone,
                                                      bool opt) const {
-  return LocationSummary::Make(zone,
-                               0,
-                               Location::RequiresRegister(),
+  return LocationSummary::Make(zone, 0, Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
 
@@ -309,9 +331,7 @@
 
 LocationSummary* StoreLocalInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
-  return LocationSummary::Make(zone,
-                               1,
-                               Location::SameAsFirstInput(),
+  return LocationSummary::Make(zone, 1, Location::SameAsFirstInput(),
                                LocationSummary::kNoCall);
 }
 
@@ -327,9 +347,7 @@
 
 LocationSummary* ConstantInstr::MakeLocationSummary(Zone* zone,
                                                     bool opt) const {
-  return LocationSummary::Make(zone,
-                               0,
-                               Location::RequiresRegister(),
+  return LocationSummary::Make(zone, 0, Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
 
@@ -348,8 +366,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = (representation_ == kUnboxedInt32) ? 0 : 1;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   if (representation_ == kUnboxedInt32) {
     locs->set_out(0, Location::RequiresRegister());
   } else {
@@ -373,13 +391,12 @@
         const DRegister result = locs()->out(0).fpu_reg();
         __ LoadObject(const_value, value());
         __ LoadDFromOffset(result, const_value,
-            Double::value_offset() - kHeapObjectTag);
+                           Double::value_offset() - kHeapObjectTag);
         break;
       }
 
       case kUnboxedInt32:
-        __ LoadImmediate(locs()->out(0).reg(),
-                         Smi::Cast(value()).Value());
+        __ LoadImmediate(locs()->out(0).reg(), Smi::Cast(value()).Value());
         break;
 
       default:
@@ -393,8 +410,8 @@
                                                             bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(A0));  // Value.
   summary->set_in(1, Location::RegisterLocation(A1));  // Type arguments.
   summary->set_out(0, Location::RegisterLocation(A0));
@@ -406,8 +423,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(A0));
   locs->set_out(0, Location::RegisterLocation(A0));
   return locs;
@@ -433,11 +450,8 @@
   }
 
   __ Push(reg);  // Push the source object.
-  compiler->GenerateRuntimeCall(token_pos,
-                                deopt_id,
-                                kNonBoolTypeErrorRuntimeEntry,
-                                1,
-                                locs);
+  compiler->GenerateRuntimeCall(token_pos, deopt_id,
+                                kNonBoolTypeErrorRuntimeEntry, 1, locs);
   // We should never return here.
   __ break_(0);
   __ Bind(&done);
@@ -459,8 +473,8 @@
   const intptr_t kNumInputs = 2;
   if (operation_cid() == kMintCid) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* locs = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::Pair(Location::RequiresRegister(),
                                    Location::RequiresRegister()));
     locs->set_in(1, Location::Pair(Location::RequiresRegister(),
@@ -470,8 +484,8 @@
   }
   if (operation_cid() == kDoubleCid) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* locs = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::RequiresFpuRegister());
     locs->set_in(1, Location::RequiresFpuRegister());
     locs->set_out(0, Location::RequiresRegister());
@@ -479,8 +493,8 @@
   }
   if (operation_cid() == kSmiCid) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* locs = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::RegisterOrConstant(left()));
     // Only one input can be a constant operand. The case of two constant
     // operands should be handled by constant propagation.
@@ -517,12 +531,18 @@
 
 static RelationOperator TokenKindToIntRelOp(Token::Kind kind) {
   switch (kind) {
-    case Token::kEQ: return EQ;
-    case Token::kNE: return NE;
-    case Token::kLT: return LT;
-    case Token::kGT: return GT;
-    case Token::kLTE: return LE;
-    case Token::kGTE: return GE;
+    case Token::kEQ:
+      return EQ;
+    case Token::kNE:
+      return NE;
+    case Token::kLT:
+      return LT;
+    case Token::kGT:
+      return GT;
+    case Token::kLTE:
+      return LE;
+    case Token::kGTE:
+      return GE;
     default:
       UNREACHABLE();
       return NV;
@@ -532,12 +552,18 @@
 
 static RelationOperator TokenKindToUintRelOp(Token::Kind kind) {
   switch (kind) {
-    case Token::kEQ: return EQ;
-    case Token::kNE: return NE;
-    case Token::kLT: return ULT;
-    case Token::kGT: return UGT;
-    case Token::kLTE: return ULE;
-    case Token::kGTE: return UGE;
+    case Token::kEQ:
+      return EQ;
+    case Token::kNE:
+      return NE;
+    case Token::kLT:
+      return ULT;
+    case Token::kGT:
+      return UGT;
+    case Token::kLTE:
+      return ULE;
+    case Token::kGTE:
+      return UGE;
     default:
       UNREACHABLE();
       return NV;
@@ -576,10 +602,12 @@
   ASSERT(right.IsRegister() || right.IsConstant());
 
   int16_t imm = 0;
-  const Register left_reg = left.IsRegister() ?
-      left.reg() : __ LoadConditionOperand(CMPRES1, left.constant(), &imm);
-  const Register right_reg = right.IsRegister() ?
-      right.reg() : __ LoadConditionOperand(CMPRES2, right.constant(), &imm);
+  const Register left_reg =
+      left.IsRegister() ? left.reg() : __ LoadConditionOperand(
+                                           CMPRES1, left.constant(), &imm);
+  const Register right_reg =
+      right.IsRegister() ? right.reg() : __ LoadConditionOperand(
+                                             CMPRES2, right.constant(), &imm);
   return Condition(left_reg, right_reg, TokenKindToIntRelOp(kind), imm);
 }
 
@@ -677,17 +705,29 @@
   __ Comment("DoubleComparisonOp(left=%d, right=%d)", left, right);
 
   __ cund(left, right);
-  Label* nan_label = (kind == Token::kNE)
-      ? labels.true_label : labels.false_label;
+  Label* nan_label =
+      (kind == Token::kNE) ? labels.true_label : labels.false_label;
   __ bc1t(nan_label);
 
   switch (kind) {
-    case Token::kEQ: __ ceqd(left, right); break;
-    case Token::kNE: __ ceqd(left, right); break;
-    case Token::kLT: __ coltd(left, right); break;
-    case Token::kLTE: __ coled(left, right); break;
-    case Token::kGT: __ coltd(right, left); break;
-    case Token::kGTE: __ coled(right, left); break;
+    case Token::kEQ:
+      __ ceqd(left, right);
+      break;
+    case Token::kNE:
+      __ ceqd(left, right);
+      break;
+    case Token::kLT:
+      __ coltd(left, right);
+      break;
+    case Token::kLTE:
+      __ coled(left, right);
+      break;
+    case Token::kGT:
+      __ coltd(right, left);
+      break;
+    case Token::kGTE:
+      __ coled(right, left);
+      break;
     default: {
       // We should only be passing the above conditions to this function.
       UNREACHABLE();
@@ -744,7 +784,7 @@
   __ Comment("EqualityCompareInstr");
 
   Label is_true, is_false;
-  BranchLabels labels = { &is_true, &is_false, &is_false };
+  BranchLabels labels = {&is_true, &is_false, &is_false};
   Condition true_condition = EmitComparisonCode(compiler, labels);
   EmitBranchOnCondition(compiler, true_condition, labels);
 
@@ -770,12 +810,11 @@
 }
 
 
-LocationSummary* TestSmiInstr::MakeLocationSummary(Zone* zone,
-                                                   bool opt) const {
+LocationSummary* TestSmiInstr::MakeLocationSummary(Zone* zone, bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   // Only one input can be a constant operand. The case of two constant
   // operands should be handled by constant propagation.
@@ -790,8 +829,7 @@
   Location right = locs()->in(1);
   if (right.IsConstant()) {
     ASSERT(right.constant().IsSmi());
-    const int32_t imm =
-        reinterpret_cast<int32_t>(right.constant().raw());
+    const int32_t imm = reinterpret_cast<int32_t>(right.constant().raw());
     __ AndImmediate(CMPRES1, left, imm);
   } else {
     __ and_(CMPRES1, left, right.reg());
@@ -818,8 +856,8 @@
                                                     bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   locs->set_temp(0, Location::RequiresRegister());
   locs->set_out(0, Location::RequiresRegister());
@@ -833,11 +871,11 @@
   Register val_reg = locs()->in(0).reg();
   Register cid_reg = locs()->temp(0).reg();
 
-  Label* deopt = CanDeoptimize()
-      ? compiler->AddDeoptStub(deopt_id(),
-                               ICData::kDeoptTestCids,
-                               licm_hoisted_ ? ICData::kHoisted : 0)
-      : NULL;
+  Label* deopt =
+      CanDeoptimize()
+          ? compiler->AddDeoptStub(deopt_id(), ICData::kDeoptTestCids,
+                                   licm_hoisted_ ? ICData::kHoisted : 0)
+          : NULL;
 
   const intptr_t true_result = (kind() == Token::kIS) ? 1 : 0;
   const ZoneGrowableArray<intptr_t>& data = cid_results();
@@ -878,7 +916,7 @@
 void TestCidsInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register result_reg = locs()->out(0).reg();
   Label is_true, is_false, done;
-  BranchLabels labels = { &is_true, &is_false, &is_false };
+  BranchLabels labels = {&is_true, &is_false, &is_false};
   EmitComparisonCode(compiler, labels);
   __ Bind(&is_false);
   __ LoadObject(result_reg, Bool::False());
@@ -895,8 +933,8 @@
   const intptr_t kNumTemps = 0;
   if (operation_cid() == kMintCid) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* locs = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::Pair(Location::RequiresRegister(),
                                    Location::RequiresRegister()));
     locs->set_in(1, Location::Pair(Location::RequiresRegister(),
@@ -905,16 +943,16 @@
     return locs;
   }
   if (operation_cid() == kDoubleCid) {
-    LocationSummary* summary = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresFpuRegister());
     summary->set_in(1, Location::RequiresFpuRegister());
     summary->set_out(0, Location::RequiresRegister());
     return summary;
   }
   ASSERT(operation_cid() == kSmiCid);
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RegisterOrConstant(left()));
   // Only one input can be a constant operand. The case of two constant
   // operands should be handled by constant propagation.
@@ -943,7 +981,7 @@
   __ Comment("RelationalOpInstr");
 
   Label is_true, is_false;
-  BranchLabels labels = { &is_true, &is_false, &is_false };
+  BranchLabels labels = {&is_true, &is_false, &is_false};
   Condition true_condition = EmitComparisonCode(compiler, labels);
   EmitBranchOnCondition(compiler, true_condition, labels);
 
@@ -983,8 +1021,8 @@
   __ PushObject(Object::null_object());
   // Pass a pointer to the first argument in A2.
   if (!function().HasOptionalParameters()) {
-    __ AddImmediate(A2, FP, (kParamEndSlotFromFp +
-                             function().NumParameters()) * kWordSize);
+    __ AddImmediate(
+        A2, FP, (kParamEndSlotFromFp + function().NumParameters()) * kWordSize);
   } else {
     __ AddImmediate(A2, FP, kFirstLocalSlotFromFp * kWordSize);
   }
@@ -1015,21 +1053,18 @@
   __ LoadImmediate(A1, argc_tag);
   ExternalLabel label(entry);
   __ LoadNativeEntry(T5, &label, kNotPatchable);
-  compiler->GenerateCall(token_pos(),
-                         *stub_entry,
-                         RawPcDescriptors::kOther,
+  compiler->GenerateCall(token_pos(), *stub_entry, RawPcDescriptors::kOther,
                          locs());
   __ Pop(result);
 }
 
 
 LocationSummary* OneByteStringFromCharCodeInstr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   const intptr_t kNumInputs = 1;
   // TODO(fschneider): Allow immediate operands for the char code.
-  return LocationSummary::Make(zone,
-                               kNumInputs,
-                               Location::RequiresRegister(),
+  return LocationSummary::Make(zone, kNumInputs, Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
 
@@ -1051,9 +1086,7 @@
 LocationSummary* StringToCharCodeInstr::MakeLocationSummary(Zone* zone,
                                                             bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(zone,
-                               kNumInputs,
-                               Location::RequiresRegister(),
+  return LocationSummary::Make(zone, kNumInputs, Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
 
@@ -1079,8 +1112,8 @@
                                                              bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(A0));
   summary->set_out(0, Location::RegisterLocation(V0));
   return summary;
@@ -1092,12 +1125,8 @@
   __ Push(array);
   const int kNumberOfArguments = 1;
   const Array& kNoArgumentNames = Object::null_array();
-  compiler->GenerateStaticCall(deopt_id(),
-                               token_pos(),
-                               CallFunction(),
-                               kNumberOfArguments,
-                               kNoArgumentNames,
-                               locs(),
+  compiler->GenerateStaticCall(deopt_id(), token_pos(), CallFunction(),
+                               kNumberOfArguments, kNoArgumentNames, locs(),
                                ICData::Handle());
   ASSERT(locs()->out(0).reg() == V0);
 }
@@ -1106,9 +1135,7 @@
 LocationSummary* LoadUntaggedInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(zone,
-                               kNumInputs,
-                               Location::RequiresRegister(),
+  return LocationSummary::Make(zone, kNumInputs, Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
 
@@ -1128,9 +1155,7 @@
 LocationSummary* LoadClassIdInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(zone,
-                               kNumInputs,
-                               Location::RequiresRegister(),
+  return LocationSummary::Make(zone, kNumInputs, Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
 
@@ -1228,7 +1253,8 @@
   }
   const int64_t index = Smi::Cast(constant->value()).AsInt64Value();
   const intptr_t scale = Instance::ElementSizeFor(cid);
-  const int64_t offset = index * scale +
+  const int64_t offset =
+      index * scale +
       (is_external ? 0 : (Instance::DataOffsetFor(cid) - kHeapObjectTag));
   if (!Utils::IsInt(32, offset)) {
     return false;
@@ -1241,15 +1267,15 @@
                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = aligned() ? 0 : 1;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   if (CanBeImmediateIndex(index(), class_id(), IsExternal())) {
     locs->set_in(1, Location::Constant(index()->definition()->AsConstant()));
   } else {
     locs->set_in(1, Location::RequiresRegister());
   }
-  if ((representation() == kUnboxedDouble)    ||
+  if ((representation() == kUnboxedDouble) ||
       (representation() == kUnboxedFloat32x4) ||
       (representation() == kUnboxedInt32x4)) {
     locs->set_out(0, Location::RequiresFpuRegister());
@@ -1272,13 +1298,14 @@
 
   Address element_address(kNoRegister);
   if (aligned()) {
-    element_address = index.IsRegister()
-      ? __ ElementAddressForRegIndex(true,  // Load.
-                                     IsExternal(), class_id(), index_scale(),
-                                     array, index.reg())
-      : __ ElementAddressForIntIndex(
-            IsExternal(), class_id(), index_scale(),
-            array, Smi::Cast(index.constant()).Value());
+    element_address =
+        index.IsRegister()
+            ? __ ElementAddressForRegIndex(true,  // Load.
+                                           IsExternal(), class_id(),
+                                           index_scale(), array, index.reg())
+            : __ ElementAddressForIntIndex(IsExternal(), class_id(),
+                                           index_scale(), array,
+                                           Smi::Cast(index.constant()).Value());
     // Warning: element_address may use register TMP as base.
   } else {
     if (index.IsRegister()) {
@@ -1287,9 +1314,8 @@
                                        IsExternal(), class_id(), index_scale(),
                                        array, index.reg());
     } else {
-      __ LoadElementAddressForIntIndex(address,
-                                       IsExternal(), class_id(), index_scale(),
-                                       array,
+      __ LoadElementAddressForIntIndex(address, IsExternal(), class_id(),
+                                       index_scale(), array,
                                        Smi::Cast(index.constant()).Value());
     }
   }
@@ -1304,8 +1330,8 @@
         __ lwc1(EvenFRegisterOf(result), element_address);
         break;
       case kTypedDataFloat64ArrayCid:
-        __ LoadDFromOffset(result,
-                           element_address.base(), element_address.offset());
+        __ LoadDFromOffset(result, element_address.base(),
+                           element_address.offset());
         break;
       case kTypedDataInt32x4ArrayCid:
       case kTypedDataFloat32x4ArrayCid:
@@ -1391,8 +1417,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
 
@@ -1410,7 +1436,7 @@
   const Location index = locs()->in(1);
 
   Address element_address = __ ElementAddressForRegIndex(
-        true, IsExternal(), class_id(), index_scale(), str, index.reg());
+      true, IsExternal(), class_id(), index_scale(), str, index.reg());
   // Warning: element_address may use register TMP as base.
 
   ASSERT(representation() == kTagged);
@@ -1419,19 +1445,27 @@
     case kOneByteStringCid:
     case kExternalOneByteStringCid:
       switch (element_count()) {
-        case 1: __ lbu(result, element_address); break;
-        case 2: __ lhu(result, element_address); break;
+        case 1:
+          __ lbu(result, element_address);
+          break;
+        case 2:
+          __ lhu(result, element_address);
+          break;
         case 4:  // Loading multiple code units is disabled on MIPS.
-        default: UNREACHABLE();
+        default:
+          UNREACHABLE();
       }
       __ SmiTag(result);
       break;
     case kTwoByteStringCid:
     case kExternalTwoByteStringCid:
       switch (element_count()) {
-        case 1: __ lhu(result, element_address); break;
+        case 1:
+          __ lhu(result, element_address);
+          break;
         case 2:  // Loading multiple code units is disabled on MIPS.
-        default: UNREACHABLE();
+        default:
+          UNREACHABLE();
       }
       __ SmiTag(result);
       break;
@@ -1445,8 +1479,8 @@
 Representation StoreIndexedInstr::RequiredInputRepresentation(
     intptr_t idx) const {
   // Array can be a Dart object or a pointer to external data.
-  if (idx == 0)  return kNoRepresentation;  // Flexible input representation.
-  if (idx == 1) return kTagged;  // Index is a smi.
+  if (idx == 0) return kNoRepresentation;  // Flexible input representation.
+  if (idx == 1) return kTagged;            // Index is a smi.
   ASSERT(idx == 2);
   switch (class_id_) {
     case kArrayCid:
@@ -1481,8 +1515,8 @@
                                                         bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = aligned() ? 0 : 2;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   if (CanBeImmediateIndex(index(), class_id(), IsExternal())) {
     locs->set_in(1, Location::Constant(index()->definition()->AsConstant()));
@@ -1492,8 +1526,8 @@
   switch (class_id()) {
     case kArrayCid:
       locs->set_in(2, ShouldEmitStoreBarrier()
-                        ? Location::WritableRegister()
-                        : Location::RegisterOrConstant(value()));
+                          ? Location::WritableRegister()
+                          : Location::RegisterOrConstant(value()));
       break;
     case kExternalTypedDataUint8ArrayCid:
     case kExternalTypedDataUint8ClampedArrayCid:
@@ -1535,13 +1569,14 @@
 
   Address element_address(kNoRegister);
   if (aligned()) {
-    element_address = index.IsRegister()
-      ? __ ElementAddressForRegIndex(false,  // Store.
-                                     IsExternal(), class_id(), index_scale(),
-                                     array, index.reg())
-      : __ ElementAddressForIntIndex(
-            IsExternal(), class_id(), index_scale(),
-            array, Smi::Cast(index.constant()).Value());
+    element_address =
+        index.IsRegister()
+            ? __ ElementAddressForRegIndex(false,  // Store.
+                                           IsExternal(), class_id(),
+                                           index_scale(), array, index.reg())
+            : __ ElementAddressForIntIndex(IsExternal(), class_id(),
+                                           index_scale(), array,
+                                           Smi::Cast(index.constant()).Value());
     ASSERT(element_address.base() != TMP);  // Allowed for load only.
   } else {
     if (index.IsRegister()) {
@@ -1550,9 +1585,8 @@
                                        IsExternal(), class_id(), index_scale(),
                                        array, index.reg());
     } else {
-      __ LoadElementAddressForIntIndex(address,
-                                       IsExternal(), class_id(), index_scale(),
-                                       array,
+      __ LoadElementAddressForIntIndex(address, IsExternal(), class_id(),
+                                       index_scale(), array,
                                        Smi::Cast(index.constant()).Value());
     }
   }
@@ -1642,8 +1676,8 @@
     }
     case kTypedDataFloat64ArrayCid:
       ASSERT(aligned());
-      __ StoreDToOffset(locs()->in(2).fpu_reg(),
-                        element_address.base(), element_address.offset());
+      __ StoreDToOffset(locs()->in(2).fpu_reg(), element_address.base(),
+                        element_address.offset());
       break;
     case kTypedDataInt32x4ArrayCid:
     case kTypedDataFloat32x4ArrayCid:
@@ -1664,7 +1698,7 @@
 
   const bool emit_full_guard = !opt || (field_cid == kIllegalCid);
   const bool needs_value_cid_temp_reg =
-    (value_cid == kDynamicCid) && (emit_full_guard || (field_cid != kSmiCid));
+      (value_cid == kDynamicCid) && (emit_full_guard || (field_cid != kSmiCid));
   const bool needs_field_temp_reg = emit_full_guard;
 
   intptr_t num_temps = 0;
@@ -1675,8 +1709,8 @@
     num_temps++;
   }
 
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, num_temps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, num_temps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
 
   for (intptr_t i = 0; i < num_temps; i++) {
@@ -1698,7 +1732,8 @@
   if (field_cid == kDynamicCid) {
     if (Compiler::IsBackgroundCompilation()) {
       // Field state changed while compiling.
-      Compiler::AbortBackgroundCompilation(deopt_id(),
+      Compiler::AbortBackgroundCompilation(
+          deopt_id(),
           "GuardFieldClassInstr: field state changed while compiling");
     }
     ASSERT(!compiler->is_optimizing());
@@ -1715,16 +1750,19 @@
 
   const Register value_reg = locs()->in(0).reg();
 
-  const Register value_cid_reg = needs_value_cid_temp_reg ?
-      locs()->temp(0).reg() : kNoRegister;
+  const Register value_cid_reg =
+      needs_value_cid_temp_reg ? locs()->temp(0).reg() : kNoRegister;
 
-  const Register field_reg = needs_field_temp_reg ?
-      locs()->temp(locs()->temp_count() - 1).reg() : kNoRegister;
+  const Register field_reg = needs_field_temp_reg
+                                 ? locs()->temp(locs()->temp_count() - 1).reg()
+                                 : kNoRegister;
 
   Label ok, fail_label;
 
-  Label* deopt = compiler->is_optimizing() ?
-      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptGuardField) : NULL;
+  Label* deopt =
+      compiler->is_optimizing()
+          ? compiler->AddDeoptStub(deopt_id(), ICData::kDeoptGuardField)
+          : NULL;
 
   Label* fail = (deopt != NULL) ? deopt : &fail_label;
 
@@ -1732,8 +1770,8 @@
     __ LoadObject(field_reg, Field::ZoneHandle(field().Original()));
 
     FieldAddress field_cid_operand(field_reg, Field::guarded_cid_offset());
-    FieldAddress field_nullability_operand(
-        field_reg, Field::is_nullable_offset());
+    FieldAddress field_nullability_operand(field_reg,
+                                           Field::is_nullable_offset());
 
     if (value_cid == kDynamicCid) {
       LoadValueCid(compiler, value_cid_reg, value_reg);
@@ -1837,15 +1875,15 @@
 
   if (!opt || (field().guarded_list_length() == Field::kUnknownFixedLength)) {
     const intptr_t kNumTemps = 1;
-    LocationSummary* summary = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     // We need temporaries for field object.
     summary->set_temp(0, Location::RequiresRegister());
     return summary;
   }
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, 0, LocationSummary::kNoCall);
+  LocationSummary* summary =
+      new (zone) LocationSummary(zone, kNumInputs, 0, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   return summary;
 }
@@ -1855,15 +1893,18 @@
   if (field().guarded_list_length() == Field::kNoFixedLength) {
     if (Compiler::IsBackgroundCompilation()) {
       // Field state changed while compiling.
-      Compiler::AbortBackgroundCompilation(deopt_id(),
+      Compiler::AbortBackgroundCompilation(
+          deopt_id(),
           "GuardFieldLengthInstr: field state changed while compiling");
     }
     ASSERT(!compiler->is_optimizing());
     return;  // Nothing to emit.
   }
 
-  Label* deopt = compiler->is_optimizing() ?
-      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptGuardField) : NULL;
+  Label* deopt =
+      compiler->is_optimizing()
+          ? compiler->AddDeoptStub(deopt_id(), ICData::kDeoptGuardField)
+          : NULL;
 
   const Register value_reg = locs()->in(0).reg();
 
@@ -1875,12 +1916,13 @@
 
     __ LoadObject(field_reg, Field::ZoneHandle(field().Original()));
 
-    __ lb(CMPRES1, FieldAddress(field_reg,
-        Field::guarded_list_length_in_object_offset_offset()));
+    __ lb(CMPRES1,
+          FieldAddress(field_reg,
+                       Field::guarded_list_length_in_object_offset_offset()));
     __ blez(CMPRES1, &ok);
 
-    __ lw(CMPRES2, FieldAddress(field_reg,
-        Field::guarded_list_length_offset()));
+    __ lw(CMPRES2,
+          FieldAddress(field_reg, Field::guarded_list_length_offset()));
 
     // Load the length from the value. GuardFieldClass already verified that
     // value's class matches guarded class id of the field.
@@ -1906,7 +1948,7 @@
     ASSERT(compiler->is_optimizing());
     ASSERT(field().guarded_list_length() >= 0);
     ASSERT(field().guarded_list_length_in_object_offset() !=
-        Field::kUnknownLengthOffset);
+           Field::kUnknownLengthOffset);
 
     __ lw(CMPRES1,
           FieldAddress(value_reg,
@@ -1922,14 +1964,11 @@
   BoxAllocationSlowPath(Instruction* instruction,
                         const Class& cls,
                         Register result)
-      : instruction_(instruction),
-        cls_(cls),
-        result_(result) { }
+      : instruction_(instruction), cls_(cls), result_(result) {}
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     if (Assembler::EmittingComments()) {
-      __ Comment("%s slow path allocation of %s",
-                 instruction_->DebugName(),
+      __ Comment("%s slow path allocation of %s", instruction_->DebugName(),
                  String::Handle(cls_.ScrubbedName()).ToCString());
     }
     __ Bind(entry_label());
@@ -1942,9 +1981,7 @@
 
     compiler->SaveLiveRegisters(locs);
     compiler->GenerateCall(TokenPosition::kNoSource,  // No token position.
-                           stub_entry,
-                           RawPcDescriptors::kOther,
-                           locs);
+                           stub_entry, RawPcDescriptors::kOther, locs);
     compiler->AddStubCallTarget(stub);
     if (result_ != V0) {
       __ mov(result_, V0);
@@ -1959,19 +1996,13 @@
                        Register result,
                        Register temp) {
     if (compiler->intrinsic_mode()) {
-      __ TryAllocate(cls,
-                     compiler->intrinsic_slow_path_label(),
-                     result,
-                     temp);
+      __ TryAllocate(cls, compiler->intrinsic_slow_path_label(), result, temp);
     } else {
       BoxAllocationSlowPath* slow_path =
           new BoxAllocationSlowPath(instruction, cls, result);
       compiler->AddSlowPathCode(slow_path);
 
-      __ TryAllocate(cls,
-                     slow_path->entry_label(),
-                     result,
-                     temp);
+      __ TryAllocate(cls, slow_path->entry_label(), result, temp);
       __ Bind(slow_path->exit_label());
     }
   }
@@ -1987,14 +2018,13 @@
                                                               bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps =
-      (IsUnboxedStore() && opt) ? 2 :
-          ((IsPotentialUnboxedStore()) ? 3 : 0);
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps,
-          ((IsUnboxedStore() && opt && is_initialization()) ||
-           IsPotentialUnboxedStore())
-          ? LocationSummary::kCallOnSlowPath
-          : LocationSummary::kNoCall);
+      (IsUnboxedStore() && opt) ? 2 : ((IsPotentialUnboxedStore()) ? 3 : 0);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps,
+                      ((IsUnboxedStore() && opt && is_initialization()) ||
+                       IsPotentialUnboxedStore())
+                          ? LocationSummary::kCallOnSlowPath
+                          : LocationSummary::kNoCall);
 
   summary->set_in(0, Location::RequiresRegister());
   if (IsUnboxedStore() && opt) {
@@ -2002,17 +2032,16 @@
     summary->set_temp(0, Location::RequiresRegister());
     summary->set_temp(1, Location::RequiresRegister());
   } else if (IsPotentialUnboxedStore()) {
-    summary->set_in(1, ShouldEmitStoreBarrier()
-        ? Location::WritableRegister()
-        :  Location::RequiresRegister());
+    summary->set_in(1, ShouldEmitStoreBarrier() ? Location::WritableRegister()
+                                                : Location::RequiresRegister());
     summary->set_temp(0, Location::RequiresRegister());
     summary->set_temp(1, Location::RequiresRegister());
     summary->set_temp(2, opt ? Location::RequiresFpuRegister()
                              : Location::FpuRegisterLocation(D1));
   } else {
     summary->set_in(1, ShouldEmitStoreBarrier()
-                       ? Location::WritableRegister()
-                       : Location::RegisterOrConstant(value()));
+                           ? Location::WritableRegister()
+                           : Location::RegisterOrConstant(value()));
   }
   return summary;
 }
@@ -2066,7 +2095,7 @@
     switch (cid) {
       case kDoubleCid:
         __ StoreDToOffset(value, temp, Double::value_offset() - kHeapObjectTag);
-      break;
+        break;
       default:
         UNREACHABLE();
     }
@@ -2110,15 +2139,9 @@
 
     {
       __ Bind(&store_double);
-      EnsureMutableBox(compiler,
-                       this,
-                       temp,
-                       compiler->double_class(),
-                       instance_reg,
-                       offset_in_bytes_,
-                       temp2);
-      __ LoadDFromOffset(fpu_temp,
-                         value_reg,
+      EnsureMutableBox(compiler, this, temp, compiler->double_class(),
+                       instance_reg, offset_in_bytes_, temp2);
+      __ LoadDFromOffset(fpu_temp, value_reg,
                          Double::value_offset() - kHeapObjectTag);
       __ StoreDToOffset(fpu_temp, temp,
                         Double::value_offset() - kHeapObjectTag);
@@ -2130,20 +2153,15 @@
 
   if (ShouldEmitStoreBarrier()) {
     Register value_reg = locs()->in(1).reg();
-    __ StoreIntoObjectOffset(instance_reg,
-                             offset_in_bytes_,
-                             value_reg,
+    __ StoreIntoObjectOffset(instance_reg, offset_in_bytes_, value_reg,
                              CanValueBeSmi());
   } else {
     if (locs()->in(1).IsConstant()) {
-      __ StoreIntoObjectNoBarrierOffset(
-          instance_reg,
-          offset_in_bytes_,
-          locs()->in(1).constant());
+      __ StoreIntoObjectNoBarrierOffset(instance_reg, offset_in_bytes_,
+                                        locs()->in(1).constant());
     } else {
       Register value_reg = locs()->in(1).reg();
-      __ StoreIntoObjectNoBarrierOffset(instance_reg,
-                                        offset_in_bytes_,
+      __ StoreIntoObjectNoBarrierOffset(instance_reg, offset_in_bytes_,
                                         value_reg);
     }
   }
@@ -2155,8 +2173,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -2172,16 +2190,15 @@
   __ Comment("LoadStaticFieldInstr");
   Register field = locs()->in(0).reg();
   Register result = locs()->out(0).reg();
-  __ LoadFromOffset(result,
-                    field,
+  __ LoadFromOffset(result, field,
                     Field::static_value_offset() - kHeapObjectTag);
 }
 
 
 LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(Zone* zone,
                                                             bool opt) const {
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, 1, 1, LocationSummary::kNoCall);
+  LocationSummary* locs =
+      new (zone) LocationSummary(zone, 1, 1, LocationSummary::kNoCall);
   locs->set_in(0, value()->NeedsStoreBuffer() ? Location::WritableRegister()
                                               : Location::RequiresRegister());
   locs->set_temp(0, Location::RequiresRegister());
@@ -2196,10 +2213,8 @@
 
   __ LoadObject(temp, Field::ZoneHandle(Z, field().Original()));
   if (this->value()->NeedsStoreBuffer()) {
-    __ StoreIntoObject(temp,
-                       FieldAddress(temp, Field::static_value_offset()),
-                       value,
-                       CanValueBeSmi());
+    __ StoreIntoObject(temp, FieldAddress(temp, Field::static_value_offset()),
+                       value, CanValueBeSmi());
   } else {
     __ StoreIntoObjectNoBarrier(
         temp, FieldAddress(temp, Field::static_value_offset()), value);
@@ -2211,8 +2226,8 @@
                                                       bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(A0));
   summary->set_in(1, Location::RegisterLocation(A1));
   summary->set_out(0, Location::RegisterLocation(V0));
@@ -2225,10 +2240,7 @@
   ASSERT(locs()->in(1).reg() == A1);  // Instantiator type arguments.
 
   __ Comment("InstanceOfInstr");
-  compiler->GenerateInstanceOf(token_pos(),
-                               deopt_id(),
-                               type(),
-                               negate_result(),
+  compiler->GenerateInstanceOf(token_pos(), deopt_id(), type(), negate_result(),
                                locs());
   ASSERT(locs()->out(0).reg() == V0);
 }
@@ -2238,8 +2250,8 @@
                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(A0));
   locs->set_in(1, Location::RegisterLocation(A1));
   locs->set_out(0, Location::RegisterLocation(V0));
@@ -2249,9 +2261,9 @@
 
 // Inlines array allocation for known constant values.
 static void InlineArrayAllocation(FlowGraphCompiler* compiler,
-                                   intptr_t num_elements,
-                                   Label* slow_path,
-                                   Label* done) {
+                                  intptr_t num_elements,
+                                  Label* slow_path,
+                                  Label* done) {
   const int kInlineArraySize = 12;  // Same as kInlineInstanceSize.
   const Register kLengthReg = A1;
   const Register kElemTypeReg = A0;
@@ -2260,19 +2272,16 @@
   __ TryAllocateArray(kArrayCid, instance_size, slow_path,
                       V0,  // instance
                       T1,  // end address
-                      T2,
-                      T3);
+                      T2, T3);
   // V0: new object start as a tagged pointer.
   // T1: new object end address.
 
   // Store the type argument field.
-  __ StoreIntoObjectNoBarrier(V0,
-                              FieldAddress(V0, Array::type_arguments_offset()),
-                              kElemTypeReg);
+  __ StoreIntoObjectNoBarrier(
+      V0, FieldAddress(V0, Array::type_arguments_offset()), kElemTypeReg);
 
   // Set the length field.
-  __ StoreIntoObjectNoBarrier(V0,
-                              FieldAddress(V0, Array::length_offset()),
+  __ StoreIntoObjectNoBarrier(V0, FieldAddress(V0, Array::length_offset()),
                               kLengthReg);
 
   // Initialize all array elements to raw_null.
@@ -2312,8 +2321,7 @@
   ASSERT(locs()->in(1).reg() == kLengthReg);
 
   Label slow_path, done;
-  if (compiler->is_optimizing() &&
-      !FLAG_precompiled_mode &&
+  if (compiler->is_optimizing() && !FLAG_precompiled_mode &&
       num_elements()->BindsToConstant() &&
       num_elements()->BoundConstant().IsSmi()) {
     const intptr_t length = Smi::Cast(num_elements()->BoundConstant()).Value();
@@ -2322,13 +2330,10 @@
       InlineArrayAllocation(compiler, length, &slow_path, &done);
       __ Bind(&slow_path);
       __ PushObject(Object::null_object());  // Make room for the result.
-      __ Push(kLengthReg);  // length.
+      __ Push(kLengthReg);                   // length.
       __ Push(kElemTypeReg);
-      compiler->GenerateRuntimeCall(token_pos(),
-                                    deopt_id(),
-                                    kAllocateArrayRuntimeEntry,
-                                    2,
-                                    locs());
+      compiler->GenerateRuntimeCall(token_pos(), deopt_id(),
+                                    kAllocateArrayRuntimeEntry, 2, locs());
       __ Drop(2);
       __ Pop(kResultReg);
       __ Bind(&done);
@@ -2340,10 +2345,8 @@
   const Code& stub = Code::ZoneHandle(compiler->zone(),
                                       StubCode::AllocateArray_entry()->code());
   compiler->AddStubCallTarget(stub);
-  compiler->GenerateCall(token_pos(),
-                         *StubCode::AllocateArray_entry(),
-                         RawPcDescriptors::kOther,
-                         locs());
+  compiler->GenerateCall(token_pos(), *StubCode::AllocateArray_entry(),
+                         RawPcDescriptors::kOther, locs());
   __ Bind(&done);
   ASSERT(locs()->out(0).reg() == kResultReg);
 }
@@ -2353,13 +2356,11 @@
                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps =
-      (IsUnboxedLoad() && opt) ? 1 :
-          ((IsPotentialUnboxedLoad()) ? 2 : 0);
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps,
-          (opt && !IsPotentialUnboxedLoad())
-          ? LocationSummary::kNoCall
-          : LocationSummary::kCallOnSlowPath);
+      (IsUnboxedLoad() && opt) ? 1 : ((IsPotentialUnboxedLoad()) ? 2 : 0);
+  LocationSummary* locs = new (zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, (opt && !IsPotentialUnboxedLoad())
+                                       ? LocationSummary::kNoCall
+                                       : LocationSummary::kCallOnSlowPath);
 
   locs->set_in(0, Location::RequiresRegister());
 
@@ -2425,12 +2426,11 @@
 
     {
       __ Bind(&load_double);
-      BoxAllocationSlowPath::Allocate(
-          compiler, this, compiler->double_class(), result_reg, temp);
+      BoxAllocationSlowPath::Allocate(compiler, this, compiler->double_class(),
+                                      result_reg, temp);
       __ lw(temp, FieldAddress(instance_reg, offset_in_bytes()));
       __ LoadDFromOffset(value, temp, Double::value_offset() - kHeapObjectTag);
-      __ StoreDToOffset(value,
-                        result_reg,
+      __ StoreDToOffset(value, result_reg,
                         Double::value_offset() - kHeapObjectTag);
       __ b(&done);
     }
@@ -2446,8 +2446,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(T0));
   locs->set_out(0, Location::RegisterLocation(T0));
   return locs;
@@ -2469,11 +2469,8 @@
   // Push instantiator type arguments.
   __ sw(instantiator_reg, Address(SP, 0 * kWordSize));
 
-  compiler->GenerateRuntimeCall(token_pos(),
-                                deopt_id(),
-                                kInstantiateTypeRuntimeEntry,
-                                2,
-                                locs());
+  compiler->GenerateRuntimeCall(token_pos(), deopt_id(),
+                                kInstantiateTypeRuntimeEntry, 2, locs());
   // Pop instantiated type.
   __ lw(result_reg, Address(SP, 2 * kWordSize));
   // Drop instantiator and uninstantiated type.
@@ -2483,11 +2480,12 @@
 
 
 LocationSummary* InstantiateTypeArgumentsInstr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(T0));
   locs->set_out(0, Location::RegisterLocation(T0));
   return locs;
@@ -2525,8 +2523,8 @@
   __ Bind(&loop);
   __ lw(T1, Address(T2, 0 * kWordSize));  // Cached instantiator.
   __ beq(T1, T0, &found);
-  __ BranchNotEqual(
-      T1, Immediate(Smi::RawValue(StubCode::kNoInstantiator)), &loop);
+  __ BranchNotEqual(T1, Immediate(Smi::RawValue(StubCode::kNoInstantiator)),
+                    &loop);
   __ delay_slot()->addiu(T2, T2, Immediate(2 * kWordSize));
   __ b(&slow_case);
   __ Bind(&found);
@@ -2544,10 +2542,8 @@
   // Push instantiator type arguments.
   __ sw(instantiator_reg, Address(SP, 0 * kWordSize));
 
-  compiler->GenerateRuntimeCall(token_pos(),
-                                deopt_id(),
-                                kInstantiateTypeArgumentsRuntimeEntry,
-                                2,
+  compiler->GenerateRuntimeCall(token_pos(), deopt_id(),
+                                kInstantiateTypeArgumentsRuntimeEntry, 2,
                                 locs());
   // Pop instantiated type arguments.
   __ lw(result_reg, Address(SP, 2 * kWordSize));
@@ -2563,7 +2559,7 @@
   ASSERT(opt);
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 3;
-  LocationSummary* locs = new(zone) LocationSummary(
+  LocationSummary* locs = new (zone) LocationSummary(
       zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   locs->set_temp(0, Location::RegisterLocation(T1));
   locs->set_temp(1, Location::RegisterLocation(T2));
@@ -2577,7 +2573,7 @@
  public:
   explicit AllocateContextSlowPath(
       AllocateUninitializedContextInstr* instruction)
-      : instruction_(instruction) { }
+      : instruction_(instruction) {}
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     __ Comment("AllocateContextSlowPath");
@@ -2594,8 +2590,7 @@
     compiler->AddStubCallTarget(stub);
     compiler->GenerateCall(instruction_->token_pos(),
                            *StubCode::AllocateContext_entry(),
-                           RawPcDescriptors::kOther,
-                           locs);
+                           RawPcDescriptors::kOther, locs);
     ASSERT(instruction_->locs()->out(0).reg() == V0);
     compiler->RestoreLiveRegisters(instruction_->locs());
     __ b(exit_label());
@@ -2619,9 +2614,7 @@
 
   __ TryAllocateArray(kContextCid, instance_size, slow_path->entry_label(),
                       result,  // instance
-                      temp0,
-                      temp1,
-                      temp2);
+                      temp0, temp1, temp2);
 
   // Setup up number of context variables field.
   __ LoadImmediate(temp0, num_context_variables());
@@ -2635,8 +2628,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 1;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_temp(0, Location::RegisterLocation(T1));
   locs->set_out(0, Location::RegisterLocation(V0));
   return locs;
@@ -2649,10 +2642,8 @@
 
   __ Comment("AllocateContextInstr");
   __ LoadImmediate(T1, num_context_variables());
-  compiler->GenerateCall(token_pos(),
-                         *StubCode::AllocateContext_entry(),
-                         RawPcDescriptors::kOther,
-                         locs());
+  compiler->GenerateCall(token_pos(), *StubCode::AllocateContext_entry(),
+                         RawPcDescriptors::kOther, locs());
 }
 
 
@@ -2660,8 +2651,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(T0));
   locs->set_temp(0, Location::RegisterLocation(T1));
   return locs;
@@ -2682,14 +2673,11 @@
   __ Bind(&call_runtime);
   __ addiu(SP, SP, Immediate(-2 * kWordSize));
   __ LoadObject(TMP, Object::null_object());
-  __ sw(TMP, Address(SP, 1 * kWordSize));   // Make room for (unused) result.
+  __ sw(TMP, Address(SP, 1 * kWordSize));  // Make room for (unused) result.
   __ sw(field, Address(SP, 0 * kWordSize));
 
-  compiler->GenerateRuntimeCall(token_pos(),
-                                deopt_id(),
-                                kInitStaticFieldRuntimeEntry,
-                                1,
-                                locs());
+  compiler->GenerateRuntimeCall(token_pos(), deopt_id(),
+                                kInitStaticFieldRuntimeEntry, 1, locs());
 
   __ addiu(SP, SP, Immediate(2 * kWordSize));  // Purge argument and result.
 
@@ -2701,8 +2689,8 @@
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(T0));
   locs->set_out(0, Location::RegisterLocation(T0));
   return locs;
@@ -2720,11 +2708,8 @@
   __ sw(TMP, Address(SP, 1 * kWordSize));
   __ sw(context_value, Address(SP, 0 * kWordSize));
 
-  compiler->GenerateRuntimeCall(token_pos(),
-                                deopt_id(),
-                                kCloneContextRuntimeEntry,
-                                1,
-                                locs());
+  compiler->GenerateRuntimeCall(token_pos(), deopt_id(),
+                                kCloneContextRuntimeEntry, 1, locs());
   __ lw(result, Address(SP, 1 * kWordSize));  // Get result (cloned context).
   __ addiu(SP, SP, Immediate(2 * kWordSize));
 }
@@ -2739,19 +2724,16 @@
 
 void CatchBlockEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   __ Bind(compiler->GetJumpLabel(this));
-  compiler->AddExceptionHandler(catch_try_index(),
-                                try_index(),
+  compiler->AddExceptionHandler(catch_try_index(), try_index(),
                                 compiler->assembler()->CodeSize(),
-                                catch_handler_types_,
-                                needs_stacktrace());
+                                catch_handler_types_, needs_stacktrace());
   // On lazy deoptimization we patch the optimized code here to enter the
   // deoptimization stub.
   const intptr_t deopt_id = Thread::ToDeoptAfter(GetDeoptId());
   if (compiler->is_optimizing()) {
     compiler->AddDeoptIndexAtCall(deopt_id);
   } else {
-    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
-                                   deopt_id,
+    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, deopt_id,
                                    TokenPosition::kNoSource);
   }
   if (HasParallelMove()) {
@@ -2766,10 +2748,10 @@
 
   // Restore stack and initialize the two exception variables:
   // exception and stack trace variables.
-  __ StoreToOffset(kExceptionObjectReg,
-                   FP, exception_var().index() * kWordSize);
-  __ StoreToOffset(kStackTraceObjectReg,
-                   FP, stacktrace_var().index() * kWordSize);
+  __ StoreToOffset(kExceptionObjectReg, FP,
+                   exception_var().index() * kWordSize);
+  __ StoreToOffset(kStackTraceObjectReg, FP,
+                   stacktrace_var().index() * kWordSize);
 }
 
 
@@ -2777,10 +2759,8 @@
                                                               bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs,
-                          kNumTemps,
-                          LocationSummary::kCallOnSlowPath);
+  LocationSummary* summary = new (zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   summary->set_temp(0, Location::RequiresRegister());
   return summary;
 }
@@ -2789,7 +2769,7 @@
 class CheckStackOverflowSlowPath : public SlowPathCode {
  public:
   explicit CheckStackOverflowSlowPath(CheckStackOverflowInstr* instruction)
-      : instruction_(instruction) { }
+      : instruction_(instruction) {}
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     if (FLAG_use_osr && osr_entry_label()->IsLinked()) {
@@ -2807,11 +2787,9 @@
     ASSERT(compiler->pending_deoptimization_env_ == NULL);
     Environment* env = compiler->SlowPathEnvironmentFor(instruction_);
     compiler->pending_deoptimization_env_ = env;
-    compiler->GenerateRuntimeCall(instruction_->token_pos(),
-                                  instruction_->deopt_id(),
-                                  kStackOverflowRuntimeEntry,
-                                  0,
-                                  instruction_->locs());
+    compiler->GenerateRuntimeCall(
+        instruction_->token_pos(), instruction_->deopt_id(),
+        kStackOverflowRuntimeEntry, 0, instruction_->locs());
 
     if (FLAG_use_osr && !compiler->is_optimizing() && instruction_->in_loop()) {
       // In unoptimized code, record loop stack checks as possible OSR entries.
@@ -2851,8 +2829,8 @@
     intptr_t threshold =
         FLAG_optimization_counter_threshold * (loop_depth() + 1);
     __ lw(temp, FieldAddress(temp, Function::usage_counter_offset()));
-    __ BranchSignedGreaterEqual(
-        temp, Immediate(threshold), slow_path->osr_entry_label());
+    __ BranchSignedGreaterEqual(temp, Immediate(threshold),
+                                slow_path->osr_entry_label());
   }
   if (compiler->ForceSlowPathForStackOverflow()) {
     __ b(slow_path->entry_label());
@@ -2866,9 +2844,10 @@
   const LocationSummary& locs = *shift_left->locs();
   Register left = locs.in(0).reg();
   Register result = locs.out(0).reg();
-  Label* deopt = shift_left->CanDeoptimize() ?
-      compiler->AddDeoptStub(shift_left->deopt_id(), ICData::kDeoptBinarySmiOp)
-      : NULL;
+  Label* deopt = shift_left->CanDeoptimize()
+                     ? compiler->AddDeoptStub(shift_left->deopt_id(),
+                                              ICData::kDeoptBinarySmiOp)
+                     : NULL;
 
   __ Comment("EmitSmiShiftLeft");
 
@@ -2930,8 +2909,8 @@
       }
       Label done, is_not_zero;
 
-      __ sltiu(CMPRES1,
-          right, Immediate(reinterpret_cast<int32_t>(Smi::New(Smi::kBits))));
+      __ sltiu(CMPRES1, right,
+               Immediate(reinterpret_cast<int32_t>(Smi::New(Smi::kBits))));
       __ movz(result, ZR, CMPRES1);  // result = right >= kBits ? 0 : result.
       __ sra(TMP, right, kSmiTagSize);
       __ sllv(TMP, left, TMP);
@@ -2965,7 +2944,7 @@
 class CheckedSmiSlowPath : public SlowPathCode {
  public:
   CheckedSmiSlowPath(CheckedSmiOpInstr* instruction, intptr_t try_index)
-      : instruction_(instruction), try_index_(try_index) { }
+      : instruction_(instruction), try_index_(try_index) {}
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     if (Assembler::EmittingComments()) {
@@ -2980,12 +2959,9 @@
     __ Push(locs->in(0).reg());
     __ Push(locs->in(1).reg());
     compiler->EmitMegamorphicInstanceCall(
-        *instruction_->call()->ic_data(),
-        instruction_->call()->ArgumentCount(),
-        instruction_->call()->deopt_id(),
-        instruction_->call()->token_pos(),
-        locs,
-        try_index_,
+        *instruction_->call()->ic_data(), instruction_->call()->ArgumentCount(),
+        instruction_->call()->deopt_id(), instruction_->call()->token_pos(),
+        locs, try_index_,
         /* slow_path_argument_count = */ 2);
     __ mov(result, V0);
     compiler->RestoreLiveRegisters(locs);
@@ -3002,7 +2978,7 @@
                                                         bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
+  LocationSummary* summary = new (zone) LocationSummary(
       zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
@@ -3063,6 +3039,26 @@
     case Token::kBIT_XOR:
       __ xor_(result, left, right);
       break;
+    case Token::kSHL:
+      ASSERT(result != left);
+      ASSERT(result != right);
+      __ BranchUnsignedGreater(right, Immediate(Smi::RawValue(Smi::kBits)),
+                               slow_path->entry_label());
+      // Check for overflow by shifting left and shifting back arithmetically.
+      // If the result is different from the original, there was overflow.
+      __ delay_slot()->SmiUntag(TMP, right);
+      __ sllv(result, left, TMP);
+      __ srav(CMPRES1, result, TMP);
+      __ bne(CMPRES1, left, slow_path->entry_label());
+      break;
+    case Token::kSHR:
+      __ BranchUnsignedGreater(right, Immediate(Smi::RawValue(Smi::kBits)),
+                               slow_path->entry_label());
+      __ delay_slot()->SmiUntag(result, right);
+      __ SmiUntag(TMP, left);
+      __ srav(result, TMP, result);
+      __ SmiTag(result);
+      break;
     default:
       UNIMPLEMENTED();
   }
@@ -3079,7 +3075,7 @@
       : instruction_(instruction),
         try_index_(try_index),
         labels_(labels),
-        merged_(merged) { }
+        merged_(merged) {}
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     if (Assembler::EmittingComments()) {
@@ -3094,20 +3090,18 @@
     __ Push(locs->in(0).reg());
     __ Push(locs->in(1).reg());
     compiler->EmitMegamorphicInstanceCall(
-        *instruction_->call()->ic_data(),
-        instruction_->call()->ArgumentCount(),
-        instruction_->call()->deopt_id(),
-        instruction_->call()->token_pos(),
-        locs,
-        try_index_,
+        *instruction_->call()->ic_data(), instruction_->call()->ArgumentCount(),
+        instruction_->call()->deopt_id(), instruction_->call()->token_pos(),
+        locs, try_index_,
         /* slow_path_argument_count = */ 2);
     __ mov(result, V0);
     compiler->RestoreLiveRegisters(locs);
     if (merged_) {
-      __ BranchEqual(result, Bool::True(),
-         instruction_->is_negated() ? labels_.false_label : labels_.true_label);
-      __ b(instruction_->is_negated()
-           ? labels_.true_label : labels_.false_label);
+      __ BranchEqual(result, Bool::True(), instruction_->is_negated()
+                                               ? labels_.false_label
+                                               : labels_.true_label);
+      __ b(instruction_->is_negated() ? labels_.true_label
+                                      : labels_.false_label);
     } else {
       __ b(exit_label());
     }
@@ -3122,10 +3116,11 @@
 
 
 LocationSummary* CheckedSmiComparisonInstr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(zone) LocationSummary(
+  LocationSummary* summary = new (zone) LocationSummary(
       zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
@@ -3136,7 +3131,8 @@
 
 
 Condition CheckedSmiComparisonInstr::EmitComparisonCode(
-    FlowGraphCompiler* compiler, BranchLabels labels) {
+    FlowGraphCompiler* compiler,
+    BranchLabels labels) {
   return EmitSmiComparisonOp(compiler, *locs(), kind());
 }
 
@@ -3157,17 +3153,15 @@
     __ or_(temp, left, right);                                                 \
     __ andi(CMPRES1, temp, Immediate(kSmiTagMask));                            \
   }                                                                            \
-  __ bne(CMPRES1, ZR, slow_path->entry_label());                               \
+  __ bne(CMPRES1, ZR, slow_path->entry_label());
 
 
 void CheckedSmiComparisonInstr::EmitBranchCode(FlowGraphCompiler* compiler,
                                                BranchInstr* branch) {
   BranchLabels labels = compiler->CreateBranchLabels(branch);
-  CheckedSmiComparisonSlowPath* slow_path =
-      new CheckedSmiComparisonSlowPath(this,
-                                       compiler->CurrentTryIndex(),
-                                       labels,
-                                       /* merged = */ true);
+  CheckedSmiComparisonSlowPath* slow_path = new CheckedSmiComparisonSlowPath(
+      this, compiler->CurrentTryIndex(), labels,
+      /* merged = */ true);
   compiler->AddSlowPathCode(slow_path);
   EMIT_SMI_CHECK;
   Condition true_condition = EmitComparisonCode(compiler, labels);
@@ -3178,12 +3172,10 @@
 
 void CheckedSmiComparisonInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Label true_label, false_label, done;
-  BranchLabels labels = { &true_label, &false_label, &false_label };
-  CheckedSmiComparisonSlowPath* slow_path =
-      new CheckedSmiComparisonSlowPath(this,
-                                       compiler->CurrentTryIndex(),
-                                       labels,
-                                       /* merged = */ false);
+  BranchLabels labels = {&true_label, &false_label, &false_label};
+  CheckedSmiComparisonSlowPath* slow_path = new CheckedSmiComparisonSlowPath(
+      this, compiler->CurrentTryIndex(), labels,
+      /* merged = */ false);
   compiler->AddSlowPathCode(slow_path);
   EMIT_SMI_CHECK;
   Condition true_condition = EmitComparisonCode(compiler, labels);
@@ -3203,13 +3195,14 @@
                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps =
-      ((op_kind() == Token::kADD) ||
-       (op_kind() == Token::kMOD) ||
+      ((op_kind() == Token::kADD) || (op_kind() == Token::kMOD) ||
        (op_kind() == Token::kTRUNCDIV) ||
        (((op_kind() == Token::kSHL) && can_overflow()) ||
-         (op_kind() == Token::kSHR))) ? 1 : 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+        (op_kind() == Token::kSHR)))
+          ? 1
+          : 0;
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   if (op_kind() == Token::kTRUNCDIV) {
     summary->set_in(0, Location::RequiresRegister());
     if (RightIsPowerOfTwoConstant()) {
@@ -3500,8 +3493,8 @@
   ASSERT((left_cid != kDoubleCid) && (right_cid != kDoubleCid));
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   return summary;
@@ -3509,9 +3502,9 @@
 
 
 void CheckEitherNonSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label* deopt = compiler->AddDeoptStub(deopt_id(),
-                                        ICData::kDeoptBinaryDoubleOp,
-                                        licm_hoisted_ ? ICData::kHoisted : 0);
+  Label* deopt =
+      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryDoubleOp,
+                             licm_hoisted_ ? ICData::kHoisted : 0);
   intptr_t left_cid = left()->Type()->ToCid();
   intptr_t right_cid = right()->Type()->ToCid();
   Register left = locs()->in(0).reg();
@@ -3530,11 +3523,10 @@
 }
 
 
-LocationSummary* BoxInstr::MakeLocationSummary(Zone* zone,
-                                                     bool opt) const {
+LocationSummary* BoxInstr::MakeLocationSummary(Zone* zone, bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(zone) LocationSummary(
+  LocationSummary* summary = new (zone) LocationSummary(
       zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_temp(0, Location::RequiresRegister());
@@ -3549,18 +3541,17 @@
   Register out_reg = locs()->out(0).reg();
   DRegister value = locs()->in(0).fpu_reg();
 
-  BoxAllocationSlowPath::Allocate(
-      compiler, this, compiler->double_class(), out_reg, locs()->temp(0).reg());
+  BoxAllocationSlowPath::Allocate(compiler, this, compiler->double_class(),
+                                  out_reg, locs()->temp(0).reg());
   __ StoreDToOffset(value, out_reg, Double::value_offset() - kHeapObjectTag);
 }
 
 
-LocationSummary* UnboxInstr::MakeLocationSummary(Zone* zone,
-                                                       bool opt) const {
+LocationSummary* UnboxInstr::MakeLocationSummary(Zone* zone, bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   if (representation() == kUnboxedMint) {
     summary->set_out(0, Location::Pair(Location::RequiresRegister(),
@@ -3578,11 +3569,9 @@
   switch (representation()) {
     case kUnboxedMint: {
       PairLocation* result = locs()->out(0).AsPairLocation();
-      __ LoadFromOffset(result->At(0).reg(),
-                        box,
+      __ LoadFromOffset(result->At(0).reg(), box,
                         ValueOffset() - kHeapObjectTag);
-      __ LoadFromOffset(result->At(1).reg(),
-                        box,
+      __ LoadFromOffset(result->At(1).reg(), box,
                         ValueOffset() - kHeapObjectTag + kWordSize);
       break;
     }
@@ -3643,8 +3632,8 @@
     EmitSmiConversion(compiler);
   } else {
     const Register box = locs()->in(0).reg();
-    Label* deopt = compiler->AddDeoptStub(GetDeoptId(),
-                                          ICData::kDeoptCheckClass);
+    Label* deopt =
+        compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptCheckClass);
     Label is_smi;
 
     if ((value()->Type()->ToNullableCid() == box_cid) &&
@@ -3676,7 +3665,7 @@
          (from_representation() == kUnboxedUint32));
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(zone) LocationSummary(
+  LocationSummary* summary = new (zone) LocationSummary(
       zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_temp(0, Location::RequiresRegister());
@@ -3702,12 +3691,8 @@
       __ AndImmediate(CMPRES1, value, 0xC0000000);
       __ BranchEqual(CMPRES1, ZR, &done);
     }
-    BoxAllocationSlowPath::Allocate(
-        compiler,
-        this,
-        compiler->mint_class(),
-        out,
-        temp);
+    BoxAllocationSlowPath::Allocate(compiler, this, compiler->mint_class(), out,
+                                    temp);
     Register hi;
     if (from_representation() == kUnboxedInt32) {
       hi = temp;
@@ -3716,11 +3701,8 @@
       ASSERT(from_representation() == kUnboxedUint32);
       hi = ZR;
     }
-    __ StoreToOffset(value,
-                     out,
-                     Mint::value_offset() - kHeapObjectTag);
-    __ StoreToOffset(hi,
-                     out,
+    __ StoreToOffset(value, out, Mint::value_offset() - kHeapObjectTag);
+    __ StoreToOffset(hi, out,
                      Mint::value_offset() - kHeapObjectTag + kWordSize);
     __ Bind(&done);
   }
@@ -3731,12 +3713,10 @@
                                                     bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = ValueFitsSmi() ? 0 : 1;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone,
-      kNumInputs,
-      kNumTemps,
-      ValueFitsSmi() ? LocationSummary::kNoCall
-                     : LocationSummary::kCallOnSlowPath);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps,
+                      ValueFitsSmi() ? LocationSummary::kNoCall
+                                     : LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::Pair(Location::RequiresRegister(),
                                     Location::RequiresRegister()));
   if (!ValueFitsSmi()) {
@@ -3770,15 +3750,10 @@
   __ beq(tmp, value_hi, &done);
 
   __ Bind(&not_smi);
-  BoxAllocationSlowPath::Allocate(
-      compiler,
-      this,
-      compiler->mint_class(),
-      out_reg,
-      tmp);
+  BoxAllocationSlowPath::Allocate(compiler, this, compiler->mint_class(),
+                                  out_reg, tmp);
   __ StoreToOffset(value_lo, out_reg, Mint::value_offset() - kHeapObjectTag);
-  __ StoreToOffset(value_hi,
-                   out_reg,
+  __ StoreToOffset(value_hi, out_reg,
                    Mint::value_offset() - kHeapObjectTag + kWordSize);
   __ Bind(&done);
 }
@@ -3790,8 +3765,8 @@
          (representation() == kUnboxedUint32));
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -3804,9 +3779,7 @@
                               Label* deopt) {
   __ LoadFieldFromOffset(result, mint, Mint::value_offset());
   if (deopt != NULL) {
-    __ LoadFieldFromOffset(CMPRES1,
-                           mint,
-                           Mint::value_offset() + kWordSize);
+    __ LoadFieldFromOffset(CMPRES1, mint, Mint::value_offset() + kWordSize);
     __ sra(CMPRES2, result, kBitsPerWord - 1);
     __ BranchNotEqual(CMPRES1, CMPRES2, deopt);
   }
@@ -3817,8 +3790,10 @@
   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* deopt =
+      CanDeoptimize()
+          ? compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptUnboxInteger)
+          : NULL;
   Label* out_of_range = !is_truncating() ? deopt : NULL;
   ASSERT(value != out);
 
@@ -3850,8 +3825,8 @@
                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -3864,11 +3839,20 @@
   DRegister right = locs()->in(1).fpu_reg();
   DRegister result = locs()->out(0).fpu_reg();
   switch (op_kind()) {
-    case Token::kADD: __ addd(result, left, right); break;
-    case Token::kSUB: __ subd(result, left, right); break;
-    case Token::kMUL: __ muld(result, left, right); break;
-    case Token::kDIV: __ divd(result, left, right); break;
-    default: UNREACHABLE();
+    case Token::kADD:
+      __ addd(result, left, right);
+      break;
+    case Token::kSUB:
+      __ subd(result, left, right);
+      break;
+    case Token::kMUL:
+      __ muld(result, left, right);
+      break;
+    case Token::kDIV:
+      __ divd(result, left, right);
+      break;
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -3877,8 +3861,8 @@
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -3940,11 +3924,11 @@
 
 void DoubleTestOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Label is_true, is_false;
-  BranchLabels labels = { &is_true, &is_false, &is_false };
+  BranchLabels labels = {&is_true, &is_false, &is_false};
   Condition true_condition = EmitComparisonCode(compiler, labels);
   // Branches for isNaN are emitted in EmitComparisonCode already.
   if (op_kind() == MethodRecognizer::kDouble_getIsInfinite) {
-    EmitBranchOnCondition(compiler,  true_condition, labels);
+    EmitBranchOnCondition(compiler, true_condition, labels);
   }
   const Register result = locs()->out(0).reg();
   Label done;
@@ -3994,7 +3978,6 @@
 }
 
 
-
 LocationSummary* Simd32x4ShuffleMixInstr::MakeLocationSummary(Zone* zone,
                                                               bool opt) const {
   UNIMPLEMENTED();
@@ -4008,7 +3991,8 @@
 
 
 LocationSummary* Float32x4ConstructorInstr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -4147,7 +4131,7 @@
 
 
 void Simd64x2ShuffleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-    UNIMPLEMENTED();
+  UNIMPLEMENTED();
 }
 
 
@@ -4176,7 +4160,8 @@
 
 
 LocationSummary* Float64x2ConstructorInstr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -4188,7 +4173,8 @@
 
 
 LocationSummary* Float64x2ToFloat32x4Instr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -4200,7 +4186,8 @@
 
 
 LocationSummary* Float32x4ToFloat64x2Instr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -4235,8 +4222,8 @@
 }
 
 
-LocationSummary* Int32x4ConstructorInstr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+LocationSummary* Int32x4ConstructorInstr::MakeLocationSummary(Zone* zone,
+                                                              bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -4248,7 +4235,8 @@
 
 
 LocationSummary* Int32x4BoolConstructorInstr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -4337,8 +4325,8 @@
          (kind() == MathUnaryInstr::kDoubleSquare));
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -4359,10 +4347,11 @@
 
 
 LocationSummary* CaseInsensitiveCompareUC16Instr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, InputCount(), kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, InputCount(), kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(A0));
   summary->set_in(1, Location::RegisterLocation(A1));
   summary->set_in(2, Location::RegisterLocation(A2));
@@ -4374,7 +4363,6 @@
 
 void CaseInsensitiveCompareUC16Instr::EmitNativeCode(
     FlowGraphCompiler* compiler) {
-
   // Call the function.
   __ CallRuntime(TargetFunction(), TargetFunction().argument_count());
 }
@@ -4385,8 +4373,8 @@
   if (result_cid() == kDoubleCid) {
     const intptr_t kNumInputs = 2;
     const intptr_t kNumTemps = 1;
-    LocationSummary* summary = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresFpuRegister());
     summary->set_in(1, Location::RequiresFpuRegister());
     // Reuse the left register so that code can be made shorter.
@@ -4397,8 +4385,8 @@
   ASSERT(result_cid() == kSmiCid);
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   // Reuse the left register so that code can be made shorter.
@@ -4476,8 +4464,8 @@
                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   // We make use of 3-operand instructions by not requiring result register
   // to be identical to first input register as on Intel.
@@ -4510,8 +4498,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -4526,11 +4514,11 @@
 
 
 LocationSummary* Int32ToDoubleInstr::MakeLocationSummary(Zone* zone,
-                                                       bool opt) const {
+                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresRegister());
   result->set_out(0, Location::RequiresFpuRegister());
   return result;
@@ -4549,8 +4537,8 @@
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresRegister());
   result->set_out(0, Location::RequiresFpuRegister());
   return result;
@@ -4582,8 +4570,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* result = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   result->set_in(0, Location::RegisterLocation(T1));
   result->set_out(0, Location::RegisterLocation(V0));
   return result;
@@ -4615,13 +4603,10 @@
   const Function& target = Function::ZoneHandle(ic_data.GetTargetAt(0));
 
   const intptr_t kNumberOfArguments = 1;
-  compiler->GenerateStaticCall(deopt_id(),
-                               instance_call()->token_pos(),
-                               target,
+  compiler->GenerateStaticCall(deopt_id(), instance_call()->token_pos(), target,
                                kNumberOfArguments,
                                Object::null_array(),  // No argument names.
-                               locs(),
-                               ICData::Handle());
+                               locs(), ICData::Handle());
   __ Bind(&done);
 }
 
@@ -4630,8 +4615,8 @@
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::RequiresRegister());
   return result;
@@ -4669,8 +4654,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::SameAsFirstInput());
   return result;
@@ -4688,8 +4673,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::SameAsFirstInput());
   return result;
@@ -4709,8 +4694,8 @@
   // double arguments.
   ASSERT((InputCount() == 1) || (InputCount() == 2));
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(zone) LocationSummary(
-      zone, InputCount(), kNumTemps, LocationSummary::kCall);
+  LocationSummary* result = new (zone)
+      LocationSummary(zone, InputCount(), kNumTemps, LocationSummary::kCall);
   result->set_in(0, Location::FpuRegisterLocation(D6));
   if (InputCount() == 2) {
     result->set_in(1, Location::FpuRegisterLocation(D7));
@@ -4849,27 +4834,27 @@
   // Only use this instruction in optimized code.
   ASSERT(opt);
   const intptr_t kNumInputs = 1;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, 0, LocationSummary::kNoCall);
+  LocationSummary* summary =
+      new (zone) LocationSummary(zone, kNumInputs, 0, LocationSummary::kNoCall);
   if (representation() == kUnboxedDouble) {
     if (index() == 0) {
-      summary->set_in(0, Location::Pair(Location::RequiresFpuRegister(),
-                                        Location::Any()));
+      summary->set_in(
+          0, Location::Pair(Location::RequiresFpuRegister(), Location::Any()));
     } else {
       ASSERT(index() == 1);
-      summary->set_in(0, Location::Pair(Location::Any(),
-                                        Location::RequiresFpuRegister()));
+      summary->set_in(
+          0, Location::Pair(Location::Any(), Location::RequiresFpuRegister()));
     }
     summary->set_out(0, Location::RequiresFpuRegister());
   } else {
     ASSERT(representation() == kTagged);
     if (index() == 0) {
-      summary->set_in(0, Location::Pair(Location::RequiresRegister(),
-                                        Location::Any()));
+      summary->set_in(
+          0, Location::Pair(Location::RequiresRegister(), Location::Any()));
     } else {
       ASSERT(index() == 1);
-      summary->set_in(0, Location::Pair(Location::Any(),
-                                        Location::RequiresRegister()));
+      summary->set_in(
+          0, Location::Pair(Location::Any(), Location::RequiresRegister()));
     }
     summary->set_out(0, Location::RequiresRegister());
   }
@@ -4899,8 +4884,8 @@
   if (kind() == MergedMathInstr::kTruncDivMod) {
     const intptr_t kNumInputs = 2;
     const intptr_t kNumTemps = 1;
-    LocationSummary* summary = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     summary->set_in(1, Location::RequiresRegister());
     summary->set_temp(0, Location::RequiresRegister());
@@ -4975,13 +4960,13 @@
 
 
 LocationSummary* PolymorphicInstanceCallInstr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   return MakeCallSummary(zone);
 }
 
 
-LocationSummary* BranchInstr::MakeLocationSummary(Zone* zone,
-                                                  bool opt) const {
+LocationSummary* BranchInstr::MakeLocationSummary(Zone* zone, bool opt) const {
   comparison()->InitializeLocationSummary(zone, opt);
   // Branches don't produce a result.
   comparison()->locs()->set_out(0, Location::NoLocation());
@@ -5000,8 +4985,8 @@
   const intptr_t kNumInputs = 1;
   const bool need_mask_temp = IsDenseSwitch() && !IsDenseMask(ComputeCidMask());
   const intptr_t kNumTemps = !IsNullCheck() ? (need_mask_temp ? 2 : 1) : 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   if (!IsNullCheck()) {
     summary->set_temp(0, Location::RequiresRegister());
@@ -5014,8 +4999,7 @@
 
 
 void CheckClassInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label* deopt = compiler->AddDeoptStub(deopt_id(),
-                                        ICData::kDeoptCheckClass,
+  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckClass,
                                         licm_hoisted_ ? ICData::kHoisted : 0);
   if (IsNullCheck()) {
     if (DeoptIfNull()) {
@@ -5060,8 +5044,7 @@
     }
   } else {
     GrowableArray<CidTarget> sorted_ic_data;
-    FlowGraphCompiler::SortICDataByCount(unary_checks(),
-                                         &sorted_ic_data,
+    FlowGraphCompiler::SortICDataByCount(unary_checks(), &sorted_ic_data,
                                          /* drop_smi = */ true);
     const intptr_t num_checks = sorted_ic_data.length();
     for (intptr_t i = 0; i < num_checks; i++) {
@@ -5084,8 +5067,8 @@
                                                     bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   return summary;
 }
@@ -5094,8 +5077,7 @@
 void CheckSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   __ Comment("CheckSmiInstr");
   Register value = locs()->in(0).reg();
-  Label* deopt = compiler->AddDeoptStub(deopt_id(),
-                                        ICData::kDeoptCheckSmi,
+  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckSmi,
                                         licm_hoisted_ ? ICData::kHoisted : 0);
   __ BranchIfNotSmi(value, deopt);
 }
@@ -5105,8 +5087,8 @@
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   return summary;
 }
@@ -5123,7 +5105,7 @@
                                                              bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
+  LocationSummary* locs = new (zone) LocationSummary(
       zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   locs->set_in(kLengthPos, Location::RequiresRegister());
   locs->set_in(kIndexPos, Location::RequiresRegister());
@@ -5134,7 +5116,7 @@
 class RangeErrorSlowPath : public SlowPathCode {
  public:
   RangeErrorSlowPath(GenericCheckBoundInstr* instruction, intptr_t try_index)
-      : instruction_(instruction), try_index_(try_index) { }
+      : instruction_(instruction), try_index_(try_index) {}
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     if (Assembler::EmittingComments()) {
@@ -5146,11 +5128,8 @@
     __ Push(locs->in(1).reg());
     __ CallRuntime(kRangeErrorRuntimeEntry, 2);
     compiler->pc_descriptors_list()->AddDescriptor(
-        RawPcDescriptors::kOther,
-        compiler->assembler()->CodeSize(),
-        instruction_->deopt_id(),
-        instruction_->token_pos(),
-        try_index_);
+        RawPcDescriptors::kOther, compiler->assembler()->CodeSize(),
+        instruction_->deopt_id(), instruction_->token_pos(), try_index_);
     __ break_(0);
   }
 
@@ -5181,8 +5160,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(kLengthPos, Location::RegisterOrSmiConstant(length()));
   locs->set_in(kIndexPos, Location::RegisterOrSmiConstant(index()));
   return locs;
@@ -5192,10 +5171,8 @@
 void CheckArrayBoundInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   uint32_t flags = generalized_ ? ICData::kGeneralized : 0;
   flags |= licm_hoisted_ ? ICData::kHoisted : 0;
-  Label* deopt = compiler->AddDeoptStub(
-      deopt_id(),
-      ICData::kDeoptCheckArrayBound,
-      flags);
+  Label* deopt =
+      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckArrayBound, flags);
 
   Location length_loc = locs()->in(kLengthPos);
   Location index_loc = locs()->in(kIndexPos);
@@ -5242,8 +5219,8 @@
                                                         bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::Pair(Location::RequiresRegister(),
                                     Location::RequiresRegister()));
   summary->set_in(1, Location::Pair(Location::RequiresRegister(),
@@ -5281,9 +5258,9 @@
       break;
     }
     case Token::kBIT_XOR: {
-     __ xor_(out_lo, left_lo, right_lo);
-     __ xor_(out_hi, left_hi, right_hi);
-     break;
+      __ xor_(out_lo, left_lo, right_lo);
+      __ xor_(out_hi, left_hi, right_hi);
+      break;
     }
     case Token::kADD:
     case Token::kSUB: {
@@ -5336,8 +5313,8 @@
                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::Pair(Location::RequiresRegister(),
                                     Location::RequiresRegister()));
   summary->set_in(1, Location::WritableRegisterOrSmiConstant(right()));
@@ -5350,8 +5327,8 @@
 static const intptr_t kMintShiftCountLimit = 63;
 
 bool ShiftMintOpInstr::has_shift_count_check() const {
-  return !RangeUtils::IsWithin(
-      right()->definition()->range(), 0, kMintShiftCountLimit);
+  return !RangeUtils::IsWithin(right()->definition()->range(), 0,
+                               kMintShiftCountLimit);
 }
 
 
@@ -5438,7 +5415,7 @@
 
     // Deopt if shift is larger than 63 or less than 0.
     if (has_shift_count_check()) {
-      __ sltiu(CMPRES1, shift, Immediate(2*(kMintShiftCountLimit + 1)));
+      __ sltiu(CMPRES1, shift, Immediate(2 * (kMintShiftCountLimit + 1)));
       __ beq(CMPRES1, ZR, deopt);
       // Untag shift count.
       __ delay_slot()->SmiUntag(shift);
@@ -5522,8 +5499,8 @@
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::Pair(Location::RequiresRegister(),
                                     Location::RequiresRegister()));
   summary->set_out(0, Location::Pair(Location::RequiresRegister(),
@@ -5566,8 +5543,8 @@
                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresRegister());
@@ -5610,8 +5587,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RegisterOrSmiConstant(right()));
   summary->set_temp(0, Location::RequiresRegister());
@@ -5679,8 +5656,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -5705,8 +5682,8 @@
                                                                bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   if (from() == kUnboxedMint) {
     ASSERT((to() == kUnboxedUint32) || (to() == kUnboxedInt32));
     summary->set_in(0, Location::Pair(Location::RequiresRegister(),
@@ -5776,43 +5753,33 @@
 }
 
 
-LocationSummary* ThrowInstr::MakeLocationSummary(Zone* zone,
-                                                 bool opt) const {
-  return new(zone) LocationSummary(zone, 0, 0, LocationSummary::kCall);
+LocationSummary* ThrowInstr::MakeLocationSummary(Zone* zone, bool opt) const {
+  return new (zone) LocationSummary(zone, 0, 0, LocationSummary::kCall);
 }
 
 
-
 void ThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  compiler->GenerateRuntimeCall(token_pos(),
-                                deopt_id(),
-                                kThrowRuntimeEntry,
-                                1,
+  compiler->GenerateRuntimeCall(token_pos(), deopt_id(), kThrowRuntimeEntry, 1,
                                 locs());
   __ break_(0);
 }
 
 
-LocationSummary* ReThrowInstr::MakeLocationSummary(Zone* zone,
-                                                   bool opt) const {
-  return new(zone) LocationSummary(zone, 0, 0, LocationSummary::kCall);
+LocationSummary* ReThrowInstr::MakeLocationSummary(Zone* zone, bool opt) const {
+  return new (zone) LocationSummary(zone, 0, 0, LocationSummary::kCall);
 }
 
 
 void ReThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   compiler->SetNeedsStacktrace(catch_try_index());
-  compiler->GenerateRuntimeCall(token_pos(),
-                                deopt_id(),
-                                kReThrowRuntimeEntry,
-                                2,
-                                locs());
+  compiler->GenerateRuntimeCall(token_pos(), deopt_id(), kReThrowRuntimeEntry,
+                                2, locs());
   __ break_(0);
 }
 
 
-LocationSummary* StopInstr::MakeLocationSummary(Zone* zone,
-                                                bool opt) const {
-  return new(zone) LocationSummary(zone, 0, 0, LocationSummary::kNoCall);
+LocationSummary* StopInstr::MakeLocationSummary(Zone* zone, bool opt) const {
+  return new (zone) LocationSummary(zone, 0, 0, LocationSummary::kNoCall);
 }
 
 
@@ -5828,9 +5795,8 @@
 }
 
 
-LocationSummary* GotoInstr::MakeLocationSummary(Zone* zone,
-                                                bool opt) const {
-  return new(zone) LocationSummary(zone, 0, 0, LocationSummary::kNoCall);
+LocationSummary* GotoInstr::MakeLocationSummary(Zone* zone, bool opt) const {
+  return new (zone) LocationSummary(zone, 0, 0, LocationSummary::kNoCall);
 }
 
 
@@ -5842,8 +5808,7 @@
     }
     // Add a deoptimization descriptor for deoptimizing instructions that
     // may be inserted before this instruction.
-    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
-                                   GetDeoptId(),
+    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, GetDeoptId(),
                                    TokenPosition::kNoSource);
   }
   if (HasParallelMove()) {
@@ -5863,8 +5828,8 @@
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
 
-  LocationSummary* summary = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
 
   summary->set_in(0, Location::RequiresRegister());
   summary->set_temp(0, Location::RequiresRegister());
@@ -5877,14 +5842,13 @@
   Register target_reg = locs()->temp_slot(0)->reg();
 
   __ GetNextPC(target_reg, TMP);
-  const intptr_t entry_offset =
-     __ CodeSize() - 1 * Instr::kInstrSize;
+  const intptr_t entry_offset = __ CodeSize() - 1 * Instr::kInstrSize;
   __ AddImmediate(target_reg, target_reg, -entry_offset);
 
   // Add the offset.
   Register offset_reg = locs()->in(0).reg();
   if (offset()->definition()->representation() == kTagged) {
-  __ SmiUntag(offset_reg);
+    __ SmiUntag(offset_reg);
   }
   __ addu(target_reg, target_reg, offset_reg);
 
@@ -5898,15 +5862,15 @@
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
   if (needs_number_check()) {
-    LocationSummary* locs = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+    LocationSummary* locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
     locs->set_in(0, Location::RegisterLocation(A0));
     locs->set_in(1, Location::RegisterLocation(A1));
     locs->set_out(0, Location::RegisterLocation(A0));
     return locs;
   }
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RegisterOrConstant(left()));
   // Only one of the inputs can be a constant. Choose register if the first one
   // is a constant.
@@ -5925,20 +5889,14 @@
   ASSERT(!left.IsConstant() || !right.IsConstant());
   Condition true_condition;
   if (left.IsConstant()) {
-    true_condition = compiler->EmitEqualityRegConstCompare(right.reg(),
-                                                           left.constant(),
-                                                           needs_number_check(),
-                                                           token_pos());
+    true_condition = compiler->EmitEqualityRegConstCompare(
+        right.reg(), left.constant(), needs_number_check(), token_pos());
   } else if (right.IsConstant()) {
-    true_condition = compiler->EmitEqualityRegConstCompare(left.reg(),
-                                                           right.constant(),
-                                                           needs_number_check(),
-                                                           token_pos());
+    true_condition = compiler->EmitEqualityRegConstCompare(
+        left.reg(), right.constant(), needs_number_check(), token_pos());
   } else {
-    true_condition = compiler->EmitEqualityRegRegCompare(left.reg(),
-                                                         right.reg(),
-                                                         needs_number_check(),
-                                                         token_pos());
+    true_condition = compiler->EmitEqualityRegRegCompare(
+        left.reg(), right.reg(), needs_number_check(), token_pos());
   }
   if (kind() != Token::kEQ_STRICT) {
     ASSERT(kind() == Token::kNE_STRICT);
@@ -5953,7 +5911,7 @@
   ASSERT(kind() == Token::kEQ_STRICT || kind() == Token::kNE_STRICT);
 
   Label is_true, is_false;
-  BranchLabels labels = { &is_true, &is_false, &is_false };
+  BranchLabels labels = {&is_true, &is_false, &is_false};
   Condition true_condition = EmitComparisonCode(compiler, labels);
   EmitBranchOnCondition(compiler, true_condition, labels);
 
@@ -5981,9 +5939,7 @@
 
 LocationSummary* BooleanNegateInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
-  return LocationSummary::Make(zone,
-                               1,
-                               Location::RequiresRegister(),
+  return LocationSummary::Make(zone, 1, Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
 
@@ -6010,9 +5966,7 @@
   const Code& stub = Code::ZoneHandle(
       compiler->zone(), StubCode::GetAllocationStubForClass(cls()));
   const StubEntry stub_entry(stub);
-  compiler->GenerateCall(token_pos(),
-                         stub_entry,
-                         RawPcDescriptors::kOther,
+  compiler->GenerateCall(token_pos(), stub_entry, RawPcDescriptors::kOther,
                          locs());
   compiler->AddStubCallTarget(stub);
   __ Drop(ArgumentCount());  // Discard arguments.
@@ -6027,12 +5981,12 @@
 }
 
 
-LocationSummary* GrowRegExpStackInstr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+LocationSummary* GrowRegExpStackInstr::MakeLocationSummary(Zone* zone,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(T0));
   locs->set_out(0, Location::RegisterLocation(T0));
   return locs;
@@ -6047,11 +6001,8 @@
   __ LoadObject(TMP, Object::null_object());
   __ sw(TMP, Address(SP, 1 * kWordSize));
   __ sw(typed_data, Address(SP, 0 * kWordSize));
-  compiler->GenerateRuntimeCall(TokenPosition::kNoSource,
-                                deopt_id(),
-                                kGrowRegExpStackRuntimeEntry,
-                                1,
-                                locs());
+  compiler->GenerateRuntimeCall(TokenPosition::kNoSource, deopt_id(),
+                                kGrowRegExpStackRuntimeEntry, 1, locs());
   __ lw(result, Address(SP, 1 * kWordSize));
   __ addiu(SP, SP, Immediate(2 * kWordSize));
 }
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc
index 4fc3b68..9510d28 100644
--- a/runtime/vm/intermediate_language_x64.cc
+++ b/runtime/vm/intermediate_language_x64.cc
@@ -28,8 +28,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(Zone* zone) {
-  LocationSummary* result = new(zone) LocationSummary(
-      zone, 0, 0, LocationSummary::kCall);
+  LocationSummary* result =
+      new (zone) LocationSummary(zone, 0, 0, LocationSummary::kCall);
   result->set_out(0, Location::RegisterLocation(RAX));
   return result;
 }
@@ -39,8 +39,8 @@
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::AnyOrConstant(value()));
   return locs;
 }
@@ -63,12 +63,11 @@
 }
 
 
-LocationSummary* ReturnInstr::MakeLocationSummary(Zone* zone,
-                                                  bool opt) const {
+LocationSummary* ReturnInstr::MakeLocationSummary(Zone* zone, bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RegisterLocation(RAX));
   return locs;
 }
@@ -111,18 +110,30 @@
 
 static Condition NegateCondition(Condition condition) {
   switch (condition) {
-    case EQUAL:         return NOT_EQUAL;
-    case NOT_EQUAL:     return EQUAL;
-    case LESS:          return GREATER_EQUAL;
-    case LESS_EQUAL:    return GREATER;
-    case GREATER:       return LESS_EQUAL;
-    case GREATER_EQUAL: return LESS;
-    case BELOW:         return ABOVE_EQUAL;
-    case BELOW_EQUAL:   return ABOVE;
-    case ABOVE:         return BELOW_EQUAL;
-    case ABOVE_EQUAL:   return BELOW;
-    case PARITY_EVEN:   return PARITY_ODD;
-    case PARITY_ODD:    return PARITY_EVEN;
+    case EQUAL:
+      return NOT_EQUAL;
+    case NOT_EQUAL:
+      return EQUAL;
+    case LESS:
+      return GREATER_EQUAL;
+    case LESS_EQUAL:
+      return GREATER;
+    case GREATER:
+      return LESS_EQUAL;
+    case GREATER_EQUAL:
+      return LESS;
+    case BELOW:
+      return ABOVE_EQUAL;
+    case BELOW_EQUAL:
+      return ABOVE;
+    case ABOVE:
+      return BELOW_EQUAL;
+    case ABOVE_EQUAL:
+      return BELOW;
+    case PARITY_EVEN:
+      return PARITY_ODD;
+    case PARITY_ODD:
+      return PARITY_EVEN;
     default:
       UNIMPLEMENTED();
       return EQUAL;
@@ -154,7 +165,7 @@
   __ xorq(RDX, RDX);
 
   // Emit comparison code. This must not overwrite the result register.
-  BranchLabels labels = { NULL, NULL, NULL };
+  BranchLabels labels = {NULL, NULL, NULL};
   Condition true_condition = comparison()->EmitComparisonCode(compiler, labels);
 
   const bool is_power_of_two_kind = IsPowerOfTwoKind(if_true_, if_false_);
@@ -186,8 +197,8 @@
     __ shlq(RDX, Immediate(shift + kSmiTagSize));
   } else {
     __ decq(RDX);
-    __ AndImmediate(RDX,
-        Immediate(Smi::RawValue(true_value) - Smi::RawValue(false_value)));
+    __ AndImmediate(
+        RDX, Immediate(Smi::RawValue(true_value) - Smi::RawValue(false_value)));
     if (false_value != 0) {
       __ AddImmediate(RDX, Immediate(Smi::RawValue(false_value)));
     }
@@ -199,10 +210,9 @@
                                                      bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t stack_index = (local().index() < 0)
-      ? kFirstLocalSlotFromFp - local().index()
-      : kParamEndSlotFromFp - local().index();
-  return LocationSummary::Make(zone,
-                               kNumInputs,
+                                   ? kFirstLocalSlotFromFp - local().index()
+                                   : kParamEndSlotFromFp - local().index();
+  return LocationSummary::Make(zone, kNumInputs,
                                Location::StackSlot(stack_index),
                                LocationSummary::kNoCall);
 }
@@ -217,9 +227,7 @@
 LocationSummary* StoreLocalInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(zone,
-                               kNumInputs,
-                               Location::SameAsFirstInput(),
+  return LocationSummary::Make(zone, kNumInputs, Location::SameAsFirstInput(),
                                LocationSummary::kNoCall);
 }
 
@@ -235,8 +243,7 @@
 LocationSummary* ConstantInstr::MakeLocationSummary(Zone* zone,
                                                     bool opt) const {
   const intptr_t kNumInputs = 0;
-  return LocationSummary::Make(zone,
-                               kNumInputs,
+  return LocationSummary::Make(zone, kNumInputs,
                                Assembler::IsSafe(value())
                                    ? Location::Constant(this)
                                    : Location::RequiresRegister(),
@@ -259,8 +266,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   switch (representation()) {
     case kUnboxedDouble:
       locs->set_out(0, Location::RequiresFpuRegister());
@@ -305,8 +312,8 @@
                                                             bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(RAX));  // Value.
   summary->set_in(1, Location::RegisterLocation(RDX));  // Type arguments.
   summary->set_out(0, Location::RegisterLocation(RAX));
@@ -318,8 +325,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(RAX));
   locs->set_out(0, Location::RegisterLocation(RAX));
   return locs;
@@ -348,11 +355,8 @@
   }
 
   __ pushq(reg);  // Push the source object.
-  compiler->GenerateRuntimeCall(token_pos,
-                                deopt_id,
-                                kNonBoolTypeErrorRuntimeEntry,
-                                1,
-                                locs);
+  compiler->GenerateRuntimeCall(token_pos, deopt_id,
+                                kNonBoolTypeErrorRuntimeEntry, 1, locs);
   // We should never return here.
   __ int3();
   __ Bind(&done);
@@ -370,12 +374,18 @@
 
 static Condition TokenKindToIntCondition(Token::Kind kind) {
   switch (kind) {
-    case Token::kEQ: return EQUAL;
-    case Token::kNE: return NOT_EQUAL;
-    case Token::kLT: return LESS;
-    case Token::kGT: return GREATER;
-    case Token::kLTE: return LESS_EQUAL;
-    case Token::kGTE: return GREATER_EQUAL;
+    case Token::kEQ:
+      return EQUAL;
+    case Token::kNE:
+      return NOT_EQUAL;
+    case Token::kLT:
+      return LESS;
+    case Token::kGT:
+      return GREATER;
+    case Token::kLTE:
+      return LESS_EQUAL;
+    case Token::kGTE:
+      return GREATER_EQUAL;
     default:
       UNREACHABLE();
       return OVERFLOW;
@@ -388,17 +398,17 @@
   const intptr_t kNumInputs = 2;
   if (operation_cid() == kMintCid) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* locs = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::RequiresRegister());
     locs->set_in(1, Location::RequiresRegister());
     locs->set_out(0, Location::RequiresRegister());
     return locs;
   }
   if (operation_cid() == kDoubleCid) {
-    const intptr_t kNumTemps =  0;
-    LocationSummary* locs = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    const intptr_t kNumTemps = 0;
+    LocationSummary* locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::RequiresFpuRegister());
     locs->set_in(1, Location::RequiresFpuRegister());
     locs->set_out(0, Location::RequiresRegister());
@@ -406,8 +416,8 @@
   }
   if (operation_cid() == kSmiCid) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* locs = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::RegisterOrConstant(left()));
     // Only one input can be a constant operand. The case of two constant
     // operands should be handled by constant propagation.
@@ -444,16 +454,26 @@
 
 static Condition FlipCondition(Condition condition) {
   switch (condition) {
-    case EQUAL:         return EQUAL;
-    case NOT_EQUAL:     return NOT_EQUAL;
-    case LESS:          return GREATER;
-    case LESS_EQUAL:    return GREATER_EQUAL;
-    case GREATER:       return LESS;
-    case GREATER_EQUAL: return LESS_EQUAL;
-    case BELOW:         return ABOVE;
-    case BELOW_EQUAL:   return ABOVE_EQUAL;
-    case ABOVE:         return BELOW;
-    case ABOVE_EQUAL:   return BELOW_EQUAL;
+    case EQUAL:
+      return EQUAL;
+    case NOT_EQUAL:
+      return NOT_EQUAL;
+    case LESS:
+      return GREATER;
+    case LESS_EQUAL:
+      return GREATER_EQUAL;
+    case GREATER:
+      return LESS;
+    case GREATER_EQUAL:
+      return LESS_EQUAL;
+    case BELOW:
+      return ABOVE;
+    case BELOW_EQUAL:
+      return ABOVE_EQUAL;
+    case ABOVE:
+      return BELOW;
+    case ABOVE_EQUAL:
+      return BELOW_EQUAL;
     default:
       UNIMPLEMENTED();
       return EQUAL;
@@ -505,12 +525,18 @@
 
 static Condition TokenKindToDoubleCondition(Token::Kind kind) {
   switch (kind) {
-    case Token::kEQ: return EQUAL;
-    case Token::kNE: return NOT_EQUAL;
-    case Token::kLT: return BELOW;
-    case Token::kGT: return ABOVE;
-    case Token::kLTE: return BELOW_EQUAL;
-    case Token::kGTE: return ABOVE_EQUAL;
+    case Token::kEQ:
+      return EQUAL;
+    case Token::kNE:
+      return NOT_EQUAL;
+    case Token::kLT:
+      return BELOW;
+    case Token::kGT:
+      return ABOVE;
+    case Token::kLTE:
+      return BELOW_EQUAL;
+    case Token::kGTE:
+      return ABOVE_EQUAL;
     default:
       UNREACHABLE();
       return OVERFLOW;
@@ -528,8 +554,8 @@
   __ comisd(left, right);
 
   Condition true_condition = TokenKindToDoubleCondition(kind);
-  Label* nan_result = (true_condition == NOT_EQUAL)
-      ? labels.true_label : labels.false_label;
+  Label* nan_result =
+      (true_condition == NOT_EQUAL) ? labels.true_label : labels.false_label;
   __ j(PARITY_EVEN, nan_result);
   return true_condition;
 }
@@ -550,9 +576,9 @@
   ASSERT((kind() == Token::kEQ) || (kind() == Token::kNE));
 
   Label is_true, is_false;
-  BranchLabels labels = { &is_true, &is_false, &is_false };
+  BranchLabels labels = {&is_true, &is_false, &is_false};
   Condition true_condition = EmitComparisonCode(compiler, labels);
-  EmitBranchOnCondition(compiler,  true_condition, labels);
+  EmitBranchOnCondition(compiler, true_condition, labels);
 
   Register result = locs()->out(0).reg();
   Label done;
@@ -575,12 +601,11 @@
 }
 
 
-LocationSummary* TestSmiInstr::MakeLocationSummary(Zone* zone,
-                                                   bool opt) const {
+LocationSummary* TestSmiInstr::MakeLocationSummary(Zone* zone, bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   // Only one input can be a constant operand. The case of two constant
   // operands should be handled by constant propagation.
@@ -595,8 +620,7 @@
   Location right = locs()->in(1);
   if (right.IsConstant()) {
     ASSERT(right.constant().IsSmi());
-    const int64_t imm =
-        reinterpret_cast<int64_t>(right.constant().raw());
+    const int64_t imm = reinterpret_cast<int64_t>(right.constant().raw());
     __ TestImmediate(left_reg, Immediate(imm));
   } else {
     __ testq(left_reg, right.reg());
@@ -620,13 +644,12 @@
 }
 
 
-
 LocationSummary* TestCidsInstr::MakeLocationSummary(Zone* zone,
                                                     bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   locs->set_temp(0, Location::RequiresRegister());
   locs->set_out(0, Location::RequiresRegister());
@@ -640,11 +663,11 @@
   Register val_reg = locs()->in(0).reg();
   Register cid_reg = locs()->temp(0).reg();
 
-  Label* deopt = CanDeoptimize()
-      ? compiler->AddDeoptStub(deopt_id(),
-                               ICData::kDeoptTestCids,
-                               licm_hoisted_ ? ICData::kHoisted : 0)
-      : NULL;
+  Label* deopt =
+      CanDeoptimize()
+          ? compiler->AddDeoptStub(deopt_id(), ICData::kDeoptTestCids,
+                                   licm_hoisted_ ? ICData::kHoisted : 0)
+          : NULL;
 
   const intptr_t true_result = (kind() == Token::kIS) ? 1 : 0;
   const ZoneGrowableArray<intptr_t>& data = cid_results();
@@ -657,7 +680,7 @@
     const intptr_t test_cid = data[i];
     ASSERT(test_cid != kSmiCid);
     result = data[i + 1] == true_result;
-    __ cmpq(cid_reg,  Immediate(test_cid));
+    __ cmpq(cid_reg, Immediate(test_cid));
     __ j(EQUAL, result ? labels.true_label : labels.false_label);
   }
   // No match found, deoptimize or false.
@@ -685,7 +708,7 @@
 void TestCidsInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register result_reg = locs()->out(0).reg();
   Label is_true, is_false, done;
-  BranchLabels labels = { &is_true, &is_false, &is_false };
+  BranchLabels labels = {&is_true, &is_false, &is_false};
   EmitComparisonCode(compiler, labels);
   __ Bind(&is_false);
   __ LoadObject(result_reg, Bool::False());
@@ -701,23 +724,23 @@
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
   if (operation_cid() == kDoubleCid) {
-    LocationSummary* summary = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresFpuRegister());
     summary->set_in(1, Location::RequiresFpuRegister());
     summary->set_out(0, Location::RequiresRegister());
     return summary;
   } else if (operation_cid() == kMintCid) {
-    LocationSummary* summary = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     summary->set_in(1, Location::RequiresRegister());
     summary->set_out(0, Location::RequiresRegister());
     return summary;
   }
   ASSERT(operation_cid() == kSmiCid);
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RegisterOrConstant(left()));
   // Only one input can be a constant operand. The case of two constant
   // operands should be handled by constant propagation.
@@ -742,7 +765,7 @@
 
 void RelationalOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Label is_true, is_false;
-  BranchLabels labels = { &is_true, &is_false, &is_false };
+  BranchLabels labels = {&is_true, &is_false, &is_false};
   Condition true_condition = EmitComparisonCode(compiler, labels);
   EmitBranchOnCondition(compiler, true_condition, labels);
 
@@ -780,8 +803,9 @@
   __ PushObject(Object::null_object());
   // Pass a pointer to the first argument in RAX.
   if (!function().HasOptionalParameters()) {
-    __ leaq(RAX, Address(RBP, (kParamEndSlotFromFp +
-                               function().NumParameters()) * kWordSize));
+    __ leaq(RAX,
+            Address(RBP, (kParamEndSlotFromFp + function().NumParameters()) *
+                             kWordSize));
   } else {
     __ leaq(RAX, Address(RBP, kFirstLocalSlotFromFp * kWordSize));
   }
@@ -792,15 +816,13 @@
     ExternalLabel label(NativeEntry::LinkNativeCallEntry());
     __ LoadNativeEntry(RBX, &label, kPatchable);
   } else {
-    stub_entry = (is_bootstrap_native()) ?
-        StubCode::CallBootstrapCFunction_entry() :
-        StubCode::CallNativeCFunction_entry();
+    stub_entry = (is_bootstrap_native())
+                     ? StubCode::CallBootstrapCFunction_entry()
+                     : StubCode::CallNativeCFunction_entry();
     const ExternalLabel label(reinterpret_cast<uword>(native_c_function()));
     __ LoadNativeEntry(RBX, &label, kNotPatchable);
   }
-  compiler->GenerateCall(token_pos(),
-                         *stub_entry,
-                         RawPcDescriptors::kOther,
+  compiler->GenerateCall(token_pos(), *stub_entry, RawPcDescriptors::kOther,
                          locs());
   __ popq(result);
 }
@@ -819,12 +841,11 @@
 
 
 LocationSummary* OneByteStringFromCharCodeInstr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   const intptr_t kNumInputs = 1;
   // TODO(fschneider): Allow immediate operands for the char code.
-  return LocationSummary::Make(zone,
-                               kNumInputs,
-                               Location::RequiresRegister(),
+  return LocationSummary::Make(zone, kNumInputs, Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
 
@@ -836,8 +857,7 @@
   Register result = locs()->out(0).reg();
 
   __ movq(result, Address(THR, Thread::predefined_symbols_address_offset()));
-  __ movq(result, Address(result,
-                          char_code,
+  __ movq(result, Address(result, char_code,
                           TIMES_HALF_WORD_SIZE,  // Char code is a smi.
                           Symbols::kNullCharCodeSymbolOffset * kWordSize));
 }
@@ -846,9 +866,7 @@
 LocationSummary* StringToCharCodeInstr::MakeLocationSummary(Zone* zone,
                                                             bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(zone,
-                               kNumInputs,
-                               Location::RequiresRegister(),
+  return LocationSummary::Make(zone, kNumInputs, Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
 
@@ -874,8 +892,8 @@
                                                              bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(RAX));
   summary->set_out(0, Location::RegisterLocation(RAX));
   return summary;
@@ -887,12 +905,8 @@
   __ pushq(array);
   const int kNumberOfArguments = 1;
   const Array& kNoArgumentNames = Object::null_array();
-  compiler->GenerateStaticCall(deopt_id(),
-                               token_pos(),
-                               CallFunction(),
-                               kNumberOfArguments,
-                               kNoArgumentNames,
-                               locs(),
+  compiler->GenerateStaticCall(deopt_id(), token_pos(), CallFunction(),
+                               kNumberOfArguments, kNoArgumentNames, locs(),
                                ICData::Handle());
   ASSERT(locs()->out(0).reg() == RAX);
 }
@@ -901,9 +915,7 @@
 LocationSummary* LoadUntaggedInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(zone,
-                               kNumInputs,
-                               Location::RequiresRegister(),
+  return LocationSummary::Make(zone, kNumInputs, Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
 
@@ -923,9 +935,7 @@
 LocationSummary* LoadClassIdInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(zone,
-                               kNumInputs,
-                               Location::RequiresRegister(),
+  return LocationSummary::Make(zone, kNumInputs, Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
 
@@ -1038,23 +1048,25 @@
                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   // The smi index is either untagged (element size == 1), or it is left smi
   // tagged (for all element sizes > 1).
   if (index_scale() == 1) {
-    locs->set_in(1, CanBeImmediateIndex(index(), class_id())
-                      ? Location::Constant(index()->definition()->AsConstant())
-                      : Location::WritableRegister());
+    locs->set_in(1,
+                 CanBeImmediateIndex(index(), class_id())
+                     ? Location::Constant(index()->definition()->AsConstant())
+                     : Location::WritableRegister());
   } else {
-    locs->set_in(1, CanBeImmediateIndex(index(), class_id())
-                      ? Location::Constant(index()->definition()->AsConstant())
-                      : Location::RequiresRegister());
+    locs->set_in(1,
+                 CanBeImmediateIndex(index(), class_id())
+                     ? Location::Constant(index()->definition()->AsConstant())
+                     : Location::RequiresRegister());
   }
-  if ((representation() == kUnboxedDouble)    ||
+  if ((representation() == kUnboxedDouble) ||
       (representation() == kUnboxedFloat32x4) ||
-      (representation() == kUnboxedInt32x4)   ||
+      (representation() == kUnboxedInt32x4) ||
       (representation() == kUnboxedFloat64x2)) {
     locs->set_out(0, Location::RequiresFpuRegister());
   } else {
@@ -1069,16 +1081,17 @@
   const Register array = locs()->in(0).reg();
   const Location index = locs()->in(1);
 
-  Address element_address = index.IsRegister()
-      ? Assembler::ElementAddressForRegIndex(
-            IsExternal(), class_id(), index_scale(), array, index.reg())
-      : Assembler::ElementAddressForIntIndex(
-            IsExternal(), class_id(), index_scale(),
-            array, Smi::Cast(index.constant()).Value());
+  Address element_address =
+      index.IsRegister()
+          ? Assembler::ElementAddressForRegIndex(
+                IsExternal(), class_id(), index_scale(), array, index.reg())
+          : Assembler::ElementAddressForIntIndex(
+                IsExternal(), class_id(), index_scale(), array,
+                Smi::Cast(index.constant()).Value());
 
-  if ((representation() == kUnboxedDouble)    ||
+  if ((representation() == kUnboxedDouble) ||
       (representation() == kUnboxedFloat32x4) ||
-      (representation() == kUnboxedInt32x4)   ||
+      (representation() == kUnboxedInt32x4) ||
       (representation() == kUnboxedFloat64x2)) {
     if ((index_scale() == 1) && index.IsRegister()) {
       __ SmiUntag(index.reg());
@@ -1091,7 +1104,7 @@
     } else if (class_id() == kTypedDataFloat64ArrayCid) {
       __ movsd(result, element_address);
     } else {
-      ASSERT((class_id() == kTypedDataInt32x4ArrayCid)   ||
+      ASSERT((class_id() == kTypedDataInt32x4ArrayCid) ||
              (class_id() == kTypedDataFloat32x4ArrayCid) ||
              (class_id() == kTypedDataFloat64x2ArrayCid));
       __ movups(result, element_address);
@@ -1123,7 +1136,7 @@
   if (representation() == kUnboxedMint) {
     ASSERT(class_id() == kTypedDataInt64ArrayCid);
     if ((index_scale() == 1) && index.IsRegister()) {
-    __ SmiUntag(index.reg());
+      __ SmiUntag(index.reg());
     }
     Register result = locs()->out(0).reg();
     __ movq(result, element_address);
@@ -1172,8 +1185,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   // The smi index is either untagged (element size == 1), or it is left smi
   // tagged (for all element sizes > 1).
@@ -1190,7 +1203,7 @@
   const Location index = locs()->in(1);
 
   Address element_address = Assembler::ElementAddressForRegIndex(
-        IsExternal(), class_id(), index_scale(), str, index.reg());
+      IsExternal(), class_id(), index_scale(), str, index.reg());
 
   if ((index_scale() == 1)) {
     __ SmiUntag(index.reg());
@@ -1200,19 +1213,31 @@
     case kOneByteStringCid:
     case kExternalOneByteStringCid:
       switch (element_count()) {
-        case 1: __ movzxb(result, element_address); break;
-        case 2: __ movzxw(result, element_address); break;
-        case 4: __ movl(result, element_address); break;
-        default: UNREACHABLE();
+        case 1:
+          __ movzxb(result, element_address);
+          break;
+        case 2:
+          __ movzxw(result, element_address);
+          break;
+        case 4:
+          __ movl(result, element_address);
+          break;
+        default:
+          UNREACHABLE();
       }
       __ SmiTag(result);
       break;
     case kTwoByteStringCid:
     case kExternalTwoByteStringCid:
       switch (element_count()) {
-        case 1: __ movzxw(result, element_address); break;
-        case 2: __ movl(result, element_address); break;
-        default: UNREACHABLE();
+        case 1:
+          __ movzxw(result, element_address);
+          break;
+        case 2:
+          __ movl(result, element_address);
+          break;
+        default:
+          UNREACHABLE();
       }
       __ SmiTag(result);
       break;
@@ -1265,25 +1290,27 @@
                                                         bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   // The smi index is either untagged (element size == 1), or it is left smi
   // tagged (for all element sizes > 1).
   if (index_scale() == 1) {
-    locs->set_in(1, CanBeImmediateIndex(index(), class_id())
-                      ? Location::Constant(index()->definition()->AsConstant())
-                      : Location::WritableRegister());
+    locs->set_in(1,
+                 CanBeImmediateIndex(index(), class_id())
+                     ? Location::Constant(index()->definition()->AsConstant())
+                     : Location::WritableRegister());
   } else {
-    locs->set_in(1, CanBeImmediateIndex(index(), class_id())
-                      ? Location::Constant(index()->definition()->AsConstant())
-                      : Location::RequiresRegister());
+    locs->set_in(1,
+                 CanBeImmediateIndex(index(), class_id())
+                     ? Location::Constant(index()->definition()->AsConstant())
+                     : Location::RequiresRegister());
   }
   switch (class_id()) {
     case kArrayCid:
       locs->set_in(2, ShouldEmitStoreBarrier()
-                        ? Location::WritableRegister()
-                        : Location::RegisterOrConstant(value()));
+                          ? Location::WritableRegister()
+                          : Location::RegisterOrConstant(value()));
       break;
     case kExternalTypedDataUint8ArrayCid:
     case kExternalTypedDataUint8ClampedArrayCid:
@@ -1328,12 +1355,13 @@
   const Register array = locs()->in(0).reg();
   const Location index = locs()->in(1);
 
-  Address element_address = index.IsRegister()
-      ? Assembler::ElementAddressForRegIndex(
-            IsExternal(), class_id(), index_scale(), array, index.reg())
-      : Assembler::ElementAddressForIntIndex(
-            IsExternal(), class_id(), index_scale(),
-            array, Smi::Cast(index.constant()).Value());
+  Address element_address =
+      index.IsRegister()
+          ? Assembler::ElementAddressForRegIndex(
+                IsExternal(), class_id(), index_scale(), array, index.reg())
+          : Assembler::ElementAddressForIntIndex(
+                IsExternal(), class_id(), index_scale(), array,
+                Smi::Cast(index.constant()).Value());
 
   if ((index_scale() == 1) && index.IsRegister()) {
     __ SmiUntag(index.reg());
@@ -1376,8 +1404,7 @@
         } else if (value < 0) {
           value = 0;
         }
-        __ movb(element_address,
-                Immediate(static_cast<int8_t>(value)));
+        __ movb(element_address, Immediate(static_cast<int8_t>(value)));
       } else {
         ASSERT(locs()->in(2).reg() == RAX);
         Label store_value, store_0xff;
@@ -1439,7 +1466,7 @@
 
   const bool emit_full_guard = !opt || (field_cid == kIllegalCid);
   const bool needs_value_cid_temp_reg =
-    (value_cid == kDynamicCid) && (emit_full_guard || (field_cid != kSmiCid));
+      (value_cid == kDynamicCid) && (emit_full_guard || (field_cid != kSmiCid));
   const bool needs_field_temp_reg = emit_full_guard;
 
   intptr_t num_temps = 0;
@@ -1450,8 +1477,8 @@
     num_temps++;
   }
 
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, num_temps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, num_temps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
 
   for (intptr_t i = 0; i < num_temps; i++) {
@@ -1472,7 +1499,8 @@
   if (field_cid == kDynamicCid) {
     if (Compiler::IsBackgroundCompilation()) {
       // Field state changed while compiling.
-      Compiler::AbortBackgroundCompilation(deopt_id(),
+      Compiler::AbortBackgroundCompilation(
+          deopt_id(),
           "GuardFieldClassInstr: field state changed while compiling");
     }
     ASSERT(!compiler->is_optimizing());
@@ -1489,16 +1517,19 @@
 
   const Register value_reg = locs()->in(0).reg();
 
-  const Register value_cid_reg = needs_value_cid_temp_reg ?
-      locs()->temp(0).reg() : kNoRegister;
+  const Register value_cid_reg =
+      needs_value_cid_temp_reg ? locs()->temp(0).reg() : kNoRegister;
 
-  const Register field_reg = needs_field_temp_reg ?
-      locs()->temp(locs()->temp_count() - 1).reg() : kNoRegister;
+  const Register field_reg = needs_field_temp_reg
+                                 ? locs()->temp(locs()->temp_count() - 1).reg()
+                                 : kNoRegister;
 
   Label ok, fail_label;
 
-  Label* deopt = compiler->is_optimizing() ?
-      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptGuardField) : NULL;
+  Label* deopt =
+      compiler->is_optimizing()
+          ? compiler->AddDeoptStub(deopt_id(), ICData::kDeoptGuardField)
+          : NULL;
 
   Label* fail = (deopt != NULL) ? deopt : &fail_label;
 
@@ -1506,8 +1537,8 @@
     __ LoadObject(field_reg, Field::ZoneHandle(field().Original()));
 
     FieldAddress field_cid_operand(field_reg, Field::guarded_cid_offset());
-    FieldAddress field_nullability_operand(
-        field_reg, Field::is_nullable_offset());
+    FieldAddress field_nullability_operand(field_reg,
+                                           Field::is_nullable_offset());
 
     if (value_cid == kDynamicCid) {
       LoadValueCid(compiler, value_cid_reg, value_reg);
@@ -1596,8 +1627,8 @@
   const intptr_t kNumInputs = 1;
   if (!opt || (field().guarded_list_length() == Field::kUnknownFixedLength)) {
     const intptr_t kNumTemps = 3;
-    LocationSummary* summary = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     // We need temporaries for field object, length offset and expected length.
     summary->set_temp(0, Location::RequiresRegister());
@@ -1605,8 +1636,8 @@
     summary->set_temp(2, Location::RequiresRegister());
     return summary;
   } else {
-    LocationSummary* summary = new(zone) LocationSummary(
-        zone, kNumInputs, 0, LocationSummary::kNoCall);
+    LocationSummary* summary = new (zone)
+        LocationSummary(zone, kNumInputs, 0, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     return summary;
   }
@@ -1618,15 +1649,18 @@
   if (field().guarded_list_length() == Field::kNoFixedLength) {
     if (Compiler::IsBackgroundCompilation()) {
       // Field state changed while compiling.
-      Compiler::AbortBackgroundCompilation(deopt_id(),
+      Compiler::AbortBackgroundCompilation(
+          deopt_id(),
           "GuardFieldLengthInstr: field state changed while compiling");
     }
     ASSERT(!compiler->is_optimizing());
     return;  // Nothing to emit.
   }
 
-  Label* deopt = compiler->is_optimizing() ?
-      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptGuardField) : NULL;
+  Label* deopt =
+      compiler->is_optimizing()
+          ? compiler->AddDeoptStub(deopt_id(), ICData::kDeoptGuardField)
+          : NULL;
 
   const Register value_reg = locs()->in(0).reg();
 
@@ -1640,10 +1674,12 @@
 
     __ LoadObject(field_reg, Field::ZoneHandle(field().Original()));
 
-    __ movsxb(offset_reg, FieldAddress(field_reg,
-        Field::guarded_list_length_in_object_offset_offset()));
-    __ movq(length_reg, FieldAddress(field_reg,
-        Field::guarded_list_length_offset()));
+    __ movsxb(
+        offset_reg,
+        FieldAddress(field_reg,
+                     Field::guarded_list_length_in_object_offset_offset()));
+    __ movq(length_reg,
+            FieldAddress(field_reg, Field::guarded_list_length_offset()));
 
     __ cmpq(offset_reg, Immediate(0));
     __ j(NEGATIVE, &ok);
@@ -1670,12 +1706,11 @@
     ASSERT(compiler->is_optimizing());
     ASSERT(field().guarded_list_length() >= 0);
     ASSERT(field().guarded_list_length_in_object_offset() !=
-        Field::kUnknownLengthOffset);
+           Field::kUnknownLengthOffset);
 
     __ CompareImmediate(
-            FieldAddress(value_reg,
-                         field().guarded_list_length_in_object_offset()),
-            Immediate(Smi::RawValue(field().guarded_list_length())));
+        FieldAddress(value_reg, field().guarded_list_length_in_object_offset()),
+        Immediate(Smi::RawValue(field().guarded_list_length())));
     __ j(NOT_EQUAL, deopt);
   }
 }
@@ -1686,19 +1721,16 @@
   BoxAllocationSlowPath(Instruction* instruction,
                         const Class& cls,
                         Register result)
-      : instruction_(instruction),
-        cls_(cls),
-        result_(result) { }
+      : instruction_(instruction), cls_(cls), result_(result) {}
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     if (Assembler::EmittingComments()) {
-      __ Comment("%s slow path allocation of %s",
-                 instruction_->DebugName(),
+      __ Comment("%s slow path allocation of %s", instruction_->DebugName(),
                  String::Handle(cls_.ScrubbedName()).ToCString());
     }
     __ Bind(entry_label());
-    const Code& stub = Code::ZoneHandle(compiler->zone(),
-        StubCode::GetAllocationStubForClass(cls_));
+    const Code& stub = Code::ZoneHandle(
+        compiler->zone(), StubCode::GetAllocationStubForClass(cls_));
     const StubEntry stub_entry(stub);
 
     LocationSummary* locs = instruction_->locs();
@@ -1707,9 +1739,7 @@
 
     compiler->SaveLiveRegisters(locs);
     compiler->GenerateCall(TokenPosition::kNoSource,  // No token position.
-                           stub_entry,
-                           RawPcDescriptors::kOther,
-                           locs);
+                           stub_entry, RawPcDescriptors::kOther, locs);
     compiler->AddStubCallTarget(stub);
     __ MoveRegister(result_, RAX);
     compiler->RestoreLiveRegisters(locs);
@@ -1722,20 +1752,14 @@
                        Register result,
                        Register temp) {
     if (compiler->intrinsic_mode()) {
-      __ TryAllocate(cls,
-                     compiler->intrinsic_slow_path_label(),
-                     Assembler::kFarJump,
-                     result,
-                     temp);
+      __ TryAllocate(cls, compiler->intrinsic_slow_path_label(),
+                     Assembler::kFarJump, result, temp);
     } else {
       BoxAllocationSlowPath* slow_path =
           new BoxAllocationSlowPath(instruction, cls, result);
       compiler->AddSlowPathCode(slow_path);
 
-      __ TryAllocate(cls,
-                     slow_path->entry_label(),
-                     Assembler::kFarJump,
-                     result,
+      __ TryAllocate(cls, slow_path->entry_label(), Assembler::kFarJump, result,
                      temp);
       __ Bind(slow_path->exit_label());
     }
@@ -1752,14 +1776,13 @@
                                                               bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps =
-      (IsUnboxedStore() && opt) ? 2 :
-          ((IsPotentialUnboxedStore()) ? 3 : 0);
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps,
-          ((IsUnboxedStore() && opt && is_initialization()) ||
-           IsPotentialUnboxedStore())
-          ? LocationSummary::kCallOnSlowPath
-          : LocationSummary::kNoCall);
+      (IsUnboxedStore() && opt) ? 2 : ((IsPotentialUnboxedStore()) ? 3 : 0);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps,
+                      ((IsUnboxedStore() && opt && is_initialization()) ||
+                       IsPotentialUnboxedStore())
+                          ? LocationSummary::kCallOnSlowPath
+                          : LocationSummary::kNoCall);
 
   summary->set_in(0, Location::RequiresRegister());
   if (IsUnboxedStore() && opt) {
@@ -1767,17 +1790,16 @@
     summary->set_temp(0, Location::RequiresRegister());
     summary->set_temp(1, Location::RequiresRegister());
   } else if (IsPotentialUnboxedStore()) {
-    summary->set_in(1, ShouldEmitStoreBarrier()
-        ? Location::WritableRegister()
-        :  Location::RequiresRegister());
+    summary->set_in(1, ShouldEmitStoreBarrier() ? Location::WritableRegister()
+                                                : Location::RequiresRegister());
     summary->set_temp(0, Location::RequiresRegister());
     summary->set_temp(1, Location::RequiresRegister());
     summary->set_temp(2, opt ? Location::RequiresFpuRegister()
                              : Location::FpuRegisterLocation(XMM1));
   } else {
     summary->set_in(1, ShouldEmitStoreBarrier()
-                       ? Location::WritableRegister()
-                       : Location::RegisterOrConstant(value()));
+                           ? Location::WritableRegister()
+                           : Location::RegisterOrConstant(value()));
   }
   return summary;
 }
@@ -1796,9 +1818,7 @@
   __ j(NOT_EQUAL, &done);
   BoxAllocationSlowPath::Allocate(compiler, instruction, cls, box_reg, temp);
   __ movq(temp, box_reg);
-  __ StoreIntoObject(instance_reg,
-                     FieldAddress(instance_reg, offset),
-                     temp);
+  __ StoreIntoObject(instance_reg, FieldAddress(instance_reg, offset), temp);
 
   __ Bind(&done);
 }
@@ -1835,8 +1855,7 @@
       BoxAllocationSlowPath::Allocate(compiler, this, *cls, temp, temp2);
       __ movq(temp2, temp);
       __ StoreIntoObject(instance_reg,
-                         FieldAddress(instance_reg, offset_in_bytes_),
-                         temp2);
+                         FieldAddress(instance_reg, offset_in_bytes_), temp2);
     } else {
       __ movq(temp, FieldAddress(instance_reg, offset_in_bytes_));
     }
@@ -1852,7 +1871,7 @@
       case kFloat64x2Cid:
         __ Comment("UnboxedFloat64x2StoreInstanceFieldInstr");
         __ movups(FieldAddress(temp, Float64x2::value_offset()), value);
-      break;
+        break;
       default:
         UNREACHABLE();
     }
@@ -1908,13 +1927,8 @@
 
     {
       __ Bind(&store_double);
-      EnsureMutableBox(compiler,
-                       this,
-                       temp,
-                       compiler->double_class(),
-                       instance_reg,
-                       offset_in_bytes_,
-                       temp2);
+      EnsureMutableBox(compiler, this, temp, compiler->double_class(),
+                       instance_reg, offset_in_bytes_, temp2);
       __ movsd(fpu_temp, FieldAddress(value_reg, Double::value_offset()));
       __ movsd(FieldAddress(temp, Double::value_offset()), fpu_temp);
       __ jmp(&skip_store);
@@ -1922,13 +1936,8 @@
 
     {
       __ Bind(&store_float32x4);
-      EnsureMutableBox(compiler,
-                       this,
-                       temp,
-                       compiler->float32x4_class(),
-                       instance_reg,
-                       offset_in_bytes_,
-                       temp2);
+      EnsureMutableBox(compiler, this, temp, compiler->float32x4_class(),
+                       instance_reg, offset_in_bytes_, temp2);
       __ movups(fpu_temp, FieldAddress(value_reg, Float32x4::value_offset()));
       __ movups(FieldAddress(temp, Float32x4::value_offset()), fpu_temp);
       __ jmp(&skip_store);
@@ -1936,13 +1945,8 @@
 
     {
       __ Bind(&store_float64x2);
-      EnsureMutableBox(compiler,
-                       this,
-                       temp,
-                       compiler->float64x2_class(),
-                       instance_reg,
-                       offset_in_bytes_,
-                       temp2);
+      EnsureMutableBox(compiler, this, temp, compiler->float64x2_class(),
+                       instance_reg, offset_in_bytes_, temp2);
       __ movups(fpu_temp, FieldAddress(value_reg, Float64x2::value_offset()));
       __ movups(FieldAddress(temp, Float64x2::value_offset()), fpu_temp);
       __ jmp(&skip_store);
@@ -1954,8 +1958,7 @@
   if (ShouldEmitStoreBarrier()) {
     Register value_reg = locs()->in(1).reg();
     __ StoreIntoObject(instance_reg,
-                       FieldAddress(instance_reg, offset_in_bytes_),
-                       value_reg,
+                       FieldAddress(instance_reg, offset_in_bytes_), value_reg,
                        CanValueBeSmi());
   } else {
     if (locs()->in(1).IsConstant()) {
@@ -1965,8 +1968,8 @@
     } else {
       Register value_reg = locs()->in(1).reg();
       __ StoreIntoObjectNoBarrier(instance_reg,
-          FieldAddress(instance_reg, offset_in_bytes_),
-          value_reg);
+                                  FieldAddress(instance_reg, offset_in_bytes_),
+                                  value_reg);
     }
   }
   __ Bind(&skip_store);
@@ -1977,8 +1980,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -1999,8 +2002,8 @@
 
 LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(Zone* zone,
                                                             bool opt) const {
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, 1, 1, LocationSummary::kNoCall);
+  LocationSummary* locs =
+      new (zone) LocationSummary(zone, 1, 1, LocationSummary::kNoCall);
   locs->set_in(0, value()->NeedsStoreBuffer() ? Location::WritableRegister()
                                               : Location::RequiresRegister());
   locs->set_temp(0, Location::RequiresRegister());
@@ -2014,10 +2017,8 @@
 
   __ LoadObject(temp, Field::ZoneHandle(Z, field().Original()));
   if (this->value()->NeedsStoreBuffer()) {
-    __ StoreIntoObject(temp,
-                       FieldAddress(temp, Field::static_value_offset()),
-                       value,
-                       CanValueBeSmi());
+    __ StoreIntoObject(temp, FieldAddress(temp, Field::static_value_offset()),
+                       value, CanValueBeSmi());
   } else {
     __ StoreIntoObjectNoBarrier(
         temp, FieldAddress(temp, Field::static_value_offset()), value);
@@ -2029,8 +2030,8 @@
                                                       bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(RAX));
   summary->set_in(1, Location::RegisterLocation(RDX));
   summary->set_out(0, Location::RegisterLocation(RAX));
@@ -2042,10 +2043,7 @@
   ASSERT(locs()->in(0).reg() == RAX);  // Value.
   ASSERT(locs()->in(1).reg() == RDX);  // Instantiator type arguments.
 
-  compiler->GenerateInstanceOf(token_pos(),
-                               deopt_id(),
-                               type(),
-                               negate_result(),
+  compiler->GenerateInstanceOf(token_pos(), deopt_id(), type(), negate_result(),
                                locs());
   ASSERT(locs()->out(0).reg() == RAX);
 }
@@ -2057,8 +2055,8 @@
                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(RBX));
   locs->set_in(1, Location::RegisterLocation(R10));
   locs->set_out(0, Location::RegisterLocation(RAX));
@@ -2068,28 +2066,26 @@
 
 // Inlines array allocation for known constant values.
 static void InlineArrayAllocation(FlowGraphCompiler* compiler,
-                                   intptr_t num_elements,
-                                   Label* slow_path,
-                                   Label* done) {
+                                  intptr_t num_elements,
+                                  Label* slow_path,
+                                  Label* done) {
   const int kInlineArraySize = 12;  // Same as kInlineInstanceSize.
   const Register kLengthReg = R10;
   const Register kElemTypeReg = RBX;
   const intptr_t instance_size = Array::InstanceSize(num_elements);
 
   __ TryAllocateArray(kArrayCid, instance_size, slow_path, Assembler::kFarJump,
-                      RAX,  // instance
-                      RCX,  // end address
+                      RAX,   // instance
+                      RCX,   // end address
                       R13);  // temp
 
   // RAX: new object start as a tagged pointer.
   // Store the type argument field.
-  __ StoreIntoObjectNoBarrier(RAX,
-                              FieldAddress(RAX, Array::type_arguments_offset()),
-                              kElemTypeReg);
+  __ StoreIntoObjectNoBarrier(
+      RAX, FieldAddress(RAX, Array::type_arguments_offset()), kElemTypeReg);
 
   // Set the length field.
-  __ StoreIntoObjectNoBarrier(RAX,
-                              FieldAddress(RAX, Array::length_offset()),
+  __ StoreIntoObjectNoBarrier(RAX, FieldAddress(RAX, Array::length_offset()),
                               kLengthReg);
 
   // Initialize all array elements to raw_null.
@@ -2129,8 +2125,7 @@
   ASSERT(locs()->in(1).reg() == kLengthReg);
 
   Label slow_path, done;
-  if (compiler->is_optimizing() &&
-      !FLAG_precompiled_mode &&
+  if (compiler->is_optimizing() && !FLAG_precompiled_mode &&
       num_elements()->BindsToConstant() &&
       num_elements()->BoundConstant().IsSmi()) {
     const intptr_t length = Smi::Cast(num_elements()->BoundConstant()).Value();
@@ -2141,11 +2136,8 @@
       __ PushObject(Object::null_object());  // Make room for the result.
       __ pushq(kLengthReg);
       __ pushq(kElemTypeReg);
-      compiler->GenerateRuntimeCall(token_pos(),
-                                    deopt_id(),
-                                    kAllocateArrayRuntimeEntry,
-                                    2,
-                                    locs());
+      compiler->GenerateRuntimeCall(token_pos(), deopt_id(),
+                                    kAllocateArrayRuntimeEntry, 2, locs());
       __ Drop(2);
       __ popq(kResultReg);
       __ Bind(&done);
@@ -2157,10 +2149,8 @@
   const Code& stub = Code::ZoneHandle(compiler->zone(),
                                       StubCode::AllocateArray_entry()->code());
   compiler->AddStubCallTarget(stub);
-  compiler->GenerateCall(token_pos(),
-                         *StubCode::AllocateArray_entry(),
-                         RawPcDescriptors::kOther,
-                         locs());
+  compiler->GenerateCall(token_pos(), *StubCode::AllocateArray_entry(),
+                         RawPcDescriptors::kOther, locs());
   __ Bind(&done);
   ASSERT(locs()->out(0).reg() == kResultReg);
 }
@@ -2170,13 +2160,11 @@
                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps =
-      (IsUnboxedLoad() && opt) ? 1 :
-          ((IsPotentialUnboxedLoad()) ? 2 : 0);
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps,
-          (opt && !IsPotentialUnboxedLoad())
-          ? LocationSummary::kNoCall
-          : LocationSummary::kCallOnSlowPath);
+      (IsUnboxedLoad() && opt) ? 1 : ((IsPotentialUnboxedLoad()) ? 2 : 0);
+  LocationSummary* locs = new (zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, (opt && !IsPotentialUnboxedLoad())
+                                       ? LocationSummary::kNoCall
+                                       : LocationSummary::kCallOnSlowPath);
 
   locs->set_in(0, Location::RequiresRegister());
 
@@ -2257,8 +2245,8 @@
 
     {
       __ Bind(&load_double);
-      BoxAllocationSlowPath::Allocate(
-          compiler, this, compiler->double_class(), result, temp);
+      BoxAllocationSlowPath::Allocate(compiler, this, compiler->double_class(),
+                                      result, temp);
       __ movq(temp, FieldAddress(instance_reg, offset_in_bytes()));
       __ movsd(value, FieldAddress(temp, Double::value_offset()));
       __ movsd(FieldAddress(result, Double::value_offset()), value);
@@ -2296,8 +2284,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(RAX));
   locs->set_out(0, Location::RegisterLocation(RAX));
   return locs;
@@ -2313,23 +2301,21 @@
   __ PushObject(Object::null_object());  // Make room for the result.
   __ PushObject(type());
   __ pushq(instantiator_reg);  // Push instantiator type arguments.
-  compiler->GenerateRuntimeCall(token_pos(),
-                                deopt_id(),
-                                kInstantiateTypeRuntimeEntry,
-                                2,
-                                locs());
-  __ Drop(2);  // Drop instantiator and uninstantiated type.
+  compiler->GenerateRuntimeCall(token_pos(), deopt_id(),
+                                kInstantiateTypeRuntimeEntry, 2, locs());
+  __ Drop(2);           // Drop instantiator and uninstantiated type.
   __ popq(result_reg);  // Pop instantiated type.
   ASSERT(instantiator_reg == result_reg);
 }
 
 
 LocationSummary* InstantiateTypeArgumentsInstr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(RAX));
   locs->set_out(0, Location::RegisterLocation(RAX));
   return locs;
@@ -2384,12 +2370,10 @@
   __ PushObject(Object::null_object());  // Make room for the result.
   __ PushObject(type_arguments());
   __ pushq(instantiator_reg);  // Push instantiator type arguments.
-  compiler->GenerateRuntimeCall(token_pos(),
-                                deopt_id(),
-                                kInstantiateTypeArgumentsRuntimeEntry,
-                                2,
+  compiler->GenerateRuntimeCall(token_pos(), deopt_id(),
+                                kInstantiateTypeArgumentsRuntimeEntry, 2,
                                 locs());
-  __ Drop(2);  // Drop instantiator and uninstantiated type arguments.
+  __ Drop(2);           // Drop instantiator and uninstantiated type arguments.
   __ popq(result_reg);  // Pop instantiated type arguments.
   __ Bind(&type_arguments_instantiated);
   ASSERT(instantiator_reg == result_reg);
@@ -2402,7 +2386,7 @@
   ASSERT(opt);
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 2;
-  LocationSummary* locs = new(zone) LocationSummary(
+  LocationSummary* locs = new (zone) LocationSummary(
       zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   locs->set_temp(0, Location::RegisterLocation(R10));
   locs->set_temp(1, Location::RegisterLocation(R13));
@@ -2415,7 +2399,7 @@
  public:
   explicit AllocateContextSlowPath(
       AllocateUninitializedContextInstr* instruction)
-      : instruction_(instruction) { }
+      : instruction_(instruction) {}
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     __ Comment("AllocateContextSlowPath");
@@ -2432,8 +2416,7 @@
     compiler->AddStubCallTarget(stub);
     compiler->GenerateCall(instruction_->token_pos(),
                            *StubCode::AllocateContext_entry(),
-                           RawPcDescriptors::kOther,
-                           locs);
+                           RawPcDescriptors::kOther, locs);
     ASSERT(instruction_->locs()->out(0).reg() == RAX);
     compiler->RestoreLiveRegisters(instruction_->locs());
     __ jmp(exit_label());
@@ -2457,7 +2440,7 @@
   __ TryAllocateArray(kContextCid, instance_size, slow_path->entry_label(),
                       Assembler::kFarJump,
                       result,  // instance
-                      temp,  // end address
+                      temp,    // end address
                       locs()->temp(1).reg());
 
   // Setup up number of context variables field.
@@ -2472,8 +2455,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 1;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_temp(0, Location::RegisterLocation(R10));
   locs->set_out(0, Location::RegisterLocation(RAX));
   return locs;
@@ -2485,10 +2468,8 @@
   ASSERT(locs()->out(0).reg() == RAX);
 
   __ LoadImmediate(R10, Immediate(num_context_variables()));
-  compiler->GenerateCall(token_pos(),
-                         *StubCode::AllocateContext_entry(),
-                         RawPcDescriptors::kOther,
-                         locs());
+  compiler->GenerateCall(token_pos(), *StubCode::AllocateContext_entry(),
+                         RawPcDescriptors::kOther, locs());
 }
 
 
@@ -2496,8 +2477,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(RAX));
   locs->set_temp(0, Location::RegisterLocation(RCX));
   return locs;
@@ -2520,11 +2501,8 @@
   __ Bind(&call_runtime);
   __ PushObject(Object::null_object());  // Make room for (unused) result.
   __ pushq(field);
-  compiler->GenerateRuntimeCall(token_pos(),
-                                deopt_id(),
-                                kInitStaticFieldRuntimeEntry,
-                                1,
-                                locs());
+  compiler->GenerateRuntimeCall(token_pos(), deopt_id(),
+                                kInitStaticFieldRuntimeEntry, 1, locs());
   __ Drop(2);  // Remove argument and unused result.
   __ Bind(&no_call);
 }
@@ -2534,8 +2512,8 @@
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(RAX));
   locs->set_out(0, Location::RegisterLocation(RAX));
   return locs;
@@ -2548,11 +2526,8 @@
 
   __ PushObject(Object::null_object());  // Make room for the result.
   __ pushq(context_value);
-  compiler->GenerateRuntimeCall(token_pos(),
-                                deopt_id(),
-                                kCloneContextRuntimeEntry,
-                                1,
-                                locs());
+  compiler->GenerateRuntimeCall(token_pos(), deopt_id(),
+                                kCloneContextRuntimeEntry, 1, locs());
   __ popq(result);  // Remove argument.
   __ popq(result);  // Get result (cloned context).
 }
@@ -2567,19 +2542,16 @@
 
 void CatchBlockEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   __ Bind(compiler->GetJumpLabel(this));
-  compiler->AddExceptionHandler(catch_try_index(),
-                                try_index(),
+  compiler->AddExceptionHandler(catch_try_index(), try_index(),
                                 compiler->assembler()->CodeSize(),
-                                catch_handler_types_,
-                                needs_stacktrace());
+                                catch_handler_types_, needs_stacktrace());
   // On lazy deoptimization we patch the optimized code here to enter the
   // deoptimization stub.
   const intptr_t deopt_id = Thread::ToDeoptAfter(GetDeoptId());
   if (compiler->is_optimizing()) {
     compiler->AddDeoptIndexAtCall(deopt_id);
   } else {
-    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
-                                   deopt_id,
+    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, deopt_id,
                                    TokenPosition::kNoSource);
   }
   if (HasParallelMove()) {
@@ -2644,10 +2616,8 @@
                                                               bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs,
-                          kNumTemps,
-                          LocationSummary::kCallOnSlowPath);
+  LocationSummary* summary = new (zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   summary->set_temp(0, Location::RequiresRegister());
   return summary;
 }
@@ -2656,7 +2626,7 @@
 class CheckStackOverflowSlowPath : public SlowPathCode {
  public:
   explicit CheckStackOverflowSlowPath(CheckStackOverflowInstr* instruction)
-      : instruction_(instruction) { }
+      : instruction_(instruction) {}
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     if (FLAG_use_osr && osr_entry_label()->IsLinked()) {
@@ -2673,11 +2643,9 @@
     ASSERT(compiler->pending_deoptimization_env_ == NULL);
     Environment* env = compiler->SlowPathEnvironmentFor(instruction_);
     compiler->pending_deoptimization_env_ = env;
-    compiler->GenerateRuntimeCall(instruction_->token_pos(),
-                                  instruction_->deopt_id(),
-                                  kStackOverflowRuntimeEntry,
-                                  0,
-                                  instruction_->locs());
+    compiler->GenerateRuntimeCall(
+        instruction_->token_pos(), instruction_->deopt_id(),
+        kStackOverflowRuntimeEntry, 0, instruction_->locs());
 
     if (FLAG_use_osr && !compiler->is_optimizing() && instruction_->in_loop()) {
       // In unoptimized code, record loop stack checks as possible OSR entries.
@@ -2734,9 +2702,10 @@
   Register left = locs.in(0).reg();
   Register result = locs.out(0).reg();
   ASSERT(left == result);
-  Label* deopt = shift_left->CanDeoptimize() ?
-      compiler->AddDeoptStub(shift_left->deopt_id(), ICData::kDeoptBinarySmiOp)
-      : NULL;
+  Label* deopt = shift_left->CanDeoptimize()
+                     ? compiler->AddDeoptStub(shift_left->deopt_id(),
+                                              ICData::kDeoptBinarySmiOp)
+                     : NULL;
   if (locs.in(1).IsConstant()) {
     const Object& constant = locs.in(1).constant();
     ASSERT(constant.IsSmi());
@@ -2782,8 +2751,8 @@
       const bool right_needs_check =
           !RangeUtils::IsWithin(right_range, 0, max_right - 1);
       if (right_needs_check) {
-        __ CompareImmediate(right,
-            Immediate(reinterpret_cast<int64_t>(Smi::New(max_right))));
+        __ CompareImmediate(
+            right, Immediate(reinterpret_cast<int64_t>(Smi::New(max_right))));
         __ j(ABOVE_EQUAL, deopt);
       }
       __ SmiUntag(right);
@@ -2805,8 +2774,8 @@
         __ j(NEGATIVE, deopt);
       }
       Label done, is_not_zero;
-      __ CompareImmediate(right,
-          Immediate(reinterpret_cast<int64_t>(Smi::New(Smi::kBits))));
+      __ CompareImmediate(
+          right, Immediate(reinterpret_cast<int64_t>(Smi::New(Smi::kBits))));
       __ j(BELOW, &is_not_zero, Assembler::kNearJump);
       __ xorq(left, left);
       __ jmp(&done, Assembler::kNearJump);
@@ -2821,8 +2790,8 @@
   } else {
     if (right_needs_check) {
       ASSERT(shift_left->CanDeoptimize());
-      __ CompareImmediate(right,
-          Immediate(reinterpret_cast<int64_t>(Smi::New(Smi::kBits))));
+      __ CompareImmediate(
+          right, Immediate(reinterpret_cast<int64_t>(Smi::New(Smi::kBits))));
       __ j(ABOVE_EQUAL, deopt);
     }
     // Left is not a constant.
@@ -2844,7 +2813,7 @@
 class CheckedSmiSlowPath : public SlowPathCode {
  public:
   CheckedSmiSlowPath(CheckedSmiOpInstr* instruction, intptr_t try_index)
-      : instruction_(instruction), try_index_(try_index) { }
+      : instruction_(instruction), try_index_(try_index) {}
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     if (Assembler::EmittingComments()) {
@@ -2859,12 +2828,9 @@
     __ pushq(locs->in(0).reg());
     __ pushq(locs->in(1).reg());
     compiler->EmitMegamorphicInstanceCall(
-        *instruction_->call()->ic_data(),
-        instruction_->call()->ArgumentCount(),
-        instruction_->call()->deopt_id(),
-        instruction_->call()->token_pos(),
-        locs,
-        try_index_,
+        *instruction_->call()->ic_data(), instruction_->call()->ArgumentCount(),
+        instruction_->call()->deopt_id(), instruction_->call()->token_pos(),
+        locs, try_index_,
         /* slow_path_argument_count = */ 2);
     __ MoveRegister(result, RAX);
     compiler->RestoreLiveRegisters(locs);
@@ -2879,9 +2845,10 @@
 
 LocationSummary* CheckedSmiOpInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
+  bool is_shift = (op_kind() == Token::kSHL) || (op_kind() == Token::kSHR);
   const intptr_t kNumInputs = 2;
-  const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
+  const intptr_t kNumTemps = is_shift ? 1 : 0;
+  LocationSummary* summary = new (zone) LocationSummary(
       zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
@@ -2889,6 +2856,8 @@
     case Token::kADD:
     case Token::kSUB:
     case Token::kMUL:
+    case Token::kSHL:
+    case Token::kSHR:
       summary->set_out(0, Location::RequiresRegister());
       break;
     case Token::kBIT_OR:
@@ -2899,6 +2868,9 @@
     default:
       UNIMPLEMENTED();
   }
+  if (is_shift) {
+    summary->set_temp(0, Location::RegisterLocation(RCX));
+  }
   return summary;
 }
 
@@ -2955,6 +2927,36 @@
       ASSERT(left == result);
       __ xorq(result, right);
       break;
+    case Token::kSHL:
+      ASSERT(result != right);
+      ASSERT(locs()->temp(0).reg() == RCX);
+      __ cmpq(right, Immediate(Smi::RawValue(Smi::kBits)));
+      __ j(ABOVE_EQUAL, slow_path->entry_label());
+
+      __ movq(RCX, right);
+      __ SmiUntag(RCX);
+      __ movq(result, left);
+      __ shlq(result, RCX);
+      __ movq(TMP, result);
+      __ sarq(TMP, RCX);
+      __ cmpq(TMP, left);
+      __ j(NOT_EQUAL, slow_path->entry_label());
+      break;
+    case Token::kSHR: {
+      Label shift_count_ok;
+      ASSERT(result != right);
+      ASSERT(locs()->temp(0).reg() == RCX);
+      __ cmpq(right, Immediate(Smi::RawValue(Smi::kBits)));
+      __ j(ABOVE_EQUAL, slow_path->entry_label());
+
+      __ movq(RCX, right);
+      __ SmiUntag(RCX);
+      __ movq(result, left);
+      __ SmiUntag(result);
+      __ sarq(result, RCX);
+      __ SmiTag(result);
+      break;
+    }
     default:
       UNIMPLEMENTED();
   }
@@ -2971,7 +2973,7 @@
       : instruction_(instruction),
         try_index_(try_index),
         labels_(labels),
-        merged_(merged) { }
+        merged_(merged) {}
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     if (Assembler::EmittingComments()) {
@@ -2986,21 +2988,18 @@
     __ pushq(locs->in(0).reg());
     __ pushq(locs->in(1).reg());
     compiler->EmitMegamorphicInstanceCall(
-        *instruction_->call()->ic_data(),
-        instruction_->call()->ArgumentCount(),
-        instruction_->call()->deopt_id(),
-        instruction_->call()->token_pos(),
-        locs,
-        try_index_,
+        *instruction_->call()->ic_data(), instruction_->call()->ArgumentCount(),
+        instruction_->call()->deopt_id(), instruction_->call()->token_pos(),
+        locs, try_index_,
         /* slow_path_argument_count = */ 2);
     __ MoveRegister(result, RAX);
     compiler->RestoreLiveRegisters(locs);
     if (merged_) {
       __ CompareObject(result, Bool::True());
-      __ j(EQUAL, instruction_->is_negated()
-                  ? labels_.false_label : labels_.true_label);
-      __ jmp(instruction_->is_negated()
-             ? labels_.true_label : labels_.false_label);
+      __ j(EQUAL, instruction_->is_negated() ? labels_.false_label
+                                             : labels_.true_label);
+      __ jmp(instruction_->is_negated() ? labels_.true_label
+                                        : labels_.false_label);
     } else {
       __ jmp(exit_label());
     }
@@ -3015,10 +3014,11 @@
 
 
 LocationSummary* CheckedSmiComparisonInstr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(zone) LocationSummary(
+  LocationSummary* summary = new (zone) LocationSummary(
       zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
@@ -3029,12 +3029,13 @@
 
 
 Condition CheckedSmiComparisonInstr::EmitComparisonCode(
-    FlowGraphCompiler* compiler, BranchLabels labels) {
+    FlowGraphCompiler* compiler,
+    BranchLabels labels) {
   return EmitInt64ComparisonOp(compiler, *locs(), kind());
 }
 
 
-#define EMIT_SMI_CHECK \
+#define EMIT_SMI_CHECK                                                         \
   intptr_t left_cid = left()->Type()->ToCid();                                 \
   intptr_t right_cid = right()->Type()->ToCid();                               \
   Register left = locs()->in(0).reg();                                         \
@@ -3056,11 +3057,9 @@
 void CheckedSmiComparisonInstr::EmitBranchCode(FlowGraphCompiler* compiler,
                                                BranchInstr* branch) {
   BranchLabels labels = compiler->CreateBranchLabels(branch);
-  CheckedSmiComparisonSlowPath* slow_path =
-      new CheckedSmiComparisonSlowPath(this,
-                                       compiler->CurrentTryIndex(),
-                                       labels,
-                                       /* merged = */ true);
+  CheckedSmiComparisonSlowPath* slow_path = new CheckedSmiComparisonSlowPath(
+      this, compiler->CurrentTryIndex(), labels,
+      /* merged = */ true);
   compiler->AddSlowPathCode(slow_path);
   EMIT_SMI_CHECK;
   Condition true_condition = EmitComparisonCode(compiler, labels);
@@ -3071,12 +3070,10 @@
 
 void CheckedSmiComparisonInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Label true_label, false_label, done;
-  BranchLabels labels = { &true_label, &false_label, &false_label };
-  CheckedSmiComparisonSlowPath* slow_path =
-      new CheckedSmiComparisonSlowPath(this,
-                                       compiler->CurrentTryIndex(),
-                                       labels,
-                                       /* merged = */ false);
+  BranchLabels labels = {&true_label, &false_label, &false_label};
+  CheckedSmiComparisonSlowPath* slow_path = new CheckedSmiComparisonSlowPath(
+      this, compiler->CurrentTryIndex(), labels,
+      /* merged = */ false);
   compiler->AddSlowPathCode(slow_path);
   EMIT_SMI_CHECK;
   Condition true_condition = EmitComparisonCode(compiler, labels);
@@ -3094,7 +3091,7 @@
 
 static bool CanBeImmediate(const Object& constant) {
   return constant.IsSmi() &&
-    Immediate(reinterpret_cast<int64_t>(constant.raw())).is_int32();
+         Immediate(reinterpret_cast<int64_t>(constant.raw())).is_int32();
 }
 
 static bool IsSmiValue(const Object& constant, intptr_t value) {
@@ -3107,15 +3104,12 @@
   const intptr_t kNumInputs = 2;
 
   ConstantInstr* right_constant = right()->definition()->AsConstant();
-  if ((right_constant != NULL) &&
-      (op_kind() != Token::kTRUNCDIV) &&
-      (op_kind() != Token::kSHL) &&
-      (op_kind() != Token::kMUL) &&
-      (op_kind() != Token::kMOD) &&
-      CanBeImmediate(right_constant->value())) {
+  if ((right_constant != NULL) && (op_kind() != Token::kTRUNCDIV) &&
+      (op_kind() != Token::kSHL) && (op_kind() != Token::kMUL) &&
+      (op_kind() != Token::kMOD) && CanBeImmediate(right_constant->value())) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* summary = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     summary->set_in(1, Location::Constant(right_constant));
     summary->set_out(0, Location::SameAsFirstInput());
@@ -3124,8 +3118,8 @@
 
   if (op_kind() == Token::kTRUNCDIV) {
     const intptr_t kNumTemps = 1;
-    LocationSummary* summary = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     if (RightIsPowerOfTwoConstant()) {
       summary->set_in(0, Location::RequiresRegister());
       ConstantInstr* right_constant = right()->definition()->AsConstant();
@@ -3143,8 +3137,8 @@
     return summary;
   } else if (op_kind() == Token::kMOD) {
     const intptr_t kNumTemps = 1;
-    LocationSummary* summary = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     // Both inputs must be writable because they will be untagged.
     summary->set_in(0, Location::RegisterLocation(RDX));
     summary->set_in(1, Location::WritableRegister());
@@ -3154,8 +3148,8 @@
     return summary;
   } else if (op_kind() == Token::kSHR) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* summary = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), RCX));
     summary->set_out(0, Location::SameAsFirstInput());
@@ -3165,8 +3159,8 @@
     const bool shiftBy1 =
         (right_constant != NULL) && IsSmiValue(right_constant->value(), 1);
     const intptr_t kNumTemps = (can_overflow() && !shiftBy1) ? 1 : 0;
-    LocationSummary* summary = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), RCX));
     if (kNumTemps == 1) {
@@ -3176,8 +3170,8 @@
     return summary;
   } else {
     const intptr_t kNumTemps = 0;
-    LocationSummary* summary = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     ConstantInstr* constant = right()->definition()->AsConstant();
     if (constant != NULL) {
@@ -3266,8 +3260,8 @@
         // sarq operation masks the count to 6 bits.
         const intptr_t kCountLimit = 0x3F;
         const intptr_t value = Smi::Cast(constant).Value();
-        __ sarq(left, Immediate(
-            Utils::Minimum(value + kSmiTagSize, kCountLimit)));
+        __ sarq(left,
+                Immediate(Utils::Minimum(value + kSmiTagSize, kCountLimit)));
         __ SmiTag(left);
         break;
       }
@@ -3393,7 +3387,7 @@
       __ Bind(&not_32bit);
       __ SmiUntag(left);
       __ SmiUntag(right);
-      __ cqo();  // Sign extend RAX -> RDX:RAX.
+      __ cqo();         // Sign extend RAX -> RDX:RAX.
       __ idivq(right);  //  RAX: quotient, RDX: remainder.
       // Check the corner case of dividing the 'MIN_SMI' with -1, in which
       // case we cannot tag the result.
@@ -3441,7 +3435,7 @@
       __ SmiUntag(left);
       __ SmiUntag(right);
       __ movq(RAX, RDX);
-      __ cqo();  // Sign extend RAX -> RDX:RAX.
+      __ cqo();         // Sign extend RAX -> RDX:RAX.
       __ idivq(right);  //  RAX: quotient, RDX: remainder.
       __ Bind(&div_done);
       //  res = left % right;
@@ -3523,12 +3517,11 @@
   intptr_t right_cid = right()->Type()->ToCid();
   ASSERT((left_cid != kDoubleCid) && (right_cid != kDoubleCid));
   const intptr_t kNumInputs = 2;
-  const bool need_temp = (left()->definition() != right()->definition())
-                      && (left_cid != kSmiCid)
-                      && (right_cid != kSmiCid);
+  const bool need_temp = (left()->definition() != right()->definition()) &&
+                         (left_cid != kSmiCid) && (right_cid != kSmiCid);
   const intptr_t kNumTemps = need_temp ? 1 : 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-    zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   if (need_temp) summary->set_temp(0, Location::RequiresRegister());
@@ -3537,9 +3530,9 @@
 
 
 void CheckEitherNonSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label* deopt = compiler->AddDeoptStub(deopt_id(),
-                                        ICData::kDeoptBinaryDoubleOp,
-                                        licm_hoisted_ ? ICData::kHoisted : 0);
+  Label* deopt =
+      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryDoubleOp,
+                             licm_hoisted_ ? ICData::kHoisted : 0);
   intptr_t left_cid = left()->Type()->ToCid();
   intptr_t right_cid = right()->Type()->ToCid();
   Register left = locs()->in(0).reg();
@@ -3560,11 +3553,10 @@
 }
 
 
-LocationSummary* BoxInstr::MakeLocationSummary(Zone* zone,
-                                                     bool opt) const {
+LocationSummary* BoxInstr::MakeLocationSummary(Zone* zone, bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(zone) LocationSummary(
+  LocationSummary* summary = new (zone) LocationSummary(
       zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_temp(0, Location::RequiresRegister());
@@ -3578,9 +3570,9 @@
   Register temp = locs()->temp(0).reg();
   XmmRegister value = locs()->in(0).fpu_reg();
 
-  BoxAllocationSlowPath::Allocate(
-      compiler, this, compiler->BoxClassFor(from_representation()), out_reg,
-      temp);
+  BoxAllocationSlowPath::Allocate(compiler, this,
+                                  compiler->BoxClassFor(from_representation()),
+                                  out_reg, temp);
   __ movsd(FieldAddress(out_reg, Double::value_offset()), value);
   switch (from_representation()) {
     case kUnboxedDouble:
@@ -3598,15 +3590,14 @@
 }
 
 
-LocationSummary* UnboxInstr::MakeLocationSummary(Zone* zone,
-                                                 bool opt) const {
+LocationSummary* UnboxInstr::MakeLocationSummary(Zone* zone, 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(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, needs_writable_input ? Location::WritableRegister()
                                           : Location::RequiresRegister());
   if (representation() == kUnboxedMint) {
@@ -3684,8 +3675,8 @@
     EmitSmiConversion(compiler);
   } else {
     const Register box = locs()->in(0).reg();
-    Label* deopt = compiler->AddDeoptStub(GetDeoptId(),
-                                          ICData::kDeoptCheckClass);
+    Label* deopt =
+        compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptCheckClass);
     Label is_smi;
 
     if ((value()->Type()->ToNullableCid() == box_cid) &&
@@ -3716,8 +3707,8 @@
                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = (!is_truncating() && CanDeoptimize()) ? 1 : 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   if (kNumTemps > 0) {
@@ -3730,8 +3721,10 @@
 void UnboxInteger32Instr::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;
+  Label* deopt =
+      CanDeoptimize()
+          ? compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptUnboxInteger)
+          : NULL;
   ASSERT(value == locs()->out(0).reg());
 
   if (value_cid == kSmiCid) {
@@ -3772,16 +3765,13 @@
 
 
 LocationSummary* BoxInteger32Instr::MakeLocationSummary(Zone* zone,
-                                                   bool opt) const {
+                                                        bool opt) const {
   ASSERT((from_representation() == kUnboxedInt32) ||
          (from_representation() == kUnboxedUint32));
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone,
-      kNumInputs,
-      kNumTemps,
-      LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -3808,12 +3798,10 @@
                                                     bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = ValueFitsSmi() ? 0 : 1;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone,
-      kNumInputs,
-      kNumTemps,
-      ValueFitsSmi() ? LocationSummary::kNoCall
-                     : LocationSummary::kCallOnSlowPath);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps,
+                      ValueFitsSmi() ? LocationSummary::kNoCall
+                                     : LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresRegister());
   if (!ValueFitsSmi()) {
     summary->set_temp(0, Location::RequiresRegister());
@@ -3832,8 +3820,8 @@
     const Register temp = locs()->temp(0).reg();
     Label done;
     __ j(NO_OVERFLOW, &done);
-    BoxAllocationSlowPath::Allocate(
-        compiler, this, compiler->mint_class(), out, temp);
+    BoxAllocationSlowPath::Allocate(compiler, this, compiler->mint_class(), out,
+                                    temp);
     __ movq(FieldAddress(out, Mint::value_offset()), value);
     __ Bind(&done);
   }
@@ -3844,8 +3832,8 @@
                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -3860,11 +3848,20 @@
   ASSERT(locs()->out(0).fpu_reg() == left);
 
   switch (op_kind()) {
-    case Token::kADD: __ addsd(left, right); break;
-    case Token::kSUB: __ subsd(left, right); break;
-    case Token::kMUL: __ mulsd(left, right); break;
-    case Token::kDIV: __ divsd(left, right); break;
-    default: UNREACHABLE();
+    case Token::kADD:
+      __ addsd(left, right);
+      break;
+    case Token::kSUB:
+      __ subsd(left, right);
+      break;
+    case Token::kMUL:
+      __ mulsd(left, right);
+      break;
+    case Token::kDIV:
+      __ divsd(left, right);
+      break;
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -3874,8 +3871,8 @@
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps =
       (op_kind() == MethodRecognizer::kDouble_getIsInfinite) ? 1 : 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   if (op_kind() == MethodRecognizer::kDouble_getIsInfinite) {
     summary->set_temp(0, Location::RequiresRegister());
@@ -3921,9 +3918,9 @@
 
 void DoubleTestOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Label is_true, is_false;
-  BranchLabels labels = { &is_true, &is_false, &is_false };
+  BranchLabels labels = {&is_true, &is_false, &is_false};
   Condition true_condition = EmitComparisonCode(compiler, labels);
-  EmitBranchOnCondition(compiler,  true_condition, labels);
+  EmitBranchOnCondition(compiler, true_condition, labels);
 
   Register result = locs()->out(0).reg();
   Label done;
@@ -3940,8 +3937,8 @@
                                                              bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -3956,11 +3953,20 @@
   ASSERT(locs()->out(0).fpu_reg() == left);
 
   switch (op_kind()) {
-    case Token::kADD: __ addps(left, right); break;
-    case Token::kSUB: __ subps(left, right); break;
-    case Token::kMUL: __ mulps(left, right); break;
-    case Token::kDIV: __ divps(left, right); break;
-    default: UNREACHABLE();
+    case Token::kADD:
+      __ addps(left, right);
+      break;
+    case Token::kSUB:
+      __ subps(left, right);
+      break;
+    case Token::kMUL:
+      __ mulps(left, right);
+      break;
+    case Token::kDIV:
+      __ divps(left, right);
+      break;
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -3969,8 +3975,8 @@
                                                              bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -3985,11 +3991,20 @@
   ASSERT(locs()->out(0).fpu_reg() == left);
 
   switch (op_kind()) {
-    case Token::kADD: __ addpd(left, right); break;
-    case Token::kSUB: __ subpd(left, right); break;
-    case Token::kMUL: __ mulpd(left, right); break;
-    case Token::kDIV: __ divpd(left, right); break;
-    default: UNREACHABLE();
+    case Token::kADD:
+      __ addpd(left, right);
+      break;
+    case Token::kSUB:
+      __ subpd(left, right);
+      break;
+    case Token::kMUL:
+      __ mulpd(left, right);
+      break;
+    case Token::kDIV:
+      __ divpd(left, right);
+      break;
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -3998,8 +4013,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4032,7 +4047,8 @@
     case MethodRecognizer::kInt32x4Shuffle:
       __ shufps(value, value, Immediate(mask_));
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -4041,8 +4057,8 @@
                                                               bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -4060,7 +4076,8 @@
     case MethodRecognizer::kInt32x4ShuffleMix:
       __ shufps(left, right, Immediate(mask_));
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -4069,8 +4086,8 @@
                                                                bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -4087,11 +4104,12 @@
 
 
 LocationSummary* Float32x4ConstructorInstr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   const intptr_t kNumInputs = 4;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_in(2, Location::RequiresFpuRegister());
@@ -4128,8 +4146,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
 }
@@ -4145,8 +4163,8 @@
                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4167,8 +4185,8 @@
                                                                bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -4202,7 +4220,8 @@
       __ cmppsle(left, right);
       break;
 
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -4211,8 +4230,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -4233,7 +4252,8 @@
     case MethodRecognizer::kFloat32x4Max:
       __ maxps(left, right);
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -4242,8 +4262,8 @@
                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -4263,7 +4283,8 @@
       __ shufps(left, left, Immediate(0x00));
       __ mulps(left, right);
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -4272,8 +4293,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4295,7 +4316,8 @@
     case MethodRecognizer::kFloat32x4ReciprocalSqrt:
       __ rsqrtps(left);
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -4304,8 +4326,8 @@
                                                             bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4323,7 +4345,8 @@
     case MethodRecognizer::kFloat32x4Absolute:
       __ absps(left);
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -4332,8 +4355,8 @@
                                                           bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_in(2, Location::RequiresFpuRegister());
@@ -4356,8 +4379,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -4416,7 +4439,8 @@
       __ movups(replacement, Address(RSP, 0));
       __ AddImmediate(RSP, Immediate(16));
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -4425,8 +4449,8 @@
                                                               bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4442,8 +4466,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4461,7 +4485,8 @@
     case MethodRecognizer::kFloat64x2GetY:
       __ shufpd(value, value, Immediate(0x33));
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -4470,8 +4495,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
 }
@@ -4487,8 +4512,8 @@
                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4502,11 +4527,12 @@
 
 
 LocationSummary* Float64x2ConstructorInstr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -4526,11 +4552,12 @@
 
 
 LocationSummary* Float64x2ToFloat32x4Instr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4544,11 +4571,12 @@
 
 
 LocationSummary* Float32x4ToFloat64x2Instr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4565,8 +4593,8 @@
                                                             bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   if (representation() == kTagged) {
     ASSERT(op_kind() == MethodRecognizer::kFloat64x2GetSignMask);
@@ -4599,7 +4627,8 @@
       __ movmskpd(locs()->out(0).reg(), left);
       __ SmiTag(locs()->out(0).reg());
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -4608,8 +4637,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -4653,17 +4682,18 @@
     case MethodRecognizer::kFloat64x2Max:
       __ maxpd(left, right);
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
 
-LocationSummary* Int32x4ConstructorInstr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+LocationSummary* Int32x4ConstructorInstr::MakeLocationSummary(Zone* zone,
+                                                              bool opt) const {
   const intptr_t kNumInputs = 4;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   summary->set_in(2, Location::RequiresRegister());
@@ -4690,11 +4720,12 @@
 
 
 LocationSummary* Int32x4BoolConstructorInstr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   const intptr_t kNumInputs = 4;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   summary->set_in(2, Location::RequiresRegister());
@@ -4763,8 +4794,8 @@
                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -4792,7 +4823,8 @@
     case MethodRecognizer::kInt32x4GetFlagW:
       __ movl(result, Address(RSP, 12));
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
   __ AddImmediate(RSP, Immediate(16));
   __ testl(result, result);
@@ -4809,8 +4841,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_in(2, Location::RequiresFpuRegister());
@@ -4844,8 +4876,8 @@
                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresRegister());
   summary->set_temp(0, Location::RequiresRegister());
@@ -4873,7 +4905,7 @@
       __ Bind(&falsePath);
       __ LoadImmediate(temp, Immediate(0x0));
       __ movl(Address(RSP, 0), temp);
-    break;
+      break;
     case MethodRecognizer::kInt32x4WithFlagY:
       __ LoadImmediate(temp, Immediate(0xFFFFFFFF));
       __ movl(Address(RSP, 4), temp);
@@ -4881,7 +4913,7 @@
       __ Bind(&falsePath);
       __ LoadImmediate(temp, Immediate(0x0));
       __ movl(Address(RSP, 4), temp);
-    break;
+      break;
     case MethodRecognizer::kInt32x4WithFlagZ:
       __ LoadImmediate(temp, Immediate(0xFFFFFFFF));
       __ movl(Address(RSP, 8), temp);
@@ -4889,7 +4921,7 @@
       __ Bind(&falsePath);
       __ LoadImmediate(temp, Immediate(0x0));
       __ movl(Address(RSP, 8), temp);
-    break;
+      break;
     case MethodRecognizer::kInt32x4WithFlagW:
       __ LoadImmediate(temp, Immediate(0xFFFFFFFF));
       __ movl(Address(RSP, 12), temp);
@@ -4897,8 +4929,9 @@
       __ Bind(&falsePath);
       __ LoadImmediate(temp, Immediate(0x0));
       __ movl(Address(RSP, 12), temp);
-    break;
-    default: UNREACHABLE();
+      break;
+    default:
+      UNREACHABLE();
   }
   __ Bind(&exitPath);
   // Copy mask back to register.
@@ -4911,8 +4944,8 @@
                                                               bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4928,8 +4961,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -4960,7 +4993,8 @@
     case Token::kSUB:
       __ subpl(left, right);
       break;
-    default: UNREACHABLE();
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -4971,8 +5005,8 @@
          (kind() == MathUnaryInstr::kDoubleSquare));
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   if (kind() == MathUnaryInstr::kDoubleSquare) {
     summary->set_out(0, Location::SameAsFirstInput());
@@ -4997,10 +5031,11 @@
 
 
 LocationSummary* CaseInsensitiveCompareUC16Instr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, InputCount(), kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, InputCount(), kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(CallingConventions::kArg1Reg));
   summary->set_in(1, Location::RegisterLocation(CallingConventions::kArg2Reg));
   summary->set_in(2, Location::RegisterLocation(CallingConventions::kArg3Reg));
@@ -5012,7 +5047,6 @@
 
 void CaseInsensitiveCompareUC16Instr::EmitNativeCode(
     FlowGraphCompiler* compiler) {
-
   // Save RSP. R13 is chosen because it is callee saved so we do not need to
   // back it up before calling into the runtime.
   static const Register kSavedSPReg = R13;
@@ -5030,9 +5064,7 @@
 LocationSummary* UnarySmiOpInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(zone,
-                               kNumInputs,
-                               Location::SameAsFirstInput(),
+  return LocationSummary::Make(zone, kNumInputs, Location::SameAsFirstInput(),
                                LocationSummary::kNoCall);
 }
 
@@ -5062,8 +5094,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -5082,8 +5114,8 @@
   if (result_cid() == kDoubleCid) {
     const intptr_t kNumInputs = 2;
     const intptr_t kNumTemps = 1;
-    LocationSummary* summary = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresFpuRegister());
     summary->set_in(1, Location::RequiresFpuRegister());
     // Reuse the left register so that code can be made shorter.
@@ -5094,8 +5126,8 @@
   ASSERT(result_cid() == kSmiCid);
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   // Reuse the left register so that code can be made shorter.
@@ -5168,11 +5200,11 @@
 
 
 LocationSummary* Int32ToDoubleInstr::MakeLocationSummary(Zone* zone,
-                                                       bool opt) const {
+                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresRegister());
   result->set_out(0, Location::RequiresFpuRegister());
   return result;
@@ -5190,8 +5222,8 @@
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::WritableRegister());
   result->set_out(0, Location::RequiresFpuRegister());
   return result;
@@ -5222,8 +5254,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* result = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* result = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   result->set_in(0, Location::RegisterLocation(RCX));
   result->set_out(0, Location::RegisterLocation(RAX));
   result->set_temp(0, Location::RegisterLocation(RBX));
@@ -5257,13 +5289,10 @@
 
   const intptr_t kNumberOfArguments = 1;
   __ pushq(value_obj);
-  compiler->GenerateStaticCall(deopt_id(),
-                               instance_call()->token_pos(),
-                               target,
+  compiler->GenerateStaticCall(deopt_id(), instance_call()->token_pos(), target,
                                kNumberOfArguments,
                                Object::null_array(),  // No argument names.
-                               locs(),
-                               ICData::Handle());
+                               locs(), ICData::Handle());
   __ Bind(&done);
 }
 
@@ -5272,8 +5301,8 @@
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* result = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::RequiresRegister());
   result->set_temp(0, Location::RequiresRegister());
@@ -5302,8 +5331,8 @@
                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::RequiresFpuRegister());
   return result;
@@ -5315,13 +5344,13 @@
   XmmRegister result = locs()->out(0).fpu_reg();
   switch (recognized_kind()) {
     case MethodRecognizer::kDoubleTruncate:
-      __ roundsd(result, value,  Assembler::kRoundToZero);
+      __ roundsd(result, value, Assembler::kRoundToZero);
       break;
     case MethodRecognizer::kDoubleFloor:
-      __ roundsd(result, value,  Assembler::kRoundDown);
+      __ roundsd(result, value, Assembler::kRoundDown);
       break;
     case MethodRecognizer::kDoubleCeil:
-      __ roundsd(result, value,  Assembler::kRoundUp);
+      __ roundsd(result, value, Assembler::kRoundUp);
       break;
     default:
       UNREACHABLE();
@@ -5333,8 +5362,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::SameAsFirstInput());
   return result;
@@ -5350,8 +5379,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::SameAsFirstInput());
   return result;
@@ -5373,8 +5402,8 @@
   ASSERT((InputCount() == 1) || (InputCount() == 2));
   const intptr_t kNumTemps =
       (recognized_kind() == MethodRecognizer::kMathDoublePow) ? 3 : 1;
-  LocationSummary* result = new(zone) LocationSummary(
-      zone, InputCount(), kNumTemps, LocationSummary::kCall);
+  LocationSummary* result = new (zone)
+      LocationSummary(zone, InputCount(), kNumTemps, LocationSummary::kCall);
   ASSERT(R13 != CALLEE_SAVED_TEMP);
   ASSERT(((1 << R13) & CallingConventions::kCalleeSaveCpuRegisters) != 0);
   result->set_temp(0, Location::RegisterLocation(R13));
@@ -5418,8 +5447,7 @@
   XmmRegister base = locs->in(0).fpu_reg();
   XmmRegister exp = locs->in(1).fpu_reg();
   XmmRegister result = locs->out(0).fpu_reg();
-  Register temp =
-      locs->temp(InvokeMathCFunctionInstr::kObjectTempIndex).reg();
+  Register temp = locs->temp(InvokeMathCFunctionInstr::kObjectTempIndex).reg();
   XmmRegister zero_temp =
       locs->temp(InvokeMathCFunctionInstr::kDoubleTempIndex).fpu_reg();
 
@@ -5488,8 +5516,7 @@
   Label do_pow, return_zero;
   __ Bind(&try_sqrt);
   // Before calling pow, check if we could use sqrt instead of pow.
-  __ LoadObject(temp,
-      Double::ZoneHandle(Double::NewCanonical(kNegInfinity)));
+  __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(kNegInfinity)));
   __ movsd(result, FieldAddress(temp, Double::value_offset()));
   // base == -Infinity -> call pow;
   __ comisd(base, result);
@@ -5553,27 +5580,27 @@
   // Only use this instruction in optimized code.
   ASSERT(opt);
   const intptr_t kNumInputs = 1;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, 0, LocationSummary::kNoCall);
+  LocationSummary* summary =
+      new (zone) LocationSummary(zone, kNumInputs, 0, LocationSummary::kNoCall);
   if (representation() == kUnboxedDouble) {
     if (index() == 0) {
-      summary->set_in(0, Location::Pair(Location::RequiresFpuRegister(),
-                                        Location::Any()));
+      summary->set_in(
+          0, Location::Pair(Location::RequiresFpuRegister(), Location::Any()));
     } else {
       ASSERT(index() == 1);
-      summary->set_in(0, Location::Pair(Location::Any(),
-                                        Location::RequiresFpuRegister()));
+      summary->set_in(
+          0, Location::Pair(Location::Any(), Location::RequiresFpuRegister()));
     }
     summary->set_out(0, Location::RequiresFpuRegister());
   } else {
     ASSERT(representation() == kTagged);
     if (index() == 0) {
-      summary->set_in(0, Location::Pair(Location::RequiresRegister(),
-                                        Location::Any()));
+      summary->set_in(
+          0, Location::Pair(Location::RequiresRegister(), Location::Any()));
     } else {
       ASSERT(index() == 1);
-      summary->set_in(0, Location::Pair(Location::Any(),
-                                        Location::RequiresRegister()));
+      summary->set_in(
+          0, Location::Pair(Location::Any(), Location::RequiresRegister()));
     }
     summary->set_out(0, Location::RequiresRegister());
   }
@@ -5603,8 +5630,8 @@
   if (kind() == MergedMathInstr::kTruncDivMod) {
     const intptr_t kNumInputs = 2;
     const intptr_t kNumTemps = 0;
-    LocationSummary* summary = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     // Both inputs must be writable because they will be untagged.
     summary->set_in(0, Location::RegisterLocation(RAX));
     summary->set_in(1, Location::WritableRegister());
@@ -5615,8 +5642,8 @@
   if (kind() == MergedMathInstr::kSinCos) {
     const intptr_t kNumInputs = 1;
     const intptr_t kNumTemps = 1;
-    LocationSummary* summary = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+    LocationSummary* summary = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
     // Because we always call into the runtime (LocationSummary::kCall) we
     // must specify each input, temp, and output register explicitly.
     summary->set_in(0, Location::FpuRegisterLocation(XMM1));
@@ -5632,18 +5659,20 @@
 }
 
 
-
-typedef void (*SinCosCFunction) (double x, double* res_sin, double* res_cos);
+typedef void (*SinCosCFunction)(double x, double* res_sin, double* res_cos);
 
 extern const RuntimeEntry kSinCosRuntimeEntry(
-    "libc_sincos", reinterpret_cast<RuntimeFunction>(
-        static_cast<SinCosCFunction>(&SinCos)), 1, true, true);
+    "libc_sincos",
+    reinterpret_cast<RuntimeFunction>(static_cast<SinCosCFunction>(&SinCos)),
+    1,
+    true,
+    true);
 
 
 void MergedMathInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Label* deopt = NULL;
   if (CanDeoptimize()) {
-    deopt  = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinarySmiOp);
+    deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinarySmiOp);
   }
   if (kind() == MergedMathInstr::kTruncDivMod) {
     Register left = locs()->in(0).reg();
@@ -5689,7 +5718,7 @@
     __ Bind(&not_32bit);
     __ SmiUntag(left);
     __ SmiUntag(right);
-    __ cqo();  // Sign extend RAX -> RDX:RAX.
+    __ cqo();         // Sign extend RAX -> RDX:RAX.
     __ idivq(right);  //  RAX: quotient, RDX: remainder.
     // Check the corner case of dividing the 'MIN_SMI' with -1, in which
     // case we cannot tag the result.
@@ -5762,7 +5791,7 @@
 
     __ CallRuntime(kSinCosRuntimeEntry, InputCount());
     __ movsd(out2, Address(RSP, 2 * kWordSize + kDoubleSize * 2));  // sin.
-    __ movsd(out1, Address(RSP, 2 * kWordSize + kDoubleSize));  // cos.
+    __ movsd(out1, Address(RSP, 2 * kWordSize + kDoubleSize));      // cos.
     // Restore RSP.
     __ movq(RSP, locs()->temp(0).reg());
 
@@ -5773,13 +5802,13 @@
 
 
 LocationSummary* PolymorphicInstanceCallInstr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+    Zone* zone,
+    bool opt) const {
   return MakeCallSummary(zone);
 }
 
 
-LocationSummary* BranchInstr::MakeLocationSummary(Zone* zone,
-                                                  bool opt) const {
+LocationSummary* BranchInstr::MakeLocationSummary(Zone* zone, bool opt) const {
   comparison()->InitializeLocationSummary(zone, opt);
   // Branches don't produce a result.
   comparison()->locs()->set_out(0, Location::NoLocation());
@@ -5797,8 +5826,8 @@
   const intptr_t kNumInputs = 1;
   const bool need_mask_temp = IsDenseSwitch() && !IsDenseMask(ComputeCidMask());
   const intptr_t kNumTemps = !IsNullCheck() ? (need_mask_temp ? 2 : 1) : 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   if (!IsNullCheck()) {
     summary->set_temp(0, Location::RequiresRegister());
@@ -5811,12 +5840,10 @@
 
 
 void CheckClassInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label* deopt = compiler->AddDeoptStub(deopt_id(),
-                                        ICData::kDeoptCheckClass,
+  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckClass,
                                         licm_hoisted_ ? ICData::kHoisted : 0);
   if (IsNullCheck()) {
-    __ CompareObject(locs()->in(0).reg(),
-                     Object::null_object());
+    __ CompareObject(locs()->in(0).reg(), Object::null_object());
     Condition cond = DeoptIfNull() ? EQUAL : NOT_EQUAL;
     __ j(cond, deopt);
     return;
@@ -5853,8 +5880,7 @@
     }
   } else {
     GrowableArray<CidTarget> sorted_ic_data;
-    FlowGraphCompiler::SortICDataByCount(unary_checks(),
-                                         &sorted_ic_data,
+    FlowGraphCompiler::SortICDataByCount(unary_checks(), &sorted_ic_data,
                                          /* drop_smi = */ true);
     const intptr_t num_checks = sorted_ic_data.length();
     const bool use_near_jump = num_checks < 5;
@@ -5880,8 +5906,8 @@
                                                     bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   return summary;
 }
@@ -5889,8 +5915,7 @@
 
 void CheckSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register value = locs()->in(0).reg();
-  Label* deopt = compiler->AddDeoptStub(deopt_id(),
-                                        ICData::kDeoptCheckSmi,
+  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckSmi,
                                         licm_hoisted_ ? ICData::kHoisted : 0);
   __ BranchIfNotSmi(value, deopt);
 }
@@ -5900,8 +5925,8 @@
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   return summary;
 }
@@ -5919,7 +5944,7 @@
                                                              bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
+  LocationSummary* locs = new (zone) LocationSummary(
       zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   locs->set_in(kLengthPos, Location::RequiresRegister());
   locs->set_in(kIndexPos, Location::RequiresRegister());
@@ -5930,7 +5955,7 @@
 class RangeErrorSlowPath : public SlowPathCode {
  public:
   RangeErrorSlowPath(GenericCheckBoundInstr* instruction, intptr_t try_index)
-      : instruction_(instruction), try_index_(try_index) { }
+      : instruction_(instruction), try_index_(try_index) {}
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     if (Assembler::EmittingComments()) {
@@ -5942,11 +5967,8 @@
     __ pushq(locs->in(1).reg());
     __ CallRuntime(kRangeErrorRuntimeEntry, 2);
     compiler->pc_descriptors_list()->AddDescriptor(
-        RawPcDescriptors::kOther,
-        compiler->assembler()->CodeSize(),
-        instruction_->deopt_id(),
-        instruction_->token_pos(),
-        try_index_);
+        RawPcDescriptors::kOther, compiler->assembler()->CodeSize(),
+        instruction_->deopt_id(), instruction_->token_pos(), try_index_);
     compiler->RecordSafepoint(locs, 2);
     __ int3();
   }
@@ -5979,8 +6001,8 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(kLengthPos, Location::RegisterOrSmiConstant(length()));
   locs->set_in(kIndexPos, Location::RegisterOrSmiConstant(index()));
   return locs;
@@ -5990,10 +6012,8 @@
 void CheckArrayBoundInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   uint32_t flags = generalized_ ? ICData::kGeneralized : 0;
   flags |= licm_hoisted_ ? ICData::kHoisted : 0;
-  Label* deopt = compiler->AddDeoptStub(
-      deopt_id(),
-      ICData::kDeoptCheckArrayBound,
-      flags);
+  Label* deopt =
+      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckArrayBound, flags);
 
   Location length_loc = locs()->in(kLengthPos);
   Location index_loc = locs()->in(kIndexPos);
@@ -6012,8 +6032,8 @@
   if (index_loc.IsConstant()) {
     Register length = length_loc.reg();
     const Smi& index = Smi::Cast(index_loc.constant());
-    __ CompareImmediate(
-        length, Immediate(reinterpret_cast<int64_t>(index.raw())));
+    __ CompareImmediate(length,
+                        Immediate(reinterpret_cast<int64_t>(index.raw())));
     __ j(BELOW_EQUAL, deopt);
   } else if (length_loc.IsConstant()) {
     const Smi& length = Smi::Cast(length_loc.constant());
@@ -6025,8 +6045,8 @@
       __ testq(index, index);
       __ j(NEGATIVE, deopt);
     } else {
-      __ CompareImmediate(
-          index, Immediate(reinterpret_cast<int64_t>(length.raw())));
+      __ CompareImmediate(index,
+                          Immediate(reinterpret_cast<int64_t>(length.raw())));
       __ j(ABOVE_EQUAL, deopt);
     }
   } else {
@@ -6041,7 +6061,7 @@
 }
 
 
-template<typename OperandType>
+template <typename OperandType>
 static void EmitInt64Arithmetic(FlowGraphCompiler* compiler,
                                 Token::Kind op_kind,
                                 Register left,
@@ -6077,8 +6097,8 @@
                                                         bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -6106,8 +6126,8 @@
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -6126,8 +6146,8 @@
 static const intptr_t kMintShiftCountLimit = 63;
 
 bool ShiftMintOpInstr::has_shift_count_check() const {
-  return !RangeUtils::IsWithin(
-      right()->definition()->range(), 0, kMintShiftCountLimit);
+  return !RangeUtils::IsWithin(right()->definition()->range(), 0,
+                               kMintShiftCountLimit);
 }
 
 
@@ -6135,8 +6155,8 @@
                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = can_overflow() ? 1 : 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), RCX));
   if (kNumTemps > 0) {
@@ -6238,8 +6258,8 @@
                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -6247,7 +6267,7 @@
 }
 
 
-template<typename OperandType>
+template <typename OperandType>
 static void EmitIntegerArithmetic(FlowGraphCompiler* compiler,
                                   Token::Kind op_kind,
                                   Register left,
@@ -6303,8 +6323,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), RCX));
   summary->set_out(0, Location::SameAsFirstInput());
@@ -6333,10 +6353,10 @@
     switch (op_kind()) {
       case Token::kSHR:
         __ shrl(left, Immediate(shift_value));
-      break;
+        break;
       case Token::kSHL:
         __ shll(left, Immediate(shift_value));
-      break;
+        break;
       default:
         UNREACHABLE();
     }
@@ -6365,11 +6385,11 @@
     case Token::kSHR:
       __ shrl(left, shifter);
       __ jmp(&done);
-    break;
+      break;
     case Token::kSHL:
       __ shll(left, shifter);
       __ jmp(&done);
-    break;
+      break;
     default:
       UNREACHABLE();
   }
@@ -6387,8 +6407,8 @@
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -6412,8 +6432,8 @@
                                                                bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   if (from() == kUnboxedMint) {
     ASSERT((to() == kUnboxedUint32) || (to() == kUnboxedInt32));
     summary->set_in(0, Location::RequiresRegister());
@@ -6487,42 +6507,33 @@
 }
 
 
-LocationSummary* ThrowInstr::MakeLocationSummary(Zone* zone,
-                                                 bool opt) const {
-  return new(zone) LocationSummary(zone, 0, 0, LocationSummary::kCall);
+LocationSummary* ThrowInstr::MakeLocationSummary(Zone* zone, bool opt) const {
+  return new (zone) LocationSummary(zone, 0, 0, LocationSummary::kCall);
 }
 
 
 void ThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  compiler->GenerateRuntimeCall(token_pos(),
-                                deopt_id(),
-                                kThrowRuntimeEntry,
-                                1,
+  compiler->GenerateRuntimeCall(token_pos(), deopt_id(), kThrowRuntimeEntry, 1,
                                 locs());
   __ int3();
 }
 
 
-LocationSummary* ReThrowInstr::MakeLocationSummary(Zone* zone,
-                                                   bool opt) const {
-  return new(zone) LocationSummary(zone, 0, 0, LocationSummary::kCall);
+LocationSummary* ReThrowInstr::MakeLocationSummary(Zone* zone, bool opt) const {
+  return new (zone) LocationSummary(zone, 0, 0, LocationSummary::kCall);
 }
 
 
 void ReThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   compiler->SetNeedsStacktrace(catch_try_index());
-  compiler->GenerateRuntimeCall(token_pos(),
-                                deopt_id(),
-                                kReThrowRuntimeEntry,
-                                2,
-                                locs());
+  compiler->GenerateRuntimeCall(token_pos(), deopt_id(), kReThrowRuntimeEntry,
+                                2, locs());
   __ int3();
 }
 
 
-LocationSummary* StopInstr::MakeLocationSummary(Zone* zone,
-                                                bool opt) const {
-  return new(zone) LocationSummary(zone, 0, 0, LocationSummary::kNoCall);
+LocationSummary* StopInstr::MakeLocationSummary(Zone* zone, bool opt) const {
+  return new (zone) LocationSummary(zone, 0, 0, LocationSummary::kNoCall);
 }
 
 
@@ -6538,9 +6549,8 @@
 }
 
 
-LocationSummary* GotoInstr::MakeLocationSummary(Zone* zone,
-                                                bool opt) const {
-  return new(zone) LocationSummary(zone, 0, 0, LocationSummary::kNoCall);
+LocationSummary* GotoInstr::MakeLocationSummary(Zone* zone, bool opt) const {
+  return new (zone) LocationSummary(zone, 0, 0, LocationSummary::kNoCall);
 }
 
 
@@ -6551,8 +6561,7 @@
     }
     // Add a deoptimization descriptor for deoptimizing instructions that
     // may be inserted before this instruction.
-    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
-                                   GetDeoptId(),
+    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, GetDeoptId(),
                                    TokenPosition::kNoSource);
   }
   if (HasParallelMove()) {
@@ -6572,8 +6581,8 @@
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
 
-  LocationSummary* summary = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
 
   summary->set_in(0, Location::RequiresRegister());
   summary->set_temp(0, Location::RequiresRegister());
@@ -6588,8 +6597,7 @@
 
   {
     const intptr_t kRIPRelativeLeaqSize = 7;
-    const intptr_t entry_to_rip_offset =
-        __ CodeSize() + kRIPRelativeLeaqSize;
+    const intptr_t entry_to_rip_offset = __ CodeSize() + kRIPRelativeLeaqSize;
     __ leaq(target_address_reg,
             Address::AddressRIPRelative(-entry_to_rip_offset));
     ASSERT(__ CodeSize() == entry_to_rip_offset);
@@ -6612,15 +6620,15 @@
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
   if (needs_number_check()) {
-    LocationSummary* locs = new(zone) LocationSummary(
-        zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+    LocationSummary* locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
     locs->set_in(0, Location::RegisterLocation(RAX));
     locs->set_in(1, Location::RegisterLocation(RCX));
     locs->set_out(0, Location::RegisterLocation(RAX));
     return locs;
   }
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RegisterOrConstant(left()));
   // Only one of the inputs can be a constant. Choose register if the first one
   // is a constant.
@@ -6639,20 +6647,14 @@
   ASSERT(!left.IsConstant() || !right.IsConstant());
   Condition true_condition;
   if (left.IsConstant()) {
-    true_condition = compiler->EmitEqualityRegConstCompare(right.reg(),
-                                                           left.constant(),
-                                                           needs_number_check(),
-                                                           token_pos());
+    true_condition = compiler->EmitEqualityRegConstCompare(
+        right.reg(), left.constant(), needs_number_check(), token_pos());
   } else if (right.IsConstant()) {
-    true_condition = compiler->EmitEqualityRegConstCompare(left.reg(),
-                                                           right.constant(),
-                                                           needs_number_check(),
-                                                           token_pos());
+    true_condition = compiler->EmitEqualityRegConstCompare(
+        left.reg(), right.constant(), needs_number_check(), token_pos());
   } else {
-    true_condition = compiler->EmitEqualityRegRegCompare(left.reg(),
-                                                         right.reg(),
-                                                         needs_number_check(),
-                                                         token_pos());
+    true_condition = compiler->EmitEqualityRegRegCompare(
+        left.reg(), right.reg(), needs_number_check(), token_pos());
   }
   if (kind() != Token::kEQ_STRICT) {
     ASSERT(kind() == Token::kNE_STRICT);
@@ -6666,7 +6668,7 @@
   ASSERT(kind() == Token::kEQ_STRICT || kind() == Token::kNE_STRICT);
 
   Label is_true, is_false;
-  BranchLabels labels = { &is_true, &is_false, &is_false };
+  BranchLabels labels = {&is_true, &is_false, &is_false};
 
   Condition true_condition = EmitComparisonCode(compiler, labels);
   EmitBranchOnCondition(compiler, true_condition, labels);
@@ -6696,8 +6698,8 @@
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(RAX));  // Function.
   summary->set_out(0, Location::RegisterLocation(RAX));
   return summary;
@@ -6707,9 +6709,8 @@
 void ClosureCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   // Arguments descriptor is expected in R10.
   intptr_t argument_count = ArgumentCount();
-  const Array& arguments_descriptor =
-      Array::ZoneHandle(ArgumentsDescriptor::New(argument_count,
-                                                 argument_names()));
+  const Array& arguments_descriptor = Array::ZoneHandle(
+      ArgumentsDescriptor::New(argument_count, argument_names()));
   __ LoadObject(R10, arguments_descriptor);
 
   // Function in RAX.
@@ -6732,8 +6733,7 @@
   // Add deoptimization continuation point after the call and before the
   // arguments are removed.
   // In optimized code this descriptor is needed for exception handling.
-  compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
-                                 deopt_id_after,
+  compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, deopt_id_after,
                                  token_pos());
   __ Drop(argument_count);
 }
@@ -6741,9 +6741,7 @@
 
 LocationSummary* BooleanNegateInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
-  return LocationSummary::Make(zone,
-                               1,
-                               Location::RequiresRegister(),
+  return LocationSummary::Make(zone, 1, Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
 
@@ -6771,9 +6769,7 @@
   const Code& stub = Code::ZoneHandle(
       compiler->zone(), StubCode::GetAllocationStubForClass(cls()));
   const StubEntry stub_entry(stub);
-  compiler->GenerateCall(token_pos(),
-                         stub_entry,
-                         RawPcDescriptors::kOther,
+  compiler->GenerateCall(token_pos(), stub_entry, RawPcDescriptors::kOther,
                          locs());
   compiler->AddStubCallTarget(stub);
   __ Drop(ArgumentCount());  // Discard arguments.
@@ -6788,12 +6784,12 @@
 }
 
 
-LocationSummary* GrowRegExpStackInstr::MakeLocationSummary(
-    Zone* zone, bool opt) const {
+LocationSummary* GrowRegExpStackInstr::MakeLocationSummary(Zone* zone,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(RAX));
   locs->set_out(0, Location::RegisterLocation(RAX));
   return locs;
@@ -6805,11 +6801,8 @@
   const Register result = locs()->out(0).reg();
   __ PushObject(Object::null_object());
   __ pushq(typed_data);
-  compiler->GenerateRuntimeCall(TokenPosition::kNoSource,
-                                deopt_id(),
-                                kGrowRegExpStackRuntimeEntry,
-                                1,
-                                locs());
+  compiler->GenerateRuntimeCall(TokenPosition::kNoSource, deopt_id(),
+                                kGrowRegExpStackRuntimeEntry, 1, locs());
   __ Drop(1);
   __ popq(result);
 }
diff --git a/runtime/vm/intrinsifier.cc b/runtime/vm/intrinsifier.cc
index 331dd84..c2a6ae2 100644
--- a/runtime/vm/intrinsifier.cc
+++ b/runtime/vm/intrinsifier.cc
@@ -82,7 +82,7 @@
     }                                                                          \
     ASSERT(error.IsNull());                                                    \
     if (#function_name[0] == '.') {                                            \
-      str = String::New(#class_name#function_name);                            \
+      str = String::New(#class_name #function_name);                           \
     } else {                                                                   \
       str = String::New(#function_name);                                       \
     }                                                                          \
@@ -122,8 +122,7 @@
 
 // DBC does not use graph intrinsics.
 #if !defined(TARGET_ARCH_DBC)
-static void EmitCodeFor(FlowGraphCompiler* compiler,
-                        FlowGraph* graph) {
+static void EmitCodeFor(FlowGraphCompiler* compiler, FlowGraph* graph) {
   // The FlowGraph here is constructed by the intrinsics builder methods, and
   // is different from compiler->flow_graph(), the original method's flow graph.
   compiler->assembler()->Comment("Graph intrinsic begin");
@@ -165,24 +164,22 @@
 #if !defined(TARGET_ARCH_DBC)
   ZoneGrowableArray<const ICData*>* ic_data_array =
       new ZoneGrowableArray<const ICData*>();
-  FlowGraphBuilder builder(parsed_function,
-                           *ic_data_array,
+  FlowGraphBuilder builder(parsed_function, *ic_data_array,
                            NULL,  // NULL = not inlining.
                            Compiler::kNoOSRDeoptId);
 
   intptr_t block_id = builder.AllocateBlockId();
   TargetEntryInstr* normal_entry =
-      new TargetEntryInstr(block_id,
-                           CatchClauseNode::kInvalidTryIndex);
+      new TargetEntryInstr(block_id, CatchClauseNode::kInvalidTryIndex);
   GraphEntryInstr* graph_entry = new GraphEntryInstr(
       parsed_function, normal_entry, Compiler::kNoOSRDeoptId);
   FlowGraph* graph = new FlowGraph(parsed_function, graph_entry, block_id);
   const Function& function = parsed_function.function();
   switch (function.recognized_kind()) {
 #define EMIT_CASE(class_name, function_name, enum_name, type, fp)              \
-    case MethodRecognizer::k##enum_name:                                       \
-      if (!Build_##enum_name(graph)) return false;                             \
-      break;
+  case MethodRecognizer::k##enum_name:                                         \
+    if (!Build_##enum_name(graph)) return false;                               \
+    break;
 
     GRAPH_INTRINSICS_LIST(EMIT_CASE);
     default:
@@ -190,8 +187,8 @@
 #undef EMIT_CASE
   }
 
-  if (FLAG_support_il_printer &&
-      FLAG_print_flow_graph && FlowGraphPrinter::ShouldPrint(function)) {
+  if (FLAG_support_il_printer && FLAG_print_flow_graph &&
+      FlowGraphPrinter::ShouldPrint(function)) {
     THR_Print("Intrinsic graph before\n");
     FlowGraphPrinter printer(*graph);
     printer.PrintBlocks();
@@ -201,8 +198,8 @@
   FlowGraphAllocator allocator(*graph, true);  // Intrinsic mode.
   allocator.AllocateRegisters();
 
-  if (FLAG_support_il_printer &&
-      FLAG_print_flow_graph && FlowGraphPrinter::ShouldPrint(function)) {
+  if (FLAG_support_il_printer && FLAG_print_flow_graph &&
+      FlowGraphPrinter::ShouldPrint(function)) {
     THR_Print("Intrinsic graph after\n");
     FlowGraphPrinter printer(*graph);
     printer.PrintBlocks();
@@ -229,10 +226,10 @@
   }
 
 #define EMIT_CASE(class_name, function_name, enum_name, type, fp)              \
-    case MethodRecognizer::k##enum_name:                                       \
-      compiler->assembler()->Comment("Intrinsic");                             \
-      enum_name(compiler->assembler());                                        \
-      break;
+  case MethodRecognizer::k##enum_name:                                         \
+    compiler->assembler()->Comment("Intrinsic");                               \
+    enum_name(compiler->assembler());                                          \
+    break;
 
   switch (function.recognized_kind()) {
     ALL_INTRINSICS_NO_INTEGER_LIB_LIST(EMIT_CASE);
@@ -245,8 +242,8 @@
       break;
   }
 
-  // On DBC all graph intrinsics are handled in the same way as non-graph
-  // intrinsics.
+// On DBC all graph intrinsics are handled in the same way as non-graph
+// intrinsics.
 #if defined(TARGET_ARCH_DBC)
   switch (function.recognized_kind()) {
     GRAPH_INTRINSICS_LIST(EMIT_CASE)
@@ -288,7 +285,7 @@
 class BlockBuilder : public ValueObject {
  public:
   BlockBuilder(FlowGraph* flow_graph, TargetEntryInstr* entry)
-      : flow_graph_(flow_graph), entry_(entry), current_(entry) { }
+      : flow_graph_(flow_graph), entry_(entry), current_(entry) {}
 
   Definition* AddToInitialDefinitions(Definition* def) {
     def->set_ssa_temp_index(flow_graph_->alloc_ssa_temp_index());
@@ -315,26 +312,19 @@
 
   Definition* AddParameter(intptr_t index) {
     intptr_t adjustment = Intrinsifier::ParameterSlotFromSp();
-    return AddToInitialDefinitions(
-      new ParameterInstr(adjustment + index,
-                         flow_graph_->graph_entry(),
-                         SPREG));
+    return AddToInitialDefinitions(new ParameterInstr(
+        adjustment + index, flow_graph_->graph_entry(), SPREG));
   }
 
-  TokenPosition TokenPos() {
-    return flow_graph_->function().token_pos();
-  }
+  TokenPosition TokenPos() { return flow_graph_->function().token_pos(); }
 
   Definition* AddNullDefinition() {
-    return AddDefinition(
-        new ConstantInstr(Object::ZoneHandle(Object::null())));
+    return AddDefinition(new ConstantInstr(Object::ZoneHandle(Object::null())));
   }
 
-  Definition* AddUnboxInstr(Representation rep,
-                            Value* value,
-                            bool is_checked) {
-    Definition* unboxed_value = AddDefinition(
-        UnboxInstr::Create(rep, value, Thread::kNoDeoptId));
+  Definition* AddUnboxInstr(Representation rep, Value* value, bool is_checked) {
+    Definition* unboxed_value =
+        AddDefinition(UnboxInstr::Create(rep, value, Thread::kNoDeoptId));
     if (is_checked) {
       // The type of |value| has already been checked and it is safe to
       // adjust reaching type. This is done manually because there is no type
@@ -360,9 +350,7 @@
   Definition* InvokeMathCFunctionHelper(MethodRecognizer::Kind recognized_kind,
                                         ZoneGrowableArray<Value*>* args) {
     InvokeMathCFunctionInstr* invoke_math_c_function =
-        new InvokeMathCFunctionInstr(args,
-                                     Thread::kNoDeoptId,
-                                     recognized_kind,
+        new InvokeMathCFunctionInstr(args, Thread::kNoDeoptId, recognized_kind,
                                      TokenPos());
     AddDefinition(invoke_math_c_function);
     return invoke_math_c_function;
@@ -379,15 +367,11 @@
                              Definition* array,
                              Definition* index,
                              intptr_t length_offset) {
-  Definition* length = builder->AddDefinition(
-      new LoadFieldInstr(new Value(array),
-                         length_offset,
-                         Type::ZoneHandle(Type::SmiType()),
-                         TokenPosition::kNoSource));
-  builder->AddInstruction(
-      new CheckArrayBoundInstr(new Value(length),
-                               new Value(index),
-                               Thread::kNoDeoptId));
+  Definition* length = builder->AddDefinition(new LoadFieldInstr(
+      new Value(array), length_offset, Type::ZoneHandle(Type::SmiType()),
+      TokenPosition::kNoSource));
+  builder->AddInstruction(new CheckArrayBoundInstr(
+      new Value(length), new Value(index), Thread::kNoDeoptId));
 }
 
 static bool IntrinsifyArrayGetIndexed(FlowGraph* flow_graph,
@@ -409,19 +393,14 @@
   PrepareIndexedOp(&builder, array, index, length_offset);
 
   if (RawObject::IsExternalTypedDataClassId(array_cid)) {
-    array = builder.AddDefinition(
-      new LoadUntaggedInstr(new Value(array),
-                            ExternalTypedData::data_offset()));
+    array = builder.AddDefinition(new LoadUntaggedInstr(
+        new Value(array), ExternalTypedData::data_offset()));
   }
 
-  Definition* result = builder.AddDefinition(
-      new LoadIndexedInstr(new Value(array),
-                           new Value(index),
-                           Instance::ElementSizeFor(array_cid),  // index scale
-                           array_cid,
-                           kAlignedAccess,
-                           Thread::kNoDeoptId,
-                           builder.TokenPos()));
+  Definition* result = builder.AddDefinition(new LoadIndexedInstr(
+      new Value(array), new Value(index),
+      Instance::ElementSizeFor(array_cid),  // index scale
+      array_cid, kAlignedAccess, Thread::kNoDeoptId, builder.TokenPos()));
   // Box and/or convert result if necessary.
   switch (array_cid) {
     case kTypedDataInt32ArrayCid:
@@ -437,7 +416,7 @@
     case kTypedDataFloat32ArrayCid:
       result = builder.AddDefinition(
           new FloatToDoubleInstr(new Value(result), Thread::kNoDeoptId));
-      // Fall through.
+    // Fall through.
     case kTypedDataFloat64ArrayCid:
       result = builder.AddDefinition(
           BoxInstr::Create(kUnboxedDouble, new Value(result)));
@@ -502,19 +481,17 @@
     case kExternalTypedDataUint8ClampedArrayCid:
     case kTypedDataInt16ArrayCid:
     case kTypedDataUint16ArrayCid:
-      builder.AddInstruction(new CheckSmiInstr(new Value(value),
-                                               Thread::kNoDeoptId,
-                                               builder.TokenPos()));
+      builder.AddInstruction(new CheckSmiInstr(
+          new Value(value), Thread::kNoDeoptId, builder.TokenPos()));
       break;
     case kTypedDataInt32ArrayCid:
     case kExternalTypedDataInt32ArrayCid:
-      // Use same truncating unbox-instruction for int32 and uint32.
-      // Fall-through.
+    // Use same truncating unbox-instruction for int32 and uint32.
+    // Fall-through.
     case kTypedDataUint32ArrayCid:
     case kExternalTypedDataUint32ArrayCid:
       // Supports smi and mint, slow-case for bigints.
-      value = builder.AddUnboxInstr(kUnboxedUint32,
-                                    new Value(value),
+      value = builder.AddUnboxInstr(kUnboxedUint32, new Value(value),
                                     /* is_checked = */ false);
       break;
     case kTypedDataFloat32ArrayCid:
@@ -541,21 +518,16 @@
           // Float32/Float64 case already handled.
           break;
       }
-      const ICData& value_check = ICData::ZoneHandle(ICData::New(
-          flow_graph->function(),
-          Symbols::Empty(),  // Dummy function name.
-          Object::empty_array(),  // Dummy args. descr.
-          Thread::kNoDeoptId,
-          1,
-          false));
+      const ICData& value_check = ICData::ZoneHandle(
+          ICData::New(flow_graph->function(),
+                      Symbols::Empty(),       // Dummy function name.
+                      Object::empty_array(),  // Dummy args. descr.
+                      Thread::kNoDeoptId, 1, false));
       value_check.AddReceiverCheck(value_check_cid, flow_graph->function());
       builder.AddInstruction(
-          new CheckClassInstr(new Value(value),
-                              Thread::kNoDeoptId,
-                              value_check,
+          new CheckClassInstr(new Value(value), Thread::kNoDeoptId, value_check,
                               builder.TokenPos()));
-      value = builder.AddUnboxInstr(rep,
-                                    new Value(value),
+      value = builder.AddUnboxInstr(rep, new Value(value),
                                     /* is_checked = */ true);
       if (array_cid == kTypedDataFloat32ArrayCid) {
         value = builder.AddDefinition(
@@ -568,23 +540,16 @@
   }
 
   if (RawObject::IsExternalTypedDataClassId(array_cid)) {
-    array = builder.AddDefinition(
-      new LoadUntaggedInstr(new Value(array),
-                            ExternalTypedData::data_offset()));
+    array = builder.AddDefinition(new LoadUntaggedInstr(
+        new Value(array), ExternalTypedData::data_offset()));
   }
   // No store barrier.
   ASSERT(RawObject::IsExternalTypedDataClassId(array_cid) ||
          RawObject::IsTypedDataClassId(array_cid));
-  builder.AddInstruction(
-      new StoreIndexedInstr(new Value(array),
-                            new Value(index),
-                            new Value(value),
-                            kNoStoreBarrier,
-                            Instance::ElementSizeFor(array_cid),  // index scale
-                            array_cid,
-                            kAlignedAccess,
-                            Thread::kNoDeoptId,
-                            builder.TokenPos()));
+  builder.AddInstruction(new StoreIndexedInstr(
+      new Value(array), new Value(index), new Value(value), kNoStoreBarrier,
+      Instance::ElementSizeFor(array_cid),  // index scale
+      array_cid, kAlignedAccess, Thread::kNoDeoptId, builder.TokenPos()));
   // Return null.
   Definition* null_def = builder.AddNullDefinition();
   builder.AddIntrinsicReturn(new Value(null_def));
@@ -593,28 +558,26 @@
 
 
 #define DEFINE_ARRAY_GETTER_INTRINSIC(enum_name)                               \
-bool Intrinsifier::Build_##enum_name##GetIndexed(FlowGraph* flow_graph) {      \
-  return IntrinsifyArrayGetIndexed(                                            \
-      flow_graph,                                                              \
-      MethodRecognizer::MethodKindToReceiverCid(                               \
-          MethodRecognizer::k##enum_name##GetIndexed));                        \
-}
+  bool Intrinsifier::Build_##enum_name##GetIndexed(FlowGraph* flow_graph) {    \
+    return IntrinsifyArrayGetIndexed(                                          \
+        flow_graph, MethodRecognizer::MethodKindToReceiverCid(                 \
+                        MethodRecognizer::k##enum_name##GetIndexed));          \
+  }
 
 
 #define DEFINE_ARRAY_SETTER_INTRINSIC(enum_name)                               \
-bool Intrinsifier::Build_##enum_name##SetIndexed(FlowGraph* flow_graph) {      \
-  return IntrinsifyArraySetIndexed(                                            \
-      flow_graph,                                                              \
-      MethodRecognizer::MethodKindToReceiverCid(                               \
-          MethodRecognizer::k##enum_name##SetIndexed));                        \
-}
+  bool Intrinsifier::Build_##enum_name##SetIndexed(FlowGraph* flow_graph) {    \
+    return IntrinsifyArraySetIndexed(                                          \
+        flow_graph, MethodRecognizer::MethodKindToReceiverCid(                 \
+                        MethodRecognizer::k##enum_name##SetIndexed));          \
+  }
 
 DEFINE_ARRAY_GETTER_INTRINSIC(ObjectArray)  // Setter in intrinsifier_<arch>.cc.
 DEFINE_ARRAY_GETTER_INTRINSIC(ImmutableArray)
 
 #define DEFINE_ARRAY_GETTER_SETTER_INTRINSICS(enum_name)                       \
-DEFINE_ARRAY_GETTER_INTRINSIC(enum_name)                                       \
-DEFINE_ARRAY_SETTER_INTRINSIC(enum_name)
+  DEFINE_ARRAY_GETTER_INTRINSIC(enum_name)                                     \
+  DEFINE_ARRAY_SETTER_INTRINSIC(enum_name)
 
 DEFINE_ARRAY_GETTER_SETTER_INTRINSICS(Int8Array)
 DEFINE_ARRAY_GETTER_SETTER_INTRINSICS(Uint8Array)
@@ -632,31 +595,29 @@
 
 
 #define DEFINE_FLOAT_ARRAY_GETTER_INTRINSIC(enum_name)                         \
-bool Intrinsifier::Build_##enum_name##GetIndexed(FlowGraph* flow_graph) {      \
-  if (!FlowGraphCompiler::SupportsUnboxedDoubles()) {                          \
-    return false;                                                              \
-  }                                                                            \
-  return IntrinsifyArrayGetIndexed(                                            \
-      flow_graph,                                                              \
-      MethodRecognizer::MethodKindToReceiverCid(                               \
-          MethodRecognizer::k##enum_name##GetIndexed));                        \
-}
+  bool Intrinsifier::Build_##enum_name##GetIndexed(FlowGraph* flow_graph) {    \
+    if (!FlowGraphCompiler::SupportsUnboxedDoubles()) {                        \
+      return false;                                                            \
+    }                                                                          \
+    return IntrinsifyArrayGetIndexed(                                          \
+        flow_graph, MethodRecognizer::MethodKindToReceiverCid(                 \
+                        MethodRecognizer::k##enum_name##GetIndexed));          \
+  }
 
 
 #define DEFINE_FLOAT_ARRAY_SETTER_INTRINSIC(enum_name)                         \
-bool Intrinsifier::Build_##enum_name##SetIndexed(FlowGraph* flow_graph) {      \
-  if (!FlowGraphCompiler::SupportsUnboxedDoubles()) {                          \
-    return false;                                                              \
-  }                                                                            \
-  return IntrinsifyArraySetIndexed(                                            \
-      flow_graph,                                                              \
-      MethodRecognizer::MethodKindToReceiverCid(                               \
-          MethodRecognizer::k##enum_name##SetIndexed));                        \
-}
+  bool Intrinsifier::Build_##enum_name##SetIndexed(FlowGraph* flow_graph) {    \
+    if (!FlowGraphCompiler::SupportsUnboxedDoubles()) {                        \
+      return false;                                                            \
+    }                                                                          \
+    return IntrinsifyArraySetIndexed(                                          \
+        flow_graph, MethodRecognizer::MethodKindToReceiverCid(                 \
+                        MethodRecognizer::k##enum_name##SetIndexed));          \
+  }
 
 #define DEFINE_FLOAT_ARRAY_GETTER_SETTER_INTRINSICS(enum_name)                 \
-DEFINE_FLOAT_ARRAY_GETTER_INTRINSIC(enum_name)                                 \
-DEFINE_FLOAT_ARRAY_SETTER_INTRINSIC(enum_name)
+  DEFINE_FLOAT_ARRAY_GETTER_INTRINSIC(enum_name)                               \
+  DEFINE_FLOAT_ARRAY_SETTER_INTRINSIC(enum_name)
 
 DEFINE_FLOAT_ARRAY_GETTER_SETTER_INTRINSICS(Float64Array)
 DEFINE_FLOAT_ARRAY_GETTER_SETTER_INTRINSICS(Float32Array)
@@ -667,31 +628,29 @@
 
 
 #define DEFINE_SIMD_ARRAY_GETTER_INTRINSIC(enum_name)                          \
-bool Intrinsifier::Build_##enum_name##GetIndexed(FlowGraph* flow_graph) {      \
-  if (!FlowGraphCompiler::SupportsUnboxedSimd128()) {                          \
-    return false;                                                              \
-  }                                                                            \
-  return IntrinsifyArrayGetIndexed(                                            \
-      flow_graph,                                                              \
-      MethodRecognizer::MethodKindToReceiverCid(                               \
-          MethodRecognizer::k##enum_name##GetIndexed));                        \
-}
+  bool Intrinsifier::Build_##enum_name##GetIndexed(FlowGraph* flow_graph) {    \
+    if (!FlowGraphCompiler::SupportsUnboxedSimd128()) {                        \
+      return false;                                                            \
+    }                                                                          \
+    return IntrinsifyArrayGetIndexed(                                          \
+        flow_graph, MethodRecognizer::MethodKindToReceiverCid(                 \
+                        MethodRecognizer::k##enum_name##GetIndexed));          \
+  }
 
 
 #define DEFINE_SIMD_ARRAY_SETTER_INTRINSIC(enum_name)                          \
-bool Intrinsifier::Build_##enum_name##SetIndexed(FlowGraph* flow_graph) {      \
-  if (!FlowGraphCompiler::SupportsUnboxedSimd128()) {                          \
-    return false;                                                              \
-  }                                                                            \
-  return IntrinsifyArraySetIndexed(                                            \
-      flow_graph,                                                              \
-      MethodRecognizer::MethodKindToReceiverCid(                               \
-          MethodRecognizer::k##enum_name##SetIndexed));                        \
-}
+  bool Intrinsifier::Build_##enum_name##SetIndexed(FlowGraph* flow_graph) {    \
+    if (!FlowGraphCompiler::SupportsUnboxedSimd128()) {                        \
+      return false;                                                            \
+    }                                                                          \
+    return IntrinsifyArraySetIndexed(                                          \
+        flow_graph, MethodRecognizer::MethodKindToReceiverCid(                 \
+                        MethodRecognizer::k##enum_name##SetIndexed));          \
+  }
 
-#define DEFINE_SIMD_ARRAY_GETTER_SETTER_INTRINSICS(enum_name)                 \
-DEFINE_SIMD_ARRAY_GETTER_INTRINSIC(enum_name)                                 \
-DEFINE_SIMD_ARRAY_SETTER_INTRINSIC(enum_name)
+#define DEFINE_SIMD_ARRAY_GETTER_SETTER_INTRINSICS(enum_name)                  \
+  DEFINE_SIMD_ARRAY_GETTER_INTRINSIC(enum_name)                                \
+  DEFINE_SIMD_ARRAY_SETTER_INTRINSIC(enum_name)
 
 DEFINE_SIMD_ARRAY_GETTER_SETTER_INTRINSICS(Float32x4Array)
 DEFINE_SIMD_ARRAY_GETTER_SETTER_INTRINSICS(Int32x4Array)
@@ -713,31 +672,20 @@
 
   // For external strings: Load external data.
   if (cid == kExternalOneByteStringCid) {
-    str = builder.AddDefinition(
-        new LoadUntaggedInstr(new Value(str),
-                              ExternalOneByteString::external_data_offset()));
-    str = builder.AddDefinition(
-        new LoadUntaggedInstr(
-            new Value(str),
-            RawExternalOneByteString::ExternalData::data_offset()));
+    str = builder.AddDefinition(new LoadUntaggedInstr(
+        new Value(str), ExternalOneByteString::external_data_offset()));
+    str = builder.AddDefinition(new LoadUntaggedInstr(
+        new Value(str), RawExternalOneByteString::ExternalData::data_offset()));
   } else if (cid == kExternalTwoByteStringCid) {
-    str = builder.AddDefinition(
-      new LoadUntaggedInstr(new Value(str),
-                            ExternalTwoByteString::external_data_offset()));
-    str = builder.AddDefinition(
-        new LoadUntaggedInstr(
-            new Value(str),
-            RawExternalTwoByteString::ExternalData::data_offset()));
+    str = builder.AddDefinition(new LoadUntaggedInstr(
+        new Value(str), ExternalTwoByteString::external_data_offset()));
+    str = builder.AddDefinition(new LoadUntaggedInstr(
+        new Value(str), RawExternalTwoByteString::ExternalData::data_offset()));
   }
 
-  Definition* result = builder.AddDefinition(
-      new LoadIndexedInstr(new Value(str),
-                           new Value(index),
-                           Instance::ElementSizeFor(cid),
-                           cid,
-                           kAlignedAccess,
-                           Thread::kNoDeoptId,
-                           builder.TokenPos()));
+  Definition* result = builder.AddDefinition(new LoadIndexedInstr(
+      new Value(str), new Value(index), Instance::ElementSizeFor(cid), cid,
+      kAlignedAccess, Thread::kNoDeoptId, builder.TokenPos()));
   builder.AddIntrinsicReturn(new Value(result));
   return true;
 }
@@ -776,34 +724,23 @@
   Definition* left = builder.AddParameter(2);
 
   const ICData& value_check = ICData::ZoneHandle(ICData::New(
-      flow_graph->function(),
-      String::Handle(flow_graph->function().name()),
+      flow_graph->function(), String::Handle(flow_graph->function().name()),
       Object::empty_array(),  // Dummy args. descr.
-      Thread::kNoDeoptId,
-      1,
-      false));
+      Thread::kNoDeoptId, 1, false));
   value_check.AddReceiverCheck(kFloat32x4Cid, flow_graph->function());
   // Check argument. Receiver (left) is known to be a Float32x4.
-  builder.AddInstruction(
-      new CheckClassInstr(new Value(right),
-                          Thread::kNoDeoptId,
-                          value_check,
-                          builder.TokenPos()));
+  builder.AddInstruction(new CheckClassInstr(
+      new Value(right), Thread::kNoDeoptId, value_check, builder.TokenPos()));
   Definition* left_simd =
-      builder.AddUnboxInstr(kUnboxedFloat32x4,
-                            new Value(left),
+      builder.AddUnboxInstr(kUnboxedFloat32x4, new Value(left),
                             /* is_checked = */ true);
 
   Definition* right_simd =
-      builder.AddUnboxInstr(kUnboxedFloat32x4,
-                            new Value(right),
+      builder.AddUnboxInstr(kUnboxedFloat32x4, new Value(right),
                             /* is_checked = */ true);
 
-  Definition* unboxed_result = builder.AddDefinition(
-      new BinaryFloat32x4OpInstr(kind,
-                                 new Value(left_simd),
-                                 new Value(right_simd),
-                                 Thread::kNoDeoptId));
+  Definition* unboxed_result = builder.AddDefinition(new BinaryFloat32x4OpInstr(
+      kind, new Value(left_simd), new Value(right_simd), Thread::kNoDeoptId));
   Definition* result = builder.AddDefinition(
       BoxInstr::Create(kUnboxedFloat32x4, new Value(unboxed_result)));
   builder.AddIntrinsicReturn(new Value(result));
@@ -839,15 +776,11 @@
   Definition* receiver = builder.AddParameter(1);
 
   Definition* unboxed_receiver =
-      builder.AddUnboxInstr(kUnboxedFloat32x4,
-                            new Value(receiver),
+      builder.AddUnboxInstr(kUnboxedFloat32x4, new Value(receiver),
                             /* is_checked = */ true);
 
-  Definition* unboxed_result = builder.AddDefinition(
-      new Simd32x4ShuffleInstr(kind,
-                               new Value(unboxed_receiver),
-                               0,
-                               Thread::kNoDeoptId));
+  Definition* unboxed_result = builder.AddDefinition(new Simd32x4ShuffleInstr(
+      kind, new Value(unboxed_receiver), 0, Thread::kNoDeoptId));
 
   Definition* result = builder.AddDefinition(
       BoxInstr::Create(kUnboxedDouble, new Value(unboxed_result)));
@@ -887,11 +820,8 @@
 
   Definition* array = builder.AddParameter(1);
 
-  Definition* length = builder.AddDefinition(
-      new LoadFieldInstr(new Value(array),
-                         offset,
-                         Type::ZoneHandle(),
-                         builder.TokenPos()));
+  Definition* length = builder.AddDefinition(new LoadFieldInstr(
+      new Value(array), offset, Type::ZoneHandle(), builder.TokenPos()));
   builder.AddIntrinsicReturn(new Value(length));
   return true;
 }
@@ -930,15 +860,11 @@
   Definition* array = builder.AddParameter(1);
 
   Definition* backing_store = builder.AddDefinition(
-      new LoadFieldInstr(new Value(array),
-                         GrowableObjectArray::data_offset(),
-                         Type::ZoneHandle(),
-                         builder.TokenPos()));
+      new LoadFieldInstr(new Value(array), GrowableObjectArray::data_offset(),
+                         Type::ZoneHandle(), builder.TokenPos()));
   Definition* capacity = builder.AddDefinition(
-      new LoadFieldInstr(new Value(backing_store),
-                         Array::length_offset(),
-                         Type::ZoneHandle(),
-                         builder.TokenPos()));
+      new LoadFieldInstr(new Value(backing_store), Array::length_offset(),
+                         Type::ZoneHandle(), builder.TokenPos()));
   builder.AddIntrinsicReturn(new Value(capacity));
   return true;
 }
@@ -952,22 +878,16 @@
   Definition* index = builder.AddParameter(1);
   Definition* growable_array = builder.AddParameter(2);
 
-  PrepareIndexedOp(
-      &builder, growable_array, index, GrowableObjectArray::length_offset());
+  PrepareIndexedOp(&builder, growable_array, index,
+                   GrowableObjectArray::length_offset());
 
-  Definition* backing_store = builder.AddDefinition(
-      new LoadFieldInstr(new Value(growable_array),
-                         GrowableObjectArray::data_offset(),
-                         Type::ZoneHandle(),
-                         builder.TokenPos()));
-  Definition* result = builder.AddDefinition(
-      new LoadIndexedInstr(new Value(backing_store),
-                           new Value(index),
-                           Instance::ElementSizeFor(kArrayCid),  // index scale
-                           kArrayCid,
-                           kAlignedAccess,
-                           Thread::kNoDeoptId,
-                           builder.TokenPos()));
+  Definition* backing_store = builder.AddDefinition(new LoadFieldInstr(
+      new Value(growable_array), GrowableObjectArray::data_offset(),
+      Type::ZoneHandle(), builder.TokenPos()));
+  Definition* result = builder.AddDefinition(new LoadIndexedInstr(
+      new Value(backing_store), new Value(index),
+      Instance::ElementSizeFor(kArrayCid),  // index scale
+      kArrayCid, kAlignedAccess, Thread::kNoDeoptId, builder.TokenPos()));
   builder.AddIntrinsicReturn(new Value(result));
   return true;
 }
@@ -986,25 +906,18 @@
   Definition* index = builder.AddParameter(2);
   Definition* array = builder.AddParameter(3);
 
-  PrepareIndexedOp(
-      &builder, array, index, GrowableObjectArray::length_offset());
+  PrepareIndexedOp(&builder, array, index,
+                   GrowableObjectArray::length_offset());
 
   Definition* backing_store = builder.AddDefinition(
-      new LoadFieldInstr(new Value(array),
-                         GrowableObjectArray::data_offset(),
-                         Type::ZoneHandle(),
-                         builder.TokenPos()));
+      new LoadFieldInstr(new Value(array), GrowableObjectArray::data_offset(),
+                         Type::ZoneHandle(), builder.TokenPos()));
 
-  builder.AddInstruction(
-      new StoreIndexedInstr(new Value(backing_store),
-                            new Value(index),
-                            new Value(value),
-                            kEmitStoreBarrier,
-                            Instance::ElementSizeFor(kArrayCid),  // index scale
-                            kArrayCid,
-                            kAlignedAccess,
-                            Thread::kNoDeoptId,
-                            builder.TokenPos()));
+  builder.AddInstruction(new StoreIndexedInstr(
+      new Value(backing_store), new Value(index), new Value(value),
+      kEmitStoreBarrier,
+      Instance::ElementSizeFor(kArrayCid),  // index scale
+      kArrayCid, kAlignedAccess, Thread::kNoDeoptId, builder.TokenPos()));
   // Return null.
   Definition* null_def = builder.AddNullDefinition();
   builder.AddIntrinsicReturn(new Value(null_def));
@@ -1021,25 +934,16 @@
   Definition* growable_array = builder.AddParameter(2);
 
   const ICData& value_check = ICData::ZoneHandle(ICData::New(
-      flow_graph->function(),
-      String::Handle(flow_graph->function().name()),
+      flow_graph->function(), String::Handle(flow_graph->function().name()),
       Object::empty_array(),  // Dummy args. descr.
-      Thread::kNoDeoptId,
-      1,
-      false));
+      Thread::kNoDeoptId, 1, false));
   value_check.AddReceiverCheck(kArrayCid, flow_graph->function());
-  builder.AddInstruction(
-      new CheckClassInstr(new Value(data),
-                          Thread::kNoDeoptId,
-                          value_check,
-                          builder.TokenPos()));
+  builder.AddInstruction(new CheckClassInstr(
+      new Value(data), Thread::kNoDeoptId, value_check, builder.TokenPos()));
 
-  builder.AddInstruction(
-      new StoreInstanceFieldInstr(GrowableObjectArray::data_offset(),
-                                  new Value(growable_array),
-                                  new Value(data),
-                                  kEmitStoreBarrier,
-                                  builder.TokenPos()));
+  builder.AddInstruction(new StoreInstanceFieldInstr(
+      GrowableObjectArray::data_offset(), new Value(growable_array),
+      new Value(data), kEmitStoreBarrier, builder.TokenPos()));
   // Return null.
   Definition* null_def = builder.AddNullDefinition();
   builder.AddIntrinsicReturn(new Value(null_def));
@@ -1055,16 +959,11 @@
   Definition* length = builder.AddParameter(1);
   Definition* growable_array = builder.AddParameter(2);
 
-  builder.AddInstruction(
-      new CheckSmiInstr(new Value(length),
-                        Thread::kNoDeoptId,
-                        builder.TokenPos()));
-  builder.AddInstruction(
-      new StoreInstanceFieldInstr(GrowableObjectArray::length_offset(),
-                                  new Value(growable_array),
-                                  new Value(length),
-                                  kNoStoreBarrier,
-                                  builder.TokenPos()));
+  builder.AddInstruction(new CheckSmiInstr(
+      new Value(length), Thread::kNoDeoptId, builder.TokenPos()));
+  builder.AddInstruction(new StoreInstanceFieldInstr(
+      GrowableObjectArray::length_offset(), new Value(growable_array),
+      new Value(length), kNoStoreBarrier, builder.TokenPos()));
   Definition* null_def = builder.AddNullDefinition();
   builder.AddIntrinsicReturn(new Value(null_def));
   return true;
@@ -1081,13 +980,10 @@
 
   Definition* receiver = builder.AddParameter(1);
   Definition* unboxed_value =
-      builder.AddUnboxInstr(kUnboxedDouble,
-                            new Value(receiver),
+      builder.AddUnboxInstr(kUnboxedDouble, new Value(receiver),
                             /* is_checked = */ true);
-  Definition* unboxed_result = builder.AddDefinition(
-      new UnaryDoubleOpInstr(Token::kNEGATE,
-                             new Value(unboxed_value),
-                             Thread::kNoDeoptId));
+  Definition* unboxed_result = builder.AddDefinition(new UnaryDoubleOpInstr(
+      Token::kNEGATE, new Value(unboxed_value), Thread::kNoDeoptId));
   Definition* result = builder.AddDefinition(
       BoxInstr::Create(kUnboxedDouble, new Value(unboxed_result)));
   builder.AddIntrinsicReturn(new Value(result));
@@ -1112,8 +1008,7 @@
     args->Add(new Value(unboxed_value));
   }
 
-  Definition* unboxed_result =
-      builder->InvokeMathCFunction(kind, args);
+  Definition* unboxed_result = builder->InvokeMathCFunction(kind, args);
 
   Definition* result = builder->AddDefinition(
       BoxInstr::Create(kUnboxedDouble, new Value(unboxed_result)));
@@ -1131,8 +1026,7 @@
   TargetEntryInstr* normal_entry = graph_entry->normal_entry();
   BlockBuilder builder(flow_graph, normal_entry);
 
-  return BuildInvokeMathCFunction(&builder,
-                                  MethodRecognizer::kMathSin);
+  return BuildInvokeMathCFunction(&builder, MethodRecognizer::kMathSin);
 }
 
 
@@ -1143,8 +1037,7 @@
   TargetEntryInstr* normal_entry = graph_entry->normal_entry();
   BlockBuilder builder(flow_graph, normal_entry);
 
-  return BuildInvokeMathCFunction(&builder,
-                                  MethodRecognizer::kMathCos);
+  return BuildInvokeMathCFunction(&builder, MethodRecognizer::kMathCos);
 }
 
 
@@ -1155,8 +1048,7 @@
   TargetEntryInstr* normal_entry = graph_entry->normal_entry();
   BlockBuilder builder(flow_graph, normal_entry);
 
-  return BuildInvokeMathCFunction(&builder,
-                                  MethodRecognizer::kMathTan);
+  return BuildInvokeMathCFunction(&builder, MethodRecognizer::kMathTan);
 }
 
 
@@ -1167,8 +1059,7 @@
   TargetEntryInstr* normal_entry = graph_entry->normal_entry();
   BlockBuilder builder(flow_graph, normal_entry);
 
-  return BuildInvokeMathCFunction(&builder,
-                                  MethodRecognizer::kMathAsin);
+  return BuildInvokeMathCFunction(&builder, MethodRecognizer::kMathAsin);
 }
 
 
@@ -1179,8 +1070,7 @@
   TargetEntryInstr* normal_entry = graph_entry->normal_entry();
   BlockBuilder builder(flow_graph, normal_entry);
 
-  return BuildInvokeMathCFunction(&builder,
-                                  MethodRecognizer::kMathAcos);
+  return BuildInvokeMathCFunction(&builder, MethodRecognizer::kMathAcos);
 }
 
 
@@ -1191,8 +1081,7 @@
   TargetEntryInstr* normal_entry = graph_entry->normal_entry();
   BlockBuilder builder(flow_graph, normal_entry);
 
-  return BuildInvokeMathCFunction(&builder,
-                                  MethodRecognizer::kMathAtan);
+  return BuildInvokeMathCFunction(&builder, MethodRecognizer::kMathAtan);
 }
 
 
@@ -1203,8 +1092,7 @@
   TargetEntryInstr* normal_entry = graph_entry->normal_entry();
   BlockBuilder builder(flow_graph, normal_entry);
 
-  return BuildInvokeMathCFunction(&builder,
-                                  MethodRecognizer::kMathAtan2,
+  return BuildInvokeMathCFunction(&builder, MethodRecognizer::kMathAtan2,
                                   /* num_parameters = */ 2);
 }
 
@@ -1216,8 +1104,7 @@
   TargetEntryInstr* normal_entry = graph_entry->normal_entry();
   BlockBuilder builder(flow_graph, normal_entry);
 
-  return BuildInvokeMathCFunction(&builder,
-                                  MethodRecognizer::kDoubleMod,
+  return BuildInvokeMathCFunction(&builder, MethodRecognizer::kDoubleMod,
                                   /* num_parameters = */ 2);
 }
 
@@ -1232,8 +1119,7 @@
   TargetEntryInstr* normal_entry = graph_entry->normal_entry();
   BlockBuilder builder(flow_graph, normal_entry);
 
-  return BuildInvokeMathCFunction(&builder,
-                                  MethodRecognizer::kDoubleCeil);
+  return BuildInvokeMathCFunction(&builder, MethodRecognizer::kDoubleCeil);
 }
 
 
@@ -1247,8 +1133,7 @@
   TargetEntryInstr* normal_entry = graph_entry->normal_entry();
   BlockBuilder builder(flow_graph, normal_entry);
 
-  return BuildInvokeMathCFunction(&builder,
-                                  MethodRecognizer::kDoubleFloor);
+  return BuildInvokeMathCFunction(&builder, MethodRecognizer::kDoubleFloor);
 }
 
 
@@ -1262,8 +1147,7 @@
   TargetEntryInstr* normal_entry = graph_entry->normal_entry();
   BlockBuilder builder(flow_graph, normal_entry);
 
-  return BuildInvokeMathCFunction(&builder,
-                                  MethodRecognizer::kDoubleTruncate);
+  return BuildInvokeMathCFunction(&builder, MethodRecognizer::kDoubleTruncate);
 }
 
 
@@ -1274,8 +1158,7 @@
   TargetEntryInstr* normal_entry = graph_entry->normal_entry();
   BlockBuilder builder(flow_graph, normal_entry);
 
-  return BuildInvokeMathCFunction(&builder,
-                                  MethodRecognizer::kDoubleRound);
+  return BuildInvokeMathCFunction(&builder, MethodRecognizer::kDoubleRound);
 }
 #endif  // !defined(TARGET_ARCH_DBC)
 
diff --git a/runtime/vm/intrinsifier.h b/runtime/vm/intrinsifier.h
index 37cf5ef..c7ff0f8 100644
--- a/runtime/vm/intrinsifier.h
+++ b/runtime/vm/intrinsifier.h
@@ -38,7 +38,7 @@
  private:
   static bool CanIntrinsify(const Function& function);
 
-#define DECLARE_FUNCTION(class_name, function_name, enum_name, type, fp) \
+#define DECLARE_FUNCTION(class_name, function_name, enum_name, type, fp)       \
   static void enum_name(Assembler* assembler);
 
   ALL_INTRINSICS_LIST(DECLARE_FUNCTION)
@@ -50,7 +50,7 @@
 #undef DECLARE_FUNCTION
 
 #if !defined(TARGET_ARCH_DBC)
-#define DECLARE_FUNCTION(class_name, function_name, enum_name, type, fp) \
+#define DECLARE_FUNCTION(class_name, function_name, enum_name, type, fp)       \
   static bool Build_##enum_name(FlowGraph* flow_graph);
 
   GRAPH_INTRINSICS_LIST(DECLARE_FUNCTION)
diff --git a/runtime/vm/intrinsifier_arm.cc b/runtime/vm/intrinsifier_arm.cc
index 3be8564..949cc77 100644
--- a/runtime/vm/intrinsifier_arm.cc
+++ b/runtime/vm/intrinsifier_arm.cc
@@ -30,7 +30,9 @@
 #define __ assembler->
 
 
-intptr_t Intrinsifier::ParameterSlotFromSp() { return -1; }
+intptr_t Intrinsifier::ParameterSlotFromSp() {
+  return -1;
+}
 
 
 static bool IsABIPreservedRegister(Register reg) {
@@ -79,7 +81,7 @@
   // Note that R1 is Smi, i.e, times 2.
   ASSERT(kSmiTagShift == 1);
   __ ldr(R2, Address(SP, 0 * kWordSize));  // Value.
-  __ add(R1, R0, Operand(R1, LSL, 1));  // R1 is Smi.
+  __ add(R1, R0, Operand(R1, LSL, 1));     // R1 is Smi.
   __ StoreIntoObject(R0, FieldAddress(R1, Array::data_offset()), R2);
   // Caller is responsible for preserving the value if necessary.
   __ Ret();
@@ -104,24 +106,18 @@
   __ ldr(R1, Address(SP, kArrayOffset));  // Data argument.
   // R0 is new, no barrier needed.
   __ StoreIntoObjectNoBarrier(
-      R0,
-      FieldAddress(R0, GrowableObjectArray::data_offset()),
-      R1);
+      R0, FieldAddress(R0, GrowableObjectArray::data_offset()), R1);
 
   // R0: new growable array object start as a tagged pointer.
   // Store the type argument field in the growable array object.
   __ ldr(R1, Address(SP, kTypeArgumentsOffset));  // Type argument.
   __ StoreIntoObjectNoBarrier(
-      R0,
-      FieldAddress(R0, GrowableObjectArray::type_arguments_offset()),
-      R1);
+      R0, FieldAddress(R0, GrowableObjectArray::type_arguments_offset()), R1);
 
   // Set the length field in the growable array object to 0.
   __ LoadImmediate(R1, 0);
   __ StoreIntoObjectNoBarrier(
-      R0,
-      FieldAddress(R0, GrowableObjectArray::length_offset()),
-      R1);
+      R0, FieldAddress(R0, GrowableObjectArray::length_offset()), R1);
   __ Ret();  // Returns the newly allocated object in R0.
 
   __ Bind(&fall_through);
@@ -167,7 +163,7 @@
   Label fall_through;                                                          \
   const intptr_t kArrayLengthStackOffset = 0 * kWordSize;                      \
   NOT_IN_PRODUCT(__ MaybeTraceAllocation(cid, R2, &fall_through));             \
-  __ ldr(R2, Address(SP, kArrayLengthStackOffset));  /* Array length. */       \
+  __ ldr(R2, Address(SP, kArrayLengthStackOffset)); /* Array length. */        \
   /* Check that length is a positive Smi. */                                   \
   /* R2: requested array length argument. */                                   \
   __ tst(R2, Operand(kSmiTagMask));                                            \
@@ -189,7 +185,7 @@
                                                                                \
   /* R2: allocation size. */                                                   \
   __ adds(R1, R0, Operand(R2));                                                \
-  __ b(&fall_through, CS);  /* Fail on unsigned overflow. */                   \
+  __ b(&fall_through, CS); /* Fail on unsigned overflow. */                    \
                                                                                \
   /* Check if the allocation fits into the remaining space. */                 \
   /* R0: potential new object start. */                                        \
@@ -212,24 +208,24 @@
   /* R4: allocation stats address */                                           \
   {                                                                            \
     __ CompareImmediate(R2, RawObject::SizeTag::kMaxSizeTag);                  \
-    __ mov(R3, Operand(R2, LSL,                                                \
-        RawObject::kSizeTagPos - kObjectAlignmentLog2), LS);                   \
+    __ mov(R3,                                                                 \
+           Operand(R2, LSL, RawObject::kSizeTagPos - kObjectAlignmentLog2),    \
+           LS);                                                                \
     __ mov(R3, Operand(0), HI);                                                \
                                                                                \
     /* Get the class index and insert it into the tags. */                     \
     __ LoadImmediate(TMP, RawObject::ClassIdTag::encode(cid));                 \
     __ orr(R3, R3, Operand(TMP));                                              \
-    __ str(R3, FieldAddress(R0, type_name::tags_offset()));  /* Tags. */       \
+    __ str(R3, FieldAddress(R0, type_name::tags_offset())); /* Tags. */        \
   }                                                                            \
   /* Set the length field. */                                                  \
   /* R0: new object start as a tagged pointer. */                              \
   /* R1: new object end address. */                                            \
   /* R2: allocation size. */                                                   \
   /* R4: allocation stats address. */                                          \
-  __ ldr(R3, Address(SP, kArrayLengthStackOffset));  /* Array length. */       \
-  __ StoreIntoObjectNoBarrier(R0,                                              \
-                              FieldAddress(R0, type_name::length_offset()),    \
-                              R3);                                             \
+  __ ldr(R3, Address(SP, kArrayLengthStackOffset)); /* Array length. */        \
+  __ StoreIntoObjectNoBarrier(                                                 \
+      R0, FieldAddress(R0, type_name::length_offset()), R3);                   \
   /* Initialize all array elements to 0. */                                    \
   /* R0: new object start as a tagged pointer. */                              \
   /* R1: new object end address. */                                            \
@@ -251,16 +247,21 @@
                                                                                \
   NOT_IN_PRODUCT(__ IncrementAllocationStatsWithSize(R4, R2, space));          \
   __ Ret();                                                                    \
-  __ Bind(&fall_through);                                                      \
+  __ Bind(&fall_through);
 
 
 static int GetScaleFactor(intptr_t size) {
   switch (size) {
-    case 1: return 0;
-    case 2: return 1;
-    case 4: return 2;
-    case 8: return 3;
-    case 16: return 4;
+    case 1:
+      return 0;
+    case 2:
+      return 1;
+    case 4:
+      return 2;
+    case 8:
+      return 3;
+    case 16:
+      return 4;
   }
   UNREACHABLE();
   return -1;
@@ -268,12 +269,12 @@
 
 
 #define TYPED_DATA_ALLOCATOR(clazz)                                            \
-void Intrinsifier::TypedData_##clazz##_factory(Assembler* assembler) {         \
-  intptr_t size = TypedData::ElementSizeInBytes(kTypedData##clazz##Cid);       \
-  intptr_t max_len = TypedData::MaxElements(kTypedData##clazz##Cid);           \
-  int shift = GetScaleFactor(size);                                            \
-  TYPED_ARRAY_ALLOCATION(TypedData, kTypedData##clazz##Cid, max_len, shift);   \
-}
+  void Intrinsifier::TypedData_##clazz##_factory(Assembler* assembler) {       \
+    intptr_t size = TypedData::ElementSizeInBytes(kTypedData##clazz##Cid);     \
+    intptr_t max_len = TypedData::MaxElements(kTypedData##clazz##Cid);         \
+    int shift = GetScaleFactor(size);                                          \
+    TYPED_ARRAY_ALLOCATION(TypedData, kTypedData##clazz##Cid, max_len, shift); \
+  }
 CLASS_LIST_TYPED_DATA(TYPED_DATA_ALLOCATOR)
 #undef TYPED_DATA_ALLOCATOR
 
@@ -281,8 +282,8 @@
 // Loads args from stack into R0 and R1
 // Tests if they are smis, jumps to label not_smi if not.
 static void TestBothArgumentsSmis(Assembler* assembler, Label* not_smi) {
-  __ ldr(R0, Address(SP, + 0 * kWordSize));
-  __ ldr(R1, Address(SP, + 1 * kWordSize));
+  __ ldr(R0, Address(SP, +0 * kWordSize));
+  __ ldr(R1, Address(SP, +1 * kWordSize));
   __ orr(TMP, R0, Operand(R1));
   __ tst(TMP, Operand(kSmiTagMask));
   __ b(not_smi, NE);
@@ -293,8 +294,8 @@
 void Intrinsifier::Integer_addFromInteger(Assembler* assembler) {
   Label fall_through;
   TestBothArgumentsSmis(assembler, &fall_through);  // Checks two smis.
-  __ adds(R0, R0, Operand(R1));  // Adds.
-  __ bx(LR, VC);  // Return if no overflow.
+  __ adds(R0, R0, Operand(R1));                     // Adds.
+  __ bx(LR, VC);                                    // Return if no overflow.
   // Otherwise fall through.
   __ Bind(&fall_through);
 }
@@ -309,7 +310,7 @@
   Label fall_through;
   TestBothArgumentsSmis(assembler, &fall_through);
   __ subs(R0, R0, Operand(R1));  // Subtract.
-  __ bx(LR, VC);  // Return if no overflow.
+  __ bx(LR, VC);                 // Return if no overflow.
   // Otherwise fall through.
   __ Bind(&fall_through);
 }
@@ -319,7 +320,7 @@
   Label fall_through;
   TestBothArgumentsSmis(assembler, &fall_through);
   __ subs(R0, R1, Operand(R0));  // Subtract.
-  __ bx(LR, VC);  // Return if no overflow.
+  __ bx(LR, VC);                 // Return if no overflow.
   // Otherwise fall through.
   __ Bind(&fall_through);
 }
@@ -328,7 +329,7 @@
 void Intrinsifier::Integer_mulFromInteger(Assembler* assembler) {
   Label fall_through;
   TestBothArgumentsSmis(assembler, &fall_through);  // checks two smis
-  __ SmiUntag(R0);  // Untags R0. We only want result shifted by one.
+  __ SmiUntag(R0);           // Untags R0. We only want result shifted by one.
   __ smull(R0, IP, R0, R1);  // IP:R0 <- R0 * R1.
   __ cmp(IP, Operand(R0, ASR, 31));
   __ bx(LR, EQ);
@@ -404,8 +405,8 @@
   }
   // Check to see if we have integer division
   Label fall_through;
-  __ ldr(R1, Address(SP, + 0 * kWordSize));
-  __ ldr(R0, Address(SP, + 1 * kWordSize));
+  __ ldr(R1, Address(SP, +0 * kWordSize));
+  __ ldr(R0, Address(SP, +1 * kWordSize));
   __ orr(TMP, R0, Operand(R1));
   __ tst(TMP, Operand(kSmiTagMask));
   __ b(&fall_through, NE);
@@ -452,15 +453,15 @@
   // cannot tag the result.
   __ CompareImmediate(R0, 0x40000000);
   __ SmiTag(R0, NE);  // Not equal. Okay to tag and return.
-  __ bx(LR, NE);  // Return.
+  __ bx(LR, NE);      // Return.
   __ Bind(&fall_through);
 }
 
 
 void Intrinsifier::Integer_negate(Assembler* assembler) {
   Label fall_through;
-  __ ldr(R0, Address(SP, + 0 * kWordSize));  // Grab first argument.
-  __ tst(R0, Operand(kSmiTagMask));  // Test for Smi.
+  __ ldr(R0, Address(SP, +0 * kWordSize));  // Grab first argument.
+  __ tst(R0, Operand(kSmiTagMask));         // Test for Smi.
   __ b(&fall_through, NE);
   __ rsbs(R0, R0, Operand(0));  // R0 is a Smi. R0 <- 0 - R0.
   __ bx(LR, VC);  // Return if there wasn't overflow, fall through otherwise.
@@ -547,16 +548,16 @@
   // lo bits = R1 << R0
   __ LoadImmediate(NOTFP, 1);
   __ mov(NOTFP, Operand(NOTFP, LSL, R0));  // NOTFP <- 1 << R0
-  __ sub(NOTFP, NOTFP, Operand(1));  // NOTFP <- NOTFP - 1
-  __ rsb(R3, R0, Operand(32));  // R3 <- 32 - R0
+  __ sub(NOTFP, NOTFP, Operand(1));        // NOTFP <- NOTFP - 1
+  __ rsb(R3, R0, Operand(32));             // R3 <- 32 - R0
   __ mov(NOTFP, Operand(NOTFP, LSL, R3));  // NOTFP <- NOTFP << R3
-  __ and_(NOTFP, R1, Operand(NOTFP));  // NOTFP <- NOTFP & R1
+  __ and_(NOTFP, R1, Operand(NOTFP));      // NOTFP <- NOTFP & R1
   __ mov(NOTFP, Operand(NOTFP, LSR, R3));  // NOTFP <- NOTFP >> R3
   // Now NOTFP has the bits that fall off of R1 on a left shift.
   __ mov(R1, Operand(R1, LSL, R0));  // R1 gets the low bits.
 
-  const Class& mint_class = Class::Handle(
-      Isolate::Current()->object_store()->mint_class());
+  const Class& mint_class =
+      Class::Handle(Isolate::Current()->object_store()->mint_class());
   __ TryAllocate(mint_class, &fall_through, R0, R2);
 
 
@@ -902,7 +903,7 @@
 
   Label last_carry;
   __ teq(R1, Operand(R6));  // Does not affect carry flag.
-  __ b(&last_carry, EQ);  // If used - a_used == 0.
+  __ b(&last_carry, EQ);    // If used - a_used == 0.
 
   Label carry_loop;
   __ Bind(&carry_loop);
@@ -962,7 +963,7 @@
 
   Label done;
   __ teq(R1, Operand(R6));  // Does not affect carry flag.
-  __ b(&done, EQ);  // If used - a_used == 0.
+  __ b(&done, EQ);          // If used - a_used == 0.
 
   Label carry_loop;
   __ Bind(&carry_loop);
@@ -1121,7 +1122,7 @@
 
   // NOTFP = ajp = &a_digits[i]
   __ ldr(R1, Address(SP, 1 * kWordSize));  // a_digits
-  __ add(R1, R1, Operand(R2, LSL, 2));  // j == 2*i, i is Smi.
+  __ add(R1, R1, Operand(R2, LSL, 2));     // j == 2*i, i is Smi.
   __ add(NOTFP, R1, Operand(TypedData::data_offset() - kHeapObjectTag));
 
   // R8:R0 = t = x*x + *ajp
@@ -1164,7 +1165,7 @@
   __ adc(R2, R2, Operand(0));  // R2:R1:R0 = 2*x*xi.
   __ adds(R0, R0, Operand(R8));
   __ adcs(R1, R1, Operand(R9));
-  __ adc(R2, R2, Operand(0));  // R2:R1:R0 = 2*x*xi + c.
+  __ adc(R2, R2, Operand(0));     // R2:R1:R0 = 2*x*xi + c.
   __ ldr(R8, Address(NOTFP, 0));  // R8 = aj = *ajp.
   __ adds(R0, R0, Operand(R8));
   __ adcs(R8, R1, Operand(0));
@@ -1214,8 +1215,8 @@
   __ ldr(R4, Address(SP, 2 * kWordSize));  // args
 
   // R3 = rho = args[2]
-  __ ldr(R3, FieldAddress(R4,
-                          TypedData::data_offset() + 2*Bigint::kBytesPerDigit));
+  __ ldr(R3, FieldAddress(
+                 R4, TypedData::data_offset() + 2 * Bigint::kBytesPerDigit));
 
   // R2 = digits[i >> 1]
   __ ldrd(R0, R1, SP, 0 * kWordSize);  // R0 = i as Smi, R1 = digits
@@ -1226,8 +1227,8 @@
   __ umull(R0, R1, R2, R3);
 
   // args[4] = t mod DIGIT_BASE = low32(t)
-  __ str(R0,
-         FieldAddress(R4, TypedData::data_offset() + 4*Bigint::kBytesPerDigit));
+  __ str(R0, FieldAddress(
+                 R4, TypedData::data_offset() + 4 * Bigint::kBytesPerDigit));
 
   __ mov(R0, Operand(Smi::RawValue(1)));  // One digit processed.
   __ Ret();
@@ -1321,14 +1322,23 @@
     __ ldr(R0, Address(SP, 1 * kWordSize));  // Left argument.
     __ LoadDFromOffset(D0, R0, Double::value_offset() - kHeapObjectTag);
     switch (kind) {
-      case Token::kADD: __ vaddd(D0, D0, D1); break;
-      case Token::kSUB: __ vsubd(D0, D0, D1); break;
-      case Token::kMUL: __ vmuld(D0, D0, D1); break;
-      case Token::kDIV: __ vdivd(D0, D0, D1); break;
-      default: UNREACHABLE();
+      case Token::kADD:
+        __ vaddd(D0, D0, D1);
+        break;
+      case Token::kSUB:
+        __ vsubd(D0, D0, D1);
+        break;
+      case Token::kMUL:
+        __ vmuld(D0, D0, D1);
+        break;
+      case Token::kDIV:
+        __ vdivd(D0, D0, D1);
+        break;
+      default:
+        UNREACHABLE();
     }
-    const Class& double_class = Class::Handle(
-        Isolate::Current()->object_store()->double_class());
+    const Class& double_class =
+        Class::Handle(Isolate::Current()->object_store()->double_class());
     __ TryAllocate(double_class, &fall_through, R0, R1);  // Result register.
     __ StoreDToOffset(D0, R0, Double::value_offset() - kHeapObjectTag);
     __ Ret();
@@ -1377,8 +1387,8 @@
     __ ldr(R0, Address(SP, 1 * kWordSize));
     __ LoadDFromOffset(D0, R0, Double::value_offset() - kHeapObjectTag);
     __ vmuld(D0, D0, D1);
-    const Class& double_class = Class::Handle(
-        Isolate::Current()->object_store()->double_class());
+    const Class& double_class =
+        Class::Handle(Isolate::Current()->object_store()->double_class());
     __ TryAllocate(double_class, &fall_through, R0, R1);  // Result register.
     __ StoreDToOffset(D0, R0, Double::value_offset() - kHeapObjectTag);
     __ Ret();
@@ -1398,8 +1408,8 @@
     __ SmiUntag(R0);
     __ vmovsr(S0, R0);
     __ vcvtdi(D0, S0);
-    const Class& double_class = Class::Handle(
-        Isolate::Current()->object_store()->double_class());
+    const Class& double_class =
+        Class::Handle(Isolate::Current()->object_store()->double_class());
     __ TryAllocate(double_class, &fall_through, R0, R1);  // Result register.
     __ StoreDToOffset(D0, R0, Double::value_offset() - kHeapObjectTag);
     __ Ret();
@@ -1455,7 +1465,7 @@
     __ vcmpdz(D0);
     __ vmstat();
     __ b(&is_false, VS);  // NaN -> false.
-    __ b(&is_zero, EQ);  // Check for negative zero.
+    __ b(&is_zero, EQ);   // Check for negative zero.
     __ b(&is_false, CS);  // >= 0 -> false.
 
     __ Bind(&is_true);
@@ -1510,8 +1520,8 @@
     __ LoadDFromOffset(D1, R0, Double::value_offset() - kHeapObjectTag);
     __ Bind(&double_op);
     __ vsqrtd(D0, D1);
-    const Class& double_class = Class::Handle(
-        Isolate::Current()->object_store()->double_class());
+    const Class& double_class =
+        Class::Handle(Isolate::Current()->object_store()->double_class());
     __ TryAllocate(double_class, &fall_through, R0, R1);  // Result register.
     __ StoreDToOffset(D0, R0, Double::value_offset() - kHeapObjectTag);
     __ Ret();
@@ -1531,8 +1541,8 @@
 void Intrinsifier::Random_nextState(Assembler* assembler) {
   const Library& math_lib = Library::Handle(Library::MathLibrary());
   ASSERT(!math_lib.IsNull());
-  const Class& random_class = Class::Handle(
-      math_lib.LookupClassAllowPrivate(Symbols::_Random()));
+  const Class& random_class =
+      Class::Handle(math_lib.LookupClassAllowPrivate(Symbols::_Random()));
   ASSERT(!random_class.IsNull());
   const Field& state_field = Field::ZoneHandle(
       random_class.LookupInstanceFieldAllowPrivate(Symbols::_state()));
@@ -1554,8 +1564,8 @@
   // Addresses of _state[0] and _state[1].
 
   const int64_t disp_0 = Instance::DataOffsetFor(kTypedDataUint32ArrayCid);
-  const int64_t disp_1 = disp_0 +
-      Instance::ElementSizeFor(kTypedDataUint32ArrayCid);
+  const int64_t disp_1 =
+      disp_0 + Instance::ElementSizeFor(kTypedDataUint32ArrayCid);
 
   __ LoadImmediate(R0, a_int32_value);
   __ LoadFromOffset(kWord, R2, R1, disp_0 - kHeapObjectTag);
@@ -1613,16 +1623,11 @@
 
 
 static void JumpIfString(Assembler* assembler,
-                          Register cid,
-                          Register tmp,
-                          Label* target) {
-  RangeCheck(assembler,
-             cid,
-             tmp,
-             kOneByteStringCid,
-             kExternalTwoByteStringCid,
-             kIfInRange,
-             target);
+                         Register cid,
+                         Register tmp,
+                         Label* target) {
+  RangeCheck(assembler, cid, tmp, kOneByteStringCid, kExternalTwoByteStringCid,
+             kIfInRange, target);
 }
 
 
@@ -1630,13 +1635,8 @@
                             Register cid,
                             Register tmp,
                             Label* target) {
-  RangeCheck(assembler,
-             cid,
-             tmp,
-             kOneByteStringCid,
-             kExternalTwoByteStringCid,
-             kIfNotInRange,
-             target);
+  RangeCheck(assembler, cid, tmp, kOneByteStringCid, kExternalTwoByteStringCid,
+             kIfNotInRange, target);
 }
 
 
@@ -1800,9 +1800,9 @@
   __ Bind(&loop);
 
   if (receiver_cid == kOneByteStringCid) {
-    __ ldrb(R4, Address(R0, 0));     // this.codeUnitAt(i + start)
+    __ ldrb(R4, Address(R0, 0));  // this.codeUnitAt(i + start)
   } else {
-    __ ldrh(R4, Address(R0, 0));     // this.codeUnitAt(i + start)
+    __ ldrh(R4, Address(R0, 0));  // this.codeUnitAt(i + start)
   }
   if (other_cid == kOneByteStringCid) {
     __ ldrb(NOTFP, Address(R2, 0));  // other.codeUnitAt(i)
@@ -1831,7 +1831,7 @@
   __ ldr(R0, Address(SP, 2 * kWordSize));  // this
   __ ldr(R1, Address(SP, 1 * kWordSize));  // start
   __ ldr(R2, Address(SP, 0 * kWordSize));  // other
-  __ Push(R4);  // Make ARGS_DESC_REG available.
+  __ Push(R4);                             // Make ARGS_DESC_REG available.
 
   __ tst(R1, Operand(kSmiTagMask));
   __ b(&fall_through, NE);  // 'start' is not a Smi.
@@ -1842,20 +1842,16 @@
   __ CompareClassId(R0, kOneByteStringCid, R3);
   __ b(&try_two_byte, NE);
 
-  GenerateSubstringMatchesSpecialization(assembler,
-                                         kOneByteStringCid,
-                                         kOneByteStringCid,
-                                         &return_true,
+  GenerateSubstringMatchesSpecialization(assembler, kOneByteStringCid,
+                                         kOneByteStringCid, &return_true,
                                          &return_false);
 
   __ Bind(&try_two_byte);
   __ CompareClassId(R0, kTwoByteStringCid, R3);
   __ b(&fall_through, NE);
 
-  GenerateSubstringMatchesSpecialization(assembler,
-                                         kTwoByteStringCid,
-                                         kOneByteStringCid,
-                                         &return_true,
+  GenerateSubstringMatchesSpecialization(assembler, kTwoByteStringCid,
+                                         kOneByteStringCid, &return_true,
                                          &return_false);
 
   __ Bind(&return_true);
@@ -2044,14 +2040,11 @@
   }
 
   // Set the length field using the saved length (R8).
-  __ StoreIntoObjectNoBarrier(R0,
-                              FieldAddress(R0, String::length_offset()),
+  __ StoreIntoObjectNoBarrier(R0, FieldAddress(R0, String::length_offset()),
                               R8);
   // Clear hash.
   __ LoadImmediate(TMP, 0);
-  __ StoreIntoObjectNoBarrier(R0,
-                              FieldAddress(R0, String::hash_offset()),
-                              TMP);
+  __ StoreIntoObjectNoBarrier(R0, FieldAddress(R0, String::hash_offset()), TMP);
 
   NOT_IN_PRODUCT(__ IncrementAllocationStatsWithSize(R4, R2, space));
   __ b(ok);
@@ -2073,7 +2066,7 @@
 
   __ ldr(R2, Address(SP, kEndIndexOffset));
   __ ldr(TMP, Address(SP, kStartIndexOffset));
-  __ orr(R3, R2,  Operand(TMP));
+  __ orr(R3, R2, Operand(TMP));
   __ tst(R3, Operand(kSmiTagMask));
   __ b(&fall_through, NE);  // 'start', 'end' not Smi.
 
@@ -2171,8 +2164,9 @@
   // TODO(zra): try out other sequences.
   ASSERT((string_cid == kOneByteStringCid) ||
          (string_cid == kTwoByteStringCid));
-  const intptr_t offset = (string_cid == kOneByteStringCid) ?
-      OneByteString::data_offset() : TwoByteString::data_offset();
+  const intptr_t offset = (string_cid == kOneByteStringCid)
+                              ? OneByteString::data_offset()
+                              : TwoByteString::data_offset();
   __ AddImmediate(R0, offset - kHeapObjectTag);
   __ AddImmediate(R1, offset - kHeapObjectTag);
   __ SmiUntag(R2);
@@ -2258,7 +2252,7 @@
   // R0: Current user tag.
   __ ldr(R0, Address(R1, Isolate::current_tag_offset()));
   // R2: UserTag.
-  __ ldr(R2, Address(SP, + 0 * kWordSize));
+  __ ldr(R2, Address(SP, +0 * kWordSize));
   // Set Isolate::current_tag_.
   __ str(R2, Address(R1, Isolate::current_tag_offset()));
   // R2: UserTag's tag.
diff --git a/runtime/vm/intrinsifier_arm64.cc b/runtime/vm/intrinsifier_arm64.cc
index 756010b..5eba9f6 100644
--- a/runtime/vm/intrinsifier_arm64.cc
+++ b/runtime/vm/intrinsifier_arm64.cc
@@ -29,7 +29,9 @@
 #define __ assembler->
 
 
-intptr_t Intrinsifier::ParameterSlotFromSp() { return -1; }
+intptr_t Intrinsifier::ParameterSlotFromSp() {
+  return -1;
+}
 
 
 static bool IsABIPreservedRegister(Register reg) {
@@ -83,10 +85,8 @@
   // Note that R1 is Smi, i.e, times 2.
   ASSERT(kSmiTagShift == 1);
   __ ldr(R2, Address(SP, 0 * kWordSize));  // Value.
-  __ add(R1, R0, Operand(R1, LSL, 2));  // R1 is Smi.
-  __ StoreIntoObject(R0,
-                     FieldAddress(R1, Array::data_offset()),
-                     R2);
+  __ add(R1, R0, Operand(R1, LSL, 2));     // R1 is Smi.
+  __ StoreIntoObject(R0, FieldAddress(R1, Array::data_offset()), R2);
   // Caller is responsible for preserving the value if necessary.
   __ ret();
   __ Bind(&fall_through);
@@ -110,17 +110,13 @@
   __ ldr(R1, Address(SP, kArrayOffset));  // Data argument.
   // R0 is new, no barrier needed.
   __ StoreIntoObjectNoBarrier(
-      R0,
-      FieldAddress(R0, GrowableObjectArray::data_offset()),
-      R1);
+      R0, FieldAddress(R0, GrowableObjectArray::data_offset()), R1);
 
   // R0: new growable array object start as a tagged pointer.
   // Store the type argument field in the growable array object.
   __ ldr(R1, Address(SP, kTypeArgumentsOffset));  // Type argument.
   __ StoreIntoObjectNoBarrier(
-      R0,
-      FieldAddress(R0, GrowableObjectArray::type_arguments_offset()),
-      R1);
+      R0, FieldAddress(R0, GrowableObjectArray::type_arguments_offset()), R1);
 
   // Set the length field in the growable array object to 0.
   __ LoadImmediate(R1, 0);
@@ -158,9 +154,7 @@
   __ ldr(R0, Address(SP, 0 * kWordSize));  // Value.
   ASSERT(kSmiTagShift == 1);
   __ add(R1, R2, Operand(R1, LSL, 2));
-  __ StoreIntoObject(R2,
-                     FieldAddress(R1, Array::data_offset()),
-                     R0);
+  __ StoreIntoObject(R2, FieldAddress(R1, Array::data_offset()), R0);
   __ LoadObject(R0, Object::null_object());
   __ ret();
   __ Bind(&fall_through);
@@ -169,11 +163,16 @@
 
 static int GetScaleFactor(intptr_t size) {
   switch (size) {
-    case 1: return 0;
-    case 2: return 1;
-    case 4: return 2;
-    case 8: return 3;
-    case 16: return 4;
+    case 1:
+      return 0;
+    case 2:
+      return 1;
+    case 4:
+      return 2;
+    case 8:
+      return 3;
+    case 16:
+      return 4;
   }
   UNREACHABLE();
   return -1;
@@ -184,7 +183,7 @@
   Label fall_through;                                                          \
   const intptr_t kArrayLengthStackOffset = 0 * kWordSize;                      \
   NOT_IN_PRODUCT(__ MaybeTraceAllocation(cid, R2, &fall_through));             \
-  __ ldr(R2, Address(SP, kArrayLengthStackOffset));  /* Array length. */       \
+  __ ldr(R2, Address(SP, kArrayLengthStackOffset)); /* Array length. */        \
   /* Check that length is a positive Smi. */                                   \
   /* R2: requested array length argument. */                                   \
   __ tsti(R2, Immediate(kSmiTagMask));                                         \
@@ -206,7 +205,7 @@
                                                                                \
   /* R2: allocation size. */                                                   \
   __ adds(R1, R0, Operand(R2));                                                \
-  __ b(&fall_through, CS);  /* Fail on unsigned overflow. */                   \
+  __ b(&fall_through, CS); /* Fail on unsigned overflow. */                    \
                                                                                \
   /* Check if the allocation fits into the remaining space. */                 \
   /* R0: potential new object start. */                                        \
@@ -234,15 +233,14 @@
     /* Get the class index and insert it into the tags. */                     \
     __ LoadImmediate(TMP, RawObject::ClassIdTag::encode(cid));                 \
     __ orr(R2, R2, Operand(TMP));                                              \
-    __ str(R2, FieldAddress(R0, type_name::tags_offset()));  /* Tags. */       \
+    __ str(R2, FieldAddress(R0, type_name::tags_offset())); /* Tags. */        \
   }                                                                            \
   /* Set the length field. */                                                  \
   /* R0: new object start as a tagged pointer. */                              \
   /* R1: new object end address. */                                            \
-  __ ldr(R2, Address(SP, kArrayLengthStackOffset));  /* Array length. */       \
-  __ StoreIntoObjectNoBarrier(R0,                                              \
-                              FieldAddress(R0, type_name::length_offset()),    \
-                              R2);                                             \
+  __ ldr(R2, Address(SP, kArrayLengthStackOffset)); /* Array length. */        \
+  __ StoreIntoObjectNoBarrier(                                                 \
+      R0, FieldAddress(R0, type_name::length_offset()), R2);                   \
   /* Initialize all array elements to 0. */                                    \
   /* R0: new object start as a tagged pointer. */                              \
   /* R1: new object end address. */                                            \
@@ -261,16 +259,16 @@
   __ Bind(&done);                                                              \
                                                                                \
   __ ret();                                                                    \
-  __ Bind(&fall_through);                                                      \
+  __ Bind(&fall_through);
 
 
 #define TYPED_DATA_ALLOCATOR(clazz)                                            \
-void Intrinsifier::TypedData_##clazz##_factory(Assembler* assembler) {         \
-  intptr_t size = TypedData::ElementSizeInBytes(kTypedData##clazz##Cid);       \
-  intptr_t max_len = TypedData::MaxElements(kTypedData##clazz##Cid);           \
-  int shift = GetScaleFactor(size);                                            \
-  TYPED_ARRAY_ALLOCATION(TypedData, kTypedData##clazz##Cid, max_len, shift);   \
-}
+  void Intrinsifier::TypedData_##clazz##_factory(Assembler* assembler) {       \
+    intptr_t size = TypedData::ElementSizeInBytes(kTypedData##clazz##Cid);     \
+    intptr_t max_len = TypedData::MaxElements(kTypedData##clazz##Cid);         \
+    int shift = GetScaleFactor(size);                                          \
+    TYPED_ARRAY_ALLOCATION(TypedData, kTypedData##clazz##Cid, max_len, shift); \
+  }
 CLASS_LIST_TYPED_DATA(TYPED_DATA_ALLOCATOR)
 #undef TYPED_DATA_ALLOCATOR
 
@@ -278,8 +276,8 @@
 // Loads args from stack into R0 and R1
 // Tests if they are smis, jumps to label not_smi if not.
 static void TestBothArgumentsSmis(Assembler* assembler, Label* not_smi) {
-  __ ldr(R0, Address(SP, + 0 * kWordSize));
-  __ ldr(R1, Address(SP, + 1 * kWordSize));
+  __ ldr(R0, Address(SP, +0 * kWordSize));
+  __ ldr(R1, Address(SP, +1 * kWordSize));
   __ orr(TMP, R0, Operand(R1));
   __ tsti(TMP, Immediate(kSmiTagMask));
   __ b(not_smi, NE);
@@ -289,8 +287,8 @@
 void Intrinsifier::Integer_addFromInteger(Assembler* assembler) {
   Label fall_through;
   TestBothArgumentsSmis(assembler, &fall_through);  // Checks two smis.
-  __ adds(R0, R0, Operand(R1));  // Adds.
-  __ b(&fall_through, VS);  // Fall-through on overflow.
+  __ adds(R0, R0, Operand(R1));                     // Adds.
+  __ b(&fall_through, VS);                          // Fall-through on overflow.
   __ ret();
   __ Bind(&fall_through);
 }
@@ -305,7 +303,7 @@
   Label fall_through;
   TestBothArgumentsSmis(assembler, &fall_through);
   __ subs(R0, R0, Operand(R1));  // Subtract.
-  __ b(&fall_through, VS);  // Fall-through on overflow.
+  __ b(&fall_through, VS);       // Fall-through on overflow.
   __ ret();
   __ Bind(&fall_through);
 }
@@ -315,7 +313,7 @@
   Label fall_through;
   TestBothArgumentsSmis(assembler, &fall_through);
   __ subs(R0, R1, Operand(R0));  // Subtract.
-  __ b(&fall_through, VS);  // Fall-through on overflow.
+  __ b(&fall_through, VS);       // Fall-through on overflow.
   __ ret();
   __ Bind(&fall_through);
 }
@@ -404,8 +402,8 @@
 void Intrinsifier::Integer_moduloFromInteger(Assembler* assembler) {
   // Check to see if we have integer division
   Label neg_remainder, fall_through;
-  __ ldr(R1, Address(SP, + 0 * kWordSize));
-  __ ldr(R0, Address(SP, + 1 * kWordSize));
+  __ ldr(R1, Address(SP, +0 * kWordSize));
+  __ ldr(R0, Address(SP, +1 * kWordSize));
   __ orr(TMP, R0, Operand(R1));
   __ tsti(TMP, Immediate(kSmiTagMask));
   __ b(&fall_through, NE);
@@ -453,15 +451,15 @@
   __ CompareImmediate(R0, 0x4000000000000000);
   __ b(&fall_through, EQ);
   __ SmiTag(R0);  // Not equal. Okay to tag and return.
-  __ ret();  // Return.
+  __ ret();       // Return.
   __ Bind(&fall_through);
 }
 
 
 void Intrinsifier::Integer_negate(Assembler* assembler) {
   Label fall_through;
-  __ ldr(R0, Address(SP, + 0 * kWordSize));  // Grab first argument.
-  __ tsti(R0, Immediate(kSmiTagMask));  // Test for Smi.
+  __ ldr(R0, Address(SP, +0 * kWordSize));  // Grab first argument.
+  __ tsti(R0, Immediate(kSmiTagMask));      // Test for Smi.
   __ b(&fall_through, NE);
   __ negs(R0, R0);
   __ b(&fall_through, VS);
@@ -523,8 +521,7 @@
   Label fall_through;
 
   TestBothArgumentsSmis(assembler, &fall_through);
-  __ CompareImmediate(
-      right, reinterpret_cast<int64_t>(Smi::New(Smi::kBits)));
+  __ CompareImmediate(right, reinterpret_cast<int64_t>(Smi::New(Smi::kBits)));
   __ b(&fall_through, CS);
 
   // Left is not a constant.
@@ -813,24 +810,24 @@
   Label add_loop;
   __ Bind(&add_loop);
   // Loop (a_used+1)/2 times, a_used > 0.
-  __ ldr(R0, Address(R3, 2*Bigint::kBytesPerDigit, Address::PostIndex));
-  __ ldr(R1, Address(R5, 2*Bigint::kBytesPerDigit, Address::PostIndex));
+  __ ldr(R0, Address(R3, 2 * Bigint::kBytesPerDigit, Address::PostIndex));
+  __ ldr(R1, Address(R5, 2 * Bigint::kBytesPerDigit, Address::PostIndex));
   __ adcs(R0, R0, R1);
   __ sub(R9, R3, Operand(R7));  // Does not affect carry flag.
-  __ str(R0, Address(R6, 2*Bigint::kBytesPerDigit, Address::PostIndex));
+  __ str(R0, Address(R6, 2 * Bigint::kBytesPerDigit, Address::PostIndex));
   __ cbnz(&add_loop, R9);  // Does not affect carry flag.
 
   Label last_carry;
   __ sub(R9, R3, Operand(R8));  // Does not affect carry flag.
-  __ cbz(&last_carry, R9);  // If used - a_used == 0.
+  __ cbz(&last_carry, R9);      // If used - a_used == 0.
 
   Label carry_loop;
   __ Bind(&carry_loop);
   // Loop (used+1)/2 - (a_used+1)/2 times, used - a_used > 0.
-  __ ldr(R0, Address(R3, 2*Bigint::kBytesPerDigit, Address::PostIndex));
+  __ ldr(R0, Address(R3, 2 * Bigint::kBytesPerDigit, Address::PostIndex));
   __ adcs(R0, R0, ZR);
   __ sub(R9, R3, Operand(R8));  // Does not affect carry flag.
-  __ str(R0, Address(R6, 2*Bigint::kBytesPerDigit, Address::PostIndex));
+  __ str(R0, Address(R6, 2 * Bigint::kBytesPerDigit, Address::PostIndex));
   __ cbnz(&carry_loop, R9);
 
   __ Bind(&last_carry);
@@ -879,24 +876,24 @@
   Label sub_loop;
   __ Bind(&sub_loop);
   // Loop (a_used+1)/2 times, a_used > 0.
-  __ ldr(R0, Address(R3, 2*Bigint::kBytesPerDigit, Address::PostIndex));
-  __ ldr(R1, Address(R5, 2*Bigint::kBytesPerDigit, Address::PostIndex));
+  __ ldr(R0, Address(R3, 2 * Bigint::kBytesPerDigit, Address::PostIndex));
+  __ ldr(R1, Address(R5, 2 * Bigint::kBytesPerDigit, Address::PostIndex));
   __ sbcs(R0, R0, R1);
   __ sub(R9, R3, Operand(R7));  // Does not affect carry flag.
-  __ str(R0, Address(R6, 2*Bigint::kBytesPerDigit, Address::PostIndex));
+  __ str(R0, Address(R6, 2 * Bigint::kBytesPerDigit, Address::PostIndex));
   __ cbnz(&sub_loop, R9);  // Does not affect carry flag.
 
   Label done;
   __ sub(R9, R3, Operand(R8));  // Does not affect carry flag.
-  __ cbz(&done, R9);  // If used - a_used == 0.
+  __ cbz(&done, R9);            // If used - a_used == 0.
 
   Label carry_loop;
   __ Bind(&carry_loop);
   // Loop (used+1)/2 - (a_used+1)/2 times, used - a_used > 0.
-  __ ldr(R0, Address(R3, 2*Bigint::kBytesPerDigit, Address::PostIndex));
+  __ ldr(R0, Address(R3, 2 * Bigint::kBytesPerDigit, Address::PostIndex));
   __ sbcs(R0, R0, ZR);
   __ sub(R9, R3, Operand(R8));  // Does not affect carry flag.
-  __ str(R0, Address(R6, 2*Bigint::kBytesPerDigit, Address::PostIndex));
+  __ str(R0, Address(R6, 2 * Bigint::kBytesPerDigit, Address::PostIndex));
   __ cbnz(&carry_loop, R9);
 
   __ Bind(&done);
@@ -974,21 +971,21 @@
   // t:   R7:R8 (not live at loop entry)
 
   // uint64_t mi = *mip++
-  __ ldr(R2, Address(R4, 2*Bigint::kBytesPerDigit, Address::PostIndex));
+  __ ldr(R2, Address(R4, 2 * Bigint::kBytesPerDigit, Address::PostIndex));
 
   // uint64_t aj = *ajp
   __ ldr(R0, Address(R5, 0));
 
   // uint128_t t = x*mi + aj + c
-  __ mul(R7, R2, R3);  // R7 = low64(R2*R3).
+  __ mul(R7, R2, R3);    // R7 = low64(R2*R3).
   __ umulh(R8, R2, R3);  // R8 = high64(R2*R3), t = R8:R7 = x*mi.
   __ adds(R7, R7, Operand(R0));
-  __ adc(R8, R8, ZR);  // t += aj.
+  __ adc(R8, R8, ZR);            // t += aj.
   __ adds(R0, R7, Operand(R1));  // t += c, R0 = low64(t).
-  __ adc(R1, R8, ZR);  // c = R1 = high64(t).
+  __ adc(R1, R8, ZR);            // c = R1 = high64(t).
 
   // *ajp++ = low64(t) = R0
-  __ str(R0, Address(R5, 2*Bigint::kBytesPerDigit, Address::PostIndex));
+  __ str(R0, Address(R5, 2 * Bigint::kBytesPerDigit, Address::PostIndex));
 
   // while (--n > 0)
   __ subs(R6, R6, Operand(1));  // --n
@@ -1000,14 +997,14 @@
   // *ajp++ += c
   __ ldr(R0, Address(R5, 0));
   __ adds(R0, R0, Operand(R1));
-  __ str(R0, Address(R5, 2*Bigint::kBytesPerDigit, Address::PostIndex));
+  __ str(R0, Address(R5, 2 * Bigint::kBytesPerDigit, Address::PostIndex));
   __ b(&done, CC);
 
   Label propagate_carry_loop;
   __ Bind(&propagate_carry_loop);
   __ ldr(R0, Address(R5, 0));
   __ adds(R0, R0, Operand(1));
-  __ str(R0, Address(R5, 2*Bigint::kBytesPerDigit, Address::PostIndex));
+  __ str(R0, Address(R5, 2 * Bigint::kBytesPerDigit, Address::PostIndex));
   __ b(&propagate_carry_loop, CS);
 
   __ Bind(&done);
@@ -1051,31 +1048,31 @@
 
   // R3 = x = *xip++, return if x == 0
   Label x_zero;
-  __ ldr(R3, Address(R4, 2*Bigint::kBytesPerDigit, Address::PostIndex));
+  __ ldr(R3, Address(R4, 2 * Bigint::kBytesPerDigit, Address::PostIndex));
   __ tst(R3, Operand(R3));
   __ b(&x_zero, EQ);
 
   // R5 = ajp = &a_digits[i]
   __ ldr(R1, Address(SP, 1 * kWordSize));  // a_digits
-  __ add(R1, R1, Operand(R2, LSL, 2));  // j == 2*i, i is Smi.
+  __ add(R1, R1, Operand(R2, LSL, 2));     // j == 2*i, i is Smi.
   __ add(R5, R1, Operand(TypedData::data_offset() - kHeapObjectTag));
 
   // R6:R1 = t = x*x + *ajp
   __ ldr(R0, Address(R5, 0));
-  __ mul(R1, R3, R3);  // R1 = low64(R3*R3).
-  __ umulh(R6, R3, R3);  // R6 = high64(R3*R3).
+  __ mul(R1, R3, R3);            // R1 = low64(R3*R3).
+  __ umulh(R6, R3, R3);          // R6 = high64(R3*R3).
   __ adds(R1, R1, Operand(R0));  // R6:R1 += *ajp.
-  __ adc(R6, R6, ZR);  // R6 = low64(c) = high64(t).
-  __ mov(R7, ZR);  // R7 = high64(c) = 0.
+  __ adc(R6, R6, ZR);            // R6 = low64(c) = high64(t).
+  __ mov(R7, ZR);                // R7 = high64(c) = 0.
 
   // *ajp++ = low64(t) = R1
-  __ str(R1, Address(R5, 2*Bigint::kBytesPerDigit, Address::PostIndex));
+  __ str(R1, Address(R5, 2 * Bigint::kBytesPerDigit, Address::PostIndex));
 
   // int n = (used - i + 1)/2 - 1
   __ ldr(R0, Address(SP, 0 * kWordSize));  // used is Smi
   __ sub(R8, R0, Operand(R2));
   __ add(R8, R8, Operand(2));
-  __ movn(R0, Immediate(1), 0);  // R0 = ~1 = -2.
+  __ movn(R0, Immediate(1), 0);          // R0 = ~1 = -2.
   __ adds(R8, R0, Operand(R8, ASR, 2));  // while (--n >= 0)
 
   Label loop, done;
@@ -1090,24 +1087,24 @@
   // n:   R8
 
   // uint64_t xi = *xip++
-  __ ldr(R2, Address(R4, 2*Bigint::kBytesPerDigit, Address::PostIndex));
+  __ ldr(R2, Address(R4, 2 * Bigint::kBytesPerDigit, Address::PostIndex));
 
   // uint192_t t = R2:R1:R0 = 2*x*xi + aj + c
-  __ mul(R0, R2, R3);  // R0 = low64(R2*R3) = low64(x*xi).
+  __ mul(R0, R2, R3);    // R0 = low64(R2*R3) = low64(x*xi).
   __ umulh(R1, R2, R3);  // R1 = high64(R2*R3) = high64(x*xi).
   __ adds(R0, R0, Operand(R0));
   __ adcs(R1, R1, R1);
   __ adc(R2, ZR, ZR);  // R2:R1:R0 = R1:R0 + R1:R0 = 2*x*xi.
   __ adds(R0, R0, Operand(R6));
   __ adcs(R1, R1, R7);
-  __ adc(R2, R2, ZR);  // R2:R1:R0 += c.
+  __ adc(R2, R2, ZR);          // R2:R1:R0 += c.
   __ ldr(R7, Address(R5, 0));  // R7 = aj = *ajp.
   __ adds(R0, R0, Operand(R7));
   __ adcs(R6, R1, ZR);
   __ adc(R7, R2, ZR);  // R7:R6:R0 = 2*x*xi + aj + c.
 
   // *ajp++ = low64(t) = R0
-  __ str(R0, Address(R5, 2*Bigint::kBytesPerDigit, Address::PostIndex));
+  __ str(R0, Address(R5, 2 * Bigint::kBytesPerDigit, Address::PostIndex));
 
   // while (--n >= 0)
   __ subs(R8, R8, Operand(1));  // --n
@@ -1198,8 +1195,8 @@
   __ b(&return_qd, EQ);
 
   // R1 = dl = digits[(i >> 1) - 3 .. (i >> 1) - 2]
-  __ ldr(R1,
-         FieldAddress(R1, TypedData::data_offset() - 3*Bigint::kBytesPerDigit));
+  __ ldr(R1, FieldAddress(
+                 R1, TypedData::data_offset() - 3 * Bigint::kBytesPerDigit));
 
   // R5 = yth = yt >> 32
   __ orr(R5, ZR, Operand(R3, LSR, 32));
@@ -1297,8 +1294,8 @@
 
   __ Bind(&return_qd);
   // args[2..3] = qd
-  __ str(R0,
-         FieldAddress(R4, TypedData::data_offset() + 2*Bigint::kBytesPerDigit));
+  __ str(R0, FieldAddress(
+                 R4, TypedData::data_offset() + 2 * Bigint::kBytesPerDigit));
 
   __ LoadImmediate(R0, Smi::RawValue(2));  // Two digits processed.
   __ ret();
@@ -1319,8 +1316,8 @@
   __ ldr(R4, Address(SP, 2 * kWordSize));  // args
 
   // R3 = rho = args[2..3]
-  __ ldr(R3,
-         FieldAddress(R4, TypedData::data_offset() + 2*Bigint::kBytesPerDigit));
+  __ ldr(R3, FieldAddress(
+                 R4, TypedData::data_offset() + 2 * Bigint::kBytesPerDigit));
 
   // R2 = digits[i >> 1 .. (i >> 1) + 1]
   // R0 = i as Smi, R1 = digits
@@ -1332,8 +1329,8 @@
   __ mul(R0, R2, R3);  // R0 = low64(R2*R3).
 
   // args[4 .. 5] = R0
-  __ str(R0,
-         FieldAddress(R4, TypedData::data_offset() + 4*Bigint::kBytesPerDigit));
+  __ str(R0, FieldAddress(
+                 R4, TypedData::data_offset() + 4 * Bigint::kBytesPerDigit));
 
   __ LoadImmediate(R0, Smi::RawValue(2));  // Two digits processed.
   __ ret();
@@ -1425,14 +1422,23 @@
   __ ldr(R0, Address(SP, 1 * kWordSize));  // Left argument.
   __ LoadDFieldFromOffset(V0, R0, Double::value_offset());
   switch (kind) {
-    case Token::kADD: __ faddd(V0, V0, V1); break;
-    case Token::kSUB: __ fsubd(V0, V0, V1); break;
-    case Token::kMUL: __ fmuld(V0, V0, V1); break;
-    case Token::kDIV: __ fdivd(V0, V0, V1); break;
-    default: UNREACHABLE();
+    case Token::kADD:
+      __ faddd(V0, V0, V1);
+      break;
+    case Token::kSUB:
+      __ fsubd(V0, V0, V1);
+      break;
+    case Token::kMUL:
+      __ fmuld(V0, V0, V1);
+      break;
+    case Token::kDIV:
+      __ fdivd(V0, V0, V1);
+      break;
+    default:
+      UNREACHABLE();
   }
-  const Class& double_class = Class::Handle(
-      Isolate::Current()->object_store()->double_class());
+  const Class& double_class =
+      Class::Handle(Isolate::Current()->object_store()->double_class());
   __ TryAllocate(double_class, &fall_through, R0, R1);
   __ StoreDFieldToOffset(V0, R0, Double::value_offset());
   __ ret();
@@ -1479,8 +1485,8 @@
   __ ldr(R0, Address(SP, 1 * kWordSize));
   __ LoadDFieldFromOffset(V0, R0, Double::value_offset());
   __ fmuld(V0, V0, V1);
-  const Class& double_class = Class::Handle(
-      Isolate::Current()->object_store()->double_class());
+  const Class& double_class =
+      Class::Handle(Isolate::Current()->object_store()->double_class());
   __ TryAllocate(double_class, &fall_through, R0, R1);
   __ StoreDFieldToOffset(V0, R0, Double::value_offset());
   __ ret();
@@ -1497,8 +1503,8 @@
   // Is Smi.
   __ SmiUntag(R0);
   __ scvtfdx(V0, R0);
-  const Class& double_class = Class::Handle(
-      Isolate::Current()->object_store()->double_class());
+  const Class& double_class =
+      Class::Handle(Isolate::Current()->object_store()->double_class());
   __ TryAllocate(double_class, &fall_through, R0, R1);
   __ StoreDFieldToOffset(V0, R0, Double::value_offset());
   __ ret();
@@ -1542,7 +1548,7 @@
   __ LoadObject(true_reg, Bool::True());
   __ LoadObject(false_reg, Bool::False());
   __ b(&is_false, VS);  // NaN -> false.
-  __ b(&is_zero, EQ);  // Check for negative zero.
+  __ b(&is_zero, EQ);   // Check for negative zero.
   __ b(&is_false, CS);  // >= 0 -> false.
 
   __ Bind(&is_true);
@@ -1590,8 +1596,8 @@
   __ LoadDFieldFromOffset(V1, R0, Double::value_offset());
   __ Bind(&double_op);
   __ fsqrtd(V0, V1);
-  const Class& double_class = Class::Handle(
-      Isolate::Current()->object_store()->double_class());
+  const Class& double_class =
+      Class::Handle(Isolate::Current()->object_store()->double_class());
   __ TryAllocate(double_class, &fall_through, R0, R1);
   __ StoreDFieldToOffset(V0, R0, Double::value_offset());
   __ ret();
@@ -1609,8 +1615,8 @@
 void Intrinsifier::Random_nextState(Assembler* assembler) {
   const Library& math_lib = Library::Handle(Library::MathLibrary());
   ASSERT(!math_lib.IsNull());
-  const Class& random_class = Class::Handle(
-      math_lib.LookupClassAllowPrivate(Symbols::_Random()));
+  const Class& random_class =
+      Class::Handle(math_lib.LookupClassAllowPrivate(Symbols::_Random()));
   ASSERT(!random_class.IsNull());
   const Field& state_field = Field::ZoneHandle(
       random_class.LookupInstanceFieldAllowPrivate(Symbols::_state()));
@@ -1687,16 +1693,11 @@
 
 
 static void JumpIfString(Assembler* assembler,
-                          Register cid,
-                          Register tmp,
-                          Label* target) {
-  RangeCheck(assembler,
-             cid,
-             tmp,
-             kOneByteStringCid,
-             kExternalTwoByteStringCid,
-             kIfInRange,
-             target);
+                         Register cid,
+                         Register tmp,
+                         Label* target) {
+  RangeCheck(assembler, cid, tmp, kOneByteStringCid, kExternalTwoByteStringCid,
+             kIfInRange, target);
 }
 
 
@@ -1704,13 +1705,8 @@
                             Register cid,
                             Register tmp,
                             Label* target) {
-  RangeCheck(assembler,
-             cid,
-             tmp,
-             kOneByteStringCid,
-             kExternalTwoByteStringCid,
-             kIfNotInRange,
-             target);
+  RangeCheck(assembler, cid, tmp, kOneByteStringCid, kExternalTwoByteStringCid,
+             kIfNotInRange, target);
 }
 
 
@@ -1915,20 +1911,16 @@
   __ CompareClassId(R0, kOneByteStringCid);
   __ b(&fall_through, NE);
 
-  GenerateSubstringMatchesSpecialization(assembler,
-                                         kOneByteStringCid,
-                                         kOneByteStringCid,
-                                         &return_true,
+  GenerateSubstringMatchesSpecialization(assembler, kOneByteStringCid,
+                                         kOneByteStringCid, &return_true,
                                          &return_false);
 
   __ Bind(&try_two_byte);
   __ CompareClassId(R0, kTwoByteStringCid);
   __ b(&fall_through, NE);
 
-  GenerateSubstringMatchesSpecialization(assembler,
-                                         kTwoByteStringCid,
-                                         kOneByteStringCid,
-                                         &return_true,
+  GenerateSubstringMatchesSpecialization(assembler, kTwoByteStringCid,
+                                         kOneByteStringCid, &return_true,
                                          &return_false);
 
   __ Bind(&return_true);
@@ -1963,8 +1955,7 @@
   __ CompareImmediate(R1, Symbols::kNumberOfOneCharCodeSymbols);
   __ b(&fall_through, GE);
   __ ldr(R0, Address(THR, Thread::predefined_symbols_address_offset()));
-  __ AddImmediate(
-      R0, R0, Symbols::kNullCharCodeSymbolOffset * kWordSize);
+  __ AddImmediate(R0, R0, Symbols::kNullCharCodeSymbolOffset * kWordSize);
   __ ldr(R0, Address(R0, R1, UXTX, Address::Scaled));
   __ ret();
 
@@ -1977,8 +1968,7 @@
   __ CompareImmediate(R1, Symbols::kNumberOfOneCharCodeSymbols);
   __ b(&fall_through, GE);
   __ ldr(R0, Address(THR, Thread::predefined_symbols_address_offset()));
-  __ AddImmediate(
-      R0, R0, Symbols::kNullCharCodeSymbolOffset * kWordSize);
+  __ AddImmediate(R0, R0, Symbols::kNullCharCodeSymbolOffset * kWordSize);
   __ ldr(R0, Address(R0, R1, UXTX, Address::Scaled));
   __ ret();
 
@@ -2046,8 +2036,7 @@
   __ eorw(R0, R0, Operand(R0, LSR, 11));
   __ addw(R0, R0, Operand(R0, LSL, 15));
   // hash_ = hash_ & ((static_cast<intptr_t>(1) << bits) - 1);
-  __ AndImmediate(
-      R0, R0, (static_cast<intptr_t>(1) << String::kHashBits) - 1);
+  __ AndImmediate(R0, R0, (static_cast<intptr_t>(1) << String::kHashBits) - 1);
   __ CompareRegisters(R0, ZR);
   // return hash_ == 0 ? 1 : hash_;
   __ Bind(&done);
@@ -2118,8 +2107,7 @@
   }
 
   // Set the length field using the saved length (R6).
-  __ StoreIntoObjectNoBarrier(R0,
-                              FieldAddress(R0, String::length_offset()),
+  __ StoreIntoObjectNoBarrier(R0, FieldAddress(R0, String::length_offset()),
                               R6);
   // Clear hash.
   __ mov(TMP, ZR);
@@ -2143,7 +2131,7 @@
 
   __ ldr(R2, Address(SP, kEndIndexOffset));
   __ ldr(TMP, Address(SP, kStartIndexOffset));
-  __ orr(R3, R2,  Operand(TMP));
+  __ orr(R3, R2, Operand(TMP));
   __ tsti(R3, Immediate(kSmiTagMask));
   __ b(&fall_through, NE);  // 'start', 'end' not Smi.
 
@@ -2242,8 +2230,9 @@
   // TODO(zra): try out other sequences.
   ASSERT((string_cid == kOneByteStringCid) ||
          (string_cid == kTwoByteStringCid));
-  const intptr_t offset = (string_cid == kOneByteStringCid) ?
-      OneByteString::data_offset() : TwoByteString::data_offset();
+  const intptr_t offset = (string_cid == kOneByteStringCid)
+                              ? OneByteString::data_offset()
+                              : TwoByteString::data_offset();
   __ AddImmediate(R0, R0, offset - kHeapObjectTag);
   __ AddImmediate(R1, R1, offset - kHeapObjectTag);
   __ SmiUntag(R2);
@@ -2329,7 +2318,7 @@
   // R0: Current user tag.
   __ ldr(R0, Address(R1, Isolate::current_tag_offset()));
   // R2: UserTag.
-  __ ldr(R2, Address(SP, + 0 * kWordSize));
+  __ ldr(R2, Address(SP, +0 * kWordSize));
   // Set Isolate::current_tag_.
   __ str(R2, Address(R1, Isolate::current_tag_offset()));
   // R2: UserTag's tag.
diff --git a/runtime/vm/intrinsifier_dbc.cc b/runtime/vm/intrinsifier_dbc.cc
index 3d0b5d1..e967468 100644
--- a/runtime/vm/intrinsifier_dbc.cc
+++ b/runtime/vm/intrinsifier_dbc.cc
@@ -21,14 +21,16 @@
 
 DECLARE_FLAG(bool, interpret_irregexp);
 
-intptr_t Intrinsifier::ParameterSlotFromSp() { return -1; }
+intptr_t Intrinsifier::ParameterSlotFromSp() {
+  return -1;
+}
 
 #define DEFINE_FUNCTION(class_name, test_function_name, enum_name, type, fp)   \
   void Intrinsifier::enum_name(Assembler* assembler) {                         \
     if (Simulator::IsSupportedIntrinsic(Simulator::k##enum_name##Intrinsic)) { \
       assembler->Intrinsic(Simulator::k##enum_name##Intrinsic);                \
     }                                                                          \
-  }                                                                            \
+  }
 
 ALL_INTRINSICS_LIST(DEFINE_FUNCTION)
 GRAPH_INTRINSICS_LIST(DEFINE_FUNCTION)
diff --git a/runtime/vm/intrinsifier_ia32.cc b/runtime/vm/intrinsifier_ia32.cc
index 8f4d865..2e810d9a4 100644
--- a/runtime/vm/intrinsifier_ia32.cc
+++ b/runtime/vm/intrinsifier_ia32.cc
@@ -37,7 +37,9 @@
 #define __ assembler->
 
 
-intptr_t Intrinsifier::ParameterSlotFromSp() { return 0; }
+intptr_t Intrinsifier::ParameterSlotFromSp() {
+  return 0;
+}
 
 
 void Intrinsifier::IntrinsicCallPrologue(Assembler* assembler) {
@@ -56,8 +58,8 @@
 
 static intptr_t ComputeObjectArrayTypeArgumentsOffset() {
   const Library& core_lib = Library::Handle(Library::CoreLibrary());
-  const Class& cls = Class::Handle(
-      core_lib.LookupClassAllowPrivate(Symbols::_List()));
+  const Class& cls =
+      Class::Handle(core_lib.LookupClassAllowPrivate(Symbols::_List()));
   ASSERT(!cls.IsNull());
   ASSERT(cls.NumTypeArguments() == 1);
   const intptr_t field_offset = cls.type_arguments_field_offset();
@@ -77,12 +79,12 @@
     const Immediate& raw_null =
         Immediate(reinterpret_cast<intptr_t>(Object::null()));
     Label checked_ok;
-    __ movl(EDI, Address(ESP, + 1 * kWordSize));  // Value.
+    __ movl(EDI, Address(ESP, +1 * kWordSize));  // Value.
     // Null value is valid for any type.
     __ cmpl(EDI, raw_null);
     __ j(EQUAL, &checked_ok, Assembler::kNearJump);
 
-    __ movl(EBX, Address(ESP, + 3 * kWordSize));  // Array.
+    __ movl(EBX, Address(ESP, +3 * kWordSize));  // Array.
     __ movl(EBX, FieldAddress(EBX, type_args_field_offset));
     // EBX: Type arguments of array.
     __ cmpl(EBX, raw_null);
@@ -91,21 +93,21 @@
     // Get type at index 0.
     __ movl(EAX, FieldAddress(EBX, TypeArguments::type_at_offset(0)));
     __ CompareObject(EAX, Object::dynamic_type());
-    __ j(EQUAL,  &checked_ok, Assembler::kNearJump);
+    __ j(EQUAL, &checked_ok, Assembler::kNearJump);
     // Check for int and num.
     __ testl(EDI, Immediate(kSmiTagMask));  // Value is Smi?
-    __ j(NOT_ZERO, &fall_through);  // Non-smi value.
+    __ j(NOT_ZERO, &fall_through);          // Non-smi value.
     __ CompareObject(EAX, Type::ZoneHandle(Type::IntType()));
-    __ j(EQUAL,  &checked_ok, Assembler::kNearJump);
+    __ j(EQUAL, &checked_ok, Assembler::kNearJump);
     __ CompareObject(EAX, Type::ZoneHandle(Type::Number()));
     __ j(NOT_EQUAL, &fall_through);
     __ Bind(&checked_ok);
   }
-  __ movl(EBX, Address(ESP, + 2 * kWordSize));  // Index.
+  __ movl(EBX, Address(ESP, +2 * kWordSize));  // Index.
   __ testl(EBX, Immediate(kSmiTagMask));
   // Index not Smi.
   __ j(NOT_ZERO, &fall_through);
-  __ movl(EAX, Address(ESP, + 3 * kWordSize));  // Array.
+  __ movl(EAX, Address(ESP, +3 * kWordSize));  // Array.
   // Range check.
   __ cmpl(EBX, FieldAddress(EAX, Array::length_offset()));
   // Runtime throws exception.
@@ -113,9 +115,8 @@
   // Note that EBX is Smi, i.e, times 2.
   ASSERT(kSmiTagShift == 1);
   // Destroy ECX (ic data) as we will not continue in the function.
-  __ movl(ECX, Address(ESP, + 1 * kWordSize));  // Value.
-  __ StoreIntoObject(EAX,
-                     FieldAddress(EAX, EBX, TIMES_2, Array::data_offset()),
+  __ movl(ECX, Address(ESP, +1 * kWordSize));  // Value.
+  __ StoreIntoObject(EAX, FieldAddress(EAX, EBX, TIMES_2, Array::data_offset()),
                      ECX);
   // Caller is responsible of preserving the value if necessary.
   __ ret();
@@ -142,16 +143,13 @@
   __ movl(EBX, Address(ESP, kArrayOffset));  // data argument.
   // EAX is new, no barrier needed.
   __ StoreIntoObjectNoBarrier(
-      EAX,
-      FieldAddress(EAX, GrowableObjectArray::data_offset()),
-      EBX);
+      EAX, FieldAddress(EAX, GrowableObjectArray::data_offset()), EBX);
 
   // EAX: new growable array object start as a tagged pointer.
   // Store the type argument field in the growable array object.
   __ movl(EBX, Address(ESP, kTypeArgumentsOffset));  // type argument.
   __ StoreIntoObjectNoBarrier(
-      EAX,
-      FieldAddress(EAX, GrowableObjectArray::type_arguments_offset()),
+      EAX, FieldAddress(EAX, GrowableObjectArray::type_arguments_offset()),
       EBX);
 
   __ ZeroInitSmiField(FieldAddress(EAX, GrowableObjectArray::length_offset()));
@@ -169,7 +167,7 @@
   if (Isolate::Current()->type_checks()) return;
 
   Label fall_through;
-  __ movl(EAX, Address(ESP, + 2 * kWordSize));  // Array.
+  __ movl(EAX, Address(ESP, +2 * kWordSize));  // Array.
   __ movl(EBX, FieldAddress(EAX, GrowableObjectArray::length_offset()));
   // EBX: length.
   __ movl(EDI, FieldAddress(EAX, GrowableObjectArray::data_offset()));
@@ -179,10 +177,9 @@
   __ j(EQUAL, &fall_through);  // Must grow data.
   __ IncrementSmiField(FieldAddress(EAX, GrowableObjectArray::length_offset()),
                        1);
-  __ movl(EAX, Address(ESP, + 1 * kWordSize));  // Value
+  __ movl(EAX, Address(ESP, +1 * kWordSize));  // Value
   ASSERT(kSmiTagShift == 1);
-  __ StoreIntoObject(EDI,
-                     FieldAddress(EDI, EBX, TIMES_2, Array::data_offset()),
+  __ StoreIntoObject(EDI, FieldAddress(EDI, EBX, TIMES_2, Array::data_offset()),
                      EAX);
   const Immediate& raw_null =
       Immediate(reinterpret_cast<int32_t>(Object::null()));
@@ -196,7 +193,7 @@
   Label fall_through;                                                          \
   const intptr_t kArrayLengthStackOffset = 1 * kWordSize;                      \
   NOT_IN_PRODUCT(__ MaybeTraceAllocation(cid, EDI, &fall_through, false));     \
-  __ movl(EDI, Address(ESP, kArrayLengthStackOffset));  /* Array length. */    \
+  __ movl(EDI, Address(ESP, kArrayLengthStackOffset)); /* Array length. */     \
   /* Check that length is a positive Smi. */                                   \
   /* EDI: requested array length argument. */                                  \
   __ testl(EDI, Immediate(kSmiTagMask));                                       \
@@ -258,22 +255,21 @@
                                                                                \
     /* Get the class index and insert it into the tags. */                     \
     __ orl(EDI, Immediate(RawObject::ClassIdTag::encode(cid)));                \
-    __ movl(FieldAddress(EAX, type_name::tags_offset()), EDI);  /* Tags. */    \
+    __ movl(FieldAddress(EAX, type_name::tags_offset()), EDI); /* Tags. */     \
   }                                                                            \
   /* Set the length field. */                                                  \
   /* EAX: new object start as a tagged pointer. */                             \
   /* EBX: new object end address. */                                           \
-  __ movl(EDI, Address(ESP, kArrayLengthStackOffset));  /* Array length. */    \
-  __ StoreIntoObjectNoBarrier(EAX,                                             \
-                              FieldAddress(EAX, type_name::length_offset()),   \
-                              EDI);                                            \
+  __ movl(EDI, Address(ESP, kArrayLengthStackOffset)); /* Array length. */     \
+  __ StoreIntoObjectNoBarrier(                                                 \
+      EAX, FieldAddress(EAX, type_name::length_offset()), EDI);                \
   /* Initialize all array elements to 0. */                                    \
   /* EAX: new object start as a tagged pointer. */                             \
   /* EBX: new object end address. */                                           \
   /* EDI: iterator which initially points to the start of the variable */      \
   /* ECX: scratch register. */                                                 \
   /* data area to be initialized. */                                           \
-  __ xorl(ECX, ECX);  /* Zero. */                                              \
+  __ xorl(ECX, ECX); /* Zero. */                                               \
   __ leal(EDI, FieldAddress(EAX, sizeof(Raw##type_name)));                     \
   Label done, init_loop;                                                       \
   __ Bind(&init_loop);                                                         \
@@ -285,16 +281,21 @@
   __ Bind(&done);                                                              \
                                                                                \
   __ ret();                                                                    \
-  __ Bind(&fall_through);                                                      \
+  __ Bind(&fall_through);
 
 
 static ScaleFactor GetScaleFactor(intptr_t size) {
   switch (size) {
-    case 1: return TIMES_1;
-    case 2: return TIMES_2;
-    case 4: return TIMES_4;
-    case 8: return TIMES_8;
-    case 16: return TIMES_16;
+    case 1:
+      return TIMES_1;
+    case 2:
+      return TIMES_2;
+    case 4:
+      return TIMES_4;
+    case 8:
+      return TIMES_8;
+    case 16:
+      return TIMES_16;
   }
   UNREACHABLE();
   return static_cast<ScaleFactor>(0);
@@ -302,12 +303,12 @@
 
 
 #define TYPED_DATA_ALLOCATOR(clazz)                                            \
-void Intrinsifier::TypedData_##clazz##_factory(Assembler* assembler) {         \
-  intptr_t size = TypedData::ElementSizeInBytes(kTypedData##clazz##Cid);       \
-  intptr_t max_len = TypedData::MaxElements(kTypedData##clazz##Cid);           \
-  ScaleFactor scale = GetScaleFactor(size);                                    \
-  TYPED_ARRAY_ALLOCATION(TypedData, kTypedData##clazz##Cid, max_len, scale);   \
-}
+  void Intrinsifier::TypedData_##clazz##_factory(Assembler* assembler) {       \
+    intptr_t size = TypedData::ElementSizeInBytes(kTypedData##clazz##Cid);     \
+    intptr_t max_len = TypedData::MaxElements(kTypedData##clazz##Cid);         \
+    ScaleFactor scale = GetScaleFactor(size);                                  \
+    TYPED_ARRAY_ALLOCATION(TypedData, kTypedData##clazz##Cid, max_len, scale); \
+  }
 CLASS_LIST_TYPED_DATA(TYPED_DATA_ALLOCATOR)
 #undef TYPED_DATA_ALLOCATOR
 
@@ -315,8 +316,8 @@
 // Tests if two top most arguments are smis, jumps to label not_smi if not.
 // Topmost argument is in EAX.
 static void TestBothArgumentsSmis(Assembler* assembler, Label* not_smi) {
-  __ movl(EAX, Address(ESP, + 1 * kWordSize));
-  __ movl(EBX, Address(ESP, + 2 * kWordSize));
+  __ movl(EAX, Address(ESP, +1 * kWordSize));
+  __ movl(EBX, Address(ESP, +2 * kWordSize));
   __ orl(EBX, EAX);
   __ testl(EBX, Immediate(kSmiTagMask));
   __ j(NOT_ZERO, not_smi, Assembler::kNearJump);
@@ -326,7 +327,7 @@
 void Intrinsifier::Integer_addFromInteger(Assembler* assembler) {
   Label fall_through;
   TestBothArgumentsSmis(assembler, &fall_through);
-  __ addl(EAX, Address(ESP, + 2 * kWordSize));
+  __ addl(EAX, Address(ESP, +2 * kWordSize));
   __ j(OVERFLOW, &fall_through, Assembler::kNearJump);
   // Result is in EAX.
   __ ret();
@@ -342,7 +343,7 @@
 void Intrinsifier::Integer_subFromInteger(Assembler* assembler) {
   Label fall_through;
   TestBothArgumentsSmis(assembler, &fall_through);
-  __ subl(EAX, Address(ESP, + 2 * kWordSize));
+  __ subl(EAX, Address(ESP, +2 * kWordSize));
   __ j(OVERFLOW, &fall_through, Assembler::kNearJump);
   // Result is in EAX.
   __ ret();
@@ -354,7 +355,7 @@
   Label fall_through;
   TestBothArgumentsSmis(assembler, &fall_through);
   __ movl(EBX, EAX);
-  __ movl(EAX, Address(ESP, + 2 * kWordSize));
+  __ movl(EAX, Address(ESP, +2 * kWordSize));
   __ subl(EAX, EBX);
   __ j(OVERFLOW, &fall_through, Assembler::kNearJump);
   // Result is in EAX.
@@ -363,13 +364,12 @@
 }
 
 
-
 void Intrinsifier::Integer_mulFromInteger(Assembler* assembler) {
   Label fall_through;
   TestBothArgumentsSmis(assembler, &fall_through);
   ASSERT(kSmiTag == 0);  // Adjust code below if not the case.
   __ SmiUntag(EAX);
-  __ imull(EAX, Address(ESP, + 2 * kWordSize));
+  __ imull(EAX, Address(ESP, +2 * kWordSize));
   __ j(OVERFLOW, &fall_through, Assembler::kNearJump);
   // Result is in EAX.
   __ ret();
@@ -406,7 +406,7 @@
   __ j(LESS, &modulo, Assembler::kNearJump);
   // left is positive.
   __ cmpl(EAX, EBX);
-  __ j(GREATER, &modulo,  Assembler::kNearJump);
+  __ j(GREATER, &modulo, Assembler::kNearJump);
   // left is less than right, result is left (EAX).
   __ ret();
 
@@ -434,7 +434,7 @@
 void Intrinsifier::Integer_moduloFromInteger(Assembler* assembler) {
   Label fall_through, subtract;
   TestBothArgumentsSmis(assembler, &fall_through);
-  __ movl(EBX, Address(ESP, + 2 * kWordSize));
+  __ movl(EBX, Address(ESP, +2 * kWordSize));
   // EAX: Tagged left (dividend).
   // EBX: Tagged right (divisor).
   // Check if modulo by zero -> exception thrown in main function.
@@ -473,7 +473,7 @@
   __ j(EQUAL, &fall_through, Assembler::kNearJump);
   __ movl(EBX, EAX);
   __ SmiUntag(EBX);
-  __ movl(EAX, Address(ESP, + 2 * kWordSize));  // Left argument (dividend).
+  __ movl(EAX, Address(ESP, +2 * kWordSize));  // Left argument (dividend).
   __ SmiUntag(EAX);
   __ pushl(EDX);  // Preserve EDX in case of 'fall_through'.
   __ cdq();
@@ -491,7 +491,7 @@
 
 void Intrinsifier::Integer_negate(Assembler* assembler) {
   Label fall_through;
-  __ movl(EAX, Address(ESP, + 1 * kWordSize));
+  __ movl(EAX, Address(ESP, +1 * kWordSize));
   __ testl(EAX, Immediate(kSmiTagMask));
   __ j(NOT_ZERO, &fall_through, Assembler::kNearJump);  // Non-smi value.
   __ negl(EAX);
@@ -505,7 +505,7 @@
 void Intrinsifier::Integer_bitAndFromInteger(Assembler* assembler) {
   Label fall_through;
   TestBothArgumentsSmis(assembler, &fall_through);
-  __ movl(EBX, Address(ESP, + 2 * kWordSize));
+  __ movl(EBX, Address(ESP, +2 * kWordSize));
   __ andl(EAX, EBX);
   // Result is in EAX.
   __ ret();
@@ -521,7 +521,7 @@
 void Intrinsifier::Integer_bitOrFromInteger(Assembler* assembler) {
   Label fall_through;
   TestBothArgumentsSmis(assembler, &fall_through);
-  __ movl(EBX, Address(ESP, + 2 * kWordSize));
+  __ movl(EBX, Address(ESP, +2 * kWordSize));
   __ orl(EAX, EBX);
   // Result is in EAX.
   __ ret();
@@ -537,7 +537,7 @@
 void Intrinsifier::Integer_bitXorFromInteger(Assembler* assembler) {
   Label fall_through;
   TestBothArgumentsSmis(assembler, &fall_through);
-  __ movl(EBX, Address(ESP, + 2 * kWordSize));
+  __ movl(EBX, Address(ESP, +2 * kWordSize));
   __ xorl(EAX, EBX);
   // Result is in EAX.
   __ ret();
@@ -560,8 +560,8 @@
   __ j(ABOVE_EQUAL, &fall_through, Assembler::kNearJump);
 
   __ SmiUntag(EAX);
-  __ movl(ECX, EAX);  // Shift amount must be in ECX.
-  __ movl(EAX, Address(ESP, + 2 * kWordSize));  // Value.
+  __ movl(ECX, EAX);                           // Shift amount must be in ECX.
+  __ movl(EAX, Address(ESP, +2 * kWordSize));  // Value.
 
   // Overflow test - all the shifted-out bits must be same as the sign bit.
   __ movl(EBX, EAX);
@@ -586,12 +586,10 @@
   __ xorl(EDI, EDI);
   __ shldl(EDI, EAX, ECX);
   // Result in EDI (high) and EBX (low).
-  const Class& mint_class = Class::Handle(
-      Isolate::Current()->object_store()->mint_class());
-  __ TryAllocate(mint_class,
-                 &fall_through,
-                 Assembler::kNearJump,
-                 EAX,  // Result register.
+  const Class& mint_class =
+      Class::Handle(Isolate::Current()->object_store()->mint_class());
+  __ TryAllocate(mint_class, &fall_through, Assembler::kNearJump,
+                 EAX,   // Result register.
                  ECX);  // temp
   // EBX and EDI are not objects but integer values.
   __ movl(FieldAddress(EAX, Mint::value_offset()), EBX);
@@ -629,7 +627,7 @@
   Label try_mint_smi, is_true, is_false, drop_two_fall_through, fall_through;
   TestBothArgumentsSmis(assembler, &try_mint_smi);
   // EAX contains the right argument.
-  __ cmpl(Address(ESP, + 2 * kWordSize), EAX);
+  __ cmpl(Address(ESP, +2 * kWordSize), EAX);
   __ j(true_condition, &is_true, Assembler::kNearJump);
   __ Bind(&is_false);
   __ LoadObject(EAX, Bool::False());
@@ -661,15 +659,15 @@
   // Note that EDX and ECX must be preserved in case we fall through to main
   // method.
   // EAX contains the right argument.
-  __ movl(EBX, Address(ESP, + 2 * kWordSize));  // Left argument.
+  __ movl(EBX, Address(ESP, +2 * kWordSize));  // Left argument.
   // Push left as 64 bit integer.
   Push64SmiOrMint(assembler, EBX, EDI, &fall_through);
   // Push right as 64 bit integer.
   Push64SmiOrMint(assembler, EAX, EDI, &drop_two_fall_through);
-  __ popl(EBX);  // Right.LO.
-  __ popl(ECX);  // Right.HI.
-  __ popl(EAX);  // Left.LO.
-  __ popl(EDX);  // Left.HI.
+  __ popl(EBX);       // Right.LO.
+  __ popl(ECX);       // Right.HI.
+  __ popl(EAX);       // Left.LO.
+  __ popl(EDX);       // Left.HI.
   __ cmpl(EDX, ECX);  // cmpl left.HI, right.HI.
   __ j(hi_false_cond, &is_false, Assembler::kNearJump);
   __ j(hi_true_cond, &is_true, Assembler::kNearJump);
@@ -684,7 +682,6 @@
 }
 
 
-
 void Intrinsifier::Integer_greaterThanFromInt(Assembler* assembler) {
   CompareIntegers(assembler, LESS);
 }
@@ -715,10 +712,10 @@
 void Intrinsifier::Integer_equalToInteger(Assembler* assembler) {
   Label fall_through, true_label, check_for_mint;
   // For integer receiver '===' check first.
-  __ movl(EAX, Address(ESP, + 1 * kWordSize));
-  __ cmpl(EAX, Address(ESP, + 2 * kWordSize));
+  __ movl(EAX, Address(ESP, +1 * kWordSize));
+  __ cmpl(EAX, Address(ESP, +2 * kWordSize));
   __ j(EQUAL, &true_label, Assembler::kNearJump);
-  __ movl(EBX, Address(ESP, + 2 * kWordSize));
+  __ movl(EBX, Address(ESP, +2 * kWordSize));
   __ orl(EAX, EBX);
   __ testl(EAX, Immediate(kSmiTagMask));
   __ j(NOT_ZERO, &check_for_mint, Assembler::kNearJump);
@@ -732,14 +729,14 @@
   // At least one of the arguments was not Smi.
   Label receiver_not_smi;
   __ Bind(&check_for_mint);
-  __ movl(EAX, Address(ESP, + 2 * kWordSize));  // Receiver.
+  __ movl(EAX, Address(ESP, +2 * kWordSize));  // Receiver.
   __ testl(EAX, Immediate(kSmiTagMask));
   __ j(NOT_ZERO, &receiver_not_smi);
 
   // Left (receiver) is Smi, return false if right is not Double.
   // Note that an instance of Mint or Bigint never contains a value that can be
   // represented by Smi.
-  __ movl(EAX, Address(ESP, + 1 * kWordSize));  // Right argument.
+  __ movl(EAX, Address(ESP, +1 * kWordSize));  // Right argument.
   __ CompareClassId(EAX, kDoubleCid, EDI);
   __ j(EQUAL, &fall_through);
   __ LoadObject(EAX, Bool::False());  // Smi == Mint -> false.
@@ -750,7 +747,7 @@
   __ CompareClassId(EAX, kMintCid, EDI);
   __ j(NOT_EQUAL, &fall_through);
   // Receiver is Mint, return false if right is Smi.
-  __ movl(EAX, Address(ESP, + 1 * kWordSize));  // Right argument.
+  __ movl(EAX, Address(ESP, +1 * kWordSize));  // Right argument.
   __ testl(EAX, Immediate(kSmiTagMask));
   __ j(NOT_ZERO, &fall_through);
   __ LoadObject(EAX, Bool::False());
@@ -782,9 +779,9 @@
   __ j(LESS_EQUAL, &shift_count_ok, Assembler::kNearJump);
   __ movl(EAX, count_limit);
   __ Bind(&shift_count_ok);
-  __ movl(ECX, EAX);  // Shift amount must be in ECX.
-  __ movl(EAX, Address(ESP, + 2 * kWordSize));  // Value.
-  __ SmiUntag(EAX);  // Value.
+  __ movl(ECX, EAX);                           // Shift amount must be in ECX.
+  __ movl(EAX, Address(ESP, +2 * kWordSize));  // Value.
+  __ SmiUntag(EAX);                            // Value.
   __ sarl(EAX, ECX);
   __ SmiTag(EAX);
   __ ret();
@@ -794,7 +791,7 @@
 
 // Argument is Smi (receiver).
 void Intrinsifier::Smi_bitNegate(Assembler* assembler) {
-  __ movl(EAX, Address(ESP, + 1 * kWordSize));  // Receiver.
+  __ movl(EAX, Address(ESP, +1 * kWordSize));  // Receiver.
   __ notl(EAX);
   __ andl(EAX, Immediate(~kSmiTagMask));  // Remove inverted smi-tag.
   __ ret();
@@ -803,7 +800,7 @@
 
 void Intrinsifier::Smi_bitLength(Assembler* assembler) {
   ASSERT(kSmiTagShift == 1);
-  __ movl(EAX, Address(ESP, + 1 * kWordSize));  // Receiver.
+  __ movl(EAX, Address(ESP, +1 * kWordSize));  // Receiver.
   // XOR with sign bit to complement bits if value is negative.
   __ movl(ECX, EAX);
   __ sarl(ECX, Immediate(31));  // All 0 or all 1.
@@ -850,9 +847,8 @@
   Label loop;
   __ Bind(&loop);
   __ movl(EAX, EDX);
-  __ movl(EDX,
-          FieldAddress(EDI, ESI, TIMES_4,
-                       TypedData::data_offset() - Bigint::kBytesPerDigit));
+  __ movl(EDX, FieldAddress(EDI, ESI, TIMES_4,
+                            TypedData::data_offset() - Bigint::kBytesPerDigit));
   __ shldl(EAX, EDX, ECX);
   __ movl(Address(EBX, ESI, TIMES_4, 0), EAX);
   __ decl(ESI);
@@ -881,7 +877,7 @@
   __ SmiUntag(ECX);
   __ movl(EBX, Address(ESP, 2 * kWordSize));  // r_digits
   __ movl(EDX, ECX);
-  __ sarl(EDX, Immediate(5));  // EDX = n ~/ _DIGIT_BITS.
+  __ sarl(EDX, Immediate(5));                 // EDX = n ~/ _DIGIT_BITS.
   __ movl(ESI, Address(ESP, 4 * kWordSize));  // x_used > 0, Smi.
   __ SmiUntag(ESI);
   __ decl(ESI);
@@ -925,10 +921,10 @@
 
   __ movl(EDI, Address(ESP, 6 * kWordSize));  // digits
   __ movl(EAX, Address(ESP, 5 * kWordSize));  // used is Smi
-  __ SmiUntag(EAX);  // used > 0.
+  __ SmiUntag(EAX);                           // used > 0.
   __ movl(ESI, Address(ESP, 4 * kWordSize));  // a_digits
   __ movl(ECX, Address(ESP, 3 * kWordSize));  // a_used is Smi
-  __ SmiUntag(ECX);  // a_used > 0.
+  __ SmiUntag(ECX);                           // a_used > 0.
   __ movl(EBX, Address(ESP, 2 * kWordSize));  // r_digits
 
   // Precompute 'used - a_used' now so that carry flag is not lost later.
@@ -949,7 +945,7 @@
 
   Label last_carry;
   __ popl(ECX);
-  __ decl(ECX);  // Does not affect carry flag.
+  __ decl(ECX);                                   // Does not affect carry flag.
   __ j(ZERO, &last_carry, Assembler::kNearJump);  // If used - a_used == 0.
 
   Label carry_loop;
@@ -985,10 +981,10 @@
 
   __ movl(EDI, Address(ESP, 6 * kWordSize));  // digits
   __ movl(EAX, Address(ESP, 5 * kWordSize));  // used is Smi
-  __ SmiUntag(EAX);  // used > 0.
+  __ SmiUntag(EAX);                           // used > 0.
   __ movl(ESI, Address(ESP, 4 * kWordSize));  // a_digits
   __ movl(ECX, Address(ESP, 3 * kWordSize));  // a_used is Smi
-  __ SmiUntag(ECX);  // a_used > 0.
+  __ SmiUntag(ECX);                           // a_used > 0.
   __ movl(EBX, Address(ESP, 2 * kWordSize));  // r_digits
 
   // Precompute 'used - a_used' now so that carry flag is not lost later.
@@ -1009,7 +1005,7 @@
 
   Label done;
   __ popl(ECX);
-  __ decl(ECX);  // Does not affect carry flag.
+  __ decl(ECX);                             // Does not affect carry flag.
   __ j(ZERO, &done, Assembler::kNearJump);  // If used - a_used == 0.
 
   Label carry_loop;
@@ -1106,7 +1102,7 @@
   __ addl(EDI, Immediate(Bigint::kBytesPerDigit));
 
   // uint64_t t = x*mi
-  __ mull(EBX);  // t = EDX:EAX = EAX * EBX
+  __ mull(EBX);       // t = EDX:EAX = EAX * EBX
   __ addl(EAX, ECX);  // t += c
   __ adcl(EDX, Immediate(0));
 
@@ -1216,7 +1212,7 @@
 
   // uint64_t c = high32(t)
   __ pushl(Immediate(0));  // push high32(c) == 0
-  __ pushl(EDX);  // push low32(c) == high32(t)
+  __ pushl(EDX);           // push low32(c) == high32(t)
 
   Address n_addr = Address(ESP, 2 * kWordSize);
   Address ch_addr = Address(ESP, 1 * kWordSize);
@@ -1240,11 +1236,11 @@
   __ addl(EDI, Immediate(Bigint::kBytesPerDigit));
 
   // uint96_t t = ECX:EDX:EAX = 2*x*xi + aj + c
-  __ mull(EBX);  // EDX:EAX = EAX * EBX
+  __ mull(EBX);       // EDX:EAX = EAX * EBX
   __ xorl(ECX, ECX);  // ECX = 0
   __ shldl(ECX, EDX, Immediate(1));
   __ shldl(EDX, EAX, Immediate(1));
-  __ shll(EAX, Immediate(1));  // ECX:EDX:EAX <<= 1
+  __ shll(EAX, Immediate(1));     // ECX:EDX:EAX <<= 1
   __ addl(EAX, Address(ESI, 0));  // t += aj
   __ adcl(EDX, Immediate(0));
   __ adcl(ECX, Immediate(0));
@@ -1331,9 +1327,9 @@
 
   __ Bind(&return_qd);
   // args[2] = qd
-  __ movl(FieldAddress(EDI,
-                       TypedData::data_offset() + 2*Bigint::kBytesPerDigit),
-          EAX);
+  __ movl(
+      FieldAddress(EDI, TypedData::data_offset() + 2 * Bigint::kBytesPerDigit),
+      EAX);
 
   __ movl(EAX, Immediate(Smi::RawValue(1)));  // One digit processed.
   __ ret();
@@ -1354,9 +1350,8 @@
   __ movl(EDI, Address(ESP, 3 * kWordSize));  // args
 
   // ECX = rho = args[2]
-  __ movl(ECX,
-          FieldAddress(EDI,
-                       TypedData::data_offset() + 2*Bigint::kBytesPerDigit));
+  __ movl(ECX, FieldAddress(
+                   EDI, TypedData::data_offset() + 2 * Bigint::kBytesPerDigit));
 
   // EAX = digits[i >> 1]
   __ movl(EBX, Address(ESP, 2 * kWordSize));  // digits
@@ -1367,9 +1362,9 @@
   __ mull(ECX);
 
   // args[4] = t mod DIGIT_BASE = low32(t)
-  __ movl(FieldAddress(EDI,
-                       TypedData::data_offset() + 4*Bigint::kBytesPerDigit),
-          EAX);
+  __ movl(
+      FieldAddress(EDI, TypedData::data_offset() + 4 * Bigint::kBytesPerDigit),
+      EAX);
 
   __ movl(EAX, Immediate(Smi::RawValue(1)));  // One digit processed.
   __ ret();
@@ -1382,7 +1377,7 @@
 static void TestLastArgumentIsDouble(Assembler* assembler,
                                      Label* is_smi,
                                      Label* not_double_smi) {
-  __ movl(EAX, Address(ESP, + 1 * kWordSize));
+  __ movl(EAX, Address(ESP, +1 * kWordSize));
   __ testl(EAX, Immediate(kSmiTagMask));
   __ j(ZERO, is_smi, Assembler::kNearJump);  // Jump if Smi.
   __ CompareClassId(EAX, kDoubleCid, EBX);
@@ -1401,7 +1396,7 @@
   // Both arguments are double, right operand is in EAX.
   __ movsd(XMM1, FieldAddress(EAX, Double::value_offset()));
   __ Bind(&double_op);
-  __ movl(EAX, Address(ESP, + 2 * kWordSize));  // Left argument.
+  __ movl(EAX, Address(ESP, +2 * kWordSize));  // Left argument.
   __ movsd(XMM0, FieldAddress(EAX, Double::value_offset()));
   __ comisd(XMM0, XMM1);
   __ j(PARITY_EVEN, &is_false, Assembler::kNearJump);  // NaN -> false;
@@ -1459,20 +1454,27 @@
   // Both arguments are double, right operand is in EAX.
   __ movsd(XMM1, FieldAddress(EAX, Double::value_offset()));
   __ Bind(&double_op);
-  __ movl(EAX, Address(ESP, + 2 * kWordSize));  // Left argument.
+  __ movl(EAX, Address(ESP, +2 * kWordSize));  // Left argument.
   __ movsd(XMM0, FieldAddress(EAX, Double::value_offset()));
   switch (kind) {
-    case Token::kADD: __ addsd(XMM0, XMM1); break;
-    case Token::kSUB: __ subsd(XMM0, XMM1); break;
-    case Token::kMUL: __ mulsd(XMM0, XMM1); break;
-    case Token::kDIV: __ divsd(XMM0, XMM1); break;
-    default: UNREACHABLE();
+    case Token::kADD:
+      __ addsd(XMM0, XMM1);
+      break;
+    case Token::kSUB:
+      __ subsd(XMM0, XMM1);
+      break;
+    case Token::kMUL:
+      __ mulsd(XMM0, XMM1);
+      break;
+    case Token::kDIV:
+      __ divsd(XMM0, XMM1);
+      break;
+    default:
+      UNREACHABLE();
   }
-  const Class& double_class = Class::Handle(
-      Isolate::Current()->object_store()->double_class());
-  __ TryAllocate(double_class,
-                 &fall_through,
-                 Assembler::kNearJump,
+  const Class& double_class =
+      Class::Handle(Isolate::Current()->object_store()->double_class());
+  __ TryAllocate(double_class, &fall_through, Assembler::kNearJump,
                  EAX,  // Result register.
                  EBX);
   __ movsd(FieldAddress(EAX, Double::value_offset()), XMM0);
@@ -1509,20 +1511,18 @@
 void Intrinsifier::Double_mulFromInteger(Assembler* assembler) {
   Label fall_through;
   // Only smis allowed.
-  __ movl(EAX, Address(ESP, + 1 * kWordSize));
+  __ movl(EAX, Address(ESP, +1 * kWordSize));
   __ testl(EAX, Immediate(kSmiTagMask));
   __ j(NOT_ZERO, &fall_through, Assembler::kNearJump);
   // Is Smi.
   __ SmiUntag(EAX);
   __ cvtsi2sd(XMM1, EAX);
-  __ movl(EAX, Address(ESP, + 2 * kWordSize));
+  __ movl(EAX, Address(ESP, +2 * kWordSize));
   __ movsd(XMM0, FieldAddress(EAX, Double::value_offset()));
   __ mulsd(XMM0, XMM1);
-  const Class& double_class = Class::Handle(
-      Isolate::Current()->object_store()->double_class());
-  __ TryAllocate(double_class,
-                 &fall_through,
-                 Assembler::kNearJump,
+  const Class& double_class =
+      Class::Handle(Isolate::Current()->object_store()->double_class());
+  __ TryAllocate(double_class, &fall_through, Assembler::kNearJump,
                  EAX,  // Result register.
                  EBX);
   __ movsd(FieldAddress(EAX, Double::value_offset()), XMM0);
@@ -1539,11 +1539,9 @@
   // Is Smi.
   __ SmiUntag(EAX);
   __ cvtsi2sd(XMM0, EAX);
-  const Class& double_class = Class::Handle(
-      Isolate::Current()->object_store()->double_class());
-  __ TryAllocate(double_class,
-                 &fall_through,
-                 Assembler::kNearJump,
+  const Class& double_class =
+      Class::Handle(Isolate::Current()->object_store()->double_class());
+  __ TryAllocate(double_class, &fall_through, Assembler::kNearJump,
                  EAX,  // Result register.
                  EBX);
   __ movsd(FieldAddress(EAX, Double::value_offset()), XMM0);
@@ -1637,11 +1635,9 @@
   __ movsd(XMM1, FieldAddress(EAX, Double::value_offset()));
   __ Bind(&double_op);
   __ sqrtsd(XMM0, XMM1);
-  const Class& double_class = Class::Handle(
-      Isolate::Current()->object_store()->double_class());
-  __ TryAllocate(double_class,
-                 &fall_through,
-                 Assembler::kNearJump,
+  const Class& double_class =
+      Class::Handle(Isolate::Current()->object_store()->double_class());
+  __ TryAllocate(double_class, &fall_through, Assembler::kNearJump,
                  EAX,  // Result register.
                  EBX);
   __ movsd(FieldAddress(EAX, Double::value_offset()), XMM0);
@@ -1660,8 +1656,8 @@
 void Intrinsifier::Random_nextState(Assembler* assembler) {
   const Library& math_lib = Library::Handle(Library::MathLibrary());
   ASSERT(!math_lib.IsNull());
-  const Class& random_class = Class::Handle(
-      math_lib.LookupClassAllowPrivate(Symbols::_Random()));
+  const Class& random_class =
+      Class::Handle(math_lib.LookupClassAllowPrivate(Symbols::_Random()));
   ASSERT(!random_class.IsNull());
   const Field& state_field = Field::ZoneHandle(
       random_class.LookupInstanceFieldAllowPrivate(Symbols::_state()));
@@ -1676,7 +1672,7 @@
   ASSERT(Utils::IsUint(32, a_int_value));
   int32_t a_int32_value = static_cast<int32_t>(a_int_value);
   // Receiver.
-  __ movl(EAX, Address(ESP, + 1 * kWordSize));
+  __ movl(EAX, Address(ESP, +1 * kWordSize));
   // Field '_state'.
   __ movl(EBX, FieldAddress(EAX, state_field.Offset()));
   // Addresses of _state[0] and _state[1].
@@ -1698,8 +1694,8 @@
 // Identity comparison.
 void Intrinsifier::ObjectEquals(Assembler* assembler) {
   Label is_true;
-  __ movl(EAX, Address(ESP, + 1 * kWordSize));
-  __ cmpl(EAX, Address(ESP, + 2 * kWordSize));
+  __ movl(EAX, Address(ESP, +1 * kWordSize));
+  __ cmpl(EAX, Address(ESP, +2 * kWordSize));
   __ j(EQUAL, &is_true, Assembler::kNearJump);
   __ LoadObject(EAX, Bool::False());
   __ ret();
@@ -1725,9 +1721,7 @@
 const Condition kIfInRange = BELOW_EQUAL;
 
 
-static void JumpIfInteger(Assembler* assembler,
-                          Register cid,
-                          Label* target) {
+static void JumpIfInteger(Assembler* assembler, Register cid, Label* target) {
   RangeCheck(assembler, cid, kSmiCid, kBigintCid, kIfInRange, target);
 }
 
@@ -1739,34 +1733,22 @@
 }
 
 
-static void JumpIfString(Assembler* assembler,
-                          Register cid,
-                          Label* target) {
-  RangeCheck(assembler,
-             cid,
-             kOneByteStringCid,
-             kExternalTwoByteStringCid,
-             kIfInRange,
-             target);
+static void JumpIfString(Assembler* assembler, Register cid, Label* target) {
+  RangeCheck(assembler, cid, kOneByteStringCid, kExternalTwoByteStringCid,
+             kIfInRange, target);
 }
 
 
-static void JumpIfNotString(Assembler* assembler,
-                            Register cid,
-                            Label* target) {
-  RangeCheck(assembler,
-             cid,
-             kOneByteStringCid,
-             kExternalTwoByteStringCid,
-             kIfNotInRange,
-             target);
+static void JumpIfNotString(Assembler* assembler, Register cid, Label* target) {
+  RangeCheck(assembler, cid, kOneByteStringCid, kExternalTwoByteStringCid,
+             kIfNotInRange, target);
 }
 
 
 // Return type quickly for simple types (not parameterized and not signature).
 void Intrinsifier::ObjectRuntimeType(Assembler* assembler) {
   Label fall_through, use_canonical_type, not_double, not_integer;
-  __ movl(EAX, Address(ESP, + 1 * kWordSize));
+  __ movl(EAX, Address(ESP, +1 * kWordSize));
   __ LoadClassIdMayBeSmi(EDI, EAX);
 
   __ cmpl(EDI, Immediate(kClosureCid));
@@ -1823,14 +1805,14 @@
 void Intrinsifier::ObjectHaveSameRuntimeType(Assembler* assembler) {
   Label fall_through, different_cids, equal, not_equal, not_integer;
 
-  __ movl(EAX, Address(ESP, + 1 * kWordSize));
+  __ movl(EAX, Address(ESP, +1 * kWordSize));
   __ LoadClassIdMayBeSmi(EDI, EAX);
 
   // Check if left hand size is a closure. Closures are handled in the runtime.
   __ cmpl(EDI, Immediate(kClosureCid));
   __ j(EQUAL, &fall_through);
 
-  __ movl(EAX, Address(ESP, + 2 * kWordSize));
+  __ movl(EAX, Address(ESP, +2 * kWordSize));
   __ LoadClassIdMayBeSmi(EBX, EAX);
 
   // Check whether class ids match. If class ids don't match objects can still
@@ -1886,7 +1868,7 @@
 
 void Intrinsifier::String_getHashCode(Assembler* assembler) {
   Label fall_through;
-  __ movl(EAX, Address(ESP, + 1 * kWordSize));  // String object.
+  __ movl(EAX, Address(ESP, +1 * kWordSize));  // String object.
   __ movl(EAX, FieldAddress(EAX, String::hash_offset()));
   __ cmpl(EAX, Immediate(0));
   __ j(EQUAL, &fall_through, Assembler::kNearJump);
@@ -1904,8 +1886,8 @@
 
 void Intrinsifier::StringBaseCharAt(Assembler* assembler) {
   Label fall_through, try_two_byte_string;
-  __ movl(EBX, Address(ESP, + 1 * kWordSize));  // Index.
-  __ movl(EAX, Address(ESP, + 2 * kWordSize));  // String.
+  __ movl(EBX, Address(ESP, +1 * kWordSize));  // Index.
+  __ movl(EAX, Address(ESP, +2 * kWordSize));  // String.
   __ testl(EBX, Immediate(kSmiTagMask));
   __ j(NOT_ZERO, &fall_through, Assembler::kNearJump);  // Non-smi index.
   // Range check.
@@ -1920,9 +1902,7 @@
   __ j(GREATER_EQUAL, &fall_through);
   __ movl(EAX,
           Immediate(reinterpret_cast<uword>(Symbols::PredefinedAddress())));
-  __ movl(EAX, Address(EAX,
-                       EBX,
-                       TIMES_4,
+  __ movl(EAX, Address(EAX, EBX, TIMES_4,
                        Symbols::kNullCharCodeSymbolOffset * kWordSize));
   __ ret();
 
@@ -1935,9 +1915,7 @@
   __ j(GREATER_EQUAL, &fall_through);
   __ movl(EAX,
           Immediate(reinterpret_cast<uword>(Symbols::PredefinedAddress())));
-  __ movl(EAX, Address(EAX,
-                       EBX,
-                       TIMES_4,
+  __ movl(EAX, Address(EAX, EBX, TIMES_4,
                        Symbols::kNullCharCodeSymbolOffset * kWordSize));
   __ ret();
 
@@ -1948,7 +1926,7 @@
 void Intrinsifier::StringBaseIsEmpty(Assembler* assembler) {
   Label is_true;
   // Get length.
-  __ movl(EAX, Address(ESP, + 1 * kWordSize));  // String object.
+  __ movl(EAX, Address(ESP, +1 * kWordSize));  // String object.
   __ movl(EAX, FieldAddress(EAX, String::length_offset()));
   __ cmpl(EAX, Immediate(Smi::RawValue(0)));
   __ j(EQUAL, &is_true, Assembler::kNearJump);
@@ -1962,7 +1940,7 @@
 
 void Intrinsifier::OneByteString_getHashCode(Assembler* assembler) {
   Label compute_hash;
-  __ movl(EBX, Address(ESP, + 1 * kWordSize));  // OneByteString object.
+  __ movl(EBX, Address(ESP, +1 * kWordSize));  // OneByteString object.
   __ movl(EAX, FieldAddress(EBX, String::hash_offset()));
   __ cmpl(EAX, Immediate(0));
   __ j(EQUAL, &compute_hash, Assembler::kNearJump);
@@ -2016,7 +1994,7 @@
   __ addl(EAX, EDX);
   // hash_ = hash_ & ((static_cast<intptr_t>(1) << bits) - 1);
   __ andl(EAX,
-      Immediate(((static_cast<intptr_t>(1) << String::kHashBits) - 1)));
+          Immediate(((static_cast<intptr_t>(1) << String::kHashBits) - 1)));
 
   // return hash_ == 0 ? 1 : hash_;
   __ cmpl(EAX, Immediate(0));
@@ -2037,7 +2015,7 @@
                                      Label* failure,
                                      Register length_reg) {
   NOT_IN_PRODUCT(
-    __ MaybeTraceAllocation(kOneByteStringCid, EAX, failure, false));
+      __ MaybeTraceAllocation(kOneByteStringCid, EAX, failure, false));
   if (length_reg != EDI) {
     __ movl(EDI, length_reg);
   }
@@ -2095,8 +2073,7 @@
 
   // Set the length field.
   __ popl(EDI);
-  __ StoreIntoObjectNoBarrier(EAX,
-                              FieldAddress(EAX, String::length_offset()),
+  __ StoreIntoObjectNoBarrier(EAX, FieldAddress(EAX, String::length_offset()),
                               EDI);
   // Clear hash.
   __ ZeroInitSmiField(FieldAddress(EAX, String::hash_offset()));
@@ -2117,24 +2094,24 @@
   const intptr_t kStartIndexOffset = 2 * kWordSize;
   const intptr_t kEndIndexOffset = 1 * kWordSize;
   Label fall_through, ok;
-  __ movl(EAX, Address(ESP, + kStartIndexOffset));
-  __ movl(EDI, Address(ESP, + kEndIndexOffset));
+  __ movl(EAX, Address(ESP, +kStartIndexOffset));
+  __ movl(EDI, Address(ESP, +kEndIndexOffset));
   __ orl(EAX, EDI);
   __ testl(EAX, Immediate(kSmiTagMask));
   __ j(NOT_ZERO, &fall_through);  // 'start', 'end' not Smi.
 
-  __ subl(EDI, Address(ESP, + kStartIndexOffset));
+  __ subl(EDI, Address(ESP, +kStartIndexOffset));
   TryAllocateOnebyteString(assembler, &ok, &fall_through, EDI);
   __ Bind(&ok);
   // EAX: new string as tagged pointer.
   // Copy string.
-  __ movl(EDI, Address(ESP, + kStringOffset));
-  __ movl(EBX, Address(ESP, + kStartIndexOffset));
+  __ movl(EDI, Address(ESP, +kStringOffset));
+  __ movl(EBX, Address(ESP, +kStartIndexOffset));
   __ SmiUntag(EBX);
   __ leal(EDI, FieldAddress(EDI, EBX, TIMES_1, OneByteString::data_offset()));
   // EDI: Start address to copy from (untagged).
   // EBX: Untagged start index.
-  __ movl(ECX, Address(ESP, + kEndIndexOffset));
+  __ movl(ECX, Address(ESP, +kEndIndexOffset));
   __ SmiUntag(ECX);
   __ subl(ECX, EBX);
   __ xorl(EDX, EDX);
@@ -2158,9 +2135,9 @@
 
 
 void Intrinsifier::OneByteStringSetAt(Assembler* assembler) {
-  __ movl(ECX, Address(ESP, + 1 * kWordSize));  // Value.
-  __ movl(EBX, Address(ESP, + 2 * kWordSize));  // Index.
-  __ movl(EAX, Address(ESP, + 3 * kWordSize));  // OneByteString.
+  __ movl(ECX, Address(ESP, +1 * kWordSize));  // Value.
+  __ movl(EBX, Address(ESP, +2 * kWordSize));  // Index.
+  __ movl(EAX, Address(ESP, +3 * kWordSize));  // OneByteString.
   __ SmiUntag(EBX);
   __ SmiUntag(ECX);
   __ movb(FieldAddress(EAX, EBX, TIMES_1, OneByteString::data_offset()), CL);
@@ -2169,7 +2146,7 @@
 
 
 void Intrinsifier::OneByteString_allocate(Assembler* assembler) {
-  __ movl(EDI, Address(ESP, + 1 * kWordSize));  // Length.
+  __ movl(EDI, Address(ESP, +1 * kWordSize));  // Length.
   Label fall_through, ok;
   TryAllocateOnebyteString(assembler, &ok, &fall_through, EDI);
   // EDI: Start address to copy from (untagged).
@@ -2184,8 +2161,8 @@
 // TODO(srdjan): Add combinations (one-byte/two-byte/external strings).
 static void StringEquality(Assembler* assembler, intptr_t string_cid) {
   Label fall_through, is_true, is_false, loop;
-  __ movl(EAX, Address(ESP, + 2 * kWordSize));  // This.
-  __ movl(EBX, Address(ESP, + 1 * kWordSize));  // Other.
+  __ movl(EAX, Address(ESP, +2 * kWordSize));  // This.
+  __ movl(EBX, Address(ESP, +1 * kWordSize));  // Other.
 
   // Are identical?
   __ cmpl(EAX, EBX);
@@ -2211,14 +2188,14 @@
   __ j(LESS, &is_true, Assembler::kNearJump);
   if (string_cid == kOneByteStringCid) {
     __ movzxb(ECX,
-        FieldAddress(EAX, EDI, TIMES_1, OneByteString::data_offset()));
+              FieldAddress(EAX, EDI, TIMES_1, OneByteString::data_offset()));
     __ movzxb(EDX,
-        FieldAddress(EBX, EDI, TIMES_1, OneByteString::data_offset()));
+              FieldAddress(EBX, EDI, TIMES_1, OneByteString::data_offset()));
   } else if (string_cid == kTwoByteStringCid) {
     __ movzxw(ECX,
-        FieldAddress(EAX, EDI, TIMES_2, TwoByteString::data_offset()));
+              FieldAddress(EAX, EDI, TIMES_2, TwoByteString::data_offset()));
     __ movzxw(EDX,
-        FieldAddress(EBX, EDI, TIMES_2, TwoByteString::data_offset()));
+              FieldAddress(EBX, EDI, TIMES_2, TwoByteString::data_offset()));
   } else {
     UNIMPLEMENTED();
   }
@@ -2286,7 +2263,7 @@
   // EAX: Current user tag.
   __ movl(EAX, Address(EDI, Isolate::current_tag_offset()));
   // EAX: UserTag.
-  __ movl(EBX, Address(ESP, + 1 * kWordSize));
+  __ movl(EBX, Address(ESP, +1 * kWordSize));
   // Set Isolate::current_tag_.
   __ movl(Address(EDI, Isolate::current_tag_offset()), EBX);
   // EAX: UserTag's tag.
diff --git a/runtime/vm/intrinsifier_mips.cc b/runtime/vm/intrinsifier_mips.cc
index aa512ad..0fa3e19 100644
--- a/runtime/vm/intrinsifier_mips.cc
+++ b/runtime/vm/intrinsifier_mips.cc
@@ -29,7 +29,9 @@
 #define __ assembler->
 
 
-intptr_t Intrinsifier::ParameterSlotFromSp() { return -1; }
+intptr_t Intrinsifier::ParameterSlotFromSp() {
+  return -1;
+}
 
 
 static bool IsABIPreservedRegister(Register reg) {
@@ -76,11 +78,9 @@
   // Note that T1 is Smi, i.e, times 2.
   ASSERT(kSmiTagShift == 1);
   __ lw(T2, Address(SP, 0 * kWordSize));  // Value.
-  __ sll(T1, T1, 1);  // T1 is Smi.
+  __ sll(T1, T1, 1);                      // T1 is Smi.
   __ addu(T1, T0, T1);
-  __ StoreIntoObject(T0,
-                     FieldAddress(T1, Array::data_offset()),
-                     T2);
+  __ StoreIntoObject(T0, FieldAddress(T1, Array::data_offset()), T2);
   // Caller is responsible for preserving the value if necessary.
   __ Ret();
   __ Bind(&fall_through);
@@ -104,21 +104,17 @@
   __ lw(T1, Address(SP, kArrayOffset));  // Data argument.
   // V0 is new, no barrier needed.
   __ StoreIntoObjectNoBarrier(
-      V0,
-      FieldAddress(V0, GrowableObjectArray::data_offset()),
-      T1);
+      V0, FieldAddress(V0, GrowableObjectArray::data_offset()), T1);
 
   // V0: new growable array object start as a tagged pointer.
   // Store the type argument field in the growable array object.
   __ lw(T1, Address(SP, kTypeArgumentsOffset));  // Type argument.
   __ StoreIntoObjectNoBarrier(
-      V0,
-      FieldAddress(V0, GrowableObjectArray::type_arguments_offset()),
-      T1);
+      V0, FieldAddress(V0, GrowableObjectArray::type_arguments_offset()), T1);
   // Set the length field in the growable array object to 0.
   __ Ret();  // Returns the newly allocated object in V0.
   __ delay_slot()->sw(ZR,
-      FieldAddress(V0, GrowableObjectArray::length_offset()));
+                      FieldAddress(V0, GrowableObjectArray::length_offset()));
 
   __ Bind(&fall_through);
 }
@@ -148,9 +144,7 @@
   ASSERT(kSmiTagShift == 1);
   __ sll(T1, T1, 1);
   __ addu(T1, T2, T1);
-  __ StoreIntoObject(T2,
-                     FieldAddress(T1, Array::data_offset()),
-                     T0);
+  __ StoreIntoObject(T2, FieldAddress(T1, Array::data_offset()), T0);
   __ LoadObject(T7, Object::null_object());
   __ Ret();
   __ delay_slot()->mov(V0, T7);
@@ -162,7 +156,7 @@
   Label fall_through;                                                          \
   const intptr_t kArrayLengthStackOffset = 0 * kWordSize;                      \
   NOT_IN_PRODUCT(__ MaybeTraceAllocation(cid, T2, &fall_through));             \
-  __ lw(T2, Address(SP, kArrayLengthStackOffset));  /* Array length. */        \
+  __ lw(T2, Address(SP, kArrayLengthStackOffset)); /* Array length. */         \
   /* Check that length is a positive Smi. */                                   \
   /* T2: requested array length argument. */                                   \
   __ andi(CMPRES1, T2, Immediate(kSmiTagMask));                                \
@@ -209,7 +203,7 @@
                              &size_tag_overflow);                              \
     __ b(&done);                                                               \
     __ delay_slot()->sll(T2, T2,                                               \
-        RawObject::kSizeTagPos - kObjectAlignmentLog2);                        \
+                         RawObject::kSizeTagPos - kObjectAlignmentLog2);       \
                                                                                \
     __ Bind(&size_tag_overflow);                                               \
     __ mov(T2, ZR);                                                            \
@@ -218,15 +212,14 @@
     /* Get the class index and insert it into the tags. */                     \
     __ LoadImmediate(TMP, RawObject::ClassIdTag::encode(cid));                 \
     __ or_(T2, T2, TMP);                                                       \
-    __ sw(T2, FieldAddress(V0, type_name::tags_offset()));  /* Tags. */        \
+    __ sw(T2, FieldAddress(V0, type_name::tags_offset())); /* Tags. */         \
   }                                                                            \
   /* Set the length field. */                                                  \
   /* V0: new object start as a tagged pointer. */                              \
   /* T1: new object end address. */                                            \
-  __ lw(T2, Address(SP, kArrayLengthStackOffset));  /* Array length. */        \
-  __ StoreIntoObjectNoBarrier(V0,                                              \
-                              FieldAddress(V0, type_name::length_offset()),    \
-                              T2);                                             \
+  __ lw(T2, Address(SP, kArrayLengthStackOffset)); /* Array length. */         \
+  __ StoreIntoObjectNoBarrier(                                                 \
+      V0, FieldAddress(V0, type_name::length_offset()), T2);                   \
   /* Initialize all array elements to 0. */                                    \
   /* V0: new object start as a tagged pointer. */                              \
   /* T1: new object end address. */                                            \
@@ -242,16 +235,21 @@
   __ Bind(&done);                                                              \
                                                                                \
   __ Ret();                                                                    \
-  __ Bind(&fall_through);                                                      \
+  __ Bind(&fall_through);
 
 
 static int GetScaleFactor(intptr_t size) {
   switch (size) {
-    case 1: return 0;
-    case 2: return 1;
-    case 4: return 2;
-    case 8: return 3;
-    case 16: return 4;
+    case 1:
+      return 0;
+    case 2:
+      return 1;
+    case 4:
+      return 2;
+    case 8:
+      return 3;
+    case 16:
+      return 4;
   }
   UNREACHABLE();
   return -1;
@@ -259,12 +257,12 @@
 
 
 #define TYPED_DATA_ALLOCATOR(clazz)                                            \
-void Intrinsifier::TypedData_##clazz##_factory(Assembler* assembler) {         \
-  intptr_t size = TypedData::ElementSizeInBytes(kTypedData##clazz##Cid);       \
-  intptr_t max_len = TypedData::MaxElements(kTypedData##clazz##Cid);           \
-  int shift = GetScaleFactor(size);                                            \
-  TYPED_ARRAY_ALLOCATION(TypedData, kTypedData##clazz##Cid, max_len, shift);   \
-}
+  void Intrinsifier::TypedData_##clazz##_factory(Assembler* assembler) {       \
+    intptr_t size = TypedData::ElementSizeInBytes(kTypedData##clazz##Cid);     \
+    intptr_t max_len = TypedData::MaxElements(kTypedData##clazz##Cid);         \
+    int shift = GetScaleFactor(size);                                          \
+    TYPED_ARRAY_ALLOCATION(TypedData, kTypedData##clazz##Cid, max_len, shift); \
+  }
 CLASS_LIST_TYPED_DATA(TYPED_DATA_ALLOCATOR)
 #undef TYPED_DATA_ALLOCATOR
 
@@ -285,8 +283,8 @@
   Label fall_through;
 
   TestBothArgumentsSmis(assembler, &fall_through);  // Checks two Smis.
-  __ AdduDetectOverflow(V0, T0, T1, CMPRES1);  // Add.
-  __ bltz(CMPRES1, &fall_through);  // Fall through on overflow.
+  __ AdduDetectOverflow(V0, T0, T1, CMPRES1);       // Add.
+  __ bltz(CMPRES1, &fall_through);                  // Fall through on overflow.
   __ Ret();  // Nothing in branch delay slot.
   __ Bind(&fall_through);
 }
@@ -302,7 +300,7 @@
 
   TestBothArgumentsSmis(assembler, &fall_through);
   __ SubuDetectOverflow(V0, T0, T1, CMPRES1);  // Subtract.
-  __ bltz(CMPRES1, &fall_through);  // Fall through on overflow.
+  __ bltz(CMPRES1, &fall_through);             // Fall through on overflow.
   __ Ret();
   __ Bind(&fall_through);
 }
@@ -313,8 +311,8 @@
 
   TestBothArgumentsSmis(assembler, &fall_through);
   __ SubuDetectOverflow(V0, T1, T0, CMPRES1);  // Subtract.
-  __ bltz(CMPRES1, &fall_through);  // Fall through on overflow.
-  __ Ret();  // Nothing in branch delay slot.
+  __ bltz(CMPRES1, &fall_through);             // Fall through on overflow.
+  __ Ret();                                    // Nothing in branch delay slot.
   __ Bind(&fall_through);
 }
 
@@ -325,10 +323,10 @@
   TestBothArgumentsSmis(assembler, &fall_through);  // checks two smis
   __ SmiUntag(T0);  // untags T0. only want result shifted by one
 
-  __ mult(T0, T1);  // HI:LO <- T0 * T1.
-  __ mflo(V0);  // V0 <- LO.
-  __ mfhi(T2);  // T2 <- HI.
-  __ sra(T3, V0, 31);  // T3 <- V0 >> 31.
+  __ mult(T0, T1);                // HI:LO <- T0 * T1.
+  __ mflo(V0);                    // V0 <- LO.
+  __ mfhi(T2);                    // T2 <- HI.
+  __ sra(T3, V0, 31);             // T3 <- V0 >> 31.
   __ bne(T2, T3, &fall_through);  // Fall through on overflow.
   __ Ret();
   __ Bind(&fall_through);
@@ -375,7 +373,7 @@
   __ SmiUntag(right);
   __ SmiUntag(left);
   __ div(left, right);  // Divide, remainder goes in HI.
-  __ mfhi(result);  // result <- HI.
+  __ mfhi(result);      // result <- HI.
   return;
 }
 
@@ -433,7 +431,7 @@
   __ SmiUntag(T0);
   __ SmiUntag(T1);
   __ div(T1, T0);  // LO <- T1 / T0
-  __ mflo(V0);  // V0 <- LO
+  __ mflo(V0);     // V0 <- LO
   // Check the corner case of dividing the 'MIN_SMI' with -1, in which case we
   // cannot tag the result.
   __ BranchEqual(V0, Immediate(0x40000000), &fall_through);
@@ -446,9 +444,9 @@
 void Intrinsifier::Integer_negate(Assembler* assembler) {
   Label fall_through;
 
-  __ lw(T0, Address(SP, + 0 * kWordSize));  // Grabs first argument.
+  __ lw(T0, Address(SP, +0 * kWordSize));        // Grabs first argument.
   __ andi(CMPRES1, T0, Immediate(kSmiTagMask));  // Test for Smi.
-  __ bne(CMPRES1, ZR, &fall_through);  // Fall through if not a Smi.
+  __ bne(CMPRES1, ZR, &fall_through);            // Fall through if not a Smi.
   __ SubuDetectOverflow(V0, ZR, T0, CMPRES1);
   __ bltz(CMPRES1, &fall_through);  // There was overflow.
   __ Ret();
@@ -507,8 +505,8 @@
   Label fall_through, overflow;
 
   TestBothArgumentsSmis(assembler, &fall_through);
-  __ BranchUnsignedGreater(
-      T0, Immediate(Smi::RawValue(Smi::kBits)), &fall_through);
+  __ BranchUnsignedGreater(T0, Immediate(Smi::RawValue(Smi::kBits)),
+                           &fall_through);
   __ SmiUntag(T0);
 
   // Check for overflow by shifting left and shifting back arithmetically.
@@ -531,18 +529,18 @@
   // high bits = (((1 << T0) - 1) << (32 - T0)) & T1) >> (32 - T0)
   // lo bits = T1 << T0
   __ LoadImmediate(T3, 1);
-  __ sllv(T3, T3, T0);  // T3 <- T3 << T0
+  __ sllv(T3, T3, T0);              // T3 <- T3 << T0
   __ addiu(T3, T3, Immediate(-1));  // T3 <- T3 - 1
-  __ subu(T4, ZR, T0);  // T4 <- -T0
+  __ subu(T4, ZR, T0);              // T4 <- -T0
   __ addiu(T4, T4, Immediate(32));  // T4 <- 32 - T0
-  __ sllv(T3, T3, T4);  // T3 <- T3 << T4
-  __ and_(T3, T3, T1);  // T3 <- T3 & T1
-  __ srlv(T3, T3, T4);  // T3 <- T3 >> T4
+  __ sllv(T3, T3, T4);              // T3 <- T3 << T4
+  __ and_(T3, T3, T1);              // T3 <- T3 & T1
+  __ srlv(T3, T3, T4);              // T3 <- T3 >> T4
   // Now T3 has the bits that fall off of T1 on a left shift.
   __ sllv(T0, T1, T0);  // T0 gets low bits.
 
-  const Class& mint_class = Class::Handle(
-      Isolate::Current()->object_store()->mint_class());
+  const Class& mint_class =
+      Class::Handle(Isolate::Current()->object_store()->mint_class());
   __ TryAllocate(mint_class, &fall_through, V0, T1);
 
   __ sw(T0, FieldAddress(V0, Mint::value_offset()));
@@ -585,10 +583,18 @@
   // T0 contains the right argument. T1 contains left argument
 
   switch (rel_op) {
-    case LT: __ BranchSignedLess(T1, T0, &is_true); break;
-    case LE: __ BranchSignedLessEqual(T1, T0, &is_true); break;
-    case GT: __ BranchSignedGreater(T1, T0, &is_true); break;
-    case GE: __ BranchSignedGreaterEqual(T1, T0, &is_true); break;
+    case LT:
+      __ BranchSignedLess(T1, T0, &is_true);
+      break;
+    case LE:
+      __ BranchSignedLessEqual(T1, T0, &is_true);
+      break;
+    case GT:
+      __ BranchSignedGreater(T1, T0, &is_true);
+      break;
+    case GE:
+      __ BranchSignedGreaterEqual(T1, T0, &is_true);
+      break;
     default:
       UNREACHABLE();
       break;
@@ -743,7 +749,7 @@
   __ bltz(T0, &fall_through);
 
   __ LoadImmediate(T2, 0x1F);
-  __ slt(CMPRES1, T2, T0);  // CMPRES1 <- 0x1F < T0 ? 1 : 0
+  __ slt(CMPRES1, T2, T0);   // CMPRES1 <- 0x1F < T0 ? 1 : 0
   __ movn(T0, T2, CMPRES1);  // T0 <- 0x1F < T0 ? 0x1F : T0
 
   __ SmiUntag(T1);
@@ -1178,7 +1184,7 @@
 
   // T5 = ajp = &a_digits[i]
   __ lw(T1, Address(SP, 1 * kWordSize));  // a_digits
-  __ sll(T0, T2, 2);  // j == 2*i, i is Smi.
+  __ sll(T0, T2, 2);                      // j == 2*i, i is Smi.
   __ addu(T1, T0, T1);
   __ addiu(T5, T1, Immediate(TypedData::data_offset() - kHeapObjectTag));
 
@@ -1239,7 +1245,7 @@
   __ sltu(T1, T0, T6);
   __ addu(T6, A1, T1);  // No carry out; A2:T6:T0 = 2*x*xi + aj + low32(c).
   __ addu(T6, T6, T7);  // No carry out; A2:T6:T0 = 2*x*xi + aj + c.
-  __ mov(T7, A2);  // T7:T6:T0 = 2*x*xi + aj + c.
+  __ mov(T7, A2);       // T7:T6:T0 = 2*x*xi + aj + c.
 
   // *ajp++ = low32(t) = T0
   __ sw(T0, Address(T5, 0));
@@ -1288,8 +1294,8 @@
   __ lw(T4, Address(SP, 2 * kWordSize));  // args
 
   // T3 = rho = args[2]
-  __ lw(T3,
-        FieldAddress(T4, TypedData::data_offset() + 2*Bigint::kBytesPerDigit));
+  __ lw(T3, FieldAddress(
+                T4, TypedData::data_offset() + 2 * Bigint::kBytesPerDigit));
 
   // T2 = d = digits[i >> 1]
   __ lw(T0, Address(SP, 0 * kWordSize));  // T0 = i as Smi.
@@ -1303,8 +1309,8 @@
 
   // args[4] = t mod DIGIT_BASE = low32(t)
   __ mflo(T0);
-  __ sw(T0,
-        FieldAddress(T4, TypedData::data_offset() + 4*Bigint::kBytesPerDigit));
+  __ sw(T0, FieldAddress(
+                T4, TypedData::data_offset() + 4 * Bigint::kBytesPerDigit));
 
   __ addiu(V0, ZR, Immediate(Smi::RawValue(1)));  // One digit processed.
   __ Ret();
@@ -1349,11 +1355,21 @@
   __ Bind(&no_NaN);
 
   switch (rel_op) {
-    case EQ: __ ceqd(D0, D1); break;
-    case LT: __ coltd(D0, D1); break;
-    case LE: __ coled(D0, D1); break;
-    case GT: __ coltd(D1, D0); break;
-    case GE: __ coled(D1, D0); break;
+    case EQ:
+      __ ceqd(D0, D1);
+      break;
+    case LT:
+      __ coltd(D0, D1);
+      break;
+    case LE:
+      __ coled(D0, D1);
+      break;
+    case GT:
+      __ coltd(D1, D0);
+      break;
+    case GE:
+      __ coled(D1, D0);
+      break;
     default: {
       // Only passing the above conditions to this function.
       UNREACHABLE();
@@ -1420,14 +1436,23 @@
   __ lwc1(F0, FieldAddress(T0, Double::value_offset()));
   __ lwc1(F1, FieldAddress(T0, Double::value_offset() + kWordSize));
   switch (kind) {
-    case Token::kADD: __ addd(D0, D0, D1); break;
-    case Token::kSUB: __ subd(D0, D0, D1); break;
-    case Token::kMUL: __ muld(D0, D0, D1); break;
-    case Token::kDIV: __ divd(D0, D0, D1); break;
-    default: UNREACHABLE();
+    case Token::kADD:
+      __ addd(D0, D0, D1);
+      break;
+    case Token::kSUB:
+      __ subd(D0, D0, D1);
+      break;
+    case Token::kMUL:
+      __ muld(D0, D0, D1);
+      break;
+    case Token::kDIV:
+      __ divd(D0, D0, D1);
+      break;
+    default:
+      UNREACHABLE();
   }
-  const Class& double_class = Class::Handle(
-      Isolate::Current()->object_store()->double_class());
+  const Class& double_class =
+      Class::Handle(Isolate::Current()->object_store()->double_class());
   __ TryAllocate(double_class, &fall_through, V0, T1);  // Result register.
   __ swc1(F0, FieldAddress(V0, Double::value_offset()));
   __ Ret();
@@ -1481,8 +1506,8 @@
   __ lwc1(F0, FieldAddress(T0, Double::value_offset()));
   __ lwc1(F1, FieldAddress(T0, Double::value_offset() + kWordSize));
   __ muld(D0, D0, D1);
-  const Class& double_class = Class::Handle(
-      Isolate::Current()->object_store()->double_class());
+  const Class& double_class =
+      Class::Handle(Isolate::Current()->object_store()->double_class());
   __ TryAllocate(double_class, &fall_through, V0, T1);  // Result register.
   __ swc1(F0, FieldAddress(V0, Double::value_offset()));
   __ Ret();
@@ -1503,8 +1528,8 @@
   __ SmiUntag(T0);
   __ mtc1(T0, F4);
   __ cvtdw(D0, F4);
-  const Class& double_class = Class::Handle(
-      Isolate::Current()->object_store()->double_class());
+  const Class& double_class =
+      Class::Handle(Isolate::Current()->object_store()->double_class());
   __ TryAllocate(double_class, &fall_through, V0, T1);  // Result register.
   __ swc1(F0, FieldAddress(V0, Double::value_offset()));
   __ Ret();
@@ -1576,10 +1601,10 @@
 
   __ Bind(&is_zero);
   // Check for negative zero by looking at the sign bit.
-  __ mfc1(T0, F1);  // Moves bits 32...63 of D0 to T0.
-  __ srl(T0, T0, 31);  // Get the sign bit down to bit 0 of T0.
+  __ mfc1(T0, F1);                     // Moves bits 32...63 of D0 to T0.
+  __ srl(T0, T0, 31);                  // Get the sign bit down to bit 0 of T0.
   __ andi(CMPRES1, T0, Immediate(1));  // Check if the bit is set.
-  __ bne(T0, ZR, &is_true);  // Sign bit set. True.
+  __ bne(T0, ZR, &is_true);            // Sign bit set. True.
   __ b(&is_false);
 }
 
@@ -1610,8 +1635,8 @@
   __ LoadDFromOffset(D1, T0, Double::value_offset() - kHeapObjectTag);
   __ Bind(&double_op);
   __ sqrtd(D0, D1);
-  const Class& double_class = Class::Handle(
-      Isolate::Current()->object_store()->double_class());
+  const Class& double_class =
+      Class::Handle(Isolate::Current()->object_store()->double_class());
   __ TryAllocate(double_class, &fall_through, V0, T1);  // Result register.
   __ swc1(F0, FieldAddress(V0, Double::value_offset()));
   __ Ret();
@@ -1633,8 +1658,8 @@
 void Intrinsifier::Random_nextState(Assembler* assembler) {
   const Library& math_lib = Library::Handle(Library::MathLibrary());
   ASSERT(!math_lib.IsNull());
-  const Class& random_class = Class::Handle(
-      math_lib.LookupClassAllowPrivate(Symbols::_Random()));
+  const Class& random_class =
+      Class::Handle(math_lib.LookupClassAllowPrivate(Symbols::_Random()));
   ASSERT(!random_class.IsNull());
   const Field& state_field = Field::ZoneHandle(
       random_class.LookupInstanceFieldAllowPrivate(Symbols::_state()));
@@ -1689,9 +1714,7 @@
 }
 
 
-enum RangeCheckCondition {
-  kIfNotInRange, kIfInRange
-};
+enum RangeCheckCondition { kIfNotInRange, kIfInRange };
 
 
 static void RangeCheck(Assembler* assembler,
@@ -1728,16 +1751,11 @@
 
 
 static void JumpIfString(Assembler* assembler,
-                          Register cid,
-                          Register tmp,
-                          Label* target) {
-  RangeCheck(assembler,
-             cid,
-             tmp,
-             kOneByteStringCid,
-             kExternalTwoByteStringCid,
-             kIfInRange,
-             target);
+                         Register cid,
+                         Register tmp,
+                         Label* target) {
+  RangeCheck(assembler, cid, tmp, kOneByteStringCid, kExternalTwoByteStringCid,
+             kIfInRange, target);
 }
 
 
@@ -1745,13 +1763,8 @@
                             Register cid,
                             Register tmp,
                             Label* target) {
-  RangeCheck(assembler,
-             cid,
-             tmp,
-             kOneByteStringCid,
-             kExternalTwoByteStringCid,
-             kIfNotInRange,
-             target);
+  RangeCheck(assembler, cid, tmp, kOneByteStringCid, kExternalTwoByteStringCid,
+             kIfNotInRange, target);
 }
 
 
@@ -1764,8 +1777,8 @@
   // Closures are handled in the runtime.
   __ BranchEqual(T1, Immediate(kClosureCid), &fall_through);
 
-  __ BranchUnsignedGreaterEqual(
-      T1, Immediate(kNumPredefinedCids), &use_canonical_type);
+  __ BranchUnsignedGreaterEqual(T1, Immediate(kNumPredefinedCids),
+                                &use_canonical_type);
 
   __ BranchNotEqual(T1, Immediate(kDoubleCid), &not_double);
   // Object is a double.
@@ -1834,8 +1847,7 @@
   // Class ids are different. Check if we are comparing runtime types of
   // two strings (with different representations) or two integers.
   __ Bind(&different_cids);
-  __ BranchUnsignedGreaterEqual(
-      T1, Immediate(kNumPredefinedCids), &not_equal);
+  __ BranchUnsignedGreaterEqual(T1, Immediate(kNumPredefinedCids), &not_equal);
 
   // Check if both are integers.
   JumpIfNotInteger(assembler, T1, T0, &not_integer);
@@ -1950,20 +1962,16 @@
   __ LoadClassId(CMPRES1, A0);
   __ BranchNotEqual(CMPRES1, Immediate(kOneByteStringCid), &try_two_byte);
 
-  GenerateSubstringMatchesSpecialization(assembler,
-                                         kOneByteStringCid,
-                                         kOneByteStringCid,
-                                         &return_true,
+  GenerateSubstringMatchesSpecialization(assembler, kOneByteStringCid,
+                                         kOneByteStringCid, &return_true,
                                          &return_false);
 
   __ Bind(&try_two_byte);
   __ LoadClassId(CMPRES1, A0);
   __ BranchNotEqual(CMPRES1, Immediate(kTwoByteStringCid), &fall_through);
 
-  GenerateSubstringMatchesSpecialization(assembler,
-                                         kTwoByteStringCid,
-                                         kOneByteStringCid,
-                                         &return_true,
+  GenerateSubstringMatchesSpecialization(assembler, kTwoByteStringCid,
+                                         kOneByteStringCid, &return_true,
                                          &return_false);
 
   __ Bind(&return_true);
@@ -1986,13 +1994,13 @@
 
   // Checks.
   __ andi(CMPRES1, T1, Immediate(kSmiTagMask));
-  __ bne(CMPRES1, ZR, &fall_through);  // Index is not a Smi.
+  __ bne(CMPRES1, ZR, &fall_through);                    // Index is not a Smi.
   __ lw(T2, FieldAddress(T0, String::length_offset()));  // Range check.
   // Runtime throws exception.
   __ BranchUnsignedGreaterEqual(T1, T2, &fall_through);
   __ LoadClassId(CMPRES1, T0);  // Class ID check.
-  __ BranchNotEqual(
-      CMPRES1, Immediate(kOneByteStringCid), &try_two_byte_string);
+  __ BranchNotEqual(CMPRES1, Immediate(kOneByteStringCid),
+                    &try_two_byte_string);
 
   // Grab byte and return.
   __ SmiUntag(T1);
@@ -2155,8 +2163,8 @@
     Label overflow, done;
     const intptr_t shift = RawObject::kSizeTagPos - kObjectAlignmentLog2;
 
-    __ BranchUnsignedGreater(
-        T2, Immediate(RawObject::SizeTag::kMaxSizeTag), &overflow);
+    __ BranchUnsignedGreater(T2, Immediate(RawObject::SizeTag::kMaxSizeTag),
+                             &overflow);
     __ b(&done);
     __ delay_slot()->sll(T2, T2, shift);
     __ Bind(&overflow);
@@ -2171,8 +2179,7 @@
   }
 
   // Set the length field using the saved length (T6).
-  __ StoreIntoObjectNoBarrier(V0,
-                              FieldAddress(V0, String::length_offset()),
+  __ StoreIntoObjectNoBarrier(V0, FieldAddress(V0, String::length_offset()),
                               T6);
   // Clear hash.
   __ b(ok);
@@ -2275,7 +2282,7 @@
   // Is other OneByteString?
   __ andi(CMPRES1, T1, Immediate(kSmiTagMask));
   __ beq(CMPRES1, ZR, &fall_through);  // Other is Smi.
-  __ LoadClassId(CMPRES1, T1);  // Class ID check.
+  __ LoadClassId(CMPRES1, T1);         // Class ID check.
   __ BranchNotEqual(CMPRES1, Immediate(string_cid), &fall_through);
 
   // Have same length?
@@ -2367,7 +2374,7 @@
   // V0: Current user tag.
   __ lw(V0, Address(T1, Isolate::current_tag_offset()));
   // T2: UserTag.
-  __ lw(T2, Address(SP, + 0 * kWordSize));
+  __ lw(T2, Address(SP, +0 * kWordSize));
   // Set Isolate::current_tag_.
   __ sw(T2, Address(T1, Isolate::current_tag_offset()));
   // T2: UserTag's tag.
diff --git a/runtime/vm/intrinsifier_x64.cc b/runtime/vm/intrinsifier_x64.cc
index 288d5e4..f4f7313 100644
--- a/runtime/vm/intrinsifier_x64.cc
+++ b/runtime/vm/intrinsifier_x64.cc
@@ -29,7 +29,9 @@
 #define __ assembler->
 
 
-intptr_t Intrinsifier::ParameterSlotFromSp() { return 0; }
+intptr_t Intrinsifier::ParameterSlotFromSp() {
+  return 0;
+}
 
 
 static bool IsABIPreservedRegister(Register reg) {
@@ -61,9 +63,9 @@
   }
 
   Label fall_through;
-  __ movq(RDX, Address(RSP, + 1 * kWordSize));  // Value.
-  __ movq(RCX, Address(RSP, + 2 * kWordSize));  // Index.
-  __ movq(RAX, Address(RSP, + 3 * kWordSize));  // Array.
+  __ movq(RDX, Address(RSP, +1 * kWordSize));  // Value.
+  __ movq(RCX, Address(RSP, +2 * kWordSize));  // Index.
+  __ movq(RAX, Address(RSP, +3 * kWordSize));  // Array.
   __ testq(RCX, Immediate(kSmiTagMask));
   __ j(NOT_ZERO, &fall_through);
   // Range check.
@@ -73,8 +75,7 @@
   // Note that RBX is Smi, i.e, times 2.
   ASSERT(kSmiTagShift == 1);
   // Destroy RCX (ic data) as we will not continue in the function.
-  __ StoreIntoObject(RAX,
-                     FieldAddress(RAX, RCX, TIMES_4, Array::data_offset()),
+  __ StoreIntoObject(RAX, FieldAddress(RAX, RCX, TIMES_4, Array::data_offset()),
                      RDX);
   // Caller is responsible of preserving the value if necessary.
   __ ret();
@@ -101,16 +102,13 @@
   __ movq(RCX, Address(RSP, kArrayOffset));  // data argument.
   // RAX is new, no barrier needed.
   __ StoreIntoObjectNoBarrier(
-      RAX,
-      FieldAddress(RAX, GrowableObjectArray::data_offset()),
-      RCX);
+      RAX, FieldAddress(RAX, GrowableObjectArray::data_offset()), RCX);
 
   // RAX: new growable array object start as a tagged pointer.
   // Store the type argument field in the growable array object.
   __ movq(RCX, Address(RSP, kTypeArgumentsOffset));  // type argument.
   __ StoreIntoObjectNoBarrier(
-      RAX,
-      FieldAddress(RAX, GrowableObjectArray::type_arguments_offset()),
+      RAX, FieldAddress(RAX, GrowableObjectArray::type_arguments_offset()),
       RCX);
 
   // Set the length field in the growable array object to 0.
@@ -128,7 +126,7 @@
   // In checked mode we need to check the incoming argument.
   if (Isolate::Current()->type_checks()) return;
   Label fall_through;
-  __ movq(RAX, Address(RSP, + 2 * kWordSize));  // Array.
+  __ movq(RAX, Address(RSP, +2 * kWordSize));  // Array.
   __ movq(RCX, FieldAddress(RAX, GrowableObjectArray::length_offset()));
   // RCX: length.
   __ movq(RDX, FieldAddress(RAX, GrowableObjectArray::data_offset()));
@@ -139,10 +137,9 @@
   // len = len + 1;
   __ IncrementSmiField(FieldAddress(RAX, GrowableObjectArray::length_offset()),
                        1);
-  __ movq(RAX, Address(RSP, + 1 * kWordSize));  // Value
+  __ movq(RAX, Address(RSP, +1 * kWordSize));  // Value
   ASSERT(kSmiTagShift == 1);
-  __ StoreIntoObject(RDX,
-                     FieldAddress(RDX, RCX, TIMES_4, Array::data_offset()),
+  __ StoreIntoObject(RDX, FieldAddress(RDX, RCX, TIMES_4, Array::data_offset()),
                      RAX);
   __ LoadObject(RAX, Object::null_object());
   __ ret();
@@ -154,7 +151,7 @@
   Label fall_through;                                                          \
   const intptr_t kArrayLengthStackOffset = 1 * kWordSize;                      \
   NOT_IN_PRODUCT(__ MaybeTraceAllocation(cid, &fall_through, false));          \
-  __ movq(RDI, Address(RSP, kArrayLengthStackOffset));  /* Array length. */    \
+  __ movq(RDI, Address(RSP, kArrayLengthStackOffset)); /* Array length. */     \
   /* Check that length is a positive Smi. */                                   \
   /* RDI: requested array length argument. */                                  \
   __ testq(RDI, Immediate(kSmiTagMask));                                       \
@@ -216,22 +213,21 @@
                                                                                \
     /* Get the class index and insert it into the tags. */                     \
     __ orq(RDI, Immediate(RawObject::ClassIdTag::encode(cid)));                \
-    __ movq(FieldAddress(RAX, type_name::tags_offset()), RDI);  /* Tags. */    \
+    __ movq(FieldAddress(RAX, type_name::tags_offset()), RDI); /* Tags. */     \
   }                                                                            \
   /* Set the length field. */                                                  \
   /* RAX: new object start as a tagged pointer. */                             \
   /* RCX: new object end address. */                                           \
-  __ movq(RDI, Address(RSP, kArrayLengthStackOffset));  /* Array length. */    \
-  __ StoreIntoObjectNoBarrier(RAX,                                             \
-                              FieldAddress(RAX, type_name::length_offset()),   \
-                              RDI);                                            \
+  __ movq(RDI, Address(RSP, kArrayLengthStackOffset)); /* Array length. */     \
+  __ StoreIntoObjectNoBarrier(                                                 \
+      RAX, FieldAddress(RAX, type_name::length_offset()), RDI);                \
   /* Initialize all array elements to 0. */                                    \
   /* RAX: new object start as a tagged pointer. */                             \
   /* RCX: new object end address. */                                           \
   /* RDI: iterator which initially points to the start of the variable */      \
   /* RBX: scratch register. */                                                 \
   /* data area to be initialized. */                                           \
-  __ xorq(RBX, RBX);  /* Zero. */                                              \
+  __ xorq(RBX, RBX); /* Zero. */                                               \
   __ leaq(RDI, FieldAddress(RAX, sizeof(Raw##type_name)));                     \
   Label done, init_loop;                                                       \
   __ Bind(&init_loop);                                                         \
@@ -243,16 +239,21 @@
   __ Bind(&done);                                                              \
                                                                                \
   __ ret();                                                                    \
-  __ Bind(&fall_through);                                                      \
+  __ Bind(&fall_through);
 
 
 static ScaleFactor GetScaleFactor(intptr_t size) {
   switch (size) {
-    case 1: return TIMES_1;
-    case 2: return TIMES_2;
-    case 4: return TIMES_4;
-    case 8: return TIMES_8;
-    case 16: return TIMES_16;
+    case 1:
+      return TIMES_1;
+    case 2:
+      return TIMES_2;
+    case 4:
+      return TIMES_4;
+    case 8:
+      return TIMES_8;
+    case 16:
+      return TIMES_16;
   }
   UNREACHABLE();
   return static_cast<ScaleFactor>(0);
@@ -260,12 +261,12 @@
 
 
 #define TYPED_DATA_ALLOCATOR(clazz)                                            \
-void Intrinsifier::TypedData_##clazz##_factory(Assembler* assembler) {         \
-  intptr_t size = TypedData::ElementSizeInBytes(kTypedData##clazz##Cid);       \
-  intptr_t max_len = TypedData::MaxElements(kTypedData##clazz##Cid);           \
-  ScaleFactor scale = GetScaleFactor(size);                                    \
-  TYPED_ARRAY_ALLOCATION(TypedData, kTypedData##clazz##Cid, max_len, scale);   \
-}
+  void Intrinsifier::TypedData_##clazz##_factory(Assembler* assembler) {       \
+    intptr_t size = TypedData::ElementSizeInBytes(kTypedData##clazz##Cid);     \
+    intptr_t max_len = TypedData::MaxElements(kTypedData##clazz##Cid);         \
+    ScaleFactor scale = GetScaleFactor(size);                                  \
+    TYPED_ARRAY_ALLOCATION(TypedData, kTypedData##clazz##Cid, max_len, scale); \
+  }
 CLASS_LIST_TYPED_DATA(TYPED_DATA_ALLOCATOR)
 #undef TYPED_DATA_ALLOCATOR
 
@@ -273,8 +274,8 @@
 // Tests if two top most arguments are smis, jumps to label not_smi if not.
 // Topmost argument is in RAX.
 static void TestBothArgumentsSmis(Assembler* assembler, Label* not_smi) {
-  __ movq(RAX, Address(RSP, + 1 * kWordSize));
-  __ movq(RCX, Address(RSP, + 2 * kWordSize));
+  __ movq(RAX, Address(RSP, +1 * kWordSize));
+  __ movq(RCX, Address(RSP, +2 * kWordSize));
   __ orq(RCX, RAX);
   __ testq(RCX, Immediate(kSmiTagMask));
   __ j(NOT_ZERO, not_smi);
@@ -285,7 +286,7 @@
   Label fall_through;
   TestBothArgumentsSmis(assembler, &fall_through);
   // RAX contains right argument.
-  __ addq(RAX, Address(RSP, + 2 * kWordSize));
+  __ addq(RAX, Address(RSP, +2 * kWordSize));
   __ j(OVERFLOW, &fall_through, Assembler::kNearJump);
   // Result is in RAX.
   __ ret();
@@ -302,7 +303,7 @@
   Label fall_through;
   TestBothArgumentsSmis(assembler, &fall_through);
   // RAX contains right argument, which is the actual minuend of subtraction.
-  __ subq(RAX, Address(RSP, + 2 * kWordSize));
+  __ subq(RAX, Address(RSP, +2 * kWordSize));
   __ j(OVERFLOW, &fall_through, Assembler::kNearJump);
   // Result is in RAX.
   __ ret();
@@ -315,7 +316,7 @@
   TestBothArgumentsSmis(assembler, &fall_through);
   // RAX contains right argument, which is the actual subtrahend of subtraction.
   __ movq(RCX, RAX);
-  __ movq(RAX, Address(RSP, + 2 * kWordSize));
+  __ movq(RAX, Address(RSP, +2 * kWordSize));
   __ subq(RAX, RCX);
   __ j(OVERFLOW, &fall_through, Assembler::kNearJump);
   // Result is in RAX.
@@ -324,14 +325,13 @@
 }
 
 
-
 void Intrinsifier::Integer_mulFromInteger(Assembler* assembler) {
   Label fall_through;
   TestBothArgumentsSmis(assembler, &fall_through);
   // RAX is the right argument.
   ASSERT(kSmiTag == 0);  // Adjust code below if not the case.
   __ SmiUntag(RAX);
-  __ imulq(RAX, Address(RSP, + 2 * kWordSize));
+  __ imulq(RAX, Address(RSP, +2 * kWordSize));
   __ j(OVERFLOW, &fall_through, Assembler::kNearJump);
   // Result is in RAX.
   __ ret();
@@ -368,7 +368,7 @@
   __ j(LESS, &try_modulo, Assembler::kNearJump);
   // left is positive.
   __ cmpq(RAX, RCX);
-  __ j(GREATER, &try_modulo,  Assembler::kNearJump);
+  __ j(GREATER, &try_modulo, Assembler::kNearJump);
   // left is less than right, result is left (RAX).
   __ ret();
 
@@ -420,7 +420,7 @@
 void Intrinsifier::Integer_moduloFromInteger(Assembler* assembler) {
   Label fall_through, negative_result;
   TestBothArgumentsSmis(assembler, &fall_through);
-  __ movq(RCX, Address(RSP, + 2 * kWordSize));
+  __ movq(RCX, Address(RSP, +2 * kWordSize));
   // RAX: Tagged left (dividend).
   // RCX: Tagged right (divisor).
   __ cmpq(RCX, Immediate(0));
@@ -458,7 +458,7 @@
   __ cmpq(RAX, Immediate(0));
   __ j(EQUAL, &fall_through, Assembler::kNearJump);
   __ movq(RCX, RAX);
-  __ movq(RAX, Address(RSP, + 2 * kWordSize));  // Left argument (dividend).
+  __ movq(RAX, Address(RSP, +2 * kWordSize));  // Left argument (dividend).
 
   // Check if both operands fit into 32bits as idiv with 64bit operands
   // requires twice as many cycles and has much higher latency. We are checking
@@ -500,7 +500,7 @@
 
 void Intrinsifier::Integer_negate(Assembler* assembler) {
   Label fall_through;
-  __ movq(RAX, Address(RSP, + 1 * kWordSize));
+  __ movq(RAX, Address(RSP, +1 * kWordSize));
   __ testq(RAX, Immediate(kSmiTagMask));
   __ j(NOT_ZERO, &fall_through, Assembler::kNearJump);  // Non-smi value.
   __ negq(RAX);
@@ -515,7 +515,7 @@
   Label fall_through;
   TestBothArgumentsSmis(assembler, &fall_through);
   // RAX is the right argument.
-  __ andq(RAX, Address(RSP, + 2 * kWordSize));
+  __ andq(RAX, Address(RSP, +2 * kWordSize));
   // Result is in RAX.
   __ ret();
   __ Bind(&fall_through);
@@ -531,7 +531,7 @@
   Label fall_through;
   TestBothArgumentsSmis(assembler, &fall_through);
   // RAX is the right argument.
-  __ orq(RAX, Address(RSP, + 2 * kWordSize));
+  __ orq(RAX, Address(RSP, +2 * kWordSize));
   // Result is in RAX.
   __ ret();
   __ Bind(&fall_through);
@@ -547,7 +547,7 @@
   Label fall_through;
   TestBothArgumentsSmis(assembler, &fall_through);
   // RAX is the right argument.
-  __ xorq(RAX, Address(RSP, + 2 * kWordSize));
+  __ xorq(RAX, Address(RSP, +2 * kWordSize));
   // Result is in RAX.
   __ ret();
   __ Bind(&fall_through);
@@ -569,8 +569,8 @@
   __ j(ABOVE_EQUAL, &fall_through, Assembler::kNearJump);
 
   __ SmiUntag(RAX);
-  __ movq(RCX, RAX);  // Shift amount must be in RCX.
-  __ movq(RAX, Address(RSP, + 2 * kWordSize));  // Value.
+  __ movq(RCX, RAX);                           // Shift amount must be in RCX.
+  __ movq(RAX, Address(RSP, +2 * kWordSize));  // Value.
 
   // Overflow test - all the shifted-out bits must be same as the sign bit.
   __ movq(RDI, RAX);
@@ -595,7 +595,7 @@
   Label fall_through, true_label;
   TestBothArgumentsSmis(assembler, &fall_through);
   // RAX contains the right argument.
-  __ cmpq(Address(RSP, + 2 * kWordSize), RAX);
+  __ cmpq(Address(RSP, +2 * kWordSize), RAX);
   __ j(true_condition, &true_label, Assembler::kNearJump);
   __ LoadObject(RAX, Bool::False());
   __ ret();
@@ -639,8 +639,8 @@
   const intptr_t kArgumentOffset = 1;
 
   // For integer receiver '===' check first.
-  __ movq(RAX, Address(RSP, + kArgumentOffset * kWordSize));
-  __ movq(RCX, Address(RSP, + kReceiverOffset * kWordSize));
+  __ movq(RAX, Address(RSP, +kArgumentOffset * kWordSize));
+  __ movq(RCX, Address(RSP, +kReceiverOffset * kWordSize));
   __ cmpq(RAX, RCX);
   __ j(EQUAL, &true_label, Assembler::kNearJump);
   __ orq(RAX, RCX);
@@ -656,14 +656,14 @@
   // At least one of the arguments was not Smi.
   Label receiver_not_smi;
   __ Bind(&check_for_mint);
-  __ movq(RAX, Address(RSP, + kReceiverOffset * kWordSize));
+  __ movq(RAX, Address(RSP, +kReceiverOffset * kWordSize));
   __ testq(RAX, Immediate(kSmiTagMask));
   __ j(NOT_ZERO, &receiver_not_smi);
 
   // Left (receiver) is Smi, return false if right is not Double.
   // Note that an instance of Mint or Bigint never contains a value that can be
   // represented by Smi.
-  __ movq(RAX, Address(RSP, + kArgumentOffset * kWordSize));
+  __ movq(RAX, Address(RSP, +kArgumentOffset * kWordSize));
   __ CompareClassId(RAX, kDoubleCid);
   __ j(EQUAL, &fall_through);
   __ LoadObject(RAX, Bool::False());
@@ -674,7 +674,7 @@
   __ CompareClassId(RAX, kMintCid);
   __ j(NOT_EQUAL, &fall_through);
   // Receiver is Mint, return false if right is Smi.
-  __ movq(RAX, Address(RSP, + kArgumentOffset * kWordSize));
+  __ movq(RAX, Address(RSP, +kArgumentOffset * kWordSize));
   __ testq(RAX, Immediate(kSmiTagMask));
   __ j(NOT_ZERO, &fall_through);
   // Smi == Mint -> false.
@@ -706,9 +706,9 @@
   __ j(LESS_EQUAL, &shift_count_ok, Assembler::kNearJump);
   __ movq(RAX, count_limit);
   __ Bind(&shift_count_ok);
-  __ movq(RCX, RAX);  // Shift amount must be in RCX.
-  __ movq(RAX, Address(RSP, + 2 * kWordSize));  // Value.
-  __ SmiUntag(RAX);  // Value.
+  __ movq(RCX, RAX);                           // Shift amount must be in RCX.
+  __ movq(RAX, Address(RSP, +2 * kWordSize));  // Value.
+  __ SmiUntag(RAX);                            // Value.
   __ sarq(RAX, RCX);
   __ SmiTag(RAX);
   __ ret();
@@ -718,7 +718,7 @@
 
 // Argument is Smi (receiver).
 void Intrinsifier::Smi_bitNegate(Assembler* assembler) {
-  __ movq(RAX, Address(RSP, + 1 * kWordSize));  // Index.
+  __ movq(RAX, Address(RSP, +1 * kWordSize));  // Index.
   __ notq(RAX);
   __ andq(RAX, Immediate(~kSmiTagMask));  // Remove inverted smi-tag.
   __ ret();
@@ -727,7 +727,7 @@
 
 void Intrinsifier::Smi_bitLength(Assembler* assembler) {
   ASSERT(kSmiTagShift == 1);
-  __ movq(RAX, Address(RSP, + 1 * kWordSize));  // Index.
+  __ movq(RAX, Address(RSP, +1 * kWordSize));  // Index.
   // XOR with sign bit to complement bits if value is negative.
   __ movq(RCX, RAX);
   __ sarq(RCX, Immediate(63));  // All 0 or all 1.
@@ -751,7 +751,7 @@
   //                  Uint32List r_digits)
 
   __ movq(RDI, Address(RSP, 4 * kWordSize));  // x_digits
-  __ movq(R8, Address(RSP, 3 * kWordSize));  // x_used is Smi
+  __ movq(R8, Address(RSP, 3 * kWordSize));   // x_used is Smi
   __ subq(R8, Immediate(2));  // x_used > 0, Smi. R8 = x_used - 1, round up.
   __ sarq(R8, Immediate(2));  // R8 + 1 = number of digit pairs to read.
   __ movq(RCX, Address(RSP, 2 * kWordSize));  // n is Smi
@@ -770,9 +770,8 @@
   Label loop;
   __ Bind(&loop);
   __ movq(RAX, RDX);
-  __ movq(RDX,
-          FieldAddress(RDI, R8, TIMES_8,
-                       TypedData::data_offset() - 2 * Bigint::kBytesPerDigit));
+  __ movq(RDX, FieldAddress(RDI, R8, TIMES_8, TypedData::data_offset() -
+                                                  2 * Bigint::kBytesPerDigit));
   __ shldq(RAX, RDX, RCX);
   __ movq(Address(RBX, R8, TIMES_8, 0), RAX);
   __ decq(R8);
@@ -794,7 +793,7 @@
   __ SmiUntag(RCX);
   __ movq(RBX, Address(RSP, 1 * kWordSize));  // r_digits
   __ movq(RDX, RCX);
-  __ sarq(RDX, Immediate(6));  // RDX = n ~/ (2*_DIGIT_BITS).
+  __ sarq(RDX, Immediate(6));                 // RDX = n ~/ (2*_DIGIT_BITS).
   __ movq(RSI, Address(RSP, 3 * kWordSize));  // x_used is Smi
   __ subq(RSI, Immediate(2));  // x_used > 0, Smi. RSI = x_used - 1, round up.
   __ sarq(RSI, Immediate(2));
@@ -828,7 +827,7 @@
   //                     Uint32List r_digits)
 
   __ movq(RDI, Address(RSP, 5 * kWordSize));  // digits
-  __ movq(R8, Address(RSP, 4 * kWordSize));  // used is Smi
+  __ movq(R8, Address(RSP, 4 * kWordSize));   // used is Smi
   __ addq(R8, Immediate(2));  // used > 0, Smi. R8 = used + 1, round up.
   __ sarq(R8, Immediate(2));  // R8 = number of digit pairs to process.
   __ movq(RSI, Address(RSP, 3 * kWordSize));  // a_digits
@@ -853,7 +852,7 @@
   __ j(NOT_ZERO, &add_loop, Assembler::kNearJump);
 
   Label last_carry;
-  __ decq(R8);  // Does not affect carry flag.
+  __ decq(R8);                                    // Does not affect carry flag.
   __ j(ZERO, &last_carry, Assembler::kNearJump);  // If used - a_used == 0.
 
   Label carry_loop;
@@ -863,7 +862,7 @@
   __ adcq(RAX, Immediate(0));
   __ movq(FieldAddress(RBX, RDX, TIMES_8, TypedData::data_offset()), RAX);
   __ incq(RDX);  // Does not affect carry flag.
-  __ decq(R8);  // Does not affect carry flag.
+  __ decq(R8);   // Does not affect carry flag.
   __ j(NOT_ZERO, &carry_loop, Assembler::kNearJump);
 
   __ Bind(&last_carry);
@@ -884,7 +883,7 @@
   //                     Uint32List r_digits)
 
   __ movq(RDI, Address(RSP, 5 * kWordSize));  // digits
-  __ movq(R8, Address(RSP, 4 * kWordSize));  // used is Smi
+  __ movq(R8, Address(RSP, 4 * kWordSize));   // used is Smi
   __ addq(R8, Immediate(2));  // used > 0, Smi. R8 = used + 1, round up.
   __ sarq(R8, Immediate(2));  // R8 = number of digit pairs to process.
   __ movq(RSI, Address(RSP, 3 * kWordSize));  // a_digits
@@ -909,7 +908,7 @@
   __ j(NOT_ZERO, &sub_loop, Assembler::kNearJump);
 
   Label done;
-  __ decq(R8);  // Does not affect carry flag.
+  __ decq(R8);                              // Does not affect carry flag.
   __ j(ZERO, &done, Assembler::kNearJump);  // If used - a_used == 0.
 
   Label carry_loop;
@@ -919,7 +918,7 @@
   __ sbbq(RAX, Immediate(0));
   __ movq(FieldAddress(RBX, RDX, TIMES_8, TypedData::data_offset()), RAX);
   __ incq(RDX);  // Does not affect carry flag.
-  __ decq(R8);  // Does not affect carry flag.
+  __ decq(R8);   // Does not affect carry flag.
   __ j(NOT_ZERO, &carry_loop, Assembler::kNearJump);
 
   __ Bind(&done);
@@ -995,10 +994,10 @@
 
   // uint64_t mi = *mip++
   __ movq(RAX, Address(RDI, 0));
-  __ addq(RDI, Immediate(2*Bigint::kBytesPerDigit));
+  __ addq(RDI, Immediate(2 * Bigint::kBytesPerDigit));
 
   // uint128_t t = x*mi
-  __ mulq(RBX);  // t = RDX:RAX = RAX * RBX, 64-bit * 64-bit -> 64-bit
+  __ mulq(RBX);       // t = RDX:RAX = RAX * RBX, 64-bit * 64-bit -> 64-bit
   __ addq(RAX, RCX);  // t += c
   __ adcq(RDX, Immediate(0));
 
@@ -1008,7 +1007,7 @@
 
   // *ajp++ = low64(t)
   __ movq(Address(RSI, 0), RAX);
-  __ addq(RSI, Immediate(2*Bigint::kBytesPerDigit));
+  __ addq(RSI, Immediate(2 * Bigint::kBytesPerDigit));
 
   // c = high64(t)
   __ movq(RCX, RDX);
@@ -1026,7 +1025,7 @@
 
   Label propagate_carry_loop;
   __ Bind(&propagate_carry_loop);
-  __ addq(RSI, Immediate(2*Bigint::kBytesPerDigit));
+  __ addq(RSI, Immediate(2 * Bigint::kBytesPerDigit));
   __ incq(Address(RSI, 0));  // c == 0 or 1
   __ j(CARRY, &propagate_carry_loop, Assembler::kNearJump);
 
@@ -1073,7 +1072,7 @@
   __ movq(RBX, Address(RDI, 0));
   __ cmpq(RBX, Immediate(0));
   __ j(EQUAL, &x_zero);
-  __ addq(RDI, Immediate(2*Bigint::kBytesPerDigit));
+  __ addq(RDI, Immediate(2 * Bigint::kBytesPerDigit));
 
   // RSI = ajp = &a_digits[i]
   __ movq(RSI, Address(RSP, 2 * kWordSize));  // a_digits
@@ -1087,7 +1086,7 @@
 
   // *ajp++ = low64(t)
   __ movq(Address(RSI, 0), RAX);
-  __ addq(RSI, Immediate(2*Bigint::kBytesPerDigit));
+  __ addq(RSI, Immediate(2 * Bigint::kBytesPerDigit));
 
   // int n = (used - i + 1)/2 - 1
   __ movq(R8, Address(RSP, 1 * kWordSize));  // used is Smi
@@ -1115,14 +1114,14 @@
 
   // uint64_t xi = *xip++
   __ movq(RAX, Address(RDI, 0));
-  __ addq(RDI, Immediate(2*Bigint::kBytesPerDigit));
+  __ addq(RDI, Immediate(2 * Bigint::kBytesPerDigit));
 
   // uint192_t t = RCX:RDX:RAX = 2*x*xi + aj + c
-  __ mulq(RBX);  // RDX:RAX = RAX * RBX
+  __ mulq(RBX);       // RDX:RAX = RAX * RBX
   __ xorq(RCX, RCX);  // RCX = 0
   __ shldq(RCX, RDX, Immediate(1));
   __ shldq(RDX, RAX, Immediate(1));
-  __ shlq(RAX, Immediate(1));  // RCX:RDX:RAX <<= 1
+  __ shlq(RAX, Immediate(1));     // RCX:RDX:RAX <<= 1
   __ addq(RAX, Address(RSI, 0));  // t += aj
   __ adcq(RDX, Immediate(0));
   __ adcq(RCX, Immediate(0));
@@ -1132,7 +1131,7 @@
 
   // *ajp++ = low64(t)
   __ movq(Address(RSI, 0), RAX);
-  __ addq(RSI, Immediate(2*Bigint::kBytesPerDigit));
+  __ addq(RSI, Immediate(2 * Bigint::kBytesPerDigit));
 
   // c = high128(t)
   __ movq(R12, RDX);
@@ -1148,7 +1147,7 @@
   // *ajp++ = low64(t)
   // *ajp = high64(t)
   __ movq(Address(RSI, 0), R12);
-  __ movq(Address(RSI, 2*Bigint::kBytesPerDigit), R13);
+  __ movq(Address(RSI, 2 * Bigint::kBytesPerDigit), R13);
 
   __ Bind(&x_zero);
   __ movq(RAX, Immediate(Smi::RawValue(2)));  // Two digits processed.
@@ -1197,16 +1196,16 @@
   __ j(EQUAL, &return_qd, Assembler::kNearJump);
 
   // RAX = dl = dp[-1]
-  __ movq(RAX, Address(RBX, -2*Bigint::kBytesPerDigit));
+  __ movq(RAX, Address(RBX, -2 * Bigint::kBytesPerDigit));
 
   // RAX = qd = dh:dl / yt = RDX:RAX / RCX
   __ divq(RCX);
 
   __ Bind(&return_qd);
   // args[2..3] = qd
-  __ movq(FieldAddress(RDI,
-                       TypedData::data_offset() + 2*Bigint::kBytesPerDigit),
-          RAX);
+  __ movq(
+      FieldAddress(RDI, TypedData::data_offset() + 2 * Bigint::kBytesPerDigit),
+      RAX);
 
   __ movq(RAX, Immediate(Smi::RawValue(2)));  // Two digits processed.
   __ ret();
@@ -1227,9 +1226,8 @@
   __ movq(RDI, Address(RSP, 3 * kWordSize));  // args
 
   // RCX = rho = args[2 .. 3]
-  __ movq(RCX,
-          FieldAddress(RDI,
-                       TypedData::data_offset() + 2*Bigint::kBytesPerDigit));
+  __ movq(RCX, FieldAddress(
+                   RDI, TypedData::data_offset() + 2 * Bigint::kBytesPerDigit));
 
   // RAX = digits[i >> 1 .. (i >> 1) + 1]
   __ movq(RBX, Address(RSP, 2 * kWordSize));  // digits
@@ -1240,9 +1238,9 @@
   __ mulq(RCX);
 
   // args[4 .. 5] = t mod DIGIT_BASE^2 = low64(t)
-  __ movq(FieldAddress(RDI,
-                       TypedData::data_offset() + 4*Bigint::kBytesPerDigit),
-          RAX);
+  __ movq(
+      FieldAddress(RDI, TypedData::data_offset() + 4 * Bigint::kBytesPerDigit),
+      RAX);
 
   __ movq(RAX, Immediate(Smi::RawValue(2)));  // Two digits processed.
   __ ret();
@@ -1255,7 +1253,7 @@
 static void TestLastArgumentIsDouble(Assembler* assembler,
                                      Label* is_smi,
                                      Label* not_double_smi) {
-  __ movq(RAX, Address(RSP, + 1 * kWordSize));
+  __ movq(RAX, Address(RSP, +1 * kWordSize));
   __ testq(RAX, Immediate(kSmiTagMask));
   __ j(ZERO, is_smi);  // Jump if Smi.
   __ CompareClassId(RAX, kDoubleCid);
@@ -1274,7 +1272,7 @@
   // Both arguments are double, right operand is in RAX.
   __ movsd(XMM1, FieldAddress(RAX, Double::value_offset()));
   __ Bind(&double_op);
-  __ movq(RAX, Address(RSP, + 2 * kWordSize));  // Left argument.
+  __ movq(RAX, Address(RSP, +2 * kWordSize));  // Left argument.
   __ movsd(XMM0, FieldAddress(RAX, Double::value_offset()));
   __ comisd(XMM0, XMM1);
   __ j(PARITY_EVEN, &is_false, Assembler::kNearJump);  // NaN -> false;
@@ -1327,20 +1325,27 @@
   // Both arguments are double, right operand is in RAX.
   __ movsd(XMM1, FieldAddress(RAX, Double::value_offset()));
   __ Bind(&double_op);
-  __ movq(RAX, Address(RSP, + 2 * kWordSize));  // Left argument.
+  __ movq(RAX, Address(RSP, +2 * kWordSize));  // Left argument.
   __ movsd(XMM0, FieldAddress(RAX, Double::value_offset()));
   switch (kind) {
-    case Token::kADD: __ addsd(XMM0, XMM1); break;
-    case Token::kSUB: __ subsd(XMM0, XMM1); break;
-    case Token::kMUL: __ mulsd(XMM0, XMM1); break;
-    case Token::kDIV: __ divsd(XMM0, XMM1); break;
-    default: UNREACHABLE();
+    case Token::kADD:
+      __ addsd(XMM0, XMM1);
+      break;
+    case Token::kSUB:
+      __ subsd(XMM0, XMM1);
+      break;
+    case Token::kMUL:
+      __ mulsd(XMM0, XMM1);
+      break;
+    case Token::kDIV:
+      __ divsd(XMM0, XMM1);
+      break;
+    default:
+      UNREACHABLE();
   }
-  const Class& double_class = Class::Handle(
-      Isolate::Current()->object_store()->double_class());
-  __ TryAllocate(double_class,
-                 &fall_through,
-                 Assembler::kFarJump,
+  const Class& double_class =
+      Class::Handle(Isolate::Current()->object_store()->double_class());
+  __ TryAllocate(double_class, &fall_through, Assembler::kFarJump,
                  RAX,  // Result register.
                  R13);
   __ movsd(FieldAddress(RAX, Double::value_offset()), XMM0);
@@ -1376,20 +1381,18 @@
 void Intrinsifier::Double_mulFromInteger(Assembler* assembler) {
   Label fall_through;
   // Only smis allowed.
-  __ movq(RAX, Address(RSP, + 1 * kWordSize));
+  __ movq(RAX, Address(RSP, +1 * kWordSize));
   __ testq(RAX, Immediate(kSmiTagMask));
   __ j(NOT_ZERO, &fall_through);
   // Is Smi.
   __ SmiUntag(RAX);
   __ cvtsi2sdq(XMM1, RAX);
-  __ movq(RAX, Address(RSP, + 2 * kWordSize));
+  __ movq(RAX, Address(RSP, +2 * kWordSize));
   __ movsd(XMM0, FieldAddress(RAX, Double::value_offset()));
   __ mulsd(XMM0, XMM1);
-  const Class& double_class = Class::Handle(
-      Isolate::Current()->object_store()->double_class());
-  __ TryAllocate(double_class,
-                 &fall_through,
-                 Assembler::kFarJump,
+  const Class& double_class =
+      Class::Handle(Isolate::Current()->object_store()->double_class());
+  __ TryAllocate(double_class, &fall_through, Assembler::kFarJump,
                  RAX,  // Result register.
                  R13);
   __ movsd(FieldAddress(RAX, Double::value_offset()), XMM0);
@@ -1407,11 +1410,9 @@
   // Is Smi.
   __ SmiUntag(RAX);
   __ cvtsi2sdq(XMM0, RAX);
-  const Class& double_class = Class::Handle(
-      Isolate::Current()->object_store()->double_class());
-  __ TryAllocate(double_class,
-                 &fall_through,
-                 Assembler::kFarJump,
+  const Class& double_class =
+      Class::Handle(Isolate::Current()->object_store()->double_class());
+  __ TryAllocate(double_class, &fall_through, Assembler::kFarJump,
                  RAX,  // Result register.
                  R13);
   __ movsd(FieldAddress(RAX, Double::value_offset()), XMM0);
@@ -1501,11 +1502,9 @@
   __ movsd(XMM1, FieldAddress(RAX, Double::value_offset()));
   __ Bind(&double_op);
   __ sqrtsd(XMM0, XMM1);
-  const Class& double_class = Class::Handle(
-      Isolate::Current()->object_store()->double_class());
-  __ TryAllocate(double_class,
-                 &fall_through,
-                 Assembler::kFarJump,
+  const Class& double_class =
+      Class::Handle(Isolate::Current()->object_store()->double_class());
+  __ TryAllocate(double_class, &fall_through, Assembler::kFarJump,
                  RAX,  // Result register.
                  R13);
   __ movsd(FieldAddress(RAX, Double::value_offset()), XMM0);
@@ -1524,8 +1523,8 @@
 void Intrinsifier::Random_nextState(Assembler* assembler) {
   const Library& math_lib = Library::Handle(Library::MathLibrary());
   ASSERT(!math_lib.IsNull());
-  const Class& random_class = Class::Handle(
-      math_lib.LookupClassAllowPrivate(Symbols::_Random()));
+  const Class& random_class =
+      Class::Handle(math_lib.LookupClassAllowPrivate(Symbols::_Random()));
   ASSERT(!random_class.IsNull());
   const Field& state_field = Field::ZoneHandle(
       random_class.LookupInstanceFieldAllowPrivate(Symbols::_state()));
@@ -1537,7 +1536,7 @@
   const Instance& a_value = Instance::Handle(random_A_field.StaticValue());
   const int64_t a_int_value = Integer::Cast(a_value).AsInt64Value();
   // Receiver.
-  __ movq(RAX, Address(RSP, + 1 * kWordSize));
+  __ movq(RAX, Address(RSP, +1 * kWordSize));
   // Field '_state'.
   __ movq(RBX, FieldAddress(RAX, state_field.Offset()));
   // Addresses of _state[0] and _state[1].
@@ -1562,8 +1561,8 @@
   const intptr_t kReceiverOffset = 2;
   const intptr_t kArgumentOffset = 1;
 
-  __ movq(RAX, Address(RSP, + kArgumentOffset * kWordSize));
-  __ cmpq(RAX, Address(RSP, + kReceiverOffset * kWordSize));
+  __ movq(RAX, Address(RSP, +kArgumentOffset * kWordSize));
+  __ cmpq(RAX, Address(RSP, +kReceiverOffset * kWordSize));
   __ j(EQUAL, &is_true, Assembler::kNearJump);
   __ LoadObject(RAX, Bool::False());
   __ ret();
@@ -1589,9 +1588,7 @@
 const Condition kIfInRange = BELOW_EQUAL;
 
 
-static void JumpIfInteger(Assembler* assembler,
-                          Register cid,
-                          Label* target) {
+static void JumpIfInteger(Assembler* assembler, Register cid, Label* target) {
   RangeCheck(assembler, cid, kSmiCid, kBigintCid, kIfInRange, target);
 }
 
@@ -1603,34 +1600,22 @@
 }
 
 
-static void JumpIfString(Assembler* assembler,
-                          Register cid,
-                          Label* target) {
-  RangeCheck(assembler,
-             cid,
-             kOneByteStringCid,
-             kExternalTwoByteStringCid,
-             kIfInRange,
-             target);
+static void JumpIfString(Assembler* assembler, Register cid, Label* target) {
+  RangeCheck(assembler, cid, kOneByteStringCid, kExternalTwoByteStringCid,
+             kIfInRange, target);
 }
 
 
-static void JumpIfNotString(Assembler* assembler,
-                            Register cid,
-                            Label* target) {
-  RangeCheck(assembler,
-             cid,
-             kOneByteStringCid,
-             kExternalTwoByteStringCid,
-             kIfNotInRange,
-             target);
+static void JumpIfNotString(Assembler* assembler, Register cid, Label* target) {
+  RangeCheck(assembler, cid, kOneByteStringCid, kExternalTwoByteStringCid,
+             kIfNotInRange, target);
 }
 
 
 // Return type quickly for simple types (not parameterized and not signature).
 void Intrinsifier::ObjectRuntimeType(Assembler* assembler) {
   Label fall_through, use_canonical_type, not_integer, not_double;
-  __ movq(RAX, Address(RSP, + 1 * kWordSize));
+  __ movq(RAX, Address(RSP, +1 * kWordSize));
   __ LoadClassIdMayBeSmi(RCX, RAX);
 
   // RCX: untagged cid of instance (RAX).
@@ -1688,14 +1673,14 @@
 void Intrinsifier::ObjectHaveSameRuntimeType(Assembler* assembler) {
   Label fall_through, different_cids, equal, not_equal, not_integer;
 
-  __ movq(RAX, Address(RSP, + 1 * kWordSize));
+  __ movq(RAX, Address(RSP, +1 * kWordSize));
   __ LoadClassIdMayBeSmi(RCX, RAX);
 
   // Check if left hand size is a closure. Closures are handled in the runtime.
   __ cmpq(RCX, Immediate(kClosureCid));
   __ j(EQUAL, &fall_through);
 
-  __ movq(RAX, Address(RSP, + 2 * kWordSize));
+  __ movq(RAX, Address(RSP, +2 * kWordSize));
   __ LoadClassIdMayBeSmi(RDX, RAX);
 
   // Check whether class ids match. If class ids don't match objects can still
@@ -1751,7 +1736,7 @@
 
 void Intrinsifier::String_getHashCode(Assembler* assembler) {
   Label fall_through;
-  __ movq(RAX, Address(RSP, + 1 * kWordSize));  // String object.
+  __ movq(RAX, Address(RSP, +1 * kWordSize));  // String object.
   __ movq(RAX, FieldAddress(RAX, String::hash_offset()));
   __ cmpq(RAX, Immediate(0));
   __ j(EQUAL, &fall_through, Assembler::kNearJump);
@@ -1783,8 +1768,8 @@
   __ cmpq(R11, R8);
   __ j(GREATER, return_false);
 
-  __ SmiUntag(RBX);  // start
-  __ SmiUntag(R9);   // other.length
+  __ SmiUntag(RBX);            // start
+  __ SmiUntag(R9);             // other.length
   __ movq(R11, Immediate(0));  // i = 0
 
   // do
@@ -1829,9 +1814,9 @@
 // OneByteString other.
 void Intrinsifier::StringBaseSubstringMatches(Assembler* assembler) {
   Label fall_through, return_true, return_false, try_two_byte;
-  __ movq(RAX, Address(RSP, + 3 * kWordSize));  // receiver
-  __ movq(RBX, Address(RSP, + 2 * kWordSize));  // start
-  __ movq(RCX, Address(RSP, + 1 * kWordSize));  // other
+  __ movq(RAX, Address(RSP, +3 * kWordSize));  // receiver
+  __ movq(RBX, Address(RSP, +2 * kWordSize));  // start
+  __ movq(RCX, Address(RSP, +1 * kWordSize));  // other
 
   __ testq(RBX, Immediate(kSmiTagMask));
   __ j(NOT_ZERO, &fall_through);  // 'start' is not Smi.
@@ -1842,20 +1827,16 @@
   __ CompareClassId(RAX, kOneByteStringCid);
   __ j(NOT_EQUAL, &try_two_byte);
 
-  GenerateSubstringMatchesSpecialization(assembler,
-                                         kOneByteStringCid,
-                                         kOneByteStringCid,
-                                         &return_true,
+  GenerateSubstringMatchesSpecialization(assembler, kOneByteStringCid,
+                                         kOneByteStringCid, &return_true,
                                          &return_false);
 
   __ Bind(&try_two_byte);
   __ CompareClassId(RAX, kTwoByteStringCid);
   __ j(NOT_EQUAL, &fall_through);
 
-  GenerateSubstringMatchesSpecialization(assembler,
-                                         kTwoByteStringCid,
-                                         kOneByteStringCid,
-                                         &return_true,
+  GenerateSubstringMatchesSpecialization(assembler, kTwoByteStringCid,
+                                         kOneByteStringCid, &return_true,
                                          &return_false);
 
   __ Bind(&return_true);
@@ -1872,8 +1853,8 @@
 
 void Intrinsifier::StringBaseCharAt(Assembler* assembler) {
   Label fall_through, try_two_byte_string;
-  __ movq(RCX, Address(RSP, + 1 * kWordSize));  // Index.
-  __ movq(RAX, Address(RSP, + 2 * kWordSize));  // String.
+  __ movq(RCX, Address(RSP, +1 * kWordSize));  // Index.
+  __ movq(RAX, Address(RSP, +2 * kWordSize));  // String.
   __ testq(RCX, Immediate(kSmiTagMask));
   __ j(NOT_ZERO, &fall_through);  // Non-smi index.
   // Range check.
@@ -1887,9 +1868,7 @@
   __ cmpq(RCX, Immediate(Symbols::kNumberOfOneCharCodeSymbols));
   __ j(GREATER_EQUAL, &fall_through);
   __ movq(RAX, Address(THR, Thread::predefined_symbols_address_offset()));
-  __ movq(RAX, Address(RAX,
-                       RCX,
-                       TIMES_8,
+  __ movq(RAX, Address(RAX, RCX, TIMES_8,
                        Symbols::kNullCharCodeSymbolOffset * kWordSize));
   __ ret();
 
@@ -1901,9 +1880,7 @@
   __ cmpq(RCX, Immediate(Symbols::kNumberOfOneCharCodeSymbols));
   __ j(GREATER_EQUAL, &fall_through);
   __ movq(RAX, Address(THR, Thread::predefined_symbols_address_offset()));
-  __ movq(RAX, Address(RAX,
-                       RCX,
-                       TIMES_8,
+  __ movq(RAX, Address(RAX, RCX, TIMES_8,
                        Symbols::kNullCharCodeSymbolOffset * kWordSize));
   __ ret();
 
@@ -1914,7 +1891,7 @@
 void Intrinsifier::StringBaseIsEmpty(Assembler* assembler) {
   Label is_true;
   // Get length.
-  __ movq(RAX, Address(RSP, + 1 * kWordSize));  // String object.
+  __ movq(RAX, Address(RSP, +1 * kWordSize));  // String object.
   __ movq(RAX, FieldAddress(RAX, String::length_offset()));
   __ cmpq(RAX, Immediate(Smi::RawValue(0)));
   __ j(EQUAL, &is_true, Assembler::kNearJump);
@@ -1928,7 +1905,7 @@
 
 void Intrinsifier::OneByteString_getHashCode(Assembler* assembler) {
   Label compute_hash;
-  __ movq(RBX, Address(RSP, + 1 * kWordSize));  // OneByteString object.
+  __ movq(RBX, Address(RSP, +1 * kWordSize));  // OneByteString object.
   __ movq(RAX, FieldAddress(RBX, String::hash_offset()));
   __ cmpq(RAX, Immediate(0));
   __ j(EQUAL, &compute_hash, Assembler::kNearJump);
@@ -1982,7 +1959,7 @@
   __ addl(RAX, RDX);
   // hash_ = hash_ & ((static_cast<intptr_t>(1) << bits) - 1);
   __ andl(RAX,
-      Immediate(((static_cast<intptr_t>(1) << String::kHashBits) - 1)));
+          Immediate(((static_cast<intptr_t>(1) << String::kHashBits) - 1)));
 
   // return hash_ == 0 ? 1 : hash_;
   __ cmpq(RAX, Immediate(0));
@@ -2021,7 +1998,7 @@
   // RDI: allocation size.
   __ movq(RCX, RAX);
   __ addq(RCX, RDI);
-  __ j(CARRY,  &pop_and_fail);
+  __ j(CARRY, &pop_and_fail);
 
   // Check if the allocation fits into the remaining space.
   // RAX: potential new object start.
@@ -2058,8 +2035,7 @@
 
   // Set the length field.
   __ popq(RDI);
-  __ StoreIntoObjectNoBarrier(RAX,
-                              FieldAddress(RAX, String::length_offset()),
+  __ StoreIntoObjectNoBarrier(RAX, FieldAddress(RAX, String::length_offset()),
                               RDI);
   // Clear hash.
   __ ZeroInitSmiField(FieldAddress(RAX, String::hash_offset()));
@@ -2080,24 +2056,24 @@
   const intptr_t kStartIndexOffset = 2 * kWordSize;
   const intptr_t kEndIndexOffset = 1 * kWordSize;
   Label fall_through, ok;
-  __ movq(RSI, Address(RSP, + kStartIndexOffset));
-  __ movq(RDI, Address(RSP, + kEndIndexOffset));
+  __ movq(RSI, Address(RSP, +kStartIndexOffset));
+  __ movq(RDI, Address(RSP, +kEndIndexOffset));
   __ orq(RSI, RDI);
   __ testq(RSI, Immediate(kSmiTagMask));
   __ j(NOT_ZERO, &fall_through);  // 'start', 'end' not Smi.
 
-  __ subq(RDI, Address(RSP, + kStartIndexOffset));
+  __ subq(RDI, Address(RSP, +kStartIndexOffset));
   TryAllocateOnebyteString(assembler, &ok, &fall_through, RDI);
   __ Bind(&ok);
   // RAX: new string as tagged pointer.
   // Copy string.
-  __ movq(RSI, Address(RSP, + kStringOffset));
-  __ movq(RBX, Address(RSP, + kStartIndexOffset));
+  __ movq(RSI, Address(RSP, +kStringOffset));
+  __ movq(RBX, Address(RSP, +kStartIndexOffset));
   __ SmiUntag(RBX);
   __ leaq(RSI, FieldAddress(RSI, RBX, TIMES_1, OneByteString::data_offset()));
   // RSI: Start address to copy from (untagged).
   // RBX: Untagged start index.
-  __ movq(RCX, Address(RSP, + kEndIndexOffset));
+  __ movq(RCX, Address(RSP, +kEndIndexOffset));
   __ SmiUntag(RCX);
   __ subq(RCX, RBX);
   __ xorq(RDX, RDX);
@@ -2121,9 +2097,9 @@
 
 
 void Intrinsifier::OneByteStringSetAt(Assembler* assembler) {
-  __ movq(RCX, Address(RSP, + 1 * kWordSize));  // Value.
-  __ movq(RBX, Address(RSP, + 2 * kWordSize));  // Index.
-  __ movq(RAX, Address(RSP, + 3 * kWordSize));  // OneByteString.
+  __ movq(RCX, Address(RSP, +1 * kWordSize));  // Value.
+  __ movq(RBX, Address(RSP, +2 * kWordSize));  // Index.
+  __ movq(RAX, Address(RSP, +3 * kWordSize));  // OneByteString.
   __ SmiUntag(RBX);
   __ SmiUntag(RCX);
   __ movb(FieldAddress(RAX, RBX, TIMES_1, OneByteString::data_offset()), RCX);
@@ -2132,7 +2108,7 @@
 
 
 void Intrinsifier::OneByteString_allocate(Assembler* assembler) {
-  __ movq(RDI, Address(RSP, + 1 * kWordSize));  // Length.v=
+  __ movq(RDI, Address(RSP, +1 * kWordSize));  // Length.v=
   Label fall_through, ok;
   TryAllocateOnebyteString(assembler, &ok, &fall_through, RDI);
   // RDI: Start address to copy from (untagged).
@@ -2147,8 +2123,8 @@
 // TODO(srdjan): Add combinations (one-byte/two-byte/external strings).
 static void StringEquality(Assembler* assembler, intptr_t string_cid) {
   Label fall_through, is_true, is_false, loop;
-  __ movq(RAX, Address(RSP, + 2 * kWordSize));  // This.
-  __ movq(RCX, Address(RSP, + 1 * kWordSize));  // Other.
+  __ movq(RAX, Address(RSP, +2 * kWordSize));  // This.
+  __ movq(RCX, Address(RSP, +1 * kWordSize));  // Other.
 
   // Are identical?
   __ cmpq(RAX, RCX);
@@ -2174,14 +2150,14 @@
   __ j(LESS, &is_true, Assembler::kNearJump);
   if (string_cid == kOneByteStringCid) {
     __ movzxb(RBX,
-        FieldAddress(RAX, RDI, TIMES_1, OneByteString::data_offset()));
+              FieldAddress(RAX, RDI, TIMES_1, OneByteString::data_offset()));
     __ movzxb(RDX,
-        FieldAddress(RCX, RDI, TIMES_1, OneByteString::data_offset()));
+              FieldAddress(RCX, RDI, TIMES_1, OneByteString::data_offset()));
   } else if (string_cid == kTwoByteStringCid) {
     __ movzxw(RBX,
-        FieldAddress(RAX, RDI, TIMES_2, TwoByteString::data_offset()));
+              FieldAddress(RAX, RDI, TIMES_2, TwoByteString::data_offset()));
     __ movzxw(RDX,
-        FieldAddress(RCX, RDI, TIMES_2, TwoByteString::data_offset()));
+              FieldAddress(RCX, RDI, TIMES_2, TwoByteString::data_offset()));
   } else {
     UNIMPLEMENTED();
   }
@@ -2250,7 +2226,7 @@
   // RAX: Current user tag.
   __ movq(RAX, Address(RBX, Isolate::current_tag_offset()));
   // R10: UserTag.
-  __ movq(R10, Address(RSP, + 1 * kWordSize));
+  __ movq(R10, Address(RSP, +1 * kWordSize));
   // Set Isolate::current_tag_.
   __ movq(Address(RBX, Isolate::current_tag_offset()), R10);
   // R10: UserTag's tag.
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index bfc902e..7f25aec 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -64,7 +64,7 @@
 DECLARE_FLAG(bool, trace_reload);
 
 
-NOT_IN_PRODUCT(
+#if !defined(PRODUCT)
 static void CheckedModeHandler(bool value) {
   FLAG_enable_asserts = value;
   FLAG_enable_type_checks = value;
@@ -76,10 +76,8 @@
                     enable_checked_mode,
                     "Enable checked mode.");
 
-DEFINE_FLAG_HANDLER(CheckedModeHandler,
-                    checked,
-                    "Enable checked mode.");
-)
+DEFINE_FLAG_HANDLER(CheckedModeHandler, checked, "Enable checked mode.");
+#endif  // !defined(PRODUCT)
 
 
 // Quick access to the locally defined thread() and isolate() methods.
@@ -93,9 +91,7 @@
  public:
   explicit VerifyOriginId(Dart_Port id) : id_(id) {}
 
-  void VisitIsolate(Isolate* isolate) {
-    ASSERT(isolate->origin_id() != id_);
-  }
+  void VisitIsolate(Isolate* isolate) { ASSERT(isolate->origin_id() != id_); }
 
  private:
   Dart_Port id_;
@@ -120,8 +116,7 @@
 }
 
 // TODO(zra): Allocation of Message objects should be centralized.
-static Message* SerializeMessage(
-    Dart_Port dest_port, const Instance& obj) {
+static Message* SerializeMessage(Dart_Port dest_port, const Instance& obj) {
   if (ApiObjectConverter::CanConvert(obj.raw())) {
     return new Message(dest_port, obj.raw(), Message::kNormalPriority);
   } else {
@@ -144,29 +139,28 @@
 
 
 NoReloadScope::NoReloadScope(Isolate* isolate, Thread* thread)
-    : StackResource(thread),
-      isolate_(isolate) {
+    : StackResource(thread), isolate_(isolate) {
   ASSERT(isolate_ != NULL);
   AtomicOperations::FetchAndIncrement(&(isolate_->no_reload_scope_depth_));
-  ASSERT(
-      AtomicOperations::LoadRelaxed(&(isolate_->no_reload_scope_depth_)) >= 0);
+  ASSERT(AtomicOperations::LoadRelaxed(&(isolate_->no_reload_scope_depth_)) >=
+         0);
 }
 
 
 NoReloadScope::~NoReloadScope() {
   AtomicOperations::FetchAndDecrement(&(isolate_->no_reload_scope_depth_));
-  ASSERT(
-      AtomicOperations::LoadRelaxed(&(isolate_->no_reload_scope_depth_)) >= 0);
+  ASSERT(AtomicOperations::LoadRelaxed(&(isolate_->no_reload_scope_depth_)) >=
+         0);
 }
 
 
 void Isolate::RegisterClass(const Class& cls) {
-  NOT_IN_PRODUCT(
-    if (IsReloading()) {
-      reload_context()->RegisterClass(cls);
-      return;
-    }
-  )
+#if !defined(PRODUCT)
+  if (IsReloading()) {
+    reload_context()->RegisterClass(cls);
+    return;
+  }
+#endif  // !defined(PRODUCT)
   class_table()->Register(cls);
 }
 
@@ -196,8 +190,7 @@
   MessageWriter writer(&data, &allocator, false);
   writer.WriteMessage(msg);
 
-  PortMap::PostMessage(new Message(main_port(),
-                                   data, writer.BytesWritten(),
+  PortMap::PostMessage(new Message(main_port(), data, writer.BytesWritten(),
                                    Message::kOOBPriority));
 }
 
@@ -233,12 +226,10 @@
 
 
 IsolateMessageHandler::IsolateMessageHandler(Isolate* isolate)
-    : isolate_(isolate) {
-}
+    : isolate_(isolate) {}
 
 
-IsolateMessageHandler::~IsolateMessageHandler() {
-}
+IsolateMessageHandler::~IsolateMessageHandler() {}
 
 const char* IsolateMessageHandler::name() const {
   return isolate_->name();
@@ -293,19 +284,18 @@
       const Instance& response =
           obj4.IsNull() ? Instance::null_instance() : Instance::Cast(obj4);
       if (priority == Isolate::kImmediateAction) {
-        PortMap::PostMessage(SerializeMessage(
-            send_port.Id(), response));
+        PortMap::PostMessage(SerializeMessage(send_port.Id(), response));
       } else {
         ASSERT((priority == Isolate::kBeforeNextEventAction) ||
                (priority == Isolate::kAsEventAction));
         // Update the message so that it will be handled immediately when it
         // is picked up from the message queue the next time.
-        message.SetAt(0, Smi::Handle(zone,
-            Smi::New(Message::kDelayedIsolateLibOOBMsg)));
-        message.SetAt(3, Smi::Handle(zone,
-            Smi::New(Isolate::kImmediateAction)));
-        this->PostMessage(SerializeMessage(
-            Message::kIllegalPort, message),
+        message.SetAt(
+            0, Smi::Handle(zone, Smi::New(Message::kDelayedIsolateLibOOBMsg)));
+        message.SetAt(3,
+                      Smi::Handle(zone, Smi::New(Isolate::kImmediateAction)));
+        this->PostMessage(
+            SerializeMessage(Message::kIllegalPort, message),
             priority == Isolate::kBeforeNextEventAction /* at_head */);
       }
       break;
@@ -323,22 +313,22 @@
         if (I->VerifyTerminateCapability(obj)) {
           // We will kill the current isolate by returning an UnwindError.
           if (msg_type == Isolate::kKillMsg) {
-            const String& msg = String::Handle(String::New(
-                "isolate terminated by Isolate.kill"));
+            const String& msg = String::Handle(
+                String::New("isolate terminated by Isolate.kill"));
             const UnwindError& error =
                 UnwindError::Handle(UnwindError::New(msg));
             error.set_is_user_initiated(true);
             return error.raw();
           } else if (msg_type == Isolate::kInternalKillMsg) {
-            const String& msg = String::Handle(String::New(
-                "isolate terminated by vm"));
+            const String& msg =
+                String::Handle(String::New("isolate terminated by vm"));
             return UnwindError::New(msg);
           } else if (msg_type == Isolate::kVMRestartMsg) {
             // If this is the main isolate, this request to restart
             // will be caught and handled in the embedder.  Otherwise
             // this unwind error will cause the isolate to exit.
-            const String& msg = String::Handle(String::New(
-                "isolate terminated for vm restart"));
+            const String& msg = String::Handle(
+                String::New("isolate terminated for vm restart"));
             const UnwindError& error =
                 UnwindError::Handle(UnwindError::New(msg));
             error.set_is_vm_restart(true);
@@ -354,12 +344,12 @@
                (priority == Isolate::kAsEventAction));
         // Update the message so that it will be handled immediately when it
         // is picked up from the message queue the next time.
-        message.SetAt(0, Smi::Handle(zone,
-            Smi::New(Message::kDelayedIsolateLibOOBMsg)));
-        message.SetAt(3, Smi::Handle(zone,
-            Smi::New(Isolate::kImmediateAction)));
-        this->PostMessage(SerializeMessage(
-            Message::kIllegalPort, message),
+        message.SetAt(
+            0, Smi::Handle(zone, Smi::New(Message::kDelayedIsolateLibOOBMsg)));
+        message.SetAt(3,
+                      Smi::Handle(zone, Smi::New(Isolate::kImmediateAction)));
+        this->PostMessage(
+            SerializeMessage(Message::kIllegalPort, message),
             priority == Isolate::kBeforeNextEventAction /* at_head */);
       }
       break;
@@ -394,9 +384,9 @@
           if (!response.IsInstance() && !response.IsNull()) {
             return Error::null();
           }
-          I->AddExitListener(listener,
-                             response.IsNull() ? Instance::null_instance()
-                                               : Instance::Cast(response));
+          I->AddExitListener(listener, response.IsNull()
+                                           ? Instance::null_instance()
+                                           : Instance::Cast(response));
           break;
         }
         case Isolate::kDelExitMsg:
@@ -460,8 +450,7 @@
   Zone* zone = stack_zone.GetZone();
   HandleScope handle_scope(thread);
 #ifndef PRODUCT
-  TimelineDurationScope tds(thread,
-                            Timeline::GetIsolateStream(),
+  TimelineDurationScope tds(thread, Timeline::GetIsolateStream(),
                             "HandleMessage");
   tds.SetNumArguments(1);
   tds.CopyArgument(0, "isolateName", I->name());
@@ -571,8 +560,8 @@
       }
     }
   } else {
-    const Object& result = Object::Handle(zone,
-        DartLibraryCalls::HandleMessage(msg_handler, msg));
+    const Object& result =
+        Object::Handle(zone, DartLibraryCalls::HandleMessage(msg_handler, msg));
     if (result.IsError()) {
       status = ProcessUnhandledException(Error::Cast(result));
     } else {
@@ -624,8 +613,7 @@
     ServiceEvent pause_event(I, ServiceEvent::kPauseExit);
     Service::HandleEvent(&pause_event);
   } else if (FLAG_trace_service) {
-    OS::Print("vm-service: Dropping event of type PauseExit (%s)\n",
-              I->name());
+    OS::Print("vm-service: Dropping event of type PauseExit (%s)\n", I->name());
   }
 }
 #endif  // !PRODUCT
@@ -737,17 +725,18 @@
 }
 
 
-NOT_IN_PRODUCT(
+#if !defined(PRODUCT)
 void Isolate::FlagsCopyFrom(const Dart_IsolateFlags& api_flags) {
   type_checks_ = api_flags.enable_type_checks;
   asserts_ = api_flags.enable_asserts;
   error_on_bad_type_ = api_flags.enable_error_on_bad_type;
   error_on_bad_override_ = api_flags.enable_error_on_bad_override;
   // Leave others at defaults.
-})
+}
+#endif  // !defined(PRODUCT)
 
 
-DEBUG_ONLY(
+#if defined(DEBUG)
 // static
 void BaseIsolate::AssertCurrent(BaseIsolate* isolate) {
   ASSERT(isolate == Isolate::Current());
@@ -757,7 +746,7 @@
   ASSERT(Isolate::Current() == this);
   ASSERT(Thread::Current()->IsMutatorThread());
 }
-)
+#endif  // defined(DEBUG)
 
 #if defined(DEBUG)
 #define REUSABLE_HANDLE_SCOPE_INIT(object)                                     \
@@ -766,13 +755,12 @@
 #define REUSABLE_HANDLE_SCOPE_INIT(object)
 #endif  // defined(DEBUG)
 
-#define REUSABLE_HANDLE_INITIALIZERS(object)                                   \
-  object##_handle_(NULL),
+#define REUSABLE_HANDLE_INITIALIZERS(object) object##_handle_(NULL),
 
 // TODO(srdjan): Some Isolate monitors can be shared. Replace their usage with
 // that shared monitor.
 Isolate::Isolate(const Dart_IsolateFlags& api_flags)
-  :   store_buffer_(new StoreBuffer()),
+    : store_buffer_(new StoreBuffer()),
       heap_(NULL),
       user_tag_(0),
       current_tag_(UserTag::null()),
@@ -837,10 +825,10 @@
       spawn_count_monitor_(new Monitor()),
       spawn_count_(0),
 #define ISOLATE_METRIC_CONSTRUCTORS(type, variable, name, unit)                \
-      metric_##variable##_(),
+  metric_##variable##_(),
       ISOLATE_METRIC_LIST(ISOLATE_METRIC_CONSTRUCTORS)
 #undef ISOLATE_METRIC_CONSTRUCTORS
-      has_attempted_reload_(false),
+          has_attempted_reload_(false),
       no_reload_scope_depth_(0),
       reload_every_n_stack_overflow_checks_(FLAG_reload_every),
       reload_context_(NULL),
@@ -918,7 +906,7 @@
   Isolate* result = new Isolate(api_flags);
   ASSERT(result != NULL);
 
-  // Initialize metrics.
+// Initialize metrics.
 #define ISOLATE_METRIC_INIT(type, variable, name, unit)                        \
   result->metric_##variable##_.Init(result, name, NULL, Metric::unit);
   ISOLATE_METRIC_LIST(ISOLATE_METRIC_INIT);
@@ -967,8 +955,10 @@
   }
   if (FLAG_trace_isolates) {
     if (name_prefix == NULL || strcmp(name_prefix, "vm-isolate") != 0) {
-      OS::Print("[+] Starting isolate:\n"
-                "\tisolate:    %s\n", result->name());
+      OS::Print(
+          "[+] Starting isolate:\n"
+          "\tisolate:    %s\n",
+          result->name());
     }
   }
 
@@ -1004,7 +994,7 @@
     OS::Print("Precompiled instructions are at [0x%" Px ", 0x%" Px ")\n",
               reinterpret_cast<uword>(snapshot.instructions_start()),
               reinterpret_cast<uword>(snapshot.instructions_start()) +
-              snapshot.instructions_size());
+                  snapshot.instructions_size());
   }
 #endif
   heap_->SetupExternalPage(snapshot.instructions_start(),
@@ -1017,14 +1007,13 @@
   DataSnapshot snapshot(data_snapshot_buffer);
 #if defined(DEBUG)
   if (FLAG_trace_isolates) {
-    OS::Print("Precompiled rodata are at [0x%" Px ", 0x%" Px ")\n",
-              reinterpret_cast<uword>(snapshot.data_start()),
-              reinterpret_cast<uword>(snapshot.data_start()) +
-              snapshot.data_size());
+    OS::Print(
+        "Precompiled rodata are at [0x%" Px ", 0x%" Px ")\n",
+        reinterpret_cast<uword>(snapshot.data_start()),
+        reinterpret_cast<uword>(snapshot.data_start()) + snapshot.data_size());
   }
 #endif
-  heap_->SetupExternalPage(snapshot.data_start(),
-                           snapshot.data_size(),
+  heap_->SetupExternalPage(snapshot.data_start(), snapshot.data_size(),
                            /* is_executable = */ false);
 }
 
@@ -1081,8 +1070,8 @@
 
 
 void Isolate::DoneLoading() {
-  GrowableObjectArray& libs = GrowableObjectArray::Handle(current_zone(),
-      object_store()->libraries());
+  GrowableObjectArray& libs =
+      GrowableObjectArray::Handle(current_zone(), object_store()->libraries());
   Library& lib = Library::Handle(current_zone());
   intptr_t num_libs = libs.Length();
   for (intptr_t i = 0; i < num_libs; i++) {
@@ -1100,8 +1089,8 @@
 
 bool Isolate::CanReload() const {
 #ifndef PRODUCT
-  return !ServiceIsolate::IsServiceIsolateDescendant(this) &&
-         is_runnable() && !IsReloading() &&
+  return !ServiceIsolate::IsServiceIsolateDescendant(this) && is_runnable() &&
+         !IsReloading() &&
          (AtomicOperations::LoadRelaxed(&no_reload_scope_depth_) == 0) &&
          IsolateCreationEnabled();
 #else
@@ -1122,16 +1111,6 @@
   if (!dont_delete_reload_context) {
     DeleteReloadContext();
   }
-#if defined(DEBUG)
-  if (success) {
-    return success;
-    Thread* thread = Thread::Current();
-    Isolate* isolate = thread->isolate();
-    isolate->heap()->CollectAllGarbage();
-    VerifyCanonicalVisitor check_canonical(thread);
-    isolate->heap()->IterateObjects(&check_canonical);
-  }
-#endif  // DEBUG
   return success;
 }
 
@@ -1148,15 +1127,14 @@
 
 
 void Isolate::DoneFinalizing() {
-  NOT_IN_PRODUCT(
-    if (IsReloading()) {
-      reload_context_->FinalizeLoading();
-    }
-  )
+#if !defined(PRODUCT)
+  if (IsReloading()) {
+    reload_context_->FinalizeLoading();
+  }
+#endif  // !defined(PRODUCT)
 }
 
 
-
 bool Isolate::MakeRunnable() {
   ASSERT(Isolate::Current() == NULL);
 
@@ -1201,16 +1179,14 @@
 
 
 bool Isolate::VerifyPauseCapability(const Object& capability) const {
-  return !capability.IsNull() &&
-      capability.IsCapability() &&
-      (pause_capability() == Capability::Cast(capability).Id());
+  return !capability.IsNull() && capability.IsCapability() &&
+         (pause_capability() == Capability::Cast(capability).Id());
 }
 
 
 bool Isolate::VerifyTerminateCapability(const Object& capability) const {
-  return !capability.IsNull() &&
-      capability.IsCapability() &&
-      (terminate_capability() == Capability::Cast(capability).Id());
+  return !capability.IsNull() && capability.IsCapability() &&
+         (terminate_capability() == Capability::Cast(capability).Id());
 }
 
 
@@ -1249,7 +1225,7 @@
 
 bool Isolate::RemoveResumeCapability(const Capability& capability) {
   const GrowableObjectArray& caps = GrowableObjectArray::Handle(
-       current_zone(), object_store()->resume_capabilities());
+      current_zone(), object_store()->resume_capabilities());
   Capability& current = Capability::Handle(current_zone());
   for (intptr_t i = 0; i < caps.Length(); i++) {
     current ^= caps.At(i);
@@ -1272,7 +1248,7 @@
   static const intptr_t kMaxListeners = kSmiMax / (12 * kWordSize);
 
   const GrowableObjectArray& listeners = GrowableObjectArray::Handle(
-       current_zone(), object_store()->exit_listeners());
+      current_zone(), object_store()->exit_listeners());
   SendPort& current = SendPort::Handle(current_zone());
   intptr_t insertion_index = -1;
   for (intptr_t i = 0; i < listeners.Length(); i += 2) {
@@ -1439,7 +1415,7 @@
 
 
     if (!ClassFinalizer::ProcessPendingClasses()) {
-      // Error is in sticky error already.
+// Error is in sticky error already.
 #if defined(DEBUG)
       const Error& error = Error::Handle(thread->sticky_error());
       ASSERT(!error.IsUnwindError());
@@ -1494,8 +1470,8 @@
     args.SetAt(2, Instance::Handle(state->BuildArgs(thread)));
     args.SetAt(3, Instance::Handle(state->BuildMessage(thread)));
     args.SetAt(4, is_spawn_uri ? Bool::True() : Bool::False());
-    args.SetAt(5, ReceivePort::Handle(
-        ReceivePort::New(isolate->main_port(), true /* control port */)));
+    args.SetAt(5, ReceivePort::Handle(ReceivePort::New(
+                      isolate->main_port(), true /* control port */)));
     args.SetAt(6, capabilities);
 
     const Library& lib = Library::Handle(Library::IsolateLibrary());
@@ -1526,7 +1502,7 @@
     ASSERT(thread->isolate() == isolate);
     StackZone zone(thread);
     HandleScope handle_scope(thread);
-    // TODO(27003): Enable for precompiled.
+// TODO(27003): Enable for precompiled.
 #if defined(DEBUG) && !defined(DART_PRECOMPILED_RUNTIME)
     if (!isolate->HasAttemptedReload()) {
       // For this verification we need to stop the background compiler earlier.
@@ -1549,17 +1525,15 @@
 
 
 void Isolate::SetStickyError(RawError* sticky_error) {
-  ASSERT(((sticky_error_ == Error::null()) ||
-         (sticky_error == Error::null())) &&
-         (sticky_error != sticky_error_));
+  ASSERT(
+      ((sticky_error_ == Error::null()) || (sticky_error == Error::null())) &&
+      (sticky_error != sticky_error_));
   sticky_error_ = sticky_error;
 }
 
 
 void Isolate::Run() {
-  message_handler()->Run(Dart::thread_pool(),
-                         RunIsolate,
-                         ShutdownIsolate,
+  message_handler()->Run(Dart::thread_pool(), RunIsolate, ShutdownIsolate,
                          reinterpret_cast<uword>(this));
 }
 
@@ -1623,8 +1597,7 @@
 
 class FinalizeWeakPersistentHandlesVisitor : public HandleVisitor {
  public:
-  FinalizeWeakPersistentHandlesVisitor() : HandleVisitor(Thread::Current()) {
-  }
+  FinalizeWeakPersistentHandlesVisitor() : HandleVisitor(Thread::Current()) {}
 
   void VisitHandle(uword addr) {
     FinalizablePersistentHandle* handle =
@@ -1649,8 +1622,7 @@
   // Notify exit listeners that this isolate is shutting down.
   if (object_store() != NULL) {
     const Error& error = Error::Handle(thread->sticky_error());
-    if (error.IsNull() ||
-        !error.IsUnwindError() ||
+    if (error.IsNull() || !error.IsUnwindError() ||
         UnwindError::Cast(error).is_user_initiated()) {
       NotifyExitListeners();
     }
@@ -1674,7 +1646,7 @@
     Timeline::ReclaimCachedBlocksFromThreads();
   }
 
-  // Dump all timing data for the isolate.
+// Dump all timing data for the isolate.
 #ifndef PRODUCT
   if (FLAG_support_timeline && FLAG_timing) {
     TimelinePauseTrace tpt;
@@ -1692,8 +1664,10 @@
   if (FLAG_trace_isolates) {
     heap()->PrintSizes();
     Symbols::DumpStats();
-    OS::Print("[-] Stopping isolate:\n"
-              "\tisolate:    %s\n", name());
+    OS::Print(
+        "[-] Stopping isolate:\n"
+        "\tisolate:    %s\n",
+        name());
   }
   if (FLAG_print_metrics) {
     LogBlock lb;
@@ -1754,9 +1728,9 @@
     HandleScope handle_scope(thread);
 
     // Write compiler stats data if enabled.
-    if (FLAG_support_compiler_stats && FLAG_compiler_stats
-        && !ServiceIsolate::IsServiceIsolateDescendant(this)
-        && (this != Dart::vm_isolate())) {
+    if (FLAG_support_compiler_stats && FLAG_compiler_stats &&
+        !ServiceIsolate::IsServiceIsolateDescendant(this) &&
+        (this != Dart::vm_isolate())) {
       OS::Print("%s", aggregate_compiler_stats()->PrintToZone());
     }
   }
@@ -1775,12 +1749,12 @@
     }
   }
 
-  if (FLAG_check_reloaded && is_runnable() &&
-      (this != Dart::vm_isolate()) &&
+  if (FLAG_check_reloaded && is_runnable() && (this != Dart::vm_isolate()) &&
       !ServiceIsolate::IsServiceIsolateDescendant(this)) {
     if (!HasAttemptedReload()) {
-      FATAL("Isolate did not reload before exiting and "
-            "--check-reloaded is enabled.\n");
+      FATAL(
+          "Isolate did not reload before exiting and "
+          "--check-reloaded is enabled.\n");
     }
   }
 
@@ -1851,8 +1825,7 @@
   visitor->VisitPointer(
       reinterpret_cast<RawObject**>(&deoptimized_code_array_));
 
-  visitor->VisitPointer(
-        reinterpret_cast<RawObject**>(&sticky_error_));
+  visitor->VisitPointer(reinterpret_cast<RawObject**>(&sticky_error_));
 
   // Visit the pending service extension calls.
   visitor->VisitPointer(
@@ -1873,15 +1846,15 @@
     debugger()->VisitObjectPointers(visitor);
   }
 
-  NOT_IN_PRODUCT(
-    // Visit objects that are being used for isolate reload.
-    if (reload_context() != NULL) {
-      reload_context()->VisitObjectPointers(visitor);
-    }
-    if (ServiceIsolate::IsServiceIsolate(this)) {
-      ServiceIsolate::VisitObjectPointers(visitor);
-    }
-  )
+#if !defined(PRODUCT)
+  // Visit objects that are being used for isolate reload.
+  if (reload_context() != NULL) {
+    reload_context()->VisitObjectPointers(visitor);
+  }
+  if (ServiceIsolate::IsServiceIsolate(this)) {
+    ServiceIsolate::VisitObjectPointers(visitor);
+  }
+#endif  // !defined(PRODUCT)
 
   // Visit objects that are being used for deoptimization.
   if (deopt_context() != NULL) {
@@ -1929,9 +1902,9 @@
   // GrowableArray::Add is not atomic and may be interrupt by a profiler
   // stack walk.
   MallocGrowableArray<PendingLazyDeopt>* old_pending_deopts = pending_deopts_;
-  MallocGrowableArray<PendingLazyDeopt>* new_pending_deopts
-      = new MallocGrowableArray<PendingLazyDeopt>(
-          old_pending_deopts->length() + 1);
+  MallocGrowableArray<PendingLazyDeopt>* new_pending_deopts =
+      new MallocGrowableArray<PendingLazyDeopt>(old_pending_deopts->length() +
+                                                1);
   for (intptr_t i = 0; i < old_pending_deopts->length(); i++) {
     ASSERT((*old_pending_deopts)[i].fp() != fp);
     new_pending_deopts->Add((*old_pending_deopts)[i]);
@@ -1990,8 +1963,7 @@
                           static_cast<int64_t>(main_port()));
 
   jsobj.AddProperty("name", debugger_name());
-  jsobj.AddPropertyF("number", "%" Pd64 "",
-                     static_cast<int64_t>(main_port()));
+  jsobj.AddPropertyF("number", "%" Pd64 "", static_cast<int64_t>(main_port()));
   if (ref) {
     return;
   }
@@ -2024,8 +1996,7 @@
              ((debugger() == NULL) || (debugger()->PauseEvent() == NULL))) {
     ServiceEvent pause_event(this, ServiceEvent::kPauseExit);
     jsobj.AddProperty("pauseEvent", &pause_event);
-  } else if ((debugger() != NULL) &&
-             (debugger()->PauseEvent() != NULL) &&
+  } else if ((debugger() != NULL) && (debugger()->PauseEvent() != NULL) &&
              !resume_request_) {
     jsobj.AddProperty("pauseEvent", debugger()->PauseEvent());
   } else {
@@ -2041,8 +2012,7 @@
     jsobj.AddProperty("pauseEvent", &pause_event);
   }
 
-  const Library& lib =
-      Library::Handle(object_store()->root_library());
+  const Library& lib = Library::Handle(object_store()->root_library());
   if (!lib.IsNull()) {
     jsobj.AddProperty("rootLib", lib);
   }
@@ -2083,8 +2053,8 @@
   }
 
   Dart_ExceptionPauseInfo pause_info = (debugger() != NULL)
-      ? debugger()->GetExceptionPauseInfo()
-      : kNoPauseOnExceptions;
+                                           ? debugger()->GetExceptionPauseInfo()
+                                           : kNoPauseOnExceptions;
   jsobj.AddProperty("exceptionPauseMode",
                     ExceptionPauseInfoToServiceEnum(pause_info));
 
@@ -2157,7 +2127,7 @@
 
 
 void Isolate::set_pending_service_extension_calls(
-      const GrowableObjectArray& value) {
+    const GrowableObjectArray& value) {
   pending_service_extension_calls_ = value.raw();
 }
 
@@ -2246,27 +2216,21 @@
     arguments.SetAt(kPendingEntrySize, Bool::Get(FLAG_trace_service));
 
     if (FLAG_trace_service) {
-      OS::Print(
-          "[+%" Pd64 "ms] Isolate %s invoking _runExtension for %s\n",
-          Dart::timestamp(), name(), method_name.ToCString());
+      OS::Print("[+%" Pd64 "ms] Isolate %s invoking _runExtension for %s\n",
+                Dart::timestamp(), name(), method_name.ToCString());
     }
     result = DartEntry::InvokeFunction(run_extension, arguments);
     if (FLAG_trace_service) {
-      OS::Print(
-          "[+%" Pd64 "ms] Isolate %s : _runExtension complete for %s\n",
-          Dart::timestamp(), name(), method_name.ToCString());
+      OS::Print("[+%" Pd64 "ms] Isolate %s : _runExtension complete for %s\n",
+                Dart::timestamp(), name(), method_name.ToCString());
     }
     // Propagate the error.
     if (result.IsError()) {
       // Remaining service extension calls are dropped.
       if (!result.IsUnwindError()) {
         // Send error back over the protocol.
-        Service::PostError(method_name,
-                           parameter_keys,
-                           parameter_values,
-                           reply_port,
-                           id,
-                           Error::Cast(result));
+        Service::PostError(method_name, parameter_keys, parameter_values,
+                           reply_port, id, Error::Cast(result));
       }
       return result.raw();
     }
@@ -2296,9 +2260,8 @@
                                          const Instance& reply_port,
                                          const Instance& id) {
   if (FLAG_trace_service) {
-    OS::Print(
-        "[+%" Pd64 "ms] Isolate %s ENQUEUING request for extension %s\n",
-        Dart::timestamp(), name(), method_name.ToCString());
+    OS::Print("[+%" Pd64 "ms] Isolate %s ENQUEUING request for extension %s\n",
+              Dart::timestamp(), name(), method_name.ToCString());
   }
   GrowableObjectArray& calls =
       GrowableObjectArray::Handle(pending_service_extension_calls());
@@ -2403,8 +2366,7 @@
   Dart_EnterScope();
   MonitorLocker ml(pause_loop_monitor_);
 
-  Dart_MessageNotifyCallback saved_notify_callback =
-      message_notify_callback();
+  Dart_MessageNotifyCallback saved_notify_callback = message_notify_callback();
   set_message_notify_callback(Isolate::WakePauseEventHandler);
 
   const bool had_isolate_reload_context = reload_context() != NULL;
@@ -2427,8 +2389,7 @@
       if (FLAG_trace_reload) {
         const int64_t reload_time_micros =
             OS::GetCurrentMonotonicMicros() - start_time_micros;
-        double reload_millis =
-            MicrosecondsToMilliseconds(reload_time_micros);
+        double reload_millis = MicrosecondsToMilliseconds(reload_time_micros);
         OS::Print("Reloading has finished! (%.2f ms)\n", reload_millis);
       }
       break;
@@ -2564,10 +2525,8 @@
     ASSERT(success);
 
     // Post the message at the given port.
-    success = PortMap::PostMessage(new Message(main_port(),
-                                               buffer,
-                                               writer.BytesWritten(),
-                                               Message::kOOBPriority));
+    success = PortMap::PostMessage(new Message(
+        main_port(), buffer, writer.BytesWritten(), Message::kOOBPriority));
     ASSERT(success);
   }
 }
@@ -2805,9 +2764,7 @@
     class_name_ = NewConstChar(class_name.ToCString());
   }
   bool can_send_any_object = true;
-  SerializeObject(message,
-                  &serialized_message_,
-                  &serialized_message_len_,
+  SerializeObject(message, &serialized_message_, &serialized_message_len_,
                   can_send_any_object);
   // Inherit flags from spawning isolate.
   Isolate::Current()->FlagsCopyTo(isolate_flags());
@@ -2850,13 +2807,9 @@
       errors_are_fatal_(errors_are_fatal) {
   function_name_ = NewConstChar("main");
   bool can_send_any_object = false;
-  SerializeObject(args,
-                  &serialized_args_,
-                  &serialized_args_len_,
+  SerializeObject(args, &serialized_args_, &serialized_args_len_,
                   can_send_any_object);
-  SerializeObject(message,
-                  &serialized_message_,
-                  &serialized_message_len_,
+  SerializeObject(message, &serialized_message_, &serialized_message_len_,
                   can_send_any_object);
   // By default inherit flags from spawning isolate. These can be overridden
   // from the calling code.
@@ -2885,8 +2838,8 @@
   if (library_url() == NULL) {
     // Handle spawnUri lookup rules.
     // Check whether the root library defines a main function.
-    const Library& lib = Library::Handle(zone,
-                                         I->object_store()->root_library());
+    const Library& lib =
+        Library::Handle(zone, I->object_store()->root_library());
     Function& func = Function::Handle(zone, lib.LookupLocalFunction(func_name));
     if (func.IsNull()) {
       // Check whether main is reexported from the root library.
@@ -2896,9 +2849,10 @@
       }
     }
     if (func.IsNull()) {
-      const String& msg = String::Handle(zone, String::NewFormatted(
-          "Unable to resolve function '%s' in script '%s'.",
-          function_name(), script_url()));
+      const String& msg = String::Handle(
+          zone, String::NewFormatted(
+                    "Unable to resolve function '%s' in script '%s'.",
+                    function_name(), script_url()));
       return LanguageError::New(msg);
     }
     return func.raw();
@@ -2907,22 +2861,24 @@
   // Lookup the to be spawned function for the Isolate.spawn implementation.
   // Resolve the library.
   const String& lib_url = String::Handle(zone, String::New(library_url()));
-  const Library& lib = Library::Handle(zone,
-                                       Library::LookupLibrary(thread, lib_url));
+  const Library& lib =
+      Library::Handle(zone, Library::LookupLibrary(thread, lib_url));
   if (lib.IsNull() || lib.IsError()) {
-    const String& msg = String::Handle(zone, String::NewFormatted(
-        "Unable to find library '%s'.", library_url()));
+    const String& msg = String::Handle(
+        zone,
+        String::NewFormatted("Unable to find library '%s'.", library_url()));
     return LanguageError::New(msg);
   }
 
   // Resolve the function.
   if (class_name() == NULL) {
-    const Function& func = Function::Handle(zone,
-                                            lib.LookupLocalFunction(func_name));
+    const Function& func =
+        Function::Handle(zone, lib.LookupLocalFunction(func_name));
     if (func.IsNull()) {
-      const String& msg = String::Handle(zone, String::NewFormatted(
-          "Unable to resolve function '%s' in library '%s'.",
-          function_name(), library_url()));
+      const String& msg = String::Handle(
+          zone, String::NewFormatted(
+                    "Unable to resolve function '%s' in library '%s'.",
+                    function_name(), library_url()));
       return LanguageError::New(msg);
     }
     return func.raw();
@@ -2931,19 +2887,20 @@
   const String& cls_name = String::Handle(zone, String::New(class_name()));
   const Class& cls = Class::Handle(zone, lib.LookupLocalClass(cls_name));
   if (cls.IsNull()) {
-    const String& msg = String::Handle(zone, String::NewFormatted(
-          "Unable to resolve class '%s' in library '%s'.",
-          class_name(),
-          (library_url() != NULL ? library_url() : script_url())));
+    const String& msg = String::Handle(
+        zone, String::NewFormatted(
+                  "Unable to resolve class '%s' in library '%s'.", class_name(),
+                  (library_url() != NULL ? library_url() : script_url())));
     return LanguageError::New(msg);
   }
   const Function& func =
       Function::Handle(zone, cls.LookupStaticFunctionAllowPrivate(func_name));
   if (func.IsNull()) {
-    const String& msg = String::Handle(zone, String::NewFormatted(
-          "Unable to resolve static method '%s.%s' in library '%s'.",
-          class_name(), function_name(),
-          (library_url() != NULL ? library_url() : script_url())));
+    const String& msg = String::Handle(
+        zone, String::NewFormatted(
+                  "Unable to resolve static method '%s.%s' in library '%s'.",
+                  class_name(), function_name(),
+                  (library_url() != NULL ? library_url() : script_url())));
     return LanguageError::New(msg);
   }
   return func.raw();
@@ -2956,8 +2913,8 @@
 
 
 RawInstance* IsolateSpawnState::BuildMessage(Thread* thread) {
-  return DeserializeObject(thread,
-                           serialized_message_, serialized_message_len_);
+  return DeserializeObject(thread, serialized_message_,
+                           serialized_message_len_);
 }
 
 
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index d3fe58a..7d43c57 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -73,7 +73,7 @@
 
 class PendingLazyDeopt {
  public:
-  PendingLazyDeopt(uword fp, uword pc) : fp_(fp), pc_(pc) { }
+  PendingLazyDeopt(uword fp, uword pc) : fp_(fp), pc_(pc) {}
   uword fp() { return fp_; }
   uword pc() { return pc_; }
   void set_pc(uword pc) { pc_ = pc; }
@@ -101,6 +101,7 @@
  public:
   explicit NoOOBMessageScope(Thread* thread);
   ~NoOOBMessageScope();
+
  private:
   DISALLOW_COPY_AND_ASSIGN(NoOOBMessageScope);
 };
@@ -206,8 +207,7 @@
   }
   Dart_Port origin_id() const { return origin_id_; }
   void set_origin_id(Dart_Port id) {
-    ASSERT((id == main_port_ && origin_id_ == 0) ||
-           (origin_id_ == main_port_));
+    ASSERT((id == main_port_ && origin_id_ == 0) || (origin_id_ == main_port_));
     origin_id_ = id;
   }
   void set_pause_capability(uint64_t value) { pause_capability_ = value; }
@@ -231,12 +231,8 @@
   ApiState* api_state() const { return api_state_; }
   void set_api_state(ApiState* value) { api_state_ = value; }
 
-  void set_init_callback_data(void* value) {
-    init_callback_data_ = value;
-  }
-  void* init_callback_data() const {
-    return init_callback_data_;
-  }
+  void set_init_callback_data(void* value) { init_callback_data_ = value; }
+  void* init_callback_data() const { return init_callback_data_; }
 
   Dart_EnvironmentCallback environment_callback() const {
     return environment_callback_;
@@ -254,8 +250,7 @@
 
   void SetupInstructionsSnapshotPage(
       const uint8_t* instructions_snapshot_buffer);
-  void SetupDataSnapshotPage(
-      const uint8_t* instructions_snapshot_buffer);
+  void SetupDataSnapshotPage(const uint8_t* instructions_snapshot_buffer);
 
   void ScheduleMessageInterrupts();
 
@@ -294,9 +289,7 @@
   Mutex* constant_canonicalization_mutex() const {
     return constant_canonicalization_mutex_;
   }
-  Mutex* megamorphic_lookup_mutex() const {
-    return megamorphic_lookup_mutex_;
-  }
+  Mutex* megamorphic_lookup_mutex() const { return megamorphic_lookup_mutex_; }
 
   Debugger* debugger() const {
     if (!FLAG_support_debugger) {
@@ -325,9 +318,7 @@
     last_resume_timestamp_ = OS::GetCurrentTimeMillis();
   }
 
-  int64_t last_resume_timestamp() const {
-    return last_resume_timestamp_;
-  }
+  int64_t last_resume_timestamp() const { return last_resume_timestamp_; }
 
   // Returns whether the vm service has requested that the debugger
   // resume execution.
@@ -399,12 +390,8 @@
     return shutdown_callback_;
   }
 
-  void set_object_id_ring(ObjectIdRing* ring) {
-    object_id_ring_ = ring;
-  }
-  ObjectIdRing* object_id_ring() {
-    return object_id_ring_;
-  }
+  void set_object_id_ring(ObjectIdRing* ring) { object_id_ring_ = ring; }
+  ObjectIdRing* object_id_ring() { return object_id_ring_; }
 
   void AddPendingDeopt(uword fp, uword pc);
   uword FindPendingDeopt(uword fp) const;
@@ -431,14 +418,13 @@
   void enable_background_compiler() {
     background_compiler_disabled_depth_--;
     if (background_compiler_disabled_depth_ < 0) {
-      FATAL("Mismatched number of calls to disable_background_compiler and "
-            "enable_background_compiler.");
+      FATAL(
+          "Mismatched number of calls to disable_background_compiler and "
+          "enable_background_compiler.");
     }
   }
 
-  void disable_background_compiler() {
-    background_compiler_disabled_depth_++;
-  }
+  void disable_background_compiler() { background_compiler_disabled_depth_++; }
 
   bool is_background_compiler_disabled() const {
     return background_compiler_disabled_depth_ > 0;
@@ -485,32 +471,22 @@
     return mutator_thread()->compiler_stats();
   }
 
-  VMTagCounters* vm_tag_counters() {
-    return &vm_tag_counters_;
-  }
+  VMTagCounters* vm_tag_counters() { return &vm_tag_counters_; }
 
-  bool IsReloading() const {
-    return reload_context_ != NULL;
-  }
+  bool IsReloading() const { return reload_context_ != NULL; }
 
-  IsolateReloadContext* reload_context() {
-    return reload_context_;
-  }
+  IsolateReloadContext* reload_context() { return reload_context_; }
 
   void DeleteReloadContext();
 
-  bool HasAttemptedReload() const {
-    return has_attempted_reload_;
-  }
+  bool HasAttemptedReload() const { return has_attempted_reload_; }
 
   bool CanReload() const;
 
   void set_last_reload_timestamp(int64_t value) {
     last_reload_timestamp_ = value;
   }
-  int64_t last_reload_timestamp() const {
-    return last_reload_timestamp_;
-  }
+  int64_t last_reload_timestamp() const { return last_reload_timestamp_; }
 
   bool IsPaused() const;
 
@@ -524,12 +500,8 @@
 
   void PausePostRequest();
 
-  uword user_tag() const {
-    return user_tag_;
-  }
-  static intptr_t user_tag_offset() {
-    return OFFSET_OF(Isolate, user_tag_);
-  }
+  uword user_tag() const { return user_tag_; }
+  static intptr_t user_tag_offset() { return OFFSET_OF(Isolate, user_tag_); }
   static intptr_t current_tag_offset() {
     return OFFSET_OF(Isolate, current_tag_);
   }
@@ -555,13 +527,9 @@
 
   void set_ic_miss_code(const Code& code);
 
-  Metric* metrics_list_head() {
-    return metrics_list_head_;
-  }
+  Metric* metrics_list_head() { return metrics_list_head_; }
 
-  void set_metrics_list_head(Metric* metric) {
-    metrics_list_head_ = metric;
-  }
+  void set_metrics_list_head(Metric* metric) { metrics_list_head_ = metric; }
 
   RawGrowableObjectArray* deoptimized_code_array() const {
     return deoptimized_code_array_;
@@ -576,15 +544,11 @@
   void clear_sticky_error();
 
   bool compilation_allowed() const { return compilation_allowed_; }
-  void set_compilation_allowed(bool allowed) {
-    compilation_allowed_ = allowed;
-  }
+  void set_compilation_allowed(bool allowed) { compilation_allowed_ = allowed; }
 
   // In precompilation we finalize all regular classes before compiling.
   bool all_classes_finalized() const { return all_classes_finalized_; }
-  void set_all_classes_finalized(bool value) {
-    all_classes_finalized_ = value;
-  }
+  void set_all_classes_finalized(bool value) { all_classes_finalized_ = value; }
 
   // True during top level parsing.
   bool IsTopLevelParsing() {
@@ -622,11 +586,11 @@
 #ifndef PRODUCT
   RawObject* InvokePendingServiceExtensionCalls();
   void AppendServiceExtensionCall(const Instance& closure,
-                           const String& method_name,
-                           const Array& parameter_keys,
-                           const Array& parameter_values,
-                           const Instance& reply_port,
-                           const Instance& id);
+                                  const String& method_name,
+                                  const Array& parameter_keys,
+                                  const Array& parameter_values,
+                                  const Instance& reply_port,
+                                  const Instance& id);
   void RegisterServiceExtensionHandler(const String& name,
                                        const Instance& closure);
   RawInstance* LookupServiceExtensionHandler(const String& name);
@@ -655,7 +619,7 @@
   bool asserts() const { return FLAG_enable_asserts; }
   bool error_on_bad_type() const { return FLAG_error_on_bad_type; }
   bool error_on_bad_override() const { return FLAG_error_on_bad_override; }
-#else  // defined(PRODUCT)
+#else   // defined(PRODUCT)
   bool type_checks() const { return type_checks_; }
   bool asserts() const { return asserts_; }
   bool error_on_bad_type() const { return error_on_bad_type_; }
@@ -678,7 +642,7 @@
   void MaybeIncreaseReloadEveryNStackOverflowChecks();
 
  private:
-  friend class Dart;  // Init, InitOnce, Shutdown.
+  friend class Dart;                  // Init, InitOnce, Shutdown.
   friend class IsolateKillerVisitor;  // Kill().
 
   explicit Isolate(const Dart_IsolateFlags& api_flags);
@@ -702,9 +666,7 @@
   // running, and the visitor must not allocate.
   void VisitObjectPointers(ObjectPointerVisitor* visitor, bool validate_frames);
 
-  void set_user_tag(uword tag) {
-    user_tag_ = tag;
-  }
+  void set_user_tag(uword tag) { user_tag_ = tag; }
 
   RawGrowableObjectArray* GetAndClearPendingServiceExtensionCalls();
   RawGrowableObjectArray* pending_service_extension_calls() const {
@@ -719,8 +681,9 @@
 
   Monitor* threads_lock() const;
   Thread* ScheduleThread(bool is_mutator, bool bypass_safepoint = false);
-  void UnscheduleThread(
-      Thread* thread, bool is_mutator, bool bypass_safepoint = false);
+  void UnscheduleThread(Thread* thread,
+                        bool is_mutator,
+                        bool bypass_safepoint = false);
 
   // DEPRECATED: Use Thread's methods instead. During migration, these default
   // to using the mutator thread (which must also be the current thread).
@@ -761,9 +724,9 @@
   bool has_compiled_code_;  // Can check that no compilation occured.
   Random random_;
   Simulator* simulator_;
-  Mutex* mutex_;  // Protects compiler stats.
+  Mutex* mutex_;          // Protects compiler stats.
   Mutex* symbols_mutex_;  // Protects concurrent access to the symbol table.
-  Mutex* type_canonicalization_mutex_;  // Protects type canonicalization.
+  Mutex* type_canonicalization_mutex_;      // Protects type canonicalization.
   Mutex* constant_canonicalization_mutex_;  // Protects const canonicalization.
   Mutex* megamorphic_lookup_mutex_;  // Protects megamorphic table lookup.
   MessageHandler* message_handler_;
@@ -777,13 +740,13 @@
 
   bool is_service_isolate_;
 
-  // Isolate-specific flags.
-  NOT_IN_PRODUCT(
-    bool type_checks_;
-    bool asserts_;
-    bool error_on_bad_type_;
-    bool error_on_bad_override_;
-  )
+// Isolate-specific flags.
+#if !defined(PRODUCT)
+  bool type_checks_;
+  bool asserts_;
+  bool error_on_bad_type_;
+  bool error_on_bad_override_;
+#endif  // !defined(PRODUCT)
 
   // Timestamps of last operation via service.
   int64_t last_allocationprofile_accumulator_reset_timestamp_;
@@ -881,10 +844,10 @@
 
 #define REUSABLE_FRIEND_DECLARATION(name)                                      \
   friend class Reusable##name##HandleScope;
-REUSABLE_HANDLE_LIST(REUSABLE_FRIEND_DECLARATION)
+  REUSABLE_HANDLE_LIST(REUSABLE_FRIEND_DECLARATION)
 #undef REUSABLE_FRIEND_DECLARATION
 
-  friend class Become;  // VisitObjectPointers
+  friend class Become;    // VisitObjectPointers
   friend class GCMarker;  // VisitObjectPointers
   friend class SafepointHandler;
   friend class Scavenger;  // VisitObjectPointers
diff --git a/runtime/vm/isolate_reload.cc b/runtime/vm/isolate_reload.cc
index 139c6d4..4370ab1 100644
--- a/runtime/vm/isolate_reload.cc
+++ b/runtime/vm/isolate_reload.cc
@@ -25,16 +25,24 @@
 namespace dart {
 
 DEFINE_FLAG(bool, trace_reload, false, "Trace isolate reloading");
-DEFINE_FLAG(bool, trace_reload_verbose, false,
+DEFINE_FLAG(bool,
+            trace_reload_verbose,
+            false,
             "trace isolate reloading verbose");
 DEFINE_FLAG(bool, identity_reload, false, "Enable checks for identity reload.");
 DEFINE_FLAG(int, reload_every, 0, "Reload every N stack overflow checks.");
 DEFINE_FLAG(bool, reload_every_optimized, true, "Only from optimized code.");
-DEFINE_FLAG(bool, reload_every_back_off, false,
+DEFINE_FLAG(bool,
+            reload_every_back_off,
+            false,
             "Double the --reload-every value after each reload.");
-DEFINE_FLAG(bool, reload_force_rollback, false,
+DEFINE_FLAG(bool,
+            reload_force_rollback,
+            false,
             "Force all reloads to fail and rollback.");
-DEFINE_FLAG(bool, check_reloaded, false,
+DEFINE_FLAG(bool,
+            check_reloaded,
+            false,
             "Assert that an isolate has reloaded at least once.")
 #ifndef PRODUCT
 
@@ -42,9 +50,8 @@
 #define Z (thread->zone())
 
 #define TIMELINE_SCOPE(name)                                                   \
-    TimelineDurationScope tds##name(Thread::Current(),                         \
-                                   Timeline::GetIsolateStream(),               \
-                                   #name)
+  TimelineDurationScope tds##name(Thread::Current(),                           \
+                                  Timeline::GetIsolateStream(), #name)
 
 
 InstanceMorpher::InstanceMorpher(Zone* zone, const Class& from, const Class& to)
@@ -52,8 +59,8 @@
       to_(Class::Handle(zone, to.raw())),
       mapping_(zone, 0) {
   ComputeMapping();
-  before_ = new(zone) ZoneGrowableArray<const Instance*>(zone, 0);
-  after_ = new(zone) ZoneGrowableArray<const Instance*>(zone, 0);
+  before_ = new (zone) ZoneGrowableArray<const Instance*>(zone, 0);
+  after_ = new (zone) ZoneGrowableArray<const Instance*>(zone, 0);
   ASSERT(from_.id() == to_.id());
   cid_ = from_.id();
 }
@@ -109,9 +116,9 @@
 RawInstance* InstanceMorpher::Morph(const Instance& instance) const {
   const Instance& result = Instance::Handle(Instance::New(to_));
   // Morph the context from instance to result using mapping_.
-  for (intptr_t i = 0; i < mapping_.length(); i +=2) {
+  for (intptr_t i = 0; i < mapping_.length(); i += 2) {
     intptr_t from_offset = mapping_.At(i);
-    intptr_t to_offset = mapping_.At(i+1);
+    intptr_t to_offset = mapping_.At(i + 1);
     const Object& value =
         Object::Handle(instance.RawGetFieldAtOffset(from_offset));
     result.RawSetFieldAtOffset(to_offset, value);
@@ -150,8 +157,8 @@
   }
 
   THR_Print("Mapping: ");
-  for (int i = 0; i < mapping_.length(); i +=2) {
-    THR_Print(" %" Pd "->%" Pd,  mapping_.At(i),  mapping_.At(i+1));
+  for (int i = 0; i < mapping_.length(); i += 2) {
+    THR_Print(" %" Pd "->%" Pd, mapping_.At(i), mapping_.At(i + 1));
   }
   THR_Print("\n");
 }
@@ -176,7 +183,7 @@
   for (int i = 0; i < mapping_.length(); i += 2) {
     JSONArray pair(&map);
     pair.AddValue(mapping_.At(i));
-    pair.AddValue(mapping_.At(i+1));
+    pair.AddValue(mapping_.At(i + 1));
   }
 }
 
@@ -213,8 +220,7 @@
                                                    const Class& to)
     : ReasonForCancelling(zone),
       from_(Class::ZoneHandle(zone, from.raw())),
-      to_(Class::ZoneHandle(zone, to.raw())) {
-}
+      to_(Class::ZoneHandle(zone, to.raw())) {}
 
 
 void ClassReasonForCancelling::AppendTo(JSONArray* array) {
@@ -246,9 +252,7 @@
     return String::Cast(a).Equals(String::Cast(b));
   }
 
-  static uword Hash(const Object& obj) {
-    return String::Cast(obj).Hash();
-  }
+  static uword Hash(const Object& obj) { return String::Cast(obj).Hash(); }
 };
 
 
@@ -279,13 +283,11 @@
     if (!a.IsLibrary() || !b.IsLibrary()) {
       return false;
     }
-    return IsolateReloadContext::IsSameLibrary(
-        Library::Cast(a), Library::Cast(b));
+    return IsolateReloadContext::IsSameLibrary(Library::Cast(a),
+                                               Library::Cast(b));
   }
 
-  static uword Hash(const Object& obj) {
-    return Library::Cast(obj).UrlHash();
-  }
+  static uword Hash(const Object& obj) { return Library::Cast(obj).UrlHash(); }
 };
 
 
@@ -356,8 +358,8 @@
 }
 
 
-bool IsolateReloadContext::IsSameLibrary(
-    const Library& a_lib, const Library& b_lib) {
+bool IsolateReloadContext::IsSameLibrary(const Library& a_lib,
+                                         const Library& b_lib) {
   const String& a_lib_url =
       String::Handle(a_lib.IsNull() ? String::null() : a_lib.url());
   const String& b_lib_url =
@@ -366,8 +368,7 @@
 }
 
 
-IsolateReloadContext::IsolateReloadContext(Isolate* isolate,
-                                           JSONStream* js)
+IsolateReloadContext::IsolateReloadContext(Isolate* isolate, JSONStream* js)
     : zone_(Thread::Current()->zone()),
       start_time_micros_(OS::GetCurrentMonotonicMicros()),
       reload_timestamp_(OS::GetCurrentTimeMillis()),
@@ -400,8 +401,7 @@
 }
 
 
-IsolateReloadContext::~IsolateReloadContext() {
-}
+IsolateReloadContext::~IsolateReloadContext() {}
 
 
 void IsolateReloadContext::ReportError(const Error& error) {
@@ -424,8 +424,7 @@
  public:
   Aborted(Zone* zone, const Error& error)
       : ReasonForCancelling(zone),
-        error_(Error::ZoneHandle(zone, error.raw())) {
-  }
+        error_(Error::ZoneHandle(zone, error.raw())) {}
 
  private:
   const Error& error_;
@@ -463,14 +462,12 @@
   // Preallocate storage for maps.
   old_classes_set_storage_ =
       HashTables::New<UnorderedHashSet<ClassMapTraits> >(4);
-  class_map_storage_ =
-      HashTables::New<UnorderedHashMap<ClassMapTraits> >(4);
+  class_map_storage_ = HashTables::New<UnorderedHashMap<ClassMapTraits> >(4);
   old_libraries_set_storage_ =
       HashTables::New<UnorderedHashSet<LibraryMapTraits> >(4);
   library_map_storage_ =
       HashTables::New<UnorderedHashMap<LibraryMapTraits> >(4);
-  become_map_storage_ =
-      HashTables::New<UnorderedHashMap<BecomeMapTraits> >(4);
+  become_map_storage_ = HashTables::New<UnorderedHashMap<BecomeMapTraits> >(4);
   // Keep a separate array for enum mappings to avoid having to invoke
   // hashCode on the instances.
   become_enum_mappings_ = GrowableObjectArray::New(Heap::kOld);
@@ -511,10 +508,9 @@
     TransitionVMToNative transition(thread);
     Api::Scope api_scope(thread);
 
-    Dart_Handle retval =
-        (I->library_tag_handler())(Dart_kScriptTag,
-                                   Api::NewHandle(thread, Library::null()),
-                                   Api::NewHandle(thread, root_lib_url.raw()));
+    Dart_Handle retval = (I->library_tag_handler())(
+        Dart_kScriptTag, Api::NewHandle(thread, Library::null()),
+        Api::NewHandle(thread, root_lib_url.raw()));
     result = Api::UnwrapHandle(retval);
   }
   //
@@ -522,8 +518,7 @@
 
   BackgroundCompiler::Enable();
 
-  if (result.IsUnwindError() ||
-      result.IsUnhandledException()) {
+  if (result.IsUnwindError() || result.IsUnhandledException()) {
     // If the tag handler returns with an UnwindError or an UnhandledException
     // error, propagate it and give up.
     Exceptions::PropagateError(Error::Cast(result));
@@ -719,8 +714,7 @@
   Class& cls = Class::Handle();
   UnorderedHashSet<ClassMapTraits> old_classes_set(old_classes_set_storage_);
   for (intptr_t i = 0; i < saved_num_cids_; i++) {
-    if (class_table->IsValidIndex(i) &&
-        class_table->HasValidClassAt(i)) {
+    if (class_table->IsValidIndex(i) && class_table->HasValidClassAt(i)) {
       // Copy the class into the saved class table and add it to the set.
       local_saved_class_table[i] = class_table->At(i);
       if (i != kFreeListElement && i != kForwardingCorpse) {
@@ -756,7 +750,7 @@
 
 
 static void PropagateLibraryModified(
-    const ZoneGrowableArray<ZoneGrowableArray<intptr_t>* >* imported_by,
+    const ZoneGrowableArray<ZoneGrowableArray<intptr_t>*>* imported_by,
     intptr_t lib_index,
     BitVector* modified_libs) {
   ZoneGrowableArray<intptr_t>* dep_libs = (*imported_by)[lib_index];
@@ -782,12 +776,11 @@
   intptr_t num_libs = libs.Length();
 
   // Construct the imported-by graph.
-  ZoneGrowableArray<ZoneGrowableArray<intptr_t>* >* imported_by =
-      new(zone_) ZoneGrowableArray<ZoneGrowableArray<intptr_t>* >(
-          zone_, num_libs);
+  ZoneGrowableArray<ZoneGrowableArray<intptr_t>*>* imported_by = new (zone_)
+      ZoneGrowableArray<ZoneGrowableArray<intptr_t>*>(zone_, num_libs);
   imported_by->SetLength(num_libs);
   for (intptr_t i = 0; i < num_libs; i++) {
-    (*imported_by)[i] = new(zone_) ZoneGrowableArray<intptr_t>(zone_, 0);
+    (*imported_by)[i] = new (zone_) ZoneGrowableArray<intptr_t>(zone_, 0);
   }
   Array& ports = Array::Handle();
   Namespace& ns = Namespace::Handle();
@@ -842,7 +835,7 @@
     }
   }
 
-  BitVector* modified_libs = new(Z) BitVector(Z, num_libs);
+  BitVector* modified_libs = new (Z) BitVector(Z, num_libs);
 
   for (intptr_t lib_idx = 0; lib_idx < num_libs; lib_idx++) {
     lib ^= libs.At(lib_idx);
@@ -871,8 +864,7 @@
   TIMELINE_SCOPE(CheckpointLibraries);
   TIR_Print("---- CHECKPOINTING LIBRARIES\n");
   // Save the root library in case we abort the reload.
-  const Library& root_lib =
-      Library::Handle(object_store()->root_library());
+  const Library& root_lib = Library::Handle(object_store()->root_library());
   set_saved_root_library(root_lib);
 
   // Save the old libraries array in case we abort the reload.
@@ -882,11 +874,11 @@
 
   // Make a filtered copy of the old libraries array. Keep "clean" libraries
   // that we will use instead of reloading.
-  const GrowableObjectArray& new_libs = GrowableObjectArray::Handle(
-      GrowableObjectArray::New(Heap::kOld));
+  const GrowableObjectArray& new_libs =
+      GrowableObjectArray::Handle(GrowableObjectArray::New(Heap::kOld));
   Library& lib = Library::Handle();
-  UnorderedHashSet<LibraryMapTraits>
-      old_libraries_set(old_libraries_set_storage_);
+  UnorderedHashSet<LibraryMapTraits> old_libraries_set(
+      old_libraries_set_storage_);
   num_saved_libs_ = 0;
   for (intptr_t i = 0; i < libs.Length(); i++) {
     lib ^= libs.At(i);
@@ -949,8 +941,8 @@
   TIR_Print("---- ROLLING BACK LIBRARY CHANGES\n");
   Thread* thread = Thread::Current();
   Library& lib = Library::Handle();
-  GrowableObjectArray& saved_libs = GrowableObjectArray::Handle(
-      Z, saved_libraries());
+  GrowableObjectArray& saved_libs =
+      GrowableObjectArray::Handle(Z, saved_libraries());
   if (!saved_libs.IsNull()) {
     for (intptr_t i = 0; i < saved_libs.Length(); i++) {
       lib = Library::RawCast(saved_libs.At(i));
@@ -991,7 +983,7 @@
   UnorderedHashMap<ClassMapTraits> class_map(class_map_storage_);
   UnorderedHashMap<ClassMapTraits> reverse_class_map(
       HashTables::New<UnorderedHashMap<ClassMapTraits> >(
-         class_map.NumOccupied()));
+          class_map.NumOccupied()));
   {
     UnorderedHashMap<ClassMapTraits>::Iterator it(&class_map);
     while (it.MoveNext()) {
@@ -1000,9 +992,10 @@
       cls = Class::RawCast(class_map.GetPayload(entry, 0));
       cls2 ^= reverse_class_map.GetOrNull(new_cls);
       if (!cls2.IsNull()) {
-        OS::PrintErr("Classes '%s' and '%s' are distinct classes but both map "
-                     " to class '%s'\n",
-                     cls.ToCString(), cls2.ToCString(), new_cls.ToCString());
+        OS::PrintErr(
+            "Classes '%s' and '%s' are distinct classes but both map "
+            " to class '%s'\n",
+            cls.ToCString(), cls2.ToCString(), new_cls.ToCString());
         UNREACHABLE();
       }
       bool update = reverse_class_map.UpdateOrInsert(cls, new_cls);
@@ -1097,8 +1090,8 @@
     TIMELINE_SCOPE(UpdateLibrariesArray);
     // Update the libraries array.
     Library& lib = Library::Handle();
-    const GrowableObjectArray& libs = GrowableObjectArray::Handle(
-        I->object_store()->libraries());
+    const GrowableObjectArray& libs =
+        GrowableObjectArray::Handle(I->object_store()->libraries());
     for (intptr_t i = 0; i < libs.Length(); i++) {
       lib = Library::RawCast(libs.At(i));
       VTIR_Print("Lib '%s' at index %" Pd "\n", lib.ToCString(), i);
@@ -1118,8 +1111,8 @@
     const GrowableObjectArray& become_enum_mappings =
         GrowableObjectArray::Handle(become_enum_mappings_);
     UnorderedHashMap<BecomeMapTraits> become_map(become_map_storage_);
-    intptr_t replacement_count = become_map.NumOccupied() +
-                                 become_enum_mappings.Length() / 2;
+    intptr_t replacement_count =
+        become_map.NumOccupied() + become_enum_mappings.Length() / 2;
     const Array& before =
         Array::Handle(Array::New(replacement_count, Heap::kOld));
     const Array& after =
@@ -1151,19 +1144,42 @@
   if (FLAG_identity_reload) {
     if (saved_num_cids_ != I->class_table()->NumCids()) {
       TIR_Print("Identity reload failed! B#C=%" Pd " A#C=%" Pd "\n",
-                saved_num_cids_,
-                I->class_table()->NumCids());
+                saved_num_cids_, I->class_table()->NumCids());
     }
     const GrowableObjectArray& saved_libs =
         GrowableObjectArray::Handle(saved_libraries());
     const GrowableObjectArray& libs =
         GrowableObjectArray::Handle(I->object_store()->libraries());
     if (saved_libs.Length() != libs.Length()) {
-     TIR_Print("Identity reload failed! B#L=%" Pd " A#L=%" Pd "\n",
-               saved_libs.Length(),
-               libs.Length());
+      TIR_Print("Identity reload failed! B#L=%" Pd " A#L=%" Pd "\n",
+                saved_libs.Length(), libs.Length());
     }
   }
+
+  // Rehash constants map for all new classes and the closure class.
+  Class& cls = Class::Handle(zone_);
+  cls = I->class_table()->At(kClosureCid);
+  cls.RehashConstants(zone_);
+  {
+    ASSERT(class_map_storage_ != Array::null());
+    UnorderedHashMap<ClassMapTraits> map(class_map_storage_);
+    UnorderedHashMap<ClassMapTraits>::Iterator it(&map);
+    while (it.MoveNext()) {
+      const intptr_t entry = it.Current();
+      cls = Class::RawCast(map.GetKey(entry));
+      cls.RehashConstants(zone_);
+    }
+    map.Release();
+  }
+
+#ifdef DEBUG
+  // Verify that all canonical instances are correctly setup in the
+  // corresponding canonical tables.
+  Thread* thread = Thread::Current();
+  I->heap()->CollectAllGarbage();
+  VerifyCanonicalVisitor check_canonical(thread);
+  I->heap()->IterateObjects(&check_canonical);
+#endif  // DEBUG
 }
 
 
@@ -1212,8 +1228,7 @@
 class ObjectLocator : public ObjectVisitor {
  public:
   explicit ObjectLocator(IsolateReloadContext* context)
-      : context_(context), count_(0) {
-  }
+      : context_(context), count_(0) {}
 
   void VisitObject(RawObject* obj) {
     InstanceMorpher* morpher =
@@ -1252,12 +1267,12 @@
   intptr_t count = locator.count();
   if (count == 0) return;
 
-  TIR_Print("Found %" Pd " object%s subject to morphing.\n",
-            count, (count > 1) ? "s" : "");
+  TIR_Print("Found %" Pd " object%s subject to morphing.\n", count,
+            (count > 1) ? "s" : "");
 
   Array& before = Array::Handle();
   Array& after = Array::Handle();
-  { // Prevent GC to take place due object format confusion.
+  {  // Prevent GC to take place due object format confusion.
     // Hint: More than one class share the same cid.
     NoHeapGrowthControlScope scope;
     for (intptr_t i = 0; i < instance_morphers_.length(); i++) {
@@ -1426,14 +1441,13 @@
   MarkFunctionsForRecompilation(Isolate* isolate,
                                 IsolateReloadContext* reload_context,
                                 Zone* zone)
-    : ObjectVisitor(),
-      handle_(Object::Handle(zone)),
-      owning_class_(Class::Handle(zone)),
-      owning_lib_(Library::Handle(zone)),
-      code_(Code::Handle(zone)),
-      reload_context_(reload_context),
-      zone_(zone) {
-  }
+      : ObjectVisitor(),
+        handle_(Object::Handle(zone)),
+        owning_class_(Class::Handle(zone)),
+        owning_lib_(Library::Handle(zone)),
+        code_(Code::Handle(zone)),
+        reload_context_(reload_context),
+        zone_(zone) {}
 
   virtual void VisitObject(RawObject* obj) {
     if (obj->IsPseudoObject()) {
@@ -1459,7 +1473,7 @@
       if (!stub_code) {
         if (clear_code) {
           VTIR_Print("Marking %s for recompilation, clearning code\n",
-              func.ToCString());
+                     func.ToCString());
           ClearAllCode(func);
         } else {
           PreserveUnoptimizedCode();
@@ -1564,8 +1578,8 @@
 
 RawLibrary* IsolateReloadContext::OldLibraryOrNull(
     const Library& replacement_or_new) {
-  UnorderedHashSet<LibraryMapTraits>
-      old_libraries_set(old_libraries_set_storage_);
+  UnorderedHashSet<LibraryMapTraits> old_libraries_set(
+      old_libraries_set_storage_);
   Library& lib = Library::Handle();
   lib ^= old_libraries_set.GetOrNull(replacement_or_new);
   old_libraries_set.Release();
@@ -1623,8 +1637,8 @@
 }
 
 
-void IsolateReloadContext::AddStaticFieldMapping(
-    const Field& old_field, const Field& new_field) {
+void IsolateReloadContext::AddStaticFieldMapping(const Field& old_field,
+                                                 const Field& new_field) {
   ASSERT(old_field.is_static());
   ASSERT(new_field.is_static());
 
diff --git a/runtime/vm/isolate_reload.h b/runtime/vm/isolate_reload.h
index e8fbd3a..f2a2df9 100644
--- a/runtime/vm/isolate_reload.h
+++ b/runtime/vm/isolate_reload.h
@@ -17,20 +17,20 @@
 
 // 'Trace Isolate Reload' TIR_Print
 #if defined(_MSC_VER)
-#define TIR_Print(format, ...) \
-    if (FLAG_trace_reload) Log::Current()->Print(format, __VA_ARGS__)
+#define TIR_Print(format, ...)                                                 \
+  if (FLAG_trace_reload) Log::Current()->Print(format, __VA_ARGS__)
 #else
-#define TIR_Print(format, ...) \
-    if (FLAG_trace_reload) Log::Current()->Print(format, ##__VA_ARGS__)
+#define TIR_Print(format, ...)                                                 \
+  if (FLAG_trace_reload) Log::Current()->Print(format, ##__VA_ARGS__)
 #endif
 
 // 'Verbose Trace Isolate Reload' VTIR_Print
 #if defined(_MSC_VER)
-#define VTIR_Print(format, ...) \
-    if (FLAG_trace_reload_verbose) Log::Current()->Print(format, __VA_ARGS__)
+#define VTIR_Print(format, ...)                                                \
+  if (FLAG_trace_reload_verbose) Log::Current()->Print(format, __VA_ARGS__)
 #else
-#define VTIR_Print(format, ...) \
-    if (FLAG_trace_reload_verbose) Log::Current()->Print(format, ##__VA_ARGS__)
+#define VTIR_Print(format, ...)                                                \
+  if (FLAG_trace_reload_verbose) Log::Current()->Print(format, ##__VA_ARGS__)
 #endif
 
 namespace dart {
@@ -128,8 +128,7 @@
 
 class IsolateReloadContext {
  public:
-  explicit IsolateReloadContext(Isolate* isolate,
-                                JSONStream* js);
+  explicit IsolateReloadContext(Isolate* isolate, JSONStream* js);
   ~IsolateReloadContext();
 
   void Reload(bool force_reload);
@@ -191,9 +190,7 @@
   void AddInstanceMorpher(InstanceMorpher* morpher);
 
   // Tells whether instance in the heap must be morphed.
-  bool HasInstanceMorphers() const {
-    return !instance_morphers_.is_empty();
-  }
+  bool HasInstanceMorphers() const { return !instance_morphers_.is_empty(); }
 
   // NOTE: FinalizeLoading will be called *before* Reload() returns. This
   // function will not be called if the embedder does not call
@@ -307,8 +304,7 @@
   RawLibrary* OldLibraryOrNull(const Library& replacement_or_new);
   void BuildLibraryMapping();
 
-  void AddClassMapping(const Class& replacement_or_new,
-                       const Class& original);
+  void AddClassMapping(const Class& replacement_or_new, const Class& original);
 
   void AddLibraryMapping(const Library& replacement_or_new,
                          const Library& original);
@@ -348,4 +344,4 @@
 
 }  // namespace dart
 
-#endif   // RUNTIME_VM_ISOLATE_RELOAD_H_
+#endif  // RUNTIME_VM_ISOLATE_RELOAD_H_
diff --git a/runtime/vm/isolate_reload_test.cc b/runtime/vm/isolate_reload_test.cc
index 7fabfe7..7c7daa6 100644
--- a/runtime/vm/isolate_reload_test.cc
+++ b/runtime/vm/isolate_reload_test.cc
@@ -634,8 +634,7 @@
 
   Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
   EXPECT_VALID(lib);
-  EXPECT_STREQ("saved:field=mixin1,func=mixin1",
-               SimpleInvokeStr(lib, "main"));
+  EXPECT_STREQ("saved:field=mixin1,func=mixin1", SimpleInvokeStr(lib, "main"));
 
   const char* kReloadScript =
       "class Mixin2 {\n"
@@ -656,9 +655,10 @@
 
   // The saved instance of B retains its old field value from mixin1,
   // but it gets the new implementation of func from mixin2.
-  EXPECT_STREQ("saved:field=mixin1,func=mixin2 "
-               "newer:field=mixin2,func=mixin2",
-               SimpleInvokeStr(lib, "main"));
+  EXPECT_STREQ(
+      "saved:field=mixin1,func=mixin2 "
+      "newer:field=mixin2,func=mixin2",
+      SimpleInvokeStr(lib, "main"));
 }
 
 
@@ -683,10 +683,11 @@
 
   Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
   EXPECT_VALID(lib);
-  EXPECT_STREQ("(a is A(true)/ B(false)/ C(false),"
-               " b is A(true)/ B(true)/ C(false),"
-               " c is A(true)/ B(true)/ C(true))",
-               SimpleInvokeStr(lib, "main"));
+  EXPECT_STREQ(
+      "(a is A(true)/ B(false)/ C(false),"
+      " b is A(true)/ B(true)/ C(false),"
+      " c is A(true)/ B(true)/ C(true))",
+      SimpleInvokeStr(lib, "main"));
 
   const char* kReloadScript =
       "class C {\n"
@@ -709,11 +710,12 @@
 
   lib = TestCase::ReloadTestScript(kReloadScript);
   EXPECT_VALID(lib);
-  EXPECT_STREQ("(a is A(true)/ C(true)/ X(true),"
-               " b is A(true)/ C(true)/ X(true),"  // still extends A...
-               " c is A(false)/ C(true)/ X(false),"
-               " x is A(false)/ C(true)/ X(true))",
-               SimpleInvokeStr(lib, "main"));
+  EXPECT_STREQ(
+      "(a is A(true)/ C(true)/ X(true),"
+      " b is A(true)/ C(true)/ X(true),"  // still extends A...
+      " c is A(false)/ C(true)/ X(false),"
+      " x is A(false)/ C(true)/ X(true))",
+      SimpleInvokeStr(lib, "main"));
 
   // Revive the class B and make sure all allocated instances take
   // their place in the inheritance hierarchy.
@@ -741,11 +743,12 @@
 
   lib = TestCase::ReloadTestScript(kReloadScript2);
   EXPECT_VALID(lib);
-  EXPECT_STREQ("(a is A(true)/ B(false)/ C(false)/ X(true),"
-               " b is A(false)/ B(true)/ C(false)/ X(true),"
-               " c is A(true)/ B(false)/ C(true)/ X(true),"
-               " x is A(false)/ B(false)/ C(false)/ X(true))",
-               SimpleInvokeStr(lib, "main"));
+  EXPECT_STREQ(
+      "(a is A(true)/ B(false)/ C(false)/ X(true),"
+      " b is A(false)/ B(true)/ C(false)/ X(true),"
+      " c is A(true)/ B(false)/ C(true)/ X(true),"
+      " x is A(false)/ B(false)/ C(false)/ X(true))",
+      SimpleInvokeStr(lib, "main"));
 }
 
 
@@ -784,8 +787,7 @@
 
 
 TEST_CASE(IsolateReload_LibraryLookup) {
-  const char* kImportScript =
-      "importedFunc() => 'a';\n";
+  const char* kImportScript = "importedFunc() => 'a';\n";
   TestCase::AddTestLib("test:lib1", kImportScript);
 
   const char* kScript =
@@ -827,8 +829,7 @@
 
 
 TEST_CASE(IsolateReload_LibraryHide) {
-  const char* kImportScript =
-      "importedFunc() => 'a';\n";
+  const char* kImportScript = "importedFunc() => 'a';\n";
   TestCase::AddTestLib("test:lib1", kImportScript);
 
   // Import 'test:lib1' with importedFunc hidden. Will result in an
@@ -908,8 +909,7 @@
 // Verifies that we clear the ICs for the functions live on the stack in a way
 // that is compatible with the fast path smi stubs.
 TEST_CASE(IsolateReload_SmiFastPathStubs) {
-  const char* kImportScript =
-      "importedIntFunc() => 4;\n";
+  const char* kImportScript = "importedIntFunc() => 4;\n";
   TestCase::AddTestLib("test:lib1", kImportScript);
 
   const char* kScript =
@@ -1595,8 +1595,10 @@
 
   TestCase::SetReloadTestScript(kReloadScript);
 
-  EXPECT_STREQ("4 NoSuchMethodError: No static getter 'y' declared "
-               "in class 'C'.", SimpleInvokeStr(lib, "main"));
+  EXPECT_STREQ(
+      "4 NoSuchMethodError: No static getter 'y' declared "
+      "in class 'C'.",
+      SimpleInvokeStr(lib, "main"));
 
   lib = TestCase::GetReloadErrorOrRootLibrary();
   EXPECT_VALID(lib);
@@ -1605,8 +1607,7 @@
 
 static void IsolateReload_DanlingGetter_LibraryReload(
     Dart_NativeArguments native_args) {
-  const char* kImportScript2 =
-    "var x;\n";
+  const char* kImportScript2 = "var x;\n";
   TestCase::AddTestLib("test:other", kImportScript2);
 
   DART_CHECK_VALID(TestCase::TriggerReload());
@@ -1769,8 +1770,10 @@
 
   TestCase::SetReloadTestScript(kReloadScript);
 
-  EXPECT_STREQ("5 NoSuchMethodError: No static setter 'y=' declared in "
-               "class 'C'.", SimpleInvokeStr(lib, "main"));
+  EXPECT_STREQ(
+      "5 NoSuchMethodError: No static setter 'y=' declared in "
+      "class 'C'.",
+      SimpleInvokeStr(lib, "main"));
 
   lib = TestCase::GetReloadErrorOrRootLibrary();
   EXPECT_VALID(lib);
@@ -1779,8 +1782,7 @@
 
 static void IsolateReload_DanlingSetter_LibraryReload(
     Dart_NativeArguments native_args) {
-  const char* kImportScript2 =
-    "var x;\n";
+  const char* kImportScript2 = "var x;\n";
   TestCase::AddTestLib("test:other", kImportScript2);
 
   DART_CHECK_VALID(TestCase::TriggerReload());
@@ -1883,8 +1885,10 @@
 
   TestCase::SetReloadTestScript(kReloadScript);
 
-  EXPECT_STREQ("1 NoSuchMethodError: Class 'C' has no instance method "
-               "'foo' with matching arguments.", SimpleInvokeStr(lib, "main"));
+  EXPECT_STREQ(
+      "1 NoSuchMethodError: Class 'C' has no instance method "
+      "'foo' with matching arguments.",
+      SimpleInvokeStr(lib, "main"));
 
   lib = TestCase::GetReloadErrorOrRootLibrary();
   EXPECT_VALID(lib);
@@ -1937,8 +1941,10 @@
 
   TestCase::SetReloadTestScript(kReloadScript);
 
-  EXPECT_STREQ("1 NoSuchMethodError: Closure call with mismatched arguments: "
-               "function 'C.foo'", SimpleInvokeStr(lib, "main"));
+  EXPECT_STREQ(
+      "1 NoSuchMethodError: Closure call with mismatched arguments: "
+      "function 'C.foo'",
+      SimpleInvokeStr(lib, "main"));
 
   lib = TestCase::GetReloadErrorOrRootLibrary();
   EXPECT_VALID(lib);
@@ -2174,8 +2180,7 @@
 
   lib = TestCase::ReloadTestScript(kReloadScript);
   EXPECT_VALID(lib);
-  EXPECT_STREQ("Fruit.Cantalope true 2",
-               SimpleInvokeStr(lib, "main"));
+  EXPECT_STREQ("Fruit.Cantalope true 2", SimpleInvokeStr(lib, "main"));
 }
 
 
@@ -2881,8 +2886,7 @@
 
 
 TEST_CASE(IsolateReload_NoLibsModified) {
-  const char* kImportScript =
-      "importedFunc() => 'fancy';";
+  const char* kImportScript = "importedFunc() => 'fancy';";
   TestCase::AddTestLib("test:lib1", kImportScript);
 
   const char* kScript =
@@ -2895,8 +2899,7 @@
   EXPECT_VALID(lib);
   EXPECT_STREQ("fancy feast", SimpleInvokeStr(lib, "main"));
 
-  const char* kReloadImportScript =
-      "importedFunc() => 'bossy';";
+  const char* kReloadImportScript = "importedFunc() => 'bossy';";
   TestCase::AddTestLib("test:lib1", kReloadImportScript);
 
   const char* kReloadScript =
@@ -2924,8 +2927,7 @@
 
 
 TEST_CASE(IsolateReload_MainLibModified) {
-  const char* kImportScript =
-      "importedFunc() => 'fancy';";
+  const char* kImportScript = "importedFunc() => 'fancy';";
   TestCase::AddTestLib("test:lib1", kImportScript);
 
   const char* kScript =
@@ -2938,8 +2940,7 @@
   EXPECT_VALID(lib);
   EXPECT_STREQ("fancy feast", SimpleInvokeStr(lib, "main"));
 
-  const char* kReloadImportScript =
-      "importedFunc() => 'bossy';";
+  const char* kReloadImportScript = "importedFunc() => 'bossy';";
   TestCase::AddTestLib("test:lib1", kReloadImportScript);
 
   const char* kReloadScript =
@@ -2967,8 +2968,7 @@
 
 
 TEST_CASE(IsolateReload_ImportedLibModified) {
-  const char* kImportScript =
-      "importedFunc() => 'fancy';";
+  const char* kImportScript = "importedFunc() => 'fancy';";
   TestCase::AddTestLib("test:lib1", kImportScript);
 
   const char* kScript =
@@ -2981,8 +2981,7 @@
   EXPECT_VALID(lib);
   EXPECT_STREQ("fancy feast", SimpleInvokeStr(lib, "main"));
 
-  const char* kReloadImportScript =
-      "importedFunc() => 'bossy';";
+  const char* kReloadImportScript = "importedFunc() => 'bossy';";
   TestCase::AddTestLib("test:lib1", kReloadImportScript);
 
   const char* kReloadScript =
@@ -3002,8 +3001,7 @@
 
 
 TEST_CASE(IsolateReload_PrefixImportedLibModified) {
-  const char* kImportScript =
-      "importedFunc() => 'fancy';";
+  const char* kImportScript = "importedFunc() => 'fancy';";
   TestCase::AddTestLib("test:lib1", kImportScript);
 
   const char* kScript =
@@ -3016,8 +3014,7 @@
   EXPECT_VALID(lib);
   EXPECT_STREQ("fancy feast", SimpleInvokeStr(lib, "main"));
 
-  const char* kReloadImportScript =
-      "importedFunc() => 'bossy';";
+  const char* kReloadImportScript = "importedFunc() => 'bossy';";
   TestCase::AddTestLib("test:lib1", kReloadImportScript);
 
   const char* kReloadScript =
@@ -3046,12 +3043,10 @@
 
 
 TEST_CASE(IsolateReload_ExportedLibModified) {
-  const char* kImportScript =
-      "export 'test:exportlib';";
+  const char* kImportScript = "export 'test:exportlib';";
   TestCase::AddTestLib("test:importlib", kImportScript);
 
-  const char* kExportScript =
-      "exportedFunc() => 'fancy';";
+  const char* kExportScript = "exportedFunc() => 'fancy';";
   TestCase::AddTestLib("test:exportlib", kExportScript);
 
   const char* kScript =
@@ -3064,8 +3059,7 @@
   EXPECT_VALID(lib);
   EXPECT_STREQ("fancy feast", SimpleInvokeStr(lib, "main"));
 
-  const char* kReloadExportScript =
-      "exportedFunc() => 'bossy';";
+  const char* kReloadExportScript = "exportedFunc() => 'bossy';";
   TestCase::AddTestLib("test:exportlib", kReloadExportScript);
 
   const char* kReloadScript =
@@ -3085,7 +3079,7 @@
 
 
 TEST_CASE(IsolateReload_SimpleConstFieldUpdate) {
-    const char* kScript =
+  const char* kScript =
       "const value = 'a';\n"
       "main() {\n"
       "  return 'value=${value}';\n"
@@ -3108,7 +3102,7 @@
 
 
 TEST_CASE(IsolateReload_ConstFieldUpdate) {
-    const char* kScript =
+  const char* kScript =
       "const value = const Duration(seconds: 1);\n"
       "main() {\n"
       "  return 'value=${value}';\n"
diff --git a/runtime/vm/isolate_test.cc b/runtime/vm/isolate_test.cc
index 4e39113..5e71ed7 100644
--- a/runtime/vm/isolate_test.cc
+++ b/runtime/vm/isolate_test.cc
@@ -49,9 +49,8 @@
   Dart_Handle internal_lib = Dart_LookupLibrary(url);
   DART_CHECK_VALID(internal_lib);
   Dart_Handle print = Dart_GetField(test_lib, NewString("_nullPrintClosure"));
-  Dart_Handle result = Dart_SetField(internal_lib,
-                                     NewString("_printClosure"),
-                                     print);
+  Dart_Handle result =
+      Dart_SetField(internal_lib, NewString("_printClosure"), print);
 
   DART_CHECK_VALID(result);
 
@@ -60,9 +59,8 @@
   DART_CHECK_VALID(url);
   Dart_Handle isolate_lib = Dart_LookupLibrary(url);
   DART_CHECK_VALID(isolate_lib);
-  Dart_Handle schedule_immediate_closure =
-      Dart_Invoke(isolate_lib, NewString("_getIsolateScheduleImmediateClosure"),
-                  0, NULL);
+  Dart_Handle schedule_immediate_closure = Dart_Invoke(
+      isolate_lib, NewString("_getIsolateScheduleImmediateClosure"), 0, NULL);
   Dart_Handle args[1];
   args[0] = schedule_immediate_closure;
   url = NewString("dart:async");
@@ -90,9 +88,7 @@
   static const intptr_t kIterations;
 
   InterruptChecker(Thread* thread, ThreadBarrier* barrier)
-    : thread_(thread),
-      barrier_(barrier) {
-  }
+      : thread_(thread), barrier_(barrier) {}
 
   virtual void Run() {
     Thread::EnterIsolateAsHelper(thread_->isolate(), Thread::kUnknownTask);
@@ -104,9 +100,9 @@
       do {
         limit = AtomicOperations::LoadRelaxed(
             reinterpret_cast<uword*>(thread_->stack_limit_address()));
-      } while ((limit == thread_->saved_stack_limit_) ||
-               (((limit & Thread::kInterruptsMask) &
-                 Thread::kVMInterrupt) == 0));
+      } while (
+          (limit == thread_->saved_stack_limit_) ||
+          (((limit & Thread::kInterruptsMask) & Thread::kVMInterrupt) == 0));
       // Tell main thread that we observed the interrupt.
       barrier_->Sync();
     }
@@ -157,9 +153,7 @@
 
 class IsolateTestHelper {
  public:
-  static uword GetStackLimit(Thread* thread) {
-    return thread->stack_limit_;
-  }
+  static uword GetStackLimit(Thread* thread) { return thread->stack_limit_; }
   static uword GetSavedStackLimit(Thread* thread) {
     return thread->saved_stack_limit_;
   }
diff --git a/runtime/vm/jit_optimizer.cc b/runtime/vm/jit_optimizer.cc
index 63c79bc..1a7cf2e 100644
--- a/runtime/vm/jit_optimizer.cc
+++ b/runtime/vm/jit_optimizer.cc
@@ -61,8 +61,7 @@
 void JitOptimizer::ApplyClassIds() {
   ASSERT(current_iterator_ == NULL);
   for (BlockIterator block_it = flow_graph_->reverse_postorder_iterator();
-       !block_it.Done();
-       block_it.Advance()) {
+       !block_it.Done(); block_it.Advance()) {
     ForwardInstructionIterator it(block_it.Current());
     current_iterator_ = &it;
     for (; !it.Done(); it.Advance()) {
@@ -105,8 +104,7 @@
 
   const Token::Kind op_kind = call->token_kind();
   if (Token::IsRelationalOperator(op_kind) ||
-      Token::IsEqualityOperator(op_kind) ||
-      Token::IsBinaryOperator(op_kind)) {
+      Token::IsEqualityOperator(op_kind) || Token::IsBinaryOperator(op_kind)) {
     // Guess cid: if one of the inputs is a number assume that the other
     // is a number of same type.
     if (FLAG_guess_icdata_cid) {
@@ -130,24 +128,22 @@
   }
 
   if (all_cids_known) {
-    const Class& receiver_class = Class::Handle(Z,
-        isolate()->class_table()->At(class_ids[0]));
+    const Class& receiver_class =
+        Class::Handle(Z, isolate()->class_table()->At(class_ids[0]));
     if (!receiver_class.is_finalized()) {
       // Do not eagerly finalize classes. ResolveDynamicForReceiverClass can
       // cause class finalization, since callee's receiver class may not be
       // finalized yet.
       return false;
     }
-    const Array& args_desc_array = Array::Handle(Z,
-        ArgumentsDescriptor::New(call->ArgumentCount(),
-                                 call->argument_names()));
+    const Array& args_desc_array =
+        Array::Handle(Z, ArgumentsDescriptor::New(call->ArgumentCount(),
+                                                  call->argument_names()));
     ArgumentsDescriptor args_desc(args_desc_array);
-    const Function& function = Function::Handle(Z,
-        Resolver::ResolveDynamicForReceiverClass(
-            receiver_class,
-            call->function_name(),
-            args_desc,
-            false /* allow add */));
+    const Function& function =
+        Function::Handle(Z, Resolver::ResolveDynamicForReceiverClass(
+                                receiver_class, call->function_name(),
+                                args_desc, false /* allow add */));
     if (function.IsNull()) {
       return false;
     }
@@ -156,8 +152,8 @@
     // since it is attached to the assembly instruction itself.
     // TODO(srdjan): Prevent modification of ICData object that is
     // referenced in assembly code.
-    const ICData& ic_data = ICData::ZoneHandle(Z,
-        ICData::NewFrom(*call->ic_data(), class_ids.length()));
+    const ICData& ic_data = ICData::ZoneHandle(
+        Z, ICData::NewFrom(*call->ic_data(), class_ids.length()));
     if (class_ids.length() > 1) {
       ic_data.AddCheck(class_ids, function);
     } else {
@@ -169,25 +165,22 @@
   }
 
   // Check if getter or setter in function's class and class is currently leaf.
-  if (FLAG_guess_icdata_cid &&
-      ((call->token_kind() == Token::kGET) ||
-          (call->token_kind() == Token::kSET))) {
+  if (FLAG_guess_icdata_cid && ((call->token_kind() == Token::kGET) ||
+                                (call->token_kind() == Token::kSET))) {
     const Class& owner_class = Class::Handle(Z, function().Owner());
-    if (!owner_class.is_abstract() &&
-        !CHA::HasSubclasses(owner_class) &&
+    if (!owner_class.is_abstract() && !CHA::HasSubclasses(owner_class) &&
         !CHA::IsImplemented(owner_class)) {
-      const Array& args_desc_array = Array::Handle(Z,
-          ArgumentsDescriptor::New(call->ArgumentCount(),
-                                   call->argument_names()));
+      const Array& args_desc_array =
+          Array::Handle(Z, ArgumentsDescriptor::New(call->ArgumentCount(),
+                                                    call->argument_names()));
       ArgumentsDescriptor args_desc(args_desc_array);
-      const Function& function = Function::Handle(Z,
-          Resolver::ResolveDynamicForReceiverClass(owner_class,
-                                                   call->function_name(),
-                                                   args_desc,
-                                                   false /* allow_add */));
+      const Function& function =
+          Function::Handle(Z, Resolver::ResolveDynamicForReceiverClass(
+                                  owner_class, call->function_name(), args_desc,
+                                  false /* allow_add */));
       if (!function.IsNull()) {
-        const ICData& ic_data = ICData::ZoneHandle(Z,
-            ICData::NewFrom(*call->ic_data(), class_ids.length()));
+        const ICData& ic_data = ICData::ZoneHandle(
+            Z, ICData::NewFrom(*call->ic_data(), class_ids.length()));
         ic_data.AddReceiverCheck(owner_class.id(), function);
         call->set_ic_data(&ic_data);
         return true;
@@ -212,13 +205,11 @@
   // TODO(fschneider): Try looking up the function on the class if it is
   // not found in the ICData.
   if (!function.IsNull()) {
-    const ICData& new_ic_data = ICData::ZoneHandle(Z, ICData::New(
-        Function::Handle(Z, ic_data.Owner()),
-        String::Handle(Z, ic_data.target_name()),
-        Object::empty_array(),  // Dummy argument descriptor.
-        ic_data.deopt_id(),
-        ic_data.NumArgsTested(),
-        false));
+    const ICData& new_ic_data = ICData::ZoneHandle(
+        Z, ICData::New(Function::Handle(Z, ic_data.Owner()),
+                       String::Handle(Z, ic_data.target_name()),
+                       Object::empty_array(),  // Dummy argument descriptor.
+                       ic_data.deopt_id(), ic_data.NumArgsTested(), false));
     new_ic_data.SetDeoptReasons(ic_data.DeoptReasons());
     new_ic_data.AddReceiverCheck(cid, function);
     return new_ic_data;
@@ -253,10 +244,8 @@
   const bool with_checks = false;
   const bool complete = false;
   PolymorphicInstanceCallInstr* specialized =
-      new(Z) PolymorphicInstanceCallInstr(call->instance_call(),
-                                          ic_data,
-                                          with_checks,
-                                          complete);
+      new (Z) PolymorphicInstanceCallInstr(call->instance_call(), ic_data,
+                                           with_checks, complete);
   call->ReplaceWith(specialized, current_iterator());
 }
 
@@ -321,19 +310,19 @@
 
 
 static bool HasOnlyOneSmi(const ICData& ic_data) {
-  return (ic_data.NumberOfUsedChecks() == 1)
-      && ic_data.HasReceiverClassId(kSmiCid);
+  return (ic_data.NumberOfUsedChecks() == 1) &&
+         ic_data.HasReceiverClassId(kSmiCid);
 }
 
 
 static bool HasOnlySmiOrMint(const ICData& ic_data) {
   if (ic_data.NumberOfUsedChecks() == 1) {
-    return ic_data.HasReceiverClassId(kSmiCid)
-        || ic_data.HasReceiverClassId(kMintCid);
+    return ic_data.HasReceiverClassId(kSmiCid) ||
+           ic_data.HasReceiverClassId(kMintCid);
   }
-  return (ic_data.NumberOfUsedChecks() == 2)
-      && ic_data.HasReceiverClassId(kSmiCid)
-      && ic_data.HasReceiverClassId(kMintCid);
+  return (ic_data.NumberOfUsedChecks() == 2) &&
+         ic_data.HasReceiverClassId(kSmiCid) &&
+         ic_data.HasReceiverClassId(kMintCid);
 }
 
 
@@ -376,8 +365,8 @@
 
 
 static bool HasOnlyOneDouble(const ICData& ic_data) {
-  return (ic_data.NumberOfUsedChecks() == 1)
-      && ic_data.HasReceiverClassId(kDoubleCid);
+  return (ic_data.NumberOfUsedChecks() == 1) &&
+         ic_data.HasReceiverClassId(kDoubleCid);
 }
 
 
@@ -397,8 +386,7 @@
 }
 
 
-void JitOptimizer::ReplaceCall(Definition* call,
-                               Definition* replacement) {
+void JitOptimizer::ReplaceCall(Definition* call, Definition* replacement) {
   // Remove the original push arguments.
   for (intptr_t i = 0; i < call->ArgumentCount(); ++i) {
     PushArgumentInstr* push = call->PushArgumentAt(i);
@@ -415,11 +403,9 @@
                                Instruction* insert_before) {
   if (to_check->Type()->ToCid() != kSmiCid) {
     InsertBefore(insert_before,
-                 new(Z) CheckSmiInstr(new(Z) Value(to_check),
-                                      deopt_id,
-                                      insert_before->token_pos()),
-                 deopt_environment,
-                 FlowGraph::kEffect);
+                 new (Z) CheckSmiInstr(new (Z) Value(to_check), deopt_id,
+                                       insert_before->token_pos()),
+                 deopt_environment, FlowGraph::kEffect);
   }
 }
 
@@ -430,12 +416,10 @@
                                          TokenPosition token_pos) {
   if ((unary_checks.NumberOfUsedChecks() == 1) &&
       unary_checks.HasReceiverClassId(kSmiCid)) {
-    return new(Z) CheckSmiInstr(new(Z) Value(to_check),
-                                deopt_id,
-                                token_pos);
+    return new (Z) CheckSmiInstr(new (Z) Value(to_check), deopt_id, token_pos);
   }
-  return new(Z) CheckClassInstr(
-      new(Z) Value(to_check), deopt_id, unary_checks, token_pos);
+  return new (Z) CheckClassInstr(new (Z) Value(to_check), deopt_id,
+                                 unary_checks, token_pos);
 }
 
 
@@ -445,8 +429,8 @@
                                  Environment* deopt_environment,
                                  Instruction* insert_before) {
   // Type propagation has not run yet, we cannot eliminate the check.
-  Instruction* check = GetCheckClass(
-      to_check, unary_checks, deopt_id, insert_before->token_pos());
+  Instruction* check = GetCheckClass(to_check, unary_checks, deopt_id,
+                                     insert_before->token_pos());
   InsertBefore(insert_before, check, deopt_environment, FlowGraph::kEffect);
 }
 
@@ -454,9 +438,7 @@
 void JitOptimizer::AddReceiverCheck(InstanceCallInstr* call) {
   AddCheckClass(call->ArgumentAt(0),
                 ICData::ZoneHandle(Z, call->ic_data()->AsUnaryClassChecks()),
-                call->deopt_id(),
-                call->env(),
-                call);
+                call->deopt_id(), call->env(), call);
 }
 
 
@@ -534,12 +516,12 @@
       ASSERT(str.Length() == 1);
       ConstantInstr* char_code_left = flow_graph()->GetConstant(
           Smi::ZoneHandle(Z, Smi::New(static_cast<intptr_t>(str.CharAt(0)))));
-      left_val = new(Z) Value(char_code_left);
+      left_val = new (Z) Value(char_code_left);
     } else if (left->IsOneByteStringFromCharCode()) {
       // Use input of string-from-charcode as left value.
       OneByteStringFromCharCodeInstr* instr =
           left->AsOneByteStringFromCharCode();
-      left_val = new(Z) Value(instr->char_code()->definition());
+      left_val = new (Z) Value(instr->char_code()->definition());
       to_remove_left = instr;
     } else {
       // IsLengthOneString(left) should have been false.
@@ -552,32 +534,24 @@
       // Skip string-from-char-code, and use its input as right value.
       OneByteStringFromCharCodeInstr* right_instr =
           right->AsOneByteStringFromCharCode();
-      right_val = new(Z) Value(right_instr->char_code()->definition());
+      right_val = new (Z) Value(right_instr->char_code()->definition());
       to_remove_right = right_instr;
     } else {
       const ICData& unary_checks_1 =
           ICData::ZoneHandle(Z, call->ic_data()->AsUnaryClassChecksForArgNr(1));
-      AddCheckClass(right,
-                    unary_checks_1,
-                    call->deopt_id(),
-                    call->env(),
-                    call);
+      AddCheckClass(right, unary_checks_1, call->deopt_id(), call->env(), call);
       // String-to-char-code instructions returns -1 (illegal charcode) if
       // string is not of length one.
-      StringToCharCodeInstr* char_code_right =
-          new(Z) StringToCharCodeInstr(new(Z) Value(right), kOneByteStringCid);
+      StringToCharCodeInstr* char_code_right = new (Z)
+          StringToCharCodeInstr(new (Z) Value(right), kOneByteStringCid);
       InsertBefore(call, char_code_right, call->env(), FlowGraph::kValue);
-      right_val = new(Z) Value(char_code_right);
+      right_val = new (Z) Value(char_code_right);
     }
 
     // Comparing char-codes instead of strings.
     EqualityCompareInstr* comp =
-        new(Z) EqualityCompareInstr(call->token_pos(),
-                                    op_kind,
-                                    left_val,
-                                    right_val,
-                                    kSmiCid,
-                                    call->deopt_id());
+        new (Z) EqualityCompareInstr(call->token_pos(), op_kind, left_val,
+                                     right_val, kSmiCid, call->deopt_id());
     ReplaceCall(call, comp);
 
     // Remove dead instructions.
@@ -597,7 +571,9 @@
 }
 
 
-static bool SmiFitsInDouble() { return kSmiBits < 53; }
+static bool SmiFitsInDouble() {
+  return kSmiBits < 53;
+}
 
 bool JitOptimizer::TryReplaceWithEqualityOp(InstanceCallInstr* call,
                                             Token::Kind op_kind) {
@@ -617,17 +593,13 @@
     }
   } else if (HasOnlyTwoOf(ic_data, kSmiCid)) {
     InsertBefore(call,
-                 new(Z) CheckSmiInstr(new(Z) Value(left),
-                                      call->deopt_id(),
-                                      call->token_pos()),
-                 call->env(),
-                 FlowGraph::kEffect);
+                 new (Z) CheckSmiInstr(new (Z) Value(left), call->deopt_id(),
+                                       call->token_pos()),
+                 call->env(), FlowGraph::kEffect);
     InsertBefore(call,
-                 new(Z) CheckSmiInstr(new(Z) Value(right),
-                                      call->deopt_id(),
-                                      call->token_pos()),
-                 call->env(),
-                 FlowGraph::kEffect);
+                 new (Z) CheckSmiInstr(new (Z) Value(right), call->deopt_id(),
+                                       call->token_pos()),
+                 call->env(), FlowGraph::kEffect);
     cid = kSmiCid;
   } else if (HasTwoMintOrSmi(ic_data) &&
              FlowGraphCompiler::SupportsUnboxedMints()) {
@@ -642,13 +614,10 @@
         // call.
         return false;
       } else {
-        InsertBefore(call,
-                     new(Z) CheckEitherNonSmiInstr(
-                         new(Z) Value(left),
-                         new(Z) Value(right),
-                         call->deopt_id()),
-                     call->env(),
-                     FlowGraph::kEffect);
+        InsertBefore(call, new (Z) CheckEitherNonSmiInstr(new (Z) Value(left),
+                                                          new (Z) Value(right),
+                                                          call->deopt_id()),
+                     call->env(), FlowGraph::kEffect);
         cid = kDoubleCid;
       }
     }
@@ -659,24 +628,15 @@
     GrowableArray<intptr_t> smi_or_null(2);
     smi_or_null.Add(kSmiCid);
     smi_or_null.Add(kNullCid);
-    if (ICDataHasOnlyReceiverArgumentClassIds(ic_data,
-                                              smi_or_null,
+    if (ICDataHasOnlyReceiverArgumentClassIds(ic_data, smi_or_null,
                                               smi_or_null)) {
       const ICData& unary_checks_0 =
           ICData::ZoneHandle(Z, call->ic_data()->AsUnaryClassChecks());
-      AddCheckClass(left,
-                    unary_checks_0,
-                    call->deopt_id(),
-                    call->env(),
-                    call);
+      AddCheckClass(left, unary_checks_0, call->deopt_id(), call->env(), call);
 
       const ICData& unary_checks_1 =
           ICData::ZoneHandle(Z, call->ic_data()->AsUnaryClassChecksForArgNr(1));
-      AddCheckClass(right,
-                    unary_checks_1,
-                    call->deopt_id(),
-                    call->env(),
-                    call);
+      AddCheckClass(right, unary_checks_1, call->deopt_id(), call->env(), call);
       cid = kSmiCid;
     } else {
       // Shortcut for equality with null.
@@ -684,12 +644,10 @@
       ConstantInstr* left_const = left->AsConstant();
       if ((right_const != NULL && right_const->value().IsNull()) ||
           (left_const != NULL && left_const->value().IsNull())) {
-        StrictCompareInstr* comp =
-            new(Z) StrictCompareInstr(call->token_pos(),
-                                      Token::kEQ_STRICT,
-                                      new(Z) Value(left),
-                                      new(Z) Value(right),
-                                      false);  // No number check.
+        StrictCompareInstr* comp = new (Z)
+            StrictCompareInstr(call->token_pos(), Token::kEQ_STRICT,
+                               new (Z) Value(left), new (Z) Value(right),
+                               false);  // No number check.
         ReplaceCall(call, comp);
         return true;
       }
@@ -697,12 +655,9 @@
     }
   }
   ASSERT(cid != kIllegalCid);
-  EqualityCompareInstr* comp = new(Z) EqualityCompareInstr(call->token_pos(),
-                                                           op_kind,
-                                                           new(Z) Value(left),
-                                                           new(Z) Value(right),
-                                                           cid,
-                                                           call->deopt_id());
+  EqualityCompareInstr* comp = new (Z)
+      EqualityCompareInstr(call->token_pos(), op_kind, new (Z) Value(left),
+                           new (Z) Value(right), cid, call->deopt_id());
   ReplaceCall(call, comp);
   return true;
 }
@@ -720,17 +675,13 @@
   intptr_t cid = kIllegalCid;
   if (HasOnlyTwoOf(ic_data, kSmiCid)) {
     InsertBefore(call,
-                 new(Z) CheckSmiInstr(new(Z) Value(left),
-                                      call->deopt_id(),
-                                      call->token_pos()),
-                 call->env(),
-                 FlowGraph::kEffect);
+                 new (Z) CheckSmiInstr(new (Z) Value(left), call->deopt_id(),
+                                       call->token_pos()),
+                 call->env(), FlowGraph::kEffect);
     InsertBefore(call,
-                 new(Z) CheckSmiInstr(new(Z) Value(right),
-                                      call->deopt_id(),
-                                      call->token_pos()),
-                 call->env(),
-                 FlowGraph::kEffect);
+                 new (Z) CheckSmiInstr(new (Z) Value(right), call->deopt_id(),
+                                       call->token_pos()),
+                 call->env(), FlowGraph::kEffect);
     cid = kSmiCid;
   } else if (HasTwoMintOrSmi(ic_data) &&
              FlowGraphCompiler::SupportsUnboxedMints()) {
@@ -745,13 +696,10 @@
         // call.
         return false;
       } else {
-        InsertBefore(call,
-                     new(Z) CheckEitherNonSmiInstr(
-                         new(Z) Value(left),
-                         new(Z) Value(right),
-                         call->deopt_id()),
-                     call->env(),
-                     FlowGraph::kEffect);
+        InsertBefore(call, new (Z) CheckEitherNonSmiInstr(new (Z) Value(left),
+                                                          new (Z) Value(right),
+                                                          call->deopt_id()),
+                     call->env(), FlowGraph::kEffect);
         cid = kDoubleCid;
       }
     }
@@ -759,12 +707,9 @@
     return false;
   }
   ASSERT(cid != kIllegalCid);
-  RelationalOpInstr* comp = new(Z) RelationalOpInstr(call->token_pos(),
-                                                     op_kind,
-                                                     new(Z) Value(left),
-                                                     new(Z) Value(right),
-                                                     cid,
-                                                     call->deopt_id());
+  RelationalOpInstr* comp =
+      new (Z) RelationalOpInstr(call->token_pos(), op_kind, new (Z) Value(left),
+                                new (Z) Value(right), cid, call->deopt_id());
   ReplaceCall(call, comp);
   return true;
 }
@@ -783,8 +728,8 @@
         // Don't generate smi code if the IC data is marked because
         // of an overflow.
         operands_type = ic_data.HasDeoptReason(ICData::kDeoptBinarySmiOp)
-            ? kMintCid
-            : kSmiCid;
+                            ? kMintCid
+                            : kSmiCid;
       } else if (HasTwoMintOrSmi(ic_data) &&
                  FlowGraphCompiler::SupportsUnboxedMints()) {
         // Don't generate mint code if the IC data is marked because of an
@@ -840,11 +785,11 @@
           return false;
         }
         operands_type = ic_data.HasDeoptReason(ICData::kDeoptBinarySmiOp)
-            ? kMintCid
-            : kSmiCid;
+                            ? kMintCid
+                            : kSmiCid;
       } else if (HasTwoMintOrSmi(ic_data) &&
-                 HasOnlyOneSmi(ICData::Handle(Z,
-                     ic_data.AsUnaryClassChecksForArgNr(1)))) {
+                 HasOnlyOneSmi(ICData::Handle(
+                     Z, ic_data.AsUnaryClassChecksForArgNr(1)))) {
         // Don't generate mint code if the IC data is marked because of an
         // overflow.
         if (ic_data.HasDeoptReason(ICData::kDeoptBinaryMintOp)) {
@@ -883,34 +828,25 @@
     // binary operation with two smis is a smi not a double, except '/' which
     // returns a double for two smis.
     if (op_kind != Token::kDIV) {
-      InsertBefore(call,
-                   new(Z) CheckEitherNonSmiInstr(
-                       new(Z) Value(left),
-                       new(Z) Value(right),
-                       call->deopt_id()),
-                   call->env(),
-                   FlowGraph::kEffect);
+      InsertBefore(call, new (Z) CheckEitherNonSmiInstr(new (Z) Value(left),
+                                                        new (Z) Value(right),
+                                                        call->deopt_id()),
+                   call->env(), FlowGraph::kEffect);
     }
 
-    BinaryDoubleOpInstr* double_bin_op =
-        new(Z) BinaryDoubleOpInstr(op_kind,
-                                   new(Z) Value(left),
-                                   new(Z) Value(right),
-                                   call->deopt_id(), call->token_pos());
+    BinaryDoubleOpInstr* double_bin_op = new (Z)
+        BinaryDoubleOpInstr(op_kind, new (Z) Value(left), new (Z) Value(right),
+                            call->deopt_id(), call->token_pos());
     ReplaceCall(call, double_bin_op);
   } else if (operands_type == kMintCid) {
     if (!FlowGraphCompiler::SupportsUnboxedMints()) return false;
     if ((op_kind == Token::kSHR) || (op_kind == Token::kSHL)) {
-      ShiftMintOpInstr* shift_op =
-          new(Z) ShiftMintOpInstr(
-              op_kind, new(Z) Value(left), new(Z) Value(right),
-              call->deopt_id());
+      ShiftMintOpInstr* shift_op = new (Z) ShiftMintOpInstr(
+          op_kind, new (Z) Value(left), new (Z) Value(right), call->deopt_id());
       ReplaceCall(call, shift_op);
     } else {
-      BinaryMintOpInstr* bin_op =
-          new(Z) BinaryMintOpInstr(
-              op_kind, new(Z) Value(left), new(Z) Value(right),
-              call->deopt_id());
+      BinaryMintOpInstr* bin_op = new (Z) BinaryMintOpInstr(
+          op_kind, new (Z) Value(left), new (Z) Value(right), call->deopt_id());
       ReplaceCall(call, bin_op);
     }
   } else if (operands_type == kFloat32x4Cid) {
@@ -927,19 +863,14 @@
         // Insert smi check and attach a copy of the original environment
         // because the smi operation can still deoptimize.
         InsertBefore(call,
-                     new(Z) CheckSmiInstr(new(Z) Value(left),
-                                          call->deopt_id(),
-                                          call->token_pos()),
-                     call->env(),
-                     FlowGraph::kEffect);
-        ConstantInstr* constant =
-            flow_graph()->GetConstant(Smi::Handle(Z,
-                Smi::New(Smi::Cast(obj).Value() - 1)));
+                     new (Z) CheckSmiInstr(new (Z) Value(left),
+                                           call->deopt_id(), call->token_pos()),
+                     call->env(), FlowGraph::kEffect);
+        ConstantInstr* constant = flow_graph()->GetConstant(
+            Smi::Handle(Z, Smi::New(Smi::Cast(obj).Value() - 1)));
         BinarySmiOpInstr* bin_op =
-            new(Z) BinarySmiOpInstr(Token::kBIT_AND,
-                                    new(Z) Value(left),
-                                    new(Z) Value(constant),
-                                    call->deopt_id());
+            new (Z) BinarySmiOpInstr(Token::kBIT_AND, new (Z) Value(left),
+                                     new (Z) Value(constant), call->deopt_id());
         ReplaceCall(call, bin_op);
         return true;
       }
@@ -948,11 +879,8 @@
     // environment because the smi operation can still deoptimize.
     AddCheckSmi(left, call->deopt_id(), call->env(), call);
     AddCheckSmi(right, call->deopt_id(), call->env(), call);
-    BinarySmiOpInstr* bin_op =
-        new(Z) BinarySmiOpInstr(op_kind,
-                                new(Z) Value(left),
-                                new(Z) Value(right),
-                                call->deopt_id());
+    BinarySmiOpInstr* bin_op = new (Z) BinarySmiOpInstr(
+        op_kind, new (Z) Value(left), new (Z) Value(right), call->deopt_id());
     ReplaceCall(call, bin_op);
   } else {
     ASSERT(operands_type == kSmiCid);
@@ -967,12 +895,8 @@
       left = right;
       right = temp;
     }
-    BinarySmiOpInstr* bin_op =
-        new(Z) BinarySmiOpInstr(
-            op_kind,
-            new(Z) Value(left),
-            new(Z) Value(right),
-            call->deopt_id());
+    BinarySmiOpInstr* bin_op = new (Z) BinarySmiOpInstr(
+        op_kind, new (Z) Value(left), new (Z) Value(right), call->deopt_id());
     ReplaceCall(call, bin_op);
   }
   return true;
@@ -986,24 +910,21 @@
   Definition* unary_op = NULL;
   if (HasOnlyOneSmi(*call->ic_data())) {
     InsertBefore(call,
-                 new(Z) CheckSmiInstr(new(Z) Value(input),
-                                      call->deopt_id(),
-                                      call->token_pos()),
-                 call->env(),
-                 FlowGraph::kEffect);
-    unary_op = new(Z) UnarySmiOpInstr(
-        op_kind, new(Z) Value(input), call->deopt_id());
+                 new (Z) CheckSmiInstr(new (Z) Value(input), call->deopt_id(),
+                                       call->token_pos()),
+                 call->env(), FlowGraph::kEffect);
+    unary_op = new (Z)
+        UnarySmiOpInstr(op_kind, new (Z) Value(input), call->deopt_id());
   } else if ((op_kind == Token::kBIT_NOT) &&
              HasOnlySmiOrMint(*call->ic_data()) &&
              FlowGraphCompiler::SupportsUnboxedMints()) {
-    unary_op = new(Z) UnaryMintOpInstr(
-        op_kind, new(Z) Value(input), call->deopt_id());
+    unary_op = new (Z)
+        UnaryMintOpInstr(op_kind, new (Z) Value(input), call->deopt_id());
   } else if (HasOnlyOneDouble(*call->ic_data()) &&
-             (op_kind == Token::kNEGATE) &&
-             CanUnboxDouble()) {
+             (op_kind == Token::kNEGATE) && CanUnboxDouble()) {
     AddReceiverCheck(call);
-    unary_op = new(Z) UnaryDoubleOpInstr(
-        Token::kNEGATE, new(Z) Value(input), call->deopt_id());
+    unary_op = new (Z) UnaryDoubleOpInstr(Token::kNEGATE, new (Z) Value(input),
+                                          call->deopt_id());
   } else {
     return false;
   }
@@ -1014,8 +935,7 @@
 
 
 // Using field class.
-RawField* JitOptimizer::GetField(intptr_t class_id,
-                                 const String& field_name) {
+RawField* JitOptimizer::GetField(intptr_t class_id, const String& field_name) {
   Class& cls = Class::Handle(Z, isolate()->class_table()->At(class_id));
   Field& field = Field::Handle(Z);
   while (!cls.IsNull()) {
@@ -1044,19 +964,16 @@
   // Inline implicit instance getter.
   const String& field_name =
       String::Handle(Z, Field::NameFromGetter(call->function_name()));
-  const Field& field =
-      Field::ZoneHandle(Z, GetField(class_ids[0], field_name));
+  const Field& field = Field::ZoneHandle(Z, GetField(class_ids[0], field_name));
   ASSERT(!field.IsNull());
 
-  if (flow_graph()->InstanceCallNeedsClassCheck(
-          call, RawFunction::kImplicitGetter)) {
+  if (flow_graph()->InstanceCallNeedsClassCheck(call,
+                                                RawFunction::kImplicitGetter)) {
     AddReceiverCheck(call);
   }
-  LoadFieldInstr* load = new(Z) LoadFieldInstr(
-      new(Z) Value(call->ArgumentAt(0)),
-      &field,
-      AbstractType::ZoneHandle(Z, field.type()),
-      call->token_pos());
+  LoadFieldInstr* load = new (Z) LoadFieldInstr(
+      new (Z) Value(call->ArgumentAt(0)), &field,
+      AbstractType::ZoneHandle(Z, field.type()), call->token_pos());
   load->set_is_immutable(field.is_final());
   if (field.guarded_cid() != kIllegalCid) {
     if (!field.is_nullable() || (field.guarded_cid() == kNullCid)) {
@@ -1072,9 +989,7 @@
 
   if (load->result_cid() != kDynamicCid) {
     // Reset value types if guarded_cid was used.
-    for (Value::Iterator it(load->input_use_list());
-         !it.Done();
-         it.Advance()) {
+    for (Value::Iterator it(load->input_use_list()); !it.Done(); it.Advance()) {
       it.Current()->SetReachingType(NULL);
     }
   }
@@ -1091,24 +1006,16 @@
   Definition* left = call->ArgumentAt(0);
   Definition* right = call->ArgumentAt(1);
   // Type check left.
-  AddCheckClass(left,
-                ICData::ZoneHandle(
-                    Z, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
-                call->deopt_id(),
-                call->env(),
-                call);
+  AddCheckClass(left, ICData::ZoneHandle(
+                          Z, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                call->deopt_id(), call->env(), call);
   // Type check right.
-  AddCheckClass(right,
-                ICData::ZoneHandle(
-                    Z, call->ic_data()->AsUnaryClassChecksForArgNr(1)),
-                call->deopt_id(),
-                call->env(),
-                call);
+  AddCheckClass(right, ICData::ZoneHandle(
+                           Z, call->ic_data()->AsUnaryClassChecksForArgNr(1)),
+                call->deopt_id(), call->env(), call);
   // Replace call.
-  BinaryFloat32x4OpInstr* float32x4_bin_op =
-      new(Z) BinaryFloat32x4OpInstr(
-          op_kind, new(Z) Value(left), new(Z) Value(right),
-          call->deopt_id());
+  BinaryFloat32x4OpInstr* float32x4_bin_op = new (Z) BinaryFloat32x4OpInstr(
+      op_kind, new (Z) Value(left), new (Z) Value(right), call->deopt_id());
   ReplaceCall(call, float32x4_bin_op);
 
   return true;
@@ -1124,24 +1031,16 @@
   Definition* left = call->ArgumentAt(0);
   Definition* right = call->ArgumentAt(1);
   // Type check left.
-  AddCheckClass(left,
-                ICData::ZoneHandle(
-                    Z, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
-                call->deopt_id(),
-                call->env(),
-                call);
+  AddCheckClass(left, ICData::ZoneHandle(
+                          Z, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                call->deopt_id(), call->env(), call);
   // Type check right.
-  AddCheckClass(right,
-                ICData::ZoneHandle(Z,
-                    call->ic_data()->AsUnaryClassChecksForArgNr(1)),
-                call->deopt_id(),
-                call->env(),
-                call);
+  AddCheckClass(right, ICData::ZoneHandle(
+                           Z, call->ic_data()->AsUnaryClassChecksForArgNr(1)),
+                call->deopt_id(), call->env(), call);
   // Replace call.
-  BinaryInt32x4OpInstr* int32x4_bin_op =
-      new(Z) BinaryInt32x4OpInstr(
-          op_kind, new(Z) Value(left), new(Z) Value(right),
-          call->deopt_id());
+  BinaryInt32x4OpInstr* int32x4_bin_op = new (Z) BinaryInt32x4OpInstr(
+      op_kind, new (Z) Value(left), new (Z) Value(right), call->deopt_id());
   ReplaceCall(call, int32x4_bin_op);
   return true;
 }
@@ -1156,24 +1055,16 @@
   Definition* left = call->ArgumentAt(0);
   Definition* right = call->ArgumentAt(1);
   // Type check left.
-  AddCheckClass(left,
-                ICData::ZoneHandle(
-                    call->ic_data()->AsUnaryClassChecksForArgNr(0)),
-                call->deopt_id(),
-                call->env(),
-                call);
+  AddCheckClass(
+      left, ICData::ZoneHandle(call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+      call->deopt_id(), call->env(), call);
   // Type check right.
-  AddCheckClass(right,
-                ICData::ZoneHandle(
-                    call->ic_data()->AsUnaryClassChecksForArgNr(1)),
-                call->deopt_id(),
-                call->env(),
-                call);
+  AddCheckClass(
+      right, ICData::ZoneHandle(call->ic_data()->AsUnaryClassChecksForArgNr(1)),
+      call->deopt_id(), call->env(), call);
   // Replace call.
-  BinaryFloat64x2OpInstr* float64x2_bin_op =
-      new(Z) BinaryFloat64x2OpInstr(
-          op_kind, new(Z) Value(left), new(Z) Value(right),
-          call->deopt_id());
+  BinaryFloat64x2OpInstr* float64x2_bin_op = new (Z) BinaryFloat64x2OpInstr(
+      op_kind, new (Z) Value(left), new (Z) Value(right), call->deopt_id());
   ReplaceCall(call, float64x2_bin_op);
   return true;
 }
@@ -1209,15 +1100,12 @@
     MethodRecognizer::Kind recognized_kind) {
   AddReceiverCheck(call);
   ZoneGrowableArray<Value*>* args =
-      new(Z) ZoneGrowableArray<Value*>(call->ArgumentCount());
+      new (Z) ZoneGrowableArray<Value*>(call->ArgumentCount());
   for (intptr_t i = 0; i < call->ArgumentCount(); i++) {
-    args->Add(new(Z) Value(call->ArgumentAt(i)));
+    args->Add(new (Z) Value(call->ArgumentAt(i)));
   }
-  InvokeMathCFunctionInstr* invoke =
-      new(Z) InvokeMathCFunctionInstr(args,
-                                      call->deopt_id(),
-                                      recognized_kind,
-                                      call->token_pos());
+  InvokeMathCFunctionInstr* invoke = new (Z) InvokeMathCFunctionInstr(
+      args, call->deopt_id(), recognized_kind, call->token_pos());
   ReplaceCall(call, invoke);
 }
 
@@ -1242,15 +1130,14 @@
     if (class_ids[0] == kSmiCid) {
       AddReceiverCheck(call);
       ReplaceCall(call,
-                  new(Z) SmiToDoubleInstr(
-                      new(Z) Value(call->ArgumentAt(0)),
-                      call->token_pos()));
+                  new (Z) SmiToDoubleInstr(new (Z) Value(call->ArgumentAt(0)),
+                                           call->token_pos()));
       return true;
     } else if ((class_ids[0] == kMintCid) && CanConvertUnboxedMintToDouble()) {
       AddReceiverCheck(call);
       ReplaceCall(call,
-                  new(Z) MintToDoubleInstr(new(Z) Value(call->ArgumentAt(0)),
-                                           call->deopt_id()));
+                  new (Z) MintToDoubleInstr(new (Z) Value(call->ArgumentAt(0)),
+                                            call->deopt_id()));
       return true;
     }
   }
@@ -1268,12 +1155,11 @@
         Definition* d2i_instr = NULL;
         if (ic_data.HasDeoptReason(ICData::kDeoptDoubleToSmi)) {
           // Do not repeatedly deoptimize because result didn't fit into Smi.
-          d2i_instr =  new(Z) DoubleToIntegerInstr(
-              new(Z) Value(input), call);
+          d2i_instr = new (Z) DoubleToIntegerInstr(new (Z) Value(input), call);
         } else {
           // Optimistically assume result fits into Smi.
-          d2i_instr = new(Z) DoubleToSmiInstr(
-              new(Z) Value(input), call->deopt_id());
+          d2i_instr =
+              new (Z) DoubleToSmiInstr(new (Z) Value(input), call->deopt_id());
         }
         ReplaceCall(call, d2i_instr);
         return true;
@@ -1290,8 +1176,8 @@
         } else {
           AddReceiverCheck(call);
           DoubleToDoubleInstr* d2d_instr =
-              new(Z) DoubleToDoubleInstr(new(Z) Value(call->ArgumentAt(0)),
-                                         recognized_kind, call->deopt_id());
+              new (Z) DoubleToDoubleInstr(new (Z) Value(call->ArgumentAt(0)),
+                                          recognized_kind, call->deopt_id());
           ReplaceCall(call, d2d_instr);
         }
         return true;
@@ -1331,7 +1217,7 @@
     const TypeArguments& type_arguments =
         TypeArguments::Handle(Z, type.arguments());
     const bool is_raw_type = type_arguments.IsNull() ||
-        type_arguments.IsRaw(from_index, num_type_params);
+                             type_arguments.IsRaw(from_index, num_type_params);
     if (!is_raw_type) {
       // Unknown result.
       return Bool::null();
@@ -1348,13 +1234,9 @@
     if (cls.NumTypeArguments() > 0) {
       return Bool::null();
     }
-    const bool is_subtype = cls.IsSubtypeOf(
-        TypeArguments::Handle(Z),
-        type_class,
-        TypeArguments::Handle(Z),
-        NULL,
-        NULL,
-        Heap::kOld);
+    const bool is_subtype =
+        cls.IsSubtypeOf(TypeArguments::Handle(Z), type_class,
+                        TypeArguments::Handle(Z), NULL, NULL, Heap::kOld);
     results->Add(cls.id());
     results->Add(is_subtype);
     if (prev.IsNull()) {
@@ -1365,7 +1247,7 @@
       }
     }
   }
-  return results_differ ?  Bool::null() : prev.raw();
+  return results_differ ? Bool::null() : prev.raw();
 }
 
 
@@ -1388,7 +1270,8 @@
   if (!type_class.IsPrivate()) {
     if (FLAG_use_cha_deopt || isolate()->all_classes_finalized()) {
       if (FLAG_trace_cha) {
-        THR_Print("  **(CHA) Typecheck as class equality since no "
+        THR_Print(
+            "  **(CHA) Typecheck as class equality since no "
             "subclasses: %s\n",
             type_class.ToCString());
       }
@@ -1408,7 +1291,7 @@
     const TypeArguments& type_arguments =
         TypeArguments::Handle(type.arguments());
     const bool is_raw_type = type_arguments.IsNull() ||
-        type_arguments.IsRaw(from_index, num_type_params);
+                             type_arguments.IsRaw(from_index, num_type_params);
     return is_raw_type;
   }
   return true;
@@ -1444,12 +1327,9 @@
   if ((*results)[0] != kSmiCid) {
     const Class& cls = Class::Handle(class_table.At(kSmiCid));
     const Class& type_class = Class::Handle(type.type_class());
-    const bool smi_is_subtype = cls.IsSubtypeOf(TypeArguments::Handle(),
-                                                type_class,
-                                                TypeArguments::Handle(),
-                                                NULL,
-                                                NULL,
-                                                Heap::kOld);
+    const bool smi_is_subtype =
+        cls.IsSubtypeOf(TypeArguments::Handle(), type_class,
+                        TypeArguments::Handle(), NULL, NULL, Heap::kOld);
     results->Add((*results)[results->length() - 2]);
     results->Add((*results)[results->length() - 2]);
     for (intptr_t i = results->length() - 3; i > 1; --i) {
@@ -1506,31 +1386,33 @@
       } else {
         UNIMPLEMENTED();
       }
-      negate = Bool::Cast(call->ArgumentAt(1)->OriginalDefinition()
-                          ->AsConstant()->value()).value();
+      negate =
+          Bool::Cast(
+              call->ArgumentAt(1)->OriginalDefinition()->AsConstant()->value())
+              .value();
     }
   } else {
     type_args = call->ArgumentAt(1);
     type = AbstractType::Cast(call->ArgumentAt(2)->AsConstant()->value()).raw();
-    negate = Bool::Cast(call->ArgumentAt(3)->OriginalDefinition()
-        ->AsConstant()->value()).value();
+    negate =
+        Bool::Cast(
+            call->ArgumentAt(3)->OriginalDefinition()->AsConstant()->value())
+            .value();
   }
   const ICData& unary_checks =
       ICData::ZoneHandle(Z, call->ic_data()->AsUnaryClassChecks());
   if ((unary_checks.NumberOfChecks() > 0) &&
       (unary_checks.NumberOfChecks() <= FLAG_max_polymorphic_checks)) {
     ZoneGrowableArray<intptr_t>* results =
-        new(Z) ZoneGrowableArray<intptr_t>(unary_checks.NumberOfChecks() * 2);
+        new (Z) ZoneGrowableArray<intptr_t>(unary_checks.NumberOfChecks() * 2);
     Bool& as_bool =
         Bool::ZoneHandle(Z, InstanceOfAsBool(unary_checks, type, results));
     if (as_bool.IsNull()) {
       if (results->length() == unary_checks.NumberOfChecks() * 2) {
         const bool can_deopt = TryExpandTestCidsResult(results, type);
-        TestCidsInstr* test_cids = new(Z) TestCidsInstr(
-            call->token_pos(),
-            negate ? Token::kISNOT : Token::kIS,
-            new(Z) Value(left),
-            *results,
+        TestCidsInstr* test_cids = new (Z) TestCidsInstr(
+            call->token_pos(), negate ? Token::kISNOT : Token::kIS,
+            new (Z) Value(left), *results,
             can_deopt ? call->deopt_id() : Thread::kNoDeoptId);
         // Remove type.
         ReplaceCall(call, test_cids);
@@ -1557,33 +1439,23 @@
   }
 
   if (TypeCheckAsClassEquality(type)) {
-    LoadClassIdInstr* left_cid = new(Z) LoadClassIdInstr(new(Z) Value(left));
-    InsertBefore(call,
-                 left_cid,
-                 NULL,
-                 FlowGraph::kValue);
+    LoadClassIdInstr* left_cid = new (Z) LoadClassIdInstr(new (Z) Value(left));
+    InsertBefore(call, left_cid, NULL, FlowGraph::kValue);
     const intptr_t type_cid = Class::Handle(Z, type.type_class()).id();
     ConstantInstr* cid =
         flow_graph()->GetConstant(Smi::Handle(Z, Smi::New(type_cid)));
 
-    StrictCompareInstr* check_cid =
-        new(Z) StrictCompareInstr(
-            call->token_pos(),
-            negate ? Token::kNE_STRICT : Token::kEQ_STRICT,
-            new(Z) Value(left_cid),
-            new(Z) Value(cid),
-            false);  // No number check.
+    StrictCompareInstr* check_cid = new (Z) StrictCompareInstr(
+        call->token_pos(), negate ? Token::kNE_STRICT : Token::kEQ_STRICT,
+        new (Z) Value(left_cid), new (Z) Value(cid),
+        false);  // No number check.
     ReplaceCall(call, check_cid);
     return;
   }
 
-  InstanceOfInstr* instance_of =
-      new(Z) InstanceOfInstr(call->token_pos(),
-                             new(Z) Value(left),
-                             new(Z) Value(type_args),
-                             type,
-                             negate,
-                             call->deopt_id());
+  InstanceOfInstr* instance_of = new (Z)
+      InstanceOfInstr(call->token_pos(), new (Z) Value(left),
+                      new (Z) Value(type_args), type, negate, call->deopt_id());
   ReplaceCall(call, instance_of);
 }
 
@@ -1601,9 +1473,9 @@
   if ((unary_checks.NumberOfChecks() > 0) &&
       (unary_checks.NumberOfChecks() <= FLAG_max_polymorphic_checks)) {
     ZoneGrowableArray<intptr_t>* results =
-        new(Z) ZoneGrowableArray<intptr_t>(unary_checks.NumberOfChecks() * 2);
-    const Bool& as_bool = Bool::ZoneHandle(Z,
-        InstanceOfAsBool(unary_checks, type, results));
+        new (Z) ZoneGrowableArray<intptr_t>(unary_checks.NumberOfChecks() * 2);
+    const Bool& as_bool =
+        Bool::ZoneHandle(Z, InstanceOfAsBool(unary_checks, type, results));
     if (as_bool.raw() == Bool::True().raw()) {
       AddReceiverCheck(call);
       // Remove the original push arguments.
@@ -1619,13 +1491,9 @@
       return;
     }
   }
-  AssertAssignableInstr* assert_as =
-      new(Z) AssertAssignableInstr(call->token_pos(),
-                                   new(Z) Value(left),
-                                   new(Z) Value(type_args),
-                                   type,
-                                   Symbols::InTypeCast(),
-                                   call->deopt_id());
+  AssertAssignableInstr* assert_as = new (Z) AssertAssignableInstr(
+      call->token_pos(), new (Z) Value(left), new (Z) Value(type_args), type,
+      Symbols::InTypeCast(), call->deopt_id());
   ReplaceCall(call, assert_as);
 }
 
@@ -1654,10 +1522,9 @@
 
   const bool is_dense = CheckClassInstr::IsDenseCidRange(unary_checks);
   const intptr_t max_checks = (op_kind == Token::kEQ)
-      ? FLAG_max_equality_polymorphic_checks
-      : FLAG_max_polymorphic_checks;
-  if ((unary_checks.NumberOfChecks() > max_checks) &&
-      !is_dense &&
+                                  ? FLAG_max_equality_polymorphic_checks
+                                  : FLAG_max_polymorphic_checks;
+  if ((unary_checks.NumberOfChecks() > max_checks) && !is_dense &&
       flow_graph()->InstanceCallNeedsClassCheck(
           instr, RawFunction::kRegularFunction)) {
     // Too many checks, it will be megamorphic which needs unary checks.
@@ -1705,12 +1572,10 @@
   if (has_one_target) {
     // Check if the single target is a polymorphic target, if it is,
     // we don't have one target.
-    const Function& target =
-        Function::Handle(Z, unary_checks.GetTargetAt(0));
+    const Function& target = Function::Handle(Z, unary_checks.GetTargetAt(0));
     if (target.recognized_kind() == MethodRecognizer::kObjectRuntimeType) {
-      has_one_target =
-          PolymorphicInstanceCallInstr::ComputeRuntimeType(unary_checks) !=
-              Type::null();
+      has_one_target = PolymorphicInstanceCallInstr::ComputeRuntimeType(
+                           unary_checks) != Type::null();
     } else {
       const bool polymorphic_target =
           MethodRecognizer::PolymorphicTarget(target);
@@ -1723,9 +1588,9 @@
     const RawFunction::Kind function_kind = target.kind();
     if (!flow_graph()->InstanceCallNeedsClassCheck(instr, function_kind)) {
       PolymorphicInstanceCallInstr* call =
-          new(Z) PolymorphicInstanceCallInstr(instr, unary_checks,
-                                              /* call_with_checks = */ false,
-                                              /* complete = */ false);
+          new (Z) PolymorphicInstanceCallInstr(instr, unary_checks,
+                                               /* call_with_checks = */ false,
+                                               /* complete = */ false);
       instr->ReplaceWith(call, current_iterator());
       return;
     }
@@ -1742,10 +1607,9 @@
     } else {
       call_with_checks = true;
     }
-    PolymorphicInstanceCallInstr* call =
-        new(Z) PolymorphicInstanceCallInstr(instr, unary_checks,
-                                            call_with_checks,
-                                            /* complete = */ false);
+    PolymorphicInstanceCallInstr* call = new (Z)
+        PolymorphicInstanceCallInstr(instr, unary_checks, call_with_checks,
+                                     /* complete = */ false);
     instr->ReplaceWith(call, current_iterator());
   }
 }
@@ -1783,37 +1647,27 @@
     case MethodRecognizer::kMathMax: {
       // We can handle only monomorphic min/max call sites with both arguments
       // being either doubles or smis.
-      if (CanUnboxDouble() &&
-          call->HasICData() &&
+      if (CanUnboxDouble() && call->HasICData() &&
           (call->ic_data()->NumberOfChecks() == 1)) {
         const ICData& ic_data = *call->ic_data();
         intptr_t result_cid = kIllegalCid;
-        if (ICDataHasReceiverArgumentClassIds(ic_data,
-                                              kDoubleCid, kDoubleCid)) {
+        if (ICDataHasReceiverArgumentClassIds(ic_data, kDoubleCid,
+                                              kDoubleCid)) {
           result_cid = kDoubleCid;
-        } else if (ICDataHasReceiverArgumentClassIds(ic_data,
-                                                     kSmiCid, kSmiCid)) {
+        } else if (ICDataHasReceiverArgumentClassIds(ic_data, kSmiCid,
+                                                     kSmiCid)) {
           result_cid = kSmiCid;
         }
         if (result_cid != kIllegalCid) {
-          MathMinMaxInstr* min_max = new(Z) MathMinMaxInstr(
-              recognized_kind,
-              new(Z) Value(call->ArgumentAt(0)),
-              new(Z) Value(call->ArgumentAt(1)),
-              call->deopt_id(),
-              result_cid);
+          MathMinMaxInstr* min_max = new (Z) MathMinMaxInstr(
+              recognized_kind, new (Z) Value(call->ArgumentAt(0)),
+              new (Z) Value(call->ArgumentAt(1)), call->deopt_id(), result_cid);
           const ICData& unary_checks =
               ICData::ZoneHandle(Z, ic_data.AsUnaryClassChecks());
-          AddCheckClass(min_max->left()->definition(),
-                        unary_checks,
-                        call->deopt_id(),
-                        call->env(),
-                        call);
-          AddCheckClass(min_max->right()->definition(),
-                        unary_checks,
-                        call->deopt_id(),
-                        call->env(),
-                        call);
+          AddCheckClass(min_max->left()->definition(), unary_checks,
+                        call->deopt_id(), call->env(), call);
+          AddCheckClass(min_max->right()->definition(), unary_checks,
+                        call->deopt_id(), call->env(), call);
           ReplaceCall(call, min_max);
         }
       }
@@ -1827,15 +1681,13 @@
           if (ArgIsAlways(kSmiCid, ic_data, 1)) {
             Definition* arg = call->ArgumentAt(1);
             AddCheckSmi(arg, call->deopt_id(), call->env(), call);
-            ReplaceCall(call,
-                        new(Z) SmiToDoubleInstr(new(Z) Value(arg),
-                                                call->token_pos()));
+            ReplaceCall(call, new (Z) SmiToDoubleInstr(new (Z) Value(arg),
+                                                       call->token_pos()));
           } else if (ArgIsAlways(kMintCid, ic_data, 1) &&
                      CanConvertUnboxedMintToDouble()) {
             Definition* arg = call->ArgumentAt(1);
-            ReplaceCall(call,
-                        new(Z) MintToDoubleInstr(new(Z) Value(arg),
-                                                 call->deopt_id()));
+            ReplaceCall(call, new (Z) MintToDoubleInstr(new (Z) Value(arg),
+                                                        call->deopt_id()));
           }
         }
       }
@@ -1847,8 +1699,7 @@
 }
 
 
-void JitOptimizer::VisitStoreInstanceField(
-    StoreInstanceFieldInstr* instr) {
+void JitOptimizer::VisitStoreInstanceField(StoreInstanceFieldInstr* instr) {
   if (instr->IsUnboxedStore()) {
     // Determine if this field should be unboxed based on the usage of getter
     // and setter functions: The heuristic requires that the setter has a
@@ -1868,7 +1719,7 @@
         unboxed_field = true;
       } else if ((setter.usage_counter() > 0) &&
                  ((FLAG_getter_setter_ratio * setter.usage_counter()) >=
-                   getter.usage_counter())) {
+                  getter.usage_counter())) {
         unboxed_field = true;
       }
     }
@@ -1879,8 +1730,8 @@
       // - deoptimize dependent code.
       if (Compiler::IsBackgroundCompilation()) {
         isolate()->AddDeoptimizingBoxedField(field);
-        Compiler::AbortBackgroundCompilation(Thread::kNoDeoptId,
-            "Unboxing instance field while compiling");
+        Compiler::AbortBackgroundCompilation(
+            Thread::kNoDeoptId, "Unboxing instance field while compiling");
         UNREACHABLE();
       }
       if (FLAG_trace_optimization || FLAG_trace_field_guards) {
@@ -1910,24 +1761,20 @@
                                             instr->num_context_variables());
   instr->ReplaceWith(replacement, current_iterator());
 
-  StoreInstanceFieldInstr* store =
-      new(Z) StoreInstanceFieldInstr(Context::parent_offset(),
-                                     new Value(replacement),
-                                     new Value(flow_graph_->constant_null()),
-                                     kNoStoreBarrier,
-                                     instr->token_pos());
+  StoreInstanceFieldInstr* store = new (Z)
+      StoreInstanceFieldInstr(Context::parent_offset(), new Value(replacement),
+                              new Value(flow_graph_->constant_null()),
+                              kNoStoreBarrier, instr->token_pos());
   // Storing into uninitialized memory; remember to prevent dead store
   // elimination and ensure proper GC barrier.
   store->set_is_initialization(true);
   flow_graph_->InsertAfter(replacement, store, NULL, FlowGraph::kEffect);
   Definition* cursor = store;
   for (intptr_t i = 0; i < instr->num_context_variables(); ++i) {
-    store =
-        new(Z) StoreInstanceFieldInstr(Context::variable_offset(i),
-                                       new Value(replacement),
-                                       new Value(flow_graph_->constant_null()),
-                                       kNoStoreBarrier,
-                                       instr->token_pos());
+    store = new (Z) StoreInstanceFieldInstr(
+        Context::variable_offset(i), new Value(replacement),
+        new Value(flow_graph_->constant_null()), kNoStoreBarrier,
+        instr->token_pos());
     // Storing into uninitialized memory; remember to prevent dead store
     // elimination and ensure proper GC barrier.
     store->set_is_initialization(true);
@@ -1938,10 +1785,9 @@
 
 
 void JitOptimizer::VisitLoadCodeUnits(LoadCodeUnitsInstr* instr) {
-  // TODO(zerny): Use kUnboxedUint32 once it is fully supported/optimized.
+// TODO(zerny): Use kUnboxedUint32 once it is fully supported/optimized.
 #if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_ARM)
-  if (!instr->can_pack_into_smi())
-    instr->set_representation(kUnboxedMint);
+  if (!instr->can_pack_into_smi()) instr->set_representation(kUnboxedMint);
 #endif
 }
 
@@ -1949,7 +1795,7 @@
 bool JitOptimizer::TryInlineInstanceSetter(InstanceCallInstr* instr,
                                            const ICData& unary_ic_data) {
   ASSERT((unary_ic_data.NumberOfChecks() > 0) &&
-      (unary_ic_data.NumArgsTested() == 1));
+         (unary_ic_data.NumArgsTested() == 1));
   if (I->type_checks()) {
     // Checked mode setters are inlined like normal methods by conventional
     // inlining.
@@ -1976,43 +1822,34 @@
   // Inline implicit instance setter.
   const String& field_name =
       String::Handle(Z, Field::NameFromSetter(instr->function_name()));
-  const Field& field =
-      Field::ZoneHandle(Z, GetField(class_id, field_name));
+  const Field& field = Field::ZoneHandle(Z, GetField(class_id, field_name));
   ASSERT(!field.IsNull());
 
-  if (flow_graph()->InstanceCallNeedsClassCheck(
-          instr, RawFunction::kImplicitSetter)) {
+  if (flow_graph()->InstanceCallNeedsClassCheck(instr,
+                                                RawFunction::kImplicitSetter)) {
     AddReceiverCheck(instr);
   }
   if (field.guarded_cid() != kDynamicCid) {
     ASSERT(FLAG_use_field_guards);
-    InsertBefore(instr,
-                 new(Z) GuardFieldClassInstr(
-                     new(Z) Value(instr->ArgumentAt(1)),
-                      field,
-                      instr->deopt_id()),
-                 instr->env(),
-                 FlowGraph::kEffect);
+    InsertBefore(
+        instr, new (Z) GuardFieldClassInstr(new (Z) Value(instr->ArgumentAt(1)),
+                                            field, instr->deopt_id()),
+        instr->env(), FlowGraph::kEffect);
   }
 
   if (field.needs_length_check()) {
     ASSERT(FLAG_use_field_guards);
-    InsertBefore(instr,
-                 new(Z) GuardFieldLengthInstr(
-                     new(Z) Value(instr->ArgumentAt(1)),
-                      field,
-                      instr->deopt_id()),
-                 instr->env(),
-                 FlowGraph::kEffect);
+    InsertBefore(instr, new (Z) GuardFieldLengthInstr(
+                            new (Z) Value(instr->ArgumentAt(1)), field,
+                            instr->deopt_id()),
+                 instr->env(), FlowGraph::kEffect);
   }
 
   // Field guard was detached.
-  StoreInstanceFieldInstr* store = new(Z) StoreInstanceFieldInstr(
-      field,
-      new(Z) Value(instr->ArgumentAt(0)),
-      new(Z) Value(instr->ArgumentAt(1)),
-      kEmitStoreBarrier,
-      instr->token_pos());
+  StoreInstanceFieldInstr* store = new (Z)
+      StoreInstanceFieldInstr(field, new (Z) Value(instr->ArgumentAt(0)),
+                              new (Z) Value(instr->ArgumentAt(1)),
+                              kEmitStoreBarrier, instr->token_pos());
 
   if (store->IsUnboxedStore()) {
     flow_graph()->parsed_function().AddToGuardedFields(&field);
diff --git a/runtime/vm/jit_optimizer.h b/runtime/vm/jit_optimizer.h
index 462c1df..cc6ac93 100644
--- a/runtime/vm/jit_optimizer.h
+++ b/runtime/vm/jit_optimizer.h
@@ -11,14 +11,15 @@
 namespace dart {
 
 class CSEInstructionMap;
-template <typename T> class GrowableArray;
+template <typename T>
+class GrowableArray;
 class ParsedFunction;
 
 class JitOptimizer : public FlowGraphVisitor {
  public:
   explicit JitOptimizer(FlowGraph* flow_graph)
       : FlowGraphVisitor(flow_graph->reverse_postorder()),
-        flow_graph_(flow_graph) { }
+        flow_graph_(flow_graph) {}
 
   virtual ~JitOptimizer() {}
 
@@ -101,12 +102,9 @@
   bool InstanceCallNeedsClassCheck(InstanceCallInstr* call,
                                    RawFunction::Kind kind) const;
 
-  bool InlineFloat32x4BinaryOp(InstanceCallInstr* call,
-                               Token::Kind op_kind);
-  bool InlineInt32x4BinaryOp(InstanceCallInstr* call,
-                              Token::Kind op_kind);
-  bool InlineFloat64x2BinaryOp(InstanceCallInstr* call,
-                               Token::Kind op_kind);
+  bool InlineFloat32x4BinaryOp(InstanceCallInstr* call, Token::Kind op_kind);
+  bool InlineInt32x4BinaryOp(InstanceCallInstr* call, Token::Kind op_kind);
+  bool InlineFloat64x2BinaryOp(InstanceCallInstr* call, Token::Kind op_kind);
   bool InlineImplicitInstanceGetter(InstanceCallInstr* call);
 
   RawBool* InstanceOfAsBool(const ICData& ic_data,
diff --git a/runtime/vm/json_stream.cc b/runtime/vm/json_stream.cc
index e26c915..8310e70 100644
--- a/runtime/vm/json_stream.cc
+++ b/runtime/vm/json_stream.cc
@@ -65,8 +65,7 @@
 }
 
 
-JSONStream::~JSONStream() {
-}
+JSONStream::~JSONStream() {}
 
 
 void JSONStream::Setup(Zone* zone,
@@ -168,8 +167,7 @@
 }
 
 
-void JSONStream::PrintError(intptr_t code,
-                            const char* details_format, ...) {
+void JSONStream::PrintError(intptr_t code, const char* details_format, ...) {
   SetupError();
   JSONObject jsobj(this);
   jsobj.AddProperty("code", code);
@@ -196,8 +194,8 @@
 
 
 void JSONStream::PostNullReply(Dart_Port port) {
-  PortMap::PostMessage(new Message(
-      port, Object::null(), Message::kNormalPriority));
+  PortMap::PostMessage(
+      new Message(port, Object::null(), Message::kNormalPriority));
 }
 
 
@@ -262,11 +260,13 @@
     const char* isolate_name = isolate->name();
     int64_t total_time = OS::GetCurrentTimeMicros() - setup_time_micros_;
     if (result) {
-      OS::Print("[+%" Pd64 "ms] Isolate %s processed service request %s "
+      OS::Print("[+%" Pd64
+                "ms] Isolate %s processed service request %s "
                 "(%" Pd64 "us)\n",
                 Dart::timestamp(), isolate_name, method_, total_time);
     } else {
-      OS::Print("[+%" Pd64 "ms] Isolate %s processed service request %s "
+      OS::Print("[+%" Pd64
+                "ms] Isolate %s processed service request %s "
                 "(%" Pd64 "us) FAILED\n",
                 Dart::timestamp(), isolate_name, method_, total_time);
     }
@@ -417,7 +417,7 @@
 
 
 static const char base64_digits[65] =
-  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
 static const char base64_pad = '=';
 
 
@@ -484,9 +484,9 @@
   va_start(args, format);
   intptr_t len = OS::VSNPrint(NULL, 0, format, args);
   va_end(args);
-  char* p = reinterpret_cast<char*>(malloc(len+1));
+  char* p = reinterpret_cast<char*>(malloc(len + 1));
   va_start(args, format);
-  intptr_t len2 = OS::VSNPrint(p, len+1, format, args);
+  intptr_t len2 = OS::VSNPrint(p, len + 1, format, args);
   va_end(args);
   ASSERT(len == len2);
   buffer_.AddChar('"');
@@ -681,9 +681,9 @@
   va_start(args, format);
   intptr_t len = OS::VSNPrint(NULL, 0, format, args);
   va_end(args);
-  char* p = reinterpret_cast<char*>(malloc(len+1));
+  char* p = reinterpret_cast<char*>(malloc(len + 1));
   va_start(args, format);
-  intptr_t len2 = OS::VSNPrint(p, len+1, format, args);
+  intptr_t len2 = OS::VSNPrint(p, len + 1, format, args);
   va_end(args);
   ASSERT(len == len2);
   buffer_.AddChar('"');
@@ -786,7 +786,7 @@
   if (length == 0) {
     return false;
   }
-  char ch = buffer[length-1];
+  char ch = buffer[length - 1];
   return (ch != '[') && (ch != '{') && (ch != ':') && (ch != ',');
 }
 
@@ -794,8 +794,10 @@
 void JSONStream::EnsureIntegerIsRepresentableInJavaScript(int64_t i) {
 #ifdef DEBUG
   if (!Utils::IsJavascriptInt(i)) {
-    OS::Print("JSONStream::EnsureIntegerIsRepresentableInJavaScript failed on "
-              "%" Pd64 "\n", i);
+    OS::Print(
+        "JSONStream::EnsureIntegerIsRepresentableInJavaScript failed on "
+        "%" Pd64 "\n",
+        i);
     UNREACHABLE();
   }
 #endif
@@ -817,7 +819,7 @@
   }
   const uint8_t* s8 = reinterpret_cast<const uint8_t*>(s);
   intptr_t i = 0;
-  for (; i < len; ) {
+  for (; i < len;) {
     // Extract next UTF8 character.
     int32_t ch = 0;
     int32_t ch_len = Utf8::Decode(&s8[i], len - i, &ch);
@@ -850,7 +852,7 @@
       if (i + 1 == limit) {
         buffer_.EscapeAndAddUTF16CodeUnit(code_unit);
       } else {
-        uint16_t next_code_unit = s.CharAt(i+1);
+        uint16_t next_code_unit = s.CharAt(i + 1);
         if (Utf16::IsTrailSurrogate(next_code_unit)) {
           uint32_t decoded = Utf16::Decode(code_unit, next_code_unit);
           buffer_.EscapeAndAddCodeUnit(decoded);
@@ -882,9 +884,9 @@
   va_start(args, format);
   intptr_t len = OS::VSNPrint(NULL, 0, format, args);
   va_end(args);
-  char* p = reinterpret_cast<char*>(malloc(len+1));
+  char* p = reinterpret_cast<char*>(malloc(len + 1));
   va_start(args, format);
-  intptr_t len2 = OS::VSNPrint(p, len+1, format, args);
+  intptr_t len2 = OS::VSNPrint(p, len + 1, format, args);
   va_end(args);
   ASSERT(len == len2);
   stream_->buffer_.AddChar('"');
@@ -941,8 +943,7 @@
     // This unresolved breakpoint was specified at a particular line.
     location.AddProperty("line", bpt_loc->requested_line_number());
     if (bpt_loc->requested_column_number() >= 0) {
-      location.AddProperty("column",
-                           bpt_loc->requested_column_number());
+      location.AddProperty("column", bpt_loc->requested_column_number());
     }
   } else {
     // This unresolved breakpoint was requested at some function entry.
@@ -951,16 +952,15 @@
 }
 
 
-void JSONObject::AddPropertyF(const char* name,
-                              const char* format, ...) const {
+void JSONObject::AddPropertyF(const char* name, const char* format, ...) const {
   stream_->PrintPropertyName(name);
   va_list args;
   va_start(args, format);
   intptr_t len = OS::VSNPrint(NULL, 0, format, args);
   va_end(args);
-  char* p = reinterpret_cast<char*>(malloc(len+1));
+  char* p = reinterpret_cast<char*>(malloc(len + 1));
   va_start(args, format);
-  intptr_t len2 = OS::VSNPrint(p, len+1, format, args);
+  intptr_t len2 = OS::VSNPrint(p, len + 1, format, args);
   va_end(args);
   ASSERT(len == len2);
   stream_->buffer_.AddChar('"');
@@ -976,9 +976,9 @@
   va_start(args, format);
   intptr_t len = OS::VSNPrint(NULL, 0, format, args);
   va_end(args);
-  char* p = reinterpret_cast<char*>(malloc(len+1));
+  char* p = reinterpret_cast<char*>(malloc(len + 1));
   va_start(args, format);
-  intptr_t len2 = OS::VSNPrint(p, len+1, format, args);
+  intptr_t len2 = OS::VSNPrint(p, len + 1, format, args);
   va_end(args);
   ASSERT(len == len2);
   stream_->buffer_.AddChar('"');
diff --git a/runtime/vm/json_stream.h b/runtime/vm/json_stream.h
index 17daf88..b54bfb2 100644
--- a/runtime/vm/json_stream.h
+++ b/runtime/vm/json_stream.h
@@ -39,28 +39,28 @@
 //  - runtime/observatory/lib/src/service/object.dart
 //
 enum JSONRpcErrorCode {
-  kParseError     = -32700,
+  kParseError = -32700,
   kInvalidRequest = -32600,
   kMethodNotFound = -32601,
-  kInvalidParams  = -32602,
-  kInternalError  = -32603,
+  kInvalidParams = -32602,
+  kInternalError = -32603,
 
   kExtensionError = -32000,
 
-  kFeatureDisabled           = 100,
-  kCannotAddBreakpoint       = 102,
-  kStreamAlreadySubscribed   = 103,
-  kStreamNotSubscribed       = 104,
-  kIsolateMustBeRunnable     = 105,
-  kIsolateMustBePaused       = 106,
+  kFeatureDisabled = 100,
+  kCannotAddBreakpoint = 102,
+  kStreamAlreadySubscribed = 103,
+  kStreamNotSubscribed = 104,
+  kIsolateMustBeRunnable = 105,
+  kIsolateMustBePaused = 106,
 
   // Experimental (used in private rpcs).
-  kIsolateIsReloading        = 1000,
-  kFileSystemAlreadyExists   = 1001,
-  kFileSystemDoesNotExist    = 1002,
-  kFileDoesNotExist          = 1003,
-  kIsolateReloadFailed       = 1004,
-  kIsolateReloadBarred       = 1005,
+  kIsolateIsReloading = 1000,
+  kFileSystemAlreadyExists = 1001,
+  kFileSystemDoesNotExist = 1002,
+  kFileDoesNotExist = 1003,
+  kIsolateReloadFailed = 1004,
+  kIsolateReloadBarred = 1005,
 };
 
 // Expected that user_data is a JSONStream*.
@@ -88,12 +88,8 @@
 
   void PostReply();
 
-  void set_id_zone(ServiceIdZone* id_zone) {
-    id_zone_ = id_zone;
-  }
-  ServiceIdZone* id_zone() {
-    return id_zone_;
-  }
+  void set_id_zone(ServiceIdZone* id_zone) { id_zone_ = id_zone; }
+  ServiceIdZone* id_zone() { return id_zone_; }
 
   TextBuffer* buffer() { return &buffer_; }
   const char* ToCString() { return buffer_.buf(); }
@@ -102,7 +98,8 @@
 
   void set_reply_port(Dart_Port port);
 
-  void SetParams(const char** param_keys, const char** param_values,
+  void SetParams(const char** param_keys,
+                 const char** param_values,
                  intptr_t num_params);
 
   Dart_Port reply_port() const { return reply_port_; }
@@ -113,12 +110,8 @@
   RawObject* LookupObjectParam(const char* key) const;
 
   intptr_t num_params() const { return num_params_; }
-  const char* GetParamKey(intptr_t i) const {
-    return param_keys_[i];
-  }
-  const char* GetParamValue(intptr_t i) const {
-    return param_values_[i];
-  }
+  const char* GetParamKey(intptr_t i) const { return param_keys_[i]; }
+  const char* GetParamValue(intptr_t i) const { return param_values_[i]; }
 
   const char* LookupParam(const char* key) const;
 
@@ -152,8 +145,7 @@
   void PrintCommaIfNeeded();
 
   // Append |buffer| to the stream.
-  void AppendSerializedObject(const uint8_t* buffer,
-                              intptr_t buffer_length);
+  void AppendSerializedObject(const uint8_t* buffer, intptr_t buffer_length);
 
   // Append |serialized_object| to the stream with |property_name|.
   void AppendSerializedObject(const char* property_name,
@@ -204,11 +196,13 @@
                            const uint8_t* bytes,
                            intptr_t length);
   void PrintProperty(const char* name, const char* s);
-  bool PrintPropertyStr(const char* name, const String& s,
-                        intptr_t offset, intptr_t count);
+  bool PrintPropertyStr(const char* name,
+                        const String& s,
+                        intptr_t offset,
+                        intptr_t count);
   void PrintPropertyNoEscape(const char* name, const char* s);
   void PrintfProperty(const char* name, const char* format, ...)
-  PRINTF_ATTRIBUTE(3, 4);
+      PRINTF_ATTRIBUTE(3, 4);
   void PrintProperty(const char* name, const Object& o, bool ref = true);
 
   void PrintProperty(const char* name, const ServiceEvent* event);
@@ -265,13 +259,9 @@
   }
   explicit JSONObject(const JSONArray* arr);
 
-  ~JSONObject() {
-    stream_->CloseObject();
-  }
+  ~JSONObject() { stream_->CloseObject(); }
 
-  void AddServiceId(const Object& o) const {
-    stream_->PrintServiceId(o);
-  }
+  void AddServiceId(const Object& o) const { stream_->PrintServiceId(o); }
 
   void AddFixedServiceId(const char* format, ...) const PRINTF_ATTRIBUTE(2, 3);
 
@@ -375,9 +365,7 @@
   explicit JSONArray(const JSONArray* arr) : stream_(arr->stream_) {
     stream_->OpenArray();
   }
-  ~JSONArray() {
-    stream_->CloseArray();
-  }
+  ~JSONArray() { stream_->CloseArray(); }
 
   void AddValueNull() const { stream_->PrintValueNull(); }
   void AddValue(bool b) const { stream_->PrintValueBool(b); }
@@ -397,30 +385,18 @@
   void AddValue(Isolate* isolate, bool ref = true) const {
     stream_->PrintValue(isolate, ref);
   }
-  void AddValue(Breakpoint* bpt) const {
-    stream_->PrintValue(bpt);
-  }
-  void AddValue(TokenPosition tp) const {
-    stream_->PrintValue(tp);
-  }
-  void AddValue(const ServiceEvent* event) const {
-    stream_->PrintValue(event);
-  }
-  void AddValue(Metric* metric) const {
-    stream_->PrintValue(metric);
-  }
-  void AddValue(MessageQueue* queue) const {
-    stream_->PrintValue(queue);
-  }
+  void AddValue(Breakpoint* bpt) const { stream_->PrintValue(bpt); }
+  void AddValue(TokenPosition tp) const { stream_->PrintValue(tp); }
+  void AddValue(const ServiceEvent* event) const { stream_->PrintValue(event); }
+  void AddValue(Metric* metric) const { stream_->PrintValue(metric); }
+  void AddValue(MessageQueue* queue) const { stream_->PrintValue(queue); }
   void AddValue(const TimelineEvent* timeline_event) const {
     stream_->PrintValue(timeline_event);
   }
   void AddValue(const TimelineEventBlock* timeline_event_block) const {
     stream_->PrintValue(timeline_event_block);
   }
-  void AddValueVM(bool ref = true) const {
-    stream_->PrintValueVM(ref);
-  }
+  void AddValueVM(bool ref = true) const { stream_->PrintValueVM(ref); }
   void AddValueF(const char* format, ...) const PRINTF_ATTRIBUTE(2, 3);
 
  private:
diff --git a/runtime/vm/json_test.cc b/runtime/vm/json_test.cc
index a0b27c2..372ec2b 100644
--- a/runtime/vm/json_test.cc
+++ b/runtime/vm/json_test.cc
@@ -24,16 +24,12 @@
 TEST_CASE(JSON_JSONStream_Primitives) {
   {
     JSONStream js;
-    {
-      JSONObject jsobj(&js);
-    }
+    { JSONObject jsobj(&js); }
     EXPECT_STREQ("{}", js.ToCString());
   }
   {
     JSONStream js;
-    {
-      JSONArray jsarr(&js);
-    }
+    { JSONArray jsarr(&js); }
     EXPECT_STREQ("[]", js.ToCString());
   }
   {
@@ -183,24 +179,25 @@
   }
   char buffer[1024];
   ElideJSONSubstring("classes", js.ToCString(), buffer);
-  EXPECT_STREQ("[{\"type\":\"@Instance\","
-               "\"_vmType\":\"null\","
-               "\"class\":{\"type\":\"@Class\",\"fixedId\":true,\"id\":\"\","
-               "\"name\":\"Null\"},"
-               "\"kind\":\"Null\","
-               "\"fixedId\":true,"
-               "\"id\":\"objects\\/null\","
-               "\"valueAsString\":\"null\"},"
-               "{\"object_key\":"
-               "{\"type\":\"@Instance\","
-               "\"_vmType\":\"null\","
-               "\"class\":{\"type\":\"@Class\",\"fixedId\":true,\"id\":\"\","
-               "\"name\":\"Null\"},"
-               "\"kind\":\"Null\","
-               "\"fixedId\":true,"
-               "\"id\":\"objects\\/null\","
-               "\"valueAsString\":\"null\"}}]",
-               buffer);
+  EXPECT_STREQ(
+      "[{\"type\":\"@Instance\","
+      "\"_vmType\":\"null\","
+      "\"class\":{\"type\":\"@Class\",\"fixedId\":true,\"id\":\"\","
+      "\"name\":\"Null\"},"
+      "\"kind\":\"Null\","
+      "\"fixedId\":true,"
+      "\"id\":\"objects\\/null\","
+      "\"valueAsString\":\"null\"},"
+      "{\"object_key\":"
+      "{\"type\":\"@Instance\","
+      "\"_vmType\":\"null\","
+      "\"class\":{\"type\":\"@Class\",\"fixedId\":true,\"id\":\"\","
+      "\"name\":\"Null\"},"
+      "\"kind\":\"Null\","
+      "\"fixedId\":true,"
+      "\"id\":\"objects\\/null\","
+      "\"valueAsString\":\"null\"}}]",
+      buffer);
 }
 
 TEST_CASE(JSON_JSONStream_EscapedString) {
@@ -338,16 +335,13 @@
       const char* test_data = "{a, b, c},";
       AppendJSONStreamConsumer(Dart_StreamConsumer_kData, "",
                                reinterpret_cast<const uint8_t*>(&test_data[0]),
-                               strlen(test_data),
-                               &js);
+                               strlen(test_data), &js);
       AppendJSONStreamConsumer(Dart_StreamConsumer_kData, "",
                                reinterpret_cast<const uint8_t*>(&test_data[0]),
-                               strlen(test_data),
-                               &js);
+                               strlen(test_data), &js);
       AppendJSONStreamConsumer(Dart_StreamConsumer_kData, "",
                                reinterpret_cast<const uint8_t*>(&test_data[0]),
-                               strlen(test_data) - 1,
-                               &js);
+                               strlen(test_data) - 1, &js);
     }
   }
 
diff --git a/runtime/vm/kernel.cc b/runtime/vm/kernel.cc
index 340b60d..d632349 100644
--- a/runtime/vm/kernel.cc
+++ b/runtime/vm/kernel.cc
@@ -23,7 +23,9 @@
 TreeNode::~TreeNode() {}
 
 
-void TreeNode::AcceptVisitor(Visitor* visitor) { AcceptTreeVisitor(visitor); }
+void TreeNode::AcceptVisitor(Visitor* visitor) {
+  AcceptTreeVisitor(visitor);
+}
 
 
 Library::~Library() {}
@@ -1072,7 +1074,9 @@
 Name::~Name() {}
 
 
-void Name::AcceptVisitor(Visitor* visitor) { visitor->VisitName(this); }
+void Name::AcceptVisitor(Visitor* visitor) {
+  visitor->VisitName(this);
+}
 
 
 void Name::VisitChildren(Visitor* visitor) {}
diff --git a/runtime/vm/kernel.h b/runtime/vm/kernel.h
index 5133ce9..09e9f709 100644
--- a/runtime/vm/kernel.h
+++ b/runtime/vm/kernel.h
@@ -9,116 +9,116 @@
 #include "vm/allocation.h"
 #include "vm/globals.h"
 
-#define KERNEL_NODES_DO(M) \
-  M(Name)                  \
-  M(InferredValue)         \
-  M(DartType)              \
-  M(InvalidType)           \
-  M(DynamicType)           \
-  M(VoidType)              \
-  M(InterfaceType)         \
-  M(FunctionType)          \
+#define KERNEL_NODES_DO(M)                                                     \
+  M(Name)                                                                      \
+  M(InferredValue)                                                             \
+  M(DartType)                                                                  \
+  M(InvalidType)                                                               \
+  M(DynamicType)                                                               \
+  M(VoidType)                                                                  \
+  M(InterfaceType)                                                             \
+  M(FunctionType)                                                              \
   M(TypeParameterType)
 
-#define KERNEL_TREE_NODES_DO(M) \
-  M(Library)                    \
-  M(Class)                      \
-  M(NormalClass)                \
-  M(MixinClass)                 \
-  M(Member)                     \
-  M(Field)                      \
-  M(Constructor)                \
-  M(Procedure)                  \
-  M(Initializer)                \
-  M(InvalidInitializer)         \
-  M(FieldInitializer)           \
-  M(SuperInitializer)           \
-  M(RedirectingInitializer)     \
-  M(LocalInitializer)           \
-  M(FunctionNode)               \
-  M(Expression)                 \
-  M(InvalidExpression)          \
-  M(VariableGet)                \
-  M(VariableSet)                \
-  M(PropertyGet)                \
-  M(PropertySet)                \
-  M(DirectPropertyGet)          \
-  M(DirectPropertySet)          \
-  M(StaticGet)                  \
-  M(StaticSet)                  \
-  M(Arguments)                  \
-  M(NamedExpression)            \
-  M(MethodInvocation)           \
-  M(DirectMethodInvocation)     \
-  M(StaticInvocation)           \
-  M(ConstructorInvocation)      \
-  M(Not)                        \
-  M(LogicalExpression)          \
-  M(ConditionalExpression)      \
-  M(StringConcatenation)        \
-  M(IsExpression)               \
-  M(AsExpression)               \
-  M(BasicLiteral)               \
-  M(StringLiteral)              \
-  M(BigintLiteral)              \
-  M(IntLiteral)                 \
-  M(DoubleLiteral)              \
-  M(BoolLiteral)                \
-  M(NullLiteral)                \
-  M(SymbolLiteral)              \
-  M(TypeLiteral)                \
-  M(ThisExpression)             \
-  M(Rethrow)                    \
-  M(Throw)                      \
-  M(ListLiteral)                \
-  M(MapLiteral)                 \
-  M(MapEntry)                   \
-  M(AwaitExpression)            \
-  M(FunctionExpression)         \
-  M(Let)                        \
-  M(BlockExpression)            \
-  M(Statement)                  \
-  M(InvalidStatement)           \
-  M(ExpressionStatement)        \
-  M(Block)                      \
-  M(EmptyStatement)             \
-  M(AssertStatement)            \
-  M(LabeledStatement)           \
-  M(BreakStatement)             \
-  M(WhileStatement)             \
-  M(DoStatement)                \
-  M(ForStatement)               \
-  M(ForInStatement)             \
-  M(SwitchStatement)            \
-  M(SwitchCase)                 \
-  M(ContinueSwitchStatement)    \
-  M(IfStatement)                \
-  M(ReturnStatement)            \
-  M(TryCatch)                   \
-  M(Catch)                      \
-  M(TryFinally)                 \
-  M(YieldStatement)             \
-  M(VariableDeclaration)        \
-  M(FunctionDeclaration)        \
-  M(TypeParameter)              \
+#define KERNEL_TREE_NODES_DO(M)                                                \
+  M(Library)                                                                   \
+  M(Class)                                                                     \
+  M(NormalClass)                                                               \
+  M(MixinClass)                                                                \
+  M(Member)                                                                    \
+  M(Field)                                                                     \
+  M(Constructor)                                                               \
+  M(Procedure)                                                                 \
+  M(Initializer)                                                               \
+  M(InvalidInitializer)                                                        \
+  M(FieldInitializer)                                                          \
+  M(SuperInitializer)                                                          \
+  M(RedirectingInitializer)                                                    \
+  M(LocalInitializer)                                                          \
+  M(FunctionNode)                                                              \
+  M(Expression)                                                                \
+  M(InvalidExpression)                                                         \
+  M(VariableGet)                                                               \
+  M(VariableSet)                                                               \
+  M(PropertyGet)                                                               \
+  M(PropertySet)                                                               \
+  M(DirectPropertyGet)                                                         \
+  M(DirectPropertySet)                                                         \
+  M(StaticGet)                                                                 \
+  M(StaticSet)                                                                 \
+  M(Arguments)                                                                 \
+  M(NamedExpression)                                                           \
+  M(MethodInvocation)                                                          \
+  M(DirectMethodInvocation)                                                    \
+  M(StaticInvocation)                                                          \
+  M(ConstructorInvocation)                                                     \
+  M(Not)                                                                       \
+  M(LogicalExpression)                                                         \
+  M(ConditionalExpression)                                                     \
+  M(StringConcatenation)                                                       \
+  M(IsExpression)                                                              \
+  M(AsExpression)                                                              \
+  M(BasicLiteral)                                                              \
+  M(StringLiteral)                                                             \
+  M(BigintLiteral)                                                             \
+  M(IntLiteral)                                                                \
+  M(DoubleLiteral)                                                             \
+  M(BoolLiteral)                                                               \
+  M(NullLiteral)                                                               \
+  M(SymbolLiteral)                                                             \
+  M(TypeLiteral)                                                               \
+  M(ThisExpression)                                                            \
+  M(Rethrow)                                                                   \
+  M(Throw)                                                                     \
+  M(ListLiteral)                                                               \
+  M(MapLiteral)                                                                \
+  M(MapEntry)                                                                  \
+  M(AwaitExpression)                                                           \
+  M(FunctionExpression)                                                        \
+  M(Let)                                                                       \
+  M(BlockExpression)                                                           \
+  M(Statement)                                                                 \
+  M(InvalidStatement)                                                          \
+  M(ExpressionStatement)                                                       \
+  M(Block)                                                                     \
+  M(EmptyStatement)                                                            \
+  M(AssertStatement)                                                           \
+  M(LabeledStatement)                                                          \
+  M(BreakStatement)                                                            \
+  M(WhileStatement)                                                            \
+  M(DoStatement)                                                               \
+  M(ForStatement)                                                              \
+  M(ForInStatement)                                                            \
+  M(SwitchStatement)                                                           \
+  M(SwitchCase)                                                                \
+  M(ContinueSwitchStatement)                                                   \
+  M(IfStatement)                                                               \
+  M(ReturnStatement)                                                           \
+  M(TryCatch)                                                                  \
+  M(Catch)                                                                     \
+  M(TryFinally)                                                                \
+  M(YieldStatement)                                                            \
+  M(VariableDeclaration)                                                       \
+  M(FunctionDeclaration)                                                       \
+  M(TypeParameter)                                                             \
   M(Program)
 
-#define KERNEL_ALL_NODES_DO(M) \
-  M(Node)                      \
-  KERNEL_NODES_DO(M)           \
-  M(TreeNode)                  \
+#define KERNEL_ALL_NODES_DO(M)                                                 \
+  M(Node)                                                                      \
+  KERNEL_NODES_DO(M)                                                           \
+  M(TreeNode)                                                                  \
   KERNEL_TREE_NODES_DO(M)
 
-#define KERNEL_VISITORS_DO(M) \
-  M(ExpressionVisitor)        \
-  M(StatementVisitor)         \
-  M(MemberVisitor)            \
-  M(ClassVisitor)             \
-  M(InitializerVisitor)       \
-  M(DartTypeVisitor)          \
-  M(ClassReferenceVisitor)    \
-  M(MemberReferenceVisitor)   \
-  M(TreeVisitor)              \
+#define KERNEL_VISITORS_DO(M)                                                  \
+  M(ExpressionVisitor)                                                         \
+  M(StatementVisitor)                                                          \
+  M(MemberVisitor)                                                             \
+  M(ClassVisitor)                                                              \
+  M(InitializerVisitor)                                                        \
+  M(DartTypeVisitor)                                                           \
+  M(ClassReferenceVisitor)                                                     \
+  M(MemberReferenceVisitor)                                                    \
+  M(TreeVisitor)                                                               \
   M(Visitor)
 
 namespace dart {
@@ -336,22 +336,22 @@
 #undef DO
 
 
-#define DEFINE_CASTING_OPERATIONS(klass)       \
-  virtual bool Is##klass() { return true; }    \
-                                               \
-  static klass* Cast(Node* node) {             \
-    ASSERT(node == NULL || node->Is##klass()); \
-    return static_cast<klass*>(node);          \
-  }                                            \
-                                               \
+#define DEFINE_CASTING_OPERATIONS(klass)                                       \
+  virtual bool Is##klass() { return true; }                                    \
+                                                                               \
+  static klass* Cast(Node* node) {                                             \
+    ASSERT(node == NULL || node->Is##klass());                                 \
+    return static_cast<klass*>(node);                                          \
+  }                                                                            \
+                                                                               \
   virtual Node::NodeType Type() { return Node::kType##klass; }
 
-#define DEFINE_IS_OPERATION(klass) \
+#define DEFINE_IS_OPERATION(klass)                                             \
   virtual bool Is##klass() { return false; }
 
-#define DEFINE_ALL_IS_OPERATIONS()     \
-  KERNEL_NODES_DO(DEFINE_IS_OPERATION) \
-  DEFINE_IS_OPERATION(TreeNode)        \
+#define DEFINE_ALL_IS_OPERATIONS()                                             \
+  KERNEL_NODES_DO(DEFINE_IS_OPERATION)                                         \
+  DEFINE_IS_OPERATION(TreeNode)                                                \
   KERNEL_TREE_NODES_DO(DEFINE_IS_OPERATION)
 
 
@@ -374,7 +374,7 @@
   virtual void VisitChildren(Visitor* visitor) = 0;
 
  protected:
-  Node() { }
+  Node() {}
 
  private:
   DISALLOW_COPY_AND_ASSIGN(Node);
@@ -591,7 +591,7 @@
   List<Expression>& annotations() { return annotations_; }
 
  protected:
-  Member() { }
+  Member() {}
 
   template <typename T>
   friend class List;
@@ -751,7 +751,7 @@
   virtual void AcceptInitializerVisitor(InitializerVisitor* visitor) = 0;
 
  protected:
-  Initializer() { }
+  Initializer() {}
 
  private:
   DISALLOW_COPY_AND_ASSIGN(Initializer);
@@ -770,7 +770,7 @@
   virtual void VisitChildren(Visitor* visitor);
 
  private:
-  InvalidInitializer() { }
+  InvalidInitializer() {}
 
   DISALLOW_COPY_AND_ASSIGN(InvalidInitializer);
 };
@@ -934,7 +934,7 @@
   virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor) = 0;
 
  protected:
-  Expression() { }
+  Expression() {}
 
  private:
   DISALLOW_COPY_AND_ASSIGN(Expression);
@@ -954,7 +954,7 @@
   virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
 
  private:
-  InvalidExpression() { }
+  InvalidExpression() {}
 
   DISALLOW_COPY_AND_ASSIGN(InvalidExpression);
 };
@@ -1280,7 +1280,8 @@
   static StaticInvocation* ReadFrom(Reader* reader, bool is_const);
   virtual void WriteTo(Writer* writer);
 
-  explicit StaticInvocation(Procedure* procedure, Arguments* args,
+  explicit StaticInvocation(Procedure* procedure,
+                            Arguments* args,
                             bool is_const)
       : procedure_(procedure), arguments_(args), is_const_(is_const) {}
   ~StaticInvocation();
@@ -1614,7 +1615,7 @@
   virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
 
  private:
-  NullLiteral() { }
+  NullLiteral() {}
 
   DISALLOW_COPY_AND_ASSIGN(NullLiteral);
 };
@@ -1679,7 +1680,7 @@
   virtual void VisitChildren(Visitor* visitor);
 
  private:
-  ThisExpression() { }
+  ThisExpression() {}
 
   DISALLOW_COPY_AND_ASSIGN(ThisExpression);
 };
@@ -1698,7 +1699,7 @@
   virtual void VisitChildren(Visitor* visitor);
 
  private:
-  Rethrow() { }
+  Rethrow() {}
 
   DISALLOW_COPY_AND_ASSIGN(Rethrow);
 };
@@ -1920,7 +1921,7 @@
   virtual void AcceptStatementVisitor(StatementVisitor* visitor) = 0;
 
  protected:
-  Statement() { }
+  Statement() {}
 
  private:
   DISALLOW_COPY_AND_ASSIGN(Statement);
@@ -1940,7 +1941,7 @@
   virtual void VisitChildren(Visitor* visitor);
 
  private:
-  InvalidStatement() { }
+  InvalidStatement() {}
 
   DISALLOW_COPY_AND_ASSIGN(InvalidStatement);
 };
@@ -2007,7 +2008,7 @@
   virtual void VisitChildren(Visitor* visitor);
 
  private:
-  EmptyStatement() { }
+  EmptyStatement() {}
 
   DISALLOW_COPY_AND_ASSIGN(EmptyStatement);
 };
@@ -2569,7 +2570,7 @@
   uint8_t value_bits() { return value_bits_; }
 
  private:
-  InferredValue() { }
+  InferredValue() {}
 
   Ref<Class> klass_;
   BaseClassKind kind_;
@@ -2592,7 +2593,7 @@
   virtual void AcceptDartTypeVisitor(DartTypeVisitor* visitor) = 0;
 
  protected:
-  DartType() { }
+  DartType() {}
 
  private:
   DISALLOW_COPY_AND_ASSIGN(DartType);
@@ -2612,7 +2613,7 @@
   virtual void VisitChildren(Visitor* visitor);
 
  private:
-  InvalidType() { }
+  InvalidType() {}
 
   DISALLOW_COPY_AND_ASSIGN(InvalidType);
 };
@@ -2631,7 +2632,7 @@
   virtual void VisitChildren(Visitor* visitor);
 
  private:
-  DynamicType() { }
+  DynamicType() {}
 
   DISALLOW_COPY_AND_ASSIGN(DynamicType);
 };
@@ -2650,7 +2651,7 @@
   virtual void VisitChildren(Visitor* visitor);
 
  private:
-  VoidType() { }
+  VoidType() {}
 
   DISALLOW_COPY_AND_ASSIGN(VoidType);
 };
@@ -2799,11 +2800,13 @@
 class Reference : public AllStatic {
  public:
   static Member* ReadMemberFrom(Reader* reader, bool allow_null = false);
-  static void WriteMemberTo(Writer* writer, Member* member,
+  static void WriteMemberTo(Writer* writer,
+                            Member* member,
                             bool allow_null = false);
 
   static Class* ReadClassFrom(Reader* reader, bool allow_null = false);
-  static void WriteClassTo(Writer* writer, Class* klass,
+  static void WriteClassTo(Writer* writer,
+                           Class* klass,
                            bool allow_null = false);
 
   static String* ReadStringFrom(Reader* reader);
diff --git a/runtime/vm/kernel_binary.cc b/runtime/vm/kernel_binary.cc
index 6cb8d36..aaf3333 100644
--- a/runtime/vm/kernel_binary.cc
+++ b/runtime/vm/kernel_binary.cc
@@ -11,13 +11,13 @@
 #include "vm/os.h"
 
 #if defined(DEBUG)
-#define TRACE_READ_OFFSET() do {               \
-    if (FLAG_trace_kernel_binary)              \
-      reader->DumpOffset(DART_PRETTY_FUNCTION); \
+#define TRACE_READ_OFFSET()                                                    \
+  do {                                                                         \
+    if (FLAG_trace_kernel_binary) reader->DumpOffset(DART_PRETTY_FUNCTION);    \
   } while (0)
-#define TRACE_WRITE_OFFSET() do {              \
-    if (FLAG_trace_kernel_binary)              \
-      writer->DumpOffset(DART_PRETTY_FUNCTION); \
+#define TRACE_WRITE_OFFSET()                                                   \
+  do {                                                                         \
+    if (FLAG_trace_kernel_binary) writer->DumpOffset(DART_PRETTY_FUNCTION);    \
   } while (0)
 #else
 #define TRACE_READ_OFFSET()
diff --git a/runtime/vm/kernel_reader.cc b/runtime/vm/kernel_reader.cc
index d9d7679..f9f2277 100644
--- a/runtime/vm/kernel_reader.cc
+++ b/runtime/vm/kernel_reader.cc
@@ -181,8 +181,9 @@
       Script::New(H.DartString(""), H.DartString(""), RawScript::kScriptTag));
   script.SetLocationOffset(0, 0);
   script.Tokenize(H.DartString("nop() {}"));
-  dart::Class& toplevel_class = dart::Class::Handle(Z, dart::Class::New(
-      library, Symbols::TopLevel(), script, TokenPosition::kNoSource));
+  dart::Class& toplevel_class = dart::Class::Handle(
+      Z, dart::Class::New(library, Symbols::TopLevel(), script,
+                          TokenPosition::kNoSource));
   toplevel_class.set_is_cycle_free();
   library.set_toplevel_class(toplevel_class);
   if (bootstrapping_) {
@@ -273,8 +274,8 @@
 
   // Set super type.  Some classes (e.g., Object) do not have one.
   if (kernel_normal_class->super_class() != NULL) {
-    AbstractType& super_type = T.TranslateTypeWithoutFinalization(
-        kernel_normal_class->super_class());
+    AbstractType& super_type =
+        T.TranslateTypeWithoutFinalization(kernel_normal_class->super_class());
     if (super_type.IsMalformed()) H.ReportError("Malformed super type");
     klass->set_super_type(super_type);
   }
@@ -527,7 +528,8 @@
                                            DartTypeTranslator type_translator,
                                            const dart::Class& klass,
                                            const dart::Function& function,
-                                           FunctionNode* node, bool is_method,
+                                           FunctionNode* node,
+                                           bool is_method,
                                            bool is_closure) {
   dart::Zone* zone = translation_helper.zone();
 
diff --git a/runtime/vm/kernel_reader.h b/runtime/vm/kernel_reader.h
index e6d9e55..23dc2e9 100644
--- a/runtime/vm/kernel_reader.h
+++ b/runtime/vm/kernel_reader.h
@@ -18,8 +18,10 @@
 
 class BuildingTranslationHelper : public TranslationHelper {
  public:
-  BuildingTranslationHelper(KernelReader* reader, dart::Thread* thread,
-                            dart::Zone* zone, Isolate* isolate)
+  BuildingTranslationHelper(KernelReader* reader,
+                            dart::Thread* thread,
+                            dart::Zone* zone,
+                            Isolate* isolate)
       : TranslationHelper(thread, zone, isolate), reader_(reader) {}
   virtual ~BuildingTranslationHelper() {}
 
@@ -72,7 +74,8 @@
                                       const dart::Class& owner,
                                       const dart::Function& function,
                                       FunctionNode* kernel_function,
-                                      bool is_method, bool is_closure);
+                                      bool is_method,
+                                      bool is_closure);
 
   void ReadLibrary(Library* kernel_library);
 
@@ -81,11 +84,14 @@
 
   void ReadPreliminaryClass(dart::Class* klass, Class* kernel_klass);
   void ReadClass(const dart::Library& library, Class* kernel_klass);
-  void ReadProcedure(const dart::Library& library, const dart::Class& owner,
-                     Procedure* procedure, Class* kernel_klass = NULL);
+  void ReadProcedure(const dart::Library& library,
+                     const dart::Class& owner,
+                     Procedure* procedure,
+                     Class* kernel_klass = NULL);
 
   void GenerateFieldAccessors(const dart::Class& klass,
-                              const dart::Field& field, Field* kernel_field);
+                              const dart::Field& field,
+                              Field* kernel_field);
 
   void SetupFieldAccessorFunction(const dart::Class& klass,
                                   const dart::Function& function);
diff --git a/runtime/vm/kernel_to_il.cc b/runtime/vm/kernel_to_il.cc
index 02f5437..46750fd 100644
--- a/runtime/vm/kernel_to_il.cc
+++ b/runtime/vm/kernel_to_il.cc
@@ -63,15 +63,15 @@
 }
 
 
-void ScopeBuilder::ExitScope() { scope_ = scope_->parent(); }
+void ScopeBuilder::ExitScope() {
+  scope_ = scope_->parent();
+}
 
 
 LocalVariable* ScopeBuilder::MakeVariable(const dart::String& name,
                                           const AbstractType& type) {
   return new (Z) LocalVariable(TokenPosition::kNoSource,
-                               TokenPosition::kNoSource,
-                               name,
-                               type);
+                               TokenPosition::kNoSource, name, type);
 }
 
 
@@ -89,9 +89,8 @@
 
 void ScopeBuilder::AddParameter(VariableDeclaration* declaration,
                                 intptr_t pos) {
-  LocalVariable* variable =
-      MakeVariable(H.DartSymbol(declaration->name()),
-                   T.TranslateVariableType(declaration));
+  LocalVariable* variable = MakeVariable(H.DartSymbol(declaration->name()),
+                                         T.TranslateVariableType(declaration));
   if (declaration->IsFinal()) {
     variable->set_is_final();
   }
@@ -108,7 +107,8 @@
 
 
 void ScopeBuilder::AddExceptionVariable(
-    GrowableArray<LocalVariable*>* variables, const char* prefix,
+    GrowableArray<LocalVariable*>* variables,
+    const char* prefix,
     intptr_t nesting_depth) {
   LocalVariable* v = NULL;
 
@@ -268,8 +268,8 @@
   Function& outermost_function = Function::Handle(Z);
   TreeNode* outermost_node = NULL;
   Class* kernel_klass = NULL;
-  DiscoverEnclosingElements(
-      Z, function, &outermost_function, &outermost_node, &kernel_klass);
+  DiscoverEnclosingElements(Z, function, &outermost_function, &outermost_node,
+                            &kernel_klass);
   // Use [klass]/[kernel_klass] as active class.  Type parameters will get
   // resolved via [kernel_klass] unless we are nested inside a static factory
   // in which case we will use [member].
@@ -313,9 +313,8 @@
 
       intptr_t pos = 0;
       if (function.IsClosureFunction()) {
-        LocalVariable* variable =
-            MakeVariable(Symbols::ClosureParameter(),
-                         AbstractType::dynamic_type());
+        LocalVariable* variable = MakeVariable(Symbols::ClosureParameter(),
+                                               AbstractType::dynamic_type());
         variable->set_is_forced_stack();
         scope_->InsertParameterAt(pos++, variable);
       } else if (!function.is_static()) {
@@ -343,8 +342,7 @@
         }
       } else if (function.IsFactory()) {
         LocalVariable* variable = MakeVariable(
-            Symbols::TypeArgumentsParameter(),
-            AbstractType::dynamic_type());
+            Symbols::TypeArgumentsParameter(), AbstractType::dynamic_type());
         scope_->InsertParameterAt(pos++, variable);
         result_->type_arguments_variable = variable;
       }
@@ -377,8 +375,8 @@
         result_->this_variable = variable;
       }
       if (is_setter) {
-        result_->setter_value = MakeVariable(
-            Symbols::Value(), AbstractType::dynamic_type());
+        result_->setter_value =
+            MakeVariable(Symbols::Value(), AbstractType::dynamic_type());
         scope_->InsertParameterAt(pos++, result_->setter_value);
       }
       break;
@@ -575,9 +573,8 @@
 
 void ScopeBuilder::AddSwitchVariable() {
   if ((depth_.function_ == 0) && (result_->switch_variable == NULL)) {
-    LocalVariable* variable = MakeVariable(
-        Symbols::SwitchExpr(),
-        AbstractType::dynamic_type());
+    LocalVariable* variable =
+        MakeVariable(Symbols::SwitchExpr(), AbstractType::dynamic_type());
     variable->set_is_forced_stack();
     current_function_scope_->AddVariable(variable);
     result_->switch_variable = variable;
@@ -595,9 +592,7 @@
   if ((depth_.function_ == 0) && (depth_.finally_ > 0) &&
       (result_->finally_return_variable == NULL)) {
     const dart::String& name = H.DartSymbol(":try_finally_return_value");
-    LocalVariable* variable = MakeVariable(
-        name,
-        AbstractType::dynamic_type());
+    LocalVariable* variable = MakeVariable(name, AbstractType::dynamic_type());
     current_function_scope_->AddVariable(variable);
     result_->finally_return_variable = variable;
   }
@@ -845,7 +840,8 @@
         // Finalizers are executed outside of the try block hence
         // try depth of finalizers are one less than current try
         // depth.
-        try_depth_(builder->try_depth_ - 1) {
+        try_depth_(builder->try_depth_ - 1),
+        try_index_(builder_->CurrentTryIndex()) {
     builder_->try_finally_block_ = this;
   }
   ~TryFinallyBlock() { builder_->try_finally_block_ = outer_; }
@@ -853,6 +849,7 @@
   Statement* finalizer() const { return finalizer_; }
   intptr_t context_depth() const { return context_depth_; }
   intptr_t try_depth() const { return try_depth_; }
+  intptr_t try_index() const { return try_index_; }
   TryFinallyBlock* outer() const { return outer_; }
 
  private:
@@ -861,6 +858,7 @@
   Statement* const finalizer_;
   const intptr_t context_depth_;
   const intptr_t try_depth_;
+  const intptr_t try_index_;
 };
 
 
@@ -876,7 +874,8 @@
   }
   ~TryCatchBlock() { builder_->try_catch_block_ = outer_; }
 
-  intptr_t TryIndex() { return try_index_; }
+  intptr_t try_index() { return try_index_; }
+  TryCatchBlock* outer() const { return outer_; }
 
  private:
   FlowGraphBuilder* builder_;
@@ -887,8 +886,10 @@
 
 class CatchBlock {
  public:
-  CatchBlock(FlowGraphBuilder* builder, LocalVariable* exception_var,
-             LocalVariable* stack_trace_var, intptr_t catch_try_index)
+  CatchBlock(FlowGraphBuilder* builder,
+             LocalVariable* exception_var,
+             LocalVariable* stack_trace_var,
+             intptr_t catch_try_index)
       : builder_(builder),
         outer_(builder->catch_block_),
         exception_var_(exception_var),
@@ -1032,8 +1033,9 @@
   if (content->buffer()[content->size() - 1] == '=') {
     skip = 1;
   }
-  dart::String& name = dart::String::ZoneHandle(Z, dart::String::FromUTF8(
-        content->buffer(), content->size() - skip, allocation_space_));
+  dart::String& name = dart::String::ZoneHandle(
+      Z, dart::String::FromUTF8(content->buffer(), content->size() - skip,
+                                allocation_space_));
   ManglePrivateName(kernel_name->library(), &name, false);
   name = dart::Field::SetterSymbol(name);
   return name;
@@ -1172,7 +1174,8 @@
 
 
 dart::RawFunction* TranslationHelper::LookupConstructorByKernelConstructor(
-    const dart::Class& owner, Constructor* constructor) {
+    const dart::Class& owner,
+    Constructor* constructor) {
   dart::RawFunction* function =
       owner.LookupConstructorAllowPrivate(DartConstructorName(constructor));
   ASSERT(function != Object::null());
@@ -1212,7 +1215,8 @@
 }
 
 
-void TranslationHelper::ReportError(const Error& prev_error, const char* format,
+void TranslationHelper::ReportError(const Error& prev_error,
+                                    const char* format,
                                     ...) {
   const Script& null_script = Script::Handle(Z);
 
@@ -1242,8 +1246,8 @@
 const Array& TranslationHelper::ArgumentNames(List<NamedExpression>* named) {
   if (named->length() == 0) return Array::ZoneHandle(Z);
 
-  const Array& names = Array::ZoneHandle(Z,
-      Array::New(named->length(), allocation_space_));
+  const Array& names =
+      Array::ZoneHandle(Z, Array::New(named->length(), allocation_space_));
   for (intptr_t i = 0; i < named->length(); ++i) {
     names.SetAt(i, DartSymbol((*named)[i]->name()));
   }
@@ -1261,7 +1265,8 @@
       translation_helper_(*h),
       type_translator_(*type_translator),
       script_(dart::Script::Handle(
-            zone, builder_->parsed_function_->function().script())),
+          zone,
+          builder_->parsed_function_->function().script())),
       result_(dart::Instance::Handle(zone)) {}
 
 
@@ -1368,8 +1373,10 @@
 
 
 RawObject* ConstantEvaluator::EvaluateConstConstructorCall(
-    const dart::Class& type_class, const TypeArguments& type_arguments,
-    const Function& constructor, const Object& argument) {
+    const dart::Class& type_class,
+    const TypeArguments& type_arguments,
+    const Function& constructor,
+    const Object& argument) {
   // Factories have one extra argument: the type arguments.
   // Constructors have 1 extra arguments: receiver.
   const int kNumArgs = 1;
@@ -1444,9 +1451,8 @@
   const intptr_t kInitialConstMapSize = 16;
   ASSERT(!script_.InVMHeap());
   if (script_.compile_time_constants() == Array::null()) {
-    const Array& array =
-        Array::Handle(HashTables::New<KernelConstantsMap>(kInitialConstMapSize,
-                                                          Heap::kNew));
+    const Array& array = Array::Handle(
+        HashTables::New<KernelConstantsMap>(kInitialConstMapSize, Heap::kNew));
     script_.set_compile_time_constants(array);
   }
   KernelConstantsMap constants(script_.compile_time_constants());
@@ -1732,7 +1738,8 @@
 
 
 const TypeArguments* ConstantEvaluator::TranslateTypeArguments(
-    const Function& target, dart::Class* target_klass,
+    const Function& target,
+    dart::Class* target_klass,
     Arguments* kernel_arguments) {
   List<DartType>& kernel_type_arguments = kernel_arguments->types();
 
@@ -1804,12 +1811,15 @@
 
 
 FlowGraphBuilder::FlowGraphBuilder(
-    TreeNode* node, ParsedFunction* parsed_function,
+    TreeNode* node,
+    ParsedFunction* parsed_function,
     const ZoneGrowableArray<const ICData*>& ic_data_array,
-    InlineExitCollector* exit_collector, intptr_t osr_id,
+    InlineExitCollector* exit_collector,
+    intptr_t osr_id,
     intptr_t first_block_id)
     : zone_(Thread::Current()->zone()),
-      translation_helper_(Thread::Current(), zone_,
+      translation_helper_(Thread::Current(),
+                          zone_,
                           Thread::Current()->isolate()),
       node_(node),
       parsed_function_(parsed_function),
@@ -1834,7 +1844,9 @@
       next_used_try_index_(0),
       catch_block_(NULL),
       type_translator_(&translation_helper_, &active_class_),
-      constant_evaluator_(this, zone_, &translation_helper_,
+      constant_evaluator_(this,
+                          zone_,
+                          &translation_helper_,
                           &type_translator_) {}
 
 
@@ -1842,8 +1854,10 @@
 
 
 Fragment FlowGraphBuilder::TranslateFinallyFinalizers(
-    TryFinallyBlock* outer_finally, intptr_t target_context_depth) {
+    TryFinallyBlock* outer_finally,
+    intptr_t target_context_depth) {
   TryFinallyBlock* const saved_block = try_finally_block_;
+  TryCatchBlock* const saved_try_catch_block = try_catch_block_;
   const intptr_t saved_depth = context_depth_;
   const intptr_t saved_try_depth = try_depth_;
 
@@ -1859,6 +1873,20 @@
     // block.
     instructions += AdjustContextTo(try_finally_block_->context_depth());
 
+    // The to-be-translated finalizer has to have the correct try-index (namely
+    // the one outside the try-finally block).
+    bool changed_try_index = false;
+    intptr_t target_try_index = try_finally_block_->try_index();
+    while (CurrentTryIndex() != target_try_index) {
+      try_catch_block_ = try_catch_block_->outer();
+      changed_try_index = true;
+    }
+    if (changed_try_index) {
+      JoinEntryInstr* entry = BuildJoinEntry();
+      instructions += Goto(entry);
+      instructions = Fragment(instructions.entry, entry);
+    }
+
     Statement* finalizer = try_finally_block_->finalizer();
     try_finally_block_ = try_finally_block_->outer();
 
@@ -1872,13 +1900,14 @@
   }
 
   if (instructions.is_open() && target_context_depth != -1) {
-    // A target context depth of -1 indicates that we the code after this
+    // A target context depth of -1 indicates that the code after this
     // will not care about the context chain so we can leave it any way we
     // want after the last finalizer.  That is used when returning.
     instructions += AdjustContextTo(target_context_depth);
   }
 
   try_finally_block_ = saved_block;
+  try_catch_block_ = saved_try_catch_block;
   context_depth_ = saved_depth;
   try_depth_ = saved_try_depth;
 
@@ -2106,7 +2135,8 @@
 
 
 Fragment FlowGraphBuilder::BranchIfStrictEqual(
-    TargetEntryInstr** then_entry, TargetEntryInstr** otherwise_entry) {
+    TargetEntryInstr** then_entry,
+    TargetEntryInstr** otherwise_entry) {
   Value* rhs = Pop();
   Value* lhs = Pop();
   StrictCompareInstr* compare = new (Z) StrictCompareInstr(
@@ -2121,10 +2151,9 @@
 Fragment FlowGraphBuilder::CatchBlockEntry(const Array& handler_types,
                                            intptr_t handler_index) {
   ASSERT(CurrentException()->is_captured() ==
-             CurrentStackTrace()->is_captured());
+         CurrentStackTrace()->is_captured());
   const bool should_restore_closure_context =
-      CurrentException()->is_captured() ||
-      CurrentCatchContext()->is_captured();
+      CurrentException()->is_captured() || CurrentCatchContext()->is_captured();
   CatchBlockEntryInstr* entry = new (Z) CatchBlockEntryInstr(
       AllocateBlockId(), CurrentTryIndex(), graph_entry_, handler_types,
       handler_index, *CurrentException(), *CurrentStackTrace(),
@@ -2322,7 +2351,8 @@
 
 
 Fragment FlowGraphBuilder::LoadNativeField(MethodRecognizer::Kind kind,
-                                           intptr_t offset, const Type& type,
+                                           intptr_t offset,
+                                           const Type& type,
                                            intptr_t class_id,
                                            bool is_immutable) {
   LoadFieldInstr* load =
@@ -2452,9 +2482,7 @@
   Value* value = Pop();
   Value* index = Pop();
   const StoreBarrierType emit_store_barrier =
-      value->BindsToConstant()
-          ? kNoStoreBarrier
-          : kEmitStoreBarrier;
+      value->BindsToConstant() ? kNoStoreBarrier : kEmitStoreBarrier;
   StoreIndexedInstr* store = new (Z) StoreIndexedInstr(
       Pop(),  // Array.
       index, value, emit_store_barrier, Instance::ElementSizeFor(class_id),
@@ -2465,7 +2493,8 @@
 
 
 Fragment FlowGraphBuilder::StoreInstanceField(
-    const dart::Field& field, StoreBarrierType emit_store_barrier) {
+    const dart::Field& field,
+    StoreBarrierType emit_store_barrier) {
   Value* value = Pop();
   if (value->BindsToConstant()) {
     emit_store_barrier = kNoStoreBarrier;
@@ -2492,7 +2521,8 @@
 
 
 Fragment FlowGraphBuilder::StoreInstanceField(
-    intptr_t offset, StoreBarrierType emit_store_barrier) {
+    intptr_t offset,
+    StoreBarrierType emit_store_barrier) {
   Value* value = Pop();
   if (value->BindsToConstant()) {
     emit_store_barrier = kNoStoreBarrier;
@@ -2620,7 +2650,8 @@
 
 
 dart::RawFunction* FlowGraphBuilder::LookupMethodByMember(
-    Member* target, const dart::String& method_name) {
+    Member* target,
+    const dart::String& method_name) {
   Class* kernel_klass = Class::Cast(target->parent());
   dart::Class& klass =
       dart::Class::Handle(Z, H.LookupClassByKernelClass(kernel_klass));
@@ -2635,11 +2666,9 @@
   char name[64];
   intptr_t index = stack_->definition()->temp_index();
   OS::SNPrint(name, 64, ":temp%" Pd, index);
-  LocalVariable* variable = new (Z) LocalVariable(
-      TokenPosition::kNoSource,
-      TokenPosition::kNoSource,
-      H.DartSymbol(name),
-      Object::dynamic_type());
+  LocalVariable* variable =
+      new (Z) LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
+                            H.DartSymbol(name), Object::dynamic_type());
   // Set the index relative to the base of the expression stack including
   // outgoing arguments.
   variable->set_index(parsed_function_->first_stack_local_index() -
@@ -2659,7 +2688,7 @@
   if (try_catch_block_ == NULL) {
     return CatchClauseNode::kInvalidTryIndex;
   } else {
-    return try_catch_block_->TryIndex();
+    return try_catch_block_->try_index();
   }
 }
 
@@ -2785,8 +2814,8 @@
   Function& outermost_function = Function::Handle(Z);
   TreeNode* outermost_node = NULL;
   Class* kernel_klass = NULL;
-  DiscoverEnclosingElements(
-      Z, function, &outermost_function, &outermost_node, &kernel_klass);
+  DiscoverEnclosingElements(Z, function, &outermost_function, &outermost_node,
+                            &kernel_klass);
 
   // Mark that we are using [klass]/[kernell_klass] as active class.  Resolving
   // of type parameters will get resolved via [kernell_klass] unless we are
@@ -2860,8 +2889,8 @@
                                                   Constructor* constructor) {
   const Function& dart_function = parsed_function_->function();
   TargetEntryInstr* normal_entry = BuildTargetEntry();
-  graph_entry_ = new (Z)
-      GraphEntryInstr(*parsed_function_, normal_entry, osr_id_);
+  graph_entry_ =
+      new (Z) GraphEntryInstr(*parsed_function_, normal_entry, osr_id_);
 
   SetupDefaultParameterValues(function);
 
@@ -2882,11 +2911,9 @@
       if (variable->is_captured()) {
         // There is no LocalVariable describing the on-stack parameter so
         // create one directly and use the same type.
-        LocalVariable* parameter =
-            new (Z) LocalVariable(TokenPosition::kNoSource,
-                                  TokenPosition::kNoSource,
-                                  Symbols::TempParam(),
-                                  variable->type());
+        LocalVariable* parameter = new (Z)
+            LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
+                          Symbols::TempParam(), variable->type());
         parameter->set_index(parameter_index);
         // Mark the stack variable so it will be ignored by the code for
         // try/catch.
@@ -3032,7 +3059,7 @@
   // unreachable from the OSR entry. Catch entries are always considered
   // reachable, even if they become unreachable after OSR.
   if (osr_id_ != Compiler::kNoOSRDeoptId) {
-    BitVector* block_marks = new(Z) BitVector(Z, next_block_id_);
+    BitVector* block_marks = new (Z) BitVector(Z, next_block_id_);
     bool found = graph_entry_->PruneUnreachable(graph_entry_, NULL, osr_id_,
                                                 block_marks);
     ASSERT(found);
@@ -3198,7 +3225,8 @@
 
 
 FlowGraph* FlowGraphBuilder::BuildGraphOfFieldAccessor(
-    Field* kernel_field, LocalVariable* setter_value) {
+    Field* kernel_field,
+    LocalVariable* setter_value) {
   const dart::Function& function = parsed_function_->function();
 
   bool is_setter = function.IsImplicitSetterFunction();
@@ -3334,7 +3362,8 @@
 
 
 FlowGraph* FlowGraphBuilder::BuildGraphOfImplicitClosureFunction(
-    FunctionNode* kernel_function, const Function& function) {
+    FunctionNode* kernel_function,
+    const Function& function) {
   const Function& target = Function::ZoneHandle(Z, function.parent_function());
 
   TargetEntryInstr* normal_entry = BuildTargetEntry();
@@ -3622,7 +3651,8 @@
 
 
 Fragment FlowGraphBuilder::TranslateInitializers(
-    Class* kernel_klass, List<Initializer>* initializers) {
+    Class* kernel_klass,
+    List<Initializer>* initializers) {
   Fragment instructions;
 
   // These come from:
@@ -4013,7 +4043,8 @@
 
 
 const TypeArguments& DartTypeTranslator::TranslateTypeArguments(
-    DartType** dart_types, intptr_t length) {
+    DartType** dart_types,
+    intptr_t length) {
   bool only_dynamic = true;
   for (intptr_t i = 0; i < length; i++) {
     if (!dart_types[i]->IsDynamicType()) {
@@ -4041,7 +4072,8 @@
 
 
 const TypeArguments& DartTypeTranslator::TranslateInstantiatedTypeArguments(
-    const dart::Class& receiver_class, DartType** receiver_type_arguments,
+    const dart::Class& receiver_class,
+    DartType** receiver_type_arguments,
     intptr_t length) {
   const TypeArguments& type_arguments =
       TranslateTypeArguments(receiver_type_arguments, length);
@@ -5420,8 +5452,8 @@
   // Fill in the body of the try.
   ++try_depth_;
   {
-    TryCatchBlock tcb(this, try_handler_index);
     TryFinallyBlock tfb(this, node->finalizer());
+    TryCatchBlock tcb(this, try_handler_index);
     try_body += TranslateStatement(node->body());
   }
   --try_depth_;
diff --git a/runtime/vm/kernel_to_il.h b/runtime/vm/kernel_to_il.h
index 6a62834..5001451 100644
--- a/runtime/vm/kernel_to_il.h
+++ b/runtime/vm/kernel_to_il.h
@@ -38,14 +38,10 @@
   static uword Hash(const TreeNode* key) {
     return HashValue(Smi::Value(KeyAsSmi(key)));
   }
-  static RawObject* NewKey(const TreeNode* key) {
-    return KeyAsSmi(key);
-  }
+  static RawObject* NewKey(const TreeNode* key) { return KeyAsSmi(key); }
 
  private:
-  static uword HashValue(intptr_t pos) {
-    return pos % (Smi::kMaxValue - 13);
-  }
+  static uword HashValue(intptr_t pos) { return pos % (Smi::kMaxValue - 13); }
 
   static RawSmi* KeyAsSmi(const TreeNode* key) {
     // We exploit that all [TreeNode] objects will be aligned and therefore are
@@ -137,7 +133,8 @@
 
 class ActiveClassScope {
  public:
-  ActiveClassScope(ActiveClass* active_class, Class* kernel_class,
+  ActiveClassScope(ActiveClass* active_class,
+                   Class* kernel_class,
                    const dart::Class* klass)
       : active_class_(active_class), saved_(*active_class) {
     active_class_->kernel_class = kernel_class;
@@ -193,8 +190,8 @@
       : thread_(thread),
         zone_(zone),
         isolate_(isolate),
-        allocation_space_(
-            thread_->IsMutatorThread() ? Heap::kNew : Heap::kOld) {}
+        allocation_space_(thread_->IsMutatorThread() ? Heap::kNew
+                                                     : Heap::kOld) {}
   virtual ~TranslationHelper() {}
 
   Thread* thread() { return thread_; }
@@ -248,7 +245,8 @@
   RawFunction* LookupStaticMethodByKernelProcedure(Procedure* procedure);
   RawFunction* LookupConstructorByKernelConstructor(Constructor* constructor);
   dart::RawFunction* LookupConstructorByKernelConstructor(
-      const dart::Class& owner, Constructor* constructor);
+      const dart::Class& owner,
+      Constructor* constructor);
 
   dart::Type& GetCanonicalType(const dart::Class& klass);
 
@@ -282,7 +280,8 @@
 // runtime unless explicitly specified otherwise.
 class DartTypeTranslator : public DartTypeVisitor {
  public:
-  DartTypeTranslator(TranslationHelper* helper, ActiveClass* active_class,
+  DartTypeTranslator(TranslationHelper* helper,
+                     ActiveClass* active_class,
                      bool finalize = true)
       : translation_helper_(*helper),
         active_class_(active_class),
@@ -317,7 +316,8 @@
   // Will return `TypeArguments::null()` in case any of the arguments are
   // malformed.
   const TypeArguments& TranslateInstantiatedTypeArguments(
-      const dart::Class& receiver_class, DartType** receiver_type_arguments,
+      const dart::Class& receiver_class,
+      DartType** receiver_type_arguments,
       intptr_t length);
 
   // Will return `TypeArguments::null()` in case any of the arguments are
@@ -358,7 +358,9 @@
 // compile-time.
 class ConstantEvaluator : public ExpressionVisitor {
  public:
-  ConstantEvaluator(FlowGraphBuilder* builder, Zone* zone, TranslationHelper* h,
+  ConstantEvaluator(FlowGraphBuilder* builder,
+                    Zone* zone,
+                    TranslationHelper* h,
                     DartTypeTranslator* type_translator);
   virtual ~ConstantEvaluator() {}
 
@@ -403,11 +405,13 @@
                                               dart::Class* target_klass,
                                               Arguments* kernel_arguments);
 
-  const Object& RunFunction(const Function& function, Arguments* arguments,
+  const Object& RunFunction(const Function& function,
+                            Arguments* arguments,
                             const Instance* receiver = NULL,
                             const TypeArguments* type_args = NULL);
 
-  const Object& RunFunction(const Function& function, const Array& arguments,
+  const Object& RunFunction(const Function& function,
+                            const Array& arguments,
                             const Array& names);
 
   RawObject* EvaluateConstConstructorCall(const dart::Class& type_class,
@@ -441,13 +445,13 @@
 class ScopeBuildingResult : public ZoneAllocated {
  public:
   ScopeBuildingResult()
-    : this_variable(NULL),
-      type_arguments_variable(NULL),
-      switch_variable(NULL),
-      finally_return_variable(NULL),
-      setter_value(NULL),
-      yield_jump_variable(NULL),
-      yield_context_variable(NULL) {}
+      : this_variable(NULL),
+        type_arguments_variable(NULL),
+        switch_variable(NULL),
+        finally_return_variable(NULL),
+        setter_value(NULL),
+        yield_jump_variable(NULL),
+        yield_context_variable(NULL) {}
 
   Map<VariableDeclaration, LocalVariable*> locals;
   Map<TreeNode, LocalScope*> scopes;
@@ -546,7 +550,8 @@
   void AddParameter(VariableDeclaration* declaration, intptr_t pos);
   void AddVariable(VariableDeclaration* declaration);
   void AddExceptionVariable(GrowableArray<LocalVariable*>* variables,
-                            const char* prefix, intptr_t nesting_depth);
+                            const char* prefix,
+                            intptr_t nesting_depth);
   void AddTryVariables();
   void AddCatchVariables();
   void AddIteratorVariable();
@@ -603,9 +608,11 @@
 
 class FlowGraphBuilder : public TreeVisitor {
  public:
-  FlowGraphBuilder(TreeNode* node, ParsedFunction* parsed_function,
+  FlowGraphBuilder(TreeNode* node,
+                   ParsedFunction* parsed_function,
                    const ZoneGrowableArray<const ICData*>& ic_data_array,
-                   InlineExitCollector* exit_collector, intptr_t osr_id,
+                   InlineExitCollector* exit_collector,
+                   intptr_t osr_id,
                    intptr_t first_block_id = 1);
   virtual ~FlowGraphBuilder();
 
@@ -745,10 +752,14 @@
   Fragment CreateArray();
   Fragment Goto(JoinEntryInstr* destination);
   Fragment IntConstant(int64_t value);
-  Fragment InstanceCall(const dart::String& name, Token::Kind kind,
-                        intptr_t argument_count, intptr_t num_args_checked = 1);
-  Fragment InstanceCall(const dart::String& name, Token::Kind kind,
-                        intptr_t argument_count, const Array& argument_names,
+  Fragment InstanceCall(const dart::String& name,
+                        Token::Kind kind,
+                        intptr_t argument_count,
+                        intptr_t num_args_checked = 1);
+  Fragment InstanceCall(const dart::String& name,
+                        Token::Kind kind,
+                        intptr_t argument_count,
+                        const Array& argument_names,
                         intptr_t num_args_checked = 1);
   Fragment ClosureCall(int argument_count, const Array& argument_names);
   Fragment ThrowException();
@@ -756,8 +767,10 @@
   Fragment LoadClassId();
   Fragment LoadField(const dart::Field& field);
   Fragment LoadField(intptr_t offset, intptr_t class_id = kDynamicCid);
-  Fragment LoadNativeField(MethodRecognizer::Kind kind, intptr_t offset,
-                           const Type& type, intptr_t class_id,
+  Fragment LoadNativeField(MethodRecognizer::Kind kind,
+                           intptr_t offset,
+                           const Type& type,
+                           intptr_t class_id,
                            bool is_immutable = false);
   Fragment LoadLocal(LocalVariable* variable);
   Fragment InitStaticField(const dart::Field& field);
@@ -767,7 +780,8 @@
   Fragment PushArgument();
   Fragment Return();
   Fragment StaticCall(const Function& target, intptr_t argument_count);
-  Fragment StaticCall(const Function& target, intptr_t argument_count,
+  Fragment StaticCall(const Function& target,
+                      intptr_t argument_count,
                       const Array& argument_names);
   Fragment StoreIndexed(intptr_t class_id);
   Fragment StoreInstanceFieldGuarded(const dart::Field& field);
@@ -796,7 +810,8 @@
   intptr_t AllocateTryIndex() { return next_used_try_index_++; }
 
   void AddVariable(VariableDeclaration* declaration, LocalVariable* variable);
-  void AddParameter(VariableDeclaration* declaration, LocalVariable* variable,
+  void AddParameter(VariableDeclaration* declaration,
+                    LocalVariable* variable,
                     intptr_t pos);
   dart::LocalVariable* LookupVariable(VariableDeclaration* var);
 
diff --git a/runtime/vm/libdart_dependency_helper.cc b/runtime/vm/libdart_dependency_helper.cc
index ccf26c8..75040ca 100644
--- a/runtime/vm/libdart_dependency_helper.cc
+++ b/runtime/vm/libdart_dependency_helper.cc
@@ -2,7 +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.
 
-int main(int argc, char *argv[]) {
+int main(int argc, char* argv[]) {
   return 0;
 }
-
diff --git a/runtime/vm/locations.cc b/runtime/vm/locations.cc
index 5603a1c..5175819 100644
--- a/runtime/vm/locations.cc
+++ b/runtime/vm/locations.cc
@@ -44,8 +44,8 @@
     intptr_t input_count,
     Location out,
     LocationSummary::ContainsCall contains_call) {
-  LocationSummary* summary = new(zone) LocationSummary(
-      zone, input_count, 0, contains_call);
+  LocationSummary* summary =
+      new (zone) LocationSummary(zone, input_count, 0, contains_call);
   for (intptr_t i = 0; i < input_count; i++) {
     summary->set_in(i, Location::RequiresRegister());
   }
@@ -73,48 +73,48 @@
 Location Location::RegisterOrConstant(Value* value) {
   ConstantInstr* constant = value->definition()->AsConstant();
   return ((constant != NULL) && Assembler::IsSafe(constant->value()))
-      ? Location::Constant(constant)
-      : Location::RequiresRegister();
+             ? Location::Constant(constant)
+             : Location::RequiresRegister();
 }
 
 
 Location Location::RegisterOrSmiConstant(Value* value) {
   ConstantInstr* constant = value->definition()->AsConstant();
   return ((constant != NULL) && Assembler::IsSafeSmi(constant->value()))
-      ? Location::Constant(constant)
-      : Location::RequiresRegister();
+             ? Location::Constant(constant)
+             : Location::RequiresRegister();
 }
 
 
 Location Location::WritableRegisterOrSmiConstant(Value* value) {
   ConstantInstr* constant = value->definition()->AsConstant();
   return ((constant != NULL) && Assembler::IsSafeSmi(constant->value()))
-      ? Location::Constant(constant)
-      : Location::WritableRegister();
+             ? Location::Constant(constant)
+             : Location::WritableRegister();
 }
 
 
 Location Location::FixedRegisterOrConstant(Value* value, Register reg) {
   ConstantInstr* constant = value->definition()->AsConstant();
   return ((constant != NULL) && Assembler::IsSafe(constant->value()))
-      ? Location::Constant(constant)
-      : Location::RegisterLocation(reg);
+             ? Location::Constant(constant)
+             : Location::RegisterLocation(reg);
 }
 
 
 Location Location::FixedRegisterOrSmiConstant(Value* value, Register reg) {
   ConstantInstr* constant = value->definition()->AsConstant();
   return ((constant != NULL) && Assembler::IsSafeSmi(constant->value()))
-      ? Location::Constant(constant)
-      : Location::RegisterLocation(reg);
+             ? Location::Constant(constant)
+             : Location::RegisterLocation(reg);
 }
 
 
 Location Location::AnyOrConstant(Value* value) {
   ConstantInstr* constant = value->definition()->AsConstant();
   return ((constant != NULL) && Assembler::IsSafe(constant->value()))
-      ? Location::Constant(constant)
-      : Location::Any();
+             ? Location::Constant(constant)
+             : Location::Any();
 }
 
 
@@ -125,7 +125,7 @@
   const Register base = base_reg();
   if (base == FPREG) {
     if (index < 0) {
-      const intptr_t offset = (kParamEndSlotFromFp - index)  * kWordSize;
+      const intptr_t offset = (kParamEndSlotFromFp - index) * kWordSize;
       return Address(base, offset);
     } else {
       const intptr_t offset = (kFirstLocalSlotFromFp - index) * kWordSize;
@@ -142,7 +142,7 @@
   const intptr_t index = stack_index();
   if (base_reg() == FPREG) {
     if (index < 0) {
-      const intptr_t offset = (kParamEndSlotFromFp - index)  * kWordSize;
+      const intptr_t offset = (kParamEndSlotFromFp - index) * kWordSize;
       return offset;
     } else {
       const intptr_t offset = (kFirstLocalSlotFromFp - index) * kWordSize;
@@ -162,12 +162,18 @@
 
 const char* Location::Name() const {
   switch (kind()) {
-    case kInvalid: return "?";
-    case kRegister: return Assembler::RegisterName(reg());
-    case kFpuRegister: return Assembler::FpuRegisterName(fpu_reg());
-    case kStackSlot: return "S";
-    case kDoubleStackSlot: return "DS";
-    case kQuadStackSlot: return "QS";
+    case kInvalid:
+      return "?";
+    case kRegister:
+      return Assembler::RegisterName(reg());
+    case kFpuRegister:
+      return Assembler::FpuRegisterName(fpu_reg());
+    case kStackSlot:
+      return "S";
+    case kDoubleStackSlot:
+      return "DS";
+    case kQuadStackSlot:
+      return "QS";
     case kUnallocated:
       switch (policy()) {
         case kAny:
diff --git a/runtime/vm/locations.h b/runtime/vm/locations.h
index e81c96b..c2d815b 100644
--- a/runtime/vm/locations.h
+++ b/runtime/vm/locations.h
@@ -87,9 +87,9 @@
 
     // Spill slots allocated by the register allocator.  Payload contains
     // a spill index.
-    kStackSlot = 4,  // Word size slot.
+    kStackSlot = 4,        // Word size slot.
     kDoubleStackSlot = 7,  // 64bit stack slot.
-    kQuadStackSlot = 11,  // 128bit stack slot.
+    kQuadStackSlot = 11,   // 128bit stack slot.
 
     // Register location represents a fixed register.  Payload contains
     // register code.
@@ -132,16 +132,14 @@
     ASSERT(IsInvalid());
   }
 
-  Location(const Location& other) : ValueObject(), value_(other.value_) { }
+  Location(const Location& other) : ValueObject(), value_(other.value_) {}
 
   Location& operator=(const Location& other) {
     value_ = other.value_;
     return *this;
   }
 
-  bool IsInvalid() const {
-    return value_ == kInvalidLocation;
-  }
+  bool IsInvalid() const { return value_ == kInvalidLocation; }
 
   // Constants.
   bool IsConstant() const {
@@ -179,22 +177,16 @@
     kSameAsFirstInput,
   };
 
-  bool IsUnallocated() const {
-    return kind() == kUnallocated;
-  }
+  bool IsUnallocated() const { return kind() == kUnallocated; }
 
-  bool IsRegisterBeneficial() {
-    return !Equals(Any());
-  }
+  bool IsRegisterBeneficial() { return !Equals(Any()); }
 
   static Location UnallocatedLocation(Policy policy) {
     return Location(kUnallocated, PolicyField::encode(policy));
   }
 
   // Any free register is suitable to replace this unallocated location.
-  static Location Any() {
-    return UnallocatedLocation(kAny);
-  }
+  static Location Any() { return UnallocatedLocation(kAny); }
 
   static Location PrefersRegister() {
     return UnallocatedLocation(kPrefersRegister);
@@ -219,9 +211,7 @@
   }
 
   // Empty location. Used if there the location should be ignored.
-  static Location NoLocation() {
-    return Location();
-  }
+  static Location NoLocation() { return Location(); }
 
   Policy policy() const {
     ASSERT(IsUnallocated());
@@ -233,9 +223,7 @@
     return Location(kRegister, reg);
   }
 
-  bool IsRegister() const {
-    return kind() == kRegister;
-  }
+  bool IsRegister() const { return kind() == kRegister; }
 
   Register reg() const {
     ASSERT(IsRegister());
@@ -247,9 +235,7 @@
     return Location(kFpuRegister, reg);
   }
 
-  bool IsFpuRegister() const {
-    return kind() == kFpuRegister;
-  }
+  bool IsFpuRegister() const { return kind() == kFpuRegister; }
 
   FpuRegister fpu_reg() const {
     ASSERT(IsFpuRegister());
@@ -260,8 +246,7 @@
     return (kind == kRegister) || (kind == kFpuRegister);
   }
 
-  static Location MachineRegisterLocation(Kind kind,
-                                          intptr_t reg) {
+  static Location MachineRegisterLocation(Kind kind, intptr_t reg) {
     if (kind == kRegister) {
       return RegisterLocation(static_cast<Register>(reg));
     } else {
@@ -270,9 +255,7 @@
     }
   }
 
-  bool IsMachineRegister() const {
-    return IsMachineRegisterKind(kind());
-  }
+  bool IsMachineRegister() const { return IsMachineRegisterKind(kind()); }
 
   intptr_t register_code() const {
     ASSERT(IsMachineRegister());
@@ -286,45 +269,38 @@
   }
 
   // Spill slots.
-  static Location StackSlot(intptr_t stack_index,
-                            Register base = FPREG) {
-    uword payload = StackSlotBaseField::encode(base)
-        | StackIndexField::encode(EncodeStackIndex(stack_index));
+  static Location StackSlot(intptr_t stack_index, Register base = FPREG) {
+    uword payload = StackSlotBaseField::encode(base) |
+                    StackIndexField::encode(EncodeStackIndex(stack_index));
     Location loc(kStackSlot, payload);
     // Ensure that sign is preserved.
     ASSERT(loc.stack_index() == stack_index);
     return loc;
   }
 
-  bool IsStackSlot() const {
-    return kind() == kStackSlot;
-  }
+  bool IsStackSlot() const { return kind() == kStackSlot; }
 
   static Location DoubleStackSlot(intptr_t stack_index) {
-    uword payload = StackSlotBaseField::encode(FPREG)
-        | StackIndexField::encode(EncodeStackIndex(stack_index));
+    uword payload = StackSlotBaseField::encode(FPREG) |
+                    StackIndexField::encode(EncodeStackIndex(stack_index));
     Location loc(kDoubleStackSlot, payload);
     // Ensure that sign is preserved.
     ASSERT(loc.stack_index() == stack_index);
     return loc;
   }
 
-  bool IsDoubleStackSlot() const {
-    return kind() == kDoubleStackSlot;
-  }
+  bool IsDoubleStackSlot() const { return kind() == kDoubleStackSlot; }
 
   static Location QuadStackSlot(intptr_t stack_index) {
-    uword payload = StackSlotBaseField::encode(FPREG)
-        | StackIndexField::encode(EncodeStackIndex(stack_index));
+    uword payload = StackSlotBaseField::encode(FPREG) |
+                    StackIndexField::encode(EncodeStackIndex(stack_index));
     Location loc(kQuadStackSlot, payload);
     // Ensure that sign is preserved.
     ASSERT(loc.stack_index() == stack_index);
     return loc;
   }
 
-  bool IsQuadStackSlot() const {
-    return kind() == kQuadStackSlot;
-  }
+  bool IsQuadStackSlot() const { return kind() == kQuadStackSlot; }
 
   Register base_reg() const {
     ASSERT(HasStackIndex());
@@ -341,7 +317,7 @@
     return IsStackSlot() || IsDoubleStackSlot() || IsQuadStackSlot();
   }
 
-  // DBC does not have an notion of 'address' in its instruction set.
+// DBC does not have an notion of 'address' in its instruction set.
 #if !defined(TARGET_ARCH_DBC)
   // Return a memory operand for stack slot locations.
   Address ToStackSlotAddress() const;
@@ -364,15 +340,11 @@
   const char* ToCString() const;
 
   // Compare two locations.
-  bool Equals(Location other) const {
-    return value_ == other.value_;
-  }
+  bool Equals(Location other) const { return value_ == other.value_; }
 
   // If current location is constant might return something that
   // is not equal to any Kind.
-  Kind kind() const {
-    return KindField::decode(value_);
-  }
+  Kind kind() const { return KindField::decode(value_); }
 
   Location Copy() const;
 
@@ -381,37 +353,36 @@
                             intptr_t* fpu_reg_slots) const;
 
  private:
-  explicit Location(uword value) : value_(value) { }
+  explicit Location(uword value) : value_(value) {}
 
   Location(Kind kind, uword payload)
-      : value_(KindField::encode(kind) | PayloadField::encode(payload)) { }
+      : value_(KindField::encode(kind) | PayloadField::encode(payload)) {}
 
-  uword payload() const {
-    return PayloadField::decode(value_);
-  }
+  uword payload() const { return PayloadField::decode(value_); }
 
   class KindField : public BitField<uword, Kind, 0, kBitsForKind> {};
-  class PayloadField :
-      public BitField<uword, uword, kBitsForKind, kBitsForPayload> {};
+  class PayloadField
+      : public BitField<uword, uword, kBitsForKind, kBitsForPayload> {};
 
   // Layout for kUnallocated locations payload.
   typedef BitField<uword, Policy, 0, 3> PolicyField;
 
-  // Layout for stack slots.
+// Layout for stack slots.
 #if defined(ARCH_IS_64_BIT)
   static const intptr_t kBitsForBaseReg = 6;
 #else
   static const intptr_t kBitsForBaseReg = 5;
 #endif
   static const intptr_t kBitsForStackIndex = kBitsForPayload - kBitsForBaseReg;
-  class StackSlotBaseField :
-      public BitField<uword, Register, 0, kBitsForBaseReg> {};
-  class StackIndexField :
-      public BitField<uword, intptr_t, kBitsForBaseReg, kBitsForStackIndex> {};
+  class StackSlotBaseField
+      : public BitField<uword, Register, 0, kBitsForBaseReg> {};
+  class StackIndexField
+      : public BitField<uword, intptr_t, kBitsForBaseReg, kBitsForStackIndex> {
+  };
   COMPILE_ASSERT(1 << kBitsForBaseReg >= kNumberOfCpuRegisters);
 
-  static const intptr_t kStackIndexBias =
-      static_cast<intptr_t>(1) << (kBitsForStackIndex - 1);
+  static const intptr_t kStackIndexBias = static_cast<intptr_t>(1)
+                                          << (kBitsForStackIndex - 1);
 
   // Location either contains kind and payload fields or a tagged handle for
   // a constant locations. Values of enumeration Kind are selected in such a
@@ -454,12 +425,12 @@
 };
 
 
-template<typename T>
+template <typename T>
 class SmallSet {
  public:
-  SmallSet() : data_(0) { }
+  SmallSet() : data_(0) {}
 
-  explicit SmallSet(intptr_t data) : data_(data) { }
+  explicit SmallSet(intptr_t data) : data_(data) {}
 
   bool Contains(T value) const { return (data_ & ToMask(value)) != 0; }
 
@@ -484,9 +455,7 @@
 class RegisterSet : public ValueObject {
  public:
   RegisterSet()
-      : cpu_registers_(),
-        untagged_cpu_registers_(),
-        fpu_registers_() {
+      : cpu_registers_(), untagged_cpu_registers_(), fpu_registers_() {
     ASSERT(kNumberOfCpuRegisters <= (kWordSize * kBitsPerByte));
     ASSERT(kNumberOfFpuRegisters <= (kWordSize * kBitsPerByte));
   }
@@ -528,7 +497,7 @@
       Register r = static_cast<Register>(i);
       if (ContainsRegister(r)) {
         THR_Print("%s %s\n", Assembler::RegisterName(r),
-                           IsTagged(r) ? "tagged" : "untagged");
+                  IsTagged(r) ? "tagged" : "untagged");
       }
     }
 
@@ -584,20 +553,14 @@
 // Specification of locations for inputs and output.
 class LocationSummary : public ZoneAllocated {
  public:
-  enum ContainsCall {
-    kNoCall,
-    kCall,
-    kCallOnSlowPath
-  };
+  enum ContainsCall { kNoCall, kCall, kCallOnSlowPath };
 
   LocationSummary(Zone* zone,
                   intptr_t input_count,
                   intptr_t temp_count,
                   LocationSummary::ContainsCall contains_call);
 
-  intptr_t input_count() const {
-    return num_inputs_;
-  }
+  intptr_t input_count() const { return num_inputs_; }
 
   Location in(intptr_t index) const {
     ASSERT(index >= 0);
@@ -618,9 +581,7 @@
     input_locations_[index] = loc;
   }
 
-  intptr_t temp_count() const {
-    return num_temps_;
-  }
+  intptr_t temp_count() const { return num_temps_; }
 
   Location temp(intptr_t index) const {
     ASSERT(index >= 0);
@@ -641,9 +602,7 @@
     temp_locations_[index] = loc;
   }
 
-  intptr_t output_count() const {
-    return 1;
-  }
+  intptr_t output_count() const { return 1; }
 
   Location out(intptr_t index) const {
     ASSERT(index == 0);
@@ -657,12 +616,11 @@
 
   void set_out(intptr_t index, Location loc) {
     ASSERT(index == 0);
-    // DBC calls are different from call on other architectures so this
-    // assert doesn't make sense.
+// DBC calls are different from call on other architectures so this
+// assert doesn't make sense.
 #if !defined(TARGET_ARCH_DBC)
-    ASSERT(!always_calls() ||
-           (loc.IsMachineRegister() || loc.IsInvalid() ||
-            loc.IsPairLocation()));
+    ASSERT(!always_calls() || (loc.IsMachineRegister() || loc.IsInvalid() ||
+                               loc.IsPairLocation()));
 #endif
     output_location_ = loc;
   }
@@ -673,21 +631,13 @@
     }
     return stack_bitmap_;
   }
-  void SetStackBit(intptr_t index) {
-    stack_bitmap()->Set(index, true);
-  }
+  void SetStackBit(intptr_t index) { stack_bitmap()->Set(index, true); }
 
-  bool always_calls() const {
-    return contains_call_ == kCall;
-  }
+  bool always_calls() const { return contains_call_ == kCall; }
 
-  bool can_call() {
-    return contains_call_ != kNoCall;
-  }
+  bool can_call() { return contains_call_ != kNoCall; }
 
-  bool HasCallOnSlowPath() {
-    return can_call() && !always_calls();
-  }
+  bool HasCallOnSlowPath() { return can_call() && !always_calls(); }
 
   void PrintTo(BufferFormatter* f) const;
 
@@ -696,9 +646,7 @@
                                Location out,
                                ContainsCall contains_call);
 
-  RegisterSet* live_registers() {
-    return &live_registers_;
-  }
+  RegisterSet* live_registers() { return &live_registers_; }
 
 #if defined(DEBUG)
   // Debug only verification that ensures that writable registers are correctly
diff --git a/runtime/vm/lockers.cc b/runtime/vm/lockers.cc
index 39733da..6b47e28 100644
--- a/runtime/vm/lockers.cc
+++ b/runtime/vm/lockers.cc
@@ -15,8 +15,8 @@
   uint32_t old_state = Thread::SetAtSafepoint(true, 0);
   uword addr =
       reinterpret_cast<uword>(thread) + Thread::safepoint_state_offset();
-  if (AtomicOperations::CompareAndSwapUint32(
-          reinterpret_cast<uint32_t*>(addr), old_state, 0) != old_state) {
+  if (AtomicOperations::CompareAndSwapUint32(reinterpret_cast<uint32_t*>(addr),
+                                             old_state, 0) != old_state) {
     // Fast update failed which means we could potentially be in the middle
     // of a safepoint operation and need to block for it.
     SafepointHandler* handler = thread->isolate()->safepoint_handler();
@@ -38,8 +38,8 @@
   uint32_t old_state = Thread::SetAtSafepoint(true, 0);
   uword addr =
       reinterpret_cast<uword>(thread) + Thread::safepoint_state_offset();
-  if (AtomicOperations::CompareAndSwapUint32(
-          reinterpret_cast<uint32_t*>(addr), old_state, 0) != old_state) {
+  if (AtomicOperations::CompareAndSwapUint32(reinterpret_cast<uint32_t*>(addr),
+                                             old_state, 0) != old_state) {
     // Fast update failed which means we could potentially be in the middle
     // of a safepoint operation and need to block for it.
     monitor_->Exit();
diff --git a/runtime/vm/lockers.h b/runtime/vm/lockers.h
index 1ffe532..d16c77e 100644
--- a/runtime/vm/lockers.h
+++ b/runtime/vm/lockers.h
@@ -170,19 +170,16 @@
   }
 
   Monitor::WaitResult WaitWithSafepointCheck(
-      Thread* thread, int64_t millis = Monitor::kNoTimeout);
+      Thread* thread,
+      int64_t millis = Monitor::kNoTimeout);
 
   Monitor::WaitResult WaitMicros(int64_t micros = Monitor::kNoTimeout) {
     return monitor_->WaitMicros(micros);
   }
 
-  void Notify() {
-    monitor_->Notify();
-  }
+  void Notify() { monitor_->Notify(); }
 
-  void NotifyAll() {
-    monitor_->NotifyAll();
-  }
+  void NotifyAll() { monitor_->NotifyAll(); }
 
  private:
   Monitor* const monitor_;
@@ -212,9 +209,7 @@
 class SafepointMutexLocker : public ValueObject {
  public:
   explicit SafepointMutexLocker(Mutex* mutex);
-  virtual ~SafepointMutexLocker() {
-    mutex_->Unlock();
-  }
+  virtual ~SafepointMutexLocker() { mutex_->Unlock(); }
 
  private:
   Mutex* const mutex_;
@@ -243,9 +238,7 @@
 class SafepointMonitorLocker : public ValueObject {
  public:
   explicit SafepointMonitorLocker(Monitor* monitor);
-  virtual ~SafepointMonitorLocker() {
-    monitor_->Exit();
-  }
+  virtual ~SafepointMonitorLocker() { monitor_->Exit(); }
 
   Monitor::WaitResult Wait(int64_t millis = Monitor::kNoTimeout);
 
diff --git a/runtime/vm/log.cc b/runtime/vm/log.cc
index f5247c7..15e3e20 100644
--- a/runtime/vm/log.cc
+++ b/runtime/vm/log.cc
@@ -11,16 +11,15 @@
 
 DEFINE_FLAG(bool, force_log_flush, false, "Always flush log messages.");
 
-DEFINE_FLAG(charp, isolate_log_filter, NULL,
+DEFINE_FLAG(charp,
+            isolate_log_filter,
+            NULL,
             "Log isolates whose name include the filter. "
             "Default: service isolate log messages are suppressed "
             "(specify 'vm-service' to log them).");
 
 Log::Log(LogPrinter printer)
-    : printer_(printer),
-      manual_flush_(0),
-      buffer_(0) {
-}
+    : printer_(printer), manual_flush_(0), buffer_(0) {}
 
 
 Log::~Log() {
diff --git a/runtime/vm/log.h b/runtime/vm/log.h
index e6cc336..c9cafc8 100644
--- a/runtime/vm/log.h
+++ b/runtime/vm/log.h
@@ -15,15 +15,12 @@
 class Thread;
 
 #if defined(_MSC_VER)
-#define THR_Print(format, ...) \
-    Log::Current()->Print(format, __VA_ARGS__)
+#define THR_Print(format, ...) Log::Current()->Print(format, __VA_ARGS__)
 #else
-#define THR_Print(format, ...) \
-    Log::Current()->Print(format, ##__VA_ARGS__)
+#define THR_Print(format, ...) Log::Current()->Print(format, ##__VA_ARGS__)
 #endif
 
-#define THR_VPrint(format, args) \
-    Log::Current()->VPrint(format, args)
+#define THR_VPrint(format, args) Log::Current()->VPrint(format, args)
 
 typedef void (*LogPrinter)(const char* str, ...);
 
diff --git a/runtime/vm/longjump.cc b/runtime/vm/longjump.cc
index 2bc7e31..d79ee76 100644
--- a/runtime/vm/longjump.cc
+++ b/runtime/vm/longjump.cc
@@ -31,8 +31,8 @@
   Simulator* sim = Simulator::Current();
   // When using simulator, only mutator thread should refer to Simulator
   // since there can be only one per isolate.
-  uword top_exit_frame_info = thread->IsMutatorThread() ?
-      sim->top_exit_frame_info() : 0;
+  uword top_exit_frame_info =
+      thread->IsMutatorThread() ? sim->top_exit_frame_info() : 0;
 #else
   uword top_exit_frame_info = thread->top_exit_frame_info();
 #endif
@@ -56,7 +56,7 @@
 #if defined(DEBUG)
 #define CHECK_REUSABLE_HANDLE(name)                                            \
   ASSERT(!thread->reusable_##name##_handle_scope_active());
-REUSABLE_HANDLE_LIST(CHECK_REUSABLE_HANDLE)
+  REUSABLE_HANDLE_LIST(CHECK_REUSABLE_HANDLE)
 #undef CHECK_REUSABLE_HANDLE
 #endif  // defined(DEBUG)
 
diff --git a/runtime/vm/longjump.h b/runtime/vm/longjump.h
index b62230f..7fbe9eb 100644
--- a/runtime/vm/longjump.h
+++ b/runtime/vm/longjump.h
@@ -17,15 +17,13 @@
 class LongJumpScope : public StackResource {
  public:
   LongJumpScope()
-    : StackResource(Thread::Current()),
-      top_(NULL),
-      base_(Thread::Current()->long_jump_base()) {
+      : StackResource(Thread::Current()),
+        top_(NULL),
+        base_(Thread::Current()->long_jump_base()) {
     Thread::Current()->set_long_jump_base(this);
   }
 
-  ~LongJumpScope() {
-    Thread::Current()->set_long_jump_base(base_);
-  }
+  ~LongJumpScope() { Thread::Current()->set_long_jump_base(base_); }
 
   jmp_buf* Set();
   void Jump(int value, const Error& error);
diff --git a/runtime/vm/longjump_test.cc b/runtime/vm/longjump_test.cc
index 4f48050..5e35c0c 100644
--- a/runtime/vm/longjump_test.cc
+++ b/runtime/vm/longjump_test.cc
@@ -9,9 +9,8 @@
 namespace dart {
 
 static void LongJumpHelper(LongJumpScope* jump) {
-  const Error& error =
-      Error::Handle(LanguageError::New(
-          String::Handle(String::New("LongJumpHelper"))));
+  const Error& error = Error::Handle(
+      LanguageError::New(String::Handle(String::New("LongJumpHelper"))));
   jump->Jump(1, error);
   UNREACHABLE();
 }
diff --git a/runtime/vm/megamorphic_cache_table.cc b/runtime/vm/megamorphic_cache_table.cc
index 8a4e6af..c6edb75 100644
--- a/runtime/vm/megamorphic_cache_table.cc
+++ b/runtime/vm/megamorphic_cache_table.cc
@@ -53,25 +53,22 @@
 void MegamorphicCacheTable::InitMissHandler(Isolate* isolate) {
   // The miss handler for a class ID not found in the table is invoked as a
   // normal Dart function.
-  const Code& code =
-      Code::Handle(StubCode::Generate("_stub_MegamorphicMiss",
-                                      StubCode::GenerateMegamorphicMissStub));
+  const Code& code = Code::Handle(StubCode::Generate(
+      "_stub_MegamorphicMiss", StubCode::GenerateMegamorphicMissStub));
   // When FLAG_lazy_dispatchers=false, this stub can be on the stack during
   // exceptions, but it has a corresponding function so IsStubCode is false and
   // it is considered in the search for an exception handler.
   code.set_exception_handlers(Object::empty_exception_handlers());
   const Class& cls =
       Class::Handle(Type::Handle(Type::DartFunctionType()).type_class());
-  const Function& function =
-      Function::Handle(Function::New(Symbols::MegamorphicMiss(),
-                                     RawFunction::kRegularFunction,
-                                     true,  // Static, but called as a method.
-                                     false,  // Not const.
-                                     false,  // Not abstract.
-                                     false,  // Not external.
-                                     false,  // Not native.
-                                     cls,
-                                     TokenPosition::kNoSource));
+  const Function& function = Function::Handle(
+      Function::New(Symbols::MegamorphicMiss(), RawFunction::kRegularFunction,
+                    true,   // Static, but called as a method.
+                    false,  // Not const.
+                    false,  // Not abstract.
+                    false,  // Not external.
+                    false,  // Not native.
+                    cls, TokenPosition::kNoSource));
   function.set_result_type(Type::Handle(Type::DynamicType()));
   function.set_is_debuggable(false);
   function.set_is_visible(false);
@@ -101,8 +98,8 @@
       max_size = buckets.Length();
     }
   }
-  OS::Print("%" Pd " megamorphic caches using %" Pd "KB.\n",
-            table.Length(), size / 1024);
+  OS::Print("%" Pd " megamorphic caches using %" Pd "KB.\n", table.Length(),
+            size / 1024);
 
   intptr_t* probe_counts = new intptr_t[max_size];
   intptr_t entry_count = 0;
@@ -143,10 +140,9 @@
   intptr_t cumulative_entries = 0;
   for (intptr_t i = 0; i <= max_probe_count; i++) {
     cumulative_entries += probe_counts[i];
-    OS::Print("Megamorphic probe %" Pd ": %" Pd " (%lf)\n",
-              i, probe_counts[i],
+    OS::Print("Megamorphic probe %" Pd ": %" Pd " (%lf)\n", i, probe_counts[i],
               static_cast<double>(cumulative_entries) /
-              static_cast<double>(entry_count));
+                  static_cast<double>(entry_count));
   }
   delete[] probe_counts;
 }
diff --git a/runtime/vm/memory_region.cc b/runtime/vm/memory_region.cc
index ce0a107..0b4603d 100644
--- a/runtime/vm/memory_region.cc
+++ b/runtime/vm/memory_region.cc
@@ -10,8 +10,8 @@
   ASSERT(from.pointer() != NULL && from.size() > 0);
   ASSERT(this->size() >= from.size());
   ASSERT(offset <= this->size() - from.size());
-  memmove(reinterpret_cast<void*>(start() + offset),
-          from.pointer(), from.size());
+  memmove(reinterpret_cast<void*>(start() + offset), from.pointer(),
+          from.size());
 }
 
 }  // namespace dart
diff --git a/runtime/vm/memory_region.h b/runtime/vm/memory_region.h
index 807588b..2b1763a 100644
--- a/runtime/vm/memory_region.h
+++ b/runtime/vm/memory_region.h
@@ -16,8 +16,8 @@
 // of the region.
 class MemoryRegion : public ValueObject {
  public:
-  MemoryRegion() : pointer_(NULL), size_(0) { }
-  MemoryRegion(void* pointer, uword size) : pointer_(pointer), size_(size) { }
+  MemoryRegion() : pointer_(NULL), size_(0) {}
+  MemoryRegion(void* pointer, uword size) : pointer_(pointer), size_(size) {}
   MemoryRegion(const MemoryRegion& other) : ValueObject() { *this = other; }
   MemoryRegion& operator=(const MemoryRegion& other) {
     pointer_ = other.pointer_;
@@ -34,15 +34,18 @@
   uword start() const { return reinterpret_cast<uword>(pointer_); }
   uword end() const { return start() + size_; }
 
-  template<typename T> T Load(uword offset) const {
+  template <typename T>
+  T Load(uword offset) const {
     return *ComputeInternalPointer<T>(offset);
   }
 
-  template<typename T> void Store(uword offset, T value) const {
+  template <typename T>
+  void Store(uword offset, T value) const {
     *ComputeInternalPointer<T>(offset) = value;
   }
 
-  template<typename T> T* PointerTo(uword offset) const {
+  template <typename T>
+  T* PointerTo(uword offset) const {
     return ComputeInternalPointer<T>(offset);
   }
 
@@ -67,7 +70,8 @@
   }
 
  private:
-  template<typename T> T* ComputeInternalPointer(uword offset) const {
+  template <typename T>
+  T* ComputeInternalPointer(uword offset) const {
     ASSERT(size() >= sizeof(T));
     ASSERT(offset <= size() - sizeof(T));
     return reinterpret_cast<T*>(start() + offset);
diff --git a/runtime/vm/message.cc b/runtime/vm/message.cc
index 0cb618a..4d5fc31 100644
--- a/runtime/vm/message.cc
+++ b/runtime/vm/message.cc
@@ -30,10 +30,10 @@
   switch (priority) {
     case kNormalPriority:
       return "Normal";
-    break;
+      break;
     case kOOBPriority:
       return "OOB";
-    break;
+      break;
     default:
       UNIMPLEMENTED();
       return NULL;
@@ -65,9 +65,9 @@
   } else {
     ASSERT(tail_ != NULL);
     if (!before_events) {
-        // Append at the tail.
-        tail_->next_ = msg;
-        tail_ = msg;
+      // Append at the tail.
+      tail_->next_ = msg;
+      tail_ = msg;
     } else {
       ASSERT(msg->dest_port() == Message::kIllegalPort);
       if (head_->dest_port() != Message::kIllegalPort) {
@@ -106,7 +106,7 @@
     }
 #if defined(DEBUG)
     result->next_ = result;  // Make sure to trigger ASSERT in Enqueue.
-#endif  // DEBUG
+#endif                       // DEBUG
     return result;
   }
   return NULL;
@@ -129,14 +129,12 @@
 }
 
 
-MessageQueue::Iterator::Iterator(const MessageQueue* queue)
-    : next_(NULL) {
+MessageQueue::Iterator::Iterator(const MessageQueue* queue) : next_(NULL) {
   Reset(queue);
 }
 
 
-MessageQueue::Iterator::~Iterator() {
-}
+MessageQueue::Iterator::~Iterator() {}
 
 void MessageQueue::Iterator::Reset(const MessageQueue* queue) {
   ASSERT(queue != NULL);
@@ -171,7 +169,7 @@
   MessageQueue::Iterator it(this);
   while (it.HasNext()) {
     Message* current = it.Next();
-     ASSERT(current != NULL);
+    ASSERT(current != NULL);
     if (current->Id() == id) {
       return current;
     }
@@ -196,14 +194,13 @@
     JSONObject message(&messages);
     message.AddProperty("type", "Message");
     message.AddPropertyF("name", "Isolate Message (%" Px ")", current->Id());
-    message.AddPropertyF("messageObjectId", "messages/%" Px "",
-                         current->Id());
+    message.AddPropertyF("messageObjectId", "messages/%" Px "", current->Id());
     message.AddProperty("size", current->len());
     message.AddProperty("index", depth++);
     message.AddPropertyF("_destinationPort", "%" Pd64 "",
-        static_cast<int64_t>(current->dest_port()));
+                         static_cast<int64_t>(current->dest_port()));
     message.AddProperty("_priority",
-        Message::PriorityAsString(current->priority()));
+                        Message::PriorityAsString(current->priority()));
     // TODO(johnmccutchan): Move port -> handler map out of Dart and into the
     // VM, that way we can lookup the handler without invoking Dart code.
     msg_handler = DartLibraryCalls::LookupHandler(current->dest_port());
diff --git a/runtime/vm/message.h b/runtime/vm/message.h
index 7227e73..4765ef2 100644
--- a/runtime/vm/message.h
+++ b/runtime/vm/message.h
@@ -87,9 +87,7 @@
     ASSERT(len_ > 0);
     return data_;
   }
-  intptr_t len() const {
-    return len_;
-  }
+  intptr_t len() const { return len_; }
   RawObject* raw_obj() const {
     ASSERT(len_ == 0);
     return reinterpret_cast<RawObject*>(data_);
diff --git a/runtime/vm/message_handler.cc b/runtime/vm/message_handler.cc
index 80cfbbf..f98ec65 100644
--- a/runtime/vm/message_handler.cc
+++ b/runtime/vm/message_handler.cc
@@ -19,8 +19,7 @@
 
 class MessageHandlerTask : public ThreadPool::Task {
  public:
-  explicit MessageHandlerTask(MessageHandler* handler)
-      : handler_(handler) {
+  explicit MessageHandlerTask(MessageHandler* handler) : handler_(handler) {
     ASSERT(handler != NULL);
   }
 
@@ -110,9 +109,10 @@
   bool task_running;
   MonitorLocker ml(&monitor_);
   if (FLAG_trace_isolates) {
-    OS::Print("[+] Starting message handler:\n"
-              "\thandler:    %s\n",
-              name());
+    OS::Print(
+        "[+] Starting message handler:\n"
+        "\thandler:    %s\n",
+        name());
   }
   ASSERT(pool_ == NULL);
   ASSERT(!delete_me_);
@@ -137,12 +137,14 @@
       if (source_isolate) {
         source_name = source_isolate->name();
       }
-      OS::Print("[>] Posting message:\n"
-                "\tlen:        %" Pd "\n"
-                "\tsource:     %s\n"
-                "\tdest:       %s\n"
-                "\tdest_port:  %" Pd64 "\n",
-                message->len(), source_name, name(), message->dest_port());
+      OS::Print(
+          "[>] Posting message:\n"
+          "\tlen:        %" Pd
+          "\n"
+          "\tsource:     %s\n"
+          "\tdest:       %s\n"
+          "\tdest_port:  %" Pd64 "\n",
+          message->len(), source_name, name(), message->dest_port());
     }
 
     saved_priority = message->priority();
@@ -191,18 +193,20 @@
   StartIsolateScope start_isolate(isolate());
 
   MessageStatus max_status = kOK;
-  Message::Priority min_priority = ((allow_normal_messages && !paused())
-                                    ? Message::kNormalPriority
-                                    : Message::kOOBPriority);
+  Message::Priority min_priority =
+      ((allow_normal_messages && !paused()) ? Message::kNormalPriority
+                                            : Message::kOOBPriority);
   Message* message = DequeueMessage(min_priority);
   while (message != NULL) {
     intptr_t message_len = message->len();
     if (FLAG_trace_isolates) {
-      OS::Print("[<] Handling message:\n"
-                "\tlen:        %" Pd "\n"
-                "\thandler:    %s\n"
-                "\tport:       %" Pd64 "\n",
-                message_len, name(), message->dest_port());
+      OS::Print(
+          "[<] Handling message:\n"
+          "\tlen:        %" Pd
+          "\n"
+          "\thandler:    %s\n"
+          "\tport:       %" Pd64 "\n",
+          message_len, name(), message->dest_port());
     }
 
     // Release the monitor_ temporarily while we handle the message.
@@ -217,12 +221,13 @@
     message = NULL;  // May be deleted by now.
     ml->Enter();
     if (FLAG_trace_isolates) {
-      OS::Print("[.] Message handled (%s):\n"
-                "\tlen:        %" Pd "\n"
-                "\thandler:    %s\n"
-                "\tport:       %" Pd64 "\n",
-                MessageStatusString(status),
-                message_len, name(), saved_dest_port);
+      OS::Print(
+          "[.] Message handled (%s):\n"
+          "\tlen:        %" Pd
+          "\n"
+          "\thandler:    %s\n"
+          "\tport:       %" Pd64 "\n",
+          MessageStatusString(status), message_len, name(), saved_dest_port);
     }
     // If we are shutting down, do not process any more messages.
     if (status == kShutdown) {
@@ -245,8 +250,8 @@
     // Even if we encounter an error, we still process pending OOB
     // messages so that we don't lose the message notification.
     min_priority = (((max_status == kOK) && allow_normal_messages && !paused())
-                    ? Message::kNormalPriority
-                    : Message::kOOBPriority);
+                        ? Message::kNormalPriority
+                        : Message::kOOBPriority);
     message = DequeueMessage(min_priority);
   }
   return max_status;
@@ -375,8 +380,10 @@
       if (ShouldPauseOnExit(status)) {
         if (!is_paused_on_exit()) {
           if (FLAG_trace_service_pause_events) {
-            OS::PrintErr("Isolate %s paused before exiting. "
-                         "Use the Observatory to release it.\n", name());
+            OS::PrintErr(
+                "Isolate %s paused before exiting. "
+                "Use the Observatory to release it.\n",
+                name());
           }
           PausedOnExitLocked(&ml, true);
           // More messages may have come in while we released the monitor.
@@ -394,14 +401,16 @@
       if (FLAG_trace_isolates) {
         if (status != kOK && thread() != NULL) {
           const Error& error = Error::Handle(thread()->sticky_error());
-          OS::Print("[-] Stopping message handler (%s):\n"
-                    "\thandler:    %s\n"
-                    "\terror:    %s\n",
-                    MessageStatusString(status), name(), error.ToCString());
+          OS::Print(
+              "[-] Stopping message handler (%s):\n"
+              "\thandler:    %s\n"
+              "\terror:    %s\n",
+              MessageStatusString(status), name(), error.ToCString());
         } else {
-          OS::Print("[-] Stopping message handler (%s):\n"
-                    "\thandler:    %s\n",
-                    MessageStatusString(status), name());
+          OS::Print(
+              "[-] Stopping message handler (%s):\n"
+              "\thandler:    %s\n",
+              MessageStatusString(status), name());
         }
       }
       pool_ = NULL;
@@ -431,11 +440,13 @@
 void MessageHandler::ClosePort(Dart_Port port) {
   MonitorLocker ml(&monitor_);
   if (FLAG_trace_isolates) {
-    OS::Print("[-] Closing port:\n"
-              "\thandler:    %s\n"
-              "\tport:       %" Pd64 "\n"
-              "\tports:      live(%" Pd ")\n",
-              name(), port, live_ports_);
+    OS::Print(
+        "[-] Closing port:\n"
+        "\thandler:    %s\n"
+        "\tport:       %" Pd64
+        "\n"
+        "\tports:      live(%" Pd ")\n",
+        name(), port, live_ports_);
   }
 }
 
@@ -443,9 +454,10 @@
 void MessageHandler::CloseAllPorts() {
   MonitorLocker ml(&monitor_);
   if (FLAG_trace_isolates) {
-    OS::Print("[-] Closing all ports:\n"
-              "\thandler:    %s\n",
-              name());
+    OS::Print(
+        "[-] Closing all ports:\n"
+        "\thandler:    %s\n",
+        name());
   }
   queue_->Clear();
   oob_queue_->Clear();
diff --git a/runtime/vm/message_handler.h b/runtime/vm/message_handler.h
index 150dac6..88942ed 100644
--- a/runtime/vm/message_handler.h
+++ b/runtime/vm/message_handler.h
@@ -77,47 +77,38 @@
   // A message handler tracks how many live ports it has.
   bool HasLivePorts() const { return live_ports_ > 0; }
 
-  intptr_t live_ports() const {
-    return live_ports_;
-  }
+  intptr_t live_ports() const { return live_ports_; }
 
   void DebugDump();
 
   bool paused() const { return paused_ > 0; }
 
   void increment_paused() { paused_++; }
-  void decrement_paused() { ASSERT(paused_ > 0); paused_--; }
+  void decrement_paused() {
+    ASSERT(paused_ > 0);
+    paused_--;
+  }
 
   bool ShouldPauseOnStart(MessageStatus status) const;
-  bool should_pause_on_start() const {
-    return should_pause_on_start_;
-  }
+  bool should_pause_on_start() const { return should_pause_on_start_; }
 
   void set_should_pause_on_start(bool should_pause_on_start) {
     should_pause_on_start_ = should_pause_on_start;
   }
 
-  bool is_paused_on_start() const {
-    return is_paused_on_start_;
-  }
+  bool is_paused_on_start() const { return is_paused_on_start_; }
 
   bool ShouldPauseOnExit(MessageStatus status) const;
-  bool should_pause_on_exit() const {
-    return should_pause_on_exit_;
-  }
+  bool should_pause_on_exit() const { return should_pause_on_exit_; }
 
   void set_should_pause_on_exit(bool should_pause_on_exit) {
     should_pause_on_exit_ = should_pause_on_exit;
   }
 
-  bool is_paused_on_exit() const {
-    return is_paused_on_exit_;
-  }
+  bool is_paused_on_exit() const { return is_paused_on_exit_; }
 
   // Timestamp of the paused on start or paused on exit.
-  int64_t paused_timestamp() const {
-    return paused_timestamp_;
-  }
+  int64_t paused_timestamp() const { return paused_timestamp_; }
 
   void PausedOnStart(bool paused);
   void PausedOnExit(bool paused);
@@ -240,7 +231,7 @@
   // thread.
   bool oob_message_handling_allowed_;
   intptr_t live_ports_;  // The number of open ports, including control ports.
-  intptr_t paused_;  // The number of pause messages received.
+  intptr_t paused_;      // The number of pause messages received.
   bool should_pause_on_start_;
   bool should_pause_on_exit_;
   bool is_paused_on_start_;
diff --git a/runtime/vm/message_handler_test.cc b/runtime/vm/message_handler_test.cc
index e6a39a6..fedb823 100644
--- a/runtime/vm/message_handler_test.cc
+++ b/runtime/vm/message_handler_test.cc
@@ -39,16 +39,11 @@
         message_count_(0),
         start_called_(false),
         end_called_(false),
-        results_(NULL) {
-  }
+        results_(NULL) {}
 
-  ~TestMessageHandler() {
-    delete[] port_buffer_;
-  }
+  ~TestMessageHandler() { delete[] port_buffer_; }
 
-  void MessageNotify(Message::Priority priority) {
-    notify_count_++;
-  }
+  void MessageNotify(Message::Priority priority) { notify_count_++; }
 
   MessageStatus HandleMessage(Message* message) {
     // For testing purposes, keep a list of the ports
@@ -248,9 +243,9 @@
 UNIT_TEST_CASE(MessageHandler_HandleNextMessage_ProcessOOBAfterError) {
   TestMessageHandler handler;
   MessageHandler::MessageStatus results[] = {
-    MessageHandler::kError,     // oob_message1
-    MessageHandler::kOK,        // oob_message2
-    MessageHandler::kOK,        // unused
+      MessageHandler::kError,  // oob_message1
+      MessageHandler::kOK,     // oob_message2
+      MessageHandler::kOK,     // unused
   };
   handler.set_results(results);
   MessageHandlerTestPeer handler_peer(&handler);
@@ -278,10 +273,10 @@
 UNIT_TEST_CASE(MessageHandler_HandleNextMessage_Shutdown) {
   TestMessageHandler handler;
   MessageHandler::MessageStatus results[] = {
-    MessageHandler::kOK,        // oob_message1
-    MessageHandler::kShutdown,  // oob_message2
-    MessageHandler::kOK,        // unused
-    MessageHandler::kOK,        // unused
+      MessageHandler::kOK,        // oob_message1
+      MessageHandler::kShutdown,  // oob_message2
+      MessageHandler::kOK,        // unused
+      MessageHandler::kOK,        // unused
   };
   handler.set_results(results);
   MessageHandlerTestPeer handler_peer(&handler);
@@ -368,9 +363,7 @@
   EXPECT(!handler.HasLivePorts());
   handler_peer.increment_live_ports();
 
-  handler.Run(&pool,
-              TestStartFunction,
-              TestEndFunction,
+  handler.Run(&pool, TestStartFunction, TestEndFunction,
               reinterpret_cast<uword>(&handler));
   Dart_Port port = PortMap::CreatePort(&handler);
   Message* message = new Message(port, NULL, 0, Message::kNormalPriority);
diff --git a/runtime/vm/message_test.cc b/runtime/vm/message_test.cc
index 5250a77..d496a7b 100644
--- a/runtime/vm/message_test.cc
+++ b/runtime/vm/message_test.cc
@@ -31,8 +31,8 @@
   const char* str6 = "msg6";
 
   // Add two messages.
-  Message* msg1 = new Message(
-      port, AllocMsg(str1), strlen(str1) + 1, Message::kNormalPriority);
+  Message* msg1 = new Message(port, AllocMsg(str1), strlen(str1) + 1,
+                              Message::kNormalPriority);
   queue.Enqueue(msg1, false);
   EXPECT(queue.Length() == 1);
   EXPECT(!queue.IsEmpty());
@@ -41,8 +41,8 @@
   EXPECT(it.Next() == msg1);
   EXPECT(!it.HasNext());
 
-  Message* msg2 = new Message(
-      port, AllocMsg(str2), strlen(str2) + 1, Message::kNormalPriority);
+  Message* msg2 = new Message(port, AllocMsg(str2), strlen(str2) + 1,
+                              Message::kNormalPriority);
   queue.Enqueue(msg2, false);
   EXPECT(queue.Length() == 2);
   EXPECT(!queue.IsEmpty());
@@ -76,26 +76,23 @@
   EXPECT_STREQ(str2, reinterpret_cast<char*>(msg->data()));
   EXPECT(queue.IsEmpty());
 
-  Message* msg3 = new Message(Message::kIllegalPort,
-                              AllocMsg(str3), strlen(str3) + 1,
-                              Message::kNormalPriority);
+  Message* msg3 = new Message(Message::kIllegalPort, AllocMsg(str3),
+                              strlen(str3) + 1, Message::kNormalPriority);
   queue.Enqueue(msg3, true);
   EXPECT(!queue.IsEmpty());
 
-  Message* msg4 = new Message(Message::kIllegalPort,
-                              AllocMsg(str4), strlen(str4) + 1,
-                              Message::kNormalPriority);
+  Message* msg4 = new Message(Message::kIllegalPort, AllocMsg(str4),
+                              strlen(str4) + 1, Message::kNormalPriority);
   queue.Enqueue(msg4, true);
   EXPECT(!queue.IsEmpty());
 
-  Message* msg5 = new Message(
-      port, AllocMsg(str5), strlen(str5) + 1, Message::kNormalPriority);
+  Message* msg5 = new Message(port, AllocMsg(str5), strlen(str5) + 1,
+                              Message::kNormalPriority);
   queue.Enqueue(msg5, false);
   EXPECT(!queue.IsEmpty());
 
-  Message* msg6 = new Message(Message::kIllegalPort,
-                              AllocMsg(str6), strlen(str6) + 1,
-                              Message::kNormalPriority);
+  Message* msg6 = new Message(Message::kIllegalPort, AllocMsg(str6),
+                              strlen(str6) + 1, Message::kNormalPriority);
   queue.Enqueue(msg6, true);
   EXPECT(!queue.IsEmpty());
 
@@ -137,13 +134,11 @@
   const char* str2 = "msg2";
 
   // Add two messages.
-  Message* msg1 =
-      new Message(port1, AllocMsg(str1), strlen(str1) + 1,
-                  Message::kNormalPriority);
+  Message* msg1 = new Message(port1, AllocMsg(str1), strlen(str1) + 1,
+                              Message::kNormalPriority);
   queue.Enqueue(msg1, false);
-  Message* msg2 =
-      new Message(port2, AllocMsg(str2), strlen(str2) + 1,
-                  Message::kNormalPriority);
+  Message* msg2 = new Message(port2, AllocMsg(str2), strlen(str2) + 1,
+                              Message::kNormalPriority);
   queue.Enqueue(msg2, false);
 
   EXPECT(!queue.IsEmpty());
diff --git a/runtime/vm/method_recognizer.cc b/runtime/vm/method_recognizer.cc
index 649a1fe..f25e4d3 100644
--- a/runtime/vm/method_recognizer.cc
+++ b/runtime/vm/method_recognizer.cc
@@ -27,8 +27,9 @@
 
 intptr_t MethodRecognizer::ResultCid(const Function& function) {
   switch (function.recognized_kind()) {
-#define DEFINE_CASE(cname, fname, ename, result_type, fingerprint) \
-    case k##ename: return k##result_type##Cid;
+#define DEFINE_CASE(cname, fname, ename, result_type, fingerprint)             \
+  case k##ename:                                                               \
+    return k##result_type##Cid;
     RECOGNIZED_LIST(DEFINE_CASE)
 #undef DEFINE_CASE
     default:
@@ -118,12 +119,10 @@
 }
 
 
-#define KIND_TO_STRING(class_name, function_name, enum_name, type, fp) \
+#define KIND_TO_STRING(class_name, function_name, enum_name, type, fp)         \
   #enum_name,
 static const char* recognized_list_method_name[] = {
-  "Unknown",
-  RECOGNIZED_LIST(KIND_TO_STRING)
-};
+    "Unknown", RECOGNIZED_LIST(KIND_TO_STRING)};
 #undef KIND_TO_STRING
 
 const char* MethodRecognizer::KindToCString(Kind kind) {
diff --git a/runtime/vm/method_recognizer.h b/runtime/vm/method_recognizer.h
index 9051240..ed079f6 100644
--- a/runtime/vm/method_recognizer.h
+++ b/runtime/vm/method_recognizer.h
@@ -9,6 +9,7 @@
 
 namespace dart {
 
+// clang-format off
 // (class-name, function-name, recognized enum, result type, fingerprint).
 // When adding a new function add a 0 as fingerprint, build and run to get the
 // correct fingerprint from the mismatch error.
@@ -490,7 +491,9 @@
   V(_TypedList, _setFloat64, ByteArrayBaseSetFloat64, 0x4765edda)              \
   V(_TypedList, _setFloat32x4, ByteArrayBaseSetFloat32x4, 0x7cca4533)          \
   V(_TypedList, _setInt32x4, ByteArrayBaseSetInt32x4, 0x7631bdbc)              \
-  V(Object, get:runtimeType, ObjectRuntimeType, 0x00e7c26b)                    \
+  V(Object, get:runtimeType, ObjectRuntimeType, 0x00e7c26b)
+
+// clang-format on
 
 // Forward declarations.
 class Function;
@@ -502,11 +505,11 @@
  public:
   enum Kind {
     kUnknown,
-#define DEFINE_ENUM_LIST(class_name, function_name, enum_name, type, fp) \
-    k##enum_name,
+#define DEFINE_ENUM_LIST(class_name, function_name, enum_name, type, fp)       \
+  k##enum_name,
     RECOGNIZED_LIST(DEFINE_ENUM_LIST)
 #undef DEFINE_ENUM_LIST
-    kNumRecognizedMethods
+        kNumRecognizedMethods
   };
 
   static Kind RecognizeKind(const Function& function);
@@ -522,14 +525,15 @@
 
 
 #if defined(DART_NO_SNAPSHOT)
-#define CHECK_FINGERPRINT2(f, p0, p1, fp) \
+#define CHECK_FINGERPRINT2(f, p0, p1, fp)                                      \
   ASSERT(f.CheckSourceFingerprint(#p0 ", " #p1, fp))
 
-#define CHECK_FINGERPRINT3(f, p0, p1, p2, fp) \
+#define CHECK_FINGERPRINT3(f, p0, p1, p2, fp)                                  \
   ASSERT(f.CheckSourceFingerprint(#p0 ", " #p1 ", " #p2, fp))
 #endif  // defined(DART_NO_SNAPSHOT).
 
 
+// clang-format off
 // List of recognized list factories:
 // (factory-name-symbol, result-cid, fingerprint).
 #define RECOGNIZED_LIST_FACTORY_LIST(V)                                        \
@@ -547,8 +551,9 @@
   V(_Uint64ArrayFactory, kTypedDataUint64ArrayCid, 0x2c093004)                 \
   V(_Float64ArrayFactory, kTypedDataFloat64ArrayCid, 0x501be4f1)               \
   V(_Float32ArrayFactory, kTypedDataFloat32ArrayCid, 0x738e124b)               \
-  V(_Float32x4ArrayFactory, kTypedDataFloat32x4ArrayCid, 0x7a7dd718)           \
+  V(_Float32x4ArrayFactory, kTypedDataFloat32x4ArrayCid, 0x7a7dd718)
 
+// clang-format on
 
 // Class that recognizes factories and returns corresponding result cid.
 class FactoryRecognizer : public AllStatic {
diff --git a/runtime/vm/metrics.cc b/runtime/vm/metrics.cc
index 137042e..5a2f5a7 100644
--- a/runtime/vm/metrics.cc
+++ b/runtime/vm/metrics.cc
@@ -13,7 +13,9 @@
 
 namespace dart {
 
-DEFINE_FLAG(bool, print_metrics, false,
+DEFINE_FLAG(bool,
+            print_metrics,
+            false,
             "Print metrics when isolates (and the VM) are shutdown.");
 
 Metric* Metric::vm_list_head_ = NULL;
@@ -24,8 +26,7 @@
       description_(NULL),
       unit_(kCounter),
       value_(0),
-      next_(NULL) {
-}
+      next_(NULL) {}
 
 
 void Metric::Init(Isolate* isolate,
@@ -70,8 +71,10 @@
 #ifndef PRODUCT
 static const char* UnitString(intptr_t unit) {
   switch (unit) {
-    case Metric::kCounter: return "counter";
-    case Metric::kByte: return "byte";
+    case Metric::kCounter:
+      return "counter";
+    case Metric::kByte:
+      return "byte";
     default:
       UNREACHABLE();
   }
@@ -122,10 +125,8 @@
         scaled_suffix = "gb";
         scaled_value /= GB;
       }
-      return zone->PrintToString("%.3f %s (%" Pd64 ")",
-                                 scaled_value,
-                                 scaled_suffix,
-                                 value);
+      return zone->PrintToString("%.3f %s (%" Pd64 ")", scaled_value,
+                                 scaled_suffix, value);
     }
     default:
       UNREACHABLE();
@@ -157,7 +158,6 @@
 }
 
 
-
 void Metric::RegisterWithIsolate() {
   ASSERT(isolate_ != NULL);
   ASSERT(next_ == NULL);
@@ -293,7 +293,7 @@
 
 #define VM_METRIC_VARIABLE(type, variable, name, unit)                         \
   static type vm_metric_##variable##_;
-  VM_METRIC_LIST(VM_METRIC_VARIABLE);
+VM_METRIC_LIST(VM_METRIC_VARIABLE);
 #undef VM_METRIC_VARIABLE
 
 
@@ -319,8 +319,7 @@
 }
 
 
-MaxMetric::MaxMetric()
-    : Metric() {
+MaxMetric::MaxMetric() : Metric() {
   set_value(kMinInt64);
 }
 
@@ -332,8 +331,7 @@
 }
 
 
-MinMetric::MinMetric()
-    : Metric() {
+MinMetric::MinMetric() : Metric() {
   set_value(kMaxInt64);
 }
 
diff --git a/runtime/vm/metrics.h b/runtime/vm/metrics.h
index 6694585..fd4449b 100644
--- a/runtime/vm/metrics.h
+++ b/runtime/vm/metrics.h
@@ -25,7 +25,7 @@
   V(MaxMetric, HeapNewCapacityMax, "heap.new.capacity.max", kByte)             \
   V(MetricHeapNewExternal, HeapNewExternal, "heap.new.external", kByte)        \
   V(MetricHeapUsed, HeapGlobalUsed, "heap.global.used", kByte)                 \
-  V(MaxMetric, HeapGlobalUsedMax, "heap.global.used.max", kByte)               \
+  V(MaxMetric, HeapGlobalUsedMax, "heap.global.used.max", kByte)
 
 #define VM_METRIC_LIST(V)                                                      \
   V(MetricIsolateCount, IsolateCount, "vm.isolate.count", kCounter)
@@ -50,9 +50,7 @@
             Unit unit);
 
   // Initialize and register a metric for the VM.
-  void Init(const char* name,
-            const char* description,
-            Unit unit);
+  void Init(const char* name, const char* description, Unit unit);
 
   virtual ~Metric();
 
@@ -72,9 +70,7 @@
   void increment() { value_++; }
 
   Metric* next() const { return next_; }
-  void set_next(Metric* next) {
-    next_ = next;
-  }
+  void set_next(Metric* next) { next_ = next; }
 
   const char* name() const { return name_; }
   const char* description() const { return description_; }
diff --git a/runtime/vm/metrics_test.cc b/runtime/vm/metrics_test.cc
index 1e99b2d..77a762f 100644
--- a/runtime/vm/metrics_test.cc
+++ b/runtime/vm/metrics_test.cc
@@ -16,8 +16,8 @@
 #ifndef PRODUCT
 
 UNIT_TEST_CASE(Metric_Simple) {
-  Dart_CreateIsolate(
-      NULL, NULL, bin::isolate_snapshot_buffer, NULL, NULL, NULL);
+  Dart_CreateIsolate(NULL, NULL, bin::isolate_snapshot_buffer, NULL, NULL,
+                     NULL);
   {
     Metric metric;
 
@@ -45,8 +45,8 @@
 };
 
 UNIT_TEST_CASE(Metric_OnDemand) {
-  Dart_CreateIsolate(
-      NULL, NULL, bin::isolate_snapshot_buffer, NULL, NULL, NULL);
+  Dart_CreateIsolate(NULL, NULL, bin::isolate_snapshot_buffer, NULL, NULL,
+                     NULL);
   {
     Thread* thread = Thread::Current();
     StackZone zone(thread);
@@ -63,10 +63,12 @@
     JSONStream js;
     metric.PrintJSON(&js);
     const char* json = js.ToCString();
-    EXPECT_STREQ("{\"type\":\"Counter\",\"name\":\"a.b.c\",\"description\":"
-                 "\"foobar\",\"unit\":\"byte\","
-                 "\"fixedId\":true,\"id\":\"metrics\\/native\\/a.b.c\""
-                 ",\"value\":99.000000}", json);
+    EXPECT_STREQ(
+        "{\"type\":\"Counter\",\"name\":\"a.b.c\",\"description\":"
+        "\"foobar\",\"unit\":\"byte\","
+        "\"fixedId\":true,\"id\":\"metrics\\/native\\/a.b.c\""
+        ",\"value\":99.000000}",
+        json);
   }
   Dart_ShutdownIsolate();
 }
diff --git a/runtime/vm/mirrors_api_impl.cc b/runtime/vm/mirrors_api_impl.cc
index ddc649b..3ed8355 100644
--- a/runtime/vm/mirrors_api_impl.cc
+++ b/runtime/vm/mirrors_api_impl.cc
@@ -32,7 +32,7 @@
     const Class& cls = Class::Handle(Type::Cast(obj).type_class());
     return Api::NewHandle(T, cls.UserVisibleName());
   } else {
-    RETURN_TYPE_ERROR(Z, object, Class/Type);
+    RETURN_TYPE_ERROR(Z, object, Class / Type);
   }
 }
 
@@ -41,8 +41,9 @@
   DARTSCOPE(Thread::Current());
   const Object& obj = Object::Handle(Z, Api::UnwrapHandle(object));
   if (obj.IsType() || obj.IsClass()) {
-    const Class& cls = (obj.IsType()) ?
-        Class::Handle(Z, Type::Cast(obj).type_class()) : Class::Cast(obj);
+    const Class& cls = (obj.IsType())
+                           ? Class::Handle(Z, Type::Cast(obj).type_class())
+                           : Class::Cast(obj);
     const char* str = cls.ToCString();
     if (str == NULL) {
       RETURN_NULL_ERROR(str);
@@ -50,7 +51,7 @@
     CHECK_CALLBACK_STATE(T);
     return Api::NewHandle(T, String::New(str));
   } else {
-    RETURN_TYPE_ERROR(Z, object, Class/Type);
+    RETURN_TYPE_ERROR(Z, object, Class / Type);
   }
 }
 
@@ -121,8 +122,7 @@
     }
   } else {
     return Api::NewError(
-        "%s expects argument 'target' to be a class or library.",
-        CURRENT_FUNC);
+        "%s expects argument 'target' to be a class or library.", CURRENT_FUNC);
   }
   return Api::NewHandle(T, Array::MakeArray(names));
 }
@@ -191,8 +191,7 @@
     }
   } else {
     return Api::NewError(
-        "%s expects argument 'target' to be a class or library.",
-        CURRENT_FUNC);
+        "%s expects argument 'target' to be a class or library.", CURRENT_FUNC);
   }
 
 #if defined(DEBUG)
@@ -232,8 +231,8 @@
   const Class& owner = Class::Handle(Z, func.Owner());
   ASSERT(!owner.IsNull());
   if (owner.IsTopLevel()) {
-    // Top-level functions are implemented as members of a hidden class. We hide
-    // that class here and instead answer the library.
+// Top-level functions are implemented as members of a hidden class. We hide
+// that class here and instead answer the library.
 #if defined(DEBUG)
     const Library& lib = Library::Handle(Z, owner.library());
     if (lib.IsNull()) {
diff --git a/runtime/vm/native_api_impl.cc b/runtime/vm/native_api_impl.cc
index 48d9289..08a8daa 100644
--- a/runtime/vm/native_api_impl.cc
+++ b/runtime/vm/native_api_impl.cc
@@ -37,6 +37,7 @@
       Dart_EnterIsolate(I);
     }
   }
+
  private:
   Isolate* saved_isolate_;
 
@@ -64,8 +65,8 @@
 
 DART_EXPORT bool Dart_PostInteger(Dart_Port port_id, int64_t message) {
   if (Smi::IsValid(message)) {
-    return PortMap::PostMessage(new Message(
-        port_id, Smi::New(message), Message::kNormalPriority));
+    return PortMap::PostMessage(
+        new Message(port_id, Smi::New(message), Message::kNormalPriority));
   }
   Dart_CObject cobj;
   cobj.type = Dart_CObject_kInt64;
@@ -132,8 +133,7 @@
 
 static void ParseAll(Thread* thread, Dart_Handle* result) {
   ASSERT(thread != NULL);
-  const Error& error = Error::Handle(thread->zone(),
-                                     Library::ParseAll(thread));
+  const Error& error = Error::Handle(thread->zone(), Library::ParseAll(thread));
   if (error.IsNull()) {
     *result = Api::Success();
   } else {
diff --git a/runtime/vm/native_arguments.h b/runtime/vm/native_arguments.h
index 3586569..b54499c 100644
--- a/runtime/vm/native_arguments.h
+++ b/runtime/vm/native_arguments.h
@@ -28,20 +28,23 @@
 // C-stack is always aligned on DBC because we don't have any native code.
 #define CHECK_STACK_ALIGNMENT
 #elif defined(USING_SIMULATOR)
-#define CHECK_STACK_ALIGNMENT {                                                \
-  uword current_sp = Simulator::Current()->get_register(SPREG);                \
-  ASSERT(Utils::IsAligned(current_sp, OS::ActivationFrameAlignment()));        \
-}
+#define CHECK_STACK_ALIGNMENT                                                  \
+  {                                                                            \
+    uword current_sp = Simulator::Current()->get_register(SPREG);              \
+    ASSERT(Utils::IsAligned(current_sp, OS::ActivationFrameAlignment()));      \
+  }
 #elif defined(TARGET_OS_WINDOWS)
 // The compiler may dynamically align the stack on Windows, so do not check.
-#define CHECK_STACK_ALIGNMENT { }
+#define CHECK_STACK_ALIGNMENT                                                  \
+  {}
 #else
-#define CHECK_STACK_ALIGNMENT {                                                \
-  uword (*func)() = reinterpret_cast<uword (*)()>(                             \
-      StubCode::GetStackPointer_entry()->EntryPoint());                        \
-  uword current_sp = func();                                                   \
-  ASSERT(Utils::IsAligned(current_sp, OS::ActivationFrameAlignment()));        \
-}
+#define CHECK_STACK_ALIGNMENT                                                  \
+  {                                                                            \
+    uword (*func)() = reinterpret_cast<uword (*)()>(                           \
+        StubCode::GetStackPointer_entry()->EntryPoint());                      \
+    uword current_sp = func();                                                 \
+    ASSERT(Utils::IsAligned(current_sp, OS::ActivationFrameAlignment()));      \
+  }
 #endif
 
 void VerifyOnTransition();
@@ -57,9 +60,12 @@
 
 #else
 
-#define CHECK_STACK_ALIGNMENT { }
-#define VERIFY_ON_TRANSITION { }
-#define DEOPTIMIZE_ALOT { }
+#define CHECK_STACK_ALIGNMENT                                                  \
+  {}
+#define VERIFY_ON_TRANSITION                                                   \
+  {}
+#define DEOPTIMIZE_ALOT                                                        \
+  {}
 
 #endif
 
@@ -70,7 +76,8 @@
   }
 #else
 #define TRACE_NATIVE_CALL(format, name)                                        \
-  do { } while (0)
+  do {                                                                         \
+  } while (0)
 #endif
 
 // Class NativeArguments is used to access arguments passed in from
@@ -138,9 +145,7 @@
     return ArgAt(actual_index);
   }
 
-  void SetReturn(const Object& value) const {
-    *retval_ = value.raw();
-  }
+  void SetReturn(const Object& value) const { *retval_ = value.raw(); }
 
   RawObject* ReturnValue() const {
     // Tell MemorySanitizer the retval_ was initialized (by generated code).
@@ -207,10 +212,10 @@
     kAutoSetupScopeBit = 26,
   };
   class ArgcBits : public BitField<intptr_t, int32_t, kArgcBit, kArgcSize> {};
-  class FunctionBits :
-      public BitField<intptr_t, int, kFunctionBit, kFunctionSize> {};
-  class AutoSetupScopeBits :
-      public BitField<intptr_t, int, kAutoSetupScopeBit, 1> {};
+  class FunctionBits
+      : public BitField<intptr_t, int, kFunctionBit, kFunctionSize> {};
+  class AutoSetupScopeBits
+      : public BitField<intptr_t, int, kAutoSetupScopeBit, 1> {};
   friend class Api;
   friend class BootstrapNatives;
   friend class Simulator;
@@ -221,17 +226,14 @@
                   int argc_tag,
                   RawObject** argv,
                   RawObject** retval)
-      : thread_(thread), argc_tag_(argc_tag), argv_(argv), retval_(retval) {
-  }
+      : thread_(thread), argc_tag_(argc_tag), argv_(argv), retval_(retval) {}
 #endif
 
   // Since this function is passed a RawObject directly, we need to be
   // exceedingly careful when we use it.  If there are any other side
   // effects in the statement that may cause GC, it could lead to
   // bugs.
-  void SetReturnUnsafe(RawObject* value) const {
-    *retval_ = value;
-  }
+  void SetReturnUnsafe(RawObject* value) const { *retval_ = value; }
 
   // Returns true if the arguments are those of an instance function call.
   bool ToInstanceFunction() const {
@@ -254,9 +256,9 @@
     return 0;
   }
 
-  Thread* thread_;  // Current thread pointer.
-  intptr_t argc_tag_;  // Encodes argument count and invoked native call type.
-  RawObject** argv_;  // Pointer to an array of arguments to runtime call.
+  Thread* thread_;      // Current thread pointer.
+  intptr_t argc_tag_;   // Encodes argument count and invoked native call type.
+  RawObject** argv_;    // Pointer to an array of arguments to runtime call.
   RawObject** retval_;  // Pointer to the return value area.
 };
 
diff --git a/runtime/vm/native_entry.cc b/runtime/vm/native_entry.cc
index e56bfa8..7e1655e 100644
--- a/runtime/vm/native_entry.cc
+++ b/runtime/vm/native_entry.cc
@@ -21,7 +21,9 @@
 
 namespace dart {
 
-DEFINE_FLAG(bool, trace_natives, false,
+DEFINE_FLAG(bool,
+            trace_natives,
+            false,
             "Trace invocation of natives (debug mode only)");
 
 
@@ -149,13 +151,11 @@
     TRACE_NATIVE_CALL("0x%" Px "", reinterpret_cast<uintptr_t>(func));
     TransitionGeneratedToNative transition(thread);
     if (scope == NULL) {
-      scope = new ApiLocalScope(current_top_scope,
-                                thread->top_exit_frame_info());
+      scope =
+          new ApiLocalScope(current_top_scope, thread->top_exit_frame_info());
       ASSERT(scope != NULL);
     } else {
-      scope->Reinit(thread,
-                    current_top_scope,
-                    thread->top_exit_frame_info());
+      scope->Reinit(thread, current_top_scope, thread->top_exit_frame_info());
       thread->set_api_reusable_scope(NULL);
     }
     thread->set_api_top_scope(scope);  // New scope is now the top scope.
@@ -197,8 +197,8 @@
 
   const int num_params = NativeArguments::ParameterCountForResolution(func);
   bool auto_setup_scope = true;
-  return NativeEntry::ResolveNative(
-      library, native_name, num_params, &auto_setup_scope);
+  return NativeEntry::ResolveNative(library, native_name, num_params,
+                                    &auto_setup_scope);
 }
 
 
@@ -238,27 +238,25 @@
     }
 
     bool is_bootstrap_native = false;
-    target_function = ResolveNativeFunction(
-        arguments->thread()->zone(), func, &is_bootstrap_native);
+    target_function = ResolveNativeFunction(arguments->thread()->zone(), func,
+                                            &is_bootstrap_native);
     ASSERT(target_function != NULL);
 
 #if defined(DEBUG)
     {
       NativeFunction current_function = NULL;
-      const Code& current_trampoline = Code::Handle(
-          CodePatcher::GetNativeCallAt(caller_frame->pc(),
-                                       code,
-                                       &current_function));
+      const Code& current_trampoline =
+          Code::Handle(CodePatcher::GetNativeCallAt(caller_frame->pc(), code,
+                                                    &current_function));
 #if !defined(USING_SIMULATOR)
       ASSERT(current_function ==
              reinterpret_cast<NativeFunction>(LinkNativeCall));
 #else
-      ASSERT(current_function ==
-             reinterpret_cast<NativeFunction>(
-                 Simulator::RedirectExternalReference(
-                     reinterpret_cast<uword>(LinkNativeCall),
-                     Simulator::kBootstrapNativeCall,
-                     NativeEntry::kNumArguments)));
+      ASSERT(
+          current_function ==
+          reinterpret_cast<NativeFunction>(Simulator::RedirectExternalReference(
+              reinterpret_cast<uword>(LinkNativeCall),
+              Simulator::kBootstrapNativeCall, NativeEntry::kNumArguments)));
 #endif
       ASSERT(current_trampoline.raw() ==
              StubCode::CallBootstrapCFunction_entry()->code());
@@ -267,26 +265,25 @@
 
     call_through_wrapper = !is_bootstrap_native;
     const Code& trampoline =
-        Code::Handle(call_through_wrapper ?
-            StubCode::CallNativeCFunction_entry()->code() :
-            StubCode::CallBootstrapCFunction_entry()->code());
+        Code::Handle(call_through_wrapper
+                         ? StubCode::CallNativeCFunction_entry()->code()
+                         : StubCode::CallBootstrapCFunction_entry()->code());
 
     NativeFunction patch_target_function = target_function;
 #if defined(USING_SIMULATOR)
     if (!call_through_wrapper) {
-      patch_target_function = reinterpret_cast<NativeFunction>(
-          Simulator::RedirectExternalReference(
+      patch_target_function =
+          reinterpret_cast<NativeFunction>(Simulator::RedirectExternalReference(
               reinterpret_cast<uword>(patch_target_function),
               Simulator::kBootstrapNativeCall, NativeEntry::kNumArguments));
     }
 #endif
 
-    CodePatcher::PatchNativeCallAt(
-        caller_frame->pc(), code, patch_target_function, trampoline);
+    CodePatcher::PatchNativeCallAt(caller_frame->pc(), code,
+                                   patch_target_function, trampoline);
 
     if (FLAG_trace_natives) {
-      OS::Print("    -> %p (%s)\n",
-                target_function,
+      OS::Print("    -> %p (%s)\n", target_function,
                 is_bootstrap_native ? "bootstrap" : "non-bootstrap");
     }
   }
diff --git a/runtime/vm/native_entry.h b/runtime/vm/native_entry.h
index 72531fa..9b8f6e34 100644
--- a/runtime/vm/native_entry.h
+++ b/runtime/vm/native_entry.h
@@ -33,15 +33,12 @@
   ASSERT(retval->IsDartInstance());                                            \
   arguments->SetReturnUnsafe(retval);
 #else
-#define SET_NATIVE_RETVAL(arguments, value)                                    \
-  arguments->SetReturnUnsafe(value);
+#define SET_NATIVE_RETVAL(arguments, value) arguments->SetReturnUnsafe(value);
 #endif
 
 #define DEFINE_NATIVE_ENTRY(name, argument_count)                              \
-  static RawObject* DN_Helper##name(Isolate* isolate,                          \
-                                    Thread* thread,                            \
-                                    Zone* zone,                                \
-                                    NativeArguments* arguments);               \
+  static RawObject* DN_Helper##name(Isolate* isolate, Thread* thread,          \
+                                    Zone* zone, NativeArguments* arguments);   \
   void NATIVE_ENTRY_FUNCTION(name)(Dart_NativeArguments args) {                \
     CHECK_STACK_ALIGNMENT;                                                     \
     VERIFY_ON_TRANSITION;                                                      \
@@ -49,26 +46,22 @@
     /* Tell MemorySanitizer 'arguments' is initialized by generated code. */   \
     MSAN_UNPOISON(arguments, sizeof(*arguments));                              \
     ASSERT(arguments->NativeArgCount() == argument_count);                     \
-    TRACE_NATIVE_CALL("%s", ""#name);                                          \
+    TRACE_NATIVE_CALL("%s", "" #name);                                         \
     {                                                                          \
       Thread* thread = arguments->thread();                                    \
       ASSERT(thread == Thread::Current());                                     \
       Isolate* isolate = thread->isolate();                                    \
       TransitionGeneratedToVM transition(thread);                              \
       StackZone zone(thread);                                                  \
-      SET_NATIVE_RETVAL(arguments,                                             \
-                        DN_Helper##name(isolate,                               \
-                                        thread,                                \
-                                        zone.GetZone(),                        \
-                                        arguments));                           \
+      SET_NATIVE_RETVAL(                                                       \
+          arguments,                                                           \
+          DN_Helper##name(isolate, thread, zone.GetZone(), arguments));        \
       DEOPTIMIZE_ALOT;                                                         \
     }                                                                          \
     VERIFY_ON_TRANSITION;                                                      \
   }                                                                            \
-  static RawObject* DN_Helper##name(Isolate* isolate,                          \
-                                    Thread* thread,                            \
-                                    Zone* zone,                                \
-                                    NativeArguments* arguments)
+  static RawObject* DN_Helper##name(Isolate* isolate, Thread* thread,          \
+                                    Zone* zone, NativeArguments* arguments)
 
 
 // Helper that throws an argument exception.
@@ -118,7 +111,7 @@
   static void NativeCallWrapper(Dart_NativeArguments args,
                                 Dart_NativeFunction func);
 
-  // DBC does not support lazy native call linking.
+// DBC does not support lazy native call linking.
 #if !defined(TARGET_ARCH_DBC)
   static uword LinkNativeCallEntry();
   static void LinkNativeCall(Dart_NativeArguments args);
diff --git a/runtime/vm/native_entry_test.cc b/runtime/vm/native_entry_test.cc
index 6929913..eb012e0 100644
--- a/runtime/vm/native_entry_test.cc
+++ b/runtime/vm/native_entry_test.cc
@@ -64,7 +64,7 @@
   for (int i = 0; i < arg_count; i++) {
     Dart_Handle arg = Dart_GetNativeArgument(args, i);
     GET_NATIVE_ARGUMENT(Integer, argument, arguments->NativeArgAt(i));
-    EXPECT(argument.IsInteger());  // May be null.
+    EXPECT(argument.IsInteger());                       // May be null.
     EXPECT_EQ(Api::UnwrapHandle(arg), argument.raw());  // May be null.
     int64_t arg_value = -1;
     if (argument.IsNull()) {
diff --git a/runtime/vm/native_message_handler.cc b/runtime/vm/native_message_handler.cc
index 1763341..41fbd2c 100644
--- a/runtime/vm/native_message_handler.cc
+++ b/runtime/vm/native_message_handler.cc
@@ -13,9 +13,7 @@
 
 NativeMessageHandler::NativeMessageHandler(const char* name,
                                            Dart_NativeMessageHandler func)
-    : name_(strdup(name)),
-      func_(func) {
-}
+    : name_(strdup(name)), func_(func) {}
 
 
 NativeMessageHandler::~NativeMessageHandler() {
diff --git a/runtime/vm/native_symbol_android.cc b/runtime/vm/native_symbol_android.cc
index db43d23..8cb3b67 100644
--- a/runtime/vm/native_symbol_android.cc
+++ b/runtime/vm/native_symbol_android.cc
@@ -11,12 +11,10 @@
 
 namespace dart {
 
-void NativeSymbolResolver::InitOnce() {
-}
+void NativeSymbolResolver::InitOnce() {}
 
 
-void NativeSymbolResolver::ShutdownOnce() {
-}
+void NativeSymbolResolver::ShutdownOnce() {}
 
 
 char* NativeSymbolResolver::LookupSymbolName(uintptr_t pc, uintptr_t* start) {
diff --git a/runtime/vm/native_symbol_fuchsia.cc b/runtime/vm/native_symbol_fuchsia.cc
index 22db3f7..528d4e5 100644
--- a/runtime/vm/native_symbol_fuchsia.cc
+++ b/runtime/vm/native_symbol_fuchsia.cc
@@ -9,16 +9,14 @@
 #include "vm/native_symbol.h"
 
 #include <cxxabi.h>  // NOLINT
-#include <dlfcn.h>  // NOLINT
+#include <dlfcn.h>   // NOLINT
 
 namespace dart {
 
-void NativeSymbolResolver::InitOnce() {
-}
+void NativeSymbolResolver::InitOnce() {}
 
 
-void NativeSymbolResolver::ShutdownOnce() {
-}
+void NativeSymbolResolver::ShutdownOnce() {}
 
 
 char* NativeSymbolResolver::LookupSymbolName(uintptr_t pc, uintptr_t* start) {
diff --git a/runtime/vm/native_symbol_linux.cc b/runtime/vm/native_symbol_linux.cc
index 120ef9a..9556ddb 100644
--- a/runtime/vm/native_symbol_linux.cc
+++ b/runtime/vm/native_symbol_linux.cc
@@ -9,16 +9,14 @@
 #include "vm/native_symbol.h"
 
 #include <cxxabi.h>  // NOLINT
-#include <dlfcn.h>  // NOLINT
+#include <dlfcn.h>   // NOLINT
 
 namespace dart {
 
-void NativeSymbolResolver::InitOnce() {
-}
+void NativeSymbolResolver::InitOnce() {}
 
 
-void NativeSymbolResolver::ShutdownOnce() {
-}
+void NativeSymbolResolver::ShutdownOnce() {}
 
 
 char* NativeSymbolResolver::LookupSymbolName(uintptr_t pc, uintptr_t* start) {
diff --git a/runtime/vm/native_symbol_macos.cc b/runtime/vm/native_symbol_macos.cc
index df944cc..6ca35cd 100644
--- a/runtime/vm/native_symbol_macos.cc
+++ b/runtime/vm/native_symbol_macos.cc
@@ -8,16 +8,14 @@
 #include "vm/native_symbol.h"
 
 #include <cxxabi.h>  // NOLINT
-#include <dlfcn.h>  // NOLINT
+#include <dlfcn.h>   // NOLINT
 
 namespace dart {
 
-void NativeSymbolResolver::InitOnce() {
-}
+void NativeSymbolResolver::InitOnce() {}
 
 
-void NativeSymbolResolver::ShutdownOnce() {
-}
+void NativeSymbolResolver::ShutdownOnce() {}
 
 
 char* NativeSymbolResolver::LookupSymbolName(uintptr_t pc, uintptr_t* start) {
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index bf063f3..87d48c8 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -49,20 +49,32 @@
 
 namespace dart {
 
-DEFINE_FLAG(int, huge_method_cutoff_in_code_size, 200000,
-    "Huge method cutoff in unoptimized code size (in bytes).");
-DEFINE_FLAG(bool, overlap_type_arguments, true,
+DEFINE_FLAG(int,
+            huge_method_cutoff_in_code_size,
+            200000,
+            "Huge method cutoff in unoptimized code size (in bytes).");
+DEFINE_FLAG(
+    bool,
+    overlap_type_arguments,
+    true,
     "When possible, partially or fully overlap the type arguments of a type "
     "with the type arguments of its super type.");
-DEFINE_FLAG(bool, show_internal_names, false,
+DEFINE_FLAG(
+    bool,
+    show_internal_names,
+    false,
     "Show names of internal classes (e.g. \"OneByteString\") in error messages "
     "instead of showing the corresponding interface names (e.g. \"String\")");
 DEFINE_FLAG(bool, use_lib_cache, true, "Use library name cache");
 DEFINE_FLAG(bool, use_exp_cache, true, "Use library exported name cache");
-DEFINE_FLAG(bool, ignore_patch_signature_mismatch, false,
+DEFINE_FLAG(bool,
+            ignore_patch_signature_mismatch,
+            false,
             "Ignore patch file member signature mismatch.");
 
-DEFINE_FLAG(bool, remove_script_timestamps_for_test, false,
+DEFINE_FLAG(bool,
+            remove_script_timestamps_for_test,
+            false,
             "Remove script timestamps to allow for deterministic testing.");
 
 DECLARE_FLAG(bool, show_invisible_frames);
@@ -82,7 +94,7 @@
 RawArray* ICData::cached_icdata_arrays_[kCachedICDataArrayCount];
 
 cpp_vtable Object::handle_vtable_ = 0;
-cpp_vtable Object::builtin_vtables_[kNumPredefinedCids] = { 0 };
+cpp_vtable Object::builtin_vtables_[kNumPredefinedCids] = {0};
 cpp_vtable Smi::handle_vtable_ = 0;
 
 // These are initialized to a value that will force a illegal memory access if
@@ -172,7 +184,8 @@
 static void AppendSubString(Zone* zone,
                             GrowableArray<const char*>* segments,
                             const char* name,
-                            intptr_t start_pos, intptr_t len) {
+                            intptr_t start_pos,
+                            intptr_t len) {
   char* segment = zone->Alloc<char>(len + 1);  // '\0'-terminated.
   memmove(segment, name + start_pos, len);
   segment[len] = '\0';
@@ -227,12 +240,12 @@
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
 
-NOT_IN_PRODUCT(
+#if !defined(PRODUCT)
   if (name.Equals(Symbols::TopLevel())) {
     // Name of invisible top-level class.
     return Symbols::Empty().raw();
   }
-)
+#endif  // !defined(PRODUCT)
 
   const char* cname = name.ToCString();
   ASSERT(strlen(cname) == static_cast<size_t>(name.Length()));
@@ -242,8 +255,8 @@
   GrowableArray<const char*> unmangled_segments;
   intptr_t sum_segment_len = 0;
   for (intptr_t i = 0; i < name_len; i++) {
-    if ((cname[i] == '@') && ((i + 1) < name_len) &&
-        (cname[i + 1] >= '0') && (cname[i + 1] <= '9')) {
+    if ((cname[i] == '@') && ((i + 1) < name_len) && (cname[i + 1] >= '0') &&
+        (cname[i + 1] <= '9')) {
       // Append the current segment to the unmangled name.
       const intptr_t segment_len = i - start_pos;
       sum_segment_len += segment_len;
@@ -251,8 +264,7 @@
       // Advance until past the name mangling. The private keys are only
       // numbers so we skip until the first non-number.
       i++;  // Skip the '@'.
-      while ((i < name.Length()) &&
-             (name.CharAt(i) >= '0') &&
+      while ((i < name.Length()) && (name.CharAt(i) >= '0') &&
              (name.CharAt(i) <= '9')) {
         i++;
       }
@@ -277,7 +289,7 @@
     unmangled_name = MergeSubStrings(zone, unmangled_segments, sum_segment_len);
   }
 
-NOT_IN_PRODUCT(
+#if !defined(PRODUCT)
   intptr_t len = sum_segment_len;
   intptr_t start = 0;
   intptr_t dot_pos = -1;  // Position of '.' in the name, if any.
@@ -326,14 +338,14 @@
   }
 
   unmangled_name = MergeSubStrings(zone, unmangled_segments, final_len);
-)
+#endif  // !defined(PRODUCT)
 
   return Symbols::New(thread, unmangled_name);
 }
 
 
 RawString* String::ScrubNameRetainPrivate(const String& name) {
-NOT_IN_PRODUCT(
+#if !defined(PRODUCT)
   intptr_t len = name.Length();
   intptr_t start = 0;
   intptr_t at_pos = -1;  // Position of '@' in the name, if any.
@@ -376,22 +388,16 @@
   }
 
   return result.raw();
-)
+#endif                // !defined(PRODUCT)
   return name.raw();  // In PRODUCT, return argument unchanged.
 }
 
 
-template<typename type>
+template <typename type>
 static bool IsSpecialCharacter(type value) {
-  return ((value == '"') ||
-          (value == '\n') ||
-          (value == '\f') ||
-          (value == '\b') ||
-          (value == '\t') ||
-          (value == '\v') ||
-          (value == '\r') ||
-          (value == '\\') ||
-          (value == '$'));
+  return ((value == '"') || (value == '\n') || (value == '\f') ||
+          (value == '\b') || (value == '\t') || (value == '\v') ||
+          (value == '\r') || (value == '\\') || (value == '$'));
 }
 
 
@@ -401,10 +407,7 @@
 
 
 static inline bool NeedsEscapeSequence(int32_t c) {
-  return (c == '"')  ||
-         (c == '\\') ||
-         (c == '$')  ||
-         IsAsciiNonprintable(c);
+  return (c == '"') || (c == '\\') || (c == '$') || IsAsciiNonprintable(c);
 }
 
 
@@ -418,7 +421,7 @@
 }
 
 
-template<typename type>
+template <typename type>
 static type SpecialCharacter(type value) {
   if (value == '"') {
     return '"';
@@ -496,8 +499,8 @@
   extractor_parameter_names_ = Array::ReadOnlyHandle();
   sentinel_ = Instance::ReadOnlyHandle();
   transition_sentinel_ = Instance::ReadOnlyHandle();
-  unknown_constant_ =  Instance::ReadOnlyHandle();
-  non_constant_ =  Instance::ReadOnlyHandle();
+  unknown_constant_ = Instance::ReadOnlyHandle();
+  non_constant_ = Instance::ReadOnlyHandle();
   bool_true_ = Bool::ReadOnlyHandle();
   bool_false_ = Bool::ReadOnlyHandle();
   smi_illegal_cid_ = Smi::ReadOnlyHandle();
@@ -724,8 +727,7 @@
     uword address = heap->Allocate(Array::InstanceSize(0), Heap::kOld);
     InitializeObject(address, kImmutableArrayCid, Array::InstanceSize(0), true);
     Array::initializeHandle(
-        empty_array_,
-        reinterpret_cast<RawArray*>(address + kHeapObjectTag));
+        empty_array_, reinterpret_cast<RawArray*>(address + kHeapObjectTag));
     empty_array_->StoreSmi(&empty_array_->raw_ptr()->length_, Smi::New(0));
     empty_array_->SetCanonical();
   }
@@ -736,8 +738,7 @@
     uword address = heap->Allocate(Array::InstanceSize(1), Heap::kOld);
     InitializeObject(address, kImmutableArrayCid, Array::InstanceSize(1), true);
     Array::initializeHandle(
-        zero_array_,
-        reinterpret_cast<RawArray*>(address + kHeapObjectTag));
+        zero_array_, reinterpret_cast<RawArray*>(address + kHeapObjectTag));
     zero_array_->StoreSmi(&zero_array_->raw_ptr()->length_, Smi::New(1));
     smi = Smi::New(0);
     zero_array_->SetAt(0, smi);
@@ -747,9 +748,7 @@
   // Allocate and initialize the canonical empty context scope object.
   {
     uword address = heap->Allocate(ContextScope::InstanceSize(0), Heap::kOld);
-    InitializeObject(address,
-                     kContextScopeCid,
-                     ContextScope::InstanceSize(0),
+    InitializeObject(address, kContextScopeCid, ContextScope::InstanceSize(0),
                      true);
     ContextScope::initializeHandle(
         empty_context_scope_,
@@ -763,25 +762,21 @@
 
   // Allocate and initialize the canonical empty object pool object.
   {
-    uword address =
-        heap->Allocate(ObjectPool::InstanceSize(0), Heap::kOld);
-    InitializeObject(address,
-                     kObjectPoolCid,
-                     ObjectPool::InstanceSize(0),
+    uword address = heap->Allocate(ObjectPool::InstanceSize(0), Heap::kOld);
+    InitializeObject(address, kObjectPoolCid, ObjectPool::InstanceSize(0),
                      true);
     ObjectPool::initializeHandle(
         empty_object_pool_,
         reinterpret_cast<RawObjectPool*>(address + kHeapObjectTag));
-    empty_object_pool_->StoreNonPointer(
-        &empty_object_pool_->raw_ptr()->length_, 0);
+    empty_object_pool_->StoreNonPointer(&empty_object_pool_->raw_ptr()->length_,
+                                        0);
     empty_object_pool_->SetCanonical();
   }
 
   // Allocate and initialize the empty_descriptors instance.
   {
     uword address = heap->Allocate(PcDescriptors::InstanceSize(0), Heap::kOld);
-    InitializeObject(address, kPcDescriptorsCid,
-                     PcDescriptors::InstanceSize(0),
+    InitializeObject(address, kPcDescriptorsCid, PcDescriptors::InstanceSize(0),
                      true);
     PcDescriptors::initializeHandle(
         empty_descriptors_,
@@ -795,10 +790,8 @@
   {
     uword address =
         heap->Allocate(LocalVarDescriptors::InstanceSize(0), Heap::kOld);
-    InitializeObject(address,
-                     kLocalVarDescriptorsCid,
-                     LocalVarDescriptors::InstanceSize(0),
-                     true);
+    InitializeObject(address, kLocalVarDescriptorsCid,
+                     LocalVarDescriptors::InstanceSize(0), true);
     LocalVarDescriptors::initializeHandle(
         empty_var_descriptors_,
         reinterpret_cast<RawLocalVarDescriptors*>(address + kHeapObjectTag));
@@ -813,10 +806,8 @@
   {
     uword address =
         heap->Allocate(ExceptionHandlers::InstanceSize(0), Heap::kOld);
-    InitializeObject(address,
-                     kExceptionHandlersCid,
-                     ExceptionHandlers::InstanceSize(0),
-                     true);
+    InitializeObject(address, kExceptionHandlersCid,
+                     ExceptionHandlers::InstanceSize(0), true);
     ExceptionHandlers::initializeHandle(
         empty_exception_handlers_,
         reinterpret_cast<RawExceptionHandlers*>(address + kHeapObjectTag));
@@ -864,21 +855,17 @@
 
   String& error_str = String::Handle();
   error_str = String::New("SnapshotWriter Error", Heap::kOld);
-  *snapshot_writer_error_ = LanguageError::New(error_str,
-                                               Report::kError,
-                                               Heap::kOld);
+  *snapshot_writer_error_ =
+      LanguageError::New(error_str, Report::kError, Heap::kOld);
   error_str = String::New("Branch offset overflow", Heap::kOld);
-  *branch_offset_error_ = LanguageError::New(error_str,
-                                             Report::kBailout,
-                                             Heap::kOld);
+  *branch_offset_error_ =
+      LanguageError::New(error_str, Report::kBailout, Heap::kOld);
   error_str = String::New("Speculative inlining failed", Heap::kOld);
-  *speculative_inlining_error_ = LanguageError::New(error_str,
-                                                    Report::kBailout,
-                                                    Heap::kOld);
+  *speculative_inlining_error_ =
+      LanguageError::New(error_str, Report::kBailout, Heap::kOld);
   error_str = String::New("Background Compilation Failed", Heap::kOld);
-  *background_compilation_error_ = LanguageError::New(error_str,
-                                                      Report::kBailout,
-                                                      Heap::kOld);
+  *background_compilation_error_ =
+      LanguageError::New(error_str, Report::kBailout, Heap::kOld);
 
   // Some thread fields need to be reinitialized as null constants have not been
   // initialized until now.
@@ -938,7 +925,7 @@
 // premark all objects in the vm_isolate_ heap.
 class PremarkingVisitor : public ObjectVisitor {
  public:
-  PremarkingVisitor() { }
+  PremarkingVisitor() {}
 
   void VisitObject(RawObject* obj) {
     // Free list elements should never be marked.
@@ -955,7 +942,7 @@
 
 #define SET_CLASS_NAME(class_name, name)                                       \
   cls = class_name##_class();                                                  \
-  cls.set_name(Symbols::name());                                               \
+  cls.set_name(Symbols::name());
 
 void Object::FinalizeVMIsolate(Isolate* isolate) {
   // Should only be run by the vm isolate.
@@ -1067,8 +1054,8 @@
       // TODO(iposva): Investigate whether CompareAndSwapWord is necessary.
       do {
         old_tags = tags;
-        tags = AtomicOperations::CompareAndSwapWord(
-            &raw->ptr()->tags_, old_tags, new_tags);
+        tags = AtomicOperations::CompareAndSwapWord(&raw->ptr()->tags_,
+                                                    old_tags, new_tags);
       } while (tags != old_tags);
 
       intptr_t leftover_len = (leftover_size - TypedData::InstanceSize(0));
@@ -1085,8 +1072,8 @@
       // TODO(iposva): Investigate whether CompareAndSwapWord is necessary.
       do {
         old_tags = tags;
-        tags = AtomicOperations::CompareAndSwapWord(
-            &raw->ptr()->tags_, old_tags, new_tags);
+        tags = AtomicOperations::CompareAndSwapWord(&raw->ptr()->tags_,
+                                                    old_tags, new_tags);
       } while (tags != old_tags);
     }
   }
@@ -1136,11 +1123,8 @@
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   ASSERT(isolate == thread->isolate());
-NOT_IN_PRODUCT(
-  TimelineDurationScope tds(thread,
-                            Timeline::GetIsolateStream(),
-                            "Object::Init");
-)
+  NOT_IN_PRODUCT(TimelineDurationScope tds(thread, Timeline::GetIsolateStream(),
+                                           "Object::Init"));
 
 #if defined(DART_NO_SNAPSHOT)
   // Object::Init version when we are running in a version of dart that does
@@ -1175,8 +1159,8 @@
 
   // Initialize hash set for canonical_type_.
   const intptr_t kInitialCanonicalTypeSize = 16;
-  array = HashTables::New<CanonicalTypeSet>(
-      kInitialCanonicalTypeSize, Heap::kOld);
+  array =
+      HashTables::New<CanonicalTypeSet>(kInitialCanonicalTypeSize, Heap::kOld);
   object_store->set_canonical_types(array);
 
   // Initialize hash set for canonical_type_arguments_.
@@ -1188,14 +1172,14 @@
   // Setup type class early in the process.
   const Class& type_cls = Class::Handle(zone, Class::New<Type>());
   const Class& type_ref_cls = Class::Handle(zone, Class::New<TypeRef>());
-  const Class& type_parameter_cls = Class::Handle(zone,
-                                                  Class::New<TypeParameter>());
-  const Class& bounded_type_cls = Class::Handle(zone,
-                                                Class::New<BoundedType>());
-  const Class& mixin_app_type_cls = Class::Handle(zone,
-                                                  Class::New<MixinAppType>());
-  const Class& library_prefix_cls = Class::Handle(zone,
-                                                  Class::New<LibraryPrefix>());
+  const Class& type_parameter_cls =
+      Class::Handle(zone, Class::New<TypeParameter>());
+  const Class& bounded_type_cls =
+      Class::Handle(zone, Class::New<BoundedType>());
+  const Class& mixin_app_type_cls =
+      Class::Handle(zone, Class::New<MixinAppType>());
+  const Class& library_prefix_cls =
+      Class::Handle(zone, Class::New<LibraryPrefix>());
 
   // Pre-allocate the OneByteString class needed by the symbol table.
   cls = Class::NewStringClass(kOneByteStringCid);
@@ -1209,8 +1193,8 @@
   Symbols::SetupSymbolTable(isolate);
 
   // Set up the libraries array before initializing the core library.
-  const GrowableObjectArray& libraries = GrowableObjectArray::Handle(
-      zone, GrowableObjectArray::New(Heap::kOld));
+  const GrowableObjectArray& libraries =
+      GrowableObjectArray::Handle(zone, GrowableObjectArray::New(Heap::kOld));
   object_store->set_libraries(libraries);
 
   // Pre-register the core library.
@@ -1240,8 +1224,7 @@
   // allocated below represents the raw type _List and not _List<E> as we
   // could expect. Use with caution.
   type ^= Type::New(Object::Handle(zone, cls.raw()),
-                    TypeArguments::Handle(zone),
-                    TokenPosition::kNoSource);
+                    TypeArguments::Handle(zone), TokenPosition::kNoSource);
   type.SetIsFinalized();
   type ^= type.Canonicalize();
   object_store->set_array_type(type);
@@ -1279,9 +1262,8 @@
 
   // Pre-register the isolate library so the native class implementations
   // can be hooked up before compiling it.
-  Library& isolate_lib =
-      Library::Handle(zone, Library::LookupLibrary(thread,
-                                                   Symbols::DartIsolate()));
+  Library& isolate_lib = Library::Handle(
+      zone, Library::LookupLibrary(thread, Symbols::DartIsolate()));
   if (isolate_lib.IsNull()) {
     isolate_lib = Library::NewLibraryHelper(Symbols::DartIsolate(), true);
     isolate_lib.SetLoadRequested();
@@ -1303,8 +1285,7 @@
   RegisterPrivateClass(cls, Symbols::_SendPortImpl(), isolate_lib);
   pending_classes.Add(cls);
 
-  const Class& stacktrace_cls = Class::Handle(zone,
-                                              Class::New<Stacktrace>());
+  const Class& stacktrace_cls = Class::Handle(zone, Class::New<Stacktrace>());
   RegisterPrivateClass(stacktrace_cls, Symbols::_StackTrace(), core_lib);
   pending_classes.Add(stacktrace_cls);
   // Super type set below, after Object is allocated.
@@ -1400,9 +1381,9 @@
   object_store->set_weak_property_class(cls);
   RegisterPrivateClass(cls, Symbols::_WeakProperty(), core_lib);
 
-  // Pre-register the mirrors library so we can place the vm class
-  // MirrorReference there rather than the core library.
-NOT_IN_PRODUCT(
+// Pre-register the mirrors library so we can place the vm class
+// MirrorReference there rather than the core library.
+#if !defined(PRODUCT)
   lib = Library::LookupLibrary(thread, Symbols::DartMirrors());
   if (lib.IsNull()) {
     lib = Library::NewLibraryHelper(Symbols::DartMirrors(), true);
@@ -1415,7 +1396,7 @@
 
   cls = Class::New<MirrorReference>();
   RegisterPrivateClass(cls, Symbols::_MirrorReference(), lib);
-)
+#endif  // !defined(PRODUCT)
 
   // Pre-register the collection library so we can place the vm class
   // LinkedHashMap there rather than the core library.
@@ -1472,14 +1453,14 @@
   ASSERT(lib.raw() == Library::TypedDataLibrary());
 #define REGISTER_TYPED_DATA_CLASS(clazz)                                       \
   cls = Class::NewTypedDataClass(kTypedData##clazz##ArrayCid);                 \
-  RegisterClass(cls, Symbols::clazz##List(), lib);                             \
+  RegisterClass(cls, Symbols::clazz##List(), lib);
 
   DART_CLASS_LIST_TYPED_DATA(REGISTER_TYPED_DATA_CLASS);
 #undef REGISTER_TYPED_DATA_CLASS
 #define REGISTER_TYPED_DATA_VIEW_CLASS(clazz)                                  \
   cls = Class::NewTypedDataViewClass(kTypedData##clazz##ViewCid);              \
   RegisterPrivateClass(cls, Symbols::_##clazz##View(), lib);                   \
-  pending_classes.Add(cls);                                                    \
+  pending_classes.Add(cls);
 
   CLASS_LIST_TYPED_DATA(REGISTER_TYPED_DATA_VIEW_CLASS);
   cls = Class::NewTypedDataViewClass(kByteDataViewCid);
@@ -1488,7 +1469,7 @@
 #undef REGISTER_TYPED_DATA_VIEW_CLASS
 #define REGISTER_EXT_TYPED_DATA_CLASS(clazz)                                   \
   cls = Class::NewExternalTypedDataClass(kExternalTypedData##clazz##Cid);      \
-  RegisterPrivateClass(cls, Symbols::_External##clazz(), lib);                 \
+  RegisterPrivateClass(cls, Symbols::_External##clazz(), lib);
 
   cls = Class::New<Instance>(kByteBufferCid);
   cls.set_instance_size(0);
@@ -1606,7 +1587,7 @@
 
   // Finish the initialization by compiling the bootstrap scripts containing the
   // base interfaces and the implementation of the internal classes.
-  const Error& error = Error::Handle(Bootstrap::LoadandCompileScripts());
+  const Error& error = Error::Handle(Bootstrap::DoBootstrapping());
   if (!error.IsNull()) {
     return error.raw();
   }
@@ -1633,12 +1614,13 @@
   CLASS_LIST_NO_OBJECT(V)
 
 #define ADD_SET_FIELD(clazz)                                                   \
-  field_name = Symbols::New(thread, "cid"#clazz);                              \
-  field = Field::New(field_name, true, false, true, false, cls,                \
-      Type::Handle(Type::IntType()), TokenPosition::kMinSource);               \
+  field_name = Symbols::New(thread, "cid" #clazz);                             \
+  field =                                                                      \
+      Field::New(field_name, true, false, true, false, cls,                    \
+                 Type::Handle(Type::IntType()), TokenPosition::kMinSource);    \
   value = Smi::New(k##clazz##Cid);                                             \
   field.SetStaticValue(value, true);                                           \
-  cls.AddField(field);                                                         \
+  cls.AddField(field);
 
   CLASS_LIST_WITH_NULL(ADD_SET_FIELD)
 #undef ADD_SET_FIELD
@@ -1757,8 +1739,7 @@
   cls = Class::New<MirrorReference>();
   cls = Class::New<UserTag>();
 
-  const Context& context = Context::Handle(zone,
-                                           Context::New(0, Heap::kOld));
+  const Context& context = Context::Handle(zone, Context::New(0, Heap::kOld));
   object_store->set_empty_context(context);
 
 #endif  // defined(DART_NO_SNAPSHOT).
@@ -1768,7 +1749,7 @@
 
 
 #if defined(DEBUG)
-bool Object:: InVMHeap() const {
+bool Object::InVMHeap() const {
   if (FLAG_verify_handles && raw()->IsVMHeapObject()) {
     Heap* vm_isolate_heap = Dart::vm_isolate()->heap();
     ASSERT(vm_isolate_heap->Contains(RawObject::ToAddr(raw())));
@@ -1793,7 +1774,8 @@
                               intptr_t size,
                               bool is_vm_object) {
   uword initial_value = (class_id == kInstructionsCid)
-      ? Assembler::GetBreakInstructionFiller() : reinterpret_cast<uword>(null_);
+                            ? Assembler::GetBreakInstructionFiller()
+                            : reinterpret_cast<uword>(null_);
   uword cur = address;
   uword end = address + size;
   while (cur < end) {
@@ -1834,9 +1816,7 @@
 }
 
 
-RawObject* Object::Allocate(intptr_t cls_id,
-                            intptr_t size,
-                            Heap::Space space) {
+RawObject* Object::Allocate(intptr_t cls_id, intptr_t size, Heap::Space space) {
   ASSERT(Utils::IsAligned(size, kObjectAlignment));
   Thread* thread = Thread::Current();
   Isolate* isolate = thread->isolate();
@@ -1876,8 +1856,10 @@
 
 class StoreBufferUpdateVisitor : public ObjectPointerVisitor {
  public:
-  explicit StoreBufferUpdateVisitor(Thread* thread, RawObject* obj) :
-      ObjectPointerVisitor(thread->isolate()), thread_(thread), old_obj_(obj) {
+  explicit StoreBufferUpdateVisitor(Thread* thread, RawObject* obj)
+      : ObjectPointerVisitor(thread->isolate()),
+        thread_(thread),
+        old_obj_(obj) {
     ASSERT(old_obj_->IsOldObject());
   }
 
@@ -1911,7 +1893,6 @@
 }
 
 
-
 RawObject* Object::Clone(const Object& orig, Heap::Space space) {
   const Class& cls = Class::Handle(orig.clazz());
   intptr_t size = orig.raw()->Size();
@@ -1953,10 +1934,10 @@
 
 
 RawString* Class::UserVisibleName() const {
-NOT_IN_PRODUCT(
+#if !defined(PRODUCT)
   ASSERT(raw_ptr()->user_name_ != String::null());
   return raw_ptr()->user_name_;
-)
+#endif                               // !defined(PRODUCT)
   return GenerateUserVisibleName();  // No caching in PRODUCT, regenerate.
 }
 
@@ -1969,23 +1950,17 @@
 
 RawAbstractType* Class::RareType() const {
   const Type& type = Type::Handle(Type::New(
-      *this,
-      Object::null_type_arguments(),
-      TokenPosition::kNoSource));
-  return ClassFinalizer::FinalizeType(*this,
-                                      type,
+      *this, Object::null_type_arguments(), TokenPosition::kNoSource));
+  return ClassFinalizer::FinalizeType(*this, type,
                                       ClassFinalizer::kCanonicalize);
 }
 
 
 RawAbstractType* Class::DeclarationType() const {
   const TypeArguments& args = TypeArguments::Handle(type_parameters());
-  const Type& type = Type::Handle(Type::New(
-      *this,
-      args,
-      TokenPosition::kNoSource));
-  return ClassFinalizer::FinalizeType(*this,
-                                      type,
+  const Type& type =
+      Type::Handle(Type::New(*this, args, TokenPosition::kNoSource));
+  return ClassFinalizer::FinalizeType(*this, type,
                                       ClassFinalizer::kCanonicalize);
 }
 
@@ -1995,9 +1970,8 @@
   ASSERT(Object::class_class() != Class::null());
   Class& result = Class::Handle();
   {
-    RawObject* raw = Object::Allocate(Class::kClassId,
-                                      Class::InstanceSize(),
-                                      Heap::kOld);
+    RawObject* raw =
+        Object::Allocate(Class::kClassId, Class::InstanceSize(), Heap::kOld);
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -2028,12 +2002,9 @@
 }
 
 
-
 static void ReportTooManyTypeArguments(const Class& cls) {
-  Report::MessageF(Report::kError,
-                   Script::Handle(cls.script()),
-                   cls.token_pos(),
-                   Report::AtLocation,
+  Report::MessageF(Report::kError, Script::Handle(cls.script()),
+                   cls.token_pos(), Report::AtLocation,
                    "too many type parameters declared in class '%s' or in its "
                    "super classes",
                    String::Handle(cls.Name()).ToCString());
@@ -2123,6 +2094,7 @@
     }
   }
   intptr_t Hash() const { return name_.Hash(); }
+
  private:
   const String& name_;
   String* tmp_string_;
@@ -2147,9 +2119,7 @@
   static uword Hash(const Object& key) {
     return String::HashRawSymbol(Function::Cast(key).name());
   }
-  static uword Hash(const FunctionName& name) {
-    return name.Hash();
-  }
+  static uword Hash(const FunctionName& name) { return name.Hash(); }
 };
 typedef UnorderedHashSet<ClassFunctionsTraits> ClassFunctionsSet;
 
@@ -2269,7 +2239,6 @@
 }
 
 
-
 intptr_t Class::FindInvocationDispatcherFunctionIndex(
     const Function& needle) const {
   Thread* thread = Thread::Current();
@@ -2340,8 +2309,7 @@
   }
   if (type_parameters() == TypeArguments::null()) {
     const intptr_t cid = id();
-    if ((cid == kArrayCid) ||
-        (cid == kImmutableArrayCid) ||
+    if ((cid == kArrayCid) || (cid == kImmutableArrayCid) ||
         (cid == kGrowableObjectArrayCid)) {
       return 1;  // List's type parameter may not have been parsed yet.
     }
@@ -2363,8 +2331,7 @@
   Isolate* isolate = thread->isolate();
   Zone* zone = thread->zone();
   const intptr_t num_type_params = NumTypeParameters();
-  if (!FLAG_overlap_type_arguments ||
-      (num_type_params == 0) ||
+  if (!FLAG_overlap_type_arguments || (num_type_params == 0) ||
       (super_type() == AbstractType::null()) ||
       (super_type() == isolate->object_store()->object_type())) {
     set_num_own_type_arguments(num_type_params);
@@ -2402,14 +2369,14 @@
   TypeParameter& type_param = TypeParameter::Handle(zone);
   AbstractType& sup_type_arg = AbstractType::Handle(zone);
   for (intptr_t num_overlapping_type_args =
-           (num_type_params < num_sup_type_args) ?
-               num_type_params : num_sup_type_args;
+           (num_type_params < num_sup_type_args) ? num_type_params
+                                                 : num_sup_type_args;
        num_overlapping_type_args > 0; num_overlapping_type_args--) {
     intptr_t i = 0;
     for (; i < num_overlapping_type_args; i++) {
       type_param ^= type_params.TypeAt(i);
-      sup_type_arg = sup_type_args.TypeAt(
-          num_sup_type_args - num_overlapping_type_args + i);
+      sup_type_arg = sup_type_args.TypeAt(num_sup_type_args -
+                                          num_overlapping_type_args + i);
       // BoundedType can nest in case the finalized super type has bounded type
       // arguments that overlap multiple times in its own super class chain.
       while (sup_type_arg.IsBoundedType()) {
@@ -2476,8 +2443,7 @@
 
 
 void Class::set_super_type(const AbstractType& value) const {
-  ASSERT(value.IsNull() ||
-         (value.IsType() && !value.IsDynamicType()) ||
+  ASSERT(value.IsNull() || (value.IsType() && !value.IsDynamicType()) ||
          value.IsMixinAppType());
   StorePointer(&raw_ptr()->super_type_, value.raw());
 }
@@ -2490,7 +2456,7 @@
   REUSABLE_TYPE_PARAMETER_HANDLESCOPE(thread);
   REUSABLE_STRING_HANDLESCOPE(thread);
   TypeArguments& type_params = thread->TypeArgumentsHandle();
-  TypeParameter&  type_param = thread->TypeParameterHandle();
+  TypeParameter& type_param = thread->TypeParameterHandle();
   String& type_param_name = thread->StringHandle();
 
   type_params ^= type_parameters();
@@ -2561,12 +2527,7 @@
                                             const Array& args_desc,
                                             RawFunction::Kind kind,
                                             bool create_if_absent) const {
-  enum {
-    kNameIndex = 0,
-    kArgsDescIndex,
-    kFunctionIndex,
-    kEntrySize
-  };
+  enum { kNameIndex = 0, kArgsDescIndex, kFunctionIndex, kEntrySize };
 
   ASSERT(kind == RawFunction::kNoSuchMethodDispatcher ||
          kind == RawFunction::kInvokeFieldDispatcher);
@@ -2594,8 +2555,8 @@
     if (i == cache.Length()) {
       // Allocate new larger cache.
       intptr_t new_len = (cache.Length() == 0)
-          ? static_cast<intptr_t>(kEntrySize)
-          : cache.Length() * 2;
+                             ? static_cast<intptr_t>(kEntrySize)
+                             : cache.Length() * 2;
       cache ^= Array::Grow(cache, new_len);
       set_invocation_dispatcher_cache(cache);
     }
@@ -2613,24 +2574,23 @@
                                                RawFunction::Kind kind) const {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
-  Function& invocation = Function::Handle(zone,
-      Function::New(String::Handle(zone, Symbols::New(thread, target_name)),
-                    kind,
-                    false,  // Not static.
-                    false,  // Not const.
-                    false,  // Not abstract.
-                    false,  // Not external.
-                    false,  // Not native.
-                    *this,
-                    TokenPosition::kMinSource));
+  Function& invocation = Function::Handle(
+      zone, Function::New(
+                String::Handle(zone, Symbols::New(thread, target_name)), kind,
+                false,  // Not static.
+                false,  // Not const.
+                false,  // Not abstract.
+                false,  // Not external.
+                false,  // Not native.
+                *this, TokenPosition::kMinSource));
   ArgumentsDescriptor desc(args_desc);
   invocation.set_num_fixed_parameters(desc.PositionalCount());
   invocation.SetNumOptionalParameters(desc.NamedCount(),
                                       false);  // Not positional.
-  invocation.set_parameter_types(Array::Handle(zone, Array::New(desc.Count(),
-                                                                Heap::kOld)));
-  invocation.set_parameter_names(Array::Handle(zone, Array::New(desc.Count(),
-                                                                Heap::kOld)));
+  invocation.set_parameter_types(
+      Array::Handle(zone, Array::New(desc.Count(), Heap::kOld)));
+  invocation.set_parameter_names(
+      Array::Handle(zone, Array::New(desc.Count(), Heap::kOld)));
   // Receiver.
   invocation.SetParameterTypeAt(0, Object::dynamic_type());
   invocation.SetParameterNameAt(0, Symbols::This());
@@ -2640,8 +2600,8 @@
     invocation.SetParameterTypeAt(i, Object::dynamic_type());
     char name[64];
     OS::SNPrint(name, 64, ":p%" Pd, i);
-    invocation.SetParameterNameAt(i, String::Handle(zone,
-        Symbols::New(thread, name)));
+    invocation.SetParameterNameAt(
+        i, String::Handle(zone, Symbols::New(thread, name)));
   }
 
   // Named parameters.
@@ -2673,16 +2633,16 @@
       Function::Handle(zone, ImplicitClosureFunction());
 
   const Class& owner = Class::Handle(zone, closure_function.Owner());
-  Function& extractor = Function::Handle(zone,
-    Function::New(String::Handle(zone, Symbols::New(thread, getter_name)),
-                  RawFunction::kMethodExtractor,
-                  false,  // Not static.
-                  false,  // Not const.
-                  false,  // Not abstract.
-                  false,  // Not external.
-                  false,  // Not native.
-                  owner,
-                  TokenPosition::kMethodExtractor));
+  Function& extractor = Function::Handle(
+      zone,
+      Function::New(String::Handle(zone, Symbols::New(thread, getter_name)),
+                    RawFunction::kMethodExtractor,
+                    false,  // Not static.
+                    false,  // Not const.
+                    false,  // Not abstract.
+                    false,  // Not external.
+                    false,  // Not native.
+                    owner, TokenPosition::kMethodExtractor));
 
   // Initialize signature: receiver is a single fixed parameter.
   const intptr_t kNumParameters = 1;
@@ -2744,8 +2704,7 @@
 class CHACodeArray : public WeakCodeReferences {
  public:
   explicit CHACodeArray(const Class& cls)
-      : WeakCodeReferences(Array::Handle(cls.dependent_code())), cls_(cls) {
-  }
+      : WeakCodeReferences(Array::Handle(cls.dependent_code())), cls_(cls) {}
 
   virtual void UpdateArrayTo(const Array& value) {
     // TODO(fschneider): Fails for classes in the VM isolate.
@@ -2756,18 +2715,17 @@
     if (FLAG_trace_deoptimization || FLAG_trace_deoptimization_verbose) {
       Function& function = Function::Handle(code.function());
       THR_Print("Deoptimizing %s because CHA optimized (%s).\n",
-          function.ToFullyQualifiedCString(),
-          cls_.ToCString());
+                function.ToFullyQualifiedCString(), cls_.ToCString());
     }
   }
 
   virtual void ReportSwitchingCode(const Code& code) {
     if (FLAG_trace_deoptimization || FLAG_trace_deoptimization_verbose) {
       Function& function = Function::Handle(code.function());
-      THR_Print("Switching %s to unoptimized code because CHA invalid"
-                " (%s)\n",
-                function.ToFullyQualifiedCString(),
-                cls_.ToCString());
+      THR_Print(
+          "Switching %s to unoptimized code because CHA invalid"
+          " (%s)\n",
+          function.ToFullyQualifiedCString(), cls_.ToCString());
     }
   }
 
@@ -2788,7 +2746,8 @@
 void Class::RegisterCHACode(const Code& code) {
   if (FLAG_trace_cha) {
     THR_Print("RegisterCHACode '%s' depends on class '%s'\n",
-        Function::Handle(code.function()).ToQualifiedCString(), ToCString());
+              Function::Handle(code.function()).ToQualifiedCString(),
+              ToCString());
   }
   DEBUG_ASSERT(IsMutatorOrAtSafepoint());
   ASSERT(code.is_optimized());
@@ -2844,24 +2803,17 @@
   if (fields() != Object::empty_array().raw()) {
     *error = LanguageError::NewFormatted(
         *error,  // No previous error.
-        Script::Handle(script()),
-        token_pos(),
-        Report::AtLocation,
-        Report::kError,
-        Heap::kNew,
+        Script::Handle(script()), token_pos(), Report::AtLocation,
+        Report::kError, Heap::kNew,
         "new fields are not allowed for this patch");
     return false;
   }
   // There seem to be no functions, the patch is pointless.
   if (functions() == Object::empty_array().raw()) {
-    *error = LanguageError::NewFormatted(
-        *error,  // No previous error.
-        Script::Handle(script()),
-        token_pos(),
-        Report::AtLocation,
-        Report::kError,
-        Heap::kNew,
-        "no functions to patch");
+    *error = LanguageError::NewFormatted(*error,  // No previous error.
+                                         Script::Handle(script()), token_pos(),
+                                         Report::AtLocation, Report::kError,
+                                         Heap::kNew, "no functions to patch");
     return false;
   }
   // Iterate over all functions that will be patched and make sure
@@ -2883,14 +2835,11 @@
         // We can only patch external functions in a post finalized class.
         *error = LanguageError::NewFormatted(
             *error,  // No previous error.
-            Script::Handle(script()),
-            token_pos(),
-            Report::AtLocation,
-            Report::kError,
-            Heap::kNew,
-            !orig_func.is_external() ?
-            "'%s' is not external and therefore cannot be patched" :
-            "'%s' has already executed and therefore cannot be patched",
+            Script::Handle(script()), token_pos(), Report::AtLocation,
+            Report::kError, Heap::kNew,
+            !orig_func.is_external()
+                ? "'%s' is not external and therefore cannot be patched"
+                : "'%s' has already executed and therefore cannot be patched",
             name.ToCString());
         return false;
       }
@@ -2898,11 +2847,8 @@
       // We can only have new private functions that are added.
       *error = LanguageError::NewFormatted(
           *error,  // No previous error.
-          Script::Handle(script()),
-          token_pos(),
-          Report::AtLocation,
-          Report::kError,
-          Heap::kNew,
+          Script::Handle(script()), token_pos(), Report::AtLocation,
+          Report::kError, Heap::kNew,
           "'%s' is not private and therefore cannot be patched",
           name.ToCString());
       return false;
@@ -2945,8 +2891,8 @@
     // Not an implicit constructor, but a user declared one.
     orig_implicit_ctor = Function::null();
   }
-  const GrowableObjectArray& new_functions = GrowableObjectArray::Handle(
-      GrowableObjectArray::New(orig_len));
+  const GrowableObjectArray& new_functions =
+      GrowableObjectArray::Handle(GrowableObjectArray::New(orig_len));
   for (intptr_t i = 0; i < orig_len; i++) {
     orig_func ^= orig_list.At(i);
     member_name ^= orig_func.name();
@@ -2960,18 +2906,15 @@
         new_functions.Add(orig_func);
       }
     } else if (func.UserVisibleSignature() !=
-               orig_func.UserVisibleSignature()
-               && !FLAG_ignore_patch_signature_mismatch) {
+                   orig_func.UserVisibleSignature() &&
+               !FLAG_ignore_patch_signature_mismatch) {
       // Compare user visible signatures to ignore different implicit parameters
       // when patching a constructor with a factory.
       *error = LanguageError::NewFormatted(
           *error,  // No previous error.
-          Script::Handle(patch.script()),
-          func.token_pos(),
-          Report::AtLocation,
-          Report::kError,
-          Heap::kNew,
-          "signature mismatch: '%s'", member_name.ToCString());
+          Script::Handle(patch.script()), func.token_pos(), Report::AtLocation,
+          Report::kError, Heap::kNew, "signature mismatch: '%s'",
+          member_name.ToCString());
       return false;
     }
   }
@@ -3012,12 +2955,9 @@
     if (!orig_field.IsNull()) {
       *error = LanguageError::NewFormatted(
           *error,  // No previous error.
-          Script::Handle(patch.script()),
-          field.token_pos(),
-          Report::AtLocation,
-          Report::kError,
-          Heap::kNew,
-          "duplicate field: %s", member_name.ToCString());
+          Script::Handle(patch.script()), field.token_pos(), Report::AtLocation,
+          Report::kError, Heap::kNew, "duplicate field: %s",
+          member_name.ToCString());
       return false;
     }
     new_list.SetAt(i, field);
@@ -3066,9 +3006,8 @@
   const String& func_src =
       String::Handle(BuildClosureSource(param_names, expr));
   Script& script = Script::Handle();
-  script = Script::New(Symbols::EvalSourceUri(),
-                       func_src,
-                       RawScript::kEvaluateTag);
+  script =
+      Script::New(Symbols::EvalSourceUri(), func_src, RawScript::kEvaluateTag);
   // In order to tokenize the source, we need to get the key to mangle
   // private names from the library from which the class originates.
   const Library& lib = Library::Handle(cls.library());
@@ -3076,8 +3015,8 @@
   const String& lib_key = String::Handle(lib.private_key());
   script.Tokenize(lib_key, false);
 
-  const Function& func = Function::Handle(
-       Function::NewEvalFunction(cls, script, is_static));
+  const Function& func =
+      Function::Handle(Function::NewEvalFunction(cls, script, is_static));
   func.set_result_type(Object::dynamic_type());
   const intptr_t num_implicit_params = is_static ? 0 : 1;
   func.set_num_fixed_parameters(num_implicit_params + param_names.Length());
@@ -3092,8 +3031,8 @@
                            const Array& param_values) const {
   ASSERT(Thread::Current()->IsMutatorThread());
   if (id() < kInstanceCid) {
-    const Instance& exception = Instance::Handle(String::New(
-        "Cannot evaluate against a VM internal class"));
+    const Instance& exception = Instance::Handle(
+        String::New("Cannot evaluate against a VM internal class"));
     const Instance& stacktrace = Instance::Handle();
     return UnhandledException::New(exception, stacktrace);
   }
@@ -3114,12 +3053,12 @@
   }
   if (Compiler::IsBackgroundCompilation()) {
     Compiler::AbortBackgroundCompilation(Thread::kNoDeoptId,
-        "Class finalization while compiling");
+                                         "Class finalization while compiling");
   }
   ASSERT(thread->IsMutatorThread());
   ASSERT(thread != NULL);
-  const Error& error = Error::Handle(
-      thread->zone(), Compiler::CompileClass(*this));
+  const Error& error =
+      Error::Handle(thread->zone(), Compiler::CompileClass(*this));
   if (!error.IsNull()) {
     ASSERT(thread == Thread::Current());
     if (thread->long_jump_base() != NULL) {
@@ -3175,9 +3114,8 @@
   ASSERT(Object::class_class() != Class::null());
   Class& result = Class::Handle();
   {
-    RawObject* raw = Object::Allocate(Class::kClassId,
-                                      Class::InstanceSize(),
-                                      Heap::kOld);
+    RawObject* raw =
+        Object::Allocate(Class::kClassId, Class::InstanceSize(), Heap::kOld);
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -3307,7 +3245,7 @@
   ASSERT(raw_ptr()->name_ == String::null());
   ASSERT(value.IsSymbol());
   StorePointer(&raw_ptr()->name_, value.raw());
-NOT_IN_PRODUCT(
+#if !defined(PRODUCT)
   if (raw_ptr()->user_name_ == String::null()) {
     // TODO(johnmccutchan): Eagerly set user name for VM isolate classes,
     // lazily set user name for the other classes.
@@ -3315,15 +3253,15 @@
     const String& user_name = String::Handle(GenerateUserVisibleName());
     set_user_name(user_name);
   }
-)
+#endif  // !defined(PRODUCT)
 }
 
 
-NOT_IN_PRODUCT(
+#if !defined(PRODUCT)
 void Class::set_user_name(const String& value) const {
   StorePointer(&raw_ptr()->user_name_, value.raw());
 }
-)
+#endif  // !defined(PRODUCT)
 
 
 RawString* Class::GenerateUserVisibleName() const {
@@ -3377,7 +3315,8 @@
     case kTypedDataFloat64ArrayCid:
     case kExternalTypedDataFloat64ArrayCid:
       return Symbols::Float64List().raw();
-NOT_IN_PRODUCT(
+
+#if !defined(PRODUCT)
     case kNullCid:
       return Symbols::Null().raw();
     case kDynamicCid:
@@ -3464,7 +3403,7 @@
     case kImmutableArrayCid:
     case kGrowableObjectArrayCid:
       return Symbols::List().raw();
-)
+#endif  // !defined(PRODUCT)
   }
   const String& name = String::Handle(Name());
   return String::ScrubName(name);
@@ -3495,9 +3434,7 @@
     ASSERT(Dart::snapshot_kind() == Snapshot::kAppNoJIT);
     return TokenPosition::kNoSource;
   }
-  TokenStream::Iterator tkit(zone,
-                             tkns,
-                             token_pos(),
+  TokenStream::Iterator tkit(zone, tkns, token_pos(),
                              TokenStream::Iterator::kNoNewlines);
   intptr_t level = 0;
   while (tkit.CurrentTokenKind() != Token::kEOS) {
@@ -3578,8 +3515,8 @@
 
 void Class::set_is_finalized() const {
   ASSERT(!is_finalized());
-  set_state_bits(ClassFinalizedBits::update(RawClass::kFinalized,
-                                            raw_ptr()->state_bits_));
+  set_state_bits(
+      ClassFinalizedBits::update(RawClass::kFinalized, raw_ptr()->state_bits_));
 }
 
 
@@ -3593,8 +3530,8 @@
 
 void Class::ResetFinalization() const {
   ASSERT(IsTopLevel());
-  set_state_bits(ClassFinalizedBits::update(RawClass::kAllocated,
-                                            raw_ptr()->state_bits_));
+  set_state_bits(
+      ClassFinalizedBits::update(RawClass::kAllocated, raw_ptr()->state_bits_));
   set_state_bits(TypeFinalizedBit::update(false, raw_ptr()->state_bits_));
 }
 
@@ -3762,7 +3699,7 @@
     if (thsi.IsNullClass()) {
       // We already checked for other.IsDynamicClass() above.
       return (test_kind == Class::kIsMoreSpecificThan) ||
-      other.IsObjectClass() || other.IsNullClass();
+             other.IsObjectClass() || other.IsNullClass();
     }
     // Check for ObjectType. Any type that is not NullType or DynamicType
     // (already checked above), is more specific than ObjectType.
@@ -3791,18 +3728,14 @@
         // above.
         return test_kind == Class::kIsSubtypeOf;
       }
-      return type_arguments.TypeTest(test_kind,
-                                     other_type_arguments,
-                                     from_index,
-                                     num_type_params,
-                                     bound_error,
-                                     bound_trail,
-                                     space);
+      return type_arguments.TypeTest(test_kind, other_type_arguments,
+                                     from_index, num_type_params, bound_error,
+                                     bound_trail, space);
     }
     if (other.IsDartFunctionClass()) {
       // Check if type S has a call() method.
-      Function& function = Function::Handle(zone,
-          thsi.LookupDynamicFunctionAllowAbstract(Symbols::Call()));
+      Function& function = Function::Handle(
+          zone, thsi.LookupDynamicFunctionAllowAbstract(Symbols::Call()));
       if (function.IsNull()) {
         // Walk up the super_class chain.
         Class& cls = Class::Handle(zone, thsi.SuperClass());
@@ -3833,8 +3766,8 @@
           // runtime if this type test returns false at compile time.
           continue;
         }
-        ClassFinalizer::FinalizeType(
-            thsi, interface, ClassFinalizer::kCanonicalize);
+        ClassFinalizer::FinalizeType(thsi, interface,
+                                     ClassFinalizer::kCanonicalize);
         interfaces.SetAt(i, interface);
       }
       if (interface.IsMalbounded()) {
@@ -3856,12 +3789,8 @@
         // after the type arguments of the super type of this type.
         // The index of the type parameters is adjusted upon finalization.
         error = Error::null();
-        interface_args =
-            interface_args.InstantiateFrom(type_arguments,
-                                           &error,
-                                           NULL,
-                                           bound_trail,
-                                           space);
+        interface_args = interface_args.InstantiateFrom(
+            type_arguments, &error, NULL, bound_trail, space);
         if (!error.IsNull()) {
           // Return the first bound error to the caller if it requests it.
           if ((bound_error != NULL) && bound_error->IsNull()) {
@@ -3870,13 +3799,9 @@
           continue;  // Another interface may work better.
         }
       }
-      if (interface_class.TypeTest(test_kind,
-                                   interface_args,
-                                   other,
-                                   other_type_arguments,
-                                   bound_error,
-                                   bound_trail,
-                                   space)) {
+      if (interface_class.TypeTest(test_kind, interface_args, other,
+                                   other_type_arguments, bound_error,
+                                   bound_trail, space)) {
         return true;
       }
     }
@@ -3904,13 +3829,8 @@
                      Error* bound_error,
                      TrailPtr bound_trail,
                      Heap::Space space) const {
-  return TypeTestNonRecursive(*this,
-                              test_kind,
-                              type_arguments,
-                              other,
-                              other_type_arguments,
-                              bound_error,
-                              bound_trail,
+  return TypeTestNonRecursive(*this, test_kind, type_arguments, other,
+                              other_type_arguments, bound_error, bound_trail,
                               space);
 }
 
@@ -4047,8 +3967,8 @@
   Function& function = thread->FunctionHandle();
   if (len >= kFunctionLookupHashTreshold) {
     // Cache functions hash table to allow multi threaded access.
-    const Array& hash_table = Array::Handle(thread->zone(),
-                                            raw_ptr()->functions_hash_table_);
+    const Array& hash_table =
+        Array::Handle(thread->zone(), raw_ptr()->functions_hash_table_);
     if (!hash_table.IsNull()) {
       ClassFunctionsSet set(hash_table.raw());
       REUSABLE_STRING_HANDLESCOPE(thread);
@@ -4276,8 +4196,8 @@
   const char* library_name = lib.IsNull() ? "" : lib.ToCString();
   const char* patch_prefix = is_patch() ? "Patch " : "";
   const char* class_name = String::Handle(Name()).ToCString();
-  return OS::SCreate(Thread::Current()->zone(),
-      "%s %sClass: %s", library_name, patch_prefix, class_name);
+  return OS::SCreate(Thread::Current()->zone(), "%s %sClass: %s", library_name,
+                     patch_prefix, class_name);
 }
 
 
@@ -4285,8 +4205,9 @@
 // 'index' points to either:
 // - constants_list_ position of found element, or
 // - constants_list_ position where new canonical can be inserted.
-RawDouble* Class::LookupCanonicalDouble(
-    Zone* zone, double value, intptr_t* index) const {
+RawDouble* Class::LookupCanonicalDouble(Zone* zone,
+                                        double value,
+                                        intptr_t* index) const {
   ASSERT(this->raw() == Isolate::Current()->object_store()->double_class());
   const Array& constants = Array::Handle(zone, this->constants());
   const intptr_t constants_len = constants.Length();
@@ -4308,8 +4229,9 @@
 }
 
 
-RawMint* Class::LookupCanonicalMint(
-    Zone* zone, int64_t value, intptr_t* index) const {
+RawMint* Class::LookupCanonicalMint(Zone* zone,
+                                    int64_t value,
+                                    intptr_t* index) const {
   ASSERT(this->raw() == Isolate::Current()->object_store()->mint_class());
   const Array& constants = Array::Handle(zone, this->constants());
   const intptr_t constants_len = constants.Length();
@@ -4368,9 +4290,7 @@
     }
     return false;
   }
-  uword Hash() const {
-    return key_.ComputeCanonicalTableHash();
-  }
+  uword Hash() const { return key_.ComputeCanonicalTableHash(); }
   const Instance& key_;
 
  private:
@@ -4398,19 +4318,18 @@
     ASSERT(key.IsInstance());
     return Instance::Cast(key).ComputeCanonicalTableHash();
   }
-  static uword Hash(const CanonicalInstanceKey& key) {
-    return key.Hash();
-  }
+  static uword Hash(const CanonicalInstanceKey& key) { return key.Hash(); }
   static RawObject* NewKey(const CanonicalInstanceKey& obj) {
     return obj.key_.raw();
   }
 };
-typedef UnorderedHashSet <CanonicalInstanceTraits> CanonicalInstancesSet;
+typedef UnorderedHashSet<CanonicalInstanceTraits> CanonicalInstancesSet;
 
 
 RawInstance* Class::LookupCanonicalInstance(Zone* zone,
                                             const Instance& value) const {
   ASSERT(this->raw() == value.clazz());
+  ASSERT(is_finalized());
   Instance& canonical_value = Instance::Handle(zone);
   if (this->constants() != Object::empty_array().raw()) {
     CanonicalInstancesSet constants(zone, this->constants());
@@ -4492,9 +4411,8 @@
 
 RawUnresolvedClass* UnresolvedClass::New() {
   ASSERT(Object::unresolved_class_class() != Class::null());
-  RawObject* raw = Object::Allocate(UnresolvedClass::kClassId,
-                                    UnresolvedClass::InstanceSize(),
-                                    Heap::kOld);
+  RawObject* raw = Object::Allocate(
+      UnresolvedClass::kClassId, UnresolvedClass::InstanceSize(), Heap::kOld);
   return reinterpret_cast<RawUnresolvedClass*>(raw);
 }
 
@@ -4520,8 +4438,8 @@
   if (library_prefix() != LibraryPrefix::null()) {
     Thread* thread = Thread::Current();
     Zone* zone = thread->zone();
-    const LibraryPrefix& lib_prefix = LibraryPrefix::Handle(zone,
-                                                            library_prefix());
+    const LibraryPrefix& lib_prefix =
+        LibraryPrefix::Handle(zone, library_prefix());
     const String& name = String::Handle(zone, lib_prefix.name());  // Qualifier.
     GrowableHandlePtrArray<const String> strs(zone, 3);
     strs.Add(name);
@@ -4535,9 +4453,8 @@
 
 
 const char* UnresolvedClass::ToCString() const {
-  const char* cname =  String::Handle(Name()).ToCString();
-  return OS::SCreate(Thread::Current()->zone(),
-      "unresolved class '%s'", cname);
+  const char* cname = String::Handle(Name()).ToCString();
+  return OS::SCreate(Thread::Current()->zone(), "unresolved class '%s'", cname);
 }
 
 
@@ -4583,7 +4500,8 @@
   Zone* zone = thread->zone();
   ASSERT(from_index + len <= Length());
   String& name = String::Handle(zone);
-  const intptr_t num_strings = (len == 0) ? 2 : 2*len + 1;  // "<""T"", ""T"">".
+  const intptr_t num_strings =
+      (len == 0) ? 2 : 2 * len + 1;  // "<""T"", ""T"">".
   GrowableHandlePtrArray<const String> pieces(zone, num_strings);
   pieces.Add(Symbols::LAngleBracket());
   AbstractType& type = AbstractType::Handle(zone);
@@ -4688,10 +4606,7 @@
     ASSERT(!type.IsNull());
     other_type = other.TypeAt(from_index + i);
     ASSERT(!other_type.IsNull());
-    if (!type.TypeTest(test_kind,
-                       other_type,
-                       bound_error,
-                       bound_trail,
+    if (!type.TypeTest(test_kind, other_type, bound_error, bound_trail,
                        space)) {
       return false;
     }
@@ -4714,7 +4629,7 @@
   while (prior_instantiations.At(i) != Smi::New(StubCode::kNoInstantiator)) {
     i += 2;
   }
-  return i/2;
+  return i / 2;
 }
 
 
@@ -4740,8 +4655,7 @@
 }
 
 
-void TypeArguments::SetTypeAt(intptr_t index,
-                                const AbstractType& value) const {
+void TypeArguments::SetTypeAt(intptr_t index, const AbstractType& value) const {
   ASSERT(!IsCanonical());
   StorePointer(TypeAddr(index), value.raw());
 }
@@ -4811,7 +4725,7 @@
 // Return true if this uninstantiated type argument vector, once instantiated
 // at runtime, is a prefix of the type argument vector of its instantiator.
 bool TypeArguments::CanShareInstantiatorTypeArguments(
-      const Class& instantiator_class) const {
+    const Class& instantiator_class) const {
   ASSERT(!IsInstantiated());
   const intptr_t num_type_args = Length();
   const intptr_t num_instantiator_type_args =
@@ -4857,16 +4771,16 @@
   if (first_type_param_offset == 0) {
     return true;
   }
-  AbstractType& super_type = AbstractType::Handle(
-      instantiator_class.super_type());
-  const TypeArguments& super_type_args = TypeArguments::Handle(
-      super_type.arguments());
+  AbstractType& super_type =
+      AbstractType::Handle(instantiator_class.super_type());
+  const TypeArguments& super_type_args =
+      TypeArguments::Handle(super_type.arguments());
   if (super_type_args.IsNull()) {
     return false;
   }
   AbstractType& super_type_arg = AbstractType::Handle();
-  for (intptr_t i = 0;
-       (i < first_type_param_offset) && (i < num_type_args); i++) {
+  for (intptr_t i = 0; (i < first_type_param_offset) && (i < num_type_args);
+       i++) {
     type_arg = TypeAt(i);
     super_type_arg = super_type_args.TypeAt(i);
     if (!type_arg.Equals(super_type_arg)) {
@@ -4900,15 +4814,15 @@
       return true;
     }
     if (type.IsTypeParameter()) {
-      const AbstractType& bound = AbstractType::Handle(
-          TypeParameter::Cast(type).bound());
+      const AbstractType& bound =
+          AbstractType::Handle(TypeParameter::Cast(type).bound());
       if (!bound.IsObjectType() && !bound.IsDynamicType()) {
         return true;
       }
       continue;
     }
-    const TypeArguments& type_args = TypeArguments::Handle(
-        Type::Cast(type).arguments());
+    const TypeArguments& type_args =
+        TypeArguments::Handle(Type::Cast(type).arguments());
     if (!type_args.IsNull() && type_args.IsBounded()) {
       return true;
     }
@@ -4924,8 +4838,7 @@
     TrailPtr bound_trail,
     Heap::Space space) const {
   ASSERT(!IsInstantiated());
-  if (!instantiator_type_arguments.IsNull() &&
-      IsUninstantiatedIdentity() &&
+  if (!instantiator_type_arguments.IsNull() && IsUninstantiatedIdentity() &&
       (instantiator_type_arguments.Length() == Length())) {
     return instantiator_type_arguments.raw();
   }
@@ -4942,11 +4855,8 @@
     // solely on the type parameters of A and will be replaced by a non-null
     // type before A is marked as finalized.
     if (!type.IsNull() && !type.IsInstantiated()) {
-      type = type.InstantiateFrom(instantiator_type_arguments,
-                                  bound_error,
-                                  instantiation_trail,
-                                  bound_trail,
-                                  space);
+      type = type.InstantiateFrom(instantiator_type_arguments, bound_error,
+                                  instantiation_trail, bound_trail, space);
     }
     instantiated_array.SetTypeAt(i, type);
   }
@@ -4978,8 +4888,8 @@
   }
   // Cache lookup failed. Instantiate the type arguments.
   TypeArguments& result = TypeArguments::Handle();
-  result = InstantiateFrom(
-      instantiator_type_arguments, bound_error, NULL, NULL, Heap::kOld);
+  result = InstantiateFrom(instantiator_type_arguments, bound_error, NULL, NULL,
+                           Heap::kOld);
   if ((bound_error != NULL) && !bound_error->IsNull()) {
     return result.raw();
   }
@@ -4993,9 +4903,8 @@
   if ((index + 2) >= length) {
     // Grow the instantiations array.
     // The initial array is Object::zero_array() of length 1.
-    length = (length > 64) ?
-        (length + 64) :
-        ((length == 1) ? 3 : ((length - 1) * 2 + 1));
+    length = (length > 64) ? (length + 64)
+                           : ((length == 1) ? 3 : ((length - 1) * 2 + 1));
     prior_instantiations =
         Array::Grow(prior_instantiations, length, Heap::kOld);
     set_instantiations(prior_instantiations);
@@ -5017,8 +4926,7 @@
   TypeArguments& result = TypeArguments::Handle();
   {
     RawObject* raw = Object::Allocate(TypeArguments::kClassId,
-                                      TypeArguments::InstanceSize(len),
-                                      space);
+                                      TypeArguments::InstanceSize(len), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
     // Length must be set before we start storing into the array.
@@ -5033,7 +4941,6 @@
 }
 
 
-
 RawAbstractType* const* TypeArguments::TypeAddr(intptr_t index) const {
   // TODO(iposva): Determine if we should throw an exception here.
   ASSERT((index >= 0) && (index < Length()));
@@ -5056,8 +4963,8 @@
   ASSERT(IsResolved());
   AbstractType& type = AbstractType::Handle();
   const intptr_t num_types = Length();
-  const TypeArguments& clone = TypeArguments::Handle(
-      TypeArguments::New(num_types));
+  const TypeArguments& clone =
+      TypeArguments::Handle(TypeArguments::New(num_types));
   for (intptr_t i = 0; i < num_types; i++) {
     type = TypeAt(i);
     type = type.CloneUnfinalized();
@@ -5068,16 +4975,15 @@
 }
 
 
-RawTypeArguments* TypeArguments::CloneUninstantiated(
-    const Class& new_owner,
-    TrailPtr trail) const {
+RawTypeArguments* TypeArguments::CloneUninstantiated(const Class& new_owner,
+                                                     TrailPtr trail) 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));
+  const TypeArguments& clone =
+      TypeArguments::Handle(TypeArguments::New(num_types));
   for (intptr_t i = 0; i < num_types; i++) {
     type = TypeAt(i);
     if (!type.IsInstantiated()) {
@@ -5130,8 +5036,8 @@
       ComputeHash();
     }
     SafepointMutexLocker ml(isolate->type_canonicalization_mutex());
-    CanonicalTypeArgumentsSet table(
-        zone, object_store->canonical_type_arguments());
+    CanonicalTypeArgumentsSet table(zone,
+                                    object_store->canonical_type_arguments());
     // Since we canonicalized some type arguments above we need to lookup
     // in the table again to make sure we don't already have an equivalent
     // canonical entry.
@@ -5181,8 +5087,8 @@
     return "NULL TypeArguments";
   }
   Zone* zone = Thread::Current()->zone();
-  const char* prev_cstr = OS::SCreate(
-      zone, "TypeArguments: (%" Pd ")", Smi::Value(raw_ptr()->hash_));
+  const char* prev_cstr = OS::SCreate(zone, "TypeArguments: (%" Pd ")",
+                                      Smi::Value(raw_ptr()->hash_));
   for (int i = 0; i < Length(); i++) {
     const AbstractType& type_at = AbstractType::Handle(zone, TypeAt(i));
     const char* type_cstr = type_at.IsNull() ? "null" : type_at.ToCString();
@@ -5196,8 +5102,7 @@
 const char* PatchClass::ToCString() const {
   const Class& cls = Class::Handle(patched_class());
   const char* cls_name = cls.ToCString();
-  return OS::SCreate(Thread::Current()->zone(),
-      "PatchClass for %s", cls_name);
+  return OS::SCreate(Thread::Current()->zone(), "PatchClass for %s", cls_name);
 }
 
 
@@ -5224,8 +5129,7 @@
 RawPatchClass* PatchClass::New() {
   ASSERT(Object::patch_class_class() != Class::null());
   RawObject* raw = Object::Allocate(PatchClass::kClassId,
-                                    PatchClass::InstanceSize(),
-                                    Heap::kOld);
+                                    PatchClass::InstanceSize(), Heap::kOld);
   return reinterpret_cast<RawPatchClass*>(raw);
 }
 
@@ -5287,7 +5191,7 @@
   value.set_owner(*this);
   SetInstructions(value);
   ASSERT(Function::Handle(value.function()).IsNull() ||
-      (value.function() == this->raw()));
+         (value.function() == this->raw()));
 }
 
 
@@ -5313,8 +5217,8 @@
   Zone* zone = thread->zone();
   ASSERT(thread->IsMutatorThread());
 
-  const Error& error = Error::Handle(zone,
-      Compiler::EnsureUnoptimizedCode(thread, *this));
+  const Error& error =
+      Error::Handle(zone, Compiler::EnsureUnoptimizedCode(thread, *this));
   if (!error.IsNull()) {
     Exceptions::PropagateError(error);
   }
@@ -5331,12 +5235,11 @@
 
   if (FLAG_trace_deoptimization_verbose) {
     THR_Print("Disabling optimized code: '%s' entry: %#" Px "\n",
-      ToFullyQualifiedCString(),
-      current_code.UncheckedEntryPoint());
+              ToFullyQualifiedCString(), current_code.UncheckedEntryPoint());
   }
   current_code.DisableDartCode();
-  const Error& error = Error::Handle(zone,
-      Compiler::EnsureUnoptimizedCode(thread, *this));
+  const Error& error =
+      Error::Handle(zone, Compiler::EnsureUnoptimizedCode(thread, *this));
   if (!error.IsNull()) {
     Exceptions::PropagateError(error);
   }
@@ -5496,7 +5399,6 @@
 }
 
 
-
 RawFunction* Function::parent_function() const {
   if (IsClosureFunction()) {
     const Object& obj = Object::Handle(raw_ptr()->data_);
@@ -5528,9 +5430,7 @@
 
 
 RawFunction* Function::implicit_closure_function() const {
-  if (IsClosureFunction() ||
-      IsSignatureFunction() ||
-      IsFactory()) {
+  if (IsClosureFunction() || IsSignatureFunction() || IsFactory()) {
     return Function::null();
   }
   const Object& obj = Object::Handle(raw_ptr()->data_);
@@ -5591,8 +5491,7 @@
     // to _Closure class as well as the owner of the signature function.
     Class& scope_class = Class::Handle(Owner());
     if (!scope_class.IsTypedefClass() &&
-        (is_static() ||
-         !scope_class.IsGeneric() ||
+        (is_static() || !scope_class.IsGeneric() ||
          HasInstantiatedSignature())) {
       scope_class = Isolate::Current()->object_store()->closure_class();
       if (IsSignatureFunction()) {
@@ -5836,8 +5735,8 @@
 }
 
 
-void Function::SetParameterTypeAt(
-    intptr_t index, const AbstractType& value) const {
+void Function::SetParameterTypeAt(intptr_t index,
+                                  const AbstractType& value) const {
   ASSERT(!value.IsNull());
   // Method extractor parameters are shared and are in the VM heap.
   ASSERT(kind() != RawFunction::kMethodExtractor);
@@ -5886,7 +5785,8 @@
 
 
 RawTypeParameter* Function::LookupTypeParameter(
-    const String& type_name, intptr_t* function_level) const {
+    const String& type_name,
+    intptr_t* function_level) const {
   ASSERT(!type_name.IsNull());
   Thread* thread = Thread::Current();
   REUSABLE_TYPE_ARGUMENTS_HANDLESCOPE(thread);
@@ -5894,7 +5794,7 @@
   REUSABLE_STRING_HANDLESCOPE(thread);
   REUSABLE_FUNCTION_HANDLESCOPE(thread);
   TypeArguments& type_params = thread->TypeArgumentsHandle();
-  TypeParameter&  type_param = thread->TypeParameterHandle();
+  TypeParameter& type_param = thread->TypeParameterHandle();
   String& type_param_name = thread->StringHandle();
   Function& function = thread->FunctionHandle();
 
@@ -5976,9 +5876,9 @@
 void Function::SetNumOptionalParameters(intptr_t num_optional_parameters,
                                         bool are_optional_positional) const {
   ASSERT(num_optional_parameters >= 0);
-  set_num_optional_parameters(are_optional_positional ?
-                              num_optional_parameters :
-                              -num_optional_parameters);
+  set_num_optional_parameters(are_optional_positional
+                                  ? num_optional_parameters
+                                  : -num_optional_parameters);
 }
 
 
@@ -5995,7 +5895,7 @@
       (function_length < FLAG_huge_method_cutoff_in_tokens)) {
     // Additional check needed for implicit getters.
     return (unoptimized_code() == Object::null()) ||
-        (Code::Handle(unoptimized_code()).Size() <
+           (Code::Handle(unoptimized_code()).Size() <
             FLAG_huge_method_cutoff_in_code_size);
   }
   return false;
@@ -6025,9 +5925,7 @@
 
 bool Function::CanBeInlined() const {
   Thread* thread = Thread::Current();
-  return is_inlinable() &&
-         !is_external() &&
-         !is_generated_body() &&
+  return is_inlinable() && !is_external() && !is_generated_body() &&
          (!FLAG_support_debugger ||
           !thread->isolate()->debugger()->HasBreakpoint(*this, thread->zone()));
 }
@@ -6066,11 +5964,9 @@
     if (error_message != NULL) {
       const intptr_t kMessageBufferSize = 64;
       char message_buffer[kMessageBufferSize];
-      OS::SNPrint(message_buffer,
-                  kMessageBufferSize,
+      OS::SNPrint(message_buffer, kMessageBufferSize,
                   "%" Pd " named passed, at most %" Pd " expected",
-                  num_named_arguments,
-                  NumOptionalNamedParameters());
+                  num_named_arguments, NumOptionalNamedParameters());
       // Allocate in old space because it can be invoked in background
       // optimizing compilation.
       *error_message = String::New(message_buffer, Heap::kOld);
@@ -6086,8 +5982,7 @@
       char message_buffer[kMessageBufferSize];
       // Hide implicit parameters to the user.
       const intptr_t num_hidden_params = NumImplicitParameters();
-      OS::SNPrint(message_buffer,
-                  kMessageBufferSize,
+      OS::SNPrint(message_buffer, kMessageBufferSize,
                   "%" Pd "%s passed, %s%" Pd " expected",
                   num_pos_args - num_hidden_params,
                   num_opt_pos_params > 0 ? " positional" : "",
@@ -6105,8 +6000,7 @@
       char message_buffer[kMessageBufferSize];
       // Hide implicit parameters to the user.
       const intptr_t num_hidden_params = NumImplicitParameters();
-      OS::SNPrint(message_buffer,
-                  kMessageBufferSize,
+      OS::SNPrint(message_buffer, kMessageBufferSize,
                   "%" Pd "%s passed, %s%" Pd " expected",
                   num_pos_args - num_hidden_params,
                   num_opt_pos_params > 0 ? " positional" : "",
@@ -6127,8 +6021,7 @@
                                  String* error_message) const {
   const intptr_t num_named_arguments =
       argument_names.IsNull() ? 0 : argument_names.Length();
-  if (!AreValidArgumentCounts(num_arguments,
-                              num_named_arguments,
+  if (!AreValidArgumentCounts(num_arguments, num_named_arguments,
                               error_message)) {
     return false;
   }
@@ -6142,8 +6035,7 @@
     bool found = false;
     const intptr_t num_positional_args = num_arguments - num_named_arguments;
     const intptr_t num_parameters = NumParameters();
-    for (intptr_t j = num_positional_args;
-         !found && (j < num_parameters);
+    for (intptr_t j = num_positional_args; !found && (j < num_parameters);
          j++) {
       parameter_name = ParameterNameAt(j);
       ASSERT(argument_name.IsSymbol());
@@ -6155,8 +6047,7 @@
       if (error_message != NULL) {
         const intptr_t kMessageBufferSize = 64;
         char message_buffer[kMessageBufferSize];
-        OS::SNPrint(message_buffer,
-                    kMessageBufferSize,
+        OS::SNPrint(message_buffer, kMessageBufferSize,
                     "no optional formal parameter named '%s'",
                     argument_name.ToCString());
         // Allocate in old space because it can be invoked in background
@@ -6175,8 +6066,7 @@
   const intptr_t num_arguments = args_desc.Count();
   const intptr_t num_named_arguments = args_desc.NamedCount();
 
-  if (!AreValidArgumentCounts(num_arguments,
-                              num_named_arguments,
+  if (!AreValidArgumentCounts(num_arguments, num_named_arguments,
                               error_message)) {
     return false;
   }
@@ -6190,8 +6080,7 @@
     bool found = false;
     const intptr_t num_positional_args = num_arguments - num_named_arguments;
     const int num_parameters = NumParameters();
-    for (intptr_t j = num_positional_args;
-         !found && (j < num_parameters);
+    for (intptr_t j = num_positional_args; !found && (j < num_parameters);
          j++) {
       parameter_name = ParameterNameAt(j);
       ASSERT(argument_name.IsSymbol());
@@ -6203,8 +6092,7 @@
       if (error_message != NULL) {
         const intptr_t kMessageBufferSize = 64;
         char message_buffer[kMessageBufferSize];
-        OS::SNPrint(message_buffer,
-                    kMessageBufferSize,
+        OS::SNPrint(message_buffer, kMessageBufferSize,
                     "no optional formal parameter named '%s'",
                     argument_name.ToCString());
         // Allocate in old space because it can be invoked in background
@@ -6270,14 +6158,11 @@
         OS::SNPrint(NULL, 0, lib_class_format, library_name, class_name);
     ASSERT(chars != NULL);
     *chars = Thread::Current()->zone()->Alloc<char>(reserve_len + 1);
-    written = OS::SNPrint(
-        *chars, reserve_len + 1, lib_class_format, library_name, class_name);
+    written = OS::SNPrint(*chars, reserve_len + 1, lib_class_format,
+                          library_name, class_name);
   } else {
-    written = ConstructFunctionFullyQualifiedCString(parent,
-                                                     chars,
-                                                     reserve_len,
-                                                     with_lib,
-                                                     lib_kind);
+    written = ConstructFunctionFullyQualifiedCString(parent, chars, reserve_len,
+                                                     with_lib, lib_kind);
   }
   ASSERT(*chars != NULL);
   char* next = *chars + written;
@@ -6322,28 +6207,24 @@
   ASSERT((bound_error != NULL) && bound_error->IsNull());
   // Check that this function's signature type is a subtype of the other
   // function's signature type.
-  if (!TypeTest(kIsSubtypeOf, Object::null_type_arguments(),
-                other, Object::null_type_arguments(), bound_error,
-                Heap::kOld)) {
+  if (!TypeTest(kIsSubtypeOf, Object::null_type_arguments(), other,
+                Object::null_type_arguments(), bound_error, Heap::kOld)) {
     // For more informative error reporting, use the location of the other
     // function here, since the caller will use the location of this function.
     *bound_error = LanguageError::NewFormatted(
         *bound_error,  // A bound error if non null.
-        Script::Handle(other.script()),
-        other.token_pos(),
-        Report::AtLocation,
-        Report::kError,
-        Heap::kNew,
+        Script::Handle(other.script()), other.token_pos(), Report::AtLocation,
+        Report::kError, Heap::kNew,
         "signature type '%s' of function '%s' is not a subtype of signature "
         "type '%s' of function '%s' where\n%s%s",
         String::Handle(UserVisibleSignature()).ToCString(),
         String::Handle(UserVisibleName()).ToCString(),
         String::Handle(other.UserVisibleSignature()).ToCString(),
         String::Handle(other.UserVisibleName()).ToCString(),
-        String::Handle(Type::Handle(
-            SignatureType()).EnumerateURIs()).ToCString(),
-        String::Handle(Type::Handle(
-            other.SignatureType()).EnumerateURIs()).ToCString());
+        String::Handle(Type::Handle(SignatureType()).EnumerateURIs())
+            .ToCString(),
+        String::Handle(Type::Handle(other.SignatureType()).EnumerateURIs())
+            .ToCString());
     return false;
   }
   // We should also check that if the other function explicitly specifies a
@@ -6364,21 +6245,19 @@
 // parameter of the other function.
 // Note that we do not apply contravariance of parameter types, but covariance
 // of both parameter types and result type.
-bool Function::TestParameterType(
-    TypeTestKind test_kind,
-    intptr_t parameter_position,
-    intptr_t other_parameter_position,
-    const TypeArguments& type_arguments,
-    const Function& other,
-    const TypeArguments& other_type_arguments,
-    Error* bound_error,
-    Heap::Space space) const {
+bool Function::TestParameterType(TypeTestKind test_kind,
+                                 intptr_t parameter_position,
+                                 intptr_t other_parameter_position,
+                                 const TypeArguments& type_arguments,
+                                 const Function& other,
+                                 const TypeArguments& other_type_arguments,
+                                 Error* bound_error,
+                                 Heap::Space space) const {
   AbstractType& other_param_type =
       AbstractType::Handle(other.ParameterTypeAt(other_parameter_position));
   if (!other_param_type.IsInstantiated()) {
     other_param_type =
-        other_param_type.InstantiateFrom(other_type_arguments,
-                                         bound_error,
+        other_param_type.InstantiateFrom(other_type_arguments, bound_error,
                                          NULL,  // instantiation_trail
                                          NULL,  // bound_trail
                                          space);
@@ -6390,8 +6269,7 @@
   AbstractType& param_type =
       AbstractType::Handle(ParameterTypeAt(parameter_position));
   if (!param_type.IsInstantiated()) {
-    param_type = param_type.InstantiateFrom(type_arguments,
-                                            bound_error,
+    param_type = param_type.InstantiateFrom(type_arguments, bound_error,
                                             NULL,  // instantiation_trail
                                             NULL,  // bound_trail
                                             space);
@@ -6407,8 +6285,8 @@
     }
   } else {
     ASSERT(test_kind == kIsMoreSpecificThan);
-    if (!param_type.IsMoreSpecificThan(
-            other_param_type, bound_error, NULL, space)) {
+    if (!param_type.IsMoreSpecificThan(other_param_type, bound_error, NULL,
+                                       space)) {
       return false;
     }
   }
@@ -6445,16 +6323,15 @@
   // Check the result type.
   AbstractType& other_res_type = AbstractType::Handle(other.result_type());
   if (!other_res_type.IsInstantiated()) {
-    other_res_type = other_res_type.InstantiateFrom(other_type_arguments,
-                                                    bound_error,
-                                                    NULL, NULL, space);
+    other_res_type = other_res_type.InstantiateFrom(
+        other_type_arguments, bound_error, NULL, NULL, space);
     ASSERT((bound_error == NULL) || bound_error->IsNull());
   }
   if (!other_res_type.IsDynamicType() && !other_res_type.IsVoidType()) {
     AbstractType& res_type = AbstractType::Handle(result_type());
     if (!res_type.IsInstantiated()) {
-      res_type = res_type.InstantiateFrom(type_arguments, bound_error,
-                                          NULL, NULL, space);
+      res_type = res_type.InstantiateFrom(type_arguments, bound_error, NULL,
+                                          NULL, space);
       ASSERT((bound_error == NULL) || bound_error->IsNull());
     }
     if (res_type.IsVoidType()) {
@@ -6467,20 +6344,19 @@
       }
     } else {
       ASSERT(test_kind == kIsMoreSpecificThan);
-      if (!res_type.IsMoreSpecificThan(other_res_type, bound_error,
-                                       NULL, space)) {
+      if (!res_type.IsMoreSpecificThan(other_res_type, bound_error, NULL,
+                                       space)) {
         return false;
       }
     }
   }
   // Check the types of fixed and optional positional parameters.
   for (intptr_t i = 0; i < (other_num_fixed_params - other_num_ignored_params +
-                            other_num_opt_pos_params); i++) {
-    if (!TestParameterType(test_kind,
-                           i + num_ignored_params, i + other_num_ignored_params,
-                           type_arguments, other, other_type_arguments,
-                           bound_error,
-                           space)) {
+                            other_num_opt_pos_params);
+       i++) {
+    if (!TestParameterType(test_kind, i + num_ignored_params,
+                           i + other_num_ignored_params, type_arguments, other,
+                           other_type_arguments, bound_error, space)) {
       return false;
     }
   }
@@ -6508,11 +6384,8 @@
       ASSERT(String::Handle(ParameterNameAt(j)).IsSymbol());
       if (ParameterNameAt(j) == other_param_name.raw()) {
         found_param_name = true;
-        if (!TestParameterType(test_kind,
-                               j, i,
-                               type_arguments, other, other_type_arguments,
-                               bound_error,
-                               space)) {
+        if (!TestParameterType(test_kind, j, i, type_arguments, other,
+                               other_type_arguments, bound_error, space)) {
           return false;
         }
         break;
@@ -6560,15 +6433,14 @@
 
 bool Function::IsConstructorClosureFunction() const {
   return IsClosureFunction() &&
-      String::Handle(name()).StartsWith(Symbols::ConstructorClosurePrefix());
+         String::Handle(name()).StartsWith(Symbols::ConstructorClosurePrefix());
 }
 
 
 RawFunction* Function::New() {
   ASSERT(Object::function_class() != Class::null());
   RawObject* raw = Object::Allocate(Function::kClassId,
-                                    Function::InstanceSize(),
-                                    Heap::kOld);
+                                    Function::InstanceSize(), Heap::kOld);
   return reinterpret_cast<RawFunction*>(raw);
 }
 
@@ -6596,8 +6468,8 @@
   result.set_is_external(is_external);
   result.set_is_native(is_native);
   result.set_is_reflectable(true);  // Will be computed later.
-  result.set_is_visible(true);  // Will be computed later.
-  result.set_is_debuggable(true);  // Will be computed later.
+  result.set_is_visible(true);      // Will be computed later.
+  result.set_is_debuggable(true);   // Will be computed later.
   result.set_is_intrinsic(false);
   result.set_is_redirecting(false);
   result.set_is_generated_body(false);
@@ -6670,15 +6542,12 @@
   const Object& parent_owner = Object::Handle(parent.raw_ptr()->owner_);
   ASSERT(!parent_owner.IsNull());
   const Function& result = Function::Handle(
-      Function::New(name,
-                    RawFunction::kClosureFunction,
+      Function::New(name, RawFunction::kClosureFunction,
                     /* is_static = */ parent.is_static(),
                     /* is_const = */ false,
                     /* is_abstract = */ false,
                     /* is_external = */ false,
-                    /* is_native = */ false,
-                    parent_owner,
-                    token_pos));
+                    /* is_native = */ false, parent_owner, token_pos));
   result.set_parent_function(parent);
   return result.raw();
 }
@@ -6687,8 +6556,7 @@
 RawFunction* Function::NewSignatureFunction(const Class& owner,
                                             TokenPosition token_pos) {
   const Function& result = Function::Handle(Function::New(
-      Symbols::AnonymousSignature(),
-      RawFunction::kSignatureFunction,
+      Symbols::AnonymousSignature(), RawFunction::kSignatureFunction,
       /* is_static = */ false,
       /* is_const = */ false,
       /* is_abstract = */ false,
@@ -6708,16 +6576,14 @@
                                        bool is_static) {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
-  const Function& result = Function::Handle(zone,
+  const Function& result = Function::Handle(
+      zone,
       Function::New(String::Handle(Symbols::New(thread, ":Eval")),
-                    RawFunction::kRegularFunction,
-                    is_static,
+                    RawFunction::kRegularFunction, is_static,
                     /* is_const = */ false,
                     /* is_abstract = */ false,
                     /* is_external = */ false,
-                    /* is_native = */ false,
-                    owner,
-                    TokenPosition::kMinSource));
+                    /* is_native = */ false, owner, TokenPosition::kMinSource));
   ASSERT(!script.IsNull());
   result.set_is_debuggable(false);
   result.set_is_visible(true);
@@ -6733,8 +6599,8 @@
   ASSERT(!IsSignatureFunction() && !IsClosureFunction());
   // Create closure function.
   const String& closure_name = String::Handle(name());
-  const Function& closure_function = Function::Handle(
-      NewClosureFunction(closure_name, *this, token_pos()));
+  const Function& closure_function =
+      Function::Handle(NewClosureFunction(closure_name, *this, token_pos()));
 
   // Set closure function's context scope.
   if (is_static()) {
@@ -6767,10 +6633,10 @@
   const int num_params = num_fixed_params + num_opt_params;
   closure_function.set_num_fixed_parameters(num_fixed_params);
   closure_function.SetNumOptionalParameters(num_opt_params, has_opt_pos_params);
-  closure_function.set_parameter_types(Array::Handle(Array::New(num_params,
-                                                                Heap::kOld)));
-  closure_function.set_parameter_names(Array::Handle(Array::New(num_params,
-                                                                Heap::kOld)));
+  closure_function.set_parameter_types(
+      Array::Handle(Array::New(num_params, Heap::kOld)));
+  closure_function.set_parameter_names(
+      Array::Handle(Array::New(num_params, Heap::kOld)));
   AbstractType& param_type = AbstractType::Handle();
   String& param_name = String::Handle();
   // Add implicit closure object parameter.
@@ -6787,8 +6653,8 @@
 
   const Type& signature_type = Type::Handle(closure_function.SignatureType());
   if (!signature_type.IsFinalized()) {
-    ClassFinalizer::FinalizeType(
-        Class::Handle(Owner()), signature_type, ClassFinalizer::kCanonicalize);
+    ClassFinalizer::FinalizeType(Class::Handle(Owner()), signature_type,
+                                 ClassFinalizer::kCanonicalize);
   }
   set_implicit_closure_function(closure_function);
   ASSERT(closure_function.IsImplicitClosureFunction());
@@ -6813,8 +6679,8 @@
   // '_LoadRequest', CommaSpace, '_LoadError'.
   GrowableHandlePtrArray<const String> pieces(zone, 5);
   const TypeArguments& instantiator = TypeArguments::Handle(zone);
-  BuildSignatureParameters(thread, zone,
-                           false, kUserVisibleName, instantiator, &pieces);
+  BuildSignatureParameters(thread, zone, false, kUserVisibleName, instantiator,
+                           &pieces);
   return Symbols::FromConcatAll(thread, pieces);
 }
 
@@ -6842,11 +6708,10 @@
   while (i < num_fixed_params) {
     param_type = ParameterTypeAt(i);
     ASSERT(!param_type.IsNull());
-    if (instantiate &&
-        param_type.IsFinalized() &&
+    if (instantiate && param_type.IsFinalized() &&
         !param_type.IsInstantiated()) {
-      param_type = param_type.InstantiateFrom(instantiator, NULL,
-                                              NULL, NULL, Heap::kNew);
+      param_type = param_type.InstantiateFrom(instantiator, NULL, NULL, NULL,
+                                              Heap::kNew);
     }
     name = param_type.BuildName(name_visibility);
     pieces->Add(name);
@@ -6863,11 +6728,10 @@
     }
     for (intptr_t i = num_fixed_params; i < num_params; i++) {
       param_type = ParameterTypeAt(i);
-      if (instantiate &&
-          param_type.IsFinalized() &&
+      if (instantiate && param_type.IsFinalized() &&
           !param_type.IsInstantiated()) {
-        param_type = param_type.InstantiateFrom(instantiator, NULL,
-                                                NULL, NULL, Heap::kNew);
+        param_type = param_type.InstantiateFrom(instantiator, NULL, NULL, NULL,
+                                                Heap::kNew);
       }
       ASSERT(!param_type.IsNull());
       name = param_type.BuildName(name_visibility);
@@ -6939,8 +6803,8 @@
     const Class& scope_class = Class::Handle(zone, Owner());
     ASSERT(!scope_class.IsNull());
     if (scope_class.IsGeneric()) {
-      const TypeArguments& type_parameters = TypeArguments::Handle(
-          zone, scope_class.type_parameters());
+      const TypeArguments& type_parameters =
+          TypeArguments::Handle(zone, scope_class.type_parameters());
       const String& scope_class_name = String::Handle(zone, scope_class.Name());
       pieces.Add(scope_class_name);
       const intptr_t num_type_parameters = type_parameters.Length();
@@ -6965,16 +6829,13 @@
     }
   }
   pieces.Add(Symbols::LParen());
-  BuildSignatureParameters(thread, zone,
-                           instantiate,
-                           name_visibility,
-                           instantiator,
-                           &pieces);
+  BuildSignatureParameters(thread, zone, instantiate, name_visibility,
+                           instantiator, &pieces);
   pieces.Add(Symbols::RParenArrow());
   AbstractType& res_type = AbstractType::Handle(zone, result_type());
   if (instantiate && res_type.IsFinalized() && !res_type.IsInstantiated()) {
-    res_type = res_type.InstantiateFrom(instantiator, NULL,
-                                        NULL, NULL, Heap::kNew);
+    res_type =
+        res_type.InstantiateFrom(instantiator, NULL, NULL, NULL, Heap::kNew);
   }
   name = res_type.BuildName(name_visibility);
   pieces.Add(name);
@@ -7063,16 +6924,16 @@
     while (fun.IsLocalFunction() && !fun.IsImplicitClosureFunction()) {
       fun = fun.parent_function();
       result = String::Concat(Symbols::Dot(), result, Heap::kOld);
-      result = String::Concat(
-          String::Handle(fun.UserVisibleName()), result, Heap::kOld);
+      result = String::Concat(String::Handle(fun.UserVisibleName()), result,
+                              Heap::kOld);
     }
   }
   const Class& cls = Class::Handle(Owner());
   if (!cls.IsTopLevel()) {
     result = String::Concat(Symbols::Dot(), result, Heap::kOld);
-    const String& cls_name = String::Handle(
-        name_visibility == kScrubbedName ? cls.ScrubbedName()
-                                         : cls.UserVisibleName());
+    const String& cls_name = String::Handle(name_visibility == kScrubbedName
+                                                ? cls.ScrubbedName()
+                                                : cls.UserVisibleName());
     result = String::Concat(cls_name, result, Heap::kOld);
   }
   return result.raw();
@@ -7110,14 +6971,15 @@
   // (2) "foo(() => null);": End token is ')`, but we don't print it.
   // (3) "var foo = () => null;": End token is `;', but in this case the token
   // semicolon belongs to the assignment so we skip it.
-  if ((tkit.CurrentTokenKind() == Token::kCOMMA) ||                   // Case 1.
-      (tkit.CurrentTokenKind() == Token::kRPAREN) ||                  // Case 2.
+  if ((tkit.CurrentTokenKind() == Token::kCOMMA) ||   // Case 1.
+      (tkit.CurrentTokenKind() == Token::kRPAREN) ||  // Case 2.
       (tkit.CurrentTokenKind() == Token::kSEMICOLON &&
        String::Handle(zone, name()).Equals("<anonymous closure>"))) {  // Cas 3.
     last_tok_len = 0;
   }
-  const String& result = String::Handle(zone, func_script.GetSnippet(
-      from_line, from_col, to_line, to_col + last_tok_len));
+  const String& result =
+      String::Handle(zone, func_script.GetSnippet(from_line, from_col, to_line,
+                                                  to_col + last_tok_len));
   ASSERT(!result.IsNull());
   return result.raw();
 }
@@ -7129,8 +6991,7 @@
   uint32_t result = 0;
   Zone* zone = Thread::Current()->zone();
   TokenStream::Iterator tokens_iterator(
-      zone,
-      TokenStream::Handle(zone, Script::Handle(zone, script()).tokens()),
+      zone, TokenStream::Handle(zone, Script::Handle(zone, script()).tokens()),
       token_pos());
   Object& obj = Object::Handle(zone);
   String& literal = String::Handle(zone);
@@ -7192,8 +7053,10 @@
   const intptr_t saved_length = saved_ic_data.Length();
   ASSERT(saved_length > 0);
   if (saved_length > 1) {
-    const intptr_t restored_length = ICData::Cast(Object::Handle(
-        zone, saved_ic_data.At(saved_length - 1))).deopt_id() + 1;
+    const intptr_t restored_length =
+        ICData::Cast(Object::Handle(zone, saved_ic_data.At(saved_length - 1)))
+            .deopt_id() +
+        1;
     deopt_id_to_ic_data->SetLength(restored_length);
     for (intptr_t i = 0; i < restored_length; i++) {
       (*deopt_id_to_ic_data)[i] = NULL;
@@ -7249,11 +7112,10 @@
       // sed -i .bak -f /tmp/newkeys runtime/vm/method_recognizer.h
       THR_Print("s/0x%08x/0x%08x/\n", fp, SourceFingerprint());
     } else {
-      THR_Print("FP mismatch while recognizing method %s:"
-                " expecting 0x%08x found 0x%08x\n",
-                ToFullyQualifiedCString(),
-                fp,
-                SourceFingerprint());
+      THR_Print(
+          "FP mismatch while recognizing method %s:"
+          " expecting 0x%08x found 0x%08x\n",
+          ToFullyQualifiedCString(), fp, SourceFingerprint());
       return false;
     }
   }
@@ -7304,9 +7166,9 @@
       UNREACHABLE();
   }
   const char* function_name = String::Handle(name()).ToCString();
-  return OS::SCreate(Thread::Current()->zone(),
-      "Function '%s':%s%s%s%s.",
-      function_name, static_str, abstract_str, kind_str, const_str);
+  return OS::SCreate(Thread::Current()->zone(), "Function '%s':%s%s%s%s.",
+                     function_name, static_str, abstract_str, kind_str,
+                     const_str);
 }
 
 
@@ -7335,8 +7197,7 @@
 RawClosureData* ClosureData::New() {
   ASSERT(Object::closure_data_class() != Class::null());
   RawObject* raw = Object::Allocate(ClosureData::kClassId,
-                                    ClosureData::InstanceSize(),
-                                    Heap::kOld);
+                                    ClosureData::InstanceSize(), Heap::kOld);
   return reinterpret_cast<RawClosureData*>(raw);
 }
 
@@ -7364,9 +7225,8 @@
 
 RawRedirectionData* RedirectionData::New() {
   ASSERT(Object::redirection_data_class() != Class::null());
-  RawObject* raw = Object::Allocate(RedirectionData::kClassId,
-                                    RedirectionData::InstanceSize(),
-                                    Heap::kOld);
+  RawObject* raw = Object::Allocate(
+      RedirectionData::kClassId, RedirectionData::InstanceSize(), Heap::kOld);
   return reinterpret_cast<RawRedirectionData*>(raw);
 }
 
@@ -7433,13 +7293,13 @@
 
 RawString* Field::NameFromGetter(const String& getter_name) {
   return Symbols::New(Thread::Current(), getter_name, kGetterPrefixLength,
-      getter_name.Length() - kGetterPrefixLength);
+                      getter_name.Length() - kGetterPrefixLength);
 }
 
 
 RawString* Field::NameFromSetter(const String& setter_name) {
   return Symbols::New(Thread::Current(), setter_name, kSetterPrefixLength,
-      setter_name.Length() - kSetterPrefixLength);
+                      setter_name.Length() - kSetterPrefixLength);
 }
 
 
@@ -7523,9 +7383,8 @@
 
 RawField* Field::New() {
   ASSERT(Object::field_class() != Class::null());
-  RawObject* raw = Object::Allocate(Field::kClassId,
-                                    Field::InstanceSize(),
-                                    Heap::kOld);
+  RawObject* raw =
+      Object::Allocate(Field::kClassId, Field::InstanceSize(), Heap::kOld);
   return reinterpret_cast<RawField*>(raw);
 }
 
@@ -7582,14 +7441,8 @@
                      TokenPosition token_pos) {
   ASSERT(!owner.IsNull());
   const Field& result = Field::Handle(Field::New());
-  InitializeNew(result,
-                name,
-                is_static,
-                is_final,
-                is_const,
-                is_reflectable,
-                owner,
-                token_pos);
+  InitializeNew(result, name, is_static, is_final, is_const, is_reflectable,
+                owner, token_pos);
   result.SetFieldType(type);
   return result.raw();
 }
@@ -7602,14 +7455,9 @@
                              TokenPosition token_pos) {
   ASSERT(!owner.IsNull());
   const Field& result = Field::Handle(Field::New());
-  InitializeNew(result,
-                name,
-                true, /* is_static */
-                is_final,
-                is_const,
-                true, /* is_reflectable */
-                owner,
-                token_pos);
+  InitializeNew(result, name, true,       /* is_static */
+                is_final, is_const, true, /* is_reflectable */
+                owner, token_pos);
   return result.raw();
 }
 
@@ -7692,8 +7540,8 @@
   const char* field_name = String::Handle(name()).ToCString();
   const Class& cls = Class::Handle(Owner());
   const char* cls_name = String::Handle(cls.Name()).ToCString();
-  return OS::SCreate(Thread::Current()->zone(),
-      "Field <%s.%s>:%s%s%s", cls_name, field_name, kF0, kF1, kF2);
+  return OS::SCreate(Thread::Current()->zone(), "Field <%s.%s>:%s%s%s",
+                     cls_name, field_name, kF0, kF1, kF2);
 }
 
 
@@ -7709,16 +7557,16 @@
   String& closure_name = String::Handle(zone, this->name());
   closure_name = Symbols::FromConcat(thread, Symbols::HashMark(), closure_name);
   if (make_setter) {
-    closure_name = Symbols::FromConcat(thread,
-        Symbols::HashMark(), closure_name);
+    closure_name =
+        Symbols::FromConcat(thread, Symbols::HashMark(), closure_name);
   }
 
   Field& closure_field = Field::Handle(zone);
   closure_field = field_owner.LookupStaticField(closure_name);
   if (!closure_field.IsNull()) {
     ASSERT(closure_field.is_static());
-    const Instance& closure = Instance::Handle(zone,
-        closure_field.StaticValue());
+    const Instance& closure =
+        Instance::Handle(zone, closure_field.StaticValue());
     ASSERT(!closure.IsNull());
     ASSERT(closure.IsClosure());
     return closure.raw();
@@ -7729,29 +7577,26 @@
   const char* field_name = String::Handle(zone, name()).ToCString();
   String& expr_src = String::Handle(zone);
   if (make_setter) {
-    expr_src =
-        String::NewFormatted("(%s_) { return %s = %s_; }",
-                             field_name, field_name, field_name);
+    expr_src = String::NewFormatted("(%s_) { return %s = %s_; }", field_name,
+                                    field_name, field_name);
   } else {
     expr_src = String::NewFormatted("() { return %s; }", field_name);
   }
-  Object& result = Object::Handle(zone,
-      field_owner.Evaluate(expr_src,
-                           Object::empty_array(),
-                           Object::empty_array()));
+  Object& result =
+      Object::Handle(zone, field_owner.Evaluate(expr_src, Object::empty_array(),
+                                                Object::empty_array()));
   ASSERT(result.IsInstance());
   // The caller may expect the closure to be allocated in old space. Copy
   // the result here, since Object::Clone() is a private method.
   result = Object::Clone(result, Heap::kOld);
 
-  closure_field = Field::New(closure_name,
-                             true,  // is_static
-                             true,  // is_final
-                             true,  // is_const
-                             false,  // is_reflectable
-                             field_owner,
-                             Object::dynamic_type(),
-                             this->token_pos());
+  closure_field =
+      Field::New(closure_name,
+                 true,   // is_static
+                 true,   // is_final
+                 true,   // is_const
+                 false,  // is_reflectable
+                 field_owner, Object::dynamic_type(), this->token_pos());
   closure_field.SetStaticValue(Instance::Cast(result), true);
   field_owner.AddField(closure_field);
 
@@ -7784,7 +7629,7 @@
  public:
   explicit FieldDependentArray(const Field& field)
       : WeakCodeReferences(Array::Handle(field.dependent_code())),
-                           field_(field) {}
+        field_(field) {}
 
   virtual void UpdateArrayTo(const Array& value) {
     field_.set_dependent_code(value);
@@ -7801,10 +7646,10 @@
   virtual void ReportSwitchingCode(const Code& code) {
     if (FLAG_trace_deoptimization || FLAG_trace_deoptimization_verbose) {
       Function& function = Function::Handle(code.function());
-      THR_Print("Switching '%s' to unoptimized code because guard"
-                " on field '%s' was violated.\n",
-                function.ToFullyQualifiedCString(),
-                field_.ToCString());
+      THR_Print(
+          "Switching '%s' to unoptimized code because guard"
+          " on field '%s' was violated.\n",
+          function.ToFullyQualifiedCString(), field_.ToCString());
     }
   }
 
@@ -7835,7 +7680,7 @@
   return (raw_ptr()->guarded_cid_ == other.raw_ptr()->guarded_cid_) &&
          (raw_ptr()->is_nullable_ == other.raw_ptr()->is_nullable_) &&
          (raw_ptr()->guarded_list_length_ ==
-             other.raw_ptr()->guarded_list_length_) &&
+          other.raw_ptr()->guarded_list_length_) &&
          (is_unboxing_candidate() == other.is_unboxing_candidate());
 }
 
@@ -7941,29 +7786,24 @@
     return "<*>";
   }
 
-  const Class& cls = Class::Handle(
-      Isolate::Current()->class_table()->At(guarded_cid()));
+  const Class& cls =
+      Class::Handle(Isolate::Current()->class_table()->At(guarded_cid()));
   const char* class_name = String::Handle(cls.Name()).ToCString();
 
-  if (RawObject::IsBuiltinListClassId(guarded_cid()) &&
-      !is_nullable() &&
+  if (RawObject::IsBuiltinListClassId(guarded_cid()) && !is_nullable() &&
       is_final()) {
     ASSERT(guarded_list_length() != kUnknownFixedLength);
     if (guarded_list_length() == kNoFixedLength) {
-      return Thread::Current()->zone()->PrintToString(
-          "<%s [*]>", class_name);
+      return Thread::Current()->zone()->PrintToString("<%s [*]>", class_name);
     } else {
       return Thread::Current()->zone()->PrintToString(
-          "<%s [%" Pd " @%" Pd "]>",
-          class_name,
-          guarded_list_length(),
+          "<%s [%" Pd " @%" Pd "]>", class_name, guarded_list_length(),
           guarded_list_length_in_object_offset());
     }
   }
 
-  return Thread::Current()->zone()->PrintToString("<%s %s>",
-    is_nullable() ? "nullable" : "not-nullable",
-    class_name);
+  return Thread::Current()->zone()->PrintToString(
+      "<%s %s>", is_nullable() ? "nullable" : "not-nullable", class_name);
 }
 
 
@@ -8064,9 +7904,7 @@
   }
 
   if (FLAG_trace_field_guards) {
-    THR_Print("Store %s %s <- %s\n",
-              ToCString(),
-              GuardedPropertiesAsCString(),
+    THR_Print("Store %s %s <- %s\n", ToCString(), GuardedPropertiesAsCString(),
               value.ToCString());
   }
 
@@ -8105,8 +7943,7 @@
 RawLiteralToken* LiteralToken::New() {
   ASSERT(Object::literal_token_class() != Class::null());
   RawObject* raw = Object::Allocate(LiteralToken::kClassId,
-                                    LiteralToken::InstanceSize(),
-                                    Heap::kOld);
+                                    LiteralToken::InstanceSize(), Heap::kOld);
   return reinterpret_cast<RawLiteralToken*>(raw);
 }
 
@@ -8158,7 +7995,7 @@
 
 void TokenStream::DataFinalizer(void* isolate_callback_data,
                                 Dart_WeakPersistentHandle handle,
-                                void *peer) {
+                                void* peer) {
   ASSERT(peer != NULL);
   ::free(peer);
 }
@@ -8174,8 +8011,7 @@
 }
 
 RawString* TokenStream::GenerateSource() const {
-  return GenerateSource(TokenPosition::kMinSource,
-                        TokenPosition::kMaxSource);
+  return GenerateSource(TokenPosition::kMinSource, TokenPosition::kMaxSource);
 }
 
 RawString* TokenStream::GenerateSource(TokenPosition start_pos,
@@ -8183,9 +8019,8 @@
   Zone* zone = Thread::Current()->zone();
   Iterator iterator(zone, *this, start_pos, Iterator::kAllTokens);
   const ExternalTypedData& data = ExternalTypedData::Handle(zone, GetStream());
-  const GrowableObjectArray& literals =
-      GrowableObjectArray::Handle(zone,
-                                  GrowableObjectArray::New(data.Length()));
+  const GrowableObjectArray& literals = GrowableObjectArray::Handle(
+      zone, GrowableObjectArray::New(data.Length()));
   const String& private_key = String::Handle(zone, PrivateKey());
   intptr_t private_len = private_key.Length();
 
@@ -8323,10 +8158,10 @@
       separator = &Symbols::Blank();
     } else if ((curr == Token::kASSIGN) && (next == Token::kLPAREN)) {
       separator = &Symbols::Blank();
-    } else if ((curr == Token::kRETURN  ||
-                curr == Token::kCONDITIONAL ||
+    } else if ((curr == Token::kRETURN || curr == Token::kCONDITIONAL ||
                 Token::IsBinaryOperator(curr) ||
-                Token::IsEqualityOperator(curr)) && (next == Token::kLPAREN)) {
+                Token::IsEqualityOperator(curr)) &&
+               (next == Token::kLPAREN)) {
       separator = &Symbols::Blank();
     } else if ((curr == Token::kLBRACE) && (next == Token::kRBRACE)) {
       separator = NULL;
@@ -8351,9 +8186,9 @@
 
     // Account for indentation in case we printed a newline.
     if (curr == Token::kNEWLINE) {
-        for (int i = 0; i < indent; i++) {
-          literals.Add(Symbols::TwoSpaces());
-        }
+      for (int i = 0; i < indent; i++) {
+        literals.Add(Symbols::TwoSpaces());
+      }
     }
 
     // Setup for next iteration.
@@ -8367,9 +8202,7 @@
 
 intptr_t TokenStream::ComputeSourcePosition(TokenPosition tok_pos) const {
   Zone* zone = Thread::Current()->zone();
-  Iterator iterator(zone,
-                    *this,
-                    TokenPosition::kMinSource,
+  Iterator iterator(zone, *this, TokenPosition::kMinSource,
                     Iterator::kAllTokens);
   intptr_t src_pos = 0;
   Token::Kind kind = iterator.CurrentTokenKind();
@@ -8385,8 +8218,7 @@
 RawTokenStream* TokenStream::New() {
   ASSERT(Object::token_stream_class() != Class::null());
   RawObject* raw = Object::Allocate(TokenStream::kClassId,
-                                    TokenStream::InstanceSize(),
-                                    Heap::kOld);
+                                    TokenStream::InstanceSize(), Heap::kOld);
   return reinterpret_cast<RawTokenStream*>(raw);
 }
 
@@ -8400,9 +8232,8 @@
   ASSERT(data != NULL);
   Zone* zone = Thread::Current()->zone();
   const ExternalTypedData& stream = ExternalTypedData::Handle(
-      zone,
-      ExternalTypedData::New(kExternalTypedDataUint8ArrayCid,
-                             data, len, Heap::kOld));
+      zone, ExternalTypedData::New(kExternalTypedDataUint8ArrayCid, data, len,
+                                   Heap::kOld));
   stream.AddFinalizer(data, DataFinalizer, len);
   const TokenStream& result = TokenStream::Handle(zone, TokenStream::New());
   result.SetStream(stream);
@@ -8454,16 +8285,15 @@
   static const bool kPrintTokenObjects = false;
 
   CompressedTokenStreamData(const GrowableObjectArray& ta,
-                            CompressedTokenMap* map) :
-      buffer_(NULL),
-      stream_(&buffer_, Reallocate, kInitialBufferSize),
-      token_objects_(ta),
-      tokens_(map),
-      value_(Object::Handle()),
-      fresh_index_smi_(Smi::Handle()),
-      num_tokens_collected_(0) {
-  }
-  virtual ~CompressedTokenStreamData() { }
+                            CompressedTokenMap* map)
+      : buffer_(NULL),
+        stream_(&buffer_, Reallocate, kInitialBufferSize),
+        token_objects_(ta),
+        tokens_(map),
+        value_(Object::Handle()),
+        fresh_index_smi_(Smi::Handle()),
+        num_tokens_collected_(0) {}
+  virtual ~CompressedTokenStreamData() {}
 
   virtual void AddToken(const Scanner::TokenDescriptor& token) {
     if (token.kind == Token::kIDENT) {  // Identifier token.
@@ -8491,14 +8321,14 @@
     ASSERT(ident.IsSymbol());
     const intptr_t fresh_index = token_objects_.Length();
     fresh_index_smi_ = Smi::New(fresh_index);
-    intptr_t index = Smi::Value(Smi::RawCast(
-        tokens_->InsertOrGetValue(ident, fresh_index_smi_)));
+    intptr_t index = Smi::Value(
+        Smi::RawCast(tokens_->InsertOrGetValue(ident, fresh_index_smi_)));
     if (index == fresh_index) {
       token_objects_.Add(ident);
       if (kPrintTokenObjects) {
         int iid = Isolate::Current()->main_port() % 1024;
-        OS::Print("ident  %03x  %p <%s>\n",
-                  iid, ident.raw(), ident.ToCString());
+        OS::Print("ident  %03x  %p <%s>\n", iid, ident.raw(),
+                  ident.ToCString());
       }
     }
     WriteIndex(index);
@@ -8518,13 +8348,13 @@
       fresh_index_smi_ = Smi::New(fresh_index);
       const LiteralToken& lit = LiteralToken::Handle(
           LiteralToken::New(descriptor.kind, *descriptor.literal));
-      index = Smi::Value(Smi::RawCast(
-          tokens_->InsertOrGetValue(lit, fresh_index_smi_)));
+      index = Smi::Value(
+          Smi::RawCast(tokens_->InsertOrGetValue(lit, fresh_index_smi_)));
       token_objects_.Add(lit);
       if (kPrintTokenObjects) {
         int iid = Isolate::Current()->main_port() % 1024;
-        printf("lit    %03x  %p  %p  %p  <%s>\n",
-               iid, token_objects_.raw(), lit.literal(), lit.value(),
+        printf("lit    %03x  %p  %p  %p  <%s>\n", iid, token_objects_.raw(),
+               lit.literal(), lit.value(),
                String::Handle(lit.literal()).ToCString());
       }
     }
@@ -8532,9 +8362,7 @@
   }
 
   // Add a simple token into the stream.
-  void AddSimpleToken(intptr_t kind) {
-    stream_.WriteUnsigned(kind);
-  }
+  void AddSimpleToken(intptr_t kind) { stream_.WriteUnsigned(kind); }
 
   void WriteIndex(intptr_t value) {
     stream_.WriteUnsigned(value + Token::kNumTokens);
@@ -8581,9 +8409,8 @@
     const int kInitialPrivateCapacity = 256;
     token_objects =
         GrowableObjectArray::New(kInitialPrivateCapacity, Heap::kOld);
-    token_objects_map =
-        HashTables::New<CompressedTokenMap>(kInitialPrivateCapacity,
-                                            Heap::kOld);
+    token_objects_map = HashTables::New<CompressedTokenMap>(
+        kInitialPrivateCapacity, Heap::kOld);
   }
   CompressedTokenMap map(token_objects_map.raw());
   CompressedTokenStreamData data(token_objects, &map);
@@ -8594,8 +8421,8 @@
   // Create and setup the token stream object.
   const ExternalTypedData& stream = ExternalTypedData::Handle(
       zone,
-      ExternalTypedData::New(kExternalTypedDataUint8ArrayCid,
-                             data.GetStream(), data.Length(), Heap::kOld));
+      ExternalTypedData::New(kExternalTypedDataUint8ArrayCid, data.GetStream(),
+                             data.Length(), Heap::kOld));
   intptr_t external_size = data.Length();
   stream.AddFinalizer(data.GetStream(), DataFinalizer, external_size);
   const TokenStream& result = TokenStream::Handle(zone, New());
@@ -8615,15 +8442,14 @@
 
 
 void TokenStream::OpenSharedTokenList(Isolate* isolate) {
-  const int kInitialSharedCapacity = 5*1024;
+  const int kInitialSharedCapacity = 5 * 1024;
   ObjectStore* store = isolate->object_store();
   ASSERT(store->token_objects() == GrowableObjectArray::null());
   const GrowableObjectArray& token_objects = GrowableObjectArray::Handle(
       GrowableObjectArray::New(kInitialSharedCapacity, Heap::kOld));
   store->set_token_objects(token_objects);
   const Array& token_objects_map = Array::Handle(
-      HashTables::New<CompressedTokenMap>(kInitialSharedCapacity,
-                                          Heap::kOld));
+      HashTables::New<CompressedTokenMap>(kInitialSharedCapacity, Heap::kOld));
   store->set_token_objects_map(token_objects_map);
 }
 
@@ -8646,8 +8472,9 @@
     : tokens_(TokenStream::Handle(zone, tokens.raw())),
       data_(ExternalTypedData::Handle(zone, tokens.GetStream())),
       stream_(reinterpret_cast<uint8_t*>(data_.DataAddr(0)), data_.Length()),
-      token_objects_(Array::Handle(zone,
-         GrowableObjectArray::Handle(zone, tokens.TokenObjects()).data())),
+      token_objects_(Array::Handle(
+          zone,
+          GrowableObjectArray::Handle(zone, tokens.TokenObjects()).data())),
       obj_(Object::Handle(zone)),
       cur_token_pos_(token_pos.Pos()),
       cur_token_kind_(Token::kILLEGAL),
@@ -8816,9 +8643,7 @@
   Smi& value = Smi::Handle(zone);
   String& tokenValue = String::Handle(zone);
   ASSERT(!tkns.IsNull());
-  TokenStream::Iterator tkit(zone,
-                             tkns,
-                             TokenPosition::kMinSource,
+  TokenStream::Iterator tkit(zone, tkns, TokenPosition::kMinSource,
                              TokenStream::Iterator::kAllTokens);
   int current_line = -1;
   Scanner s(source, key);
@@ -8940,8 +8765,7 @@
 }
 
 
-void Script::Tokenize(const String& private_key,
-                      bool use_shared_tokens) const {
+void Script::Tokenize(const String& private_key, bool use_shared_tokens) const {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   const TokenStream& tkns = TokenStream::Handle(zone, tokens());
@@ -8953,8 +8777,8 @@
   VMTagScope tagScope(thread, VMTag::kCompileScannerTagId);
   CSTAT_TIMER_SCOPE(thread, scanner_timer);
   const String& src = String::Handle(zone, Source());
-  const TokenStream& ts = TokenStream::Handle(zone,
-      TokenStream::New(src, private_key, use_shared_tokens));
+  const TokenStream& ts = TokenStream::Handle(
+      zone, TokenStream::New(src, private_key, use_shared_tokens));
   set_tokens(ts);
   INC_STAT(thread, src_length, src.Length());
 }
@@ -8988,9 +8812,7 @@
     return;
   }
   if (column == NULL) {
-    TokenStream::Iterator tkit(zone,
-                               tkns,
-                               TokenPosition::kMinSource,
+    TokenStream::Iterator tkit(zone, tkns, TokenPosition::kMinSource,
                                TokenStream::Iterator::kAllTokens);
     intptr_t cur_line = line_offset() + 1;
     while ((tkit.CurrentPosition() < token_pos) &&
@@ -9035,9 +8857,7 @@
   const TokenStream& tkns = TokenStream::Handle(zone, tokens());
   line_number -= line_offset();
   if (line_number < 1) line_number = 1;
-  TokenStream::Iterator tkit(zone,
-                             tkns,
-                             TokenPosition::kMinSource,
+  TokenStream::Iterator tkit(zone, tkns, TokenPosition::kMinSource,
                              TokenStream::Iterator::kAllTokens);
   // Scan through the token stream to the required line.
   intptr_t cur_line = 1;
@@ -9087,8 +8907,7 @@
   intptr_t line_start_idx = -1;
   intptr_t last_char_idx = -1;
   for (intptr_t ix = 0;
-       (ix < src.Length()) && (current_line <= relative_line_number);
-       ix++) {
+       (ix < src.Length()) && (current_line <= relative_line_number); ix++) {
     if ((current_line == relative_line_number) && (line_start_idx < 0)) {
       line_start_idx = ix;
     }
@@ -9105,10 +8924,8 @@
   // Guarantee that returned string is never NULL.
 
   if (line_start_idx >= 0) {
-    return String::SubString(src,
-                             line_start_idx,
-                             last_char_idx - line_start_idx + 1,
-                             space);
+    return String::SubString(src, line_start_idx,
+                             last_char_idx - line_start_idx + 1, space);
   } else {
     return Symbols::Empty().raw();
   }
@@ -9172,9 +8989,8 @@
 
 RawScript* Script::New() {
   ASSERT(Object::script_class() != Class::null());
-  RawObject* raw = Object::Allocate(Script::kClassId,
-                                    Script::InstanceSize(),
-                                    Heap::kOld);
+  RawObject* raw =
+      Object::Allocate(Script::kClassId, Script::InstanceSize(), Heap::kOld);
   return reinterpret_cast<RawScript*>(raw);
 }
 
@@ -9198,8 +9014,8 @@
       String::Handle(zone, Symbols::New(thread, resolved_url)));
   result.set_source(source);
   result.set_kind(kind);
-  result.set_load_timestamp(FLAG_remove_script_timestamps_for_test
-                            ? 0 : OS::GetCurrentTimeMillis());
+  result.set_load_timestamp(
+      FLAG_remove_script_timestamps_for_test ? 0 : OS::GetCurrentTimeMillis());
   result.SetLocationOffset(0, 0);
   return result.raw();
 }
@@ -9215,8 +9031,8 @@
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   Isolate* isolate = thread->isolate();
-  const GrowableObjectArray& libs = GrowableObjectArray::Handle(zone,
-      isolate->object_store()->libraries());
+  const GrowableObjectArray& libs =
+      GrowableObjectArray::Handle(zone, isolate->object_store()->libraries());
   Library& lib = Library::Handle(zone);
   Array& scripts = Array::Handle(zone);
   for (intptr_t i = 0; i < libs.Length(); i++) {
@@ -9262,10 +9078,9 @@
 ClassDictionaryIterator::ClassDictionaryIterator(const Library& library,
                                                  IterationKind kind)
     : DictionaryIterator(library),
-      toplevel_class_(Class::Handle(
-          (kind == kIteratePrivate)
-              ? library.toplevel_class()
-              : Class::null())) {
+      toplevel_class_(Class::Handle((kind == kIteratePrivate)
+                                        ? library.toplevel_class()
+                                        : Class::null())) {
   MoveToNextClass();
 }
 
@@ -9324,12 +9139,9 @@
 
 static void ReportTooManyImports(const Library& lib) {
   const String& url = String::Handle(lib.url());
-  Report::MessageF(Report::kError,
-                   Script::Handle(lib.LookupScript(url)),
-                   TokenPosition::kNoSource,
-                   Report::AtLocation,
-                   "too many imports in library '%s'",
-                   url.ToCString());
+  Report::MessageF(Report::kError, Script::Handle(lib.LookupScript(url)),
+                   TokenPosition::kNoSource, Report::AtLocation,
+                   "too many imports in library '%s'", url.ToCString());
   UNREACHABLE();
 }
 
@@ -9391,9 +9203,7 @@
     // Library objects are always canonical.
     return a.raw() == b.raw();
   }
-  static uword Hash(const Object& key) {
-    return Library::Cast(key).UrlHash();
-  }
+  static uword Hash(const Object& key) { return Library::Cast(key).UrlHash(); }
 };
 typedef UnorderedHashSet<LibraryUrlTraits> LibraryLoadErrorSet;
 
@@ -9477,16 +9287,19 @@
 }
 
 
-static RawString* MakeClassMetaName(Thread* thread, Zone* zone,
+static RawString* MakeClassMetaName(Thread* thread,
+                                    Zone* zone,
                                     const Class& cls) {
-  return Symbols::FromConcat(thread,
-                             Symbols::At(), String::Handle(zone, cls.Name()));
+  return Symbols::FromConcat(thread, Symbols::At(),
+                             String::Handle(zone, cls.Name()));
 }
 
 
-static RawString* MakeFieldMetaName(Thread* thread, Zone* zone,
+static RawString* MakeFieldMetaName(Thread* thread,
+                                    Zone* zone,
                                     const Field& field) {
-  const String& cname = String::Handle(zone,
+  const String& cname = String::Handle(
+      zone,
       MakeClassMetaName(thread, zone, Class::Handle(zone, field.Origin())));
   GrowableHandlePtrArray<const String> pieces(zone, 3);
   pieces.Add(cname);
@@ -9496,9 +9309,11 @@
 }
 
 
-static RawString* MakeFunctionMetaName(Thread* thread, Zone* zone,
+static RawString* MakeFunctionMetaName(Thread* thread,
+                                       Zone* zone,
                                        const Function& func) {
-  const String& cname = String::Handle(zone,
+  const String& cname = String::Handle(
+      zone,
       MakeClassMetaName(thread, zone, Class::Handle(zone, func.origin())));
   GrowableHandlePtrArray<const String> pieces(zone, 3);
   pieces.Add(cname);
@@ -9508,9 +9323,11 @@
 }
 
 
-static RawString* MakeTypeParameterMetaName(Thread* thread, Zone* zone,
+static RawString* MakeTypeParameterMetaName(Thread* thread,
+                                            Zone* zone,
                                             const TypeParameter& param) {
-  const String& cname = String::Handle(zone,
+  const String& cname = String::Handle(
+      zone,
       MakeClassMetaName(thread, zone,
                         Class::Handle(zone, param.parameterized_class())));
   GrowableHandlePtrArray<const String> pieces(zone, 3);
@@ -9528,12 +9345,11 @@
   ASSERT(thread->IsMutatorThread());
   Zone* zone = thread->zone();
   const String& metaname = String::Handle(zone, Symbols::New(thread, name));
-  const Field& field = Field::Handle(zone,
-      Field::NewTopLevel(metaname,
-                         false,  // is_final
-                         false,  // is_const
-                         owner,
-                         token_pos));
+  const Field& field =
+      Field::Handle(zone, Field::NewTopLevel(metaname,
+                                             false,  // is_final
+                                             false,  // is_const
+                                             owner, token_pos));
   field.SetFieldType(Object::dynamic_type());
   field.set_is_reflectable(false);
   field.SetStaticValue(Array::empty_array(), true);
@@ -9580,10 +9396,10 @@
                                        TokenPosition token_pos) const {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
-  AddMetadata(Class::Handle(zone, param.parameterized_class()),
-              String::Handle(zone,
-                             MakeTypeParameterMetaName(thread, zone, param)),
-              token_pos);
+  AddMetadata(
+      Class::Handle(zone, param.parameterized_class()),
+      String::Handle(zone, MakeTypeParameterMetaName(thread, zone, param)),
+      token_pos);
 }
 
 
@@ -9655,14 +9471,12 @@
 
 
 static bool ShouldBePrivate(const String& name) {
-  return
-      (name.Length() >= 1 && name.CharAt(0) == '_') ||
-      (name.Length() >= 5 &&
-        (name.CharAt(4) == '_' &&
-          (name.CharAt(0) == 'g' || name.CharAt(0) == 's') &&
-          name.CharAt(1) == 'e' &&
-          name.CharAt(2) == 't' &&
-          name.CharAt(3) == ':'));
+  return (name.Length() >= 1 && name.CharAt(0) == '_') ||
+         (name.Length() >= 5 &&
+          (name.CharAt(4) == '_' &&
+           (name.CharAt(0) == 'g' || name.CharAt(0) == 's') &&
+           name.CharAt(1) == 'e' && name.CharAt(2) == 't' &&
+           name.CharAt(3) == ':'));
 }
 
 
@@ -9703,9 +9517,7 @@
   static bool IsMatch(const Object& a, const Object& b) {
     return String::Cast(a).Equals(String::Cast(b));
   }
-  static uword Hash(const Object& obj) {
-    return String::Cast(obj).Hash();
-  }
+  static uword Hash(const Object& obj) { return String::Cast(obj).Hash(); }
 };
 typedef UnorderedHashMap<StringEqualsTraits> ResolvedNamesMap;
 
@@ -9713,14 +9525,13 @@
 // Returns true if the name is found in the cache, false no cache hit.
 // obj is set to the cached entry. It may be null, indicating that the
 // name does not resolve to anything in this library.
-bool Library::LookupResolvedNamesCache(const String& name,
-                                       Object* obj) const {
+bool Library::LookupResolvedNamesCache(const String& name, Object* obj) const {
   ResolvedNamesMap cache(resolved_names());
   bool present = false;
   *obj = cache.GetOrNull(name, &present);
-  // Mutator compiler thread may add entries and therefore
-  // change 'resolved_names()' while running a background compilation;
-  // ASSERT that 'resolved_names()' has not changed only in mutator.
+// Mutator compiler thread may add entries and therefore
+// change 'resolved_names()' while running a background compilation;
+// ASSERT that 'resolved_names()' has not changed only in mutator.
 #if defined(DEBUG)
   if (Thread::Current()->IsMutatorThread()) {
     ASSERT(cache.Release().raw() == resolved_names());
@@ -9747,8 +9558,7 @@
 }
 
 
-bool Library::LookupExportedNamesCache(const String& name,
-                                       Object* obj) const {
+bool Library::LookupExportedNamesCache(const String& name, Object* obj) const {
   ASSERT(FLAG_use_exp_cache);
   if (exported_names() == Array::null()) {
     return false;
@@ -9756,9 +9566,9 @@
   ResolvedNamesMap cache(exported_names());
   bool present = false;
   *obj = cache.GetOrNull(name, &present);
-  // Mutator compiler thread may add entries and therefore
-  // change 'exported_names()' while running a background compilation;
-  // do not ASSERT that 'exported_names()' has not changed.
+// Mutator compiler thread may add entries and therefore
+// change 'exported_names()' while running a background compilation;
+// do not ASSERT that 'exported_names()' has not changed.
 #if defined(DEBUG)
   if (Thread::Current()->IsMutatorThread()) {
     ASSERT(cache.Release().raw() == exported_names());
@@ -9862,9 +9672,7 @@
 
 void Library::AddObject(const Object& obj, const String& name) const {
   ASSERT(Thread::Current()->IsMutatorThread());
-  ASSERT(obj.IsClass() ||
-         obj.IsFunction() ||
-         obj.IsField() ||
+  ASSERT(obj.IsClass() || obj.IsFunction() || obj.IsField() ||
          obj.IsLibraryPrefix());
   ASSERT(name.Equals(String::Handle(obj.DictionaryName())));
   ASSERT(LookupLocalObject(name) == Object::null());
@@ -9935,16 +9743,14 @@
     }
   }
   bool in_cycle = (trail->RemoveLast() < 0);
-  if (FLAG_use_exp_cache &&
-      !in_cycle &&
-      !Compiler::IsBackgroundCompilation()) {
+  if (FLAG_use_exp_cache && !in_cycle && !Compiler::IsBackgroundCompilation()) {
     AddToExportedNamesCache(name, obj);
   }
   return obj.raw();
 }
 
 
-RawObject* Library::LookupEntry(const String& name, intptr_t *index) const {
+RawObject* Library::LookupEntry(const String& name, intptr_t* index) const {
   Thread* thread = Thread::Current();
   REUSABLE_ARRAY_HANDLESCOPE(thread);
   REUSABLE_OBJECT_HANDLESCOPE(thread);
@@ -10093,7 +9899,7 @@
       entry = patches.At(i);
       if (entry.IsClass()) {
         owner_script = Class::Cast(entry).script();
-      }  else {
+      } else {
         ASSERT(entry.IsScript());
         owner_script = Script::Cast(entry).raw();
       }
@@ -10147,7 +9953,7 @@
       // If we do a suffix match, only match if the partial path
       // starts at or immediately after the path separator.
       if (((url.CharAt(0) == '/') ||
-          (script_url.CharAt(start_idx - 1) == '/')) &&
+           (script_url.CharAt(start_idx - 1) == '/')) &&
           url.Equals(script_url, start_idx, url_length)) {
         return script.raw();
       }
@@ -10421,7 +10227,7 @@
 // pre-allocate any unused capacity. The assumption is that
 // re-exports are quite rare.
 void Library::AddExport(const Namespace& ns) const {
-  Array &exports = Array::Handle(this->exports());
+  Array& exports = Array::Handle(this->exports());
   intptr_t num_exports = exports.Length();
   exports = Array::Grow(exports, num_exports + 1);
   StorePointer(&raw_ptr()->exports_, exports.raw());
@@ -10475,15 +10281,13 @@
 
 RawLibrary* Library::New() {
   ASSERT(Object::library_class() != Class::null());
-  RawObject* raw = Object::Allocate(Library::kClassId,
-                                    Library::InstanceSize(),
-                                    Heap::kOld);
+  RawObject* raw =
+      Object::Allocate(Library::kClassId, Library::InstanceSize(), Heap::kOld);
   return reinterpret_cast<RawLibrary*>(raw);
 }
 
 
-RawLibrary* Library::NewLibraryHelper(const String& url,
-                                      bool import_core_lib) {
+RawLibrary* Library::NewLibraryHelper(const String& url, bool import_core_lib) {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   ASSERT(thread->IsMutatorThread());
@@ -10497,16 +10301,15 @@
   result.StorePointer(&result.raw_ptr()->url_, url.raw());
   result.StorePointer(&result.raw_ptr()->resolved_names_,
                       Object::empty_array().raw());
-  result.StorePointer(&result.raw_ptr()->exported_names_,
-                      Array::null());
+  result.StorePointer(&result.raw_ptr()->exported_names_, Array::null());
   result.StorePointer(&result.raw_ptr()->dictionary_,
                       Object::empty_array().raw());
   result.StorePointer(&result.raw_ptr()->metadata_,
                       GrowableObjectArray::New(4, Heap::kOld));
   result.StorePointer(&result.raw_ptr()->toplevel_class_, Class::null());
-  result.StorePointer(&result.raw_ptr()->patch_classes_,
-                      GrowableObjectArray::New(Object::empty_array(),
-                                               Heap::kOld));
+  result.StorePointer(
+      &result.raw_ptr()->patch_classes_,
+      GrowableObjectArray::New(Object::empty_array(), Heap::kOld));
   result.StorePointer(&result.raw_ptr()->imports_, Object::empty_array().raw());
   result.StorePointer(&result.raw_ptr()->exports_, Object::empty_array().raw());
   result.StorePointer(&result.raw_ptr()->loaded_scripts_, Array::null());
@@ -10528,7 +10331,8 @@
   if (import_core_lib) {
     const Library& core_lib = Library::Handle(zone, Library::CoreLibrary());
     ASSERT(!core_lib.IsNull());
-    const Namespace& ns = Namespace::Handle(zone,
+    const Namespace& ns = Namespace::Handle(
+        zone,
         Namespace::New(core_lib, Object::null_array(), Object::null_array()));
     result.AddImport(ns);
   }
@@ -10577,8 +10381,8 @@
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   const String& native_flds_lib_url = Symbols::DartNativeWrappers();
-  const Library& native_flds_lib = Library::Handle(zone,
-      Library::NewLibraryHelper(native_flds_lib_url, false));
+  const Library& native_flds_lib = Library::Handle(
+      zone, Library::NewLibraryHelper(native_flds_lib_url, false));
   const String& native_flds_lib_name = Symbols::DartNativeWrappersLibName();
   native_flds_lib.SetName(native_flds_lib_name);
   native_flds_lib.SetLoadRequested();
@@ -10591,10 +10395,7 @@
   char name_buffer[kNameLength];
   String& cls_name = String::Handle(zone);
   for (int fld_cnt = 1; fld_cnt <= kNumNativeWrappersClasses; fld_cnt++) {
-    OS::SNPrint(name_buffer,
-                kNameLength,
-                "%s%d",
-                kNativeWrappersClass,
+    OS::SNPrint(name_buffer, kNameLength, "%s%d", kNativeWrappersClass,
                 fld_cnt);
     cls_name = Symbols::New(thread, name_buffer);
     Class::NewNativeWrapper(native_flds_lib, cls_name, fld_cnt);
@@ -10617,19 +10418,15 @@
     return a_str.Equals(b_str);
   }
 
-  static uword Hash(const Object& key) {
-    return String::Cast(key).Hash();
-  }
+  static uword Hash(const Object& key) { return String::Cast(key).Hash(); }
 
-  static RawObject* NewKey(const String& str) {
-    return str.raw();
-  }
+  static RawObject* NewKey(const String& str) { return str.raw(); }
 };
 typedef UnorderedHashMap<LibraryLookupTraits> LibraryLookupMap;
 
 
 // Returns library with given url in current isolate, or NULL.
-RawLibrary* Library::LookupLibrary(Thread* thread, const String &url) {
+RawLibrary* Library::LookupLibrary(Thread* thread, const String& url) {
   Zone* zone = thread->zone();
   Isolate* isolate = thread->isolate();
   ObjectStore* object_store = isolate->object_store();
@@ -10697,16 +10494,15 @@
   const String& url = String::Handle(zone, this->url());
   intptr_t hash_value = url.Hash() & hash_mask;
 
-  const GrowableObjectArray& libs = GrowableObjectArray::Handle(zone,
-      isolate->object_store()->libraries());
+  const GrowableObjectArray& libs =
+      GrowableObjectArray::Handle(zone, isolate->object_store()->libraries());
   intptr_t sequence_value = libs.Length();
 
   char private_key[32];
-  OS::SNPrint(private_key, sizeof(private_key),
-              "%c%" Pd "%06" Pd "",
+  OS::SNPrint(private_key, sizeof(private_key), "%c%" Pd "%06" Pd "",
               kPrivateKeySeparator, sequence_value, hash_value);
-  const String& key = String::Handle(zone, String::New(private_key,
-                                                       Heap::kOld));
+  const String& key =
+      String::Handle(zone, String::New(private_key, Heap::kOld));
   key.Hash();  // This string may end up in the VM isolate.
   StorePointer(&raw_ptr()->private_key_, key.raw());
 }
@@ -10726,8 +10522,8 @@
   String& name = String::Handle(zone, class_name.raw());
   if (class_name.CharAt(0) == kPrivateIdentifierStart) {
     // Private identifiers are mangled on a per library basis.
-    name = Symbols::FromConcat(thread,
-        name, String::Handle(zone, core_lib.private_key()));
+    name = Symbols::FromConcat(thread, name,
+                               String::Handle(zone, core_lib.private_key()));
   }
   return core_lib.LookupClass(name);
 }
@@ -10742,8 +10538,8 @@
   // ASSERT(strchr(name, '@') == NULL);
   String& str = String::Handle(zone);
   str = name.raw();
-  str = Symbols::FromConcat(thread,
-                            str, String::Handle(zone, this->private_key()));
+  str = Symbols::FromConcat(thread, str,
+                            String::Handle(zone, this->private_key()));
   return str.raw();
 }
 
@@ -10774,8 +10570,8 @@
   const String& lib_url = String::Handle(zone, url());
   ASSERT(Library::LookupLibrary(thread, lib_url) == Library::null());
   ASSERT(lib_url.HasHash());
-  GrowableObjectArray& libs = GrowableObjectArray::Handle(zone,
-      object_store->libraries());
+  GrowableObjectArray& libs =
+      GrowableObjectArray::Handle(zone, object_store->libraries());
   ASSERT(!libs.IsNull());
   set_index(libs.Length());
   libs.Add(*this);
@@ -10840,7 +10636,7 @@
 
 
 RawLibrary* Library::InternalLibrary() {
-  return Isolate::Current()->object_store()->internal_library();
+  return Isolate::Current()->object_store()->_internal_library();
 }
 
 
@@ -10854,9 +10650,11 @@
 }
 
 
+#if !defined(PRODUCT)
 RawLibrary* Library::MirrorsLibrary() {
   return Isolate::Current()->object_store()->mirrors_library();
 }
+#endif
 
 
 RawLibrary* Library::NativeWrappersLibrary() {
@@ -10875,14 +10673,14 @@
 
 
 RawLibrary* Library::VMServiceLibrary() {
-  return Isolate::Current()->object_store()->vmservice_library();
+  return Isolate::Current()->object_store()->_vmservice_library();
 }
 
 
 const char* Library::ToCString() const {
   const String& name = String::Handle(url());
-  return OS::SCreate(Thread::Current()->zone(),
-      "Library:'%s'", name.ToCString());
+  return OS::SCreate(Thread::Current()->zone(), "Library:'%s'",
+                     name.ToCString());
 }
 
 
@@ -11080,10 +10878,9 @@
     {
       TransitionVMToNative transition(thread);
       Api::Scope api_scope(thread);
-      obj = Api::UnwrapHandle(
-              handler(Dart_kImportTag,
-                      Api::NewHandle(thread, importer()),
-                      Api::NewHandle(thread, lib_url.raw())));
+      obj = Api::UnwrapHandle(handler(Dart_kImportTag,
+                                      Api::NewHandle(thread, importer()),
+                                      Api::NewHandle(thread, lib_url.raw())));
     }
     if (obj.IsError()) {
       Exceptions::PropagateError(Error::Cast(obj));
@@ -11110,7 +10907,7 @@
  public:
   explicit PrefixDependentArray(const LibraryPrefix& prefix)
       : WeakCodeReferences(Array::Handle(prefix.dependent_code())),
-                           prefix_(prefix) {}
+        prefix_(prefix) {}
 
   virtual void UpdateArrayTo(const Array& value) {
     prefix_.set_dependent_code(value);
@@ -11127,10 +10924,10 @@
   virtual void ReportSwitchingCode(const Code& code) {
     if (FLAG_trace_deoptimization || FLAG_trace_deoptimization_verbose) {
       THR_Print("Prefix '%s': disabling %s code for %s function '%s'\n",
-          String::Handle(prefix_.name()).ToCString(),
-          code.is_optimized() ? "optimized" : "unoptimized",
-          code.IsDisabled() ? "'patched'" : "'unpatched'",
-          Function::Handle(code.function()).ToCString());
+                String::Handle(prefix_.name()).ToCString(),
+                code.is_optimized() ? "optimized" : "unoptimized",
+                code.IsDisabled() ? "'patched'" : "'unpatched'",
+                Function::Handle(code.function()).ToCString());
     }
   }
 
@@ -11159,8 +10956,7 @@
 
 RawLibraryPrefix* LibraryPrefix::New() {
   RawObject* raw = Object::Allocate(LibraryPrefix::kClassId,
-                                    LibraryPrefix::InstanceSize(),
-                                    Heap::kOld);
+                                    LibraryPrefix::InstanceSize(), Heap::kOld);
   return reinterpret_cast<RawLibraryPrefix*>(raw);
 }
 
@@ -11207,8 +11003,8 @@
 
 const char* LibraryPrefix::ToCString() const {
   const String& prefix = String::Handle(name());
-  return OS::SCreate(Thread::Current()->zone(),
-      "LibraryPrefix:'%s'", prefix.ToCString());
+  return OS::SCreate(Thread::Current()->zone(), "LibraryPrefix:'%s'",
+                     prefix.ToCString());
 }
 
 
@@ -11222,8 +11018,7 @@
   Field& field = Field::Handle(Field::NewTopLevel(Symbols::TopLevel(),
                                                   false,  // is_final
                                                   false,  // is_const
-                                                  owner,
-                                                  token_pos));
+                                                  owner, token_pos));
   field.set_is_reflectable(false);
   field.SetFieldType(Object::dynamic_type());
   field.SetStaticValue(Array::empty_array(), true);
@@ -11252,8 +11047,8 @@
 
 const char* Namespace::ToCString() const {
   const Library& lib = Library::Handle(library());
-  return OS::SCreate(Thread::Current()->zone(),
-      "Namespace for library '%s'", lib.ToCString());
+  return OS::SCreate(Thread::Current()->zone(), "Namespace for library '%s'",
+                     lib.ToCString());
 }
 
 
@@ -11313,7 +11108,7 @@
     // Look for cycle in reexport graph.
     for (int i = 0; i < trail->length(); i++) {
       if (trail->At(i) == lib.index()) {
-        for (int j = i+1; j < trail->length(); j++) {
+        for (int j = i + 1; j < trail->length(); j++) {
           (*trail)[j] = -1;
         }
         return Object::null();
@@ -11324,8 +11119,7 @@
   intptr_t ignore = 0;
   // Lookup the name in the library's symbols.
   Object& obj = Object::Handle(zone, lib.LookupEntry(name, &ignore));
-  if (!Field::IsGetterName(name) &&
-      !Field::IsSetterName(name) &&
+  if (!Field::IsGetterName(name) && !Field::IsSetterName(name) &&
       (obj.IsNull() || obj.IsLibraryPrefix())) {
     String& accessor_name = String::Handle(zone);
     accessor_name ^= Field::LookupGetterSymbol(name);
@@ -11364,8 +11158,7 @@
 RawNamespace* Namespace::New() {
   ASSERT(Object::namespace_class() != Class::null());
   RawObject* raw = Object::Allocate(Namespace::kClassId,
-                                    Namespace::InstanceSize(),
-                                    Heap::kOld);
+                                    Namespace::InstanceSize(), Heap::kOld);
   return reinterpret_cast<RawNamespace*>(raw);
 }
 
@@ -11410,8 +11203,8 @@
   // Inner functions get added to the closures array. As part of compilation
   // more closures can be added to the end of the array. Compile all the
   // closures until we have reached the end of the "worklist".
-  const GrowableObjectArray& closures = GrowableObjectArray::Handle(zone,
-      Isolate::Current()->object_store()->closure_functions());
+  const GrowableObjectArray& closures = GrowableObjectArray::Handle(
+      zone, Isolate::Current()->object_store()->closure_functions());
   Function& func = Function::Handle(zone);
   for (int i = 0; i < closures.Length(); i++) {
     func ^= closures.At(i);
@@ -11432,8 +11225,8 @@
   Zone* zone = thread->zone();
   Error& error = Error::Handle(zone);
   Isolate* isolate = thread->isolate();
-  const GrowableObjectArray& libs = GrowableObjectArray::Handle(
-      isolate->object_store()->libraries());
+  const GrowableObjectArray& libs =
+      GrowableObjectArray::Handle(isolate->object_store()->libraries());
   Library& lib = Library::Handle(zone);
   Class& cls = Class::Handle(zone);
   for (int i = 0; i < libs.Length(); i++) {
@@ -11455,8 +11248,8 @@
   // Inner functions get added to the closures array. As part of compilation
   // more closures can be added to the end of the array. Compile all the
   // closures until we have reached the end of the "worklist".
-  const GrowableObjectArray& closures = GrowableObjectArray::Handle(zone,
-      Isolate::Current()->object_store()->closure_functions());
+  const GrowableObjectArray& closures = GrowableObjectArray::Handle(
+      zone, Isolate::Current()->object_store()->closure_functions());
   Function& func = Function::Handle(zone);
   for (int i = 0; i < closures.Length(); i++) {
     func ^= closures.At(i);
@@ -11522,7 +11315,7 @@
     CHECK_FINGERPRINT3(func, class_name, function_name, dest, fp);             \
   }
 
-#define CHECK_FINGERPRINTS2(class_name, function_name, dest, type, fp) \
+#define CHECK_FINGERPRINTS2(class_name, function_name, dest, type, fp)         \
   CHECK_FINGERPRINTS(class_name, function_name, dest, fp)
 
   all_libs.Add(&Library::ZoneHandle(Library::CoreLibrary()));
@@ -11554,8 +11347,7 @@
 #undef CHECK_FINGERPRINTS2
 
 
-
-Class& cls = Class::Handle();
+  Class& cls = Class::Handle();
 
 #define CHECK_FACTORY_FINGERPRINTS(factory_symbol, cid, fp)                    \
   cls = Isolate::Current()->class_table()->At(cid);                            \
@@ -11563,10 +11355,10 @@
   if (func.IsNull()) {                                                         \
     has_errors = true;                                                         \
     OS::Print("Function not found %s.%s\n", cls.ToCString(),                   \
-        Symbols::factory_symbol().ToCString());                                \
+              Symbols::factory_symbol().ToCString());                          \
   } else {                                                                     \
     CHECK_FINGERPRINT2(func, factory_symbol, cid, fp);                         \
-  }                                                                            \
+  }
 
   RECOGNIZED_LIST_FACTORY_LIST(CHECK_FACTORY_FINGERPRINTS);
 
@@ -11589,12 +11381,12 @@
   Instructions& result = Instructions::Handle();
   {
     uword aligned_size = Instructions::InstanceSize(size);
-    RawObject* raw = Object::Allocate(Instructions::kClassId,
-                                      aligned_size,
-                                      Heap::kCode);
+    RawObject* raw =
+        Object::Allocate(Instructions::kClassId, aligned_size, Heap::kCode);
     NoSafepointScope no_safepoint;
     result ^= raw;
-    result.set_size(has_single_entry_point ? size : -size);
+    result.SetSize(size);
+    result.SetHasSingleEntryPoint(has_single_entry_point);
   }
   return result.raw();
 }
@@ -11606,8 +11398,7 @@
 
 
 // Encode integer |value| in SLEB128 format and store into |data|.
-static void EncodeSLEB128(GrowableArray<uint8_t>* data,
-                          intptr_t value) {
+static void EncodeSLEB128(GrowableArray<uint8_t>* data, intptr_t value) {
   bool is_last_part = false;
   while (!is_last_part) {
     uint8_t part = value & 0x7f;
@@ -11668,9 +11459,7 @@
   ObjectPool& result = ObjectPool::Handle();
   {
     uword size = ObjectPool::InstanceSize(len);
-    RawObject* raw = Object::Allocate(ObjectPool::kClassId,
-                                      size,
-                                      Heap::kOld);
+    RawObject* raw = Object::Allocate(ObjectPool::kClassId, size, Heap::kOld);
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.SetLength(len);
@@ -11709,9 +11498,8 @@
     THR_Print("  %" Pd " PP+0x%" Px ": ", i, offset);
     if (InfoAt(i) == kTaggedObject) {
       RawObject* obj = ObjectAt(i);
-      THR_Print("0x%" Px " %s (obj)\n",
-          reinterpret_cast<uword>(obj),
-          Object::Handle(obj).ToCString());
+      THR_Print("0x%" Px " %s (obj)\n", reinterpret_cast<uword>(obj),
+                Object::Handle(obj).ToCString());
     } else if (InfoAt(i) == kNativeEntry) {
       THR_Print("0x%" Px " (native entry)\n", RawValueAt(i));
     } else {
@@ -11747,9 +11535,8 @@
   PcDescriptors& result = PcDescriptors::Handle(thread->zone());
   {
     uword size = PcDescriptors::InstanceSize(data->length());
-    RawObject* raw = Object::Allocate(PcDescriptors::kClassId,
-                                      size,
-                                      Heap::kOld);
+    RawObject* raw =
+        Object::Allocate(PcDescriptors::kClassId, size, Heap::kOld);
     INC_STAT(thread, total_code_size, size);
     INC_STAT(thread, pc_desc_size, size);
     NoSafepointScope no_safepoint;
@@ -11767,9 +11554,8 @@
   PcDescriptors& result = PcDescriptors::Handle(thread->zone());
   {
     uword size = PcDescriptors::InstanceSize(length);
-    RawObject* raw = Object::Allocate(PcDescriptors::kClassId,
-                                      size,
-                                      Heap::kOld);
+    RawObject* raw =
+        Object::Allocate(PcDescriptors::kClassId, size, Heap::kOld);
     INC_STAT(thread, total_code_size, size);
     INC_STAT(thread, pc_desc_size, size);
     NoSafepointScope no_safepoint;
@@ -11782,13 +11568,21 @@
 
 const char* PcDescriptors::KindAsStr(RawPcDescriptors::Kind kind) {
   switch (kind) {
-    case RawPcDescriptors::kDeopt:           return "deopt        ";
-    case RawPcDescriptors::kIcCall:          return "ic-call      ";
-    case RawPcDescriptors::kUnoptStaticCall: return "unopt-call   ";
-    case RawPcDescriptors::kRuntimeCall:     return "runtime-call ";
-    case RawPcDescriptors::kOsrEntry:        return "osr-entry    ";
-    case RawPcDescriptors::kOther:           return "other        ";
-    case RawPcDescriptors::kAnyKind:         UNREACHABLE(); break;
+    case RawPcDescriptors::kDeopt:
+      return "deopt        ";
+    case RawPcDescriptors::kIcCall:
+      return "ic-call      ";
+    case RawPcDescriptors::kUnoptStaticCall:
+      return "unopt-call   ";
+    case RawPcDescriptors::kRuntimeCall:
+      return "runtime-call ";
+    case RawPcDescriptors::kOsrEntry:
+      return "osr-entry    ";
+    case RawPcDescriptors::kOther:
+      return "other        ";
+    case RawPcDescriptors::kAnyKind:
+      UNREACHABLE();
+      break;
   }
   UNREACHABLE();
   return "";
@@ -11800,14 +11594,13 @@
   const int addr_width = (kBitsPerWord / 4) + 2;
   // "*" in a printf format specifier tells it to read the field width from
   // the printf argument list.
-  THR_Print("%-*s\tkind    \tdeopt-id\ttok-ix\ttry-ix\n",
-            addr_width, "pc");
+  THR_Print("%-*s\tkind    \tdeopt-id\ttok-ix\ttry-ix\n", addr_width, "pc");
 }
 
 
 const char* PcDescriptors::ToCString() const {
-  // "*" in a printf format specifier tells it to read the field width from
-  // the printf argument list.
+// "*" in a printf format specifier tells it to read the field width from
+// the printf argument list.
 #define FORMAT "%#-*" Px "\t%s\t%" Pd "\t\t%s\t%" Pd "\n"
   if (Length() == 0) {
     return "empty PcDescriptors\n";
@@ -11819,12 +11612,9 @@
   {
     Iterator iter(*this, RawPcDescriptors::kAnyKind);
     while (iter.MoveNext()) {
-      len += OS::SNPrint(NULL, 0, FORMAT, addr_width,
-                         iter.PcOffset(),
-                         KindAsStr(iter.Kind()),
-                         iter.DeoptId(),
-                         iter.TokenPos().ToCString(),
-                         iter.TryIndex());
+      len += OS::SNPrint(NULL, 0, FORMAT, addr_width, iter.PcOffset(),
+                         KindAsStr(iter.Kind()), iter.DeoptId(),
+                         iter.TokenPos().ToCString(), iter.TryIndex());
     }
   }
   // Allocate the buffer.
@@ -11833,12 +11623,10 @@
   intptr_t index = 0;
   Iterator iter(*this, RawPcDescriptors::kAnyKind);
   while (iter.MoveNext()) {
-    index += OS::SNPrint((buffer + index), (len - index), FORMAT, addr_width,
-                         iter.PcOffset(),
-                         KindAsStr(iter.Kind()),
-                         iter.DeoptId(),
-                         iter.TokenPos().ToCString(),
-                         iter.TryIndex());
+    index +=
+        OS::SNPrint((buffer + index), (len - index), FORMAT, addr_width,
+                    iter.PcOffset(), KindAsStr(iter.Kind()), iter.DeoptId(),
+                    iter.TokenPos().ToCString(), iter.TryIndex());
   }
   return buffer;
 #undef FORMAT
@@ -11866,8 +11654,8 @@
   }
 
   Zone* zone = Thread::Current()->zone();
-  BitVector* deopt_ids = new(zone) BitVector(zone, max_deopt_id + 1);
-  BitVector* iccall_ids = new(zone) BitVector(zone, max_deopt_id + 1);
+  BitVector* deopt_ids = new (zone) BitVector(zone, max_deopt_id + 1);
+  BitVector* iccall_ids = new (zone) BitVector(zone, max_deopt_id + 1);
   Iterator iter(*this, RawPcDescriptors::kDeopt | RawPcDescriptors::kIcCall);
   while (iter.MoveNext()) {
     // 'deopt_id' is set for kDeopt and kIcCall and must be unique for one kind.
@@ -11889,8 +11677,7 @@
 }
 
 
-TokenPosition CodeSourceMap::TokenPositionForPCOffset(
-    uword pc_offset) const {
+TokenPosition CodeSourceMap::TokenPositionForPCOffset(uword pc_offset) const {
   Iterator iterator(*this);
 
   TokenPosition result = TokenPosition::kNoSource;
@@ -11953,19 +11740,14 @@
     current_script ^=
         code_source_map.ScriptForPCOffset(code, function, pc_offset);
     if (current_function.IsNull() || current_script.IsNull()) {
-      THR_Print("%#-*" Px "\t%s\t%s\n", addr_width,
-                pc_offset,
-                tp.ToCString(),
+      THR_Print("%#-*" Px "\t%s\t%s\n", addr_width, pc_offset, tp.ToCString(),
                 code_name);
       continue;
     }
     const String& uri = String::Handle(current_script.url());
     ASSERT(!uri.IsNull());
-    THR_Print("%#-*" Px "\t%s\t%s\t%s\n", addr_width,
-              pc_offset,
-              tp.ToCString(),
-              current_function.ToQualifiedCString(),
-              uri.ToCString());
+    THR_Print("%#-*" Px "\t%s\t%s\t%s\n", addr_width, pc_offset, tp.ToCString(),
+              current_function.ToQualifiedCString(), uri.ToCString());
   }
 }
 
@@ -11995,9 +11777,8 @@
   CodeSourceMap& result = CodeSourceMap::Handle(thread->zone());
   {
     uword size = CodeSourceMap::InstanceSize(data->length());
-    RawObject* raw = Object::Allocate(CodeSourceMap::kClassId,
-                                      size,
-                                      Heap::kOld);
+    RawObject* raw =
+        Object::Allocate(CodeSourceMap::kClassId, size, Heap::kOld);
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.SetLength(data->length());
@@ -12013,9 +11794,8 @@
   CodeSourceMap& result = CodeSourceMap::Handle(thread->zone());
   {
     uword size = CodeSourceMap::InstanceSize(length);
-    RawObject* raw = Object::Allocate(CodeSourceMap::kClassId,
-                                      size,
-                                      Heap::kOld);
+    RawObject* raw =
+        Object::Allocate(CodeSourceMap::kClassId, size, Heap::kOld);
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.SetLength(length);
@@ -12025,8 +11805,8 @@
 
 
 const char* CodeSourceMap::ToCString() const {
-  // "*" in a printf format specifier tells it to read the field width from
-  // the printf argument list.
+// "*" in a printf format specifier tells it to read the field width from
+// the printf argument list.
 #define FORMAT "%#-*" Px "\t%s\n"
   if (Length() == 0) {
     return "empty CodeSourceMap\n";
@@ -12038,8 +11818,7 @@
   {
     Iterator iter(*this);
     while (iter.MoveNext()) {
-      len += OS::SNPrint(NULL, 0, FORMAT, addr_width,
-                         iter.PcOffset(),
+      len += OS::SNPrint(NULL, 0, FORMAT, addr_width, iter.PcOffset(),
                          iter.TokenPos().ToCString());
     }
   }
@@ -12050,8 +11829,7 @@
   Iterator iter(*this);
   while (iter.MoveNext()) {
     index += OS::SNPrint((buffer + index), (len - index), FORMAT, addr_width,
-                         iter.PcOffset(),
-                         iter.TokenPos().ToCString());
+                         iter.PcOffset(), iter.TokenPos().ToCString());
   }
   return buffer;
 #undef FORMAT
@@ -12106,20 +11884,16 @@
   Stackmap& result = Stackmap::Handle();
   // Guard against integer overflow of the instance size computation.
   intptr_t length = bmap->Length();
-  intptr_t payload_size =
-      Utils::RoundUp(length, kBitsPerByte) / kBitsPerByte;
-  if ((payload_size < 0) ||
-      (payload_size > kMaxLengthInBytes)) {
+  intptr_t payload_size = Utils::RoundUp(length, kBitsPerByte) / kBitsPerByte;
+  if ((payload_size < 0) || (payload_size > kMaxLengthInBytes)) {
     // This should be caught before we reach here.
-    FATAL1("Fatal error in Stackmap::New: invalid length %" Pd "\n",
-           length);
+    FATAL1("Fatal error in Stackmap::New: invalid length %" Pd "\n", length);
   }
   {
     // Stackmap data objects are associated with a code object, allocate them
     // in old generation.
-    RawObject* raw = Object::Allocate(Stackmap::kClassId,
-                                      Stackmap::InstanceSize(length),
-                                      Heap::kOld);
+    RawObject* raw = Object::Allocate(
+        Stackmap::kClassId, Stackmap::InstanceSize(length), Heap::kOld);
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.SetLength(length);
@@ -12143,20 +11917,16 @@
   ASSERT(Object::stackmap_class() != Class::null());
   Stackmap& result = Stackmap::Handle();
   // Guard against integer overflow of the instance size computation.
-  intptr_t payload_size =
-  Utils::RoundUp(length, kBitsPerByte) / kBitsPerByte;
-  if ((payload_size < 0) ||
-      (payload_size > kMaxLengthInBytes)) {
+  intptr_t payload_size = Utils::RoundUp(length, kBitsPerByte) / kBitsPerByte;
+  if ((payload_size < 0) || (payload_size > kMaxLengthInBytes)) {
     // This should be caught before we reach here.
-    FATAL1("Fatal error in Stackmap::New: invalid length %" Pd "\n",
-           length);
+    FATAL1("Fatal error in Stackmap::New: invalid length %" Pd "\n", length);
   }
   {
     // Stackmap data objects are associated with a code object, allocate them
     // in old generation.
-    RawObject* raw = Object::Allocate(Stackmap::kClassId,
-                                      Stackmap::InstanceSize(length),
-                                      Heap::kOld);
+    RawObject* raw = Object::Allocate(
+        Stackmap::kClassId, Stackmap::InstanceSize(length), Heap::kOld);
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.SetLength(length);
@@ -12222,44 +11992,36 @@
 }
 
 
-static int PrintVarInfo(char* buffer, int len,
+static int PrintVarInfo(char* buffer,
+                        int len,
                         intptr_t i,
                         const String& var_name,
                         const RawLocalVarDescriptors::VarInfo& info) {
   const RawLocalVarDescriptors::VarInfoKind kind = info.kind();
   const int32_t index = info.index();
   if (kind == RawLocalVarDescriptors::kContextLevel) {
-    return OS::SNPrint(buffer, len,
-                       "%2" Pd " %-13s level=%-3d scope=%-3d"
-                       " begin=%-3d end=%d\n",
-                       i,
-                       LocalVarDescriptors::KindToCString(kind),
-                       index,
-                       info.scope_id,
-                       static_cast<int>(info.begin_pos.Pos()),
+    return OS::SNPrint(buffer, len, "%2" Pd
+                                    " %-13s level=%-3d scope=%-3d"
+                                    " begin=%-3d end=%d\n",
+                       i, LocalVarDescriptors::KindToCString(kind), index,
+                       info.scope_id, static_cast<int>(info.begin_pos.Pos()),
                        static_cast<int>(info.end_pos.Pos()));
   } else if (kind == RawLocalVarDescriptors::kContextVar) {
-    return OS::SNPrint(buffer, len,
-                       "%2" Pd " %-13s level=%-3d index=%-3d"
-                       " begin=%-3d end=%-3d name=%s\n",
-                       i,
-                       LocalVarDescriptors::KindToCString(kind),
-                       info.scope_id,
-                       index,
-                       static_cast<int>(info.begin_pos.Pos()),
-                       static_cast<int>(info.end_pos.Pos()),
-                       var_name.ToCString());
+    return OS::SNPrint(
+        buffer, len, "%2" Pd
+                     " %-13s level=%-3d index=%-3d"
+                     " begin=%-3d end=%-3d name=%s\n",
+        i, LocalVarDescriptors::KindToCString(kind), info.scope_id, index,
+        static_cast<int>(info.begin_pos.Pos()),
+        static_cast<int>(info.end_pos.Pos()), var_name.ToCString());
   } else {
-    return OS::SNPrint(buffer, len,
-                       "%2" Pd " %-13s scope=%-3d index=%-3d"
-                       " begin=%-3d end=%-3d name=%s\n",
-                       i,
-                       LocalVarDescriptors::KindToCString(kind),
-                       info.scope_id,
-                       index,
-                       static_cast<int>(info.begin_pos.Pos()),
-                       static_cast<int>(info.end_pos.Pos()),
-                       var_name.ToCString());
+    return OS::SNPrint(
+        buffer, len, "%2" Pd
+                     " %-13s scope=%-3d index=%-3d"
+                     " begin=%-3d end=%-3d name=%s\n",
+        i, LocalVarDescriptors::KindToCString(kind), info.scope_id, index,
+        static_cast<int>(info.begin_pos.Pos()),
+        static_cast<int>(info.end_pos.Pos()), var_name.ToCString());
   }
 }
 
@@ -12286,9 +12048,8 @@
     RawLocalVarDescriptors::VarInfo info;
     var_name = GetName(i);
     GetInfo(i, &info);
-    num_chars += PrintVarInfo((buffer + num_chars),
-                              (len - num_chars),
-                              i, var_name, info);
+    num_chars += PrintVarInfo((buffer + num_chars), (len - num_chars), i,
+                              var_name, info);
   }
   return buffer;
 }
@@ -12315,16 +12076,16 @@
   ASSERT(Object::var_descriptors_class() != Class::null());
   if (num_variables < 0 || num_variables > kMaxElements) {
     // This should be caught before we reach here.
-    FATAL2("Fatal error in LocalVarDescriptors::New: "
-           "invalid num_variables %" Pd ". Maximum is: %d\n",
-           num_variables, RawLocalVarDescriptors::kMaxIndex);
+    FATAL2(
+        "Fatal error in LocalVarDescriptors::New: "
+        "invalid num_variables %" Pd ". Maximum is: %d\n",
+        num_variables, RawLocalVarDescriptors::kMaxIndex);
   }
   LocalVarDescriptors& result = LocalVarDescriptors::Handle();
   {
     uword size = LocalVarDescriptors::InstanceSize(num_variables);
-    RawObject* raw = Object::Allocate(LocalVarDescriptors::kClassId,
-                                      size,
-                                      Heap::kOld);
+    RawObject* raw =
+        Object::Allocate(LocalVarDescriptors::kClassId, size, Heap::kOld);
     INC_STAT(Thread::Current(), total_code_size, size);
     INC_STAT(Thread::Current(), vardesc_size, size);
     NoSafepointScope no_safepoint;
@@ -12423,23 +12184,23 @@
 RawExceptionHandlers* ExceptionHandlers::New(intptr_t num_handlers) {
   ASSERT(Object::exception_handlers_class() != Class::null());
   if ((num_handlers < 0) || (num_handlers >= kMaxHandlers)) {
-    FATAL1("Fatal error in ExceptionHandlers::New(): "
-           "invalid num_handlers %" Pd "\n",
-           num_handlers);
+    FATAL1(
+        "Fatal error in ExceptionHandlers::New(): "
+        "invalid num_handlers %" Pd "\n",
+        num_handlers);
   }
   ExceptionHandlers& result = ExceptionHandlers::Handle();
   {
     uword size = ExceptionHandlers::InstanceSize(num_handlers);
-    RawObject* raw = Object::Allocate(ExceptionHandlers::kClassId,
-                                      size,
-                                      Heap::kOld);
+    RawObject* raw =
+        Object::Allocate(ExceptionHandlers::kClassId, size, Heap::kOld);
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.StoreNonPointer(&result.raw_ptr()->num_entries_, num_handlers);
   }
-  const Array& handled_types_data = (num_handlers == 0) ?
-      Object::empty_array() :
-      Array::Handle(Array::New(num_handlers, Heap::kOld));
+  const Array& handled_types_data =
+      (num_handlers == 0) ? Object::empty_array()
+                          : Array::Handle(Array::New(num_handlers, Heap::kOld));
   result.set_handled_types_data(handled_types_data);
   return result.raw();
 }
@@ -12449,16 +12210,16 @@
   ASSERT(Object::exception_handlers_class() != Class::null());
   const intptr_t num_handlers = handled_types_data.Length();
   if ((num_handlers < 0) || (num_handlers >= kMaxHandlers)) {
-    FATAL1("Fatal error in ExceptionHandlers::New(): "
-           "invalid num_handlers %" Pd "\n",
-           num_handlers);
+    FATAL1(
+        "Fatal error in ExceptionHandlers::New(): "
+        "invalid num_handlers %" Pd "\n",
+        num_handlers);
   }
   ExceptionHandlers& result = ExceptionHandlers::Handle();
   {
     uword size = ExceptionHandlers::InstanceSize(num_handlers);
-    RawObject* raw = Object::Allocate(ExceptionHandlers::kClassId,
-                                      size,
-                                      Heap::kOld);
+    RawObject* raw =
+        Object::Allocate(ExceptionHandlers::kClassId, size, Heap::kOld);
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.StoreNonPointer(&result.raw_ptr()->num_entries_, num_handlers);
@@ -12484,10 +12245,7 @@
     handled_types = GetHandledTypes(i);
     const intptr_t num_types =
         handled_types.IsNull() ? 0 : handled_types.Length();
-    len += OS::SNPrint(NULL, 0, FORMAT1,
-                       i,
-                       info.handler_pc_offset,
-                       num_types,
+    len += OS::SNPrint(NULL, 0, FORMAT1, i, info.handler_pc_offset, num_types,
                        info.outer_try_index);
     for (int k = 0; k < num_types; k++) {
       type ^= handled_types.At(k);
@@ -12504,18 +12262,13 @@
     handled_types = GetHandledTypes(i);
     const intptr_t num_types =
         handled_types.IsNull() ? 0 : handled_types.Length();
-    num_chars += OS::SNPrint((buffer + num_chars),
-                             (len - num_chars),
-                             FORMAT1,
-                             i,
-                             info.handler_pc_offset,
-                             num_types,
-                             info.outer_try_index);
+    num_chars +=
+        OS::SNPrint((buffer + num_chars), (len - num_chars), FORMAT1, i,
+                    info.handler_pc_offset, num_types, info.outer_try_index);
     for (int k = 0; k < num_types; k++) {
       type ^= handled_types.At(k);
-      num_chars += OS::SNPrint((buffer + num_chars),
-                               (len - num_chars),
-                               FORMAT2, k, type.ToCString());
+      num_chars += OS::SNPrint((buffer + num_chars), (len - num_chars), FORMAT2,
+                               k, type.ToCString());
     }
   }
   return buffer;
@@ -12562,13 +12315,12 @@
     TypedData& suffix = TypedData::Handle();
     Smi& offset = Smi::Handle();
     Smi& reason_and_flags = Smi::Handle();
-    DeoptTable::GetEntry(
-      table, info_number, &offset, &suffix, &reason_and_flags);
+    DeoptTable::GetEntry(table, info_number, &offset, &suffix,
+                         &reason_and_flags);
     UnpackInto(table, suffix, unpacked, suffix_length);
   }
 
-  while ((read_stream.PendingBytes() > 0) &&
-         (unpacked->length() < length)) {
+  while ((read_stream.PendingBytes() > 0) && (unpacked->length() < length)) {
     const intptr_t instruction = Reader::Read(&read_stream);
     const intptr_t from_index = Reader::Read(&read_stream);
     unpacked->Add(DeoptInstr::Create(instruction, from_index));
@@ -12607,9 +12359,7 @@
   // Layout the fields in the buffer.
   intptr_t index = 0;
   for (intptr_t i = 0; i < deopt_instrs.length(); i++) {
-    index += OS::SNPrint((buffer + index),
-                         (len - index),
-                         FORMAT,
+    index += OS::SNPrint((buffer + index), (len - index), FORMAT,
                          deopt_instrs[i]->ToCString());
   }
 
@@ -12646,9 +12396,9 @@
   SingleTargetCache& result = SingleTargetCache::Handle();
   {
     // IC data objects are long living objects, allocate them in old generation.
-    RawObject* raw = Object::Allocate(SingleTargetCache::kClassId,
-                                      SingleTargetCache::InstanceSize(),
-                                      Heap::kOld);
+    RawObject* raw =
+        Object::Allocate(SingleTargetCache::kClassId,
+                         SingleTargetCache::InstanceSize(), Heap::kOld);
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -12677,8 +12427,7 @@
 
 RawUnlinkedCall* UnlinkedCall::New() {
   RawObject* raw = Object::Allocate(UnlinkedCall::kClassId,
-                                    UnlinkedCall::InstanceSize(),
-                                    Heap::kOld);
+                                    UnlinkedCall::InstanceSize(), Heap::kOld);
   return reinterpret_cast<RawUnlinkedCall*>(raw);
 }
 
@@ -12694,8 +12443,8 @@
   const intptr_t num_args = NumArgsTested();
   const intptr_t num_checks = NumberOfChecks();
   return OS::SCreate(Thread::Current()->zone(),
-      "ICData target:'%s' num-args: %" Pd " num-checks: %" Pd "",
-      name.ToCString(), num_args, num_checks);
+                     "ICData target:'%s' num-args: %" Pd " num-checks: %" Pd "",
+                     name.ToCString(), num_args, num_checks);
 }
 
 
@@ -12951,8 +12700,8 @@
   GrowableArray<intptr_t> class_ids(2);
   Function& target = Function::Handle();
   GetCheckAt(0, &class_ids, &target);
-  if ((target.raw() == smi_op_target.raw()) &&
-      (class_ids[0] == kSmiCid) && (class_ids[1] == kSmiCid)) {
+  if ((target.raw() == smi_op_target.raw()) && (class_ids[0] == kSmiCid) &&
+      (class_ids[1] == kSmiCid)) {
     // The smi fast path case, preserve the initial entry but reset the count.
     ClearCountAt(0);
     return;
@@ -13027,8 +12776,8 @@
     GrowableArray<intptr_t> class_ids(2);
     Function& target = Function::Handle();
     GetCheckAt(0, &class_ids, &target);
-    if ((target.raw() == smi_op_target.raw()) &&
-        (class_ids[0] == kSmiCid) && (class_ids[1] == kSmiCid)) {
+    if ((target.raw() == smi_op_target.raw()) && (class_ids[0] == kSmiCid) &&
+        (class_ids[1] == kSmiCid)) {
       is_smi_two_args_op = true;
     }
   }
@@ -13341,8 +13090,8 @@
   ASSERT(value <= Smi::kMaxValue);
 
   const Array& data = Array::Handle(ic_data());
-  const intptr_t data_pos = index * TestEntryLength() +
-      CountIndexFor(NumArgsTested());
+  const intptr_t data_pos =
+      index * TestEntryLength() + CountIndexFor(NumArgsTested());
   data.SetAt(data_pos, Smi::Handle(Smi::New(value)));
 }
 
@@ -13350,8 +13099,8 @@
 intptr_t ICData::GetCountAt(intptr_t index) const {
   ASSERT(Isolate::Current()->compilation_allowed());
   const Array& data = Array::Handle(ic_data());
-  const intptr_t data_pos = index * TestEntryLength() +
-      CountIndexFor(NumArgsTested());
+  const intptr_t data_pos =
+      index * TestEntryLength() + CountIndexFor(NumArgsTested());
   return Smi::Value(Smi::RawCast(data.At(data_pos)));
 }
 
@@ -13370,8 +13119,8 @@
 void ICData::SetCodeAt(intptr_t index, const Code& value) const {
   ASSERT(!Isolate::Current()->compilation_allowed());
   const Array& data = Array::Handle(ic_data());
-  const intptr_t data_pos = index * TestEntryLength() +
-      CodeIndexFor(NumArgsTested());
+  const intptr_t data_pos =
+      index * TestEntryLength() + CodeIndexFor(NumArgsTested());
   data.SetAt(data_pos, value);
 }
 
@@ -13379,8 +13128,8 @@
 void ICData::SetEntryPointAt(intptr_t index, const Smi& value) const {
   ASSERT(!Isolate::Current()->compilation_allowed());
   const Array& data = Array::Handle(ic_data());
-  const intptr_t data_pos = index * TestEntryLength() +
-      EntryPointIndexFor(NumArgsTested());
+  const intptr_t data_pos =
+      index * TestEntryLength() + EntryPointIndexFor(NumArgsTested());
   data.SetAt(data_pos, value);
 }
 
@@ -13396,8 +13145,8 @@
 }
 
 
-RawICData* ICData::AsUnaryClassChecksForCid(
-    intptr_t cid, const Function& target) const {
+RawICData* ICData::AsUnaryClassChecksForCid(intptr_t cid,
+                                            const Function& target) const {
   ASSERT(!IsNull());
   const intptr_t kNumArgsTested = 1;
   ICData& result = ICData::Handle(ICData::NewFrom(*this, kNumArgsTested));
@@ -13439,8 +13188,7 @@
       result.IncrementCountAt(duplicate_class_id, count);
     } else {
       // This will make sure that Smi is first if it exists.
-      result.AddReceiverCheck(class_id,
-                              Function::Handle(GetTargetAt(i)),
+      result.AddReceiverCheck(class_id, Function::Handle(GetTargetAt(i)),
                               count);
     }
   }
@@ -13494,8 +13242,8 @@
       }
     }
     if (!found) {
-      aggregate.Add(CidCount(class_id, count,
-                             &Function::ZoneHandle(GetTargetAt(i))));
+      aggregate.Add(
+          CidCount(class_id, count, &Function::ZoneHandle(GetTargetAt(i))));
     }
   }
   aggregate.Sort(CidCount::HighestCountFirst);
@@ -13503,8 +13251,7 @@
   ICData& result = ICData::Handle(ICData::NewFrom(*this, kNumArgsTested));
   ASSERT(result.NumberOfChecks() == 0);
   // Room for all entries and the sentinel.
-  const intptr_t data_len =
-      result.TestEntryLength() * (aggregate.length() + 1);
+  const intptr_t data_len = result.TestEntryLength() * (aggregate.length() + 1);
   // Allocate the array but do not assign it to result until we have populated
   // it with the aggregate data and the terminating sentinel.
   const Array& data = Array::Handle(Array::New(data_len, Heap::kOld));
@@ -13513,7 +13260,7 @@
     data.SetAt(pos + 0, Smi::Handle(Smi::New(aggregate[i].cid)));
     data.SetAt(pos + TargetIndexFor(1), *aggregate[i].function);
     data.SetAt(pos + CountIndexFor(1),
-        Smi::Handle(Smi::New(aggregate[i].count)));
+               Smi::Handle(Smi::New(aggregate[i].count)));
 
     pos += result.TestEntryLength();
   }
@@ -13643,7 +13390,6 @@
 }
 
 
-
 // Does not initialize ICData array.
 RawICData* ICData::NewDescriptor(Zone* zone,
                                  const Function& owner,
@@ -13660,9 +13406,8 @@
   ICData& result = ICData::Handle(zone);
   {
     // IC data objects are long living objects, allocate them in old generation.
-    RawObject* raw = Object::Allocate(ICData::kClassId,
-                                      ICData::InstanceSize(),
-                                      Heap::kOld);
+    RawObject* raw =
+        Object::Allocate(ICData::kClassId, ICData::InstanceSize(), Heap::kOld);
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -13690,9 +13435,8 @@
   ICData& result = ICData::Handle();
   {
     // IC data objects are long living objects, allocate them in old generation.
-    RawObject* raw = Object::Allocate(ICData::kClassId,
-                                      ICData::InstanceSize(),
-                                      Heap::kOld);
+    RawObject* raw =
+        Object::Allocate(ICData::kClassId, ICData::InstanceSize(), Heap::kOld);
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -13712,14 +13456,9 @@
                        intptr_t num_args_tested,
                        bool is_static_call) {
   Zone* zone = Thread::Current()->zone();
-  const ICData& result = ICData::Handle(zone,
-                                        NewDescriptor(zone,
-                                                      owner,
-                                                      target_name,
-                                                      arguments_descriptor,
-                                                      deopt_id,
-                                                      num_args_tested,
-                                                      is_static_call));
+  const ICData& result = ICData::Handle(
+      zone, NewDescriptor(zone, owner, target_name, arguments_descriptor,
+                          deopt_id, num_args_tested, is_static_call));
   result.set_ic_data_array(
       Array::Handle(zone, CachedEmptyICDataArray(num_args_tested)));
   return result.raw();
@@ -13728,12 +13467,9 @@
 
 RawICData* ICData::NewFrom(const ICData& from, intptr_t num_args_tested) {
   const ICData& result = ICData::Handle(ICData::New(
-      Function::Handle(from.Owner()),
-      String::Handle(from.target_name()),
-      Array::Handle(from.arguments_descriptor()),
-      from.deopt_id(),
-      num_args_tested,
-      from.is_static_call()));
+      Function::Handle(from.Owner()), String::Handle(from.target_name()),
+      Array::Handle(from.arguments_descriptor()), from.deopt_id(),
+      num_args_tested, from.is_static_call()));
   // Copy deoptimization reasons.
   result.SetDeoptReasons(from.DeoptReasons());
   return result.raw();
@@ -13743,18 +13479,14 @@
 RawICData* ICData::Clone(const ICData& from) {
   Zone* zone = Thread::Current()->zone();
   const ICData& result = ICData::Handle(ICData::NewDescriptor(
-      zone,
-      Function::Handle(zone, from.Owner()),
+      zone, Function::Handle(zone, from.Owner()),
       String::Handle(zone, from.target_name()),
-      Array::Handle(zone, from.arguments_descriptor()),
-      from.deopt_id(),
-      from.NumArgsTested(),
-      from.is_static_call()));
+      Array::Handle(zone, from.arguments_descriptor()), from.deopt_id(),
+      from.NumArgsTested(), from.is_static_call()));
   // Clone entry array.
   const Array& from_array = Array::Handle(zone, from.ic_data());
   const intptr_t len = from_array.Length();
-  const Array& cloned_array =
-      Array::Handle(zone, Array::New(len, Heap::kOld));
+  const Array& cloned_array = Array::Handle(zone, Array::New(len, Heap::kOld));
   Object& obj = Object::Handle(zone);
   for (intptr_t i = 0; i < len; i++) {
     obj = from_array.At(i);
@@ -13794,12 +13526,12 @@
 
 
 intptr_t Code::Comments::PCOffsetAt(intptr_t idx) const {
-  return Smi::Value(Smi::RawCast(
-      comments_.At(idx * kNumberOfEntries + kPCOffsetEntry)));
+  return Smi::Value(
+      Smi::RawCast(comments_.At(idx * kNumberOfEntries + kPCOffsetEntry)));
 }
 
 
-void Code::Comments::SetPCOffsetAt(intptr_t idx, intptr_t pc)  {
+void Code::Comments::SetPCOffsetAt(intptr_t idx, intptr_t pc) {
   comments_.SetAt(idx * kNumberOfEntries + kPCOffsetEntry,
                   Smi::Handle(Smi::New(pc)));
 }
@@ -13815,9 +13547,7 @@
 }
 
 
-Code::Comments::Comments(const Array& comments)
-    : comments_(comments) {
-}
+Code::Comments::Comments(const Array& comments) : comments_(comments) {}
 
 
 RawLocalVarDescriptors* Code::GetLocalVarDescriptors() const {
@@ -13853,8 +13583,7 @@
 void Code::set_stackmaps(const Array& maps) const {
   ASSERT(maps.IsOld());
   StorePointer(&raw_ptr()->stackmaps_, maps.raw());
-  INC_STAT(Thread::Current(),
-           total_code_size,
+  INC_STAT(Thread::Current(), total_code_size,
            maps.IsNull() ? 0 : maps.Length() * sizeof(uword));
 }
 
@@ -13880,9 +13609,8 @@
   // FlowGraphCompiler::AddStaticCallTarget adds pc-offsets to the table while
   // emitting assembly. This guarantees that every succeeding pc-offset is
   // larger than the previously added one.
-  for (intptr_t i = kSCallTableEntryLength;
-      i < value.Length();
-      i += kSCallTableEntryLength) {
+  for (intptr_t i = kSCallTableEntryLength; i < value.Length();
+       i += kSCallTableEntryLength) {
     ASSERT(value.At(i - kSCallTableEntryLength) < value.At(i));
   }
 #endif  // DEBUG
@@ -13971,8 +13699,7 @@
   if (i < 0) {
     return Function::null();
   }
-  const Array& array =
-      Array::Handle(raw_ptr()->static_calls_target_table_);
+  const Array& array = Array::Handle(raw_ptr()->static_calls_target_table_);
   Function& function = Function::Handle();
   function ^= array.At(i + kSCallTableFunctionEntry);
   return function.raw();
@@ -13989,8 +13716,7 @@
   if (i < 0) {
     return Code::null();
   }
-  const Array& array =
-      Array::Handle(raw_ptr()->static_calls_target_table_);
+  const Array& array = Array::Handle(raw_ptr()->static_calls_target_table_);
   Code& code = Code::Handle();
   code ^= array.At(i + kSCallTableCodeEntry);
   return code.raw();
@@ -14004,8 +13730,7 @@
 #else
   const intptr_t i = BinarySearchInSCallTable(pc);
   ASSERT(i >= 0);
-  const Array& array =
-      Array::Handle(raw_ptr()->static_calls_target_table_);
+  const Array& array = Array::Handle(raw_ptr()->static_calls_target_table_);
   ASSERT(code.IsNull() ||
          (code.function() == array.At(i + kSCallTableFunctionEntry)));
   array.SetAt(i + kSCallTableCodeEntry, code);
@@ -14019,8 +13744,7 @@
 #else
   const intptr_t i = BinarySearchInSCallTable(pc);
   ASSERT(i >= 0);
-  const Array& array =
-      Array::Handle(raw_ptr()->static_calls_target_table_);
+  const Array& array = Array::Handle(raw_ptr()->static_calls_target_table_);
 #if defined(DEBUG)
   if (array.At(i + kSCallTableFunctionEntry) == Function::null()) {
     ASSERT(!code.IsNull() && Object::Handle(code.owner()).IsClass());
@@ -14042,15 +13766,15 @@
   const Instructions& instr = Instructions::Handle(instructions());
   uword start = instr.PayloadStart();
   if (formatter == NULL) {
-    Disassembler::Disassemble(start, start + instr.size(), *this);
+    Disassembler::Disassemble(start, start + instr.Size(), *this);
   } else {
-    Disassembler::Disassemble(start, start + instr.size(), formatter, *this);
+    Disassembler::Disassemble(start, start + instr.Size(), formatter, *this);
   }
 #endif
 }
 
 
-const Code::Comments& Code::comments() const  {
+const Code::Comments& Code::comments() const {
 #if defined(DART_PRECOMPILED_RUNTIME)
   Comments* comments = new Code::Comments(Array::Handle());
 #else
@@ -14076,7 +13800,7 @@
 #else
   ASSERT(offset >= 0);
   StoreSmi(
-      reinterpret_cast<RawSmi* const *>(&raw_ptr()->return_address_metadata_),
+      reinterpret_cast<RawSmi* const*>(&raw_ptr()->return_address_metadata_),
       Smi::New(offset));
 #endif
 }
@@ -14265,25 +13989,22 @@
 #ifdef TARGET_ARCH_IA32
   assembler->set_code_object(code);
 #endif
-  Instructions& instrs = Instructions::ZoneHandle(
-      Instructions::New(assembler->CodeSize(),
-                        assembler->has_single_entry_point()));
+  Instructions& instrs = Instructions::ZoneHandle(Instructions::New(
+      assembler->CodeSize(), assembler->has_single_entry_point()));
   INC_STAT(Thread::Current(), total_instr_size, assembler->CodeSize());
   INC_STAT(Thread::Current(), total_code_size, assembler->CodeSize());
 
   // Copy the instructions into the instruction area and apply all fixups.
   // Embedded pointers are still in handles at this point.
   MemoryRegion region(reinterpret_cast<void*>(instrs.PayloadStart()),
-                      instrs.size());
+                      instrs.Size());
   assembler->FinalizeInstructions(region);
-  CPU::FlushICache(instrs.PayloadStart(), instrs.size());
+  CPU::FlushICache(instrs.PayloadStart(), instrs.Size());
 
   code.set_compile_timestamp(OS::GetCurrentMonotonicMicros());
 #ifndef PRODUCT
-  CodeObservers::NotifyAll(name,
-                           instrs.PayloadStart(),
-                           assembler->prologue_offset(),
-                           instrs.size(),
+  CodeObservers::NotifyAll(name, instrs.PayloadStart(),
+                           assembler->prologue_offset(), instrs.Size(),
                            optimized);
 #endif
   {
@@ -14310,16 +14031,15 @@
     code.set_is_alive(true);
 
     // Set object pool in Instructions object.
-    INC_STAT(Thread::Current(),
-             total_code_size, object_pool.Length() * sizeof(uintptr_t));
+    INC_STAT(Thread::Current(), total_code_size,
+             object_pool.Length() * sizeof(uintptr_t));
     code.set_object_pool(object_pool.raw());
 
     if (FLAG_write_protect_code) {
       uword address = RawObject::ToAddr(instrs.raw());
-      bool status = VirtualMemory::Protect(
-          reinterpret_cast<void*>(address),
-          instrs.raw()->Size(),
-          VirtualMemory::kReadExecute);
+      bool status = VirtualMemory::Protect(reinterpret_cast<void*>(address),
+                                           instrs.raw()->Size(),
+                                           VirtualMemory::kReadExecute);
       ASSERT(status);
     }
   }
@@ -14331,8 +14051,8 @@
     // pushed onto the stack.
     code.SetPrologueOffset(assembler->CodeSize());
   }
-  INC_STAT(Thread::Current(),
-           total_code_size, code.comments().comments_.Length());
+  INC_STAT(Thread::Current(), total_code_size,
+           code.comments().comments_.Length());
   return code.raw();
 }
 
@@ -14340,12 +14060,11 @@
 RawCode* Code::FinalizeCode(const Function& function,
                             Assembler* assembler,
                             bool optimized) {
-  // Calling ToLibNamePrefixedQualifiedCString is very expensive,
-  // try to avoid it.
+// Calling ToLibNamePrefixedQualifiedCString is very expensive,
+// try to avoid it.
 #ifndef PRODUCT
   if (CodeObservers::AreActive()) {
-    return FinalizeCode(function.ToLibNamePrefixedQualifiedCString(),
-                        assembler,
+    return FinalizeCode(function.ToLibNamePrefixedQualifiedCString(), assembler,
                         optimized);
   }
 #endif  // !PRODUCT
@@ -14462,8 +14181,8 @@
     Zone* zone = thread->zone();
     const char* name = StubCode::NameOfStub(UncheckedEntryPoint());
     ASSERT(name != NULL);
-    char* stub_name = OS::SCreate(zone,
-        "%s%s", Symbols::StubPrefix().ToCString(), name);
+    char* stub_name =
+        OS::SCreate(zone, "%s%s", Symbols::StubPrefix().ToCString(), name);
     return stub_name;
   } else if (obj.IsClass()) {
     // Allocation stub.
@@ -14472,8 +14191,9 @@
     const Class& cls = Class::Cast(obj);
     String& cls_name = String::Handle(zone, cls.ScrubbedName());
     ASSERT(!cls_name.IsNull());
-    char* stub_name = OS::SCreate(zone,
-        "%s%s", Symbols::AllocationStubFor().ToCString(), cls_name.ToCString());
+    char* stub_name =
+        OS::SCreate(zone, "%s%s", Symbols::AllocationStubFor().ToCString(),
+                    cls_name.ToCString());
     return stub_name;
   } else {
     ASSERT(obj.IsFunction());
@@ -14487,8 +14207,8 @@
 const char* Code::QualifiedName() const {
   const Object& obj = Object::Handle(owner());
   if (obj.IsFunction()) {
-    return String::Handle(
-        Function::Cast(obj).QualifiedScrubbedName()).ToCString();
+    return String::Handle(Function::Cast(obj).QualifiedScrubbedName())
+        .ToCString();
   }
   return Name();
 }
@@ -14553,8 +14273,9 @@
 }
 
 
-RawStackmap* Code::GetStackmap(
-    uint32_t pc_offset, Array* maps, Stackmap* map) const {
+RawStackmap* Code::GetStackmap(uint32_t pc_offset,
+                               Array* maps,
+                               Stackmap* map) const {
   // This code is used during iterating frames during a GC and hence it
   // should not in turn start a GC.
   NoSafepointScope no_safepoint;
@@ -14675,7 +14396,7 @@
       THR_Print("  %s <-", name);
     }
     if (inlined_functions[inlined_functions.length() - 1]->raw() !=
-           inliner.raw()) {
+        inliner.raw()) {
       THR_Print(" (ERROR, missing inliner)\n");
     } else {
       THR_Print("\n");
@@ -14718,9 +14439,8 @@
   }
   Context& result = Context::Handle();
   {
-    RawObject* raw = Object::Allocate(Context::kClassId,
-                                      Context::InstanceSize(num_variables),
-                                      space);
+    RawObject* raw = Object::Allocate(
+        Context::kClassId, Context::InstanceSize(num_variables), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.set_num_variables(num_variables);
@@ -14740,9 +14460,8 @@
                                num_variables());
   } else {
     const char* parent_str = parent_ctx.ToCString();
-    return zone->PrintToString(
-        "Context num_variables: %" Pd " parent:{ %s }",
-        num_variables(), parent_str);
+    return zone->PrintToString("Context num_variables: %" Pd " parent:{ %s }",
+                               num_variables(), parent_str);
   }
 }
 
@@ -14794,9 +14513,7 @@
   intptr_t size = ContextScope::InstanceSize(num_variables);
   ContextScope& result = ContextScope::Handle();
   {
-    RawObject* raw = Object::Allocate(ContextScope::kClassId,
-                                      size,
-                                      Heap::kOld);
+    RawObject* raw = Object::Allocate(ContextScope::kClassId, size, Heap::kOld);
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.set_num_variables(num_variables);
@@ -14871,8 +14588,8 @@
 }
 
 
-void ContextScope::SetTypeAt(
-    intptr_t scope_index, const AbstractType& type) const {
+void ContextScope::SetTypeAt(intptr_t scope_index,
+                             const AbstractType& type) const {
   StorePointer(&(VariableDescAddr(scope_index)->type), type.raw());
 }
 
@@ -14883,8 +14600,8 @@
 }
 
 
-void ContextScope::SetConstValueAt(
-    intptr_t scope_index, const Instance& value) const {
+void ContextScope::SetConstValueAt(intptr_t scope_index,
+                                   const Instance& value) const {
   ASSERT(IsConstAt(scope_index));
   StorePointer(&(VariableDescAddr(scope_index)->value), value.raw());
 }
@@ -14923,9 +14640,10 @@
     TokenPosition pos = TokenIndexAt(i);
     intptr_t idx = ContextIndexAt(i);
     intptr_t lvl = ContextLevelAt(i);
-    char* chars = OS::SCreate(Thread::Current()->zone(),
-        "%s\nvar %s  token-pos %s  ctx lvl %" Pd "  index %" Pd "",
-        prev_cstr, cname, pos.ToCString(), lvl, idx);
+    char* chars =
+        OS::SCreate(Thread::Current()->zone(),
+                    "%s\nvar %s  token-pos %s  ctx lvl %" Pd "  index %" Pd "",
+                    prev_cstr, cname, pos.ToCString(), lvl, idx);
     prev_cstr = chars;
   }
   return prev_cstr;
@@ -14977,9 +14695,10 @@
 
 RawMegamorphicCache* MegamorphicCache::New() {
   MegamorphicCache& result = MegamorphicCache::Handle();
-  { RawObject* raw = Object::Allocate(MegamorphicCache::kClassId,
-                                      MegamorphicCache::InstanceSize(),
-                                      Heap::kOld);
+  {
+    RawObject* raw =
+        Object::Allocate(MegamorphicCache::kClassId,
+                         MegamorphicCache::InstanceSize(), Heap::kOld);
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -14991,17 +14710,18 @@
 RawMegamorphicCache* MegamorphicCache::New(const String& target_name,
                                            const Array& arguments_descriptor) {
   MegamorphicCache& result = MegamorphicCache::Handle();
-  { RawObject* raw = Object::Allocate(MegamorphicCache::kClassId,
-                                      MegamorphicCache::InstanceSize(),
-                                      Heap::kOld);
+  {
+    RawObject* raw =
+        Object::Allocate(MegamorphicCache::kClassId,
+                         MegamorphicCache::InstanceSize(), Heap::kOld);
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
   const intptr_t capacity = kInitialCapacity;
-  const Array& buckets = Array::Handle(
-      Array::New(kEntryLength * capacity, Heap::kOld));
-  const Function& handler = Function::Handle(
-      MegamorphicCacheTable::miss_handler(Isolate::Current()));
+  const Array& buckets =
+      Array::Handle(Array::New(kEntryLength * capacity, Heap::kOld));
+  const Function& handler =
+      Function::Handle(MegamorphicCacheTable::miss_handler(Isolate::Current()));
   for (intptr_t i = 0; i < capacity; ++i) {
     SetEntry(buckets, i, smi_illegal_cid(), handler);
   }
@@ -15067,8 +14787,8 @@
 
 const char* MegamorphicCache::ToCString() const {
   const String& name = String::Handle(target_name());
-  return OS::SCreate(Thread::Current()->zone(),
-                     "MegamorphicCache(%s)", name.ToCString());
+  return OS::SCreate(Thread::Current()->zone(), "MegamorphicCache(%s)",
+                     name.ToCString());
 }
 
 
@@ -15078,9 +14798,9 @@
   {
     // SubtypeTestCache objects are long living objects, allocate them in the
     // old generation.
-    RawObject* raw = Object::Allocate(SubtypeTestCache::kClassId,
-                                      SubtypeTestCache::InstanceSize(),
-                                      Heap::kOld);
+    RawObject* raw =
+        Object::Allocate(SubtypeTestCache::kClassId,
+                         SubtypeTestCache::InstanceSize(), Heap::kOld);
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -15159,8 +14879,7 @@
 RawApiError* ApiError::New() {
   ASSERT(Object::api_error_class() != Class::null());
   RawObject* raw = Object::Allocate(ApiError::kClassId,
-                                    ApiError::InstanceSize(),
-                                    Heap::kOld);
+                                    ApiError::InstanceSize(), Heap::kOld);
   return reinterpret_cast<RawApiError*>(raw);
 }
 
@@ -15169,9 +14888,8 @@
   ASSERT(Object::api_error_class() != Class::null());
   ApiError& result = ApiError::Handle();
   {
-    RawObject* raw = Object::Allocate(ApiError::kClassId,
-                                      ApiError::InstanceSize(),
-                                      space);
+    RawObject* raw =
+        Object::Allocate(ApiError::kClassId, ApiError::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -15199,8 +14917,7 @@
 RawLanguageError* LanguageError::New() {
   ASSERT(Object::language_error_class() != Class::null());
   RawObject* raw = Object::Allocate(LanguageError::kClassId,
-                                    LanguageError::InstanceSize(),
-                                    Heap::kOld);
+                                    LanguageError::InstanceSize(), Heap::kOld);
   return reinterpret_cast<RawLanguageError*>(raw);
 }
 
@@ -15217,8 +14934,7 @@
   LanguageError& result = LanguageError::Handle();
   {
     RawObject* raw = Object::Allocate(LanguageError::kClassId,
-                                      LanguageError::InstanceSize(),
-                                      space);
+                                      LanguageError::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -15227,8 +14943,8 @@
   result.set_token_pos(token_pos);
   result.set_report_after_token(report_after_token);
   result.set_kind(kind);
-  result.set_message(String::Handle(
-      String::NewFormattedV(format, args, space)));
+  result.set_message(
+      String::Handle(String::NewFormattedV(format, args, space)));
   return result.raw();
 }
 
@@ -15239,12 +14955,13 @@
                                               bool report_after_token,
                                               Report::Kind kind,
                                               Heap::Space space,
-                                              const char* format, ...) {
+                                              const char* format,
+                                              ...) {
   va_list args;
   va_start(args, format);
   RawLanguageError* result = LanguageError::NewFormattedV(
-      prev_error, script, token_pos, report_after_token,
-      kind, space, format, args);
+      prev_error, script, token_pos, report_after_token, kind, space, format,
+      args);
   NoSafepointScope no_safepoint;
   va_end(args);
   return result;
@@ -15258,8 +14975,7 @@
   LanguageError& result = LanguageError::Handle();
   {
     RawObject* raw = Object::Allocate(LanguageError::kClassId,
-                                      LanguageError::InstanceSize(),
-                                      space);
+                                      LanguageError::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -15310,11 +15026,8 @@
     return formatted_message();
   }
   String& result = String::Handle(
-      Report::PrependSnippet(kind(),
-                             Script::Handle(script()),
-                             token_pos(),
-                             report_after_token(),
-                             String::Handle(message())));
+      Report::PrependSnippet(kind(), Script::Handle(script()), token_pos(),
+                             report_after_token(), String::Handle(message())));
   // Prepend previous error message.
   const Error& prev_error = Error::Handle(previous_error());
   if (!prev_error.IsNull()) {
@@ -15343,9 +15056,9 @@
   ASSERT(Object::unhandled_exception_class() != Class::null());
   UnhandledException& result = UnhandledException::Handle();
   {
-    RawObject* raw = Object::Allocate(UnhandledException::kClassId,
-                                      UnhandledException::InstanceSize(),
-                                      space);
+    RawObject* raw =
+        Object::Allocate(UnhandledException::kClassId,
+                         UnhandledException::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -15359,9 +15072,9 @@
   ASSERT(Object::unhandled_exception_class() != Class::null());
   UnhandledException& result = UnhandledException::Handle();
   {
-    RawObject* raw = Object::Allocate(UnhandledException::kClassId,
-                                      UnhandledException::InstanceSize(),
-                                      space);
+    RawObject* raw =
+        Object::Allocate(UnhandledException::kClassId,
+                         UnhandledException::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -15407,8 +15120,8 @@
   if (!strtmp.IsError()) {
     stack_str = strtmp.ToCString();
   }
-  return OS::SCreate(thread->zone(),
-      "Unhandled exception:\n%s\n%s", exc_str, stack_str);
+  return OS::SCreate(thread->zone(), "Unhandled exception:\n%s\n%s", exc_str,
+                     stack_str);
 }
 
 
@@ -15422,8 +15135,7 @@
   UnwindError& result = UnwindError::Handle();
   {
     RawObject* raw = Object::Allocate(UnwindError::kClassId,
-                                      UnwindError::InstanceSize(),
-                                      space);
+                                      UnwindError::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -15505,8 +15217,7 @@
     }
     uword this_addr = reinterpret_cast<uword>(this->raw_ptr());
     uword other_addr = reinterpret_cast<uword>(other.raw_ptr());
-    for (intptr_t offset = Instance::NextFieldOffset();
-         offset < instance_size;
+    for (intptr_t offset = Instance::NextFieldOffset(); offset < instance_size;
          offset += kWordSize) {
       if ((*reinterpret_cast<RawObject**>(this_addr + offset)) !=
           (*reinterpret_cast<RawObject**>(other_addr + offset))) {
@@ -15525,8 +15236,7 @@
   ASSERT(instance_size != 0);
   uword hash = instance_size;
   uword this_addr = reinterpret_cast<uword>(this->raw_ptr());
-  for (intptr_t offset = Instance::NextFieldOffset();
-       offset < instance_size;
+  for (intptr_t offset = Instance::NextFieldOffset(); offset < instance_size;
        offset += kWordSize) {
     uword value = reinterpret_cast<uword>(
         *reinterpret_cast<RawObject**>(this_addr + offset));
@@ -15567,8 +15277,7 @@
     Object& obj = Object::Handle(zone);
     const intptr_t instance_size = SizeFromClass();
     ASSERT(instance_size != 0);
-    for (intptr_t offset = Instance::NextFieldOffset();
-         offset < instance_size;
+    for (intptr_t offset = Instance::NextFieldOffset(); offset < instance_size;
          offset += kWordSize) {
       obj = *this->FieldAddrAtOffset(offset);
       if (obj.IsInstance() && !obj.IsSmi() && !obj.IsCanonical()) {
@@ -15662,8 +15371,8 @@
     const Class& scope_cls = Class::Handle(type.type_class());
     ASSERT(scope_cls.NumTypeArguments() > 0);
     TypeArguments& type_arguments = TypeArguments::Handle(GetTypeArguments());
-    type = Type::New(
-        scope_cls, type_arguments, TokenPosition::kNoSource, Heap::kNew);
+    type = Type::New(scope_cls, type_arguments, TokenPosition::kNoSource,
+                     Heap::kNew);
     type.set_signature(signature);
     type.SetIsFinalized();
     type ^= type.Canonicalize();
@@ -15719,8 +15428,7 @@
   Zone* zone = Thread::Current()->zone();
   const Class& cls = Class::Handle(zone, clazz());
   if (cls.IsClosureClass()) {
-    if (other.IsObjectType() ||
-        other.IsDartFunctionType() ||
+    if (other.IsObjectType() || other.IsDartFunctionType() ||
         other.IsDartClosureType()) {
       return true;
     }
@@ -15729,8 +15437,8 @@
     // Note that we may encounter a bound error in checked mode.
     if (!other.IsInstantiated()) {
       AbstractType& instantiated_other = AbstractType::Handle(
-          zone, other.InstantiateFrom(other_instantiator, bound_error,
-                                      NULL, NULL, Heap::kOld));
+          zone, other.InstantiateFrom(other_instantiator, bound_error, NULL,
+                                      NULL, Heap::kOld));
       if ((bound_error != NULL) && !bound_error->IsNull()) {
         ASSERT(Isolate::Current()->type_checks());
         return false;
@@ -15759,11 +15467,8 @@
         Function::Handle(zone, Closure::Cast(*this).function());
     const TypeArguments& type_arguments =
         TypeArguments::Handle(zone, GetTypeArguments());
-    return signature.IsSubtypeOf(type_arguments,
-                                 other_signature,
-                                 other_type_arguments,
-                                 bound_error,
-                                 Heap::kOld);
+    return signature.IsSubtypeOf(type_arguments, other_signature,
+                                 other_type_arguments, bound_error, Heap::kOld);
   }
   TypeArguments& type_arguments = TypeArguments::Handle(zone);
   if (cls.NumTypeArguments() > 0) {
@@ -15802,8 +15507,8 @@
   const bool other_is_dart_function = instantiated_other.IsDartFunctionType();
   if (other_is_dart_function || instantiated_other.IsFunctionType()) {
     // Check if this instance understands a call() method of a compatible type.
-    Function& call = Function::Handle(zone,
-        cls.LookupDynamicFunctionAllowAbstract(Symbols::Call()));
+    Function& call = Function::Handle(
+        zone, cls.LookupDynamicFunctionAllowAbstract(Symbols::Call()));
     if (call.IsNull()) {
       // Walk up the super_class chain.
       Class& super_cls = Class::Handle(zone, cls.SuperClass());
@@ -15816,13 +15521,10 @@
       if (other_is_dart_function) {
         return true;
       }
-      const Function& other_signature = Function::Handle(
-          zone, Type::Cast(instantiated_other).signature());
-      if (call.IsSubtypeOf(type_arguments,
-                           other_signature,
-                           other_type_arguments,
-                           bound_error,
-                           Heap::kOld)) {
+      const Function& other_signature =
+          Function::Handle(zone, Type::Cast(instantiated_other).signature());
+      if (call.IsSubtypeOf(type_arguments, other_signature,
+                           other_type_arguments, bound_error, Heap::kOld)) {
         return true;
       }
     }
@@ -16015,11 +15717,11 @@
     if (num_type_arguments > 0) {
       type_arguments = GetTypeArguments();
     }
-    const Type& type = Type::Handle(
-        Type::New(cls, type_arguments, TokenPosition::kNoSource));
+    const Type& type =
+        Type::Handle(Type::New(cls, type_arguments, TokenPosition::kNoSource));
     const String& type_name = String::Handle(type.UserVisibleName());
-    return OS::SCreate(Thread::Current()->zone(),
-        "Instance of '%s'", type_name.ToCString());
+    return OS::SCreate(Thread::Current()->zone(), "Instance of '%s'",
+                       type_name.ToCString());
   }
 }
 
@@ -16065,7 +15767,7 @@
 }
 
 
-RawTypeArguments* AbstractType::arguments() const  {
+RawTypeArguments* AbstractType::arguments() const {
   // AbstractType is an abstract class.
   UNREACHABLE();
   return NULL;
@@ -16184,8 +15886,8 @@
 }
 
 
-RawAbstractType* AbstractType::CloneUninstantiated(
-    const Class& new_owner, TrailPtr trail) const {
+RawAbstractType* AbstractType::CloneUninstantiated(const Class& new_owner,
+                                                   TrailPtr trail) const {
   // AbstractType is an abstract class.
   UNREACHABLE();
   return NULL;
@@ -16282,8 +15984,8 @@
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   if (IsBoundedType()) {
-    const AbstractType& type = AbstractType::Handle(zone,
-        BoundedType::Cast(*this).type());
+    const AbstractType& type =
+        AbstractType::Handle(zone, BoundedType::Cast(*this).type());
     if (name_visibility == kUserVisibleName) {
       return type.BuildName(kUserVisibleName);
     }
@@ -16292,8 +15994,8 @@
     pieces.Add(type_name);
     pieces.Add(Symbols::SpaceExtendsSpace());
     // Build the bound name without causing divergence.
-    const AbstractType& bound = AbstractType::Handle(zone,
-        BoundedType::Cast(*this).bound());
+    const AbstractType& bound =
+        AbstractType::Handle(zone, BoundedType::Cast(*this).bound());
     String& bound_name = String::Handle(zone);
     if (bound.IsTypeParameter()) {
       bound_name = TypeParameter::Cast(bound).name();
@@ -16323,8 +16025,8 @@
   Class& cls = Class::Handle(zone);
   if (IsFunctionType()) {
     cls = type_class();
-    const Function& signature_function = Function::Handle(zone,
-        Type::Cast(*this).signature());
+    const Function& signature_function =
+        Function::Handle(zone, Type::Cast(*this).signature());
     if (!cls.IsTypedefClass() ||
         (cls.signature_function() != signature_function.raw())) {
       if (!IsFinalized() || IsBeingFinalized() || IsMalformed()) {
@@ -16390,10 +16092,9 @@
       args.IsRaw(first_type_param_index, num_type_params)) {
     // Do nothing.
   } else {
-    const String& args_name = String::Handle(zone,
-        args.SubvectorName(first_type_param_index,
-                           num_type_params,
-                           name_visibility));
+    const String& args_name = String::Handle(
+        zone, args.SubvectorName(first_type_param_index, num_type_params,
+                                 name_visibility));
     pieces.Add(args_name);
   }
   // The name is only used for type checking and debugging purposes.
@@ -16422,91 +16123,79 @@
 
 
 bool AbstractType::IsVoidType() const {
-    return raw() == Object::void_type().raw();
+  return raw() == Object::void_type().raw();
 }
 
 
 bool AbstractType::IsNullType() const {
-  return !IsFunctionType() &&
-      HasResolvedTypeClass() &&
-      (type_class() == Isolate::Current()->object_store()->null_class());
+  return !IsFunctionType() && HasResolvedTypeClass() &&
+         (type_class() == Isolate::Current()->object_store()->null_class());
 }
 
 
 bool AbstractType::IsBoolType() const {
-  return !IsFunctionType() &&
-      HasResolvedTypeClass() &&
-      (type_class() == Isolate::Current()->object_store()->bool_class());
+  return !IsFunctionType() && HasResolvedTypeClass() &&
+         (type_class() == Isolate::Current()->object_store()->bool_class());
 }
 
 
 bool AbstractType::IsIntType() const {
-  return !IsFunctionType() &&
-      HasResolvedTypeClass() &&
-      (type_class() == Type::Handle(Type::IntType()).type_class());
+  return !IsFunctionType() && HasResolvedTypeClass() &&
+         (type_class() == Type::Handle(Type::IntType()).type_class());
 }
 
 
 bool AbstractType::IsDoubleType() const {
-  return !IsFunctionType() &&
-      HasResolvedTypeClass() &&
-      (type_class() == Type::Handle(Type::Double()).type_class());
+  return !IsFunctionType() && HasResolvedTypeClass() &&
+         (type_class() == Type::Handle(Type::Double()).type_class());
 }
 
 
 bool AbstractType::IsFloat32x4Type() const {
-  return !IsFunctionType() &&
-      HasResolvedTypeClass() &&
-      (type_class() == Type::Handle(Type::Float32x4()).type_class());
+  return !IsFunctionType() && HasResolvedTypeClass() &&
+         (type_class() == Type::Handle(Type::Float32x4()).type_class());
 }
 
 
 bool AbstractType::IsFloat64x2Type() const {
-  return !IsFunctionType() &&
-      HasResolvedTypeClass() &&
-      (type_class() == Type::Handle(Type::Float64x2()).type_class());
+  return !IsFunctionType() && HasResolvedTypeClass() &&
+         (type_class() == Type::Handle(Type::Float64x2()).type_class());
 }
 
 
 bool AbstractType::IsInt32x4Type() const {
-  return !IsFunctionType() &&
-      HasResolvedTypeClass() &&
-      (type_class() == Type::Handle(Type::Int32x4()).type_class());
+  return !IsFunctionType() && HasResolvedTypeClass() &&
+         (type_class() == Type::Handle(Type::Int32x4()).type_class());
 }
 
 
 bool AbstractType::IsNumberType() const {
-  return !IsFunctionType() &&
-      HasResolvedTypeClass() &&
-      (type_class() == Type::Handle(Type::Number()).type_class());
+  return !IsFunctionType() && HasResolvedTypeClass() &&
+         (type_class() == Type::Handle(Type::Number()).type_class());
 }
 
 
 bool AbstractType::IsSmiType() const {
-  return !IsFunctionType() &&
-      HasResolvedTypeClass() &&
-      (type_class() == Type::Handle(Type::SmiType()).type_class());
+  return !IsFunctionType() && HasResolvedTypeClass() &&
+         (type_class() == Type::Handle(Type::SmiType()).type_class());
 }
 
 
 bool AbstractType::IsStringType() const {
-  return !IsFunctionType() &&
-      HasResolvedTypeClass() &&
-      (type_class() == Type::Handle(Type::StringType()).type_class());
+  return !IsFunctionType() && HasResolvedTypeClass() &&
+         (type_class() == Type::Handle(Type::StringType()).type_class());
 }
 
 
 bool AbstractType::IsDartFunctionType() const {
-  return !IsFunctionType() &&
-      HasResolvedTypeClass() &&
-      (type_class() == Type::Handle(Type::DartFunctionType()).type_class());
+  return !IsFunctionType() && HasResolvedTypeClass() &&
+         (type_class() == Type::Handle(Type::DartFunctionType()).type_class());
 }
 
 
 bool AbstractType::IsDartClosureType() const {
-  return !IsFunctionType() &&
-      HasResolvedTypeClass() &&
-      (type_class() == Isolate::Current()->object_store()->closure_class());
+  return !IsFunctionType() && HasResolvedTypeClass() &&
+         (type_class() == Isolate::Current()->object_store()->closure_class());
 }
 
 
@@ -16566,18 +16255,12 @@
     if (IsBoundedType()) {
       const AbstractType& bounded_type =
           AbstractType::Handle(zone, BoundedType::Cast(*this).type());
-      return bounded_type.TypeTest(test_kind,
-                                   other,
-                                   bound_error,
-                                   bound_trail,
+      return bounded_type.TypeTest(test_kind, other, bound_error, bound_trail,
                                    space);
     }
     const AbstractType& other_bounded_type =
         AbstractType::Handle(zone, BoundedType::Cast(other).type());
-    return TypeTest(test_kind,
-                    other_bounded_type,
-                    bound_error,
-                    bound_trail,
+    return TypeTest(test_kind, other_bounded_type, bound_error, bound_trail,
                     space);
   }
   // Type parameters cannot be handled by Class::TypeTest().
@@ -16629,16 +16312,13 @@
       // Check for two function types.
       const Function& fun =
           Function::Handle(zone, Type::Cast(*this).signature());
-      return fun.TypeTest(test_kind,
-                          TypeArguments::Handle(zone, arguments()),
-                          other_fun,
-                          TypeArguments::Handle(zone, other.arguments()),
-                          bound_error,
-                          space);
+      return fun.TypeTest(
+          test_kind, TypeArguments::Handle(zone, arguments()), other_fun,
+          TypeArguments::Handle(zone, other.arguments()), bound_error, space);
     }
     // Check if type S has a call() method of function type T.
-    Function& function = Function::Handle(zone,
-        type_cls.LookupDynamicFunctionAllowAbstract(Symbols::Call()));
+    Function& function = Function::Handle(
+        zone, type_cls.LookupDynamicFunctionAllowAbstract(Symbols::Call()));
     if (function.IsNull()) {
       // Walk up the super_class chain.
       Class& cls = Class::Handle(zone, type_cls.SuperClass());
@@ -16649,13 +16329,11 @@
     }
     if (!function.IsNull()) {
       if (other_is_dart_function_type ||
-          function.TypeTest(test_kind,
-                            TypeArguments::Handle(zone, arguments()),
-                            Function::Handle(
-                                zone, Type::Cast(other).signature()),
-                            TypeArguments::Handle(zone, other.arguments()),
-                            bound_error,
-                            space)) {
+          function.TypeTest(
+              test_kind, TypeArguments::Handle(zone, arguments()),
+              Function::Handle(zone, Type::Cast(other).signature()),
+              TypeArguments::Handle(zone, other.arguments()), bound_error,
+              space)) {
         return true;
       }
     }
@@ -16663,13 +16341,10 @@
   if (IsFunctionType()) {
     return false;
   }
-  return type_cls.TypeTest(test_kind,
-                           TypeArguments::Handle(zone, arguments()),
+  return type_cls.TypeTest(test_kind, TypeArguments::Handle(zone, arguments()),
                            Class::Handle(zone, other.type_class()),
                            TypeArguments::Handle(zone, other.arguments()),
-                           bound_error,
-                           bound_trail,
-                           space);
+                           bound_error, bound_trail, space);
 }
 
 
@@ -16772,8 +16447,7 @@
   Type& type = Type::Handle(type_class.CanonicalType());
   if (type.IsNull()) {
     const TypeArguments& no_type_arguments = TypeArguments::Handle();
-    type ^= Type::New(Object::Handle(type_class.raw()),
-                      no_type_arguments,
+    type ^= Type::New(Object::Handle(type_class.raw()), no_type_arguments,
                       TokenPosition::kNoSource);
     type.SetIsFinalized();
     type ^= type.Canonicalize();
@@ -16974,11 +16648,9 @@
   const Class& cls = Class::Handle(zone, type_class());
   TypeArguments& type_arguments = TypeArguments::Handle(zone, arguments());
   ASSERT(type_arguments.Length() == cls.NumTypeArguments());
-  type_arguments = type_arguments.InstantiateFrom(instantiator_type_arguments,
-                                                  bound_error,
-                                                  instantiation_trail,
-                                                  bound_trail,
-                                                  space);
+  type_arguments =
+      type_arguments.InstantiateFrom(instantiator_type_arguments, bound_error,
+                                     instantiation_trail, bound_trail, space);
   // This uninstantiated type is not modified, as it can be instantiated
   // with different instantiators. Allocate a new instantiated version of it.
   const Type& instantiated_type =
@@ -17012,8 +16684,8 @@
   }
   if (other.IsTypeRef()) {
     // Unfold right hand type. Divergence is controlled by left hand type.
-    const AbstractType& other_ref_type = AbstractType::Handle(
-        TypeRef::Cast(other).type());
+    const AbstractType& other_ref_type =
+        AbstractType::Handle(TypeRef::Cast(other).type());
     ASSERT(!other_ref_type.IsTypeRef());
     return IsEquivalent(other_ref_type, trail);
   }
@@ -17051,8 +16723,8 @@
       const intptr_t num_type_args = cls.NumTypeArguments();
       const intptr_t from_index = num_type_args - num_type_params;
       const TypeArguments& type_args = TypeArguments::Handle(zone, arguments());
-      const TypeArguments& other_type_args = TypeArguments::Handle(
-          zone, other_type.arguments());
+      const TypeArguments& other_type_args =
+          TypeArguments::Handle(zone, other_type.arguments());
       if (type_args.IsNull()) {
         // Ignore from_index.
         if (!other_type_args.IsRaw(0, num_type_args)) {
@@ -17063,10 +16735,8 @@
         if (!type_args.IsRaw(0, num_type_args)) {
           return false;
         }
-      } else if (!type_args.IsSubvectorEquivalent(other_type_args,
-                                                  from_index,
-                                                  num_type_params,
-                                                  trail)) {
+      } else if (!type_args.IsSubvectorEquivalent(other_type_args, from_index,
+                                                  num_type_params, trail)) {
         return false;
       }
 #ifdef DEBUG
@@ -17104,8 +16774,8 @@
     return true;
   }
   const Function& sig_fun = Function::Handle(zone, signature());
-  const Function& other_sig_fun = Function::Handle(
-      zone, other_type.signature());
+  const Function& other_sig_fun =
+      Function::Handle(zone, other_type.signature());
 
   // Compare number of function parameters.
   const intptr_t num_fixed_params = sig_fun.num_fixed_parameters();
@@ -17172,7 +16842,7 @@
   if (IsFinalized()) {
     return raw();
   }
-  ASSERT(!IsMalformed());  // Malformed types are finalized.
+  ASSERT(!IsMalformed());       // Malformed types are finalized.
   ASSERT(!IsBeingFinalized());  // Cloning must occur prior to finalization.
   Zone* zone = Thread::Current()->zone();
   const TypeArguments& type_args = TypeArguments::Handle(zone, arguments());
@@ -17181,7 +16851,8 @@
   if (type_args_clone.raw() == type_args.raw()) {
     return raw();
   }
-  const Type& clone = Type::Handle(zone,
+  const Type& clone = Type::Handle(
+      zone,
       Type::New(Class::Handle(zone, type_class()), type_args, token_pos()));
   // Preserve the bound error if any.
   if (IsMalbounded()) {
@@ -17192,8 +16863,8 @@
   Function& fun = Function::Handle(zone, signature());
   if (!fun.IsNull()) {
     const Class& owner = Class::Handle(zone, fun.Owner());
-    Function& fun_clone = Function::Handle(zone,
-        Function::NewSignatureFunction(owner, TokenPosition::kNoSource));
+    Function& fun_clone = Function::Handle(
+        zone, Function::NewSignatureFunction(owner, TokenPosition::kNoSource));
     AbstractType& type = AbstractType::Handle(zone, fun.result_type());
     type = type.CloneUnfinalized();
     fun_clone.set_result_type(type);
@@ -17201,8 +16872,8 @@
     fun_clone.set_num_fixed_parameters(fun.num_fixed_parameters());
     fun_clone.SetNumOptionalParameters(fun.NumOptionalParameters(),
                                        fun.HasOptionalPositionalParameters());
-    fun_clone.set_parameter_types(Array::Handle(Array::New(num_params,
-                                                           Heap::kOld)));
+    fun_clone.set_parameter_types(
+        Array::Handle(Array::New(num_params, Heap::kOld)));
     for (intptr_t i = 0; i < num_params; i++) {
       type = fun.ParameterTypeAt(i);
       type = type.CloneUnfinalized();
@@ -17261,7 +16932,8 @@
       clone.set_arguments(type_args);
       type_args_cloned = true;
     }
-    Function& fun_clone = Function::Handle(zone,
+    Function& fun_clone = Function::Handle(
+        zone,
         Function::NewSignatureFunction(new_owner, TokenPosition::kNoSource));
     AbstractType& type = AbstractType::Handle(zone, fun.result_type());
     type = type.CloneUninstantiated(new_owner, trail);
@@ -17270,8 +16942,8 @@
     fun_clone.set_num_fixed_parameters(fun.num_fixed_parameters());
     fun_clone.SetNumOptionalParameters(fun.NumOptionalParameters(),
                                        fun.HasOptionalPositionalParameters());
-    fun_clone.set_parameter_types(Array::Handle(Array::New(num_params,
-                                                           Heap::kOld)));
+    fun_clone.set_parameter_types(
+        Array::Handle(Array::New(num_params, Heap::kOld)));
     for (intptr_t i = 0; i < num_params; i++) {
       type = fun.ParameterTypeAt(i);
       type = type.CloneUninstantiated(new_owner, trail);
@@ -17394,8 +17066,8 @@
         sig_fun.set_num_fixed_parameters(fun.num_fixed_parameters());
         sig_fun.SetNumOptionalParameters(fun.NumOptionalParameters(),
                                          fun.HasOptionalPositionalParameters());
-        sig_fun.set_parameter_types(Array::Handle(Array::New(num_params,
-                                                             Heap::kOld)));
+        sig_fun.set_parameter_types(
+            Array::Handle(Array::New(num_params, Heap::kOld)));
         for (intptr_t i = 0; i < num_params; i++) {
           type = fun.ParameterTypeAt(i);
           type = type.Canonicalize(trail);
@@ -17548,9 +17220,8 @@
 
 
 RawType* Type::New(Heap::Space space) {
-  RawObject* raw = Object::Allocate(Type::kClassId,
-                                    Type::InstanceSize(),
-                                    space);
+  RawObject* raw =
+      Object::Allocate(Type::kClassId, Type::InstanceSize(), space);
   return reinterpret_cast<RawType*>(raw);
 }
 
@@ -17601,20 +17272,17 @@
   }
   if (IsFunctionType()) {
     const Function& sig_fun = Function::Handle(zone, signature());
-    const String& sig = IsFinalized() ?
-        String::Handle(zone, sig_fun.InstantiatedSignatureFrom(type_args,
-                                                               kInternalName)) :
-        String::Handle(zone, sig_fun.Signature());
+    const String& sig =
+        IsFinalized() ? String::Handle(zone, sig_fun.InstantiatedSignatureFrom(
+                                                 type_args, kInternalName))
+                      : String::Handle(zone, sig_fun.Signature());
     if (cls.IsClosureClass()) {
       ASSERT(type_args.IsNull());
-      return OS::SCreate(zone, "%sFunction Type: %s",
-                         unresolved, sig.ToCString());
+      return OS::SCreate(zone, "%sFunction Type: %s", unresolved,
+                         sig.ToCString());
     }
     return OS::SCreate(zone, "%s Function Type: %s (class: %s, args: %s)",
-                       unresolved,
-                       sig.ToCString(),
-                       class_name,
-                       args_cstr);
+                       unresolved, sig.ToCString(), class_name, args_cstr);
   }
   if (type_args.IsNull()) {
     return OS::SCreate(zone, "%sType: class '%s'", unresolved, class_name);
@@ -17623,8 +17291,8 @@
     return OS::SCreate(zone, "Type: (@%p H%" Px ") class '%s', args:[%s]",
                        raw(), hash, class_name, args_cstr);
   } else {
-    return OS::SCreate(zone, "%sType: class '%s', args:[%s]",
-                       unresolved, class_name, args_cstr);
+    return OS::SCreate(zone, "%sType: class '%s', args:[%s]", unresolved,
+                       class_name, args_cstr);
   }
 }
 
@@ -17668,12 +17336,9 @@
   AbstractType& ref_type = AbstractType::Handle(type());
   ASSERT(!ref_type.IsTypeRef());
   AbstractType& instantiated_ref_type = AbstractType::Handle();
-  instantiated_ref_type = ref_type.InstantiateFrom(
-      instantiator_type_arguments,
-      bound_error,
-      instantiation_trail,
-      bound_trail,
-      space);
+  instantiated_ref_type =
+      ref_type.InstantiateFrom(instantiator_type_arguments, bound_error,
+                               instantiation_trail, bound_trail, space);
   ASSERT(!instantiated_ref_type.IsTypeRef());
   instantiated_type_ref.set_type(instantiated_ref_type);
   return instantiated_type_ref.raw();
@@ -17759,9 +17424,8 @@
 
 
 RawTypeRef* TypeRef::New() {
-  RawObject* raw = Object::Allocate(TypeRef::kClassId,
-                                    TypeRef::InstanceSize(),
-                                    Heap::kOld);
+  RawObject* raw =
+      Object::Allocate(TypeRef::kClassId, TypeRef::InstanceSize(), Heap::kOld);
   return reinterpret_cast<RawTypeRef*>(raw);
 }
 
@@ -17774,16 +17438,17 @@
 
 
 const char* TypeRef::ToCString() const {
-  const char* type_cstr = String::Handle(Class::Handle(
-      type_class()).Name()).ToCString();
+  const char* type_cstr =
+      String::Handle(Class::Handle(type_class()).Name()).ToCString();
   AbstractType& ref_type = AbstractType::Handle(type());
   if (ref_type.IsFinalized()) {
     const intptr_t hash = ref_type.Hash();
     return OS::SCreate(Thread::Current()->zone(),
-        "TypeRef: %s<...> (@%p H%" Px ")", type_cstr, ref_type.raw(), hash);
+                       "TypeRef: %s<...> (@%p H%" Px ")", type_cstr,
+                       ref_type.raw(), hash);
   } else {
-    return OS::SCreate(Thread::Current()->zone(),
-        "TypeRef: %s<...>", type_cstr);
+    return OS::SCreate(Thread::Current()->zone(), "TypeRef: %s<...>",
+                       type_cstr);
   }
 }
 
@@ -17800,8 +17465,8 @@
   }
   if (other.IsTypeRef()) {
     // Unfold right hand type. Divergence is controlled by left hand type.
-    const AbstractType& other_ref_type = AbstractType::Handle(
-        TypeRef::Cast(other).type());
+    const AbstractType& other_ref_type =
+        AbstractType::Handle(TypeRef::Cast(other).type());
     ASSERT(!other_ref_type.IsTypeRef());
     return IsEquivalent(other_ref_type, trail);
   }
@@ -17876,8 +17541,8 @@
   if (instantiator_type_arguments.IsNull()) {
     return Type::DynamicType();
   }
-  const AbstractType& type_arg = AbstractType::Handle(
-      instantiator_type_arguments.TypeAt(index()));
+  const AbstractType& type_arg =
+      AbstractType::Handle(instantiator_type_arguments.TypeAt(index()));
   // There is no need to canonicalize the instantiated type parameter, since all
   // type arguments are canonicalized at type finalization time. It would be too
   // early to canonicalize the returned type argument here, since instantiation
@@ -17917,13 +17582,13 @@
     // Report the bound error only if both the bounded type and the upper bound
     // are instantiated. Otherwise, we cannot tell yet it is a bound error.
     if (bounded_type.IsInstantiated() && upper_bound.IsInstantiated()) {
-      const String& bounded_type_name = String::Handle(
-          bounded_type.UserVisibleName());
-      const String& upper_bound_name = String::Handle(
-          upper_bound.UserVisibleName());
+      const String& bounded_type_name =
+          String::Handle(bounded_type.UserVisibleName());
+      const String& upper_bound_name =
+          String::Handle(upper_bound.UserVisibleName());
       const AbstractType& declared_bound = AbstractType::Handle(bound());
-      const String& declared_bound_name = String::Handle(
-          declared_bound.UserVisibleName());
+      const String& declared_bound_name =
+          String::Handle(declared_bound.UserVisibleName());
       const String& type_param_name = String::Handle(UserVisibleName());
       const Class& cls = Class::Handle(parameterized_class());
       const String& class_name = String::Handle(cls.Name());
@@ -17931,18 +17596,12 @@
       // Since the bound may have been canonicalized, its token index is
       // meaningless, therefore use the token index of this type parameter.
       *bound_error = LanguageError::NewFormatted(
-          *bound_error,
-          script,
-          token_pos(),
-          Report::AtLocation,
-          Report::kMalboundedType,
-          Heap::kNew,
+          *bound_error, script, token_pos(), Report::AtLocation,
+          Report::kMalboundedType, Heap::kNew,
           "type parameter '%s' of class '%s' must extend bound '%s', "
           "but type argument '%s' is not a subtype of '%s' where\n%s%s",
-          type_param_name.ToCString(),
-          class_name.ToCString(),
-          declared_bound_name.ToCString(),
-          bounded_type_name.ToCString(),
+          type_param_name.ToCString(), class_name.ToCString(),
+          declared_bound_name.ToCString(), bounded_type_name.ToCString(),
           upper_bound_name.ToCString(),
           String::Handle(bounded_type.EnumerateURIs()).ToCString(),
           String::Handle(upper_bound.EnumerateURIs()).ToCString());
@@ -17958,16 +17617,14 @@
   }
   // No need to clone bound, as it is not part of the finalization state.
   return TypeParameter::New(Class::Handle(parameterized_class()),
-                            Function::Handle(parameterized_function()),
-                            index(),
+                            Function::Handle(parameterized_function()), index(),
                             String::Handle(name()),
-                            AbstractType::Handle(bound()),
-                            token_pos());
+                            AbstractType::Handle(bound()), token_pos());
 }
 
 
-RawAbstractType* TypeParameter::CloneUninstantiated(
-    const Class& new_owner, TrailPtr trail) const {
+RawAbstractType* TypeParameter::CloneUninstantiated(const Class& new_owner,
+                                                    TrailPtr trail) const {
   ASSERT(IsFinalized());
   TypeParameter& clone = TypeParameter::Handle();
   clone ^= OnlyBuddyInTrail(trail);
@@ -17975,13 +17632,11 @@
     return clone.raw();
   }
   const Class& old_owner = Class::Handle(parameterized_class());
-  const intptr_t new_index = index() +
-      new_owner.NumTypeArguments() - old_owner.NumTypeArguments();
+  const intptr_t new_index =
+      index() + new_owner.NumTypeArguments() - old_owner.NumTypeArguments();
   AbstractType& upper_bound = AbstractType::Handle(bound());
   ASSERT(parameterized_function() == Function::null());
-  clone = TypeParameter::New(new_owner,
-                             Function::Handle(),
-                             new_index,
+  clone = TypeParameter::New(new_owner, Function::Handle(), new_index,
                              String::Handle(name()),
                              upper_bound,  // Not cloned yet.
                              token_pos());
@@ -18024,8 +17679,7 @@
 
 RawTypeParameter* TypeParameter::New() {
   RawObject* raw = Object::Allocate(TypeParameter::kClassId,
-                                    TypeParameter::InstanceSize(),
-                                    Heap::kOld);
+                                    TypeParameter::InstanceSize(), Heap::kOld);
   return reinterpret_cast<RawTypeParameter*>(raw);
 }
 
@@ -18075,12 +17729,14 @@
   const AbstractType& upper_bound = AbstractType::Handle(bound());
   const char* bound_cstr = String::Handle(upper_bound.Name()).ToCString();
   if (IsFunctionTypeParameter()) {
-    const char* format = "TypeParameter: name %s; index: %d; parent_level: %d, "
+    const char* format =
+        "TypeParameter: name %s; index: %d; parent_level: %d, "
         "function: %s; bound: %s";
     const Function& function = Function::Handle(parameterized_function());
     const char* fun_cstr = String::Handle(function.name()).ToCString();
     intptr_t len = OS::SNPrint(NULL, 0, format, name_cstr, index(),
-                               parent_level(), fun_cstr, bound_cstr) + 1;
+                               parent_level(), fun_cstr, bound_cstr) +
+                   1;
     char* chars = Thread::Current()->zone()->Alloc<char>(len);
     OS::SNPrint(chars, len, format, name_cstr, index(), parent_level(),
                 fun_cstr, bound_cstr);
@@ -18091,8 +17747,9 @@
     const Class& cls = Class::Handle(parameterized_class());
     const char* cls_cstr =
         cls.IsNull() ? " null" : String::Handle(cls.Name()).ToCString();
-    intptr_t len = OS::SNPrint(
-        NULL, 0, format, name_cstr, index(), cls_cstr, bound_cstr) + 1;
+    intptr_t len =
+        OS::SNPrint(NULL, 0, format, name_cstr, index(), cls_cstr, bound_cstr) +
+        1;
     char* chars = Thread::Current()->zone()->Alloc<char>(len);
     OS::SNPrint(chars, len, format, name_cstr, index(), cls_cstr, bound_cstr);
     return chars;
@@ -18128,8 +17785,8 @@
   }
   if (other.IsTypeRef()) {
     // Unfold right hand type. Divergence is controlled by left hand type.
-    const AbstractType& other_ref_type = AbstractType::Handle(
-        TypeRef::Cast(other).type());
+    const AbstractType& other_ref_type =
+        AbstractType::Handle(TypeRef::Cast(other).type());
     ASSERT(!other_ref_type.IsTypeRef());
     return IsEquivalent(other_ref_type, trail);
   }
@@ -18147,8 +17804,7 @@
   }
   const AbstractType& this_bound = AbstractType::Handle(bound());
   const AbstractType& other_bound = AbstractType::Handle(other_bounded.bound());
-  return this_bound.IsFinalized() &&
-         other_bound.IsFinalized() &&
+  return this_bound.IsFinalized() && other_bound.IsFinalized() &&
          this_bound.Equals(other_bound);  // Different graph, do not pass trail.
 }
 
@@ -18159,8 +17815,7 @@
 
 
 void BoundedType::set_type(const AbstractType& value) const {
-  ASSERT(value.IsFinalized() ||
-         value.IsBeingFinalized() ||
+  ASSERT(value.IsFinalized() || value.IsBeingFinalized() ||
          value.IsTypeParameter());
   ASSERT(!value.IsMalformed());
   StorePointer(&raw_ptr()->type_, value.raw());
@@ -18196,18 +17851,15 @@
       AbstractType::Handle(bounded_type.raw());
   if (!bounded_type.IsInstantiated()) {
     instantiated_bounded_type =
-        bounded_type.InstantiateFrom(instantiator_type_arguments,
-                                     bound_error,
-                                     instantiation_trail,
-                                     bound_trail,
-                                     space);
+        bounded_type.InstantiateFrom(instantiator_type_arguments, bound_error,
+                                     instantiation_trail, bound_trail, space);
     // In case types of instantiator_type_arguments are not finalized
     // (or instantiated), then the instantiated_bounded_type is not finalized
     // (or instantiated) either.
     // Note that instantiator_type_arguments must have the final length, though.
   }
-  if ((Isolate::Current()->type_checks()) &&
-      (bound_error != NULL) && bound_error->IsNull()) {
+  if ((Isolate::Current()->type_checks()) && (bound_error != NULL) &&
+      bound_error->IsNull()) {
     AbstractType& upper_bound = AbstractType::Handle(bound());
     ASSERT(upper_bound.IsFinalized());
     ASSERT(!upper_bound.IsObjectType() && !upper_bound.IsDynamicType());
@@ -18215,11 +17867,8 @@
         AbstractType::Handle(upper_bound.raw());
     if (!upper_bound.IsInstantiated()) {
       instantiated_upper_bound =
-          upper_bound.InstantiateFrom(instantiator_type_arguments,
-                                      bound_error,
-                                      instantiation_trail,
-                                      bound_trail,
-                                      space);
+          upper_bound.InstantiateFrom(instantiator_type_arguments, bound_error,
+                                      instantiation_trail, bound_trail, space);
       // The instantiated_upper_bound may not be finalized or instantiated.
       // See comment above.
     }
@@ -18233,10 +17882,8 @@
       if (!instantiated_bounded_type.IsFinalized() ||
           !instantiated_upper_bound.IsFinalized() ||
           (!type_param.CheckBound(instantiated_bounded_type,
-                                  instantiated_upper_bound,
-                                  bound_error,
-                                  bound_trail,
-                                  space) &&
+                                  instantiated_upper_bound, bound_error,
+                                  bound_trail, space) &&
            bound_error->IsNull())) {
         // We cannot determine yet whether the bounded_type is below the
         // upper_bound, because one or both of them is still being finalized or
@@ -18249,9 +17896,8 @@
         // Postpone bound check by returning a new BoundedType with unfinalized
         // or partially instantiated bounded_type and upper_bound, but keeping
         // type_param.
-        instantiated_bounded_type = BoundedType::New(instantiated_bounded_type,
-                                                     instantiated_upper_bound,
-                                                     type_param);
+        instantiated_bounded_type = BoundedType::New(
+            instantiated_bounded_type, instantiated_upper_bound, type_param);
       }
     }
   }
@@ -18271,14 +17917,13 @@
   }
   // No need to clone bound or type parameter, as they are not part of the
   // finalization state of this bounded type.
-  return BoundedType::New(bounded_type,
-                          AbstractType::Handle(bound()),
+  return BoundedType::New(bounded_type, AbstractType::Handle(bound()),
                           TypeParameter::Handle(type_parameter()));
 }
 
 
-RawAbstractType* BoundedType::CloneUninstantiated(
-    const Class& new_owner, TrailPtr trail) const {
+RawAbstractType* BoundedType::CloneUninstantiated(const Class& new_owner,
+                                                  TrailPtr trail) const {
   if (IsInstantiated()) {
     return raw();
   }
@@ -18286,7 +17931,7 @@
   bounded_type = bounded_type.CloneUninstantiated(new_owner, trail);
   AbstractType& upper_bound = AbstractType::Handle(bound());
   upper_bound = upper_bound.CloneUninstantiated(new_owner, trail);
-  TypeParameter& type_param =  TypeParameter::Handle(type_parameter());
+  TypeParameter& type_param = TypeParameter::Handle(type_parameter());
   type_param ^= type_param.CloneUninstantiated(new_owner, trail);
   return BoundedType::New(bounded_type, upper_bound, type_param);
 }
@@ -18302,8 +17947,8 @@
   uint32_t result = AbstractType::Handle(type()).Hash();
   // No need to include the hash of the bound, since the bound is defined by the
   // type parameter (modulo instantiation state).
-  result = CombineHashes(result,
-                         TypeParameter::Handle(type_parameter()).Hash());
+  result =
+      CombineHashes(result, TypeParameter::Handle(type_parameter()).Hash());
   result = FinalizeHash(result, kHashBits);
   SetHash(result);
   return result;
@@ -18312,8 +17957,7 @@
 
 RawBoundedType* BoundedType::New() {
   RawObject* raw = Object::Allocate(BoundedType::kClassId,
-                                    BoundedType::InstanceSize(),
-                                    Heap::kOld);
+                                    BoundedType::InstanceSize(), Heap::kOld);
   return reinterpret_cast<RawBoundedType*>(raw);
 }
 
@@ -18332,19 +17976,20 @@
 
 const char* BoundedType::ToCString() const {
   const char* format = "BoundedType: type %s; bound: %s; type param: %s of %s";
-  const char* type_cstr = String::Handle(AbstractType::Handle(
-      type()).Name()).ToCString();
-  const char* bound_cstr = String::Handle(AbstractType::Handle(
-      bound()).Name()).ToCString();
+  const char* type_cstr =
+      String::Handle(AbstractType::Handle(type()).Name()).ToCString();
+  const char* bound_cstr =
+      String::Handle(AbstractType::Handle(bound()).Name()).ToCString();
   const TypeParameter& type_param = TypeParameter::Handle(type_parameter());
   const char* type_param_cstr = String::Handle(type_param.name()).ToCString();
   const Class& cls = Class::Handle(type_param.parameterized_class());
   const char* cls_cstr = String::Handle(cls.Name()).ToCString();
-  intptr_t len = OS::SNPrint(
-      NULL, 0, format, type_cstr, bound_cstr, type_param_cstr, cls_cstr) + 1;
+  intptr_t len = OS::SNPrint(NULL, 0, format, type_cstr, bound_cstr,
+                             type_param_cstr, cls_cstr) +
+                 1;
   char* chars = Thread::Current()->zone()->Alloc<char>(len);
-  OS::SNPrint(
-      chars, len, format, type_cstr, bound_cstr, type_param_cstr, cls_cstr);
+  OS::SNPrint(chars, len, format, type_cstr, bound_cstr, type_param_cstr,
+              cls_cstr);
   return chars;
 }
 
@@ -18366,12 +18011,12 @@
 
 const char* MixinAppType::ToCString() const {
   const char* format = "MixinAppType: super type: %s; first mixin type: %s";
-  const char* super_type_cstr = String::Handle(AbstractType::Handle(
-      super_type()).Name()).ToCString();
-  const char* first_mixin_type_cstr = String::Handle(AbstractType::Handle(
-      MixinTypeAt(0)).Name()).ToCString();
-  intptr_t len = OS::SNPrint(
-      NULL, 0, format, super_type_cstr, first_mixin_type_cstr) + 1;
+  const char* super_type_cstr =
+      String::Handle(AbstractType::Handle(super_type()).Name()).ToCString();
+  const char* first_mixin_type_cstr =
+      String::Handle(AbstractType::Handle(MixinTypeAt(0)).Name()).ToCString();
+  intptr_t len =
+      OS::SNPrint(NULL, 0, format, super_type_cstr, first_mixin_type_cstr) + 1;
   char* chars = Thread::Current()->zone()->Alloc<char>(len);
   OS::SNPrint(chars, len, format, super_type_cstr, first_mixin_type_cstr);
   return chars;
@@ -18397,8 +18042,7 @@
   // MixinAppType objects do not survive finalization, so allocate
   // on new heap.
   RawObject* raw = Object::Allocate(MixinAppType::kClassId,
-                                    MixinAppType::InstanceSize(),
-                                    Heap::kOld);
+                                    MixinAppType::InstanceSize(), Heap::kOld);
   return reinterpret_cast<RawMixinAppType*>(raw);
 }
 
@@ -18439,8 +18083,8 @@
         SafepointMutexLocker ml(isolate->constant_canonicalization_mutex());
         // Retry lookup.
         {
-          result ^= cls.LookupCanonicalBigint(
-              zone, Bigint::Cast(*this), &index);
+          result ^=
+              cls.LookupCanonicalBigint(zone, Bigint::Cast(*this), &index);
           if (!result.IsNull()) {
             return result.raw();
           }
@@ -18518,8 +18162,8 @@
   ASSERT(str.IsOneByteString());
   int64_t value;
   if (!OS::StringToInt64(str.ToCString(), &value)) {
-    const Bigint& big = Bigint::Handle(
-        Bigint::NewFromCString(str.ToCString(), space));
+    const Bigint& big =
+        Bigint::Handle(Bigint::NewFromCString(str.ToCString(), space));
     ASSERT(!big.FitsIntoSmi());
     ASSERT(!big.FitsIntoInt64());
     return big.raw();
@@ -18662,15 +18306,15 @@
         if (Smi::kBits < 32) {
           // In 32-bit mode, the product of two Smis fits in a 64-bit result.
           return Integer::New(static_cast<int64_t>(left_value) *
-                              static_cast<int64_t>(right_value),
+                                  static_cast<int64_t>(right_value),
                               space);
         } else {
           // In 64-bit mode, the product of two signed integers fits in a
           // 64-bit result if the sum of the highest bits of their absolute
           // values is smaller than 62.
           ASSERT(sizeof(intptr_t) == sizeof(int64_t));
-          if ((Utils::HighestBit(left_value) +
-               Utils::HighestBit(right_value)) < 62) {
+          if ((Utils::HighestBit(left_value) + Utils::HighestBit(right_value)) <
+              62) {
             return Integer::New(left_value * right_value, space);
           }
         }
@@ -18711,8 +18355,8 @@
         break;
       }
       case Token::kMUL: {
-        if ((Utils::HighestBit(left_value) +
-             Utils::HighestBit(right_value)) < 62) {
+        if ((Utils::HighestBit(left_value) + Utils::HighestBit(right_value)) <
+            62) {
           return Integer::New(left_value * right_value, space);
         }
         break;
@@ -18747,8 +18391,9 @@
 }
 
 
-RawInteger* Integer::BitOp(
-    Token::Kind kind, const Integer& other, Heap::Space space) const {
+RawInteger* Integer::BitOp(Token::Kind kind,
+                           const Integer& other,
+                           Heap::Space space) const {
   if (IsSmi() && other.IsSmi()) {
     intptr_t op1_value = Smi::Value(Smi::RawCast(raw()));
     intptr_t op2_value = Smi::Value(Smi::RawCast(other.raw()));
@@ -18799,7 +18444,7 @@
       if ((left_value == 0) || (right_value == 0)) {
         return raw();
       }
-      { // Check for overflow.
+      {  // Check for overflow.
         int cnt = Utils::BitLength(left_value);
         if ((cnt + right_value) > Smi::kBits) {
           if ((cnt + right_value) > Mint::kBits) {
@@ -18894,9 +18539,8 @@
   ASSERT(Isolate::Current()->object_store()->mint_class() != Class::null());
   Mint& result = Mint::Handle();
   {
-    RawObject* raw = Object::Allocate(Mint::kClassId,
-                                      Mint::InstanceSize(),
-                                      space);
+    RawObject* raw =
+        Object::Allocate(Mint::kClassId, Mint::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -19036,9 +18680,8 @@
   ASSERT(Isolate::Current()->object_store()->double_class() != Class::null());
   Double& result = Double::Handle();
   {
-    RawObject* raw = Object::Allocate(Double::kClassId,
-                                      Double::InstanceSize(),
-                                      space);
+    RawObject* raw =
+        Object::Allocate(Double::kClassId, Double::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -19102,7 +18745,7 @@
   // Refactoring can avoid Zone::Alloc and strlen, but gains are insignificant.
   const char* cstr = ToCString();
   intptr_t len = strlen(cstr);
-  // Resulting string is ASCII ...
+// Resulting string is ASCII ...
 #ifdef DEBUG
   for (intptr_t i = 0; i < len; ++i) {
     ASSERT(static_cast<uint8_t>(cstr[i]) < 128);
@@ -19236,9 +18879,8 @@
   ASSERT(isolate->object_store()->bigint_class() != Class::null());
   Bigint& result = Bigint::Handle(zone);
   {
-    RawObject* raw = Object::Allocate(Bigint::kClassId,
-                                      Bigint::InstanceSize(),
-                                      space);
+    RawObject* raw =
+        Object::Allocate(Bigint::kClassId, Bigint::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -19250,7 +18892,9 @@
 }
 
 
-RawBigint* Bigint::New(bool neg, intptr_t used, const TypedData& digits,
+RawBigint* Bigint::New(bool neg,
+                       intptr_t used,
+                       const TypedData& digits,
                        Heap::Space space) {
   ASSERT((used == 0) ||
          (!digits.IsNull() && (digits.Length() >= (used + (used & 1)))));
@@ -19260,9 +18904,8 @@
   ASSERT(isolate->object_store()->bigint_class() != Class::null());
   Bigint& result = Bigint::Handle(zone);
   {
-    RawObject* raw = Object::Allocate(Bigint::kClassId,
-                                      Bigint::InstanceSize(),
-                                      space);
+    RawObject* raw =
+        Object::Allocate(Bigint::kClassId, Bigint::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -19314,7 +18957,8 @@
 }
 
 
-RawBigint* Bigint::NewFromShiftedInt64(int64_t value, intptr_t shift,
+RawBigint* Bigint::NewFromShiftedInt64(int64_t value,
+                                       intptr_t shift,
                                        Heap::Space space) {
   ASSERT(kBitsPerDigit == 32);
   ASSERT(shift >= 0);
@@ -19339,8 +18983,8 @@
   SetDigitAt(digits, 1 + digit_shift,
              static_cast<uint32_t>(abs_value >> (32 - bit_shift)));
   SetDigitAt(digits, 2 + digit_shift,
-      (bit_shift == 0) ? 0
-                       : static_cast<uint32_t>(abs_value >> (64 - bit_shift)));
+             (bit_shift == 0) ? 0 : static_cast<uint32_t>(abs_value >>
+                                                          (64 - bit_shift)));
   return New(neg, used, digits, space);
 }
 
@@ -19356,8 +19000,7 @@
   }
   intptr_t used;
   const intptr_t str_length = strlen(str);
-  if ((str_length >= 2) &&
-      (str[0] == '0') &&
+  if ((str_length >= 2) && (str[0] == '0') &&
       ((str[1] == 'x') || (str[1] == 'X'))) {
     digits = NewDigitsFromHexCString(&str[2], &used, space);
   } else {
@@ -19371,8 +19014,8 @@
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   Isolate* isolate = thread->isolate();
-  const Bigint& value = Bigint::Handle(
-      zone, Bigint::NewFromCString(str.ToCString(), Heap::kOld));
+  const Bigint& value =
+      Bigint::Handle(zone, Bigint::NewFromCString(str.ToCString(), Heap::kOld));
   const Class& cls =
       Class::Handle(zone, isolate->object_store()->bigint_class());
   intptr_t index = 0;
@@ -19399,7 +19042,8 @@
 }
 
 
-RawTypedData* Bigint::NewDigitsFromHexCString(const char* str, intptr_t* used,
+RawTypedData* Bigint::NewDigitsFromHexCString(const char* str,
+                                              intptr_t* used,
                                               Heap::Space space) {
   const int kBitsPerHexDigit = 4;
   const int kHexDigitsPerDigit = 8;
@@ -19430,7 +19074,8 @@
 }
 
 
-RawTypedData* Bigint::NewDigitsFromDecCString(const char* str, intptr_t* used,
+RawTypedData* Bigint::NewDigitsFromDecCString(const char* str,
+                                              intptr_t* used,
                                               Heap::Space space) {
   // Read 9 digits a time. 10^9 < 2^32.
   const int kDecDigitsPerIteration = 9;
@@ -19445,8 +19090,8 @@
   // The extra 5 digits allocated take care of variations.
   const int64_t kLog10Dividend = 33219281;
   const int64_t kLog10Divisor = 10000000;
-  const intptr_t length = (kLog10Dividend * str_length) /
-                          (kLog10Divisor * kBitsPerDigit) + 5;
+  const intptr_t length =
+      (kLog10Dividend * str_length) / (kLog10Divisor * kBitsPerDigit) + 5;
   const TypedData& digits = TypedData::Handle(NewDigits(length, space));
   // Read first digit separately. This avoids a multiplication and addition.
   // The first digit might also not have kDecDigitsPerIteration decimal digits.
@@ -19518,8 +19163,8 @@
   if (y > 0) {
     return static_cast<double>(y);
   } else {
-    const double half = static_cast<double>(
-        static_cast<int64_t>(x >> 1) | (y & 1));
+    const double half =
+        static_cast<double>(static_cast<int64_t>(x >> 1) | (y & 1));
     return half + half;
   }
 #else
@@ -19732,7 +19377,7 @@
     const Bigint& other_bgi = Bigint::Cast(other);
     int64_t result = Used() - other_bgi.Used();
     if (result == 0) {
-      for (intptr_t i = Used(); --i >= 0; ) {
+      for (intptr_t i = Used(); --i >= 0;) {
         result = DigitAt(i);
         result -= other_bgi.DigitAt(i);
         if (result != 0) break;
@@ -19780,8 +19425,8 @@
   while (used > 0) {
     uint32_t remainder = 0;
     for (intptr_t i = used - 1; i >= 0; i--) {
-      uint64_t dividend = (static_cast<uint64_t>(remainder) << kBitsPerDigit) +
-          rest_digits[i];
+      uint64_t dividend =
+          (static_cast<uint64_t>(remainder) << kBitsPerDigit) + rest_digits[i];
       uint32_t quotient = static_cast<uint32_t>(dividend / kDivisor);
       remainder = static_cast<uint32_t>(
           dividend - static_cast<uint64_t>(quotient) * kDivisor);
@@ -19879,9 +19524,7 @@
 class StringHasher : ValueObject {
  public:
   StringHasher() : hash_(0) {}
-  void Add(int32_t ch) {
-    hash_ = CombineHashes(hash_, ch);
-  }
+  void Add(int32_t ch) { hash_ = CombineHashes(hash_, ch); }
   void Add(const String& str, intptr_t begin_index, intptr_t len);
 
   // Return a non-zero hash of at most 'bits' bits.
@@ -19891,6 +19534,7 @@
     ASSERT(hash_ <= static_cast<uint32_t>(kMaxInt32));
     return hash_;
   }
+
  private:
   uint32_t hash_;
 };
@@ -19942,7 +19586,7 @@
 }
 
 
-template<typename T>
+template <typename T>
 static intptr_t HashImpl(const T* characters, intptr_t len) {
   ASSERT(len >= 0);
   StringHasher hasher;
@@ -20062,8 +19706,7 @@
   Scanner::CharAtFunc this_char_at_func = this->CharAtFunc();
   Scanner::CharAtFunc str_char_at_func = str.CharAtFunc();
   for (intptr_t i = 0; i < len; i++) {
-    if (this_char_at_func(*this, i) !=
-        str_char_at_func(str, begin_index + i)) {
+    if (this_char_at_func(*this, i) != str_char_at_func(str, begin_index + i)) {
       return false;
     }
   }
@@ -20082,9 +19725,8 @@
       return false;
     }
     int32_t ch;
-    intptr_t consumed = Utf8::Decode(reinterpret_cast<const uint8_t*>(cstr),
-                                     len,
-                                     &ch);
+    intptr_t consumed =
+        Utf8::Decode(reinterpret_cast<const uint8_t*>(cstr), len, &ch);
     if (consumed == 0 || it.Current() != ch) {
       return false;
     }
@@ -20146,8 +19788,8 @@
 
 bool String::EqualsConcat(const String& str1, const String& str2) const {
   return (Length() == str1.Length() + str2.Length()) &&
-    str1.Equals(*this, 0, str1.Length()) &&
-    str2.Equals(*this, str1.Length(), str2.Length());
+         str1.Equals(*this, 0, str1.Length()) &&
+         str2.Equals(*this, str1.Length(), str2.Length());
 }
 
 
@@ -20228,8 +19870,8 @@
   ASSERT((type == Utf8::kBMP) || (type == Utf8::kSupplementary));
   const String& strobj = String::Handle(TwoByteString::New(len, space));
   NoSafepointScope no_safepoint;
-  Utf8::DecodeToUTF16(utf8_array, array_len,
-                      TwoByteString::CharAddr(strobj, 0), len);
+  Utf8::DecodeToUTF16(utf8_array, array_len, TwoByteString::CharAddr(strobj, 0),
+                      len);
   return strobj.raw();
 }
 
@@ -20315,7 +19957,8 @@
 }
 
 
-void String::Copy(const String& dst, intptr_t dst_offset,
+void String::Copy(const String& dst,
+                  intptr_t dst_offset,
                   const uint8_t* characters,
                   intptr_t len) {
   ASSERT(dst_offset >= 0);
@@ -20324,9 +19967,7 @@
   if (dst.IsOneByteString()) {
     NoSafepointScope no_safepoint;
     if (len > 0) {
-      memmove(OneByteString::CharAddr(dst, dst_offset),
-              characters,
-              len);
+      memmove(OneByteString::CharAddr(dst, dst_offset), characters, len);
     }
   } else if (dst.IsTwoByteString()) {
     for (intptr_t i = 0; i < len; ++i) {
@@ -20336,7 +19977,8 @@
 }
 
 
-void String::Copy(const String& dst, intptr_t dst_offset,
+void String::Copy(const String& dst,
+                  intptr_t dst_offset,
                   const uint16_t* utf16_array,
                   intptr_t array_len) {
   ASSERT(dst_offset >= 0);
@@ -20352,16 +19994,17 @@
     ASSERT(dst.IsTwoByteString());
     NoSafepointScope no_safepoint;
     if (array_len > 0) {
-      memmove(TwoByteString::CharAddr(dst, dst_offset),
-              utf16_array,
+      memmove(TwoByteString::CharAddr(dst, dst_offset), utf16_array,
               array_len * 2);
     }
   }
 }
 
 
-void String::Copy(const String& dst, intptr_t dst_offset,
-                  const String& src, intptr_t src_offset,
+void String::Copy(const String& dst,
+                  intptr_t dst_offset,
+                  const String& src,
+                  intptr_t src_offset,
                   intptr_t len) {
   ASSERT(dst_offset >= 0);
   ASSERT(src_offset >= 0);
@@ -20373,33 +20016,25 @@
     if (char_size == kOneByteChar) {
       if (src.IsOneByteString()) {
         NoSafepointScope no_safepoint;
-        String::Copy(dst,
-                     dst_offset,
-                     OneByteString::CharAddr(src, src_offset),
+        String::Copy(dst, dst_offset, OneByteString::CharAddr(src, src_offset),
                      len);
       } else {
         ASSERT(src.IsExternalOneByteString());
         NoSafepointScope no_safepoint;
-        String::Copy(dst,
-                     dst_offset,
-                     ExternalOneByteString::CharAddr(src, src_offset),
-                     len);
+        String::Copy(dst, dst_offset,
+                     ExternalOneByteString::CharAddr(src, src_offset), len);
       }
     } else {
       ASSERT(char_size == kTwoByteChar);
       if (src.IsTwoByteString()) {
         NoSafepointScope no_safepoint;
-        String::Copy(dst,
-                     dst_offset,
-                     TwoByteString::CharAddr(src, src_offset),
+        String::Copy(dst, dst_offset, TwoByteString::CharAddr(src, src_offset),
                      len);
       } else {
         ASSERT(src.IsExternalTwoByteString());
         NoSafepointScope no_safepoint;
-        String::Copy(dst,
-                     dst_offset,
-                     ExternalTwoByteString::CharAddr(src, src_offset),
-                     len);
+        String::Copy(dst, dst_offset,
+                     ExternalTwoByteString::CharAddr(src, src_offset), len);
       }
     }
   }
@@ -20588,7 +20223,8 @@
 }
 
 
-RawString* String::NewFormattedV(const char* format, va_list args,
+RawString* String::NewFormattedV(const char* format,
+                                 va_list args,
                                  Heap::Space space) {
   va_list args_copy;
   va_copy(args_copy, args);
@@ -20615,8 +20251,7 @@
 }
 
 
-RawString* String::ConcatAll(const Array& strings,
-                             Heap::Space space) {
+RawString* String::ConcatAll(const Array& strings, Heap::Space space) {
   return ConcatAllRange(strings, 0, strings.Length(), space);
 }
 
@@ -20657,9 +20292,7 @@
   if (begin_index >= str.Length()) {
     return String::null();
   }
-  return String::SubString(str,
-                           begin_index,
-                           (str.Length() - begin_index),
+  return String::SubString(str, begin_index, (str.Length() - begin_index),
                            space);
 }
 
@@ -20746,11 +20379,8 @@
     intptr_t external_size) {
   ASSERT((callback != NULL && peer != NULL) ||
          (callback == NULL && peer == NULL));
-  return FinalizablePersistentHandle::New(Isolate::Current(),
-                                          referent,
-                                          peer,
-                                          callback,
-                                          external_size);
+  return FinalizablePersistentHandle::New(Isolate::Current(), referent, peer,
+                                          callback, external_size);
 }
 
 
@@ -20797,8 +20427,8 @@
       } while (tags != old_tags);
       result = this->raw();
       const uint8_t* ext_array = reinterpret_cast<const uint8_t*>(array);
-      ExternalStringData<uint8_t>* ext_data = new ExternalStringData<uint8_t>(
-          ext_array, peer, cback);
+      ExternalStringData<uint8_t>* ext_data =
+          new ExternalStringData<uint8_t>(ext_array, peer, cback);
       ASSERT(result.Length() == str_length);
       ASSERT(!result.HasHash() ||
              (result.Hash() == String::Hash(ext_array, str_length)));
@@ -20813,8 +20443,7 @@
 
       // Copy the data into the external array.
       if (str_length > 0) {
-        memmove(array,
-                TwoByteString::CharAddr(*this, 0),
+        memmove(array, TwoByteString::CharAddr(*this, 0),
                 (str_length * kTwoByteChar));
       }
 
@@ -20835,8 +20464,8 @@
       } while (tags != old_tags);
       result = this->raw();
       const uint16_t* ext_array = reinterpret_cast<const uint16_t*>(array);
-      ExternalStringData<uint16_t>* ext_data = new ExternalStringData<uint16_t>(
-          ext_array, peer, cback);
+      ExternalStringData<uint16_t>* ext_data =
+          new ExternalStringData<uint16_t>(ext_array, peer, cback);
       ASSERT(result.Length() == str_length);
       ASSERT(!result.HasHash() ||
              (result.Hash() == String::Hash(ext_array, str_length)));
@@ -20888,7 +20517,8 @@
 }
 
 bool String::ParseDouble(const String& str,
-                         intptr_t start, intptr_t end,
+                         intptr_t start,
+                         intptr_t end,
                          double* result) {
   ASSERT(0 <= start);
   ASSERT(start <= end);
@@ -20913,8 +20543,8 @@
     }
     startChar = chars;
   }
-  return CStringToDouble(reinterpret_cast<const char*>(startChar),
-                         length, result);
+  return CStringToDouble(reinterpret_cast<const char*>(startChar), length,
+                         result);
 }
 
 
@@ -20929,9 +20559,8 @@
 //
 //    _ReceivePortImpl@6be832b._internal@6be832b
 //
-template<typename T1, typename T2>
-static bool EqualsIgnoringPrivateKey(const String& str1,
-                                     const String& str2) {
+template <typename T1, typename T2>
+static bool EqualsIgnoringPrivateKey(const String& str1, const String& str2) {
   intptr_t len = str1.Length();
   intptr_t str2_len = str2.Length();
   if (len == str2_len) {
@@ -20973,22 +20602,21 @@
 
 #define EQUALS_IGNORING_PRIVATE_KEY(class_id, type, str1, str2)                \
   switch (class_id) {                                                          \
-    case kOneByteStringCid :                                                   \
+    case kOneByteStringCid:                                                    \
       return dart::EqualsIgnoringPrivateKey<type, OneByteString>(str1, str2);  \
-    case kTwoByteStringCid :                                                   \
+    case kTwoByteStringCid:                                                    \
       return dart::EqualsIgnoringPrivateKey<type, TwoByteString>(str1, str2);  \
-    case kExternalOneByteStringCid :                                           \
-      return dart::EqualsIgnoringPrivateKey<type, ExternalOneByteString>(str1, \
-                                                                         str2);\
-    case kExternalTwoByteStringCid :                                           \
-      return dart::EqualsIgnoringPrivateKey<type, ExternalTwoByteString>(str1, \
-                                                                         str2);\
+    case kExternalOneByteStringCid:                                            \
+      return dart::EqualsIgnoringPrivateKey<type, ExternalOneByteString>(      \
+          str1, str2);                                                         \
+    case kExternalTwoByteStringCid:                                            \
+      return dart::EqualsIgnoringPrivateKey<type, ExternalTwoByteString>(      \
+          str1, str2);                                                         \
   }                                                                            \
-  UNREACHABLE();                                                               \
+  UNREACHABLE();
 
 
-bool String::EqualsIgnoringPrivateKey(const String& str1,
-                                      const String& str2) {
+bool String::EqualsIgnoringPrivateKey(const String& str1, const String& str2) {
   if (str1.raw() == str2.raw()) {
     return true;  // Both handles point to the same raw instance.
   }
@@ -20996,19 +20624,19 @@
   intptr_t str1_class_id = str1.raw()->GetClassId();
   intptr_t str2_class_id = str2.raw()->GetClassId();
   switch (str1_class_id) {
-    case kOneByteStringCid :
+    case kOneByteStringCid:
       EQUALS_IGNORING_PRIVATE_KEY(str2_class_id, OneByteString, str1, str2);
       break;
-    case kTwoByteStringCid :
+    case kTwoByteStringCid:
       EQUALS_IGNORING_PRIVATE_KEY(str2_class_id, TwoByteString, str1, str2);
       break;
-    case kExternalOneByteStringCid :
-      EQUALS_IGNORING_PRIVATE_KEY(str2_class_id,
-                                  ExternalOneByteString, str1, str2);
+    case kExternalOneByteStringCid:
+      EQUALS_IGNORING_PRIVATE_KEY(str2_class_id, ExternalOneByteString, str1,
+                                  str2);
       break;
-    case kExternalTwoByteStringCid :
-      EQUALS_IGNORING_PRIVATE_KEY(str2_class_id,
-                                  ExternalTwoByteString, str1, str2);
+    case kExternalTwoByteStringCid:
+      EQUALS_IGNORING_PRIVATE_KEY(str2_class_id, ExternalTwoByteString, str1,
+                                  str2);
       break;
   }
   UNREACHABLE();
@@ -21042,8 +20670,8 @@
     for (intptr_t i = 0; i < len; i++) {
       num_escapes += EscapeOverhead(CharAt(str, i));
     }
-    const String& dststr = String::Handle(
-        OneByteString::New(len + num_escapes, Heap::kNew));
+    const String& dststr =
+        String::Handle(OneByteString::New(len + num_escapes, Heap::kNew));
     intptr_t index = 0;
     for (intptr_t i = 0; i < len; i++) {
       uint8_t ch = CharAt(str, i);
@@ -21076,8 +20704,8 @@
     for (intptr_t i = 0; i < len; i++) {
       num_escapes += EscapeOverhead(CharAt(str, i));
     }
-    const String& dststr = String::Handle(
-        OneByteString::New(len + num_escapes, Heap::kNew));
+    const String& dststr =
+        String::Handle(OneByteString::New(len + num_escapes, Heap::kNew));
     intptr_t index = 0;
     for (intptr_t i = 0; i < len; i++) {
       uint8_t ch = CharAt(str, i);
@@ -21102,8 +20730,7 @@
 }
 
 
-RawOneByteString* OneByteString::New(intptr_t len,
-                                     Heap::Space space) {
+RawOneByteString* OneByteString::New(intptr_t len, Heap::Space space) {
   ASSERT((Isolate::Current() == Dart::vm_isolate()) ||
          ((Isolate::Current()->object_store() != NULL) &&
           (Isolate::Current()->object_store()->one_byte_string_class() !=
@@ -21114,8 +20741,7 @@
   }
   {
     RawObject* raw = Object::Allocate(OneByteString::kClassId,
-                                      OneByteString::InstanceSize(len),
-                                      space);
+                                      OneByteString::InstanceSize(len), space);
     NoSafepointScope no_safepoint;
     RawOneByteString* result = reinterpret_cast<RawOneByteString*>(raw);
     result->StoreSmi(&(result->ptr()->length_), Smi::New(len));
@@ -21163,8 +20789,7 @@
 }
 
 
-RawOneByteString* OneByteString::New(const String& str,
-                                     Heap::Space space) {
+RawOneByteString* OneByteString::New(const String& str, Heap::Space space) {
   intptr_t len = str.Length();
   const String& result = String::Handle(OneByteString::New(len, space));
   String::Copy(result, 0, str, 0, len);
@@ -21197,8 +20822,7 @@
   if (other_len > 0) {
     NoSafepointScope no_safepoint;
     memmove(OneByteString::CharAddr(result, 0),
-            other_typed_data.DataAddr(other_start_index),
-            other_len);
+            other_typed_data.DataAddr(other_start_index), other_len);
   }
   return OneByteString::raw(result);
 }
@@ -21213,8 +20837,7 @@
   if (other_len > 0) {
     NoSafepointScope no_safepoint;
     memmove(OneByteString::CharAddr(result, 0),
-            other_typed_data.DataAddr(other_start_index),
-            other_len);
+            other_typed_data.DataAddr(other_start_index), other_len);
   }
   return OneByteString::raw(result);
 }
@@ -21286,7 +20909,7 @@
   NoSafepointScope no_safepoint;
   if (length > 0) {
     uint8_t* dest = &result->ptr()->data()[0];
-    const uint8_t* src =  &raw_ptr(str)->data()[begin_index];
+    const uint8_t* src = &raw_ptr(str)->data()[begin_index];
     memmove(dest, src, length);
   }
   return result;
@@ -21320,8 +20943,8 @@
     for (intptr_t i = 0; i < len; i++) {
       num_escapes += EscapeOverhead(CharAt(str, i));
     }
-    const String& dststr = String::Handle(
-        TwoByteString::New(len + num_escapes, Heap::kNew));
+    const String& dststr =
+        String::Handle(TwoByteString::New(len + num_escapes, Heap::kNew));
     intptr_t index = 0;
     for (intptr_t i = 0; i < len; i++) {
       uint16_t ch = CharAt(str, i);
@@ -21346,8 +20969,7 @@
 }
 
 
-RawTwoByteString* TwoByteString::New(intptr_t len,
-                                     Heap::Space space) {
+RawTwoByteString* TwoByteString::New(intptr_t len, Heap::Space space) {
   ASSERT(Isolate::Current()->object_store()->two_byte_string_class());
   if (len < 0 || len > kMaxElements) {
     // This should be caught before we reach here.
@@ -21356,8 +20978,7 @@
   String& result = String::Handle();
   {
     RawObject* raw = Object::Allocate(TwoByteString::kClassId,
-                                      TwoByteString::InstanceSize(len),
-                                      space);
+                                      TwoByteString::InstanceSize(len), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.SetLength(len);
@@ -21405,8 +21026,7 @@
 }
 
 
-RawTwoByteString* TwoByteString::New(const String& str,
-                                     Heap::Space space) {
+RawTwoByteString* TwoByteString::New(const String& str, Heap::Space space) {
   intptr_t len = str.Length();
   const String& result = String::Handle(TwoByteString::New(len, space));
   String::Copy(result, 0, str, 0, len);
@@ -21531,8 +21151,8 @@
     void* peer,
     Dart_PeerFinalizer callback,
     Heap::Space space) {
-  ASSERT(Isolate::Current()->object_store()->
-         external_one_byte_string_class() != Class::null());
+  ASSERT(Isolate::Current()->object_store()->external_one_byte_string_class() !=
+         Class::null());
   if (len < 0 || len > kMaxElements) {
     // This should be caught before we reach here.
     FATAL1("Fatal error in ExternalOneByteString::New: invalid len %" Pd "\n",
@@ -21542,9 +21162,9 @@
   ExternalStringData<uint8_t>* external_data =
       new ExternalStringData<uint8_t>(data, peer, callback);
   {
-    RawObject* raw = Object::Allocate(ExternalOneByteString::kClassId,
-                                      ExternalOneByteString::InstanceSize(),
-                                      space);
+    RawObject* raw =
+        Object::Allocate(ExternalOneByteString::kClassId,
+                         ExternalOneByteString::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.SetLength(len);
@@ -21582,9 +21202,9 @@
   ExternalStringData<uint16_t>* external_data =
       new ExternalStringData<uint16_t>(data, peer, callback);
   {
-    RawObject* raw = Object::Allocate(ExternalTwoByteString::kClassId,
-                                      ExternalTwoByteString::InstanceSize(),
-                                      space);
+    RawObject* raw =
+        Object::Allocate(ExternalTwoByteString::kClassId,
+                         ExternalTwoByteString::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.SetLength(len);
@@ -21611,9 +21231,8 @@
   {
     // Since the two boolean instances are singletons we allocate them straight
     // in the old generation.
-    RawObject* raw = Object::Allocate(Bool::kClassId,
-                                      Bool::InstanceSize(),
-                                      Heap::kOld);
+    RawObject* raw =
+        Object::Allocate(Bool::kClassId, Bool::InstanceSize(), Heap::kOld);
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -21658,8 +21277,8 @@
     return true;
   }
   const TypeArguments& type_args = TypeArguments::Handle(GetTypeArguments());
-  const TypeArguments& other_type_args = TypeArguments::Handle(
-      other.GetTypeArguments());
+  const TypeArguments& other_type_args =
+      TypeArguments::Handle(other.GetTypeArguments());
   if (!type_args.Equals(other_type_args)) {
     return false;
   }
@@ -21695,9 +21314,7 @@
   }
   {
     RawArray* raw = reinterpret_cast<RawArray*>(
-        Object::Allocate(class_id,
-                         Array::InstanceSize(len),
-                         space));
+        Object::Allocate(class_id, Array::InstanceSize(len), space));
     NoSafepointScope no_safepoint;
     raw->StoreSmi(&(raw->ptr()->length_), Smi::New(len));
     return raw;
@@ -21730,8 +21347,8 @@
   uword old_tags;
   do {
     old_tags = tags;
-    uword new_tags = RawObject::ClassIdTag::update(kImmutableArrayCid,
-                                                   old_tags);
+    uword new_tags =
+        RawObject::ClassIdTag::update(kImmutableArrayCid, old_tags);
     tags = CompareAndSwapTags(old_tags, new_tags);
   } while (tags != old_tags);
 }
@@ -21742,8 +21359,8 @@
     return IsImmutable() ? "_ImmutableList NULL" : "_List NULL";
   }
   Zone* zone = Thread::Current()->zone();
-  const char* format = IsImmutable() ? "_ImmutableList len:%" Pd
-                                     : "_List len:%" Pd;
+  const char* format =
+      IsImmutable() ? "_ImmutableList len:%" Pd : "_List len:%" Pd;
   return zone->PrintToString(format, Length());
 }
 
@@ -21839,8 +21456,8 @@
           this->SetAt(i, obj);
         } else {
           ASSERT(error_str != NULL);
-          char* chars = OS::SCreate(
-              zone, "element at index %" Pd ": %s\n", i, obj.ToCString());
+          char* chars = OS::SCreate(zone, "element at index %" Pd ": %s\n", i,
+                                    obj.ToCString());
           *error_str = chars;
           return false;
         }
@@ -21851,8 +21468,7 @@
 }
 
 
-RawImmutableArray* ImmutableArray::New(intptr_t len,
-                                       Heap::Space space) {
+RawImmutableArray* ImmutableArray::New(intptr_t len, Heap::Space space) {
   ASSERT(Isolate::Current()->object_store()->immutable_array_class() !=
          Class::null());
   return reinterpret_cast<RawImmutableArray*>(Array::New(kClassId, len, space));
@@ -21907,13 +21523,13 @@
 
 RawGrowableObjectArray* GrowableObjectArray::New(const Array& array,
                                                  Heap::Space space) {
-  ASSERT(Isolate::Current()->object_store()->growable_object_array_class()
-         != Class::null());
+  ASSERT(Isolate::Current()->object_store()->growable_object_array_class() !=
+         Class::null());
   GrowableObjectArray& result = GrowableObjectArray::Handle();
   {
-    RawObject* raw = Object::Allocate(GrowableObjectArray::kClassId,
-                                      GrowableObjectArray::InstanceSize(),
-                                      space);
+    RawObject* raw =
+        Object::Allocate(GrowableObjectArray::kClassId,
+                         GrowableObjectArray::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.SetLength(0);
@@ -21928,7 +21544,7 @@
     return "_GrowableList NULL";
   }
   return OS::SCreate(Thread::Current()->zone(),
-      "Instance(length:%" Pd ") of '_GrowableList'", Length());
+                     "Instance(length:%" Pd ") of '_GrowableList'", Length());
 }
 
 
@@ -21970,8 +21586,8 @@
 
 RawLinkedHashMap* LinkedHashMap::NewDefault(Heap::Space space) {
   const Array& data = Array::Handle(Array::New(kInitialIndexSize, space));
-  const TypedData& index = TypedData::Handle(TypedData::New(
-      kTypedDataUint32ArrayCid, kInitialIndexSize, space));
+  const TypedData& index = TypedData::Handle(
+      TypedData::New(kTypedDataUint32ArrayCid, kInitialIndexSize, space));
   // On 32-bit, the top bits are wasted to avoid Mint allocation.
   static const intptr_t kAvailableBits = (kSmiBits >= 32) ? 32 : kSmiBits;
   static const intptr_t kInitialHashMask =
@@ -21986,10 +21602,10 @@
                                      intptr_t used_data,
                                      intptr_t deleted_keys,
                                      Heap::Space space) {
-  ASSERT(Isolate::Current()->object_store()->linked_hash_map_class()
-         != Class::null());
-  LinkedHashMap& result = LinkedHashMap::Handle(
-      LinkedHashMap::NewUninitialized(space));
+  ASSERT(Isolate::Current()->object_store()->linked_hash_map_class() !=
+         Class::null());
+  LinkedHashMap& result =
+      LinkedHashMap::Handle(LinkedHashMap::NewUninitialized(space));
   result.SetData(data);
   result.SetIndex(index);
   result.SetHashMask(hash_mask);
@@ -22000,13 +21616,12 @@
 
 
 RawLinkedHashMap* LinkedHashMap::NewUninitialized(Heap::Space space) {
-  ASSERT(Isolate::Current()->object_store()->linked_hash_map_class()
-         != Class::null());
+  ASSERT(Isolate::Current()->object_store()->linked_hash_map_class() !=
+         Class::null());
   LinkedHashMap& result = LinkedHashMap::Handle();
   {
     RawObject* raw = Object::Allocate(LinkedHashMap::kClassId,
-                                      LinkedHashMap::InstanceSize(),
-                                      space);
+                                      LinkedHashMap::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -22020,15 +21635,17 @@
 }
 
 
-RawFloat32x4* Float32x4::New(float v0, float v1, float v2, float v3,
+RawFloat32x4* Float32x4::New(float v0,
+                             float v1,
+                             float v2,
+                             float v3,
                              Heap::Space space) {
   ASSERT(Isolate::Current()->object_store()->float32x4_class() !=
          Class::null());
   Float32x4& result = Float32x4::Handle();
   {
-    RawObject* raw = Object::Allocate(Float32x4::kClassId,
-                                      Float32x4::InstanceSize(),
-                                      space);
+    RawObject* raw =
+        Object::Allocate(Float32x4::kClassId, Float32x4::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -22045,9 +21662,8 @@
          Class::null());
   Float32x4& result = Float32x4::Handle();
   {
-    RawObject* raw = Object::Allocate(Float32x4::kClassId,
-                                      Float32x4::InstanceSize(),
-                                      space);
+    RawObject* raw =
+        Object::Allocate(Float32x4::kClassId, Float32x4::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -22111,20 +21727,21 @@
   float _y = y();
   float _z = z();
   float _w = w();
-  return OS::SCreate(Thread::Current()->zone(),
-      "[%f, %f, %f, %f]", _x, _y, _z, _w);
+  return OS::SCreate(Thread::Current()->zone(), "[%f, %f, %f, %f]", _x, _y, _z,
+                     _w);
 }
 
 
-RawInt32x4* Int32x4::New(int32_t v0, int32_t v1, int32_t v2, int32_t v3,
+RawInt32x4* Int32x4::New(int32_t v0,
+                         int32_t v1,
+                         int32_t v2,
+                         int32_t v3,
                          Heap::Space space) {
-  ASSERT(Isolate::Current()->object_store()->int32x4_class() !=
-         Class::null());
+  ASSERT(Isolate::Current()->object_store()->int32x4_class() != Class::null());
   Int32x4& result = Int32x4::Handle();
   {
-    RawObject* raw = Object::Allocate(Int32x4::kClassId,
-                                      Int32x4::InstanceSize(),
-                                      space);
+    RawObject* raw =
+        Object::Allocate(Int32x4::kClassId, Int32x4::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -22137,13 +21754,11 @@
 
 
 RawInt32x4* Int32x4::New(simd128_value_t value, Heap::Space space) {
-  ASSERT(Isolate::Current()->object_store()->int32x4_class() !=
-         Class::null());
+  ASSERT(Isolate::Current()->object_store()->int32x4_class() != Class::null());
   Int32x4& result = Int32x4::Handle();
   {
-    RawObject* raw = Object::Allocate(Int32x4::kClassId,
-                                      Int32x4::InstanceSize(),
-                                      space);
+    RawObject* raw =
+        Object::Allocate(Int32x4::kClassId, Int32x4::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -22207,8 +21822,8 @@
   int32_t _y = y();
   int32_t _z = z();
   int32_t _w = w();
-  return OS::SCreate(Thread::Current()->zone(),
-      "[%08x, %08x, %08x, %08x]", _x, _y, _z, _w);
+  return OS::SCreate(Thread::Current()->zone(), "[%08x, %08x, %08x, %08x]", _x,
+                     _y, _z, _w);
 }
 
 
@@ -22217,9 +21832,8 @@
          Class::null());
   Float64x2& result = Float64x2::Handle();
   {
-    RawObject* raw = Object::Allocate(Float64x2::kClassId,
-                                      Float64x2::InstanceSize(),
-                                      space);
+    RawObject* raw =
+        Object::Allocate(Float64x2::kClassId, Float64x2::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -22234,9 +21848,8 @@
          Class::null());
   Float64x2& result = Float64x2::Handle();
   {
-    RawObject* raw = Object::Allocate(Float64x2::kClassId,
-                                      Float64x2::InstanceSize(),
-                                      space);
+    RawObject* raw =
+        Object::Allocate(Float64x2::kClassId, Float64x2::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -22283,20 +21896,20 @@
 
 
 const intptr_t TypedData::element_size_table[TypedData::kNumElementSizes] = {
-  1,   // kTypedDataInt8ArrayCid.
-  1,   // kTypedDataUint8ArrayCid.
-  1,   // kTypedDataUint8ClampedArrayCid.
-  2,   // kTypedDataInt16ArrayCid.
-  2,   // kTypedDataUint16ArrayCid.
-  4,   // kTypedDataInt32ArrayCid.
-  4,   // kTypedDataUint32ArrayCid.
-  8,   // kTypedDataInt64ArrayCid.
-  8,   // kTypedDataUint64ArrayCid.
-  4,   // kTypedDataFloat32ArrayCid.
-  8,   // kTypedDataFloat64ArrayCid.
-  16,  // kTypedDataFloat32x4ArrayCid.
-  16,  // kTypedDataInt32x4ArrayCid.
-  16,  // kTypedDataFloat64x2ArrayCid,
+    1,   // kTypedDataInt8ArrayCid.
+    1,   // kTypedDataUint8ArrayCid.
+    1,   // kTypedDataUint8ClampedArrayCid.
+    2,   // kTypedDataInt16ArrayCid.
+    2,   // kTypedDataUint16ArrayCid.
+    4,   // kTypedDataInt32ArrayCid.
+    4,   // kTypedDataUint32ArrayCid.
+    8,   // kTypedDataInt64ArrayCid.
+    8,   // kTypedDataUint64ArrayCid.
+    4,   // kTypedDataFloat32ArrayCid.
+    8,   // kTypedDataFloat64ArrayCid.
+    16,  // kTypedDataFloat32x4ArrayCid.
+    16,  // kTypedDataInt32x4ArrayCid.
+    16,  // kTypedDataFloat64x2ArrayCid,
 };
 
 
@@ -22322,7 +21935,7 @@
   }
   NoSafepointScope no_safepoint;
   return (len == 0) ||
-      (memcmp(DataAddr(0), other_typed_data.DataAddr(0), len) == 0);
+         (memcmp(DataAddr(0), other_typed_data.DataAddr(0), len) == 0);
 }
 
 
@@ -22346,9 +21959,8 @@
   TypedData& result = TypedData::Handle();
   {
     const intptr_t lengthInBytes = len * ElementSizeInBytes(class_id);
-    RawObject* raw = Object::Allocate(class_id,
-                                      TypedData::InstanceSize(lengthInBytes),
-                                      space);
+    RawObject* raw = Object::Allocate(
+        class_id, TypedData::InstanceSize(lengthInBytes), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.SetLength(len);
@@ -22369,8 +21981,8 @@
     // Already created.
     return isolate->object_store()->empty_uint32_array();
   }
-  const TypedData& array = TypedData::Handle(thread->zone(),
-      TypedData::New(kTypedDataUint32ArrayCid, 0, Heap::kOld));
+  const TypedData& array = TypedData::Handle(
+      thread->zone(), TypedData::New(kTypedDataUint32ArrayCid, 0, Heap::kOld));
   isolate->object_store()->set_empty_uint32_array(array);
   return array.raw();
 }
@@ -22379,8 +21991,9 @@
 const char* TypedData::ToCString() const {
   switch (GetClassId()) {
 #define CASE_TYPED_DATA_CLASS(clazz)                                           \
-  case kTypedData##clazz##Cid: return #clazz;
-  CLASS_LIST_TYPED_DATA(CASE_TYPED_DATA_CLASS);
+  case kTypedData##clazz##Cid:                                                 \
+    return #clazz;
+    CLASS_LIST_TYPED_DATA(CASE_TYPED_DATA_CLASS);
 #undef CASE_TYPED_DATA_CLASS
   }
   return "TypedData";
@@ -22401,9 +22014,8 @@
                                              Heap::Space space) {
   ExternalTypedData& result = ExternalTypedData::Handle();
   {
-    RawObject* raw = Object::Allocate(class_id,
-                                      ExternalTypedData::InstanceSize(),
-                                      space);
+    RawObject* raw =
+        Object::Allocate(class_id, ExternalTypedData::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.SetLength(len);
@@ -22422,8 +22034,7 @@
   Capability& result = Capability::Handle();
   {
     RawObject* raw = Object::Allocate(Capability::kClassId,
-                                      Capability::InstanceSize(),
-                                      space);
+                                      Capability::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.StoreNonPointer(&result.raw_ptr()->id_, id);
@@ -22449,8 +22060,7 @@
   ReceivePort& result = ReceivePort::Handle(zone);
   {
     RawObject* raw = Object::Allocate(ReceivePort::kClassId,
-                                      ReceivePort::InstanceSize(),
-                                      space);
+                                      ReceivePort::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.StorePointer(&result.raw_ptr()->send_port_, send_port.raw());
@@ -22480,9 +22090,8 @@
   ASSERT(id != ILLEGAL_PORT);
   SendPort& result = SendPort::Handle();
   {
-    RawObject* raw = Object::Allocate(SendPort::kClassId,
-                                      SendPort::InstanceSize(),
-                                      space);
+    RawObject* raw =
+        Object::Allocate(SendPort::kClassId, SendPort::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.StoreNonPointer(&result.raw_ptr()->id_, id);
@@ -22503,8 +22112,8 @@
   const char* fun_sig = String::Handle(fun.UserVisibleSignature()).ToCString();
   const char* from = is_implicit_closure ? " from " : "";
   const char* fun_desc = is_implicit_closure ? fun.ToCString() : "";
-  return OS::SCreate(Thread::Current()->zone(),
-      "Closure: %s%s%s", fun_sig, from, fun_desc);
+  return OS::SCreate(Thread::Current()->zone(), "Closure: %s%s%s", fun_sig,
+                     from, fun_desc);
 }
 
 
@@ -22513,9 +22122,8 @@
                          Heap::Space space) {
   Closure& result = Closure::Handle();
   {
-    RawObject* raw = Object::Allocate(Closure::kClassId,
-                                      Closure::InstanceSize(),
-                                      space);
+    RawObject* raw =
+        Object::Allocate(Closure::kClassId, Closure::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.StorePointer(&result.raw_ptr()->function_, function.raw());
@@ -22526,9 +22134,8 @@
 
 
 RawClosure* Closure::New() {
-  RawObject* raw = Object::Allocate(Closure::kClassId,
-                                    Closure::InstanceSize(),
-                                    Heap::kOld);
+  RawObject* raw =
+      Object::Allocate(Closure::kClassId, Closure::InstanceSize(), Heap::kOld);
   return reinterpret_cast<RawClosure*>(raw);
 }
 
@@ -22551,8 +22158,7 @@
 }
 
 
-void Stacktrace::SetCodeAtFrame(intptr_t frame_index,
-                                const Code& code) const {
+void Stacktrace::SetCodeAtFrame(intptr_t frame_index, const Code& code) const {
   const Array& code_array = Array::Handle(raw_ptr()->code_array_);
   code_array.SetAt(frame_index, code);
 }
@@ -22597,8 +22203,7 @@
   Stacktrace& result = Stacktrace::Handle();
   {
     RawObject* raw = Object::Allocate(Stacktrace::kClassId,
-                                      Stacktrace::InstanceSize(),
-                                      space);
+                                      Stacktrace::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -22625,8 +22230,8 @@
   const Script& script = Script::Handle(zone, function.script());
   const String& function_name =
       String::Handle(zone, function.QualifiedUserVisibleName());
-  const String& url = String::Handle(zone,
-      script.IsNull() ? String::New("Kernel") : script.url());
+  const String& url = String::Handle(
+      zone, script.IsNull() ? String::New("Kernel") : script.url());
   intptr_t line = -1;
   intptr_t column = -1;
   if (!script.IsNull() && token_pos.IsReal()) {
@@ -22638,17 +22243,15 @@
   }
   char* chars = NULL;
   if (column >= 0) {
-    chars = OS::SCreate(zone,
-        "#%-6" Pd " %s (%s:%" Pd ":%" Pd ")\n",
-        frame_index, function_name.ToCString(), url.ToCString(), line, column);
+    chars =
+        OS::SCreate(zone, "#%-6" Pd " %s (%s:%" Pd ":%" Pd ")\n", frame_index,
+                    function_name.ToCString(), url.ToCString(), line, column);
   } else if (line >= 0) {
-    chars = OS::SCreate(zone,
-        "#%-6" Pd " %s (%s:%" Pd ")\n",
-        frame_index, function_name.ToCString(), url.ToCString(), line);
+    chars = OS::SCreate(zone, "#%-6" Pd " %s (%s:%" Pd ")\n", frame_index,
+                        function_name.ToCString(), url.ToCString(), line);
   } else {
-    chars = OS::SCreate(zone,
-        "#%-6" Pd " %s (%s)\n",
-        frame_index, function_name.ToCString(), url.ToCString());
+    chars = OS::SCreate(zone, "#%-6" Pd " %s (%s)\n", frame_index,
+                        function_name.ToCString(), url.ToCString());
   }
   frame_strings->Add(chars);
   return strlen(chars);
@@ -22685,8 +22288,7 @@
       code = CodeAtFrame(i);
       ASSERT(function.raw() == code.function());
       uword pc = code.PayloadStart() + Smi::Value(PcOffsetAtFrame(i));
-      if (code.is_optimized() &&
-          expand_inlined() &&
+      if (code.is_optimized() && expand_inlined() &&
           !FLAG_precompiled_runtime) {
         // Traverse inlined frames.
         for (InlinedFunctionsIterator it(code, pc);
@@ -22699,15 +22301,15 @@
             ASSERT(pc != 0);
             ASSERT(code.PayloadStart() <= pc);
             ASSERT(pc < (code.PayloadStart() + code.Size()));
-            total_len += PrintOneStacktrace(
-                zone, &frame_strings, pc, function, code, *frame_index);
+            total_len += PrintOneStacktrace(zone, &frame_strings, pc, function,
+                                            code, *frame_index);
             (*frame_index)++;  // To account for inlined frames.
           }
         }
       } else {
         if (function.is_visible() || FLAG_show_invisible_frames) {
-          total_len += PrintOneStacktrace(
-              zone, &frame_strings, pc, function, code, *frame_index);
+          total_len += PrintOneStacktrace(zone, &frame_strings, pc, function,
+                                          code, *frame_index);
           (*frame_index)++;
         }
       }
@@ -22718,9 +22320,7 @@
   char* chars = zone->Alloc<char>(total_len + 1);
   intptr_t index = 0;
   for (intptr_t i = 0; i < frame_strings.length(); i++) {
-    index += OS::SNPrint((chars + index),
-                         (total_len + 1 - index),
-                         "%s",
+    index += OS::SNPrint((chars + index), (total_len + 1 - index), "%s",
                          frame_strings[i]);
   }
   chars[total_len] = '\0';
@@ -22755,9 +22355,8 @@
 RawRegExp* RegExp::New(Heap::Space space) {
   RegExp& result = RegExp::Handle();
   {
-    RawObject* raw = Object::Allocate(RegExp::kClassId,
-                                      RegExp::InstanceSize(),
-                                      space);
+    RawObject* raw =
+        Object::Allocate(RegExp::kClassId, RegExp::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.set_type(kUnitialized);
@@ -22784,13 +22383,13 @@
 
 const char* RegExp::Flags() const {
   switch (flags()) {
-    case kGlobal | kIgnoreCase | kMultiLine :
-    case kIgnoreCase | kMultiLine :
+    case kGlobal | kIgnoreCase | kMultiLine:
+    case kIgnoreCase | kMultiLine:
       return "im";
-    case kGlobal | kIgnoreCase :
+    case kGlobal | kIgnoreCase:
     case kIgnoreCase:
       return "i";
-    case kGlobal | kMultiLine :
+    case kGlobal | kMultiLine:
     case kMultiLine:
       return "m";
     default:
@@ -22826,17 +22425,16 @@
 
 const char* RegExp::ToCString() const {
   const String& str = String::Handle(pattern());
-  return OS::SCreate(Thread::Current()->zone(),
-      "RegExp: pattern=%s flags=%s", str.ToCString(), Flags());
+  return OS::SCreate(Thread::Current()->zone(), "RegExp: pattern=%s flags=%s",
+                     str.ToCString(), Flags());
 }
 
 
 RawWeakProperty* WeakProperty::New(Heap::Space space) {
-  ASSERT(Isolate::Current()->object_store()->weak_property_class()
-         != Class::null());
+  ASSERT(Isolate::Current()->object_store()->weak_property_class() !=
+         Class::null());
   RawObject* raw = Object::Allocate(WeakProperty::kClassId,
-                                    WeakProperty::InstanceSize(),
-                                    space);
+                                    WeakProperty::InstanceSize(), space);
   RawWeakProperty* result = reinterpret_cast<RawWeakProperty*>(raw);
   result->ptr()->next_ = 0;  // Init the list to NULL.
   return result;
@@ -22889,8 +22487,7 @@
   MirrorReference& result = MirrorReference::Handle();
   {
     RawObject* raw = Object::Allocate(MirrorReference::kClassId,
-                                      MirrorReference::InstanceSize(),
-                                      space);
+                                      MirrorReference::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -22922,18 +22519,16 @@
     return result.raw();
   }
   if (TagTableIsFull(thread)) {
-    const String& error = String::Handle(
-        String::NewFormatted("UserTag instance limit (%" Pd ") reached.",
-                             UserTags::kMaxUserTags));
+    const String& error = String::Handle(String::NewFormatted(
+        "UserTag instance limit (%" Pd ") reached.", UserTags::kMaxUserTags));
     const Array& args = Array::Handle(Array::New(1));
     args.SetAt(0, error);
     Exceptions::ThrowByType(Exceptions::kUnsupported, args);
   }
   // No tag with label exists, create and register with isolate tag table.
   {
-    RawObject* raw = Object::Allocate(UserTag::kClassId,
-                                      UserTag::InstanceSize(),
-                                      space);
+    RawObject* raw =
+        Object::Allocate(UserTag::kClassId, UserTag::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -22953,8 +22548,8 @@
     return isolate->default_tag();
   }
   // Create default tag.
-  const UserTag& result = UserTag::Handle(zone,
-                                          UserTag::New(Symbols::Default()));
+  const UserTag& result =
+      UserTag::Handle(zone, UserTag::New(Symbols::Default()));
   ASSERT(result.tag() == UserTags::kDefaultUserTag);
   isolate->set_default_tag(result);
   return result.raw();
@@ -22965,8 +22560,8 @@
   Isolate* isolate = thread->isolate();
   Zone* zone = thread->zone();
   ASSERT(isolate->tag_table() != GrowableObjectArray::null());
-  const GrowableObjectArray& tag_table = GrowableObjectArray::Handle(
-      zone, isolate->tag_table());
+  const GrowableObjectArray& tag_table =
+      GrowableObjectArray::Handle(zone, isolate->tag_table());
   UserTag& other = UserTag::Handle(zone);
   String& tag_label = String::Handle(zone);
   for (intptr_t i = 0; i < tag_table.Length(); i++) {
@@ -22986,8 +22581,8 @@
   Isolate* isolate = thread->isolate();
   Zone* zone = thread->zone();
   ASSERT(isolate->tag_table() != GrowableObjectArray::null());
-  const GrowableObjectArray& tag_table = GrowableObjectArray::Handle(
-      zone, isolate->tag_table());
+  const GrowableObjectArray& tag_table =
+      GrowableObjectArray::Handle(zone, isolate->tag_table());
   ASSERT(!TagTableIsFull(thread));
 #if defined(DEBUG)
   // Verify that no existing tag has the same tag id.
@@ -23011,8 +22606,8 @@
 bool UserTag::TagTableIsFull(Thread* thread) {
   Isolate* isolate = thread->isolate();
   ASSERT(isolate->tag_table() != GrowableObjectArray::null());
-  const GrowableObjectArray& tag_table = GrowableObjectArray::Handle(
-      thread->zone(), isolate->tag_table());
+  const GrowableObjectArray& tag_table =
+      GrowableObjectArray::Handle(thread->zone(), isolate->tag_table());
   ASSERT(tag_table.Length() <= UserTags::kMaxUserTags);
   return tag_table.Length() == UserTags::kMaxUserTags;
 }
@@ -23023,8 +22618,8 @@
   Zone* zone = thread->zone();
   Isolate* isolate = thread->isolate();
   ASSERT(isolate->tag_table() != GrowableObjectArray::null());
-  const GrowableObjectArray& tag_table = GrowableObjectArray::Handle(
-      zone, isolate->tag_table());
+  const GrowableObjectArray& tag_table =
+      GrowableObjectArray::Handle(zone, isolate->tag_table());
   UserTag& tag = UserTag::Handle(zone);
   for (intptr_t i = 0; i < tag_table.Length(); i++) {
     tag ^= tag_table.At(i);
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 32c4a6c..dbf901e 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -29,8 +29,7 @@
 namespace dart {
 
 // Forward declarations.
-#define DEFINE_FORWARD_DECLARATION(clazz)                                      \
-  class clazz;
+#define DEFINE_FORWARD_DECLARATION(clazz) class clazz;
 CLASS_LIST(DEFINE_FORWARD_DECLARATION)
 #undef DEFINE_FORWARD_DECLARATION
 class Api;
@@ -43,8 +42,7 @@
 class FinalizablePersistentHandle;
 class LocalScope;
 
-#define REUSABLE_FORWARD_DECLARATION(name)                                     \
-  class Reusable##name##HandleScope;
+#define REUSABLE_FORWARD_DECLARATION(name) class Reusable##name##HandleScope;
 REUSABLE_HANDLE_LIST(REUSABLE_FORWARD_DECLARATION)
 #undef REUSABLE_FORWARD_DECLARATION
 
@@ -57,31 +55,27 @@
 #endif
 
 #define BASE_OBJECT_IMPLEMENTATION(object, super)                              \
- public:  /* NOLINT */                                                         \
+ public: /* NOLINT */                                                          \
   Raw##object* raw() const { return reinterpret_cast<Raw##object*>(raw_); }    \
   bool Is##object() const { return true; }                                     \
   static object& Handle(Zone* zone, Raw##object* raw_ptr) {                    \
-    object* obj =                                                              \
-      reinterpret_cast<object*>(VMHandles::AllocateHandle(zone));              \
+    object* obj = reinterpret_cast<object*>(VMHandles::AllocateHandle(zone));  \
     initializeHandle(obj, raw_ptr);                                            \
     return *obj;                                                               \
   }                                                                            \
   static object& Handle() {                                                    \
     return Handle(Thread::Current()->zone(), object::null());                  \
   }                                                                            \
-  static object& Handle(Zone* zone) {                                          \
-    return Handle(zone, object::null());                                       \
-  }                                                                            \
+  static object& Handle(Zone* zone) { return Handle(zone, object::null()); }   \
   static object& Handle(Raw##object* raw_ptr) {                                \
     return Handle(Thread::Current()->zone(), raw_ptr);                         \
   }                                                                            \
   static object& CheckedHandle(Zone* zone, RawObject* raw_ptr) {               \
-    object* obj =                                                              \
-        reinterpret_cast<object*>(VMHandles::AllocateHandle(zone));            \
+    object* obj = reinterpret_cast<object*>(VMHandles::AllocateHandle(zone));  \
     initializeHandle(obj, raw_ptr);                                            \
     if (!obj->Is##object()) {                                                  \
-      FATAL2("Handle check failed: saw %s expected %s",                        \
-             obj->ToCString(), #object);                                       \
+      FATAL2("Handle check failed: saw %s expected %s", obj->ToCString(),      \
+             #object);                                                         \
     }                                                                          \
     return *obj;                                                               \
   }                                                                            \
@@ -89,14 +83,13 @@
     return CheckedHandle(Thread::Current()->zone(), raw_ptr);                  \
   }                                                                            \
   static object& ZoneHandle(Zone* zone, Raw##object* raw_ptr) {                \
-    object* obj = reinterpret_cast<object*>(                                   \
-        VMHandles::AllocateZoneHandle(zone));                                  \
+    object* obj =                                                              \
+        reinterpret_cast<object*>(VMHandles::AllocateZoneHandle(zone));        \
     initializeHandle(obj, raw_ptr);                                            \
     return *obj;                                                               \
   }                                                                            \
   static object* ReadOnlyHandle() {                                            \
-    object* obj = reinterpret_cast<object*>(                                   \
-        Dart::AllocateReadOnlyHandle());                                       \
+    object* obj = reinterpret_cast<object*>(Dart::AllocateReadOnlyHandle());   \
     initializeHandle(obj, object::null());                                     \
     return obj;                                                                \
   }                                                                            \
@@ -110,12 +103,12 @@
     return ZoneHandle(Thread::Current()->zone(), raw_ptr);                     \
   }                                                                            \
   static object& CheckedZoneHandle(Zone* zone, RawObject* raw_ptr) {           \
-    object* obj = reinterpret_cast<object*>(                                   \
-        VMHandles::AllocateZoneHandle(zone));                                  \
+    object* obj =                                                              \
+        reinterpret_cast<object*>(VMHandles::AllocateZoneHandle(zone));        \
     initializeHandle(obj, raw_ptr);                                            \
     if (!obj->Is##object()) {                                                  \
-      FATAL2("Handle check failed: saw %s expected %s",                        \
-             obj->ToCString(), #object);                                       \
+      FATAL2("Handle check failed: saw %s expected %s", obj->ToCString(),      \
+             #object);                                                         \
     }                                                                          \
     return *obj;                                                               \
   }                                                                            \
@@ -138,7 +131,8 @@
   }                                                                            \
   virtual const char* ToCString() const;                                       \
   static const ClassId kClassId = k##object##Cid;                              \
- private:  /* NOLINT */                                                        \
+                                                                               \
+ private: /* NOLINT */                                                         \
   /* Initialize the handle based on the raw_ptr in the presence of null. */    \
   static void initializeHandle(object* obj, RawObject* raw_ptr) {              \
     if (raw_ptr != Object::null()) {                                           \
@@ -150,16 +144,15 @@
     }                                                                          \
   }                                                                            \
   /* Disallow allocation, copy constructors and override super assignment. */  \
- public:  /* NOLINT */                                                         \
-  void operator delete(void* pointer) {                                        \
-    UNREACHABLE();                                                             \
-  }                                                                            \
- private:  /* NOLINT */                                                        \
+ public: /* NOLINT */                                                          \
+  void operator delete(void* pointer) { UNREACHABLE(); }                       \
+                                                                               \
+ private: /* NOLINT */                                                         \
   void* operator new(size_t size);                                             \
   object(const object& value);                                                 \
   void operator=(Raw##super* value);                                           \
   void operator=(const object& value);                                         \
-  void operator=(const super& value);                                          \
+  void operator=(const super& value);
 
 // Conditionally include object_service.cc functionality in the vtable to avoid
 // link errors like the following:
@@ -170,37 +163,31 @@
 //
 #ifndef PRODUCT
 #define OBJECT_SERVICE_SUPPORT(object)                                         \
-   protected:  /* NOLINT */                                                    \
+ protected: /* NOLINT */                                                       \
   /* Object is printed as JSON into stream. If ref is true only a header */    \
   /* with an object id is printed. If ref is false the object is fully   */    \
   /* printed.                                                            */    \
-    virtual void PrintJSONImpl(JSONStream* stream, bool ref) const;            \
-    virtual const char* JSONType() const {                                     \
-      return ""#object;                                                        \
-    }
+  virtual void PrintJSONImpl(JSONStream* stream, bool ref) const;              \
+  virtual const char* JSONType() const { return "" #object; }
 #else
-#define OBJECT_SERVICE_SUPPORT(object)                                         \
-   protected:  /* NOLINT */
-#endif  // !PRODUCT
+#define OBJECT_SERVICE_SUPPORT(object) protected: /* NOLINT */
+#endif                                            // !PRODUCT
 
 #define SNAPSHOT_READER_SUPPORT(object)                                        \
-  static Raw##object* ReadFrom(SnapshotReader* reader,                         \
-                               intptr_t object_id,                             \
-                               intptr_t tags,                                  \
-                               Snapshot::Kind,                                 \
+  static Raw##object* ReadFrom(SnapshotReader* reader, intptr_t object_id,     \
+                               intptr_t tags, Snapshot::Kind,                  \
                                bool as_reference);                             \
-  friend class SnapshotReader;                                                 \
+  friend class SnapshotReader;
 
 #define OBJECT_IMPLEMENTATION(object, super)                                   \
- public:  /* NOLINT */                                                         \
-  void operator=(Raw##object* value) {                                         \
-    initializeHandle(this, value);                                             \
-  }                                                                            \
+ public: /* NOLINT */                                                          \
+  void operator=(Raw##object* value) { initializeHandle(this, value); }        \
   void operator^=(RawObject* value) {                                          \
     initializeHandle(this, value);                                             \
     ASSERT(IsNull() || Is##object());                                          \
   }                                                                            \
- protected:  /* NOLINT */                                                      \
+                                                                               \
+ protected: /* NOLINT */                                                       \
   object() : super() {}                                                        \
   BASE_OBJECT_IMPLEMENTATION(object, super)                                    \
   OBJECT_SERVICE_SUPPORT(object)
@@ -213,11 +200,11 @@
   }                                                                            \
   SNAPSHOT_READER_SUPPORT(object)                                              \
   friend class StackFrame;                                                     \
-  friend class Thread;                                                         \
+  friend class Thread;
 
 // This macro is used to denote types that do not have a sub-type.
 #define FINAL_HEAP_OBJECT_IMPLEMENTATION_HELPER(object, rettype, super)        \
- public:  /* NOLINT */                                                         \
+ public: /* NOLINT */                                                          \
   void operator=(Raw##object* value) {                                         \
     raw_ = value;                                                              \
     CHECK_HANDLE();                                                            \
@@ -226,7 +213,8 @@
     raw_ = value;                                                              \
     CHECK_HANDLE();                                                            \
   }                                                                            \
- private:  /* NOLINT */                                                        \
+                                                                               \
+ private: /* NOLINT */                                                         \
   object() : super() {}                                                        \
   BASE_OBJECT_IMPLEMENTATION(object, super)                                    \
   OBJECT_SERVICE_SUPPORT(object)                                               \
@@ -234,49 +222,39 @@
     ASSERT(raw() != null());                                                   \
     return raw()->ptr();                                                       \
   }                                                                            \
-  static intptr_t NextFieldOffset() {                                          \
-    return -kWordSize;                                                         \
-  }                                                                            \
+  static intptr_t NextFieldOffset() { return -kWordSize; }                     \
   SNAPSHOT_READER_SUPPORT(rettype)                                             \
   friend class StackFrame;                                                     \
-  friend class Thread;                                                         \
+  friend class Thread;
 
 #define FINAL_HEAP_OBJECT_IMPLEMENTATION(object, super)                        \
-  FINAL_HEAP_OBJECT_IMPLEMENTATION_HELPER(object, object, super)               \
+  FINAL_HEAP_OBJECT_IMPLEMENTATION_HELPER(object, object, super)
 
 #define MINT_OBJECT_IMPLEMENTATION(object, rettype, super)                     \
-  FINAL_HEAP_OBJECT_IMPLEMENTATION_HELPER(object, rettype, super)              \
+  FINAL_HEAP_OBJECT_IMPLEMENTATION_HELPER(object, rettype, super)
 
 class Object {
  public:
-  virtual ~Object() { }
+  virtual ~Object() {}
 
   RawObject* raw() const { return raw_; }
-  void operator=(RawObject* value) {
-    initializeHandle(this, value);
-  }
+  void operator=(RawObject* value) { initializeHandle(this, value); }
 
   uword CompareAndSwapTags(uword old_tags, uword new_tags) const {
-    return AtomicOperations::CompareAndSwapWord(
-        &raw()->ptr()->tags_, old_tags, new_tags);
+    return AtomicOperations::CompareAndSwapWord(&raw()->ptr()->tags_, old_tags,
+                                                new_tags);
   }
-  bool IsCanonical() const {
-    return raw()->IsCanonical();
-  }
-  void SetCanonical() const {
-    raw()->SetCanonical();
-  }
-  void ClearCanonical() const {
-    raw()->ClearCanonical();
-  }
+  bool IsCanonical() const { return raw()->IsCanonical(); }
+  void SetCanonical() const { raw()->SetCanonical(); }
+  void ClearCanonical() const { raw()->ClearCanonical(); }
   intptr_t GetClassId() const {
-    return !raw()->IsHeapObject() ?
-        static_cast<intptr_t>(kSmiCid) : raw()->GetClassId();
+    return !raw()->IsHeapObject() ? static_cast<intptr_t>(kSmiCid)
+                                  : raw()->GetClassId();
   }
   inline RawClass* clazz() const;
   static intptr_t tags_offset() { return OFFSET_OF(RawObject, tags_); }
 
-  // Class testers.
+// Class testers.
 #define DEFINE_CLASS_TESTER(clazz)                                             \
   virtual bool Is##clazz() const { return false; }
   CLASS_LIST_FOR_HANDLES(DEFINE_CLASS_TESTER);
@@ -296,9 +274,7 @@
 #ifndef PRODUCT
   void PrintJSON(JSONStream* stream, bool ref = true) const;
   virtual void PrintJSONImpl(JSONStream* stream, bool ref) const;
-  virtual const char* JSONType() const {
-    return IsNull() ? "null" : "Object";
-  }
+  virtual const char* JSONType() const { return IsNull() ? "null" : "Object"; }
 #endif
 
   // Returns the name that is used to identify an object in the
@@ -333,27 +309,22 @@
     return *obj;
   }
   static Object* ReadOnlyHandle() {
-    Object* obj = reinterpret_cast<Object*>(
-        Dart::AllocateReadOnlyHandle());
+    Object* obj = reinterpret_cast<Object*>(Dart::AllocateReadOnlyHandle());
     initializeHandle(obj, Object::null());
     return obj;
   }
 
-  static Object& Handle() {
-    return Handle(Thread::Current()->zone(), null_);
-  }
+  static Object& Handle() { return Handle(Thread::Current()->zone(), null_); }
 
-  static Object& Handle(Zone* zone) {
-    return Handle(zone, null_);
-  }
+  static Object& Handle(Zone* zone) { return Handle(zone, null_); }
 
   static Object& Handle(RawObject* raw_ptr) {
     return Handle(Thread::Current()->zone(), raw_ptr);
   }
 
   static Object& ZoneHandle(Zone* zone, RawObject* raw_ptr) {
-    Object* obj = reinterpret_cast<Object*>(
-        VMHandles::AllocateZoneHandle(zone));
+    Object* obj =
+        reinterpret_cast<Object*>(VMHandles::AllocateZoneHandle(zone));
     initializeHandle(obj, raw_ptr);
     return *obj;
   }
@@ -570,10 +541,7 @@
   static const ClassId kClassId = kObjectCid;
 
   // Different kinds of type tests.
-  enum TypeTestKind {
-    kIsSubtypeOf = 0,
-    kIsMoreSpecificThan
-  };
+  enum TypeTestKind { kIsSubtypeOf = 0, kIsMoreSpecificThan };
 
   // Different kinds of name visibility.
   enum NameVisibility {
@@ -619,9 +587,7 @@
   // Used for extracting the C++ vtable during bringup.
   Object() : raw_(null_) {}
 
-  uword raw_value() const {
-    return reinterpret_cast<uword>(raw());
-  }
+  uword raw_value() const { return reinterpret_cast<uword>(raw()); }
 
   inline void SetRaw(RawObject* value);
   void CheckHandle() const;
@@ -629,9 +595,7 @@
   cpp_vtable vtable() const { return bit_copy<cpp_vtable>(*this); }
   void set_vtable(cpp_vtable value) { *vtable_address() = value; }
 
-  static RawObject* Allocate(intptr_t cls_id,
-                             intptr_t size,
-                             Heap::Space space);
+  static RawObject* Allocate(intptr_t cls_id, intptr_t size, Heap::Space space);
 
   static intptr_t RoundedAllocationSize(intptr_t size) {
     return Utils::RoundUp(size, kObjectAlignment);
@@ -645,7 +609,7 @@
   // methods below or their counterparts in RawObject, to ensure that the
   // write barrier is correctly applied.
 
-  template<typename type>
+  template <typename type>
   void StorePointer(type const* addr, type value) const {
     raw()->StorePointer(addr, value);
   }
@@ -671,14 +635,14 @@
     raw()->StoreSmi(addr, value);
   }
 
-  template<typename FieldType>
+  template <typename FieldType>
   void StoreSimd128(const FieldType* addr, simd128_value_t value) const {
     ASSERT(Contains(reinterpret_cast<uword>(addr)));
     value.writeTo(const_cast<FieldType*>(addr));
   }
 
   // Needs two template arguments to allow assigning enums to fixed-size ints.
-  template<typename FieldType, typename ValueType>
+  template <typename FieldType, typename ValueType>
   void StoreNonPointer(const FieldType* addr, ValueType value) const {
     // Can't use Contains, as it uses tags_, which is set through this method.
     ASSERT(reinterpret_cast<uword>(addr) >= RawObject::ToAddr(raw()));
@@ -688,7 +652,7 @@
   // Provides non-const access to non-pointer fields within the object. Such
   // access does not need a write barrier, but it is *not* GC-safe, since the
   // object might move, hence must be fully contained within a NoSafepointScope.
-  template<typename FieldType>
+  template <typename FieldType>
   FieldType* UnsafeMutableNonPointer(const FieldType* addr) const {
     // Allow pointers at the end of variable-length data, and disallow pointers
     // within the header word.
@@ -699,10 +663,10 @@
     return const_cast<FieldType*>(addr);
   }
 
-  // Fail at link time if StoreNonPointer or UnsafeMutableNonPointer is
-  // instantiated with an object pointer type.
+// Fail at link time if StoreNonPointer or UnsafeMutableNonPointer is
+// instantiated with an object pointer type.
 #define STORE_NON_POINTER_ILLEGAL_TYPE(type)                                   \
-  template<typename ValueType>                                                 \
+  template <typename ValueType>                                                \
   void StoreNonPointer(Raw##type* const* addr, ValueType value) const {        \
     UnimplementedMethod();                                                     \
   }                                                                            \
@@ -768,41 +732,41 @@
   // isolates. They are all allocated in the non-GC'd Dart::vm_isolate_.
   static RawObject* null_;
 
-  static RawClass* class_class_;  // Class of the Class vm object.
-  static RawClass* dynamic_class_;  // Class of the 'dynamic' type.
-  static RawClass* void_class_;  // Class of the 'void' type.
+  static RawClass* class_class_;             // Class of the Class vm object.
+  static RawClass* dynamic_class_;           // Class of the 'dynamic' type.
+  static RawClass* void_class_;              // Class of the 'void' type.
   static RawClass* unresolved_class_class_;  // Class of UnresolvedClass.
   static RawClass* type_arguments_class_;  // Class of TypeArguments vm object.
-  static RawClass* patch_class_class_;  // Class of the PatchClass vm object.
-  static RawClass* function_class_;  // Class of the Function vm object.
-  static RawClass* closure_data_class_;  // Class of ClosureData vm obj.
+  static RawClass* patch_class_class_;     // Class of the PatchClass vm object.
+  static RawClass* function_class_;        // Class of the Function vm object.
+  static RawClass* closure_data_class_;    // Class of ClosureData vm obj.
   static RawClass* redirection_data_class_;  // Class of RedirectionData vm obj.
-  static RawClass* field_class_;  // Class of the Field vm object.
-  static RawClass* literal_token_class_;  // Class of LiteralToken vm object.
+  static RawClass* field_class_;             // Class of the Field vm object.
+  static RawClass* literal_token_class_;     // Class of LiteralToken vm object.
   static RawClass* token_stream_class_;  // Class of the TokenStream vm object.
-  static RawClass* script_class_;  // Class of the Script vm object.
-  static RawClass* library_class_;  // Class of the Library vm object.
-  static RawClass* namespace_class_;  // Class of Namespace vm object.
-  static RawClass* code_class_;  // Class of the Code vm object.
+  static RawClass* script_class_;        // Class of the Script vm object.
+  static RawClass* library_class_;       // Class of the Library vm object.
+  static RawClass* namespace_class_;     // Class of Namespace vm object.
+  static RawClass* code_class_;          // Class of the Code vm object.
   static RawClass* instructions_class_;  // Class of the Instructions vm object.
-  static RawClass* object_pool_class_;  // Class of the ObjectPool vm object.
-  static RawClass* pc_descriptors_class_;  // Class of PcDescriptors vm object.
+  static RawClass* object_pool_class_;   // Class of the ObjectPool vm object.
+  static RawClass* pc_descriptors_class_;   // Class of PcDescriptors vm object.
   static RawClass* code_source_map_class_;  // Class of CodeSourceMap vm object.
-  static RawClass* stackmap_class_;  // Class of Stackmap vm object.
+  static RawClass* stackmap_class_;         // Class of Stackmap vm object.
   static RawClass* var_descriptors_class_;  // Class of LocalVarDescriptors.
   static RawClass* exception_handlers_class_;  // Class of ExceptionHandlers.
-  static RawClass* deopt_info_class_;  // Class of DeoptInfo.
-  static RawClass* context_class_;  // Class of the Context vm object.
+  static RawClass* deopt_info_class_;          // Class of DeoptInfo.
+  static RawClass* context_class_;        // Class of the Context vm object.
   static RawClass* context_scope_class_;  // Class of ContextScope vm object.
-  static RawClass* singletargetcache_class_;  // Class of SingleTargetCache.
-  static RawClass* unlinkedcall_class_;  // Class of UnlinkedCall.
-  static RawClass* icdata_class_;  // Class of ICData.
-  static RawClass* megamorphic_cache_class_;  // Class of MegamorphiCache.
-  static RawClass* subtypetestcache_class_;  // Class of SubtypeTestCache.
-  static RawClass* api_error_class_;  // Class of ApiError.
-  static RawClass* language_error_class_;  // Class of LanguageError.
+  static RawClass* singletargetcache_class_;    // Class of SingleTargetCache.
+  static RawClass* unlinkedcall_class_;         // Class of UnlinkedCall.
+  static RawClass* icdata_class_;               // Class of ICData.
+  static RawClass* megamorphic_cache_class_;    // Class of MegamorphiCache.
+  static RawClass* subtypetestcache_class_;     // Class of SubtypeTestCache.
+  static RawClass* api_error_class_;            // Class of ApiError.
+  static RawClass* language_error_class_;       // Class of LanguageError.
   static RawClass* unhandled_exception_class_;  // Class of UnhandledException.
-  static RawClass* unwind_error_class_;  // Class of UnwindError.
+  static RawClass* unwind_error_class_;         // Class of UnwindError.
 
   // The static values below are read-only handle pointers for singleton
   // objects that are shared between the different isolates.
@@ -848,7 +812,7 @@
 
 #define REUSABLE_FRIEND_DECLARATION(name)                                      \
   friend class Reusable##name##HandleScope;
-REUSABLE_HANDLE_LIST(REUSABLE_FRIEND_DECLARATION)
+  REUSABLE_HANDLE_LIST(REUSABLE_FRIEND_DECLARATION)
 #undef REUSABLE_FRIEND_DECLARATION
 
   DISALLOW_ALLOCATION();
@@ -858,16 +822,12 @@
 
 class PassiveObject : public Object {
  public:
-  void operator=(RawObject* value) {
-    raw_ = value;
-  }
-  void operator^=(RawObject* value) {
-    raw_ = value;
-  }
+  void operator=(RawObject* value) { raw_ = value; }
+  void operator^=(RawObject* value) { raw_ = value; }
 
   static PassiveObject& Handle(Zone* zone, RawObject* raw_ptr) {
-    PassiveObject* obj = reinterpret_cast<PassiveObject*>(
-        VMHandles::AllocateHandle(zone));
+    PassiveObject* obj =
+        reinterpret_cast<PassiveObject*>(VMHandles::AllocateHandle(zone));
     obj->raw_ = raw_ptr;
     obj->set_vtable(0);
     return *obj;
@@ -882,8 +842,8 @@
     return Handle(zone, Object::null());
   }
   static PassiveObject& ZoneHandle(Zone* zone, RawObject* raw_ptr) {
-    PassiveObject* obj = reinterpret_cast<PassiveObject*>(
-        VMHandles::AllocateZoneHandle(zone));
+    PassiveObject* obj =
+        reinterpret_cast<PassiveObject*>(VMHandles::AllocateZoneHandle(zone));
     obj->raw_ = raw_ptr;
     obj->set_vtable(0);
     return *obj;
@@ -994,7 +954,7 @@
   // The type parameters (and their bounds) are specified as an array of
   // TypeParameter.
   RawTypeArguments* type_parameters() const {
-      return raw_ptr()->type_parameters_;
+    return raw_ptr()->type_parameters_;
   }
   void set_type_parameters(const TypeArguments& value) const;
   intptr_t NumTypeParameters(Thread* thread) const;
@@ -1110,16 +1070,14 @@
   bool IsDartFunctionClass() const;
 
   // Check if this class represents the 'Closure' class.
-  bool IsClosureClass() const  { return id() == kClosureCid; }
+  bool IsClosureClass() const { return id() == kClosureCid; }
   static bool IsClosureClass(RawClass* cls) {
     NoSafepointScope no_safepoint;
     return cls->ptr()->id_ == kClosureCid;
   }
 
   // Check if this class represents a typedef class.
-  bool IsTypedefClass() const {
-    return signature_function() != Object::null();
-  }
+  bool IsTypedefClass() const { return signature_function() != Object::null(); }
 
   static bool IsInFullSnapshot(RawClass* cls) {
     NoSafepointScope no_safepoint;
@@ -1133,13 +1091,8 @@
                    Error* bound_error,
                    TrailPtr bound_trail,
                    Heap::Space space) const {
-    return TypeTest(kIsSubtypeOf,
-                    type_arguments,
-                    other,
-                    other_type_arguments,
-                    bound_error,
-                    bound_trail,
-                    space);
+    return TypeTest(kIsSubtypeOf, type_arguments, other, other_type_arguments,
+                    bound_error, bound_trail, space);
   }
 
   // Check the 'more specific' relationship.
@@ -1149,13 +1102,8 @@
                           Error* bound_error,
                           TrailPtr bound_trail,
                           Heap::Space space) const {
-    return TypeTest(kIsMoreSpecificThan,
-                    type_arguments,
-                    other,
-                    other_type_arguments,
-                    bound_error,
-                    bound_trail,
-                    space);
+    return TypeTest(kIsMoreSpecificThan, type_arguments, other,
+                    other_type_arguments, bound_error, bound_trail, space);
   }
 
   // Check if this is the top level class.
@@ -1213,14 +1161,16 @@
   // - constants_list_ position of found element, or
   // - constants_list_ position where new canonical can be inserted.
   RawDouble* LookupCanonicalDouble(Zone* zone,
-                                   double value, intptr_t* index) const;
+                                   double value,
+                                   intptr_t* index) const;
   RawMint* LookupCanonicalMint(Zone* zone,
-                               int64_t value, intptr_t* index) const;
+                               int64_t value,
+                               intptr_t* index) const;
   RawBigint* LookupCanonicalBigint(Zone* zone,
-                                   const Bigint& value, intptr_t* index) const;
+                                   const Bigint& value,
+                                   intptr_t* index) const;
   // The methods above are more efficient than this generic one.
-  RawInstance* LookupCanonicalInstance(Zone* zone,
-                                       const Instance& value) const;
+  RawInstance* LookupCanonicalInstance(Zone* zone, const Instance& value) const;
 
   RawInstance* InsertCanonicalConstant(Zone* zone,
                                        const Instance& constant) const;
@@ -1249,9 +1199,7 @@
   }
   void set_is_type_finalized() const;
 
-  bool is_patch() const {
-    return PatchBit::decode(raw_ptr()->state_bits_);
-  }
+  bool is_patch() const { return PatchBit::decode(raw_ptr()->state_bits_); }
   void set_is_patch() const;
 
   bool is_synthesized_class() const {
@@ -1259,27 +1207,25 @@
   }
   void set_is_synthesized_class() const;
 
-  bool is_enum_class() const {
-    return EnumBit::decode(raw_ptr()->state_bits_);
-  }
+  bool is_enum_class() const { return EnumBit::decode(raw_ptr()->state_bits_); }
   void set_is_enum_class() const;
 
   bool is_finalized() const {
-    return ClassFinalizedBits::decode(raw_ptr()->state_bits_)
-        == RawClass::kFinalized;
+    return ClassFinalizedBits::decode(raw_ptr()->state_bits_) ==
+           RawClass::kFinalized;
   }
   void set_is_finalized() const;
 
   bool is_prefinalized() const {
-    return ClassFinalizedBits::decode(raw_ptr()->state_bits_)
-        == RawClass::kPreFinalized;
+    return ClassFinalizedBits::decode(raw_ptr()->state_bits_) ==
+           RawClass::kPreFinalized;
   }
 
   void set_is_prefinalized() const;
 
   bool is_refinalize_after_patch() const {
-    return ClassFinalizedBits::decode(raw_ptr()->state_bits_)
-        == RawClass::kRefinalizeAfterPatch;
+    return ClassFinalizedBits::decode(raw_ptr()->state_bits_) ==
+           RawClass::kRefinalizeAfterPatch;
   }
 
   void SetRefinalizeAfterPatch() const;
@@ -1319,16 +1265,12 @@
   }
   void set_is_allocated(bool value) const;
 
-  uint16_t num_native_fields() const {
-    return raw_ptr()->num_native_fields_;
-  }
+  uint16_t num_native_fields() const { return raw_ptr()->num_native_fields_; }
   void set_num_native_fields(uint16_t value) const {
     StoreNonPointer(&raw_ptr()->num_native_fields_, value);
   }
 
-  RawCode* allocation_stub() const {
-    return raw_ptr()->allocation_stub_;
-  }
+  RawCode* allocation_stub() const { return raw_ptr()->allocation_stub_; }
   void set_allocation_stub(const Code& value) const;
 
   void DisableAllocationStub() const;
@@ -1362,7 +1304,8 @@
   RawError* EnsureIsFinalized(Thread* thread) const;
 
   // Allocate a class used for VM internal objects.
-  template <class FakeObject> static RawClass* New();
+  template <class FakeObject>
+  static RawClass* New();
 
   // Allocate instance classes.
   static RawClass* New(const Library& lib,
@@ -1423,7 +1366,8 @@
   // Tells whether instances need morphing for reload.
   bool RequiresInstanceMorphing(const Class& replacement) const;
 
-  template <class FakeObject> static RawClass* NewCommon(intptr_t index);
+  template <class FakeObject>
+  static RawClass* NewCommon(intptr_t index);
 
   enum MemberKind {
     kAny = 0,
@@ -1452,24 +1396,24 @@
   };
   class ConstBit : public BitField<uint16_t, bool, kConstBit, 1> {};
   class ImplementedBit : public BitField<uint16_t, bool, kImplementedBit, 1> {};
-  class TypeFinalizedBit :
-      public BitField<uint16_t, bool, kTypeFinalizedBit, 1> {};
+  class TypeFinalizedBit
+      : public BitField<uint16_t, bool, kTypeFinalizedBit, 1> {};
   class ClassFinalizedBits : public BitField<uint16_t,
                                              RawClass::ClassFinalizedState,
                                              kClassFinalizedPos,
                                              kClassFinalizedSize> {};
   class AbstractBit : public BitField<uint16_t, bool, kAbstractBit, 1> {};
   class PatchBit : public BitField<uint16_t, bool, kPatchBit, 1> {};
-  class SynthesizedClassBit :
-      public BitField<uint16_t, bool, kSynthesizedClassBit, 1> {};
-  class MarkedForParsingBit :
-      public BitField<uint16_t, bool, kMarkedForParsingBit, 1> {};
-  class MixinAppAliasBit :
-      public BitField<uint16_t, bool, kMixinAppAliasBit, 1> {};
-  class MixinTypeAppliedBit :
-      public BitField<uint16_t, bool, kMixinTypeAppliedBit, 1> {};
-  class FieldsMarkedNullableBit :
-      public BitField<uint16_t, bool, kFieldsMarkedNullableBit, 1> {};
+  class SynthesizedClassBit
+      : public BitField<uint16_t, bool, kSynthesizedClassBit, 1> {};
+  class MarkedForParsingBit
+      : public BitField<uint16_t, bool, kMarkedForParsingBit, 1> {};
+  class MixinAppAliasBit
+      : public BitField<uint16_t, bool, kMixinAppAliasBit, 1> {};
+  class MixinTypeAppliedBit
+      : public BitField<uint16_t, bool, kMixinTypeAppliedBit, 1> {};
+  class FieldsMarkedNullableBit
+      : public BitField<uint16_t, bool, kFieldsMarkedNullableBit, 1> {};
   class CycleFreeBit : public BitField<uint16_t, bool, kCycleFreeBit, 1> {};
   class EnumBit : public BitField<uint16_t, bool, kEnumBit, 1> {};
   class IsAllocatedBit : public BitField<uint16_t, bool, kIsAllocatedBit, 1> {};
@@ -1496,9 +1440,7 @@
   // Initial value for the cached number of type arguments.
   static const intptr_t kUnknownNumTypeArguments = -1;
 
-  int16_t num_type_arguments() const {
-    return raw_ptr()->num_type_arguments_;
-  }
+  int16_t num_type_arguments() const { return raw_ptr()->num_type_arguments_; }
   void set_num_type_arguments(intptr_t value) const;
   static intptr_t num_type_arguments_offset() {
     return OFFSET_OF(RawClass, num_type_arguments_);
@@ -1523,7 +1465,8 @@
                                       const String& name) const;
 
   // Allocate an instance class which has a VM implementation.
-  template <class FakeInstance> static RawClass* New(intptr_t id);
+  template <class FakeInstance>
+  static RawClass* New(intptr_t id);
 
   // Helper that calls 'Class::New<Instance>(kIllegalCid)'.
   static RawClass* NewInstanceClass();
@@ -1537,15 +1480,14 @@
                 TrailPtr bound_trail,
                 Heap::Space space) const;
 
-  static bool TypeTestNonRecursive(
-      const Class& cls,
-      TypeTestKind test_kind,
-      const TypeArguments& type_arguments,
-      const Class& other,
-      const TypeArguments& other_type_arguments,
-      Error* bound_error,
-      TrailPtr bound_trail,
-      Heap::Space space);
+  static bool TypeTestNonRecursive(const Class& cls,
+                                   TypeTestKind test_kind,
+                                   const TypeArguments& type_arguments,
+                                   const Class& other,
+                                   const TypeArguments& other_type_arguments,
+                                   Error* bound_error,
+                                   TrailPtr bound_trail,
+                                   Heap::Space space);
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(Class, Object);
   friend class AbstractType;
@@ -1600,15 +1542,13 @@
   intptr_t Length() const;
   RawAbstractType* TypeAt(intptr_t index) const;
   static intptr_t type_at_offset(intptr_t index) {
-    return OFFSET_OF_RETURNED_VALUE(
-        RawTypeArguments, types) + index * kWordSize;
+    return OFFSET_OF_RETURNED_VALUE(RawTypeArguments, types) +
+           index * kWordSize;
   }
   void SetTypeAt(intptr_t index, const AbstractType& value) const;
 
   // The name of this type argument vector, e.g. "<T, dynamic, List<T>, Smi>".
-  RawString* Name() const {
-    return SubvectorName(0, Length(), kInternalName);
-  }
+  RawString* Name() const { return SubvectorName(0, Length(), kInternalName); }
 
   // The name of this type argument vector, e.g. "<T, dynamic, List<T>, int>".
   // Names of internal classes are mapped to their public interfaces.
@@ -1638,8 +1578,8 @@
                    Error* bound_error,
                    TrailPtr bound_trail,
                    Heap::Space space) const {
-    return TypeTest(kIsSubtypeOf, other, from_index, len,
-                    bound_error, bound_trail, space);
+    return TypeTest(kIsSubtypeOf, other, from_index, len, bound_error,
+                    bound_trail, space);
   }
 
   // Check the 'more specific' relationship, considering only a subvector of
@@ -1650,8 +1590,8 @@
                           Error* bound_error,
                           TrailPtr bound_trail,
                           Heap::Space space) const {
-    return TypeTest(kIsMoreSpecificThan, other, from_index, len,
-                    bound_error, bound_trail, space);
+    return TypeTest(kIsMoreSpecificThan, other, from_index, len, bound_error,
+                    bound_trail, space);
   }
 
   // Check if the vectors are equal (they may be null).
@@ -1693,8 +1633,8 @@
   // 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, TrailPtr trail = NULL) const;
+  RawTypeArguments* CloneUninstantiated(const Class& new_owner,
+                                        TrailPtr trail = NULL) const;
 
   // Canonicalize only if instantiated, otherwise returns 'this'.
   RawTypeArguments* Canonicalize(TrailPtr trail = NULL) const;
@@ -1745,8 +1685,8 @@
     ASSERT(sizeof(RawTypeArguments) ==
            (sizeof(RawObject) + (kNumFields * kWordSize)));
     ASSERT(0 <= len && len <= kMaxElements);
-    return RoundedAllocationSize(
-        sizeof(RawTypeArguments) + (len * kBytesPerElement));
+    return RoundedAllocationSize(sizeof(RawTypeArguments) +
+                                 (len * kBytesPerElement));
   }
 
   intptr_t Hash() const;
@@ -1811,8 +1751,7 @@
   static RawPatchClass* New(const Class& patched_class,
                             const Class& origin_class);
 
-  static RawPatchClass* New(const Class& patched_class,
-                            const Script& source);
+  static RawPatchClass* New(const Class& patched_class, const Script& source);
 
  private:
   void set_patched_class(const Class& value) const;
@@ -1841,11 +1780,11 @@
   }                                                                            \
   static intptr_t name##_offset() {                                            \
     return OFFSET_OF(RawSingleTargetCache, name##_);                           \
-  }                                                                            \
+  }
 
-DEFINE_NON_POINTER_FIELD_ACCESSORS(uword, entry_point);
-DEFINE_NON_POINTER_FIELD_ACCESSORS(intptr_t, lower_limit);
-DEFINE_NON_POINTER_FIELD_ACCESSORS(intptr_t, upper_limit);
+  DEFINE_NON_POINTER_FIELD_ACCESSORS(uword, entry_point);
+  DEFINE_NON_POINTER_FIELD_ACCESSORS(intptr_t, lower_limit);
+  DEFINE_NON_POINTER_FIELD_ACCESSORS(intptr_t, upper_limit);
 #undef DEFINE_NON_POINTER_FIELD_ACCESSORS
 
   static intptr_t InstanceSize() {
@@ -1892,17 +1831,11 @@
 
   void SetOriginal(const ICData& value) const;
 
-  bool IsOriginal() const {
-    return Original() == this->raw();
-  }
+  bool IsOriginal() const { return Original() == this->raw(); }
 
-  RawString* target_name() const {
-    return raw_ptr()->target_name_;
-  }
+  RawString* target_name() const { return raw_ptr()->target_name_; }
 
-  RawArray* arguments_descriptor() const {
-    return raw_ptr()->args_descriptor_;
-  }
+  RawArray* arguments_descriptor() const { return raw_ptr()->args_descriptor_; }
 
   intptr_t NumArgsTested() const;
 
@@ -1920,31 +1853,31 @@
   void Reset(Zone* zone) const;
   void ResetSwitchable(Zone* zone) const;
 
-  // Note: only deopts with reasons before Unknown in this list are recorded in
-  // the ICData. All other reasons are used purely for informational messages
-  // printed during deoptimization itself.
-  #define DEOPT_REASONS(V)                                                     \
-    V(BinarySmiOp)                                                             \
-    V(BinaryMintOp)                                                            \
-    V(DoubleToSmi)                                                             \
-    V(CheckSmi)                                                                \
-    V(Unknown)                                                                 \
-    V(PolymorphicInstanceCallTestFail)                                         \
-    V(UnaryMintOp)                                                             \
-    V(BinaryDoubleOp)                                                          \
-    V(UnaryOp)                                                                 \
-    V(UnboxInteger)                                                            \
-    V(CheckClass)                                                              \
-    V(CheckArrayBound)                                                         \
-    V(AtCall)                                                                  \
-    V(GuardField)                                                              \
-    V(TestCids)                                                                \
-    V(NumReasons)                                                              \
+// Note: only deopts with reasons before Unknown in this list are recorded in
+// the ICData. All other reasons are used purely for informational messages
+// printed during deoptimization itself.
+#define DEOPT_REASONS(V)                                                       \
+  V(BinarySmiOp)                                                               \
+  V(BinaryMintOp)                                                              \
+  V(DoubleToSmi)                                                               \
+  V(CheckSmi)                                                                  \
+  V(Unknown)                                                                   \
+  V(PolymorphicInstanceCallTestFail)                                           \
+  V(UnaryMintOp)                                                               \
+  V(BinaryDoubleOp)                                                            \
+  V(UnaryOp)                                                                   \
+  V(UnboxInteger)                                                              \
+  V(CheckClass)                                                                \
+  V(CheckArrayBound)                                                           \
+  V(AtCall)                                                                    \
+  V(GuardField)                                                                \
+  V(TestCids)                                                                  \
+  V(NumReasons)
 
   enum DeoptReasonId {
-  #define DEFINE_ENUM_LIST(name) kDeopt##name,
-  DEOPT_REASONS(DEFINE_ENUM_LIST)
-  #undef DEFINE_ENUM_LIST
+#define DEFINE_ENUM_LIST(name) kDeopt##name,
+    DEOPT_REASONS(DEFINE_ENUM_LIST)
+#undef DEFINE_ENUM_LIST
   };
 
   static const intptr_t kLastRecordedDeoptReason = kDeoptUnknown - 1;
@@ -1985,9 +1918,7 @@
     return OFFSET_OF(RawICData, state_bits_);
   }
 
-  static intptr_t NumArgsTestedShift() {
-    return kNumArgsTestedPos;
-  }
+  static intptr_t NumArgsTestedShift() { return kNumArgsTestedPos; }
 
   static intptr_t NumArgsTestedMask() {
     return ((1 << kNumArgsTestedSize) - 1) << kNumArgsTestedPos;
@@ -1997,13 +1928,9 @@
     return OFFSET_OF(RawICData, args_descriptor_);
   }
 
-  static intptr_t ic_data_offset() {
-    return OFFSET_OF(RawICData, ic_data_);
-  }
+  static intptr_t ic_data_offset() { return OFFSET_OF(RawICData, ic_data_); }
 
-  static intptr_t owner_offset() {
-    return OFFSET_OF(RawICData, owner_);
-  }
+  static intptr_t owner_offset() { return OFFSET_OF(RawICData, owner_); }
 
   // Replaces entry |index| with the sentinel.
   void WriteSentinelAt(intptr_t index) const;
@@ -2082,8 +2009,8 @@
   RawICData* AsUnaryClassChecks() const {
     return AsUnaryClassChecksForArgNr(0);
   }
-  RawICData* AsUnaryClassChecksForCid(
-      intptr_t cid, const Function& target) const;
+  RawICData* AsUnaryClassChecksForCid(intptr_t cid,
+                                      const Function& target) const;
 
   // Returns ICData with aggregated receiver count, sorted by highest count.
   // Smi not first!! (the convention for ICData used in code generation is that
@@ -2111,16 +2038,10 @@
 
   static intptr_t TestEntryLengthFor(intptr_t num_args);
 
-  static intptr_t TargetIndexFor(intptr_t num_args) {
-    return num_args;
-  }
-  static intptr_t CodeIndexFor(intptr_t num_args) {
-    return num_args;
-  }
+  static intptr_t TargetIndexFor(intptr_t num_args) { return num_args; }
+  static intptr_t CodeIndexFor(intptr_t num_args) { return num_args; }
 
-  static intptr_t CountIndexFor(intptr_t num_args) {
-    return (num_args + 1);
-  }
+  static intptr_t CountIndexFor(intptr_t num_args) { return (num_args + 1); }
   static intptr_t EntryPointIndexFor(intptr_t num_args) {
     return (num_args + 1);
   }
@@ -2136,9 +2057,7 @@
   // Initialize the preallocated empty ICData entry arrays.
   static void InitOnce();
 
-  enum {
-    kCachedICDataArrayCount = 4
-  };
+  enum { kCachedICDataArrayCount = 4 };
 
 #if defined(TAG_IC_DATA)
   void set_tag(intptr_t value) const;
@@ -2151,9 +2070,7 @@
  private:
   static RawICData* New();
 
-  RawArray* ic_data() const {
-    return raw_ptr()->ic_data_;
-  }
+  RawArray* ic_data() const { return raw_ptr()->ic_data_; }
 
   void set_owner(const Function& value) const;
   void set_target_name(const String& value) const;
@@ -2256,8 +2173,8 @@
   // scope class and its type parameters.
   RawString* UserVisibleSignature() const {
     const bool instantiate = false;
-    return BuildSignature(
-        instantiate, kUserVisibleName, TypeArguments::Handle());
+    return BuildSignature(instantiate, kUserVisibleName,
+                          TypeArguments::Handle());
   }
 
   // Build a string of the form '(A, {B b, C c}) => D' representing the
@@ -2313,7 +2230,7 @@
   // The type parameters (and their bounds) are specified as an array of
   // TypeParameter.
   RawTypeArguments* type_parameters() const {
-      return raw_ptr()->type_parameters_;
+    return raw_ptr()->type_parameters_;
   }
   void set_type_parameters(const TypeArguments& value) const;
   intptr_t NumTypeParameters(Thread* thread) const;
@@ -2347,9 +2264,7 @@
 
   // Return the most recently compiled and installed code for this function.
   // It is not the only Code object that points to this function.
-  RawCode* CurrentCode() const {
-    return raw_ptr()->code_;
-  }
+  RawCode* CurrentCode() const { return raw_ptr()->code_; }
 
   RawCode* unoptimized_code() const {
 #if defined(DART_PRECOMPILED_RUNTIME)
@@ -2361,9 +2276,7 @@
   void set_unoptimized_code(const Code& value) const;
   bool HasCode() const;
 
-  static intptr_t code_offset() {
-    return OFFSET_OF(RawFunction, code_);
-  }
+  static intptr_t code_offset() { return OFFSET_OF(RawFunction, code_); }
 
   static intptr_t entry_point_offset() {
     return OFFSET_OF(RawFunction, entry_point_);
@@ -2506,7 +2419,7 @@
 #else
     return raw_ptr()->end_token_pos_;
 #endif
-}
+  }
   void set_end_token_pos(TokenPosition value) const {
 #if defined(DART_PRECOMPILED_RUNTIME)
     UNREACHABLE();
@@ -2700,12 +2613,8 @@
                    const TypeArguments& other_type_arguments,
                    Error* bound_error,
                    Heap::Space space) const {
-    return TypeTest(kIsSubtypeOf,
-                    type_arguments,
-                    other,
-                    other_type_arguments,
-                    bound_error,
-                    space);
+    return TypeTest(kIsSubtypeOf, type_arguments, other, other_type_arguments,
+                    bound_error, space);
   }
 
   // Returns true if the type of this function is more specific than the type of
@@ -2715,12 +2624,8 @@
                           const TypeArguments& other_type_arguments,
                           Error* bound_error,
                           Heap::Space space) const {
-    return TypeTest(kIsMoreSpecificThan,
-                    type_arguments,
-                    other,
-                    other_type_arguments,
-                    bound_error,
-                    space);
+    return TypeTest(kIsMoreSpecificThan, type_arguments, other,
+                    other_type_arguments, bound_error, space);
   }
 
   // Check the subtype or 'more specific' relationship.
@@ -2786,9 +2691,7 @@
   bool IsConstructorClosureFunction() const;
 
   // Returns true if this function represents a local function.
-  bool IsLocalFunction() const {
-    return parent_function() != Function::null();
-  }
+  bool IsLocalFunction() const { return parent_function() != Function::null(); }
 
   // Returns true if this function represents a signature function without code.
   bool IsSignatureFunction() const {
@@ -2797,43 +2700,37 @@
   static bool IsSignatureFunction(RawFunction* function) {
     NoSafepointScope no_safepoint;
     return KindBits::decode(function->ptr()->kind_tag_) ==
-        RawFunction::kSignatureFunction;
+           RawFunction::kSignatureFunction;
   }
 
-  bool IsAsyncFunction() const {
-    return modifier() == RawFunction::kAsync;
-  }
+  bool IsAsyncFunction() const { return modifier() == RawFunction::kAsync; }
 
   bool IsAsyncClosure() const {
     return is_generated_body() &&
-        Function::Handle(parent_function()).IsAsyncFunction();
+           Function::Handle(parent_function()).IsAsyncFunction();
   }
 
   bool IsGenerator() const {
     return (modifier() & RawFunction::kGeneratorBit) != 0;
   }
 
-  bool IsSyncGenerator() const {
-    return modifier() == RawFunction::kSyncGen;
-  }
+  bool IsSyncGenerator() const { return modifier() == RawFunction::kSyncGen; }
 
   bool IsSyncGenClosure() const {
     return is_generated_body() &&
-        Function::Handle(parent_function()).IsSyncGenerator();
+           Function::Handle(parent_function()).IsSyncGenerator();
   }
 
   bool IsGeneratorClosure() const {
     return is_generated_body() &&
-        Function::Handle(parent_function()).IsGenerator();
+           Function::Handle(parent_function()).IsGenerator();
   }
 
-  bool IsAsyncGenerator() const {
-    return modifier() == RawFunction::kAsyncGen;
-  }
+  bool IsAsyncGenerator() const { return modifier() == RawFunction::kAsyncGen; }
 
   bool IsAsyncGenClosure() const {
     return is_generated_body() &&
-        Function::Handle(parent_function()).IsAsyncGenerator();
+           Function::Handle(parent_function()).IsAsyncGenerator();
   }
 
   bool IsAsyncOrGenerator() const {
@@ -2918,29 +2815,29 @@
 #endif
   }
 
-  // static: Considered during class-side or top-level resolution rather than
-  //         instance-side resolution.
-  // const: Valid target of a const constructor call.
-  // abstract: Skipped during instance-side resolution.
-  // reflectable: Enumerated by mirrors, invocable by mirrors. False for private
-  //              functions of dart: libraries.
-  // debuggable: Valid location of a breakpoint. Synthetic code is not
-  //             debuggable.
-  // visible: Frame is included in stack traces. Synthetic code such as
-  //          dispatchers is not visible. Synthetic code that can trigger
-  //          exceptions such as the outer async functions that create Futures
-  //          is visible.
-  // optimizable: Candidate for going through the optimizing compiler. False for
-  //              some functions known to be execute infrequently and functions
-  //              which have been de-optimized too many times.
-  // instrinsic: Has a hand-written assembly prologue.
-  // inlinable: Candidate for inlining. False for functions with features we
-  //            don't support during inlining (e.g., optional parameters),
-  //            functions which are too big, etc.
-  // native: Bridge to C/C++ code.
-  // redirecting: Redirecting generative or factory constructor.
-  // external: Just a declaration that expects to be defined in another patch
-  //           file.
+// static: Considered during class-side or top-level resolution rather than
+//         instance-side resolution.
+// const: Valid target of a const constructor call.
+// abstract: Skipped during instance-side resolution.
+// reflectable: Enumerated by mirrors, invocable by mirrors. False for private
+//              functions of dart: libraries.
+// debuggable: Valid location of a breakpoint. Synthetic code is not
+//             debuggable.
+// visible: Frame is included in stack traces. Synthetic code such as
+//          dispatchers is not visible. Synthetic code that can trigger
+//          exceptions such as the outer async functions that create Futures
+//          is visible.
+// optimizable: Candidate for going through the optimizing compiler. False for
+//              some functions known to be execute infrequently and functions
+//              which have been de-optimized too many times.
+// instrinsic: Has a hand-written assembly prologue.
+// inlinable: Candidate for inlining. False for functions with features we
+//            don't support during inlining (e.g., optional parameters),
+//            functions which are too big, etc.
+// native: Bridge to C/C++ code.
+// redirecting: Redirecting generative or factory constructor.
+// external: Just a declaration that expects to be defined in another patch
+//           file.
 
 #define FOR_EACH_FUNCTION_KIND_BIT(V)                                          \
   V(Static, is_static)                                                         \
@@ -2959,16 +2856,14 @@
   V(AllowsBoundsCheckGeneralization, allows_bounds_check_generalization)       \
   V(GeneratedBody, is_generated_body)                                          \
   V(AlwaysInline, always_inline)                                               \
-  V(PolymorphicTarget, is_polymorphic_target)                                  \
+  V(PolymorphicTarget, is_polymorphic_target)
 
 #define DEFINE_ACCESSORS(name, accessor_name)                                  \
   void set_##accessor_name(bool value) const {                                 \
     set_kind_tag(name##Bit::update(value, raw_ptr()->kind_tag_));              \
   }                                                                            \
-  bool accessor_name() const {                                                 \
-    return name##Bit::decode(raw_ptr()->kind_tag_);                            \
-  }
-FOR_EACH_FUNCTION_KIND_BIT(DEFINE_ACCESSORS)
+  bool accessor_name() const { return name##Bit::decode(raw_ptr()->kind_tag_); }
+  FOR_EACH_FUNCTION_KIND_BIT(DEFINE_ACCESSORS)
 #undef DEFINE_ACCESSORS
 
  private:
@@ -2983,21 +2878,23 @@
     kModifierPos = kRecognizedTagPos + kRecognizedTagSize,
     kModifierSize = 2,
     kLastModifierBitPos = kModifierPos + (kModifierSize - 1),
-    // Single bit sized fields start here.
+// Single bit sized fields start here.
 #define DECLARE_BIT(name, _) k##name##Bit,
-FOR_EACH_FUNCTION_KIND_BIT(DECLARE_BIT)
+    FOR_EACH_FUNCTION_KIND_BIT(DECLARE_BIT)
 #undef DECLARE_BIT
-    kNumTagBits
+        kNumTagBits
   };
 
-  COMPILE_ASSERT(
-      MethodRecognizer::kNumRecognizedMethods < (1 << kRecognizedTagSize));
-  COMPILE_ASSERT(
-      kNumTagBits <=
-      (kBitsPerByte * sizeof(static_cast<RawFunction*>(0)->kind_tag_)));
+  COMPILE_ASSERT(MethodRecognizer::kNumRecognizedMethods <
+                 (1 << kRecognizedTagSize));
+  COMPILE_ASSERT(kNumTagBits <=
+                 (kBitsPerByte *
+                  sizeof(static_cast<RawFunction*>(0)->kind_tag_)));
 
-  class KindBits :
-    public BitField<uint32_t, RawFunction::Kind, kKindTagPos, kKindTagSize> {};
+  class KindBits : public BitField<uint32_t,
+                                   RawFunction::Kind,
+                                   kKindTagPos,
+                                   kKindTagSize> {};
 
   class RecognizedBits : public BitField<uint32_t,
                                          MethodRecognizer::Kind,
@@ -3008,9 +2905,9 @@
                                        kModifierPos,
                                        kModifierSize> {};
 
-#define DEFINE_BIT(name, _) \
+#define DEFINE_BIT(name, _)                                                    \
   class name##Bit : public BitField<uint32_t, bool, k##name##Bit, 1> {};
-FOR_EACH_FUNCTION_KIND_BIT(DEFINE_BIT)
+  FOR_EACH_FUNCTION_KIND_BIT(DEFINE_BIT)
 #undef DEFINE_BIT
 
   void set_name(const String& value) const;
@@ -3064,7 +2961,7 @@
 };
 
 
-class ClosureData: public Object {
+class ClosureData : public Object {
  public:
   static intptr_t InstanceSize() {
     return RoundedAllocationSize(sizeof(RawClosureData));
@@ -3082,9 +2979,7 @@
   RawType* signature_type() const { return raw_ptr()->signature_type_; }
   void set_signature_type(const Type& value) const;
 
-  RawInstance* implicit_static_closure() const {
-    return raw_ptr()->closure_;
-  }
+  RawInstance* implicit_static_closure() const { return raw_ptr()->closure_; }
   void set_implicit_static_closure(const Instance& closure) const;
 
   static RawClosureData* New();
@@ -3096,7 +2991,7 @@
 };
 
 
-class RedirectionData: public Object {
+class RedirectionData : public Object {
  public:
   static intptr_t InstanceSize() {
     return RoundedAllocationSize(sizeof(RawRedirectionData));
@@ -3194,7 +3089,7 @@
   RawScript* Script() const;
   RawObject* RawOwner() const;
 
-  RawAbstractType* type() const  { return raw_ptr()->type_; }
+  RawAbstractType* type() const { return raw_ptr()->type_; }
   // Used by class finalizer, otherwise initialized in constructor.
   void SetFieldType(const AbstractType& value) const;
 
@@ -3242,8 +3137,8 @@
   void set_has_initializer(bool has_initializer) const {
     ASSERT(IsOriginal());
     ASSERT(Thread::Current()->IsMutatorThread());
-    set_kind_bits(HasInitializerBit::update(has_initializer,
-                                            raw_ptr()->kind_bits_));
+    set_kind_bits(
+        HasInitializerBit::update(has_initializer, raw_ptr()->kind_bits_));
   }
 
   // Return class id that any non-null value read from this field is guaranteed
@@ -3290,9 +3185,7 @@
 
   const char* GuardedPropertiesAsCString() const;
 
-  intptr_t UnboxedFieldCid() const {
-    return guarded_cid();
-  }
+  intptr_t UnboxedFieldCid() const { return guarded_cid(); }
 
   bool is_unboxing_candidate() const {
     return UnboxingCandidateBit::decode(raw_ptr()->kind_bits_);
@@ -3316,9 +3209,7 @@
   // Internally we is_nullable_ field contains either kNullCid (nullable) or
   // any other value (non-nullable) instead of boolean. This is done to simplify
   // guarding sequence in the generated code.
-  bool is_nullable() const {
-    return raw_ptr()->is_nullable_ == kNullCid;
-  }
+  bool is_nullable() const { return raw_ptr()->is_nullable_ == kNullCid; }
   void set_is_nullable(bool val) const {
     ASSERT(Thread::Current()->IsMutatorThread());
     StoreNonPointer(&raw_ptr()->is_nullable_, val ? kNullCid : kIllegalCid);
@@ -3408,13 +3299,13 @@
   class ConstBit : public BitField<uint8_t, bool, kConstBit, 1> {};
   class StaticBit : public BitField<uint8_t, bool, kStaticBit, 1> {};
   class FinalBit : public BitField<uint8_t, bool, kFinalBit, 1> {};
-  class HasInitializerBit :
-      public BitField<uint8_t, bool, kHasInitializerBit, 1> {};
-  class UnboxingCandidateBit :
-      public BitField<uint8_t, bool, kUnboxingCandidateBit, 1> {};
+  class HasInitializerBit
+      : public BitField<uint8_t, bool, kHasInitializerBit, 1> {};
+  class UnboxingCandidateBit
+      : public BitField<uint8_t, bool, kUnboxingCandidateBit, 1> {};
   class ReflectableBit : public BitField<uint8_t, bool, kReflectableBit, 1> {};
-  class DoubleInitializedBit :
-      public BitField<uint8_t, bool, kDoubleInitializedBit, 1> {};
+  class DoubleInitializedBit
+      : public BitField<uint8_t, bool, kDoubleInitializedBit, 1> {};
 
   // Update guarded cid and guarded length for this field. Returns true, if
   // deoptimization of dependent code is required.
@@ -3487,8 +3378,7 @@
   void SetStream(const ExternalTypedData& stream) const;
 
   RawString* GenerateSource() const;
-  RawString* GenerateSource(TokenPosition start,
-                            TokenPosition end) const;
+  RawString* GenerateSource(TokenPosition start, TokenPosition end) const;
   intptr_t ComputeSourcePosition(TokenPosition tok_pos) const;
 
   RawString* PrivateKey() const;
@@ -3512,10 +3402,7 @@
   // in a TokenStream object.
   class Iterator : ValueObject {
    public:
-    enum StreamType {
-      kNoNewlines,
-      kAllTokens
-    };
+    enum StreamType { kNoNewlines, kAllTokens };
 
     Iterator(Zone* zone,
              const TokenStream& tokens,
@@ -3525,9 +3412,7 @@
     void SetStream(const TokenStream& tokens, TokenPosition token_pos);
     bool IsValid() const;
 
-    inline Token::Kind CurrentTokenKind() const {
-      return cur_token_kind_;
-    }
+    inline Token::Kind CurrentTokenKind() const { return cur_token_kind_; }
 
     Token::Kind LookaheadTokenKind(intptr_t num_tokens);
 
@@ -3566,7 +3451,7 @@
   static RawTokenStream* New();
   static void DataFinalizer(void* isolate_callback_data,
                             Dart_WeakPersistentHandle handle,
-                            void *peer);
+                            void* peer);
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(TokenStream, Object);
   friend class Class;
@@ -3600,8 +3485,7 @@
 
   RawTokenStream* tokens() const { return raw_ptr()->tokens_; }
 
-  void Tokenize(const String& private_key,
-                bool use_shared_tokens = true) const;
+  void Tokenize(const String& private_key, bool use_shared_tokens = true) const;
 
   RawLibrary* FindLibrary() const;
   RawString* GetLine(intptr_t line_number,
@@ -3669,7 +3553,7 @@
 
   const Array& array_;
   const int size_;  // Number of elements to iterate over.
-  int next_ix_;  // Index of next element.
+  int next_ix_;     // Index of next element.
 
   friend class ClassDictionaryIterator;
   friend class LibraryPrefixIterator;
@@ -3690,7 +3574,7 @@
                           IterationKind kind = kNoIteratePrivate);
 
   bool HasNext() const {
-      return (next_ix_ < size_) || !toplevel_class_.IsNull();
+    return (next_ix_ < size_) || !toplevel_class_.IsNull();
   }
 
   // Returns a non-null raw class.
@@ -3709,6 +3593,7 @@
  public:
   explicit LibraryPrefixIterator(const Library& library);
   RawLibraryPrefix* GetNext();
+
  private:
   void Advance();
   DISALLOW_COPY_AND_ASSIGN(LibraryPrefixIterator);
@@ -3804,17 +3689,14 @@
                         const Object& tl_owner,
                         TokenPosition token_pos) const;
   void AddFieldMetadata(const Field& field, TokenPosition token_pos) const;
-  void AddFunctionMetadata(const Function& func,
-                           TokenPosition token_pos) const;
+  void AddFunctionMetadata(const Function& func, TokenPosition token_pos) const;
   void AddLibraryMetadata(const Object& tl_owner,
                           TokenPosition token_pos) const;
   void AddTypeParameterMetadata(const TypeParameter& param,
                                 TokenPosition token_pos) const;
   RawObject* GetMetadata(const Object& obj) const;
 
-  RawClass* toplevel_class() const {
-    return raw_ptr()->toplevel_class_;
-  }
+  RawClass* toplevel_class() const { return raw_ptr()->toplevel_class_; }
   void set_toplevel_class(const Class& value) const;
 
   RawGrowableObjectArray* patch_classes() const {
@@ -3866,23 +3748,17 @@
   static void RegisterLibraries(Thread* thread,
                                 const GrowableObjectArray& libs);
 
-  bool IsDebuggable() const {
-    return raw_ptr()->debuggable_;
-  }
+  bool IsDebuggable() const { return raw_ptr()->debuggable_; }
   void set_debuggable(bool value) const {
     StoreNonPointer(&raw_ptr()->debuggable_, value);
   }
 
-  bool is_dart_scheme() const {
-    return raw_ptr()->is_dart_scheme_;
-  }
+  bool is_dart_scheme() const { return raw_ptr()->is_dart_scheme_; }
   void set_is_dart_scheme(bool value) const {
     StoreNonPointer(&raw_ptr()->is_dart_scheme_, value);
   }
 
-  bool IsCoreLibrary() const {
-    return raw() == CoreLibrary();
-  }
+  bool IsCoreLibrary() const { return raw() == CoreLibrary(); }
 
   inline intptr_t UrlHash() const;
 
@@ -3900,7 +3776,9 @@
   static RawLibrary* InternalLibrary();
   static RawLibrary* IsolateLibrary();
   static RawLibrary* MathLibrary();
+#if !defined(PRODUCT)
   static RawLibrary* MirrorsLibrary();
+#endif
   static RawLibrary* NativeWrappersLibrary();
   static RawLibrary* ProfilerLibrary();
   static RawLibrary* TypedDataLibrary();
@@ -3930,7 +3808,7 @@
                                   const char* function_name);
 
   // Character used to indicate a private identifier.
-  static const char kPrivateIdentifierStart  = '_';
+  static const char kPrivateIdentifierStart = '_';
 
   // Character used to separate private identifiers from
   // the library-specific key.
@@ -3969,9 +3847,8 @@
 
   void InitImportList() const;
   void GrowDictionary(const Array& dict, intptr_t dict_size) const;
-  static RawLibrary* NewLibraryHelper(const String& url,
-                                      bool import_core_lib);
-  RawObject* LookupEntry(const String& name, intptr_t *index) const;
+  static RawLibrary* NewLibraryHelper(const String& url, bool import_core_lib);
+  RawObject* LookupEntry(const String& name, intptr_t* index) const;
 
   void AllocatePrivateKey() const;
 
@@ -4040,9 +3917,9 @@
   };
 
   struct Entry {
-    Entry() : raw_value_(), type_() { }
-    explicit Entry(const Object* obj) : obj_(obj), type_(kTaggedObject) { }
-    Entry(uword value, EntryType info) : raw_value_(value), type_(info) { }
+    Entry() : raw_value_(), type_() {}
+    explicit Entry(const Object* obj) : obj_(obj), type_(kTaggedObject) {}
+    Entry(uword value, EntryType info) : raw_value_(value), type_(info) {}
     union {
       const Object* obj_;
       uword raw_value_;
@@ -4050,16 +3927,12 @@
     EntryType type_;
   };
 
-  intptr_t Length() const {
-    return raw_ptr()->length_;
-  }
+  intptr_t Length() const { return raw_ptr()->length_; }
   void SetLength(intptr_t value) const {
     StoreNonPointer(&raw_ptr()->length_, value);
   }
 
-  RawTypedData* info_array() const {
-    return raw_ptr()->info_array_;
-  }
+  RawTypedData* info_array() const { return raw_ptr()->info_array_; }
 
   void set_info_array(const TypedData& info_array) const;
 
@@ -4068,8 +3941,8 @@
     return OFFSET_OF_RETURNED_VALUE(RawObjectPool, data);
   }
   static intptr_t element_offset(intptr_t index) {
-    return OFFSET_OF_RETURNED_VALUE(RawObjectPool, data)
-        + kBytesPerElement * index;
+    return OFFSET_OF_RETURNED_VALUE(RawObjectPool, data) +
+           kBytesPerElement * index;
   }
 
   EntryType InfoAt(intptr_t index) const;
@@ -4105,8 +3978,8 @@
     // Ensure that variable length data is not adding to the object length.
     ASSERT(sizeof(RawObjectPool) == (sizeof(RawObject) + (2 * kWordSize)));
     ASSERT(0 <= len && len <= kMaxElements);
-    return RoundedAllocationSize(
-        sizeof(RawObjectPool) + (len * kBytesPerElement));
+    return RoundedAllocationSize(sizeof(RawObjectPool) +
+                                 (len * kBytesPerElement));
   }
 
   static RawObjectPool* New(intptr_t len);
@@ -4139,20 +4012,33 @@
 
 class Instructions : public Object {
  public:
-  // Excludes HeaderSize().
-  intptr_t size() const { return abs(raw_ptr()->size_); }
-  bool HasSingleEntryPoint() const { return raw_ptr()->size_ >= 0; }
+  enum {
+    kSizePos = 0,
+    kSizeSize = 31,
+    kFlagsPos = kSizePos + kSizeSize,
+    kFlagsSize = 1,  // Currently, only flag is single entry flag.
+  };
 
-  uword PayloadStart() const {
-    return PayloadStart(raw());
+  class SizeBits : public BitField<uint32_t, uint32_t, kSizePos, kSizeSize> {};
+  class FlagsBits : public BitField<uint32_t, bool, kFlagsPos, kFlagsSize> {};
+
+  // Excludes HeaderSize().
+  intptr_t Size() const { return SizeBits::decode(raw_ptr()->size_and_flags_); }
+  static intptr_t Size(const RawInstructions* instr) {
+    return SizeBits::decode(instr->ptr()->size_and_flags_);
   }
-  uword CheckedEntryPoint() const {
-    return CheckedEntryPoint(raw());
+
+  bool HasSingleEntryPoint() const {
+    return FlagsBits::decode(raw_ptr()->size_and_flags_);
   }
-  uword UncheckedEntryPoint() const {
-    return UncheckedEntryPoint(raw());
+  static bool HasSingleEntryPoint(const RawInstructions* instr) {
+    return FlagsBits::decode(instr->ptr()->size_and_flags_);
   }
-  static uword PayloadStart(RawInstructions* instr) {
+
+  uword PayloadStart() const { return PayloadStart(raw()); }
+  uword CheckedEntryPoint() const { return CheckedEntryPoint(raw()); }
+  uword UncheckedEntryPoint() const { return UncheckedEntryPoint(raw()); }
+  static uword PayloadStart(const RawInstructions* instr) {
     return reinterpret_cast<uword>(instr->ptr()) + HeaderSize();
   }
 
@@ -4178,25 +4064,24 @@
 #error Missing entry offsets for current architecture
 #endif
 
-  static uword CheckedEntryPoint(RawInstructions* instr) {
+  static uword CheckedEntryPoint(const RawInstructions* instr) {
     uword entry = PayloadStart(instr);
-    if (instr->ptr()->size_ < 0) {
+    if (!HasSingleEntryPoint(instr)) {
       entry += kCheckedEntryOffset;
     }
     return entry;
   }
-  static uword UncheckedEntryPoint(RawInstructions* instr) {
+  static uword UncheckedEntryPoint(const RawInstructions* instr) {
     uword entry = PayloadStart(instr);
-    if (instr->ptr()->size_ < 0) {
+    if (!HasSingleEntryPoint(instr)) {
       entry += kUncheckedEntryOffset;
     }
     return entry;
   }
 
-  static const intptr_t kMaxElements = (kMaxInt32 -
-                                        (sizeof(RawInstructions) +
-                                         sizeof(RawObject) +
-                                         (2 * OS::kMaxPreferredCodeAlignment)));
+  static const intptr_t kMaxElements =
+      (kMaxInt32 - (sizeof(RawInstructions) + sizeof(RawObject) +
+                    (2 * OS::kMaxPreferredCodeAlignment)));
 
   static intptr_t InstanceSize() {
     ASSERT(sizeof(RawInstructions) ==
@@ -4205,8 +4090,8 @@
   }
 
   static intptr_t InstanceSize(intptr_t size) {
-    intptr_t instructions_size = Utils::RoundUp(size,
-                                                OS::PreferredCodeAlignment());
+    intptr_t instructions_size =
+        Utils::RoundUp(size, OS::PreferredCodeAlignment());
     intptr_t result = instructions_size + HeaderSize();
     ASSERT(result % OS::PreferredCodeAlignment() == 0);
     return result;
@@ -4218,21 +4103,28 @@
   }
 
   static RawInstructions* FromPayloadStart(uword payload_start) {
-    return reinterpret_cast<RawInstructions*>(
-        payload_start - HeaderSize() + kHeapObjectTag);
+    return reinterpret_cast<RawInstructions*>(payload_start - HeaderSize() +
+                                              kHeapObjectTag);
   }
 
   bool Equals(const Instructions& other) const {
-    if (size() != other.size()) {
+    if (Size() != other.Size()) {
       return false;
     }
     NoSafepointScope no_safepoint;
-    return memcmp(raw_ptr(), other.raw_ptr(), InstanceSize(size())) == 0;
+    return memcmp(raw_ptr(), other.raw_ptr(), InstanceSize(Size())) == 0;
   }
 
  private:
-  void set_size(intptr_t size) const {
-    StoreNonPointer(&raw_ptr()->size_, size);
+  void SetSize(intptr_t value) const {
+    ASSERT(value >= 0);
+    StoreNonPointer(&raw_ptr()->size_and_flags_,
+                    SizeBits::update(value, raw_ptr()->size_and_flags_));
+  }
+
+  void SetHasSingleEntryPoint(bool value) const {
+    StoreNonPointer(&raw_ptr()->size_and_flags_,
+                    FlagsBits::update(value, raw_ptr()->size_and_flags_));
   }
 
   // New is a private method as RawInstruction and RawCode objects should
@@ -4267,13 +4159,14 @@
 
   static intptr_t InstanceSize() {
     ASSERT(sizeof(RawLocalVarDescriptors) ==
-        OFFSET_OF_RETURNED_VALUE(RawLocalVarDescriptors, names));
+           OFFSET_OF_RETURNED_VALUE(RawLocalVarDescriptors, names));
     return 0;
   }
   static intptr_t InstanceSize(intptr_t len) {
     ASSERT(0 <= len && len <= kMaxElements);
-    return RoundedAllocationSize(sizeof(RawLocalVarDescriptors)
-        + (len * kWordSize)  // RawStrings for names.
+    return RoundedAllocationSize(
+        sizeof(RawLocalVarDescriptors) +
+        (len * kWordSize)  // RawStrings for names.
         + (len * sizeof(RawLocalVarDescriptors::VarInfo)));
   }
 
@@ -4332,8 +4225,7 @@
           cur_kind_(0),
           cur_deopt_id_(0),
           cur_token_pos_(0),
-          cur_try_index_(0) {
-    }
+          cur_try_index_(0) {}
 
     bool MoveNext() {
       // Moves to record that matches kind_mask_.
@@ -4447,8 +4339,7 @@
         : code_source_map_(code_source_map),
           byte_index_(0),
           cur_pc_offset_(0),
-          cur_token_pos_(0) {
-    }
+          cur_token_pos_(0) {}
 
     bool MoveNext() {
       // Moves to the next record.
@@ -4528,8 +4419,7 @@
   static intptr_t InstanceSize(intptr_t length) {
     ASSERT(length >= 0);
     // The stackmap payload is in an array of bytes.
-    intptr_t payload_size =
-        Utils::RoundUp(length, kBitsPerByte) / kBitsPerByte;
+    intptr_t payload_size = Utils::RoundUp(length, kBitsPerByte) / kBitsPerByte;
     return RoundedAllocationSize(sizeof(RawStackmap) + payload_size);
   }
   static RawStackmap* New(intptr_t pc_offset,
@@ -4542,7 +4432,7 @@
 
  private:
   void SetLength(intptr_t length) const {
-      StoreNonPointer(&raw_ptr()->length_, length);
+    StoreNonPointer(&raw_ptr()->length_, length);
   }
 
   bool InRange(intptr_t index) const { return index < Length(); }
@@ -4587,7 +4477,7 @@
   static intptr_t InstanceSize(intptr_t len) {
     return RoundedAllocationSize(
         sizeof(RawExceptionHandlers) +
-            (len * sizeof(RawExceptionHandlers::HandlerInfo)));
+        (len * sizeof(RawExceptionHandlers::HandlerInfo)));
   }
 
   static RawExceptionHandlers* New(intptr_t num_handlers);
@@ -4638,8 +4528,7 @@
 
   // Size of the frame part of the translation not counting kMaterializeObject
   // instructions in the prefix.
-  static const char* ToCString(const Array& table,
-                               const TypedData& packed);
+  static const char* ToCString(const Array& table, const TypedData& packed);
 
   // Returns true iff decompression yields the same instructions as the
   // original.
@@ -4693,9 +4582,7 @@
     return OptimizedBit::decode(raw_ptr()->state_bits_);
   }
   void set_is_optimized(bool value) const;
-  bool is_alive() const {
-    return AliveBit::decode(raw_ptr()->state_bits_);
-  }
+  bool is_alive() const { return AliveBit::decode(raw_ptr()->state_bits_); }
   void set_is_alive(bool value) const;
 
   uword PayloadStart() const {
@@ -4712,15 +4599,13 @@
   }
   intptr_t Size() const {
     const Instructions& instr = Instructions::Handle(instructions());
-    return instr.size();
+    return instr.Size();
   }
-  RawObjectPool* GetObjectPool() const {
-    return object_pool();
-  }
+  RawObjectPool* GetObjectPool() const { return object_pool(); }
   bool ContainsInstructionAt(uword addr) const {
     const Instructions& instr = Instructions::Handle(instructions());
     const uword offset = addr - instr.PayloadStart();
-    return offset < static_cast<uword>(instr.size());
+    return offset < static_cast<uword>(instr.Size());
   }
 
   // Returns true if there is a debugger breakpoint set in this code object.
@@ -4768,12 +4653,11 @@
   }
   void set_deopt_info_array(const Array& array) const;
 
-  RawArray* stackmaps() const {
-    return raw_ptr()->stackmaps_;
-  }
+  RawArray* stackmaps() const { return raw_ptr()->stackmaps_; }
   void set_stackmaps(const Array& maps) const;
-  RawStackmap* GetStackmap(
-      uint32_t pc_offset, Array* stackmaps, Stackmap* map) const;
+  RawStackmap* GetStackmap(uint32_t pc_offset,
+                           Array* stackmaps,
+                           Stackmap* map) const;
 
   enum {
     kSCallTableOffsetEntry = 0,
@@ -4824,7 +4708,7 @@
     // Layout of entries describing comments.
     enum {
       kPCOffsetEntry = 0,  // PC offset to a comment as a Smi.
-      kCommentEntry,  // Comment text as a String.
+      kCommentEntry,       // Comment text as a String.
       kNumberOfEntries
     };
 
@@ -4914,9 +4798,7 @@
     return reinterpret_cast<RawFunction*>(raw_ptr()->owner_);
   }
 
-  RawObject* owner() const {
-    return raw_ptr()->owner_;
-  }
+  RawObject* owner() const { return raw_ptr()->owner_; }
 
   void set_owner(const Function& function) const {
     ASSERT(function.IsOld());
@@ -4990,9 +4872,7 @@
     SetActiveInstructions(Instructions::Handle(instructions()));
   }
 
-  bool IsDisabled() const {
-    return instructions() != active_instructions();
-  }
+  bool IsDisabled() const { return instructions() != active_instructions(); }
 
  private:
   void set_state_bits(intptr_t bits) const;
@@ -5012,13 +4892,13 @@
 
   class OptimizedBit : public BitField<int32_t, bool, kOptimizedBit, 1> {};
   class AliveBit : public BitField<int32_t, bool, kAliveBit, 1> {};
-  class PtrOffBits :
-      public BitField<int32_t, intptr_t, kPtrOffBit, kPtrOffSize> {};
+  class PtrOffBits
+      : public BitField<int32_t, intptr_t, kPtrOffBit, kPtrOffSize> {};
 
   class SlowFindRawCodeVisitor : public FindObjectVisitor {
    public:
-    explicit SlowFindRawCodeVisitor(uword pc) : pc_(pc) { }
-    virtual ~SlowFindRawCodeVisitor() { }
+    explicit SlowFindRawCodeVisitor(uword pc) : pc_(pc) {}
+    virtual ~SlowFindRawCodeVisitor() {}
 
     // Check if object matches find condition.
     virtual bool FindObject(RawObject* obj) const;
@@ -5201,8 +5081,8 @@
 
   static intptr_t InstanceSize(intptr_t len) {
     ASSERT(0 <= len && len <= kMaxElements);
-    return RoundedAllocationSize(
-        sizeof(RawContextScope) + (len * kBytesPerElement));
+    return RoundedAllocationSize(sizeof(RawContextScope) +
+                                 (len * kBytesPerElement));
   }
 
   static RawContextScope* New(intptr_t num_variables, bool is_implicit);
@@ -5239,13 +5119,9 @@
   intptr_t mask() const;
   void set_mask(intptr_t mask) const;
 
-  RawString* target_name() const {
-    return raw_ptr()->target_name_;
-  }
+  RawString* target_name() const { return raw_ptr()->target_name_; }
 
-  RawArray* arguments_descriptor() const {
-    return raw_ptr()->args_descriptor_;
-  }
+  RawArray* arguments_descriptor() const { return raw_ptr()->args_descriptor_; }
 
   intptr_t filled_entry_count() const;
   void set_filled_entry_count(intptr_t num) const;
@@ -5307,7 +5183,7 @@
     kInstanceTypeArguments = 1,
     kInstantiatorTypeArguments = 2,
     kTestResult = 3,
-    kTestEntryLength  = 4,
+    kTestEntryLength = 4,
   };
 
   intptr_t NumberOfChecks() const;
@@ -5332,9 +5208,7 @@
   }
 
  private:
-  RawArray* cache() const {
-    return raw_ptr()->cache_;
-  }
+  RawArray* cache() const { return raw_ptr()->cache_; }
 
   void set_cache(const Array& value) const;
 
@@ -5397,8 +5271,8 @@
                                         bool report_after_token,
                                         Report::Kind kind,
                                         Heap::Space space,
-                                        const char* format, ...)
-    PRINTF_ATTRIBUTE(7, 8);
+                                        const char* format,
+                                        ...) PRINTF_ATTRIBUTE(7, 8);
 
   static RawLanguageError* NewFormattedV(const Error& prev_error,
                                          const Script& script,
@@ -5406,7 +5280,8 @@
                                          bool report_after_token,
                                          Report::Kind kind,
                                          Heap::Space space,
-                                         const char* format, va_list args);
+                                         const char* format,
+                                         va_list args);
 
   static RawLanguageError* New(const String& formatted_message,
                                Report::Kind kind = Report::kError,
@@ -5417,9 +5292,7 @@
   TokenPosition token_pos() const { return raw_ptr()->token_pos_; }
 
  private:
-  RawError* previous_error() const {
-    return raw_ptr()->previous_error_;
-  }
+  RawError* previous_error() const { return raw_ptr()->previous_error_; }
   void set_previous_error(const Error& value) const;
 
   RawScript* script() const { return raw_ptr()->script_; }
@@ -5547,9 +5420,7 @@
   virtual bool CheckIsCanonical(Thread* thread) const;
 #endif  // DEBUG
 
-  RawObject* GetField(const Field& field) const {
-    return *FieldAddr(field);
-  }
+  RawObject* GetField(const Field& field) const { return *FieldAddr(field); }
 
   void SetField(const Field& field, const Object& value) const {
     field.RecordStore(value);
@@ -5574,8 +5445,7 @@
   inline intptr_t GetNativeField(int index) const;
   inline void GetNativeFields(uint16_t num_fields,
                               intptr_t* field_values) const;
-  void SetNativeFields(uint16_t num_fields,
-                       const intptr_t* field_values) const;
+  void SetNativeFields(uint16_t num_fields, const intptr_t* field_values) const;
 
   uint16_t NumNativeFields() const {
     return clazz()->ptr()->num_native_fields_;
@@ -5632,9 +5502,7 @@
   }
   bool IsValidFieldOffset(intptr_t offset) const;
 
-  static intptr_t NextFieldOffset() {
-    return sizeof(RawInstance);
-  }
+  static intptr_t NextFieldOffset() { return sizeof(RawInstance); }
 
   // The follwoing raw methods are used for morphing.
   // They are needed due to the extraction of the class in IsValidFieldOffset.
@@ -5782,8 +5650,8 @@
   // 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, TrailPtr trail = NULL) const;
+  virtual RawAbstractType* CloneUninstantiated(const Class& new_owner,
+                                               TrailPtr trail = NULL) const;
 
   virtual RawInstance* CheckAndCanonicalize(Thread* thread,
                                             const char** error_str) const {
@@ -5821,9 +5689,7 @@
   bool TestAndAddBuddyToTrail(TrailPtr* trail, const AbstractType& buddy) const;
 
   // The name of this type, including the names of its type arguments, if any.
-  virtual RawString* Name() const {
-    return BuildName(kInternalName);
-  }
+  virtual RawString* Name() const { return BuildName(kInternalName); }
 
   // The name of this type, including the names of its type arguments, if any.
   // Names of internal classes are mapped to their public interfaces.
@@ -5852,9 +5718,8 @@
   bool IsNullType() const;
 
   bool IsObjectType() const {
-    return !IsFunctionType() &&
-        HasResolvedTypeClass() &&
-        Class::Handle(type_class()).IsObjectClass();
+    return !IsFunctionType() && HasResolvedTypeClass() &&
+           Class::Handle(type_class()).IsObjectClass();
   }
 
   // Check if this type represents the 'bool' type.
@@ -5903,8 +5768,8 @@
                           Error* bound_error,
                           TrailPtr bound_trail,
                           Heap::Space space) const {
-    return TypeTest(kIsMoreSpecificThan, other,
-                    bound_error, bound_trail, space);
+    return TypeTest(kIsMoreSpecificThan, other, bound_error, bound_trail,
+                    space);
   }
 
  private:
@@ -5940,9 +5805,8 @@
     return OFFSET_OF(RawType, type_class_id_);
   }
   virtual bool IsFinalized() const {
-    return
-        (raw_ptr()->type_state_ == RawType::kFinalizedInstantiated) ||
-        (raw_ptr()->type_state_ == RawType::kFinalizedUninstantiated);
+    return (raw_ptr()->type_state_ == RawType::kFinalizedInstantiated) ||
+           (raw_ptr()->type_state_ == RawType::kFinalizedUninstantiated);
   }
   virtual void SetIsFinalized() const;
   void ResetIsFinalized() const;  // Ignore current state and set again.
@@ -5984,9 +5848,8 @@
       TrailPtr bound_trail,
       Heap::Space space) const;
   virtual RawAbstractType* CloneUnfinalized() const;
-  virtual RawAbstractType* CloneUninstantiated(
-      const Class& new_owner,
-      TrailPtr trail = NULL) const;
+  virtual RawAbstractType* CloneUninstantiated(const Class& new_owner,
+                                               TrailPtr trail = NULL) const;
   virtual RawAbstractType* Canonicalize(TrailPtr trail = NULL) const;
 #if defined(DEBUG)
   // Check if type is canonical.
@@ -6107,8 +5970,7 @@
     return AbstractType::Handle(type()).token_pos();
   }
   virtual bool IsInstantiated(TrailPtr trail = NULL) const;
-  virtual bool IsEquivalent(const Instance& other,
-                            TrailPtr trail = NULL) const;
+  virtual bool IsEquivalent(const Instance& other, TrailPtr trail = NULL) const;
   virtual bool IsRecursive() const { return true; }
   virtual RawTypeRef* InstantiateFrom(
       const TypeArguments& instantiator_type_arguments,
@@ -6116,9 +5978,8 @@
       TrailPtr instantiation_trail,
       TrailPtr bound_trail,
       Heap::Space space) const;
-  virtual RawTypeRef* CloneUninstantiated(
-      const Class& new_owner,
-      TrailPtr trail = NULL) const;
+  virtual RawTypeRef* CloneUninstantiated(const Class& new_owner,
+                                          TrailPtr trail = NULL) const;
   virtual RawAbstractType* Canonicalize(TrailPtr trail = NULL) const;
 #if defined(DEBUG)
   // Check if typeref is canonical.
@@ -6192,9 +6053,7 @@
                   TrailPtr bound_trail,
                   Heap::Space space) const;
   virtual TokenPosition token_pos() const { return raw_ptr()->token_pos_; }
-  virtual bool IsInstantiated(TrailPtr trail = NULL) const {
-    return false;
-  }
+  virtual bool IsInstantiated(TrailPtr trail = NULL) const { return false; }
   virtual bool IsEquivalent(const Instance& other, TrailPtr trail = NULL) const;
   virtual bool IsRecursive() const { return false; }
   virtual RawAbstractType* InstantiateFrom(
@@ -6204,16 +6063,14 @@
       TrailPtr bound_trail,
       Heap::Space space) const;
   virtual RawAbstractType* CloneUnfinalized() const;
-  virtual RawAbstractType* CloneUninstantiated(
-      const Class& new_owner, TrailPtr trail = NULL) const;
+  virtual RawAbstractType* CloneUninstantiated(const Class& new_owner,
+                                               TrailPtr trail = NULL) const;
   virtual RawAbstractType* Canonicalize(TrailPtr trail = NULL) const {
     return raw();
   }
 #if defined(DEBUG)
   // Check if type parameter is canonical.
-  virtual bool CheckIsCanonical(Thread* thread) const {
-    return true;
-  }
+  virtual bool CheckIsCanonical(Thread* thread) const { return true; }
 #endif  // DEBUG
   virtual RawString* EnumerateURIs() const;
 
@@ -6304,16 +6161,14 @@
       TrailPtr bound_trail,
       Heap::Space space) const;
   virtual RawAbstractType* CloneUnfinalized() const;
-  virtual RawAbstractType* CloneUninstantiated(
-      const Class& new_owner, TrailPtr trail = NULL) const;
+  virtual RawAbstractType* CloneUninstantiated(const Class& new_owner,
+                                               TrailPtr trail = NULL) const;
   virtual RawAbstractType* Canonicalize(TrailPtr trail = NULL) const {
     return raw();
   }
 #if defined(DEBUG)
   // Check if bounded type is canonical.
-  virtual bool CheckIsCanonical(Thread* thread) const {
-    return true;
-  }
+  virtual bool CheckIsCanonical(Thread* thread) const { return true; }
 #endif  // DEBUG
   virtual RawString* EnumerateURIs() const;
 
@@ -6445,9 +6300,7 @@
 
   virtual double AsDoubleValue() const;
   virtual int64_t AsInt64Value() const;
-  virtual int64_t AsTruncatedInt64Value() const {
-    return AsInt64Value();
-  }
+  virtual int64_t AsTruncatedInt64Value() const { return AsInt64Value(); }
   virtual uint32_t AsTruncatedUint32Value() const;
 
   virtual bool FitsIntoSmi() const;
@@ -6478,9 +6331,7 @@
   static const intptr_t kMaxValue = kSmiMax;
   static const intptr_t kMinValue = kSmiMin;
 
-  intptr_t Value() const {
-    return ValueFromRaw(raw_value());
-  }
+  intptr_t Value() const { return ValueFromRaw(raw_value()); }
 
   virtual bool Equals(const Instance& other) const;
   virtual bool IsZero() const { return Value() == 0; }
@@ -6567,17 +6418,11 @@
   static const int64_t kMinValue =
       static_cast<int64_t>(DART_2PART_UINT64_C(0x80000000, 00000000));
 
-  int64_t value() const {
-    return raw_ptr()->value_;
-  }
+  int64_t value() const { return raw_ptr()->value_; }
   static intptr_t value_offset() { return OFFSET_OF(RawMint, value_); }
 
-  virtual bool IsZero() const {
-    return value() == 0;
-  }
-  virtual bool IsNegative() const {
-    return value() < 0;
-  }
+  virtual bool IsZero() const { return value() == 0; }
+  virtual bool IsNegative() const { return value() < 0; }
 
   virtual bool Equals(const Instance& other) const;
 
@@ -6612,7 +6457,7 @@
 
 class Bigint : public Integer {
  public:
-  virtual bool IsZero() const { return Used() == 0;}
+  virtual bool IsZero() const { return Used() == 0; }
   virtual bool IsNegative() const { return Neg(); }
   virtual bool Equals(const Instance& other) const;
 
@@ -6660,20 +6505,22 @@
 
   static RawBigint* New(Heap::Space space = Heap::kNew);  // For snapshots.
 
-  static RawBigint* New(bool neg, intptr_t used, const TypedData& digits,
+  static RawBigint* New(bool neg,
+                        intptr_t used,
+                        const TypedData& digits,
                         Heap::Space space = Heap::kNew);
 
-  static RawBigint* NewFromInt64(int64_t value,
-                                  Heap::Space space = Heap::kNew);
+  static RawBigint* NewFromInt64(int64_t value, Heap::Space space = Heap::kNew);
 
   static RawBigint* NewFromUint64(uint64_t value,
-                                   Heap::Space space = Heap::kNew);
+                                  Heap::Space space = Heap::kNew);
 
-  static RawBigint* NewFromShiftedInt64(int64_t value, intptr_t shift,
-                                         Heap::Space space = Heap::kNew);
+  static RawBigint* NewFromShiftedInt64(int64_t value,
+                                        intptr_t shift,
+                                        Heap::Space space = Heap::kNew);
 
   static RawBigint* NewFromCString(const char* str,
-                                    Heap::Space space = Heap::kNew);
+                                   Heap::Space space = Heap::kNew);
 
   // Returns a canonical Bigint object allocated in the old gen space.
   static RawBigint* NewCanonical(const String& str);
@@ -6691,10 +6538,12 @@
                          intptr_t index,
                          uint32_t value);
 
-  static RawTypedData* NewDigitsFromHexCString(const char* str, intptr_t* used,
+  static RawTypedData* NewDigitsFromHexCString(const char* str,
+                                               intptr_t* used,
                                                Heap::Space space = Heap::kNew);
 
-  static RawTypedData* NewDigitsFromDecCString(const char* str, intptr_t* used,
+  static RawTypedData* NewDigitsFromDecCString(const char* str,
+                                               intptr_t* used,
                                                Heap::Space space = Heap::kNew);
 
   static RawBigint* Allocate(intptr_t length, Heap::Space space = Heap::kNew);
@@ -6708,9 +6557,7 @@
 // abstract class double in corelib.
 class Double : public Number {
  public:
-  double value() const {
-    return raw_ptr()->value_;
-  }
+  double value() const { return raw_ptr()->value_; }
 
   bool BitwiseEqualsToDouble(double value) const;
   virtual bool OperatorEquals(const Instance& other) const;
@@ -6768,18 +6615,12 @@
   class CodePointIterator : public ValueObject {
    public:
     explicit CodePointIterator(const String& str)
-        : str_(str),
-          ch_(0),
-          index_(-1),
-          end_(str.Length()) {
+        : str_(str), ch_(0), index_(-1), end_(str.Length()) {
       ASSERT(!str_.IsNull());
     }
 
     CodePointIterator(const String& str, intptr_t start, intptr_t length)
-        : str_(str),
-          ch_(0),
-          index_(start - 1),
-          end_(start + length) {
+        : str_(str), ch_(0), index_(start - 1), end_(start + length) {
       ASSERT(start >= 0);
       ASSERT(end_ <= str.Length());
     }
@@ -6845,7 +6686,7 @@
 
   bool Equals(const String& str,
               intptr_t begin_index,  // begin index on 'str'.
-              intptr_t len) const;  // len on 'str'.
+              intptr_t len) const;   // len on 'str'.
 
   // Compares to a '\0' terminated array of UTF-8 encoded characters.
   bool Equals(const char* cstr) const;
@@ -7027,14 +6868,14 @@
   static RawString* ScrubName(const String& name);
   static RawString* ScrubNameRetainPrivate(const String& name);
 
-  static bool EqualsIgnoringPrivateKey(const String& str1,
-                                       const String& str2);
+  static bool EqualsIgnoringPrivateKey(const String& str1, const String& str2);
 
   static RawString* NewFormatted(const char* format, ...)
       PRINTF_ATTRIBUTE(1, 2);
   static RawString* NewFormatted(Heap::Space space, const char* format, ...)
       PRINTF_ATTRIBUTE(2, 3);
-  static RawString* NewFormattedV(const char* format, va_list args,
+  static RawString* NewFormattedV(const char* format,
+                                  va_list args,
                                   Heap::Space space = Heap::kNew);
 
   static bool ParseDouble(const String& str,
@@ -7061,7 +6902,7 @@
     StoreSmi(&raw_ptr()->hash_, Smi::New(value));
   }
 
-  template<typename HandleType, typename ElementType, typename CallbackType>
+  template <typename HandleType, typename ElementType, typename CallbackType>
   static void ReadFromImpl(SnapshotReader* reader,
                            String* str_obj,
                            intptr_t len,
@@ -7074,7 +6915,8 @@
   friend class Class;
   friend class Symbols;
   friend class StringSlice;  // SetHash
-  template<typename CharType> friend class CharArray;  // SetHash
+  template <typename CharType>
+  friend class CharArray;     // SetHash
   friend class ConcatString;  // SetHash
   friend class OneByteString;
   friend class TwoByteString;
@@ -7117,16 +6959,14 @@
   static intptr_t InstanceSize(intptr_t len) {
     ASSERT(sizeof(RawOneByteString) == String::kSizeofRawString);
     ASSERT(0 <= len && len <= kMaxElements);
-    return String::RoundedAllocationSize(
-        sizeof(RawOneByteString) + (len * kBytesPerElement));
+    return String::RoundedAllocationSize(sizeof(RawOneByteString) +
+                                         (len * kBytesPerElement));
   }
 
-  static RawOneByteString* New(intptr_t len,
-                               Heap::Space space);
+  static RawOneByteString* New(intptr_t len, Heap::Space space);
   static RawOneByteString* New(const char* c_string,
                                Heap::Space space = Heap::kNew) {
-    return New(reinterpret_cast<const uint8_t*>(c_string),
-               strlen(c_string),
+    return New(reinterpret_cast<const uint8_t*>(c_string), strlen(c_string),
                space);
   }
   static RawOneByteString* New(const uint8_t* characters,
@@ -7138,8 +6978,7 @@
   static RawOneByteString* New(const int32_t* characters,
                                intptr_t len,
                                Heap::Space space);
-  static RawOneByteString* New(const String& str,
-                               Heap::Space space);
+  static RawOneByteString* New(const String& str, Heap::Space space);
   // 'other' must be OneByteString.
   static RawOneByteString* New(const String& other_one_byte_string,
                                intptr_t other_start_index,
@@ -7253,12 +7092,11 @@
   static intptr_t InstanceSize(intptr_t len) {
     ASSERT(sizeof(RawTwoByteString) == String::kSizeofRawString);
     ASSERT(0 <= len && len <= kMaxElements);
-    return String::RoundedAllocationSize(
-        sizeof(RawTwoByteString) + (len * kBytesPerElement));
+    return String::RoundedAllocationSize(sizeof(RawTwoByteString) +
+                                         (len * kBytesPerElement));
   }
 
-  static RawTwoByteString* New(intptr_t len,
-                               Heap::Space space);
+  static RawTwoByteString* New(intptr_t len, Heap::Space space);
   static RawTwoByteString* New(const uint16_t* characters,
                                intptr_t len,
                                Heap::Space space);
@@ -7266,8 +7104,7 @@
                                const int32_t* characters,
                                intptr_t len,
                                Heap::Space space);
-  static RawTwoByteString* New(const String& str,
-                               Heap::Space space);
+  static RawTwoByteString* New(const String& str, Heap::Space space);
 
   static RawTwoByteString* New(const TypedData& other_typed_data,
                                intptr_t other_start_index,
@@ -7503,21 +7340,15 @@
 // Class Bool implements Dart core class bool.
 class Bool : public Instance {
  public:
-  bool value() const {
-    return raw_ptr()->value_;
-  }
+  bool value() const { return raw_ptr()->value_; }
 
   static intptr_t InstanceSize() {
     return RoundedAllocationSize(sizeof(RawBool));
   }
 
-  static const Bool& True() {
-    return Object::bool_true();
-  }
+  static const Bool& True() { return Object::bool_true(); }
 
-  static const Bool& False() {
-    return Object::bool_false();
-  }
+  static const Bool& False() { return Object::bool_false(); }
 
   static const Bool& Get(bool value) {
     return value ? Bool::True() : Bool::False();
@@ -7556,17 +7387,13 @@
     return OFFSET_OF_RETURNED_VALUE(RawArray, data) + kWordSize * index;
   }
 
-  RawObject* At(intptr_t index) const {
-    return *ObjectAddr(index);
-  }
+  RawObject* At(intptr_t index) const { return *ObjectAddr(index); }
   void SetAt(intptr_t index, const Object& value) const {
     // TODO(iposva): Add storing NoSafepointScope.
     StorePointer(ObjectAddr(index), value.raw());
   }
 
-  bool IsImmutable() const {
-    return raw()->GetClassId() == kImmutableArrayCid;
-  }
+  bool IsImmutable() const { return raw()->GetClassId() == kImmutableArrayCid; }
 
   virtual RawTypeArguments* GetTypeArguments() const {
     return raw_ptr()->type_arguments_;
@@ -7674,9 +7501,7 @@
 
   static const ClassId kClassId = kImmutableArrayCid;
 
-  static intptr_t InstanceSize() {
-    return Array::InstanceSize();
-  }
+  static intptr_t InstanceSize() { return Array::InstanceSize(); }
 
   static intptr_t InstanceSize(intptr_t len) {
     return Array::InstanceSize(len);
@@ -7744,10 +7569,8 @@
     // A GrowableObjectArray is raw or takes one type argument. However, its
     // type argument vector may be longer than 1 due to a type optimization
     // reusing the type argument vector of the instantiator.
-    ASSERT(value.IsNull() ||
-           ((value.Length() >= 1) &&
-            value.IsInstantiated() &&
-            value.IsCanonical()));
+    ASSERT(value.IsNull() || ((value.Length() >= 1) && value.IsInstantiated() &&
+                              value.IsCanonical()));
     const Array& contents = Array::Handle(data());
     contents.SetTypeArguments(value);
     StorePointer(&raw_ptr()->type_arguments_, value.raw());
@@ -7810,8 +7633,11 @@
 
 class Float32x4 : public Instance {
  public:
-  static RawFloat32x4* New(float value0, float value1, float value2,
-                           float value3, Heap::Space space = Heap::kNew);
+  static RawFloat32x4* New(float value0,
+                           float value1,
+                           float value2,
+                           float value3,
+                           Heap::Space space = Heap::kNew);
   static RawFloat32x4* New(simd128_value_t value,
                            Heap::Space space = Heap::kNew);
 
@@ -7832,9 +7658,7 @@
     return RoundedAllocationSize(sizeof(RawFloat32x4));
   }
 
-  static intptr_t value_offset() {
-    return OFFSET_OF(RawFloat32x4, value_);
-  }
+  static intptr_t value_offset() { return OFFSET_OF(RawFloat32x4, value_); }
 
  private:
   FINAL_HEAP_OBJECT_IMPLEMENTATION(Float32x4, Instance);
@@ -7844,10 +7668,12 @@
 
 class Int32x4 : public Instance {
  public:
-  static RawInt32x4* New(int32_t value0, int32_t value1, int32_t value2,
-                          int32_t value3, Heap::Space space = Heap::kNew);
-  static RawInt32x4* New(simd128_value_t value,
-                          Heap::Space space = Heap::kNew);
+  static RawInt32x4* New(int32_t value0,
+                         int32_t value1,
+                         int32_t value2,
+                         int32_t value3,
+                         Heap::Space space = Heap::kNew);
+  static RawInt32x4* New(simd128_value_t value, Heap::Space space = Heap::kNew);
 
   int32_t x() const;
   int32_t y() const;
@@ -7866,9 +7692,7 @@
     return RoundedAllocationSize(sizeof(RawInt32x4));
   }
 
-  static intptr_t value_offset() {
-    return OFFSET_OF(RawInt32x4, value_);
-  }
+  static intptr_t value_offset() { return OFFSET_OF(RawInt32x4, value_); }
 
  private:
   FINAL_HEAP_OBJECT_IMPLEMENTATION(Int32x4, Instance);
@@ -7878,7 +7702,8 @@
 
 class Float64x2 : public Instance {
  public:
-  static RawFloat64x2* New(double value0, double value1,
+  static RawFloat64x2* New(double value0,
+                           double value1,
                            Heap::Space space = Heap::kNew);
   static RawFloat64x2* New(simd128_value_t value,
                            Heap::Space space = Heap::kNew);
@@ -7896,9 +7721,7 @@
     return RoundedAllocationSize(sizeof(RawFloat64x2));
   }
 
-  static intptr_t value_offset() {
-    return OFFSET_OF(RawFloat64x2, value_);
-  }
+  static intptr_t value_offset() { return OFFSET_OF(RawFloat64x2, value_); }
 
  private:
   FINAL_HEAP_OBJECT_IMPLEMENTATION(Float64x2, Instance);
@@ -7936,8 +7759,8 @@
   void* DataAddr(intptr_t byte_offset) const {
     ASSERT((byte_offset == 0) ||
            ((byte_offset > 0) && (byte_offset < LengthInBytes())));
-    return reinterpret_cast<void*>(
-        UnsafeMutableNonPointer(raw_ptr()->data()) + byte_offset);
+    return reinterpret_cast<void*>(UnsafeMutableNonPointer(raw_ptr()->data()) +
+                                   byte_offset);
   }
 
   virtual bool CanonicalizeEquals(const Instance& other) const;
@@ -7983,9 +7806,7 @@
 
 #undef TYPED_GETTER_SETTER
 
-  static intptr_t length_offset() {
-    return OFFSET_OF(RawTypedData, length_);
-  }
+  static intptr_t length_offset() { return OFFSET_OF(RawTypedData, length_); }
 
   static intptr_t data_offset() {
     return OFFSET_OF_RETURNED_VALUE(RawTypedData, data);
@@ -8009,8 +7830,7 @@
 
   static TypedDataElementType ElementType(intptr_t class_id) {
     ASSERT(RawObject::IsTypedDataClassId(class_id));
-    return static_cast<TypedDataElementType>(
-        class_id - kTypedDataInt8ArrayCid);
+    return static_cast<TypedDataElementType>(class_id - kTypedDataInt8ArrayCid);
   }
 
   static intptr_t MaxElements(intptr_t class_id) {
@@ -8023,35 +7843,34 @@
                            Heap::Space space = Heap::kNew);
 
   template <typename DstType, typename SrcType>
-  static void Copy(const DstType& dst, intptr_t dst_offset_in_bytes,
-                   const SrcType& src, intptr_t src_offset_in_bytes,
+  static void Copy(const DstType& dst,
+                   intptr_t dst_offset_in_bytes,
+                   const SrcType& src,
+                   intptr_t src_offset_in_bytes,
                    intptr_t length_in_bytes) {
-    ASSERT(Utils::RangeCheck(src_offset_in_bytes,
-                             length_in_bytes,
+    ASSERT(Utils::RangeCheck(src_offset_in_bytes, length_in_bytes,
                              src.LengthInBytes()));
-    ASSERT(Utils::RangeCheck(dst_offset_in_bytes,
-                             length_in_bytes,
+    ASSERT(Utils::RangeCheck(dst_offset_in_bytes, length_in_bytes,
                              dst.LengthInBytes()));
     {
       NoSafepointScope no_safepoint;
       if (length_in_bytes > 0) {
         memmove(dst.DataAddr(dst_offset_in_bytes),
-                src.DataAddr(src_offset_in_bytes),
-                length_in_bytes);
+                src.DataAddr(src_offset_in_bytes), length_in_bytes);
       }
     }
   }
 
 
   template <typename DstType, typename SrcType>
-  static void ClampedCopy(const DstType& dst, intptr_t dst_offset_in_bytes,
-                          const SrcType& src, intptr_t src_offset_in_bytes,
+  static void ClampedCopy(const DstType& dst,
+                          intptr_t dst_offset_in_bytes,
+                          const SrcType& src,
+                          intptr_t src_offset_in_bytes,
                           intptr_t length_in_bytes) {
-    ASSERT(Utils::RangeCheck(src_offset_in_bytes,
-                             length_in_bytes,
+    ASSERT(Utils::RangeCheck(src_offset_in_bytes, length_in_bytes,
                              src.LengthInBytes()));
-    ASSERT(Utils::RangeCheck(dst_offset_in_bytes,
-                             length_in_bytes,
+    ASSERT(Utils::RangeCheck(dst_offset_in_bytes, length_in_bytes,
                              dst.LengthInBytes()));
     {
       NoSafepointScope no_safepoint;
@@ -8177,8 +7996,8 @@
 
   static TypedDataElementType ElementType(intptr_t class_id) {
     ASSERT(RawObject::IsExternalTypedDataClassId(class_id));
-    return static_cast<TypedDataElementType>(
-        class_id - kExternalTypedDataInt8ArrayCid);
+    return static_cast<TypedDataElementType>(class_id -
+                                             kExternalTypedDataInt8ArrayCid);
   }
 
   static intptr_t MaxElements(intptr_t class_id) {
@@ -8203,8 +8022,8 @@
   }
 
   void SetData(uint8_t* data) const {
-    ASSERT(!Isolate::Current()->heap()->Contains(
-        reinterpret_cast<uword>(data)));
+    ASSERT(
+        !Isolate::Current()->heap()->Contains(reinterpret_cast<uword>(data)));
     StoreNonPointer(&raw_ptr()->data_, data);
   }
 
@@ -8224,20 +8043,20 @@
 
   static RawInstance* Data(const Instance& view_obj) {
     ASSERT(!view_obj.IsNull());
-    return *reinterpret_cast<RawInstance* const*>(
-        view_obj.raw_ptr() + kDataOffset);
+    return *reinterpret_cast<RawInstance* const*>(view_obj.raw_ptr() +
+                                                  kDataOffset);
   }
 
   static RawSmi* OffsetInBytes(const Instance& view_obj) {
     ASSERT(!view_obj.IsNull());
-    return *reinterpret_cast<RawSmi* const*>(
-        view_obj.raw_ptr() + kOffsetInBytesOffset);
+    return *reinterpret_cast<RawSmi* const*>(view_obj.raw_ptr() +
+                                             kOffsetInBytesOffset);
   }
 
   static RawSmi* Length(const Instance& view_obj) {
     ASSERT(!view_obj.IsNull());
-    return *reinterpret_cast<RawSmi* const*>(
-        view_obj.raw_ptr() + kLengthOffset);
+    return *reinterpret_cast<RawSmi* const*>(view_obj.raw_ptr() +
+                                             kLengthOffset);
   }
 
   static bool IsExternalTypedDataView(const Instance& view_obj) {
@@ -8248,26 +8067,21 @@
     return RawObject::IsExternalTypedDataClassId(cid);
   }
 
-  static intptr_t NumberOfFields() {
-    return kLengthOffset;
-  }
+  static intptr_t NumberOfFields() { return kLengthOffset; }
 
-  static intptr_t data_offset() {
-    return kWordSize * kDataOffset;
-  }
+  static intptr_t data_offset() { return kWordSize * kDataOffset; }
 
   static intptr_t offset_in_bytes_offset() {
     return kWordSize * kOffsetInBytesOffset;
   }
 
-  static intptr_t length_offset() {
-    return kWordSize * kLengthOffset;
-  }
+  static intptr_t length_offset() { return kWordSize * kLengthOffset; }
 
   static intptr_t ElementSizeInBytes(intptr_t class_id) {
     ASSERT(RawObject::IsTypedDataViewClassId(class_id));
-    return (class_id == kByteDataViewCid) ?
-        1 : TypedData::element_size(class_id - kTypedDataInt8ArrayViewCid);
+    return (class_id == kByteDataViewCid)
+               ? 1
+               : TypedData::element_size(class_id - kTypedDataInt8ArrayViewCid);
   }
 
  private:
@@ -8283,17 +8097,13 @@
  public:
   static RawInstance* Data(const Instance& view_obj) {
     ASSERT(!view_obj.IsNull());
-    return *reinterpret_cast<RawInstance* const*>(
-        view_obj.raw_ptr() + kDataOffset);
+    return *reinterpret_cast<RawInstance* const*>(view_obj.raw_ptr() +
+                                                  kDataOffset);
   }
 
-  static intptr_t NumberOfFields() {
-    return kDataOffset;
-  }
+  static intptr_t NumberOfFields() { return kDataOffset; }
 
-  static intptr_t data_offset() {
-    return kWordSize * kDataOffset;
-  }
+  static intptr_t data_offset() { return kWordSize * kDataOffset; }
 
  private:
   enum {
@@ -8336,29 +8146,19 @@
     return OFFSET_OF(RawLinkedHashMap, type_arguments_);
   }
 
-  RawTypedData* index() const {
-    return raw_ptr()->index_;
-  }
+  RawTypedData* index() const { return raw_ptr()->index_; }
   void SetIndex(const TypedData& value) const {
     StorePointer(&raw_ptr()->index_, value.raw());
   }
-  static intptr_t index_offset() {
-    return OFFSET_OF(RawLinkedHashMap, index_);
-  }
+  static intptr_t index_offset() { return OFFSET_OF(RawLinkedHashMap, index_); }
 
-  RawArray* data() const {
-    return raw_ptr()->data_;
-  }
+  RawArray* data() const { return raw_ptr()->data_; }
   void SetData(const Array& value) const {
     StorePointer(&raw_ptr()->data_, value.raw());
   }
-  static intptr_t data_offset() {
-    return OFFSET_OF(RawLinkedHashMap, data_);
-  }
+  static intptr_t data_offset() { return OFFSET_OF(RawLinkedHashMap, data_); }
 
-  RawSmi* hash_mask() const {
-    return raw_ptr()->hash_mask_;
-  }
+  RawSmi* hash_mask() const { return raw_ptr()->hash_mask_; }
   void SetHashMask(intptr_t value) const {
     StoreSmi(&raw_ptr()->hash_mask_, Smi::New(value));
   }
@@ -8366,9 +8166,7 @@
     return OFFSET_OF(RawLinkedHashMap, hash_mask_);
   }
 
-  RawSmi* used_data() const {
-    return raw_ptr()->used_data_;
-  }
+  RawSmi* used_data() const { return raw_ptr()->used_data_; }
   void SetUsedData(intptr_t value) const {
     StoreSmi(&raw_ptr()->used_data_, Smi::New(value));
   }
@@ -8376,9 +8174,7 @@
     return OFFSET_OF(RawLinkedHashMap, used_data_);
   }
 
-  RawSmi* deleted_keys() const {
-    return raw_ptr()->deleted_keys_;
-  }
+  RawSmi* deleted_keys() const { return raw_ptr()->deleted_keys_; }
   void SetDeletedKeys(intptr_t value) const {
     StoreSmi(&raw_ptr()->deleted_keys_, Smi::New(value));
   }
@@ -8400,10 +8196,10 @@
   class Iterator : ValueObject {
    public:
     explicit Iterator(const LinkedHashMap& map)
-      : data_(Array::Handle(map.data())),
-        scratch_(Object::Handle()),
-        offset_(-2),
-        length_(Smi::Value(map.used_data())) {}
+        : data_(Array::Handle(map.data())),
+          scratch_(Object::Handle()),
+          offset_(-2),
+          length_(Smi::Value(map.used_data())) {}
 
     bool MoveNext() {
       while (true) {
@@ -8419,13 +8215,9 @@
       }
     }
 
-    RawObject* CurrentKey() const {
-      return data_.At(offset_);
-    }
+    RawObject* CurrentKey() const { return data_.At(offset_); }
 
-    RawObject* CurrentValue() const {
-      return data_.At(offset_ + 1);
-    }
+    RawObject* CurrentValue() const { return data_.At(offset_ + 1); }
 
    private:
     const Array& data_;
@@ -8542,8 +8334,7 @@
   static intptr_t InstanceSize() {
     return RoundedAllocationSize(sizeof(RawSendPort));
   }
-  static RawSendPort* New(Dart_Port id,
-                          Heap::Space space = Heap::kNew);
+  static RawSendPort* New(Dart_Port id, Heap::Space space = Heap::kNew);
   static RawSendPort* New(Dart_Port id,
                           Dart_Port origin_id,
                           Heap::Space space = Heap::kNew);
@@ -8651,7 +8442,7 @@
       case kTwoByteStringCid:
         return OFFSET_OF(RawRegExp, two_byte_function_);
       case kExternalOneByteStringCid:
-         return OFFSET_OF(RawRegExp, external_one_byte_function_);
+        return OFFSET_OF(RawRegExp, external_one_byte_function_);
       case kExternalTwoByteStringCid:
         return OFFSET_OF(RawRegExp, external_two_byte_function_);
     }
@@ -8662,12 +8453,10 @@
 
   RawFunction** FunctionAddr(intptr_t cid) const {
     return reinterpret_cast<RawFunction**>(
-          FieldAddrAtOffset(function_offset(cid)));
+        FieldAddrAtOffset(function_offset(cid)));
   }
 
-  RawFunction* function(intptr_t cid) const {
-    return *FunctionAddr(cid);
-  }
+  RawFunction* function(intptr_t cid) const { return *FunctionAddr(cid); }
 
   void set_pattern(const String& pattern) const;
   void set_function(intptr_t cid, const Function& value) const;
@@ -8705,12 +8494,8 @@
                     FlagsBits::update(value, raw_ptr()->type_flags_));
   }
 
-  RegExType type() const {
-    return TypeBits::decode(raw_ptr()->type_flags_);
-  }
-  intptr_t flags() const {
-    return FlagsBits::decode(raw_ptr()->type_flags_);
-  }
+  RegExType type() const { return TypeBits::decode(raw_ptr()->type_flags_); }
+  intptr_t flags() const { return FlagsBits::decode(raw_ptr()->type_flags_); }
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(RegExp, Instance);
   friend class Class;
@@ -8719,17 +8504,13 @@
 
 class WeakProperty : public Instance {
  public:
-  RawObject* key() const {
-    return raw_ptr()->key_;
-  }
+  RawObject* key() const { return raw_ptr()->key_; }
 
   void set_key(const Object& key) const {
     StorePointer(&raw_ptr()->key_, key.raw());
   }
 
-  RawObject* value() const {
-    return raw_ptr()->value_;
-  }
+  RawObject* value() const { return raw_ptr()->value_; }
 
   void set_value(const Object& value) const {
     StorePointer(&raw_ptr()->value_, value.raw());
@@ -8755,9 +8536,7 @@
 
 class MirrorReference : public Instance {
  public:
-  RawObject* referent() const {
-    return raw_ptr()->referent_;
-  }
+  RawObject* referent() const { return raw_ptr()->referent_; }
 
   void set_referent(const Object& referent) const {
     StorePointer(&raw_ptr()->referent_, referent.raw());
@@ -8798,9 +8577,7 @@
   }
   static intptr_t tag_offset() { return OFFSET_OF(RawUserTag, tag_); }
 
-  RawString* label() const {
-    return raw_ptr()->label_;
-  }
+  RawString* label() const { return raw_ptr()->label_; }
 
   void MakeActive() const;
 
@@ -8808,8 +8585,7 @@
     return RoundedAllocationSize(sizeof(RawUserTag));
   }
 
-  static RawUserTag* New(const String& label,
-                         Heap::Space space = Heap::kOld);
+  static RawUserTag* New(const String& label, Heap::Space space = Heap::kOld);
   static RawUserTag* DefaultTag();
 
   static bool TagTableIsFull(Thread* thread);
diff --git a/runtime/vm/object_graph.cc b/runtime/vm/object_graph.cc
index b5a5cac..66bbaca 100644
--- a/runtime/vm/object_graph.cc
+++ b/runtime/vm/object_graph.cc
@@ -25,7 +25,7 @@
 class ObjectGraph::Stack : public ObjectPointerVisitor {
  public:
   explicit Stack(Isolate* isolate)
-      : ObjectPointerVisitor(isolate), data_(kInitialCapacity) { }
+      : ObjectPointerVisitor(isolate), data_(kInitialCapacity) {}
 
   // Marks and pushes. Used to initialize this stack with roots.
   virtual void VisitPointers(RawObject** first, RawObject** last) {
@@ -138,7 +138,7 @@
 
 class Unmarker : public ObjectVisitor {
  public:
-  Unmarker() { }
+  Unmarker() {}
 
   void VisitObject(RawObject* obj) {
     if (obj->IsMarked()) {
@@ -156,8 +156,7 @@
 };
 
 
-ObjectGraph::ObjectGraph(Thread* thread)
-    : StackResource(thread) {
+ObjectGraph::ObjectGraph(Thread* thread) : StackResource(thread) {
   // The VM isolate has all its objects pre-marked, so iterating over it
   // would be a no-op.
   ASSERT(thread->isolate() != Dart::vm_isolate());
@@ -193,7 +192,7 @@
 class InstanceAccumulator : public ObjectVisitor {
  public:
   InstanceAccumulator(ObjectGraph::Stack* stack, intptr_t class_id)
-      : stack_(stack), class_id_(class_id) { }
+      : stack_(stack), class_id_(class_id) {}
 
   void VisitObject(RawObject* obj) {
     if (obj->GetClassId() == class_id_) {
@@ -225,7 +224,7 @@
 
 class SizeVisitor : public ObjectGraph::Visitor {
  public:
-  SizeVisitor() : size_(0) { }
+  SizeVisitor() : size_(0) {}
   intptr_t size() const { return size_; }
   virtual bool ShouldSkip(RawObject* obj) const { return false; }
   virtual Direction VisitObject(ObjectGraph::StackIterator* it) {
@@ -236,6 +235,7 @@
     size_ += obj->Size();
     return kProceed;
   }
+
  private:
   intptr_t size_;
 };
@@ -243,8 +243,9 @@
 
 class SizeExcludingObjectVisitor : public SizeVisitor {
  public:
-  explicit SizeExcludingObjectVisitor(const Object& skip) : skip_(skip) { }
+  explicit SizeExcludingObjectVisitor(const Object& skip) : skip_(skip) {}
   virtual bool ShouldSkip(RawObject* obj) const { return obj == skip_.raw(); }
+
  private:
   const Object& skip_;
 };
@@ -252,10 +253,11 @@
 
 class SizeExcludingClassVisitor : public SizeVisitor {
  public:
-  explicit SizeExcludingClassVisitor(intptr_t skip) : skip_(skip) { }
+  explicit SizeExcludingClassVisitor(intptr_t skip) : skip_(skip) {}
   virtual bool ShouldSkip(RawObject* obj) const {
     return obj->GetClassId() == skip_;
   }
+
  private:
   const intptr_t skip_;
 };
@@ -312,10 +314,10 @@
     // and it is less informative than its alternatives.
     intptr_t cid = obj->GetClassId();
     switch (cid) {
-    case kICDataCid:
-      return true;
-    default:
-      return false;
+      case kICDataCid:
+        return true;
+      default:
+        return false;
     }
   }
 
@@ -328,9 +330,7 @@
     return false;
   }
 
-  void StartList() {
-    was_last_array_ = false;
-  }
+  void StartList() { was_last_array_ = false; }
 
   intptr_t HideNDescendant(RawObject* obj) {
     // A GrowableObjectArray overwrites its internal storage.
@@ -408,8 +408,12 @@
                            RawObject* target,
                            const Array& references,
                            Object* scratch)
-    : ObjectPointerVisitor(isolate), source_(NULL),
-      target_(target), references_(references), scratch_(scratch), length_(0) {
+      : ObjectPointerVisitor(isolate),
+        source_(NULL),
+        target_(target),
+        references_(references),
+        scratch_(scratch),
+        length_(0) {
     ASSERT(Thread::Current()->no_safepoint_scope_depth() != 0);
   }
 
@@ -506,8 +510,10 @@
 };
 
 
-static void WriteHeader(RawObject* raw, intptr_t size, intptr_t cid,
-                 WriteStream* stream) {
+static void WriteHeader(RawObject* raw,
+                        intptr_t size,
+                        intptr_t cid,
+                        WriteStream* stream) {
   WritePtr(raw, stream);
   ASSERT(Utils::IsAligned(size, kObjectAlignment));
   stream->WriteUnsigned(size);
@@ -518,7 +524,7 @@
 class WriteGraphVisitor : public ObjectGraph::Visitor {
  public:
   WriteGraphVisitor(Isolate* isolate, WriteStream* stream)
-    : stream_(stream), ptr_writer_(isolate, stream), count_(0) {}
+      : stream_(stream), ptr_writer_(isolate, stream), count_(0) {}
 
   virtual Direction VisitObject(ObjectGraph::StackIterator* it) {
     RawObject* raw_obj = it->Get();
diff --git a/runtime/vm/object_graph.h b/runtime/vm/object_graph.h
index e42e419..cae668a 100644
--- a/runtime/vm/object_graph.h
+++ b/runtime/vm/object_graph.h
@@ -29,9 +29,10 @@
     bool MoveToParent();
     // Offset into parent for the pointer to current object. -1 if no parent.
     intptr_t OffsetFromParentInWords() const;
+
    private:
     StackIterator(const Stack* stack, intptr_t index)
-        : stack_(stack), index_(index) { }
+        : stack_(stack), index_(index) {}
     const Stack* stack_;
     intptr_t index_;
     friend class ObjectGraph::Stack;
@@ -46,7 +47,7 @@
       kBacktrack,  // Ignore this object's pointers.
       kAbort,      // Terminate the entire search immediately.
     };
-    virtual ~Visitor() { }
+    virtual ~Visitor() {}
     // Visits the object pointed to by *it. The iterator is only valid
     // during this call. This method must not allocate from the heap or
     // trigger GC in any way.
diff --git a/runtime/vm/object_graph_test.cc b/runtime/vm/object_graph_test.cc
index 801d01c..0b5c095 100644
--- a/runtime/vm/object_graph_test.cc
+++ b/runtime/vm/object_graph_test.cc
@@ -13,7 +13,7 @@
   // Records the number of objects and total size visited, excluding 'skip'
   // and any objects only reachable through 'skip'.
   CounterVisitor(RawObject* skip, RawObject* expected_parent)
-      : count_(0), size_(0), skip_(skip), expected_parent_(expected_parent) { }
+      : count_(0), size_(0), skip_(skip), expected_parent_(expected_parent) {}
 
   virtual Direction VisitObject(ObjectGraph::StackIterator* it) {
     RawObject* obj = it->Get();
@@ -74,8 +74,7 @@
       graph.IterateObjectsFrom(a, &without);
       // Only 'b' and 'c' were cut off.
       EXPECT_EQ(2, with.count() - without.count());
-      EXPECT_EQ(b_size + c_size,
-                with.size() - without.size());
+      EXPECT_EQ(b_size + c_size, with.size() - without.size());
     }
     {
       // Like above, but iterate over the entire isolate. The counts and sizes
@@ -85,8 +84,7 @@
       CounterVisitor without(b_raw, a.raw());
       graph.IterateObjects(&without);
       EXPECT_EQ(2, with.count() - without.count());
-      EXPECT_EQ(b_size + c_size,
-                with.size() - without.size());
+      EXPECT_EQ(b_size + c_size, with.size() - without.size());
     }
     EXPECT_EQ(a_size + b_size + c_size + d_size,
               graph.SizeRetainedByInstance(a));
diff --git a/runtime/vm/object_id_ring.h b/runtime/vm/object_id_ring.h
index 7b0fcde..4936316 100644
--- a/runtime/vm/object_id_ring.h
+++ b/runtime/vm/object_id_ring.h
@@ -28,9 +28,9 @@
   };
 
   enum IdPolicy {
-    kAllocateId,        // Always allocate a new object id.
-    kReuseId,           // If the object is already in the ring, reuse id.
-                        // Otherwise allocate a new object id.
+    kAllocateId,  // Always allocate a new object id.
+    kReuseId,     // If the object is already in the ring, reuse id.
+                  // Otherwise allocate a new object id.
     kNumIdPolicy,
   };
 
@@ -67,12 +67,8 @@
   int32_t serial_num_;
   bool wrapped_;
 
-  RawObject** table() {
-    return table_;
-  }
-  int32_t table_size() {
-    return capacity_;
-  }
+  RawObject** table() { return table_; }
+  int32_t table_size() { return capacity_; }
 
   int32_t NextSerial();
   int32_t AllocateNewId(RawObject* object);
diff --git a/runtime/vm/object_id_ring_test.cc b/runtime/vm/object_id_ring_test.cc
index dd64aa5..cbd3407 100644
--- a/runtime/vm/object_id_ring_test.cc
+++ b/runtime/vm/object_id_ring_test.cc
@@ -15,7 +15,8 @@
 
 class ObjectIdRingTestHelper {
  public:
-  static void SetCapacityAndMaxSerial(ObjectIdRing* ring, int32_t capacity,
+  static void SetCapacityAndMaxSerial(ObjectIdRing* ring,
+                                      int32_t capacity,
                                       int32_t max_serial) {
     ring->SetCapacityAndMaxSerial(capacity, max_serial);
   }
@@ -123,9 +124,9 @@
 // Test that the ring table is updated when the scavenger moves an object.
 TEST_CASE(ObjectIdRingScavengeMoveTest) {
   const char* kScriptChars =
-  "main() {\n"
-  "  return [1, 2, 3];\n"
-  "}\n";
+      "main() {\n"
+      "  return [1, 2, 3];\n"
+      "}\n";
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
   Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
   intptr_t list_length = 0;
@@ -145,14 +146,12 @@
   intptr_t raw_obj_id1 = ring->GetIdForObject(raw_obj);
   EXPECT_EQ(0, raw_obj_id1);
   // Get id 0 again.
-  EXPECT_EQ(raw_obj_id1,
-      ring->GetIdForObject(raw_obj, ObjectIdRing::kReuseId));
+  EXPECT_EQ(raw_obj_id1, ring->GetIdForObject(raw_obj, ObjectIdRing::kReuseId));
   // Add to ring a second time.
   intptr_t raw_obj_id2 = ring->GetIdForObject(raw_obj);
   EXPECT_EQ(1, raw_obj_id2);
   // Get id 0 again.
-  EXPECT_EQ(raw_obj_id1,
-      ring->GetIdForObject(raw_obj, ObjectIdRing::kReuseId));
+  EXPECT_EQ(raw_obj_id1, ring->GetIdForObject(raw_obj, ObjectIdRing::kReuseId));
   RawObject* raw_obj1 = ring->GetObjectForId(raw_obj_id1, &kind);
   EXPECT_EQ(ObjectIdRing::kValid, kind);
   RawObject* raw_obj2 = ring->GetObjectForId(raw_obj_id2, &kind);
@@ -186,7 +185,7 @@
   EXPECT_EQ(3, list_length);
   // Test id reuse.
   EXPECT_EQ(raw_obj_id1,
-      ring->GetIdForObject(raw_object_moved1, ObjectIdRing::kReuseId));
+            ring->GetIdForObject(raw_object_moved1, ObjectIdRing::kReuseId));
 }
 
 
diff --git a/runtime/vm/object_reload.cc b/runtime/vm/object_reload.cc
index 0429adf..a1318b7 100644
--- a/runtime/vm/object_reload.cc
+++ b/runtime/vm/object_reload.cc
@@ -58,7 +58,7 @@
 
 
 void Code::ResetICDatas(Zone* zone) const {
-  // Iterate over the Code's object pool and reset all ICDatas.
+// Iterate over the Code's object pool and reset all ICDatas.
 #ifdef TARGET_ARCH_IA32
   // IA32 does not have an object pool, but, we can iterate over all
   // embedded objects by using the variable length data section.
@@ -161,8 +161,7 @@
     return;
   }
   TIR_Print("Copied %" Pd " canonical constants for class `%s`\n",
-            old_constants.Length(),
-            ToCString());
+            old_constants.Length(), ToCString());
   set_constants(old_constants);
 }
 
@@ -238,8 +237,8 @@
   Instance& old_enum_values = Instance::Handle(zone);
   // The E.values array.
   Instance& enum_values = Instance::Handle(zone);
-  Array& enum_map_storage = Array::Handle(zone,
-      HashTables::New<UnorderedHashMap<EnumMapTraits> >(4));
+  Array& enum_map_storage =
+      Array::Handle(zone, HashTables::New<UnorderedHashMap<EnumMapTraits> >(4));
   ASSERT(!enum_map_storage.IsNull());
 
   TIR_Print("Replacing enum `%s`\n", String::Handle(Name()).ToCString());
@@ -316,8 +315,9 @@
 
   if (enums_deleted && FLAG_trace_reload_verbose) {
     // TODO(johnmccutchan): Add this to the reload 'notices' list.
-    VTIR_Print("The following enum values were deleted and are forever lost in "
-               "the heap:\n");
+    VTIR_Print(
+        "The following enum values were deleted and are forever lost in "
+        "the heap:\n");
     UnorderedHashMap<EnumMapTraits> enum_map(enum_map_storage.raw());
     UnorderedHashMap<EnumMapTraits>::Iterator it(&enum_map);
     while (it.MoveNext()) {
@@ -385,8 +385,7 @@
   Instance& new_closure = Instance::Handle();
   for (intptr_t i = 0; i < funcs.Length(); i++) {
     old_func ^= funcs.At(i);
-    if (old_func.is_static() &&
-      old_func.HasImplicitClosureFunction()) {
+    if (old_func.is_static() && old_func.HasImplicitClosureFunction()) {
       selector = old_func.name();
       new_func = new_cls.LookupFunction(selector);
       if (!new_func.IsNull() && new_func.is_static()) {
@@ -407,13 +406,13 @@
 class EnumClassConflict : public ClassReasonForCancelling {
  public:
   EnumClassConflict(Zone* zone, const Class& from, const Class& to)
-      : ClassReasonForCancelling(zone, from, to) { }
+      : ClassReasonForCancelling(zone, from, to) {}
 
   RawString* ToString() {
     return String::NewFormatted(
         from_.is_enum_class()
-        ? "Enum class cannot be redefined to be a non-enum class: %s"
-        : "Class cannot be redefined to be a enum class: %s",
+            ? "Enum class cannot be redefined to be a non-enum class: %s"
+            : "Class cannot be redefined to be a enum class: %s",
         from_.ToCString());
   }
 };
@@ -425,28 +424,26 @@
                        const Class& from,
                        const Class& to,
                        const Error& error)
-      : ClassReasonForCancelling(zone, from, to), error_(error) { }
+      : ClassReasonForCancelling(zone, from, to), error_(error) {}
 
  private:
   const Error& error_;
 
   RawError* ToError() { return error_.raw(); }
 
-  RawString* ToString() {
-    return String::New(error_.ToErrorCString());
-  }
+  RawString* ToString() { return String::New(error_.ToErrorCString()); }
 };
 
 
 class NativeFieldsConflict : public ClassReasonForCancelling {
  public:
   NativeFieldsConflict(Zone* zone, const Class& from, const Class& to)
-      : ClassReasonForCancelling(zone, from, to) { }
+      : ClassReasonForCancelling(zone, from, to) {}
 
  private:
   RawString* ToString() {
-    return String::NewFormatted(
-        "Number of native fields changed in %s", from_.ToCString());
+    return String::NewFormatted("Number of native fields changed in %s",
+                                from_.ToCString());
   }
 };
 
@@ -473,7 +470,7 @@
 };
 
 
-class PreFinalizedConflict :  public ClassReasonForCancelling {
+class PreFinalizedConflict : public ClassReasonForCancelling {
  public:
   PreFinalizedConflict(Zone* zone, const Class& from, const Class& to)
       : ClassReasonForCancelling(zone, from, to) {}
@@ -488,20 +485,18 @@
 };
 
 
-class InstanceSizeConflict :  public ClassReasonForCancelling {
+class InstanceSizeConflict : public ClassReasonForCancelling {
  public:
   InstanceSizeConflict(Zone* zone, const Class& from, const Class& to)
       : ClassReasonForCancelling(zone, from, to) {}
 
  private:
   RawString* ToString() {
-    return String::NewFormatted(
-        "Instance size mismatch between '%s' (%" Pd ") and replacement "
-        "'%s' ( %" Pd ")",
-        from_.ToCString(),
-        from_.instance_size(),
-        to_.ToCString(),
-        to_.instance_size());
+    return String::NewFormatted("Instance size mismatch between '%s' (%" Pd
+                                ") and replacement "
+                                "'%s' ( %" Pd ")",
+                                from_.ToCString(), from_.instance_size(),
+                                to_.ToCString(), to_.instance_size());
   }
 };
 
@@ -537,9 +532,8 @@
 
   // Class cannot change enum property.
   if (is_enum_class() != replacement.is_enum_class()) {
-    context->AddReasonForCancelling(
-        new(context->zone())
-            EnumClassConflict(context->zone(), *this, replacement));
+    context->AddReasonForCancelling(new (context->zone()) EnumClassConflict(
+        context->zone(), *this, replacement));
     return;
   }
 
@@ -549,7 +543,7 @@
         Error::Handle(replacement.EnsureIsFinalized(Thread::Current()));
     if (!error.IsNull()) {
       context->AddReasonForCancelling(
-          new(context->zone())
+          new (context->zone())
               EnsureFinalizedError(context->zone(), *this, replacement, error));
       return;  // No reason to check other properties.
     }
@@ -559,10 +553,9 @@
 
   // Native field count cannot change.
   if (num_native_fields() != replacement.num_native_fields()) {
-      context->AddReasonForCancelling(
-          new(context->zone())
-              NativeFieldsConflict(context->zone(), *this, replacement));
-      return;
+    context->AddReasonForCancelling(new (context->zone()) NativeFieldsConflict(
+        context->zone(), *this, replacement));
+    return;
   }
 
   // Just checking.
@@ -576,18 +569,17 @@
     if (!CanReloadPreFinalized(replacement, context)) return;
   }
   ASSERT(is_finalized() == replacement.is_finalized());
-  TIR_Print("Class `%s` can be reloaded (%" Pd " and %" Pd ")\n",
-            ToCString(), id(), replacement.id());
+  TIR_Print("Class `%s` can be reloaded (%" Pd " and %" Pd ")\n", ToCString(),
+            id(), replacement.id());
 }
 
 
-
 bool Class::RequiresInstanceMorphing(const Class& replacement) const {
   // Get the field maps for both classes. These field maps walk the class
   // hierarchy.
   const Array& fields = Array::Handle(OffsetToFieldMap());
-  const Array& replacement_fields
-      = Array::Handle(replacement.OffsetToFieldMap());
+  const Array& replacement_fields =
+      Array::Handle(replacement.OffsetToFieldMap());
 
   // Check that the size of the instance is the same.
   if (fields.Length() != replacement_fields.Length()) return true;
@@ -627,15 +619,13 @@
   const AbstractType& replacement_dt =
       AbstractType::Handle(replacement.DeclarationType());
   if (!dt.Equals(replacement_dt)) {
-    context->AddReasonForCancelling(
-        new(context->zone())
-            TypeParametersChanged(context->zone(), *this, replacement));
+    context->AddReasonForCancelling(new (context->zone()) TypeParametersChanged(
+        context->zone(), *this, replacement));
     return false;
   }
   if (RequiresInstanceMorphing(replacement)) {
-    context->AddInstanceMorpher(
-        new(context->zone())
-            InstanceMorpher(context->zone(), *this, replacement));
+    context->AddInstanceMorpher(new (context->zone()) InstanceMorpher(
+        context->zone(), *this, replacement));
   }
   return true;
 }
@@ -645,17 +635,15 @@
                                   IsolateReloadContext* context) const {
   // The replacement class must also prefinalized.
   if (!replacement.is_prefinalized()) {
-      context->AddReasonForCancelling(
-          new(context->zone())
-              PreFinalizedConflict(context->zone(), *this, replacement));
-      return false;
+    context->AddReasonForCancelling(new (context->zone()) PreFinalizedConflict(
+        context->zone(), *this, replacement));
+    return false;
   }
   // Check the instance sizes are equal.
   if (instance_size() != replacement.instance_size()) {
-      context->AddReasonForCancelling(
-          new(context->zone())
-              InstanceSizeConflict(context->zone(), *this, replacement));
-      return false;
+    context->AddReasonForCancelling(new (context->zone()) InstanceSizeConflict(
+        context->zone(), *this, replacement));
+    return false;
   }
   return true;
 }
@@ -672,9 +660,8 @@
     if (prefix.is_deferred_load()) {
       const String& prefix_name = String::Handle(prefix.name());
       context->AddReasonForCancelling(
-          new(context->zone())
-              UnimplementedDeferredLibrary(context->zone(),
-                                           *this, replacement, prefix_name));
+          new (context->zone()) UnimplementedDeferredLibrary(
+              context->zone(), *this, replacement, prefix_name));
       return;
     }
   }
@@ -741,8 +728,7 @@
 
     const Array& args_desc_array = Array::Handle(zone, arguments_descriptor());
     ArgumentsDescriptor args_desc(args_desc_array);
-    if (new_target.IsNull() ||
-        !new_target.AreValidArguments(args_desc, NULL)) {
+    if (new_target.IsNull() || !new_target.AreValidArguments(args_desc, NULL)) {
       // TODO(rmacnak): Patch to a NSME stub.
       VTIR_Print("Cannot rebind static call to %s from %s\n",
                  old_target.ToCString(),
@@ -764,4 +750,4 @@
 
 #endif  // !PRODUCT
 
-}   // namespace dart.
+}  // namespace dart.
diff --git a/runtime/vm/object_service.cc b/runtime/vm/object_service.cc
index b1a87ab..d5441a5 100644
--- a/runtime/vm/object_service.cc
+++ b/runtime/vm/object_service.cc
@@ -87,9 +87,7 @@
   jsobj.AddFixedServiceId("classes/%" Pd "", id());
   const String& scrubbed_name = String::Handle(ScrubbedName());
   const String& vm_name = String::Handle(Name());
-  AddNameProperties(&jsobj,
-                    scrubbed_name.ToCString(),
-                    vm_name.ToCString());
+  AddNameProperties(&jsobj, scrubbed_name.ToCString(), vm_name.ToCString());
   if (ref) {
     return;
   }
@@ -260,16 +258,16 @@
   }
   if (id != -1) {
     ASSERT(selector != NULL);
-    jsobj.AddFixedServiceId("classes/%" Pd "/%s/%" Pd "",
-                            cls.id(), selector, id);
+    jsobj.AddFixedServiceId("classes/%" Pd "/%s/%" Pd "", cls.id(), selector,
+                            id);
     return;
   }
   // Regular functions known to their owner use their name (percent-encoded).
   String& name = String::Handle(f.name());
   if (cls.LookupFunction(name) == f.raw()) {
     const char* encoded_name = String::EncodeIRI(name);
-    jsobj.AddFixedServiceId("classes/%" Pd "/functions/%s",
-                            cls.id(), encoded_name);
+    jsobj.AddFixedServiceId("classes/%" Pd "/functions/%s", cls.id(),
+                            encoded_name);
     return;
   }
   // Oddball functions (not known to their owner) fall back to use the object
@@ -356,8 +354,8 @@
   String& field_name = String::Handle(name());
   const char* encoded_field_name = String::EncodeIRI(field_name);
   AddCommonObjectProperties(&jsobj, "Field", ref);
-  jsobj.AddFixedServiceId("classes/%" Pd "/fields/%s",
-                          cls.id(), encoded_field_name);
+  jsobj.AddFixedServiceId("classes/%" Pd "/fields/%s", cls.id(),
+                          encoded_field_name);
 
   const String& user_name = String::Handle(UserVisibleName());
   const String& vm_name = String::Handle(name());
@@ -442,8 +440,7 @@
     jsobj.AddServiceId(*this);
   } else {
     jsobj.AddFixedServiceId("libraries/%" Pd "/scripts/%s/%" Px64 "",
-                            lib.index(), encoded_uri,
-                            load_timestamp());
+                            lib.index(), encoded_uri, load_timestamp());
   }
   jsobj.AddPropertyStr("uri", uri);
   jsobj.AddProperty("_kind", GetKindAsCString());
@@ -656,23 +653,23 @@
       JSONObject jsentry(stream);
       jsentry.AddProperty("offset", OffsetFromIndex(i));
       switch (InfoAt(i)) {
-      case ObjectPool::kTaggedObject:
-        obj = ObjectAt(i);
-        jsentry.AddProperty("kind", "Object");
-        jsentry.AddProperty("value", obj);
-        break;
-      case ObjectPool::kImmediate:
-        imm = RawValueAt(i);
-        jsentry.AddProperty("kind", "Immediate");
-        jsentry.AddProperty64("value", imm);
-        break;
-      case ObjectPool::kNativeEntry:
-        imm = RawValueAt(i);
-        jsentry.AddProperty("kind", "NativeEntry");
-        jsentry.AddProperty64("value", imm);
-        break;
-      default:
-        UNREACHABLE();
+        case ObjectPool::kTaggedObject:
+          obj = ObjectAt(i);
+          jsentry.AddProperty("kind", "Object");
+          jsentry.AddProperty("value", obj);
+          break;
+        case ObjectPool::kImmediate:
+          imm = RawValueAt(i);
+          jsentry.AddProperty("kind", "Immediate");
+          jsentry.AddProperty64("value", imm);
+          break;
+        case ObjectPool::kNativeEntry:
+          imm = RawValueAt(i);
+          jsentry.AddProperty("kind", "NativeEntry");
+          jsentry.AddProperty64("value", imm);
+          break;
+        default:
+          UNREACHABLE();
       }
     }
   }
@@ -717,8 +714,7 @@
 }
 
 
-void LocalVarDescriptors::PrintJSONImpl(JSONStream* stream,
-                                        bool ref) const {
+void LocalVarDescriptors::PrintJSONImpl(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
   AddCommonObjectProperties(&jsobj, "Object", ref);
   // TODO(johnmccutchan): Generate a stable id. LocalVarDescriptors hang off
@@ -745,8 +741,7 @@
 }
 
 
-void ExceptionHandlers::PrintJSONImpl(JSONStream* stream,
-                                      bool ref) const {
+void ExceptionHandlers::PrintJSONImpl(JSONStream* stream, bool ref) const {
   Object::PrintJSONImpl(stream, ref);
 }
 
@@ -807,8 +802,7 @@
 void Code::PrintJSONImpl(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
   AddCommonObjectProperties(&jsobj, "Code", ref);
-  jsobj.AddFixedServiceId("code/%" Px64"-%" Px "",
-                          compile_timestamp(),
+  jsobj.AddFixedServiceId("code/%" Px64 "-%" Px "", compile_timestamp(),
                           PayloadStart());
   const char* qualified_name = QualifiedName();
   const char* vm_name = Name();
@@ -981,8 +975,7 @@
 }
 
 
-void UnhandledException::PrintJSONImpl(JSONStream* stream,
-                                       bool ref) const {
+void UnhandledException::PrintJSONImpl(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
   AddCommonObjectProperties(&jsobj, "Error", ref);
   jsobj.AddProperty("kind", "UnhandledException");
@@ -1010,8 +1003,7 @@
 }
 
 
-void Instance::PrintSharedInstanceJSON(JSONObject* jsobj,
-                                       bool ref) const {
+void Instance::PrintSharedInstanceJSON(JSONObject* jsobj, bool ref) const {
   AddCommonObjectProperties(jsobj, "Instance", ref);
   if (ref) {
     return;
@@ -1311,8 +1303,7 @@
 }
 
 
-void GrowableObjectArray::PrintJSONImpl(JSONStream* stream,
-                                        bool ref) const {
+void GrowableObjectArray::PrintJSONImpl(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
   PrintSharedInstanceJSON(&jsobj, ref);
   jsobj.AddProperty("kind", "List");
@@ -1433,16 +1424,14 @@
     jsobj.AddProperty("bytes", "");
   } else {
     NoSafepointScope no_safepoint;
-    jsobj.AddPropertyBase64("bytes",
-                            reinterpret_cast<const uint8_t*>(
-                                DataAddr(offset * ElementSizeInBytes())),
+    jsobj.AddPropertyBase64("bytes", reinterpret_cast<const uint8_t*>(DataAddr(
+                                         offset * ElementSizeInBytes())),
                             count * ElementSizeInBytes());
   }
 }
 
 
-void ExternalTypedData::PrintJSONImpl(JSONStream* stream,
-                                      bool ref) const {
+void ExternalTypedData::PrintJSONImpl(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
   PrintSharedInstanceJSON(&jsobj, ref);
   const Class& cls = Class::Handle(clazz());
@@ -1466,9 +1455,8 @@
     jsobj.AddProperty("bytes", "");
   } else {
     NoSafepointScope no_safepoint;
-    jsobj.AddPropertyBase64("bytes",
-                            reinterpret_cast<const uint8_t*>(
-                                DataAddr(offset * ElementSizeInBytes())),
+    jsobj.AddPropertyBase64("bytes", reinterpret_cast<const uint8_t*>(DataAddr(
+                                         offset * ElementSizeInBytes())),
                             count * ElementSizeInBytes());
   }
 }
diff --git a/runtime/vm/object_set.h b/runtime/vm/object_set.h
index f4031fb..a153377 100644
--- a/runtime/vm/object_set.h
+++ b/runtime/vm/object_set.h
@@ -19,8 +19,7 @@
       : start_(start),
         end_(end),
         bit_vector_(zone, (end - start) >> kWordSizeLog2),
-        next_(NULL) {
-  }
+        next_(NULL) {}
 
   bool ContainsAddress(uword address) {
     return address >= start_ && address < end_;
@@ -31,9 +30,7 @@
     return (address - start_) >> kWordSizeLog2;
   }
 
-  void AddObject(uword address) {
-    bit_vector_.Add(IndexForAddress(address));
-  }
+  void AddObject(uword address) { bit_vector_.Add(IndexForAddress(address)); }
 
   bool ContainsObject(uword address) {
     return bit_vector_.Contains(IndexForAddress(address));
@@ -51,18 +48,17 @@
 
 class ObjectSet : public ZoneAllocated {
  public:
-  explicit ObjectSet(Zone* zone) : zone_(zone), head_(NULL) { }
+  explicit ObjectSet(Zone* zone) : zone_(zone), head_(NULL) {}
 
   void AddRegion(uword start, uword end) {
-    ObjectSetRegion* region = new(zone_) ObjectSetRegion(zone_, start, end);
+    ObjectSetRegion* region = new (zone_) ObjectSetRegion(zone_, start, end);
     region->set_next(head_);
     head_ = region;
   }
 
   bool Contains(RawObject* raw_obj) const {
     uword raw_addr = RawObject::ToAddr(raw_obj);
-    for (ObjectSetRegion* region = head_;
-         region != NULL;
+    for (ObjectSetRegion* region = head_; region != NULL;
          region = region->next()) {
       if (region->ContainsAddress(raw_addr)) {
         return region->ContainsObject(raw_addr);
@@ -73,8 +69,7 @@
 
   void Add(RawObject* raw_obj) {
     uword raw_addr = RawObject::ToAddr(raw_obj);
-    for (ObjectSetRegion* region = head_;
-         region != NULL;
+    for (ObjectSetRegion* region = head_; region != NULL;
          region = region->next()) {
       if (region->ContainsAddress(raw_addr)) {
         return region->AddObject(raw_addr);
diff --git a/runtime/vm/object_store.cc b/runtime/vm/object_store.cc
index 8812a8e..a4e4958 100644
--- a/runtime/vm/object_store.cc
+++ b/runtime/vm/object_store.cc
@@ -15,99 +15,98 @@
 namespace dart {
 
 ObjectStore::ObjectStore()
-  : object_class_(Class::null()),
-    object_type_(Type::null()),
-    null_class_(Class::null()),
-    null_type_(Type::null()),
-    function_type_(Type::null()),
-    closure_class_(Class::null()),
-    number_type_(Type::null()),
-    int_type_(Type::null()),
-    integer_implementation_class_(Class::null()),
-    smi_class_(Class::null()),
-    smi_type_(Type::null()),
-    mint_class_(Class::null()),
-    mint_type_(Type::null()),
-    bigint_class_(Class::null()),
-    double_class_(Class::null()),
-    double_type_(Type::null()),
-    float32x4_type_(Type::null()),
-    int32x4_type_(Type::null()),
-    float64x2_type_(Type::null()),
-    string_type_(Type::null()),
-    compiletime_error_class_(Class::null()),
-    future_class_(Class::null()),
-    completer_class_(Class::null()),
-    stream_iterator_class_(Class::null()),
-    symbol_class_(Class::null()),
-    one_byte_string_class_(Class::null()),
-    two_byte_string_class_(Class::null()),
-    external_one_byte_string_class_(Class::null()),
-    external_two_byte_string_class_(Class::null()),
-    bool_type_(Type::null()),
-    bool_class_(Class::null()),
-    array_class_(Class::null()),
-    array_type_(Type::null()),
-    immutable_array_class_(Class::null()),
-    growable_object_array_class_(Class::null()),
-    linked_hash_map_class_(Class::null()),
-    float32x4_class_(Class::null()),
-    int32x4_class_(Class::null()),
-    float64x2_class_(Class::null()),
-    error_class_(Class::null()),
-    weak_property_class_(Class::null()),
-    symbol_table_(Array::null()),
-    canonical_types_(Array::null()),
-    canonical_type_arguments_(Array::null()),
-    async_library_(Library::null()),
-    builtin_library_(Library::null()),
-    core_library_(Library::null()),
-    collection_library_(Library::null()),
-    convert_library_(Library::null()),
-    developer_library_(Library::null()),
-    internal_library_(Library::null()),
-    isolate_library_(Library::null()),
-    math_library_(Library::null()),
-    mirrors_library_(Library::null()),
-    native_wrappers_library_(Library::null()),
-    profiler_library_(Library::null()),
-    root_library_(Library::null()),
-    typed_data_library_(Library::null()),
-    vmservice_library_(Library::null()),
-    libraries_(GrowableObjectArray::null()),
-    libraries_map_(Array::null()),
-    closure_functions_(GrowableObjectArray::null()),
-    pending_classes_(GrowableObjectArray::null()),
-    pending_deferred_loads_(GrowableObjectArray::null()),
-    resume_capabilities_(GrowableObjectArray::null()),
-    exit_listeners_(GrowableObjectArray::null()),
-    error_listeners_(GrowableObjectArray::null()),
-    empty_context_(Context::null()),
-    stack_overflow_(Instance::null()),
-    out_of_memory_(Instance::null()),
-    preallocated_unhandled_exception_(UnhandledException::null()),
-    preallocated_stack_trace_(Stacktrace::null()),
-    lookup_port_handler_(Function::null()),
-    empty_uint32_array_(TypedData::null()),
-    handle_message_function_(Function::null()),
-    simple_instance_of_function_(Function::null()),
-    simple_instance_of_true_function_(Function::null()),
-    simple_instance_of_false_function_(Function::null()),
-    library_load_error_table_(Array::null()),
-    unique_dynamic_targets_(Array::null()),
-    token_objects_(GrowableObjectArray::null()),
-    token_objects_map_(Array::null()),
-    megamorphic_cache_table_(GrowableObjectArray::null()),
-    megamorphic_miss_code_(Code::null()),
-    megamorphic_miss_function_(Function::null()) {
+    : object_class_(Class::null()),
+      object_type_(Type::null()),
+      null_class_(Class::null()),
+      null_type_(Type::null()),
+      function_type_(Type::null()),
+      closure_class_(Class::null()),
+      number_type_(Type::null()),
+      int_type_(Type::null()),
+      integer_implementation_class_(Class::null()),
+      smi_class_(Class::null()),
+      smi_type_(Type::null()),
+      mint_class_(Class::null()),
+      mint_type_(Type::null()),
+      bigint_class_(Class::null()),
+      double_class_(Class::null()),
+      double_type_(Type::null()),
+      float32x4_type_(Type::null()),
+      int32x4_type_(Type::null()),
+      float64x2_type_(Type::null()),
+      string_type_(Type::null()),
+      compiletime_error_class_(Class::null()),
+      future_class_(Class::null()),
+      completer_class_(Class::null()),
+      stream_iterator_class_(Class::null()),
+      symbol_class_(Class::null()),
+      one_byte_string_class_(Class::null()),
+      two_byte_string_class_(Class::null()),
+      external_one_byte_string_class_(Class::null()),
+      external_two_byte_string_class_(Class::null()),
+      bool_type_(Type::null()),
+      bool_class_(Class::null()),
+      array_class_(Class::null()),
+      array_type_(Type::null()),
+      immutable_array_class_(Class::null()),
+      growable_object_array_class_(Class::null()),
+      linked_hash_map_class_(Class::null()),
+      float32x4_class_(Class::null()),
+      int32x4_class_(Class::null()),
+      float64x2_class_(Class::null()),
+      error_class_(Class::null()),
+      weak_property_class_(Class::null()),
+      symbol_table_(Array::null()),
+      canonical_types_(Array::null()),
+      canonical_type_arguments_(Array::null()),
+      async_library_(Library::null()),
+      builtin_library_(Library::null()),
+      core_library_(Library::null()),
+      collection_library_(Library::null()),
+      convert_library_(Library::null()),
+      developer_library_(Library::null()),
+      _internal_library_(Library::null()),
+      isolate_library_(Library::null()),
+      math_library_(Library::null()),
+      mirrors_library_(Library::null()),
+      native_wrappers_library_(Library::null()),
+      profiler_library_(Library::null()),
+      root_library_(Library::null()),
+      typed_data_library_(Library::null()),
+      _vmservice_library_(Library::null()),
+      libraries_(GrowableObjectArray::null()),
+      libraries_map_(Array::null()),
+      closure_functions_(GrowableObjectArray::null()),
+      pending_classes_(GrowableObjectArray::null()),
+      pending_deferred_loads_(GrowableObjectArray::null()),
+      resume_capabilities_(GrowableObjectArray::null()),
+      exit_listeners_(GrowableObjectArray::null()),
+      error_listeners_(GrowableObjectArray::null()),
+      empty_context_(Context::null()),
+      stack_overflow_(Instance::null()),
+      out_of_memory_(Instance::null()),
+      preallocated_unhandled_exception_(UnhandledException::null()),
+      preallocated_stack_trace_(Stacktrace::null()),
+      lookup_port_handler_(Function::null()),
+      empty_uint32_array_(TypedData::null()),
+      handle_message_function_(Function::null()),
+      simple_instance_of_function_(Function::null()),
+      simple_instance_of_true_function_(Function::null()),
+      simple_instance_of_false_function_(Function::null()),
+      library_load_error_table_(Array::null()),
+      unique_dynamic_targets_(Array::null()),
+      token_objects_(GrowableObjectArray::null()),
+      token_objects_map_(Array::null()),
+      megamorphic_cache_table_(GrowableObjectArray::null()),
+      megamorphic_miss_code_(Code::null()),
+      megamorphic_miss_function_(Function::null()) {
   for (RawObject** current = from(); current <= to(); current++) {
     ASSERT(*current == Object::null());
   }
 }
 
 
-ObjectStore::~ObjectStore() {
-}
+ObjectStore::~ObjectStore() {}
 
 
 void ObjectStore::VisitObjectPointers(ObjectPointerVisitor* visitor) {
@@ -134,9 +133,9 @@
     JSONObject fields(jsobj, "fields");
     Object& value = Object::Handle();
 #define PRINT_OBJECT_STORE_FIELD(type, name)                                   \
-    value = name;                                                              \
-    fields.AddProperty(#name, value);
-OBJECT_STORE_FIELD_LIST(PRINT_OBJECT_STORE_FIELD);
+  value = name;                                                                \
+  fields.AddProperty(#name, value);
+    OBJECT_STORE_FIELD_LIST(PRINT_OBJECT_STORE_FIELD);
 #undef PRINT_OBJECT_STORE_FIELD
   }
 }
@@ -167,19 +166,17 @@
   Object& result = Object::Handle();
   const Library& library = Library::Handle(Library::CoreLibrary());
 
-  result = DartLibraryCalls::InstanceCreate(library,
-                                            Symbols::StackOverflowError(),
-                                            Symbols::Dot(),
-                                            Object::empty_array());
+  result =
+      DartLibraryCalls::InstanceCreate(library, Symbols::StackOverflowError(),
+                                       Symbols::Dot(), Object::empty_array());
   if (result.IsError()) {
     return Error::Cast(result).raw();
   }
   set_stack_overflow(Instance::Cast(result));
 
-  result = DartLibraryCalls::InstanceCreate(library,
-                                            Symbols::OutOfMemoryError(),
-                                            Symbols::Dot(),
-                                            Object::empty_array());
+  result =
+      DartLibraryCalls::InstanceCreate(library, Symbols::OutOfMemoryError(),
+                                       Symbols::Dot(), Object::empty_array());
   if (result.IsError()) {
     return Error::Cast(result).raw();
   }
@@ -187,17 +184,17 @@
 
   // Allocate pre-allocated unhandled exception object initialized with the
   // pre-allocated OutOfMemoryError.
-  const UnhandledException& unhandled_exception = UnhandledException::Handle(
-      UnhandledException::New(Instance::Cast(result),
-                              Stacktrace::Handle(zone)));
+  const UnhandledException& unhandled_exception =
+      UnhandledException::Handle(UnhandledException::New(
+          Instance::Cast(result), Stacktrace::Handle(zone)));
   set_preallocated_unhandled_exception(unhandled_exception);
 
-  const Array& code_array = Array::Handle(zone,
-      Array::New(Stacktrace::kPreallocatedStackdepth, Heap::kOld));
-  const Array& pc_offset_array = Array::Handle(zone,
-      Array::New(Stacktrace::kPreallocatedStackdepth, Heap::kOld));
-  const Stacktrace& stack_trace = Stacktrace::Handle(zone,
-      Stacktrace::New(code_array, pc_offset_array));
+  const Array& code_array = Array::Handle(
+      zone, Array::New(Stacktrace::kPreallocatedStackdepth, Heap::kOld));
+  const Array& pc_offset_array = Array::Handle(
+      zone, Array::New(Stacktrace::kPreallocatedStackdepth, Heap::kOld));
+  const Stacktrace& stack_trace =
+      Stacktrace::Handle(zone, Stacktrace::New(code_array, pc_offset_array));
   // Expansion of inlined functions requires additional memory at run time,
   // avoid it.
   stack_trace.set_expand_inlined(false);
@@ -240,7 +237,7 @@
   ASSERT(!cls.IsNull());
   set_stream_iterator_class(cls);
 
-  const Library& internal_lib = Library::Handle(internal_library());
+  const Library& internal_lib = Library::Handle(_internal_library());
   cls = internal_lib.LookupClass(Symbols::Symbol());
   set_symbol_class(cls);
 
diff --git a/runtime/vm/object_store.h b/runtime/vm/object_store.h
index 0ff6a8e..8be015e 100644
--- a/runtime/vm/object_store.h
+++ b/runtime/vm/object_store.h
@@ -13,6 +13,32 @@
 class Isolate;
 class ObjectPointerVisitor;
 
+// A list of the bootstrap libraries including CamelName and name.
+//
+// These are listed in the order that they are compiled (see vm/bootstrap.cc).
+#define FOR_EACH_PRODUCT_LIBRARY(M)                                            \
+  M(Core, core)                                                                \
+  M(Async, async)                                                              \
+  M(Collection, collection)                                                    \
+  M(Convert, convert)                                                          \
+  M(Developer, developer)                                                      \
+  M(Internal, _internal)                                                       \
+  M(Isolate, isolate)                                                          \
+  M(Math, math)                                                                \
+  M(Profiler, profiler)                                                        \
+  M(TypedData, typed_data)                                                     \
+  M(VMService, _vmservice)
+
+#ifdef PRODUCT
+#define FOR_EACH_BOOTSTRAP_LIBRARY(M) FOR_EACH_PRODUCT_LIBRARY(M)
+
+#else
+#define FOR_EACH_BOOTSTRAP_LIBRARY(M)                                          \
+  FOR_EACH_PRODUCT_LIBRARY(M)                                                  \
+  M(Mirrors, mirrors)
+
+#endif
+
 // The object store is a per isolate instance which stores references to
 // objects used by the VM.
 // TODO(iposva): Move the actual store into the object heap for quick handling
@@ -20,19 +46,10 @@
 class ObjectStore {
  public:
   enum BootstrapLibraryId {
-    kNone = 0,
-    kAsync,
-    kCore,
-    kCollection,
-    kConvert,
-    kDeveloper,
-    kInternal,
-    kIsolate,
-    kMath,
-    kMirrors,
-    kProfiler,
-    kTypedData,
-    kVMService,
+#define MAKE_ID(Name, _) k##Name,
+
+    FOR_EACH_BOOTSTRAP_LIBRARY(MAKE_ID)
+#undef MAKE_ID
   };
 
   ~ObjectStore();
@@ -47,9 +64,7 @@
   }
 
   RawType* object_type() const { return object_type_; }
-  void set_object_type(const Type& value) {
-    object_type_ = value.raw();
-  }
+  void set_object_type(const Type& value) { object_type_ = value.raw(); }
 
   RawClass* null_class() const {
     ASSERT(null_class_ != Object::null());
@@ -58,29 +73,19 @@
   void set_null_class(const Class& value) { null_class_ = value.raw(); }
 
   RawType* null_type() const { return null_type_; }
-  void set_null_type(const Type& value) {
-    null_type_ = value.raw();
-  }
+  void set_null_type(const Type& value) { null_type_ = value.raw(); }
 
   RawType* function_type() const { return function_type_; }
-  void set_function_type(const Type& value) {
-    function_type_ = value.raw();
-  }
+  void set_function_type(const Type& value) { function_type_ = value.raw(); }
 
   RawClass* closure_class() const { return closure_class_; }
-  void set_closure_class(const Class& value) {
-    closure_class_ = value.raw();
-  }
+  void set_closure_class(const Class& value) { closure_class_ = value.raw(); }
 
   RawType* number_type() const { return number_type_; }
-  void set_number_type(const Type& value) {
-    number_type_ = value.raw();
-  }
+  void set_number_type(const Type& value) { number_type_ = value.raw(); }
 
   RawType* int_type() const { return int_type_; }
-  void set_int_type(const Type& value) {
-    int_type_ = value.raw();
-  }
+  void set_int_type(const Type& value) { int_type_ = value.raw(); }
   static intptr_t int_type_offset() {
     return OFFSET_OF(ObjectStore, int_type_);
   }
@@ -117,24 +122,18 @@
   void set_bigint_class(const Class& value) { bigint_class_ = value.raw(); }
 
   RawType* string_type() const { return string_type_; }
-  void set_string_type(const Type& value) {
-    string_type_ = value.raw();
-  }
+  void set_string_type(const Type& value) { string_type_ = value.raw(); }
   static intptr_t string_type_offset() {
     return OFFSET_OF(ObjectStore, string_type_);
   }
 
-  RawClass* compiletime_error_class() const {
-    return compiletime_error_class_;
-  }
+  RawClass* compiletime_error_class() const { return compiletime_error_class_; }
   void set_compiletime_error_class(const Class& value) {
     compiletime_error_class_ = value.raw();
   }
 
   RawClass* future_class() const { return future_class_; }
-  void set_future_class(const Class& value) {
-    future_class_ = value.raw();
-  }
+  void set_future_class(const Class& value) { future_class_ = value.raw(); }
 
   RawClass* completer_class() const { return completer_class_; }
   void set_completer_class(const Class& value) {
@@ -147,9 +146,7 @@
   }
 
   RawClass* symbol_class() { return symbol_class_; }
-  void set_symbol_class(const Class& value) {
-    symbol_class_ = value.raw();
-  }
+  void set_symbol_class(const Class& value) { symbol_class_ = value.raw(); }
 
   RawClass* one_byte_string_class() const { return one_byte_string_class_; }
   void set_one_byte_string_class(const Class& value) {
@@ -205,16 +202,12 @@
     return OFFSET_OF(ObjectStore, growable_object_array_class_);
   }
 
-  RawClass* linked_hash_map_class() const {
-    return linked_hash_map_class_;
-  }
+  RawClass* linked_hash_map_class() const { return linked_hash_map_class_; }
   void set_linked_hash_map_class(const Class& value) {
     linked_hash_map_class_ = value.raw();
   }
 
-  RawClass* float32x4_class() const {
-    return float32x4_class_;
-  }
+  RawClass* float32x4_class() const { return float32x4_class_; }
   void set_float32x4_class(const Class& value) {
     float32x4_class_ = value.raw();
   }
@@ -222,19 +215,13 @@
   RawType* float32x4_type() const { return float32x4_type_; }
   void set_float32x4_type(const Type& value) { float32x4_type_ = value.raw(); }
 
-  RawClass* int32x4_class() const {
-    return int32x4_class_;
-  }
-  void set_int32x4_class(const Class& value) {
-    int32x4_class_ = value.raw();
-  }
+  RawClass* int32x4_class() const { return int32x4_class_; }
+  void set_int32x4_class(const Class& value) { int32x4_class_ = value.raw(); }
 
   RawType* int32x4_type() const { return int32x4_type_; }
   void set_int32x4_type(const Type& value) { int32x4_type_ = value.raw(); }
 
-  RawClass* float64x2_class() const {
-    return float64x2_class_;
-  }
+  RawClass* float64x2_class() const { return float64x2_class_; }
   void set_float64x2_class(const Class& value) {
     float64x2_class_ = value.raw();
   }
@@ -242,19 +229,13 @@
   RawType* float64x2_type() const { return float64x2_type_; }
   void set_float64x2_type(const Type& value) { float64x2_type_ = value.raw(); }
 
-  RawClass* error_class() const {
-    return error_class_;
-  }
-  void set_error_class(const Class& value) {
-    error_class_ = value.raw();
-  }
+  RawClass* error_class() const { return error_class_; }
+  void set_error_class(const Class& value) { error_class_ = value.raw(); }
   static intptr_t error_class_offset() {
     return OFFSET_OF(ObjectStore, error_class_);
   }
 
-  RawClass* weak_property_class() const {
-    return weak_property_class_;
-  }
+  RawClass* weak_property_class() const { return weak_property_class_; }
   void set_weak_property_class(const Class& value) {
     weak_property_class_ = value.raw();
   }
@@ -262,9 +243,7 @@
   RawArray* symbol_table() const { return symbol_table_; }
   void set_symbol_table(const Array& value) { symbol_table_ = value.raw(); }
 
-  RawArray* canonical_types() const {
-    return canonical_types_;
-  }
+  RawArray* canonical_types() const { return canonical_types_; }
   void set_canonical_types(const Array& value) {
     canonical_types_ = value.raw();
   }
@@ -276,58 +255,36 @@
     canonical_type_arguments_ = value.raw();
   }
 
-  RawLibrary* async_library() const { return async_library_; }
-  RawLibrary* builtin_library() const { return builtin_library_; }
-  RawLibrary* core_library() const { return core_library_; }
-  RawLibrary* collection_library() const { return collection_library_; }
-  RawLibrary* convert_library() const { return convert_library_; }
-  RawLibrary* developer_library() const { return developer_library_; }
-  RawLibrary* internal_library() const { return internal_library_; }
-  RawLibrary* isolate_library() const { return isolate_library_; }
-  RawLibrary* math_library() const { return math_library_; }
-  RawLibrary* mirrors_library() const { return mirrors_library_; }
-  RawLibrary* profiler_library() const { return profiler_library_; }
-  RawLibrary* typed_data_library() const { return typed_data_library_; }
-  RawLibrary* vmservice_library() const { return vmservice_library_; }
+#define MAKE_GETTER(_, name)                                                   \
+  RawLibrary* name##_library() const { return name##_library_; }
+
+  FOR_EACH_BOOTSTRAP_LIBRARY(MAKE_GETTER)
+#undef MAKE_GETTER
+
+  RawLibrary* bootstrap_library(BootstrapLibraryId index) {
+    switch (index) {
+#define MAKE_CASE(CamelName, name)                                             \
+  case k##CamelName:                                                           \
+    return name##_library_;
+
+      FOR_EACH_BOOTSTRAP_LIBRARY(MAKE_CASE)
+#undef MAKE_CASE
+
+      default:
+        UNREACHABLE();
+        return Library::null();
+    }
+  }
 
   void set_bootstrap_library(BootstrapLibraryId index, const Library& value) {
     switch (index) {
-      case kAsync:
-        async_library_ = value.raw();
-        break;
-      case kCore:
-        core_library_ = value.raw();
-        break;
-      case kCollection:
-        collection_library_ = value.raw();
-        break;
-      case kConvert:
-        convert_library_ = value.raw();
-        break;
-      case kDeveloper:
-        developer_library_ = value.raw();
-        break;
-      case kInternal:
-        internal_library_ = value.raw();
-        break;
-      case kIsolate:
-        isolate_library_ = value.raw();
-        break;
-      case kMath:
-        math_library_ = value.raw();
-        break;
-      case kMirrors:
-        mirrors_library_ = value.raw();
-        break;
-      case kProfiler:
-        profiler_library_ = value.raw();
-        break;
-      case kTypedData:
-        typed_data_library_ = value.raw();
-        break;
-      case kVMService:
-        vmservice_library_ = value.raw();
-        break;
+#define MAKE_CASE(CamelName, name)                                             \
+  case k##CamelName:                                                           \
+    name##_library_ = value.raw();                                             \
+    break;
+
+      FOR_EACH_BOOTSTRAP_LIBRARY(MAKE_CASE)
+#undef MAKE_CASE
       default:
         UNREACHABLE();
     }
@@ -345,9 +302,7 @@
   }
 
   RawLibrary* root_library() const { return root_library_; }
-  void set_root_library(const Library& value) {
-    root_library_ = value.raw();
-  }
+  void set_root_library(const Library& value) { root_library_ = value.raw(); }
 
   RawGrowableObjectArray* libraries() const { return libraries_; }
   void set_libraries(const GrowableObjectArray& value) {
@@ -355,9 +310,7 @@
   }
 
   RawArray* libraries_map() const { return libraries_map_; }
-  void set_libraries_map(const Array& value) {
-    libraries_map_ = value.raw();
-  }
+  void set_libraries_map(const Array& value) { libraries_map_ = value.raw(); }
 
   RawGrowableObjectArray* closure_functions() const {
     return closure_functions_;
@@ -384,18 +337,12 @@
     return resume_capabilities_;
   }
 
-  RawGrowableObjectArray* exit_listeners() const {
-    return exit_listeners_;
-  }
+  RawGrowableObjectArray* exit_listeners() const { return exit_listeners_; }
 
-  RawGrowableObjectArray* error_listeners() const {
-    return error_listeners_;
-  }
+  RawGrowableObjectArray* error_listeners() const { return error_listeners_; }
 
   RawContext* empty_context() const { return empty_context_; }
-  void set_empty_context(const Context& value) {
-    empty_context_ = value.raw();
-  }
+  void set_empty_context(const Context& value) { empty_context_ = value.raw(); }
 
   RawInstance* stack_overflow() const { return stack_overflow_; }
   void set_stack_overflow(const Instance& value) {
@@ -421,16 +368,12 @@
     preallocated_stack_trace_ = value.raw();
   }
 
-  RawFunction* lookup_port_handler() const {
-    return lookup_port_handler_;
-  }
+  RawFunction* lookup_port_handler() const { return lookup_port_handler_; }
   void set_lookup_port_handler(const Function& function) {
     lookup_port_handler_ = function.raw();
   }
 
-  RawTypedData* empty_uint32_array() const {
-    return empty_uint32_array_;
-  }
+  RawTypedData* empty_uint32_array() const { return empty_uint32_array_; }
   void set_empty_uint32_array(const TypedData& array) {
     // Only set once.
     ASSERT(empty_uint32_array_ == TypedData::null());
@@ -455,23 +398,17 @@
     return OFFSET_OF(ObjectStore, library_load_error_table_);
   }
 
-  RawArray* unique_dynamic_targets() const {
-    return unique_dynamic_targets_;
-  }
+  RawArray* unique_dynamic_targets() const { return unique_dynamic_targets_; }
   void set_unique_dynamic_targets(const Array& value) {
     unique_dynamic_targets_ = value.raw();
   }
 
-  RawGrowableObjectArray* token_objects() const {
-    return token_objects_;
-  }
+  RawGrowableObjectArray* token_objects() const { return token_objects_; }
   void set_token_objects(const GrowableObjectArray& value) {
     token_objects_ = value.raw();
   }
 
-  RawArray* token_objects_map() const {
-    return token_objects_map_;
-  }
+  RawArray* token_objects_map() const { return token_objects_map_; }
   void set_token_objects_map(const Array& value) {
     token_objects_map_ = value.raw();
   }
@@ -482,9 +419,7 @@
   void set_megamorphic_cache_table(const GrowableObjectArray& value) {
     megamorphic_cache_table_ = value.raw();
   }
-  RawCode* megamorphic_miss_code() const {
-    return megamorphic_miss_code_;
-  }
+  RawCode* megamorphic_miss_code() const { return megamorphic_miss_code_; }
   RawFunction* megamorphic_miss_function() const {
     return megamorphic_miss_function_;
   }
@@ -577,7 +512,7 @@
   V(RawLibrary*, collection_library_)                                          \
   V(RawLibrary*, convert_library_)                                             \
   V(RawLibrary*, developer_library_)                                           \
-  V(RawLibrary*, internal_library_)                                            \
+  V(RawLibrary*, _internal_library_)                                           \
   V(RawLibrary*, isolate_library_)                                             \
   V(RawLibrary*, math_library_)                                                \
   V(RawLibrary*, mirrors_library_)                                             \
@@ -585,7 +520,7 @@
   V(RawLibrary*, profiler_library_)                                            \
   V(RawLibrary*, root_library_)                                                \
   V(RawLibrary*, typed_data_library_)                                          \
-  V(RawLibrary*, vmservice_library_)                                           \
+  V(RawLibrary*, _vmservice_library_)                                          \
   V(RawGrowableObjectArray*, libraries_)                                       \
   V(RawArray*, libraries_map_)                                                 \
   V(RawGrowableObjectArray*, closure_functions_)                               \
@@ -615,9 +550,8 @@
   // Please remember the last entry must be referred in the 'to' function below.
 
   RawObject** from() { return reinterpret_cast<RawObject**>(&object_class_); }
-#define DECLARE_OBJECT_STORE_FIELD(type, name)                                 \
-  type name;
-OBJECT_STORE_FIELD_LIST(DECLARE_OBJECT_STORE_FIELD)
+#define DECLARE_OBJECT_STORE_FIELD(type, name) type name;
+  OBJECT_STORE_FIELD_LIST(DECLARE_OBJECT_STORE_FIELD)
 #undef DECLARE_OBJECT_STORE_FIELD
   RawObject** to() {
     return reinterpret_cast<RawObject**>(&megamorphic_miss_function_);
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index 0cd21ea..c0ac1ad 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -62,14 +62,14 @@
   Function& function = Function::Handle();
   String& function_name = String::Handle();
   function_name = Symbols::New(thread, "foo");
-  function = Function::New(
-      function_name, RawFunction::kRegularFunction,
-      false, false, false, false, false, cls, TokenPosition::kMinSource);
+  function =
+      Function::New(function_name, RawFunction::kRegularFunction, false, false,
+                    false, false, false, cls, TokenPosition::kMinSource);
   functions.SetAt(0, function);
   function_name = Symbols::New(thread, "bar");
-  function = Function::New(
-      function_name, RawFunction::kRegularFunction,
-      false, false, false, false, false, cls, TokenPosition::kMinSource);
+  function =
+      Function::New(function_name, RawFunction::kRegularFunction, false, false,
+                    false, false, false, cls, TokenPosition::kMinSource);
 
   const int kNumFixedParameters = 2;
   const int kNumOptionalParameters = 3;
@@ -80,26 +80,26 @@
   functions.SetAt(1, function);
 
   function_name = Symbols::New(thread, "baz");
-  function = Function::New(
-      function_name, RawFunction::kRegularFunction,
-      false, false, false, false, false, cls, TokenPosition::kMinSource);
+  function =
+      Function::New(function_name, RawFunction::kRegularFunction, false, false,
+                    false, false, false, cls, TokenPosition::kMinSource);
   functions.SetAt(2, function);
 
   function_name = Symbols::New(thread, "Foo");
-  function = Function::New(
-      function_name, RawFunction::kRegularFunction,
-      true, false, false, false, false, cls, TokenPosition::kMinSource);
+  function =
+      Function::New(function_name, RawFunction::kRegularFunction, true, false,
+                    false, false, false, cls, TokenPosition::kMinSource);
 
   functions.SetAt(3, function);
   function_name = Symbols::New(thread, "Bar");
-  function = Function::New(
-      function_name, RawFunction::kRegularFunction,
-      true, false, false, false, false, cls, TokenPosition::kMinSource);
+  function =
+      Function::New(function_name, RawFunction::kRegularFunction, true, false,
+                    false, false, false, cls, TokenPosition::kMinSource);
   functions.SetAt(4, function);
   function_name = Symbols::New(thread, "BaZ");
-  function = Function::New(
-      function_name, RawFunction::kRegularFunction,
-      true, false, false, false, false, cls, TokenPosition::kMinSource);
+  function =
+      Function::New(function_name, RawFunction::kRegularFunction, true, false,
+                    false, false, false, cls, TokenPosition::kMinSource);
   functions.SetAt(5, function);
 
   // Setup the functions in the class.
@@ -142,12 +142,12 @@
 VM_TEST_CASE(TypeArguments) {
   const Type& type1 = Type::Handle(Type::Double());
   const Type& type2 = Type::Handle(Type::StringType());
-  const TypeArguments& type_arguments1 = TypeArguments::Handle(
-    TypeArguments::New(2));
+  const TypeArguments& type_arguments1 =
+      TypeArguments::Handle(TypeArguments::New(2));
   type_arguments1.SetTypeAt(0, type1);
   type_arguments1.SetTypeAt(1, type2);
-  const TypeArguments& type_arguments2 = TypeArguments::Handle(
-    TypeArguments::New(2));
+  const TypeArguments& type_arguments2 =
+      TypeArguments::Handle(TypeArguments::New(2));
   type_arguments2.SetTypeAt(0, type1);
   type_arguments2.SetTypeAt(1, type2);
   EXPECT_NE(type_arguments1.raw(), type_arguments2.raw());
@@ -165,8 +165,8 @@
   Zone* zone = Thread::Current()->zone();
   String& source = String::Handle(zone, String::New("= ( 9 , ."));
   String& private_key = String::Handle(zone, String::New(""));
-  const TokenStream& token_stream = TokenStream::Handle(
-      zone, TokenStream::New(source, private_key, false));
+  const TokenStream& token_stream =
+      TokenStream::Handle(zone, TokenStream::New(source, private_key, false));
   TokenStream::Iterator iterator(zone, token_stream, TokenPosition::kMinSource);
   iterator.Advance();  // Advance to '(' token.
   EXPECT_EQ(Token::kLPAREN, iterator.CurrentTokenKind());
@@ -182,36 +182,35 @@
 VM_TEST_CASE(GenerateExactSource) {
   // Verify the exact formatting of generated sources.
   const char* kScriptChars =
-  "\n"
-  "class A {\n"
-  "  static bar() { return 42; }\n"
-  "  static fly() { return 5; }\n"
-  "  void catcher(x) {\n"
-  "    try {\n"
-  "      if (x is! List) {\n"
-  "        for (int i = 0; i < x; i++) {\n"
-  "          fly();\n"
-  "          ++i;\n"
-  "        }\n"
-  "      } else {\n"
-  "        for (int i = 0; i < x; i--) {\n"
-  "          !fly();\n"
-  "          --i;\n"
-  "        }\n"
-  "      }\n"
-  "    } on Blah catch (a) {\n"
-  "      _print(17);\n"
-  "    } catch (e, s) {\n"
-  "      bar()\n"
-  "    }\n"
-  "  }\n"
-  "}\n";
+      "\n"
+      "class A {\n"
+      "  static bar() { return 42; }\n"
+      "  static fly() { return 5; }\n"
+      "  void catcher(x) {\n"
+      "    try {\n"
+      "      if (x is! List) {\n"
+      "        for (int i = 0; i < x; i++) {\n"
+      "          fly();\n"
+      "          ++i;\n"
+      "        }\n"
+      "      } else {\n"
+      "        for (int i = 0; i < x; i--) {\n"
+      "          !fly();\n"
+      "          --i;\n"
+      "        }\n"
+      "      }\n"
+      "    } on Blah catch (a) {\n"
+      "      _print(17);\n"
+      "    } catch (e, s) {\n"
+      "      bar()\n"
+      "    }\n"
+      "  }\n"
+      "}\n";
 
   String& url = String::Handle(String::New("dart-test:GenerateExactSource"));
   String& source = String::Handle(String::New(kScriptChars));
-  Script& script = Script::Handle(Script::New(url,
-                                              source,
-                                              RawScript::kScriptTag));
+  Script& script =
+      Script::Handle(Script::New(url, source, RawScript::kScriptTag));
   script.Tokenize(String::Handle(String::New("")));
   const TokenStream& tokens = TokenStream::Handle(script.tokens());
   const String& gen_source = String::Handle(tokens.GenerateSource());
@@ -221,23 +220,23 @@
 
 TEST_CASE(Class_ComputeEndTokenPos) {
   const char* kScript =
-  "\n"
-  "class A {\n"
-  "  /**\n"
-  "   * Description of foo().\n"
-  "   */\n"
-  "  foo(a) { return '''\"}'''; }\n"
-  "  // }\n"
-  "  var bar = '\\'}';\n"
-  "  var baz = \"${foo('}')}\";\n"
-  "}\n";
+      "\n"
+      "class A {\n"
+      "  /**\n"
+      "   * Description of foo().\n"
+      "   */\n"
+      "  foo(a) { return '''\"}'''; }\n"
+      "  // }\n"
+      "  var bar = '\\'}';\n"
+      "  var baz = \"${foo('}')}\";\n"
+      "}\n";
   Dart_Handle lib_h = TestCase::LoadTestScript(kScript, NULL);
   EXPECT_VALID(lib_h);
   Library& lib = Library::Handle();
   lib ^= Api::UnwrapHandle(lib_h);
   EXPECT(!lib.IsNull());
-  const Class& cls = Class::Handle(
-      lib.LookupClass(String::Handle(String::New("A"))));
+  const Class& cls =
+      Class::Handle(lib.LookupClass(String::Handle(String::New("A"))));
   EXPECT(!cls.IsNull());
   const TokenPosition end_token_pos = cls.ComputeEndTokenPos();
   const Script& scr = Script::Handle(cls.script());
@@ -313,7 +312,7 @@
   EXPECT(Smi::IsValid(0));
   EXPECT(Smi::IsValid(-15));
   EXPECT(Smi::IsValid(0xFFu));
-  // Upper two bits must be either 00 or 11.
+// Upper two bits must be either 00 or 11.
 #if defined(ARCH_IS_64_BIT)
   EXPECT(!Smi::IsValid(kMaxInt64));
   EXPECT(Smi::IsValid(0x3FFFFFFFFFFFFFFF));
@@ -345,10 +344,9 @@
   EXPECT_EQ(-1, c.CompareWith(mint1));
   EXPECT_EQ(1, c.CompareWith(mint2));
 
-  Bigint& big1 = Bigint::Handle(Bigint::NewFromCString(
-      "10000000000000000000"));
-  Bigint& big2 = Bigint::Handle(Bigint::NewFromCString(
-      "-10000000000000000000"));
+  Bigint& big1 = Bigint::Handle(Bigint::NewFromCString("10000000000000000000"));
+  Bigint& big2 =
+      Bigint::Handle(Bigint::NewFromCString("-10000000000000000000"));
   EXPECT_EQ(-1, a.CompareWith(big1));
   EXPECT_EQ(1, a.CompareWith(big2));
   EXPECT_EQ(-1, c.CompareWith(big1));
@@ -365,14 +363,13 @@
   EXPECT(abce.CompareTo(abcd) > 0);
 
   const int kMonkeyLen = 4;
-  const uint8_t monkey_utf8[kMonkeyLen] = { 0xf0, 0x9f, 0x90, 0xb5 };
+  const uint8_t monkey_utf8[kMonkeyLen] = {0xf0, 0x9f, 0x90, 0xb5};
   const String& monkey_face =
       String::Handle(String::FromUTF8(monkey_utf8, kMonkeyLen));
   const int kDogLen = 4;
   // 0x1f436 DOG FACE.
-  const uint8_t dog_utf8[kDogLen] = { 0xf0, 0x9f, 0x90, 0xb6 };
-  const String& dog_face =
-      String::Handle(String::FromUTF8(dog_utf8, kDogLen));
+  const uint8_t dog_utf8[kDogLen] = {0xf0, 0x9f, 0x90, 0xb6};
+  const String& dog_face = String::Handle(String::FromUTF8(dog_utf8, kDogLen));
   EXPECT_EQ(0, monkey_face.CompareTo(monkey_face));
   EXPECT_EQ(0, dog_face.CompareTo(dog_face));
   EXPECT(monkey_face.CompareTo(dog_face) < 0);
@@ -380,7 +377,7 @@
 
   const int kDominoLen = 4;
   // 0x1f036 DOMINO TILE HORIZONTAL-00-05.
-  const uint8_t domino_utf8[kDominoLen] = { 0xf0, 0x9f, 0x80, 0xb6 };
+  const uint8_t domino_utf8[kDominoLen] = {0xf0, 0x9f, 0x80, 0xb6};
   const String& domino =
       String::Handle(String::FromUTF8(domino_utf8, kDominoLen));
   EXPECT_EQ(0, domino.CompareTo(domino));
@@ -442,11 +439,11 @@
 
 VM_TEST_CASE(StringIRITwoByte) {
   const intptr_t kInputLen = 3;
-  const uint16_t kInput[kInputLen] = { 'x', '/', 256 };
+  const uint16_t kInput[kInputLen] = {'x', '/', 256};
   const String& input = String::Handle(String::FromUTF16(kInput, kInputLen));
   const intptr_t kOutputLen = 10;
-  const uint16_t kOutput[kOutputLen] =
-      { 'x', '%', '2', 'F', '%', 'C', '4', '%', '8', '0' };
+  const uint16_t kOutput[kOutputLen] = {'x', '%', '2', 'F', '%',
+                                        'C', '4', '%', '8', '0'};
   const String& output = String::Handle(String::FromUTF16(kOutput, kOutputLen));
   const String& encoded = String::Handle(String::New(String::EncodeIRI(input)));
   EXPECT(output.Equals(encoded));
@@ -459,7 +456,8 @@
 // On 64-bit architectures a Smi is stored in a 64 bit word. A Midint cannot
 // be allocated if it does fit into a Smi.
 #if !defined(ARCH_IS_64_BIT)
-  { Mint& med = Mint::Handle();
+  {
+    Mint& med = Mint::Handle();
     EXPECT(med.IsNull());
     int64_t v = DART_2PART_UINT64_C(1, 0);
     med ^= Integer::New(v);
@@ -507,10 +505,9 @@
   EXPECT_EQ(-1, c.CompareWith(smi1));
   EXPECT_EQ(-1, c.CompareWith(smi2));
 
-  Bigint& big1 = Bigint::Handle(Bigint::NewFromCString(
-      "10000000000000000000"));
-  Bigint& big2 = Bigint::Handle(Bigint::NewFromCString(
-      "-10000000000000000000"));
+  Bigint& big1 = Bigint::Handle(Bigint::NewFromCString("10000000000000000000"));
+  Bigint& big2 =
+      Bigint::Handle(Bigint::NewFromCString("-10000000000000000000"));
   EXPECT_EQ(-1, a.CompareWith(big1));
   EXPECT_EQ(1, a.CompareWith(big2));
   EXPECT_EQ(-1, c.CompareWith(big1));
@@ -586,10 +583,10 @@
     EXPECT(nan0.IsIdenticalTo(nan0));
     EXPECT(nan0.CanonicalizeEquals(nan0));
     EXPECT(!nan0.OperatorEquals(nan0));
-    const Double& nan1 = Double::Handle(
-        Double::New(bit_cast<double>(kMaxUint64 - 0)));
-    const Double& nan2 = Double::Handle(
-        Double::New(bit_cast<double>(kMaxUint64 - 1)));
+    const Double& nan1 =
+        Double::Handle(Double::New(bit_cast<double>(kMaxUint64 - 0)));
+    const Double& nan2 =
+        Double::Handle(Double::New(bit_cast<double>(kMaxUint64 - 1)));
     EXPECT(isnan(nan1.value()));
     EXPECT(isnan(nan2.value()));
     EXPECT(!nan1.IsIdenticalTo(nan2));
@@ -628,12 +625,12 @@
   big = Bigint::NewFromCString("10000000000000000000");
   EXPECT_EQ(1e19, big.AsDoubleValue());
 
-  Bigint& big1 = Bigint::Handle(Bigint::NewFromCString(
-      "100000000000000000000"));
-  Bigint& big2 = Bigint::Handle(Bigint::NewFromCString(
-      "100000000000000000010"));
-  Bigint& big3 = Bigint::Handle(Bigint::NewFromCString(
-      "-10000000000000000000"));
+  Bigint& big1 =
+      Bigint::Handle(Bigint::NewFromCString("100000000000000000000"));
+  Bigint& big2 =
+      Bigint::Handle(Bigint::NewFromCString("100000000000000000010"));
+  Bigint& big3 =
+      Bigint::Handle(Bigint::NewFromCString("-10000000000000000000"));
 
   EXPECT_EQ(0, big1.CompareWith(big1));
   EXPECT_EQ(-1, big1.CompareWith(big2));
@@ -694,7 +691,7 @@
 
   const uint8_t* motto =
       reinterpret_cast<const uint8_t*>("Dart's bescht wos je hets gits");
-  const String& str2 = String::Handle(String::FromUTF8(motto+7, 4));
+  const String& str2 = String::Handle(String::FromUTF8(motto + 7, 4));
   EXPECT_EQ(4, str2.Length());
   EXPECT_EQ('b', str2.CharAt(0));
   EXPECT_EQ('e', str2.CharAt(1));
@@ -721,7 +718,7 @@
   EXPECT(empty1.Equals(empty2, 0, 0));
 
   const intptr_t kCharsLen = 8;
-  const uint8_t chars[kCharsLen] = { 1, 2, 127, 64, 92, 0, 55, 55 };
+  const uint8_t chars[kCharsLen] = {1, 2, 127, 64, 92, 0, 55, 55};
   const String& str8 = String::Handle(String::FromUTF8(chars, kCharsLen));
   EXPECT_EQ(kCharsLen, str8.Length());
   EXPECT_EQ(1, str8.CharAt(0));
@@ -740,9 +737,9 @@
   EXPECT_EQ(55, sub1.CharAt(4));
 
   const intptr_t kWideCharsLen = 7;
-  uint16_t wide_chars[kWideCharsLen] = { 'H', 'e', 'l', 'l', 'o', 256, '!' };
-  const String& two_str = String::Handle(String::FromUTF16(wide_chars,
-                                                           kWideCharsLen));
+  uint16_t wide_chars[kWideCharsLen] = {'H', 'e', 'l', 'l', 'o', 256, '!'};
+  const String& two_str =
+      String::Handle(String::FromUTF16(wide_chars, kWideCharsLen));
   EXPECT(two_str.IsInstance());
   EXPECT(two_str.IsString());
   EXPECT(two_str.IsTwoByteString());
@@ -766,7 +763,7 @@
     EXPECT_EQ(false, str1.StartsWith(str3));
   }
 
-  const int32_t four_chars[] = { 'C', 0xFF, 'h', 0xFFFF, 'a', 0x10FFFF, 'r' };
+  const int32_t four_chars[] = {'C', 0xFF, 'h', 0xFFFF, 'a', 0x10FFFF, 'r'};
   const String& four_str = String::Handle(String::FromUTF32(four_chars, 7));
   EXPECT_EQ(four_str.Hash(), four_str.Hash());
   EXPECT(four_str.IsTwoByteString());
@@ -783,7 +780,7 @@
 
   // Create a 1-byte string from an array of 2-byte elements.
   {
-    const uint16_t char16[] = { 0x00, 0x7F, 0xFF };
+    const uint16_t char16[] = {0x00, 0x7F, 0xFF};
     const String& str8 = String::Handle(String::FromUTF16(char16, 3));
     EXPECT(str8.IsOneByteString());
     EXPECT(!str8.IsTwoByteString());
@@ -794,7 +791,7 @@
 
   // Create a 1-byte string from an array of 4-byte elements.
   {
-    const int32_t char32[] = { 0x00, 0x1F, 0x7F };
+    const int32_t char32[] = {0x00, 0x1F, 0x7F};
     const String& str8 = String::Handle(String::FromUTF32(char32, 3));
     EXPECT(str8.IsOneByteString());
     EXPECT(!str8.IsTwoByteString());
@@ -805,7 +802,7 @@
 
   // Create a 2-byte string from an array of 4-byte elements.
   {
-    const int32_t char32[] = { 0, 0x7FFF, 0xFFFF };
+    const int32_t char32[] = {0, 0x7FFF, 0xFFFF};
     const String& str16 = String::Handle(String::FromUTF32(char32, 3));
     EXPECT(!str16.IsOneByteString());
     EXPECT(str16.IsTwoByteString());
@@ -1010,7 +1007,7 @@
     EXPECT(str1.IsOneByteString());
     EXPECT_EQ(0, str1.Length());
 
-    uint16_t two[] = { 0x05E6, 0x05D5, 0x05D5, 0x05D9, 0x05D9 };
+    uint16_t two[] = {0x05E6, 0x05D5, 0x05D5, 0x05D9, 0x05D9};
     intptr_t two_len = sizeof(two) / sizeof(two[0]);
     const String& str2 = String::Handle(String::FromUTF16(two, two_len));
     EXPECT(str2.IsTwoByteString());
@@ -1056,8 +1053,8 @@
     const String& str7 = String::Handle(String::ConcatAll(array3));
     EXPECT(str7.IsTwoByteString());
     EXPECT_EQ(two_len * 2, str7.Length());
-    uint16_t twotwo[] = { 0x05E6, 0x05D5, 0x05D5, 0x05D9, 0x05D9,
-                          0x05E6, 0x05D5, 0x05D5, 0x05D9, 0x05D9 };
+    uint16_t twotwo[] = {0x05E6, 0x05D5, 0x05D5, 0x05D9, 0x05D9,
+                         0x05E6, 0x05D5, 0x05D5, 0x05D9, 0x05D9};
     intptr_t twotwo_len = sizeof(twotwo) / sizeof(twotwo[0]);
     EXPECT(str7.IsTwoByteString());
     EXPECT(str7.Equals(twotwo, twotwo_len));
@@ -1065,13 +1062,13 @@
 
   // Concatenating non-empty 2-byte strings.
   {
-    const uint16_t one[] = { 0x05D0, 0x05D9, 0x05D9, 0x05DF };
+    const uint16_t one[] = {0x05D0, 0x05D9, 0x05D9, 0x05DF};
     intptr_t one_len = sizeof(one) / sizeof(one[0]);
     const String& str1 = String::Handle(String::FromUTF16(one, one_len));
     EXPECT(str1.IsTwoByteString());
     EXPECT_EQ(one_len, str1.Length());
 
-    const uint16_t two[] = { 0x05E6, 0x05D5, 0x05D5, 0x05D9, 0x05D9 };
+    const uint16_t two[] = {0x05E6, 0x05D5, 0x05D5, 0x05D9, 0x05D9};
     intptr_t two_len = sizeof(two) / sizeof(two[0]);
     const String& str2 = String::Handle(String::FromUTF16(two, two_len));
     EXPECT(str2.IsTwoByteString());
@@ -1081,16 +1078,16 @@
 
     const String& one_two_str = String::Handle(String::Concat(str1, str2));
     EXPECT(one_two_str.IsTwoByteString());
-    const uint16_t one_two[] = { 0x05D0, 0x05D9, 0x05D9, 0x05DF,
-                                 0x05E6, 0x05D5, 0x05D5, 0x05D9, 0x05D9 };
+    const uint16_t one_two[] = {0x05D0, 0x05D9, 0x05D9, 0x05DF, 0x05E6,
+                                0x05D5, 0x05D5, 0x05D9, 0x05D9};
     intptr_t one_two_len = sizeof(one_two) / sizeof(one_two[0]);
     EXPECT_EQ(one_two_len, one_two_str.Length());
     EXPECT(one_two_str.Equals(one_two, one_two_len));
 
     const String& two_one_str = String::Handle(String::Concat(str2, str1));
     EXPECT(two_one_str.IsTwoByteString());
-    const uint16_t two_one[] = { 0x05E6, 0x05D5, 0x05D5, 0x05D9, 0x05D9,
-                                 0x05D0, 0x05D9, 0x05D9, 0x05DF };
+    const uint16_t two_one[] = {0x05E6, 0x05D5, 0x05D5, 0x05D9, 0x05D9,
+                                0x05D0, 0x05D9, 0x05D9, 0x05DF};
     intptr_t two_one_len = sizeof(two_one) / sizeof(two_one[0]);
     EXPECT_EQ(two_one_len, two_one_str.Length());
     EXPECT(two_one_str.Equals(two_one, two_one_len));
@@ -1122,9 +1119,9 @@
     array3.SetAt(2, str1);
     const String& str5 = String::Handle(String::ConcatAll(array3));
     EXPECT(str5.IsTwoByteString());
-    const uint16_t one_two_one[] = { 0x05D0, 0x05D9, 0x05D9, 0x05DF,
-                                     0x05E6, 0x05D5, 0x05D5, 0x05D9, 0x05D9,
-                                     0x05D0, 0x05D9, 0x05D9, 0x05DF };
+    const uint16_t one_two_one[] = {0x05D0, 0x05D9, 0x05D9, 0x05DF, 0x05E6,
+                                    0x05D5, 0x05D5, 0x05D9, 0x05D9, 0x05D0,
+                                    0x05D9, 0x05D9, 0x05DF};
     intptr_t one_two_one_len = sizeof(one_two_one) / sizeof(one_two_one[0]);
     EXPECT_EQ(one_two_one_len, str5.Length());
     EXPECT(str5.Equals(one_two_one, one_two_one_len));
@@ -1136,9 +1133,9 @@
     array4.SetAt(2, str2);
     const String& str6 = String::Handle(String::ConcatAll(array4));
     EXPECT(str6.IsTwoByteString());
-    const uint16_t two_one_two[] = { 0x05E6, 0x05D5, 0x05D5, 0x05D9, 0x05D9,
-                                     0x05D0, 0x05D9, 0x05D9, 0x05DF,
-                                     0x05E6, 0x05D5, 0x05D5, 0x05D9, 0x05D9 };
+    const uint16_t two_one_two[] = {0x05E6, 0x05D5, 0x05D5, 0x05D9, 0x05D9,
+                                    0x05D0, 0x05D9, 0x05D9, 0x05DF, 0x05E6,
+                                    0x05D5, 0x05D5, 0x05D9, 0x05D9};
     intptr_t two_one_two_len = sizeof(two_one_two) / sizeof(two_one_two[0]);
     EXPECT_EQ(two_one_two_len, str6.Length());
     EXPECT(str6.Equals(two_one_two, two_one_two_len));
@@ -1150,7 +1147,7 @@
     EXPECT(str1.IsOneByteString());
     EXPECT_EQ(0, str1.Length());
 
-    int32_t four[] = { 0x1D4D5, 0x1D4DE, 0x1D4E4, 0x1D4E1 };
+    int32_t four[] = {0x1D4D5, 0x1D4DE, 0x1D4E4, 0x1D4E1};
     intptr_t four_len = sizeof(four) / sizeof(four[0]);
     intptr_t expected_len = (four_len * 2);
     const String& str2 = String::Handle(String::FromUTF32(four, four_len));
@@ -1195,8 +1192,8 @@
     array3.SetAt(2, str2);
     const String& str7 = String::Handle(String::ConcatAll(array3));
     EXPECT(str7.IsTwoByteString());
-    int32_t fourfour[] = { 0x1D4D5, 0x1D4DE, 0x1D4E4, 0x1D4E1,
-                           0x1D4D5, 0x1D4DE, 0x1D4E4, 0x1D4E1 };
+    int32_t fourfour[] = {0x1D4D5, 0x1D4DE, 0x1D4E4, 0x1D4E1,
+                          0x1D4D5, 0x1D4DE, 0x1D4E4, 0x1D4E1};
     intptr_t fourfour_len = sizeof(fourfour) / sizeof(fourfour[0]);
     EXPECT_EQ((fourfour_len * 2), str7.Length());
     const String& fourfour_str =
@@ -1206,13 +1203,13 @@
 
   // Concatenate non-empty strings built from 4-byte elements.
   {
-    const int32_t one[] = { 0x105D0, 0x105D9, 0x105D9, 0x105DF };
+    const int32_t one[] = {0x105D0, 0x105D9, 0x105D9, 0x105DF};
     intptr_t one_len = sizeof(one) / sizeof(one[0]);
     const String& onestr = String::Handle(String::FromUTF32(one, one_len));
     EXPECT(onestr.IsTwoByteString());
-    EXPECT_EQ((one_len *2), onestr.Length());
+    EXPECT_EQ((one_len * 2), onestr.Length());
 
-    const int32_t two[] = { 0x105E6, 0x105D5, 0x105D5, 0x105D9, 0x105D9 };
+    const int32_t two[] = {0x105E6, 0x105D5, 0x105D5, 0x105D9, 0x105D9};
     intptr_t two_len = sizeof(two) / sizeof(two[0]);
     const String& twostr = String::Handle(String::FromUTF32(two, two_len));
     EXPECT(twostr.IsTwoByteString());
@@ -1222,8 +1219,8 @@
 
     const String& str1 = String::Handle(String::Concat(onestr, twostr));
     EXPECT(str1.IsTwoByteString());
-    const int32_t one_two[] = { 0x105D0, 0x105D9, 0x105D9, 0x105DF,
-                                0x105E6, 0x105D5, 0x105D5, 0x105D9, 0x105D9 };
+    const int32_t one_two[] = {0x105D0, 0x105D9, 0x105D9, 0x105DF, 0x105E6,
+                               0x105D5, 0x105D5, 0x105D9, 0x105D9};
     intptr_t one_two_len = sizeof(one_two) / sizeof(one_two[0]);
     EXPECT_EQ((one_two_len * 2), str1.Length());
     const String& one_two_str =
@@ -1232,8 +1229,8 @@
 
     const String& str2 = String::Handle(String::Concat(twostr, onestr));
     EXPECT(str2.IsTwoByteString());
-    const int32_t two_one[] = { 0x105E6, 0x105D5, 0x105D5, 0x105D9, 0x105D9,
-                                0x105D0, 0x105D9, 0x105D9, 0x105DF };
+    const int32_t two_one[] = {0x105E6, 0x105D5, 0x105D5, 0x105D9, 0x105D9,
+                               0x105D0, 0x105D9, 0x105D9, 0x105DF};
     intptr_t two_one_len = sizeof(two_one) / sizeof(two_one[0]);
     EXPECT_EQ((two_one_len * 2), str2.Length());
     const String& two_one_str =
@@ -1267,10 +1264,9 @@
     array3.SetAt(2, onestr);
     const String& str5 = String::Handle(String::ConcatAll(array3));
     EXPECT(str5.IsTwoByteString());
-    const int32_t one_two_one[] = { 0x105D0, 0x105D9, 0x105D9, 0x105DF,
-                                    0x105E6, 0x105D5, 0x105D5, 0x105D9,
-                                    0x105D9,
-                                    0x105D0, 0x105D9, 0x105D9, 0x105DF };
+    const int32_t one_two_one[] = {0x105D0, 0x105D9, 0x105D9, 0x105DF, 0x105E6,
+                                   0x105D5, 0x105D5, 0x105D9, 0x105D9, 0x105D0,
+                                   0x105D9, 0x105D9, 0x105DF};
     intptr_t one_two_one_len = sizeof(one_two_one) / sizeof(one_two_one[0]);
     EXPECT_EQ((one_two_one_len * 2), str5.Length());
     const String& one_two_one_str =
@@ -1284,11 +1280,9 @@
     array4.SetAt(2, twostr);
     const String& str6 = String::Handle(String::ConcatAll(array4));
     EXPECT(str6.IsTwoByteString());
-    const int32_t two_one_two[] = { 0x105E6, 0x105D5, 0x105D5, 0x105D9,
-                                    0x105D9,
-                                    0x105D0, 0x105D9, 0x105D9, 0x105DF,
-                                    0x105E6, 0x105D5, 0x105D5, 0x105D9,
-                                    0x105D9 };
+    const int32_t two_one_two[] = {0x105E6, 0x105D5, 0x105D5, 0x105D9, 0x105D9,
+                                   0x105D0, 0x105D9, 0x105D9, 0x105DF, 0x105E6,
+                                   0x105D5, 0x105D5, 0x105D9, 0x105D9};
     intptr_t two_one_two_len = sizeof(two_one_two) / sizeof(two_one_two[0]);
     EXPECT_EQ((two_one_two_len * 2), str6.Length());
     const String& two_one_two_str =
@@ -1298,14 +1292,14 @@
 
   // Concatenate 1-byte strings and 2-byte strings.
   {
-    const uint8_t one[] = { 'o', 'n', 'e', ' ', 'b', 'y', 't', 'e' };
+    const uint8_t one[] = {'o', 'n', 'e', ' ', 'b', 'y', 't', 'e'};
     intptr_t one_len = sizeof(one) / sizeof(one[0]);
     const String& onestr = String::Handle(String::FromLatin1(one, one_len));
     EXPECT(onestr.IsOneByteString());
     EXPECT_EQ(one_len, onestr.Length());
     EXPECT(onestr.EqualsLatin1(one, one_len));
 
-    uint16_t two[] = { 0x05E6, 0x05D5, 0x05D5, 0x05D9, 0x05D9 };
+    uint16_t two[] = {0x05E6, 0x05D5, 0x05D5, 0x05D9, 0x05D9};
     intptr_t two_len = sizeof(two) / sizeof(two[0]);
     const String& twostr = String::Handle(String::FromUTF16(two, two_len));
     EXPECT(twostr.IsTwoByteString());
@@ -1316,16 +1310,16 @@
 
     const String& one_two_str = String::Handle(String::Concat(onestr, twostr));
     EXPECT(one_two_str.IsTwoByteString());
-    uint16_t one_two[] = { 'o', 'n', 'e', ' ', 'b', 'y', 't', 'e',
-                           0x05E6, 0x05D5, 0x05D5, 0x05D9, 0x05D9 };
+    uint16_t one_two[] = {'o', 'n',    'e',    ' ',    'b',    'y',   't',
+                          'e', 0x05E6, 0x05D5, 0x05D5, 0x05D9, 0x05D9};
     intptr_t one_two_len = sizeof(one_two) / sizeof(one_two[0]);
     EXPECT_EQ(one_two_len, one_two_str.Length());
     EXPECT(one_two_str.Equals(one_two, one_two_len));
 
     const String& two_one_str = String::Handle(String::Concat(twostr, onestr));
     EXPECT(two_one_str.IsTwoByteString());
-    uint16_t two_one[] = { 0x05E6, 0x05D5, 0x05D5, 0x05D9, 0x05D9,
-                           'o', 'n', 'e', ' ', 'b', 'y', 't', 'e' };
+    uint16_t two_one[] = {0x05E6, 0x05D5, 0x05D5, 0x05D9, 0x05D9, 'o', 'n',
+                          'e',    ' ',    'b',    'y',    't',    'e'};
     intptr_t two_one_len = sizeof(two_one) / sizeof(two_one[0]);
     EXPECT_EQ(two_one_len, two_one_str.Length());
     EXPECT(two_one_str.Equals(two_one, two_one_len));
@@ -1339,10 +1333,10 @@
     array1.SetAt(2, onestr);
     const String& one_two_one_str = String::Handle(String::ConcatAll(array1));
     EXPECT(one_two_one_str.IsTwoByteString());
-    EXPECT_EQ(onestr.Length()*2 + twostr.Length(), one_two_one_str.Length());
-    uint16_t one_two_one[] = { 'o', 'n', 'e', ' ', 'b', 'y', 't', 'e',
-                               0x05E6, 0x05D5, 0x05D5, 0x05D9, 0x05D9,
-                               'o', 'n', 'e', ' ', 'b', 'y', 't', 'e' };
+    EXPECT_EQ(onestr.Length() * 2 + twostr.Length(), one_two_one_str.Length());
+    uint16_t one_two_one[] = {'o', 'n',    'e',    ' ',    'b',    'y',    't',
+                              'e', 0x05E6, 0x05D5, 0x05D5, 0x05D9, 0x05D9, 'o',
+                              'n', 'e',    ' ',    'b',    'y',    't',    'e'};
     intptr_t one_two_one_len = sizeof(one_two_one) / sizeof(one_two_one[0]);
     EXPECT(one_two_one_str.Equals(one_two_one, one_two_one_len));
 
@@ -1353,10 +1347,10 @@
     array2.SetAt(2, twostr);
     const String& two_one_two_str = String::Handle(String::ConcatAll(array2));
     EXPECT(two_one_two_str.IsTwoByteString());
-    EXPECT_EQ(twostr.Length()*2 + onestr.Length(), two_one_two_str.Length());
-    uint16_t two_one_two[] = { 0x05E6, 0x05D5, 0x05D5, 0x05D9, 0x05D9,
-                               'o', 'n', 'e', ' ', 'b', 'y', 't', 'e',
-                               0x05E6, 0x05D5, 0x05D5, 0x05D9, 0x05D9 };
+    EXPECT_EQ(twostr.Length() * 2 + onestr.Length(), two_one_two_str.Length());
+    uint16_t two_one_two[] = {0x05E6, 0x05D5, 0x05D5, 0x05D9, 0x05D9, 'o',
+                              'n',    'e',    ' ',    'b',    'y',    't',
+                              'e',    0x05E6, 0x05D5, 0x05D5, 0x05D9, 0x05D9};
     intptr_t two_one_two_len = sizeof(two_one_two) / sizeof(two_one_two[0]);
     EXPECT(two_one_two_str.Equals(two_one_two, two_one_two_len));
   }
@@ -1367,22 +1361,21 @@
   EXPECT_EQ(String::Handle(String::New("onebyte")).Hash(),
             String::HashConcat(String::Handle(String::New("one")),
                                String::Handle(String::New("byte"))));
-  uint16_t clef_utf16[] = { 0xD834, 0xDD1E };
+  uint16_t clef_utf16[] = {0xD834, 0xDD1E};
   const String& clef = String::Handle(String::FromUTF16(clef_utf16, 2));
-  int32_t clef_utf32[] = { 0x1D11E };
+  int32_t clef_utf32[] = {0x1D11E};
   EXPECT(clef.Equals(clef_utf32, 1));
   intptr_t hash32 = String::Hash(clef_utf32, 1);
   EXPECT_EQ(hash32, clef.Hash());
   EXPECT_EQ(hash32, String::HashConcat(
-      String::Handle(String::FromUTF16(clef_utf16, 1)),
-      String::Handle(String::FromUTF16(clef_utf16 + 1, 1))));
+                        String::Handle(String::FromUTF16(clef_utf16, 1)),
+                        String::Handle(String::FromUTF16(clef_utf16 + 1, 1))));
 }
 
 
 VM_TEST_CASE(StringSubStringDifferentWidth) {
   // Create 1-byte substring from a 1-byte source string.
-  const char* onechars =
-      "\xC3\xB6\xC3\xB1\xC3\xA9";
+  const char* onechars = "\xC3\xB6\xC3\xB1\xC3\xA9";
 
   const String& onestr = String::Handle(String::New(onechars));
   EXPECT(!onestr.IsNull());
@@ -1470,18 +1463,14 @@
         "\xC3\xB8\xC3\xB9\xC3\xBA\xC3\xBB"
         "\xC3\xBC\xC3\xBD\xC3\xBE\xC3\xBF";
     const uint8_t expected[] = {
-      0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7,
-      0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF,
-      0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7,
-      0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF,
-      0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
-      0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
-      0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,
-      0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
-      0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
-      0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
-      0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
-      0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF,
+        0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB,
+        0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7,
+        0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1, 0xC2, 0xC3,
+        0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
+        0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB,
+        0xDC, 0xDD, 0xDE, 0xDF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
+        0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3,
+        0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF,
     };
     const String& str = String::Handle(String::New(src));
     EXPECT(str.IsOneByteString());
@@ -1497,10 +1486,8 @@
     const char* src =
         "\xD7\x92\xD7\x9C\xD7\xA2\xD7\x93"
         "\xD7\x91\xD7\xA8\xD7\x9B\xD7\x94";
-    const uint16_t expected[] = {
-      0x5D2, 0x5DC, 0x5E2, 0x5D3,
-      0x5D1, 0x5E8, 0x5DB, 0x5D4
-    };
+    const uint16_t expected[] = {0x5D2, 0x5DC, 0x5E2, 0x5D3,
+                                 0x5D1, 0x5E8, 0x5DB, 0x5D4};
     const String& str = String::Handle(String::New(src));
     EXPECT(str.IsTwoByteString());
     intptr_t expected_size = sizeof(expected) / sizeof(expected[0]);
@@ -1522,10 +1509,9 @@
         "\x80\x80\xEC\x80\x80\xED\x80\x80"
         "\xEE\x80\x80\xEF\x80\x80";
     const intptr_t expected[] = {
-      0x000A, 0x000B, 0x000D, 0x000C, 0x000E, 0x000F, 0x00A0, 0x00B0,
-      0x00C0, 0x00D0, 0x00E0, 0x00F0, 0x0A00, 0x0B00, 0x0C00, 0x0D00,
-      0x0E00, 0x0F00, 0xA000, 0xB000, 0xC000, 0xD000, 0xE000, 0xF000
-    };
+        0x000A, 0x000B, 0x000D, 0x000C, 0x000E, 0x000F, 0x00A0, 0x00B0,
+        0x00C0, 0x00D0, 0x00E0, 0x00F0, 0x0A00, 0x0B00, 0x0C00, 0x0D00,
+        0x0E00, 0x0F00, 0xA000, 0xB000, 0xC000, 0xD000, 0xE000, 0xF000};
     const String& str = String::Handle(String::New(src));
     EXPECT(str.IsTwoByteString());
     intptr_t expected_size = sizeof(expected) / sizeof(expected[0]);
@@ -1541,8 +1527,8 @@
     const char* src =
         "\xF0\x9D\x91\xA0\xF0\x9D\x91\xA1"
         "\xF0\x9D\x91\xA2\xF0\x9D\x91\xA3";
-    const intptr_t expected[] = { 0xd835, 0xdc60, 0xd835, 0xdc61,
-                                  0xd835, 0xdc62, 0xd835, 0xdc63 };
+    const intptr_t expected[] = {0xd835, 0xdc60, 0xd835, 0xdc61,
+                                 0xd835, 0xdc62, 0xd835, 0xdc63};
     const String& str = String::Handle(String::New(src));
     EXPECT(str.IsTwoByteString());
     intptr_t expected_size = (sizeof(expected) / sizeof(expected[0]));
@@ -1564,9 +1550,9 @@
         "\xF0\x9B\x80\x80\xF0\x9D\x80\x80"
         "\xF0\x9E\x80\x80\xF0\x9F\x80\x80";
     const intptr_t expected[] = {
-      0x0A00, 0x0B00, 0x0C00, 0x0D00, 0x0E00, 0x0F00, 0xA000, 0xB000, 0xC000,
-      0xD000, 0xE000, 0xF000, 0xD828, 0xDC00, 0xD82c, 0xDC00, 0xD834, 0xDC00,
-      0xD838, 0xDC00, 0xD83c, 0xDC00,
+        0x0A00, 0x0B00, 0x0C00, 0x0D00, 0x0E00, 0x0F00, 0xA000, 0xB000,
+        0xC000, 0xD000, 0xE000, 0xF000, 0xD828, 0xDC00, 0xD82c, 0xDC00,
+        0xD834, 0xDC00, 0xD838, 0xDC00, 0xD83c, 0xDC00,
     };
     const String& str = String::Handle(String::New(src));
     EXPECT(str.IsTwoByteString());
@@ -1592,11 +1578,10 @@
         "\x80\x80\xF0\x9E\x80\x80\xF0\x9F"
         "\x80\x80";
     const intptr_t expected[] = {
-      0x000A, 0x000B, 0x000D, 0x000C, 0x000E, 0x000F, 0x00A0, 0x00B0,
-      0x00C0, 0x00D0, 0x00E0, 0x00F0, 0x0A00, 0x0B00, 0x0C00, 0x0D00,
-      0x0E00, 0x0F00, 0xA000, 0xB000, 0xC000, 0xD000, 0xE000, 0xF000,
-      0xD828, 0xDC00, 0xD82c, 0xDC00, 0xD834, 0xDC00, 0xD838, 0xDC00,
-      0xD83c, 0xDC00,
+        0x000A, 0x000B, 0x000D, 0x000C, 0x000E, 0x000F, 0x00A0, 0x00B0, 0x00C0,
+        0x00D0, 0x00E0, 0x00F0, 0x0A00, 0x0B00, 0x0C00, 0x0D00, 0x0E00, 0x0F00,
+        0xA000, 0xB000, 0xC000, 0xD000, 0xE000, 0xF000, 0xD828, 0xDC00, 0xD82c,
+        0xDC00, 0xD834, 0xDC00, 0xD838, 0xDC00, 0xD83c, 0xDC00,
     };
     const String& str = String::Handle(String::New(src));
     EXPECT(str.IsTwoByteString());
@@ -1635,8 +1620,9 @@
   EXPECT(!fourstr.Equals("\xF0\x90\x8E\xA0"));
   EXPECT(!fourstr.Equals("\xF0\x90\x8E\xA0\xF0\x90\x8E\xA1"));
   EXPECT(fourstr.Equals("\xF0\x90\x8E\xA0\xF0\x90\x8E\xA1\xF0\x90\x8E\xA2"));
-  EXPECT(!fourstr.Equals("\xF0\x90\x8E\xA0\xF0\x90\x8E\xA1"
-                         "\xF0\x90\x8E\xA2\xF0\x90\x8E\xA3"));
+  EXPECT(
+      !fourstr.Equals("\xF0\x90\x8E\xA0\xF0\x90\x8E\xA1"
+                      "\xF0\x90\x8E\xA2\xF0\x90\x8E\xA3"));
 }
 
 
@@ -1658,12 +1644,11 @@
 
 
 VM_TEST_CASE(ExternalOneByteString) {
-  uint8_t characters[] = { 0xF6, 0xF1, 0xE9 };
+  uint8_t characters[] = {0xF6, 0xF1, 0xE9};
   intptr_t len = ARRAY_SIZE(characters);
 
-  const String& str =
-      String::Handle(
-          ExternalOneByteString::New(characters, len, NULL, NULL, Heap::kNew));
+  const String& str = String::Handle(
+      ExternalOneByteString::New(characters, len, NULL, NULL, Heap::kNew));
   EXPECT(!str.IsOneByteString());
   EXPECT(str.IsExternalOneByteString());
   EXPECT_EQ(str.Length(), len);
@@ -1690,13 +1675,12 @@
 
 
 VM_TEST_CASE(EscapeSpecialCharactersOneByteString) {
-  uint8_t characters[] =
-      { 'a', '\n', '\f', '\b', '\t', '\v', '\r', '\\', '$', 'z' };
+  uint8_t characters[] = {'a',  '\n', '\f', '\b', '\t',
+                          '\v', '\r', '\\', '$',  'z'};
   intptr_t len = ARRAY_SIZE(characters);
 
   const String& str =
-      String::Handle(
-          OneByteString::New(characters, len, Heap::kNew));
+      String::Handle(OneByteString::New(characters, len, Heap::kNew));
   EXPECT(str.IsOneByteString());
   EXPECT_EQ(str.Length(), len);
   EXPECT(str.Equals("a\n\f\b\t\v\r\\$z"));
@@ -1711,13 +1695,12 @@
 
 
 VM_TEST_CASE(EscapeSpecialCharactersExternalOneByteString) {
-  uint8_t characters[] =
-      { 'a', '\n', '\f', '\b', '\t', '\v', '\r', '\\', '$', 'z' };
+  uint8_t characters[] = {'a',  '\n', '\f', '\b', '\t',
+                          '\v', '\r', '\\', '$',  'z'};
   intptr_t len = ARRAY_SIZE(characters);
 
-  const String& str =
-      String::Handle(
-          ExternalOneByteString::New(characters, len, NULL, NULL, Heap::kNew));
+  const String& str = String::Handle(
+      ExternalOneByteString::New(characters, len, NULL, NULL, Heap::kNew));
   EXPECT(!str.IsOneByteString());
   EXPECT(str.IsExternalOneByteString());
   EXPECT_EQ(str.Length(), len);
@@ -1726,9 +1709,8 @@
       String::Handle(String::EscapeSpecialCharacters(str));
   EXPECT(escaped_str.Equals("a\\n\\f\\b\\t\\v\\r\\\\\\$z"));
 
-  const String& empty_str =
-      String::Handle(
-          ExternalOneByteString::New(characters, 0, NULL, NULL, Heap::kNew));
+  const String& empty_str = String::Handle(
+      ExternalOneByteString::New(characters, 0, NULL, NULL, Heap::kNew));
   const String& escaped_empty_str =
       String::Handle(String::EscapeSpecialCharacters(empty_str));
   EXPECT_EQ(empty_str.Length(), 0);
@@ -1736,8 +1718,8 @@
 }
 
 VM_TEST_CASE(EscapeSpecialCharactersTwoByteString) {
-  uint16_t characters[] =
-      { 'a', '\n', '\f', '\b', '\t', '\v', '\r', '\\', '$', 'z' };
+  uint16_t characters[] = {'a',  '\n', '\f', '\b', '\t',
+                           '\v', '\r', '\\', '$',  'z'};
   intptr_t len = ARRAY_SIZE(characters);
 
   const String& str =
@@ -1759,13 +1741,12 @@
 
 
 VM_TEST_CASE(EscapeSpecialCharactersExternalTwoByteString) {
-  uint16_t characters[] =
-      { 'a', '\n', '\f', '\b', '\t', '\v', '\r', '\\', '$', 'z' };
+  uint16_t characters[] = {'a',  '\n', '\f', '\b', '\t',
+                           '\v', '\r', '\\', '$',  'z'};
   intptr_t len = ARRAY_SIZE(characters);
 
-  const String& str =
-      String::Handle(
-          ExternalTwoByteString::New(characters, len, NULL, NULL, Heap::kNew));
+  const String& str = String::Handle(
+      ExternalTwoByteString::New(characters, len, NULL, NULL, Heap::kNew));
   EXPECT(str.IsExternalTwoByteString());
   EXPECT_EQ(str.Length(), len);
   EXPECT(str.Equals("a\n\f\b\t\v\r\\$z"));
@@ -1773,9 +1754,8 @@
       String::Handle(String::EscapeSpecialCharacters(str));
   EXPECT(escaped_str.Equals("a\\n\\f\\b\\t\\v\\r\\\\\\$z"));
 
-  const String& empty_str =
-      String::Handle(
-          ExternalTwoByteString::New(characters, 0, NULL, NULL, Heap::kNew));
+  const String& empty_str = String::Handle(
+      ExternalTwoByteString::New(characters, 0, NULL, NULL, Heap::kNew));
   const String& escaped_empty_str =
       String::Handle(String::EscapeSpecialCharacters(empty_str));
   EXPECT_EQ(empty_str.Length(), 0);
@@ -1784,12 +1764,11 @@
 
 
 VM_TEST_CASE(ExternalTwoByteString) {
-  uint16_t characters[] = { 0x1E6B, 0x1E85, 0x1E53 };
+  uint16_t characters[] = {0x1E6B, 0x1E85, 0x1E53};
   intptr_t len = ARRAY_SIZE(characters);
 
-  const String& str =
-      String::Handle(
-          ExternalTwoByteString::New(characters, len, NULL, NULL, Heap::kNew));
+  const String& str = String::Handle(
+      ExternalTwoByteString::New(characters, len, NULL, NULL, Heap::kNew));
   EXPECT(!str.IsTwoByteString());
   EXPECT(str.IsExternalTwoByteString());
   EXPECT_EQ(str.Length(), len);
@@ -1805,8 +1784,9 @@
   EXPECT(!concat.IsExternalTwoByteString());
   EXPECT(concat.IsTwoByteString());
   EXPECT_EQ(len * 2, concat.Length());
-  EXPECT(concat.Equals("\xE1\xB9\xAB\xE1\xBA\x85\xE1\xB9\x93"
-                       "\xE1\xB9\xAB\xE1\xBA\x85\xE1\xB9\x93"));
+  EXPECT(
+      concat.Equals("\xE1\xB9\xAB\xE1\xBA\x85\xE1\xB9\x93"
+                    "\xE1\xB9\xAB\xE1\xBA\x85\xE1\xB9\x93"));
 
   const String& substr = String::Handle(String::SubString(str, 1, 1));
   EXPECT(!substr.IsExternalTwoByteString());
@@ -1867,9 +1847,9 @@
   EXPECT_EQ(one.raw(), ein_symbol.raw());
   EXPECT(one.raw() != eins.raw());
 
-  uint16_t char16[] = { 'E', 'l', 'f' };
+  uint16_t char16[] = {'E', 'l', 'f'};
   String& elf1 = String::Handle(Symbols::FromUTF16(thread, char16, 3));
-  int32_t char32[] = { 'E', 'l', 'f' };
+  int32_t char32[] = {'E', 'l', 'f'};
   String& elf2 = String::Handle(Symbols::FromUTF32(thread, char32, 3));
   EXPECT(elf1.IsSymbol());
   EXPECT(elf2.IsSymbol());
@@ -1879,7 +1859,7 @@
 
 
 VM_TEST_CASE(SymbolUnicode) {
-  uint16_t monkey_utf16[] = { 0xd83d, 0xdc35 };  // Unicode Monkey Face.
+  uint16_t monkey_utf16[] = {0xd83d, 0xdc35};  // Unicode Monkey Face.
   String& monkey = String::Handle(Symbols::FromUTF16(thread, monkey_utf16, 2));
   EXPECT(monkey.IsSymbol());
   const char monkey_utf8[] = {'\xf0', '\x9f', '\x90', '\xb5', 0};
@@ -1891,10 +1871,10 @@
 
   // Unicode cat face with tears of joy.
   int32_t kCatFaceWithTearsOfJoy = 0x1f639;
-  String& cat = String::Handle(Symbols::FromCharCode(thread,
-                                                     kCatFaceWithTearsOfJoy));
+  String& cat =
+      String::Handle(Symbols::FromCharCode(thread, kCatFaceWithTearsOfJoy));
 
-  uint16_t cat_utf16[] = { 0xd83d, 0xde39 };
+  uint16_t cat_utf16[] = {0xd83d, 0xde39};
   String& cat2 = String::Handle(Symbols::FromUTF16(thread, cat_utf16, 2));
   EXPECT(cat2.IsSymbol());
   EXPECT_EQ(cat2.raw(), cat.raw());
@@ -1954,24 +1934,29 @@
 static void TestIllegalArrayLength(intptr_t length) {
   char buffer[1024];
   OS::SNPrint(buffer, sizeof(buffer),
-      "main() {\n"
-      "  new List(%" Pd ");\n"
-      "}\n",
-      length);
+              "main() {\n"
+              "  new List(%" Pd
+              ");\n"
+              "}\n",
+              length);
   Dart_Handle lib = TestCase::LoadTestScript(buffer, NULL);
   EXPECT_VALID(lib);
   Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
   OS::SNPrint(buffer, sizeof(buffer),
-      "Unhandled exception:\n"
-      "RangeError (length): Invalid value: "
-      "Not in range 0..%" Pd ", inclusive: %" Pd,
-      Array::kMaxElements, length);
+              "Unhandled exception:\n"
+              "RangeError (length): Invalid value: "
+              "Not in range 0..%" Pd ", inclusive: %" Pd,
+              Array::kMaxElements, length);
   EXPECT_ERROR(result, buffer);
 }
 
 
-TEST_CASE(ArrayLengthNegativeOne) { TestIllegalArrayLength(-1); }
-TEST_CASE(ArrayLengthSmiMin) { TestIllegalArrayLength(kSmiMin); }
+TEST_CASE(ArrayLengthNegativeOne) {
+  TestIllegalArrayLength(-1);
+}
+TEST_CASE(ArrayLengthSmiMin) {
+  TestIllegalArrayLength(kSmiMin);
+}
 TEST_CASE(ArrayLengthOneTooMany) {
   const intptr_t kOneTooMany = Array::kMaxElements + 1;
   ASSERT(kOneTooMany >= 0);
@@ -1982,10 +1967,11 @@
 TEST_CASE(ArrayLengthMaxElements) {
   char buffer[1024];
   OS::SNPrint(buffer, sizeof(buffer),
-      "main() {\n"
-      "  return new List(%" Pd ");\n"
-      "}\n",
-      Array::kMaxElements);
+              "main() {\n"
+              "  return new List(%" Pd
+              ");\n"
+              "}\n",
+              Array::kMaxElements);
   Dart_Handle lib = TestCase::LoadTestScript(buffer, NULL);
   EXPECT_VALID(lib);
   Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
@@ -2004,15 +1990,16 @@
                                        intptr_t length) {
   char buffer[1024];
   OS::SNPrint(buffer, sizeof(buffer),
-      "import 'dart:typed_data';\n"
-      "main() {\n"
-      "  new %s(%" Pd ");\n"
-      "}\n",
-      class_name, length);
+              "import 'dart:typed_data';\n"
+              "main() {\n"
+              "  new %s(%" Pd
+              ");\n"
+              "}\n",
+              class_name, length);
   Dart_Handle lib = TestCase::LoadTestScript(buffer, NULL);
   EXPECT_VALID(lib);
   Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
-  OS::SNPrint(buffer, sizeof(buffer), "%" Pd,  length);
+  OS::SNPrint(buffer, sizeof(buffer), "%" Pd, length);
   EXPECT_ERROR(result, "Invalid argument(s)");
   EXPECT_ERROR(result, buffer);
 }
@@ -2036,11 +2023,12 @@
   const intptr_t max_elements = TypedData::MaxElements(kTypedDataInt8ArrayCid);
   char buffer[1024];
   OS::SNPrint(buffer, sizeof(buffer),
-      "import 'dart:typed_data';\n"
-      "main() {\n"
-      "  return new Int8List(%" Pd ");\n"
-      "}\n",
-      max_elements);
+              "import 'dart:typed_data';\n"
+              "main() {\n"
+              "  return new Int8List(%" Pd
+              ");\n"
+              "}\n",
+              max_elements);
   Dart_Handle lib = TestCase::LoadTestScript(buffer, NULL);
   EXPECT_VALID(lib);
   Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
@@ -2069,10 +2057,11 @@
   EXPECT_EQ(' ', it1.Current());
   EXPECT(!it1.Next());
 
-  const String& str2 = String::Handle(String::New("\xD7\x92\xD7\x9C"
-                                                  "\xD7\xA2\xD7\x93"
-                                                  "\xD7\x91\xD7\xA8"
-                                                  "\xD7\x9B\xD7\x94"));
+  const String& str2 =
+      String::Handle(String::New("\xD7\x92\xD7\x9C"
+                                 "\xD7\xA2\xD7\x93"
+                                 "\xD7\x91\xD7\xA8"
+                                 "\xD7\x9B\xD7\x94"));
   String::CodePointIterator it2(str2);
   EXPECT(it2.Next());
   EXPECT_EQ(0x5D2, it2.Current());
@@ -2092,10 +2081,11 @@
   EXPECT_EQ(0x5D4, it2.Current());
   EXPECT(!it2.Next());
 
-  const String& str3 = String::Handle(String::New("\xF0\x9D\x91\xA0"
-                                                  "\xF0\x9D\x91\xA1"
-                                                  "\xF0\x9D\x91\xA2"
-                                                  "\xF0\x9D\x91\xA3"));
+  const String& str3 =
+      String::Handle(String::New("\xF0\x9D\x91\xA0"
+                                 "\xF0\x9D\x91\xA1"
+                                 "\xF0\x9D\x91\xA2"
+                                 "\xF0\x9D\x91\xA3"));
   String::CodePointIterator it3(str3);
   EXPECT(it3.Next());
   EXPECT_EQ(0x1D460, it3.Current());
@@ -2249,7 +2239,7 @@
 
 
 VM_TEST_CASE(InternalTypedData) {
-  uint8_t data[] = { 253, 254, 255, 0, 1, 2, 3, 4 };
+  uint8_t data[] = {253, 254, 255, 0, 1, 2, 3, 4};
   intptr_t data_length = ARRAY_SIZE(data);
 
   const TypedData& int8_array =
@@ -2305,30 +2295,24 @@
 
 
 VM_TEST_CASE(ExternalTypedData) {
-  uint8_t data[] = { 253, 254, 255, 0, 1, 2, 3, 4 };
+  uint8_t data[] = {253, 254, 255, 0, 1, 2, 3, 4};
   intptr_t data_length = ARRAY_SIZE(data);
 
   const ExternalTypedData& int8_array =
-      ExternalTypedData::Handle(
-          ExternalTypedData::New(kExternalTypedDataInt8ArrayCid,
-                                 data,
-                                 data_length));
+      ExternalTypedData::Handle(ExternalTypedData::New(
+          kExternalTypedDataInt8ArrayCid, data, data_length));
   EXPECT(!int8_array.IsNull());
   EXPECT_EQ(data_length, int8_array.Length());
 
   const ExternalTypedData& uint8_array =
-      ExternalTypedData::Handle(
-          ExternalTypedData::New(kExternalTypedDataUint8ArrayCid,
-                                  data,
-                                  data_length));
+      ExternalTypedData::Handle(ExternalTypedData::New(
+          kExternalTypedDataUint8ArrayCid, data, data_length));
   EXPECT(!uint8_array.IsNull());
   EXPECT_EQ(data_length, uint8_array.Length());
 
   const ExternalTypedData& uint8_clamped_array =
-      ExternalTypedData::Handle(
-          ExternalTypedData::New(kExternalTypedDataUint8ClampedArrayCid,
-                                 data,
-                                 data_length));
+      ExternalTypedData::Handle(ExternalTypedData::New(
+          kExternalTypedDataUint8ClampedArrayCid, data, data_length));
   EXPECT(!uint8_clamped_array.IsNull());
   EXPECT_EQ(data_length, uint8_clamped_array.Length());
 
@@ -2356,18 +2340,18 @@
   EXPECT_EQ(2, uint8_array.GetUint8(5));
   EXPECT_EQ(2, uint8_clamped_array.GetUint8(5));
 
-  for (intptr_t i = 0 ; i < int8_array.Length(); ++i) {
+  for (intptr_t i = 0; i < int8_array.Length(); ++i) {
     EXPECT_EQ(int8_array.GetUint8(i), uint8_array.GetUint8(i));
   }
 
   int8_array.SetInt8(2, -123);
   uint8_array.SetUint8(0, 123);
-  for (intptr_t i = 0 ; i < int8_array.Length(); ++i) {
+  for (intptr_t i = 0; i < int8_array.Length(); ++i) {
     EXPECT_EQ(int8_array.GetInt8(i), uint8_array.GetInt8(i));
   }
 
   uint8_clamped_array.SetUint8(0, 123);
-  for (intptr_t i = 0 ; i < int8_array.Length(); ++i) {
+  for (intptr_t i = 0; i < int8_array.Length(); ++i) {
     EXPECT_EQ(int8_array.GetUint8(i), uint8_clamped_array.GetUint8(i));
   }
 }
@@ -2378,9 +2362,8 @@
   const char* source_chars = "This will not compile.";
   const String& url = String::Handle(String::New(url_chars));
   const String& source = String::Handle(String::New(source_chars));
-  const Script& script = Script::Handle(Script::New(url,
-                                                    source,
-                                                    RawScript::kScriptTag));
+  const Script& script =
+      Script::Handle(Script::New(url, source, RawScript::kScriptTag));
   EXPECT(!script.IsNull());
   EXPECT(script.IsScript());
   String& str = String::Handle(script.url());
@@ -2408,11 +2391,16 @@
 VM_TEST_CASE(EmbeddedScript) {
   const char* url_chars = "builtin:test-case";
   const char* text =
-      /* 1 */ "<!DOCTYPE html>\n"
-      /* 2 */ "  ... more junk ...\n"
-      /* 3 */ "  <script type='application/dart'>main() {\n"
-      /* 4 */ "    return 'foo';\n"
-      /* 5 */ "  }\n"
+      /* 1 */
+      "<!DOCTYPE html>\n"
+      /* 2 */
+      "  ... more junk ...\n"
+      /* 3 */
+      "  <script type='application/dart'>main() {\n"
+      /* 4 */
+      "    return 'foo';\n"
+      /* 5 */
+      "  }\n"
       /* 6 */ "</script>\n";
   const char* line1 = text;
   const char* line2 = strstr(line1, "\n") + 1;
@@ -2443,8 +2431,8 @@
 
   const String& url = String::Handle(String::New(url_chars));
   const String& source = String::Handle(String::New(src_chars));
-  const Script& script = Script::Handle(
-      Script::New(url, source, RawScript::kScriptTag));
+  const Script& script =
+      Script::Handle(Script::New(url, source, RawScript::kScriptTag));
   script.SetLocationOffset(line_offset, col_offset);
 
   String& str = String::Handle();
@@ -2534,27 +2522,18 @@
 
   const Type& dynamic_type = Type::ZoneHandle(Type::DynamicType());
   const String& a = String::ZoneHandle(Symbols::New(thread, "a"));
-  LocalVariable* var_a =
-      new LocalVariable(TokenPosition::kNoSource,
-                        TokenPosition::kNoSource,
-                        a,
-                        dynamic_type);
+  LocalVariable* var_a = new LocalVariable(
+      TokenPosition::kNoSource, TokenPosition::kNoSource, a, dynamic_type);
   parent_scope->AddVariable(var_a);
 
   const String& b = String::ZoneHandle(Symbols::New(thread, "b"));
-  LocalVariable* var_b =
-      new LocalVariable(TokenPosition::kNoSource,
-                        TokenPosition::kNoSource,
-                        b,
-                        dynamic_type);
+  LocalVariable* var_b = new LocalVariable(
+      TokenPosition::kNoSource, TokenPosition::kNoSource, b, dynamic_type);
   local_scope->AddVariable(var_b);
 
   const String& c = String::ZoneHandle(Symbols::New(thread, "c"));
-  LocalVariable* var_c =
-      new LocalVariable(TokenPosition::kNoSource,
-                        TokenPosition::kNoSource,
-                        c,
-                        dynamic_type);
+  LocalVariable* var_c = new LocalVariable(
+      TokenPosition::kNoSource, TokenPosition::kNoSource, c, dynamic_type);
   parent_scope->AddVariable(var_c);
 
   bool test_only = false;  // Please, insert alias.
@@ -2579,18 +2558,16 @@
   var_c = local_scope->LookupVariable(c, test_only);
   EXPECT(var_c->is_captured());
 
-  EXPECT_EQ(3, local_scope->num_variables());  // a, b, and c alias.
+  EXPECT_EQ(3, local_scope->num_variables());         // a, b, and c alias.
   EXPECT_EQ(2, local_scope->NumCapturedVariables());  // a, c alias.
 
   const int first_parameter_index = 0;
   const int num_parameters = 0;
   const int first_frame_index = -1;
   bool found_captured_vars = false;
-  int next_frame_index = parent_scope->AllocateVariables(first_parameter_index,
-                                                         num_parameters,
-                                                         first_frame_index,
-                                                         NULL,
-                                                         &found_captured_vars);
+  int next_frame_index = parent_scope->AllocateVariables(
+      first_parameter_index, num_parameters, first_frame_index, NULL,
+      &found_captured_vars);
   EXPECT_EQ(first_frame_index, next_frame_index);  // a and c not in frame.
   const intptr_t parent_scope_context_level = 1;
   EXPECT_EQ(parent_scope_context_level, parent_scope->context_level());
@@ -2629,16 +2606,16 @@
   const Context& context = Context::Handle(Context::New(0));
   Function& parent = Function::Handle();
   const String& parent_name = String::Handle(Symbols::New(thread, "foo_papa"));
-  parent = Function::New(parent_name, RawFunction::kRegularFunction,
-                         false, false, false, false, false, cls,
-                         TokenPosition::kMinSource);
+  parent =
+      Function::New(parent_name, RawFunction::kRegularFunction, false, false,
+                    false, false, false, cls, TokenPosition::kMinSource);
   functions.SetAt(0, parent);
   cls.SetFunctions(functions);
 
   Function& function = Function::Handle();
   const String& function_name = String::Handle(Symbols::New(thread, "foo"));
-  function = Function::NewClosureFunction(
-      function_name, parent, TokenPosition::kMinSource);
+  function = Function::NewClosureFunction(function_name, parent,
+                                          TokenPosition::kMinSource);
   const Closure& closure = Closure::Handle(Closure::New(function, context));
   const Class& closure_class = Class::Handle(closure.clazz());
   EXPECT_EQ(closure_class.id(), kClosureCid);
@@ -2657,8 +2634,7 @@
   // bool class and true/false values.
   ObjectStore* object_store = Isolate::Current()->object_store();
   const Class& bool_class = Class::Handle(object_store->bool_class());
-  EXPECT_STREQ("Library:'dart:core' Class: bool",
-               bool_class.ToCString());
+  EXPECT_STREQ("Library:'dart:core' Class: bool", bool_class.ToCString());
   EXPECT_STREQ("true", Bool::True().ToCString());
   EXPECT_STREQ("false", Bool::False().ToCString());
 
@@ -2702,19 +2678,18 @@
   const Script& script = Script::Handle();
   const Class& owner_class =
       Class::Handle(CreateDummyClass(class_name, script));
-  const Library& owner_library =
-      Library::Handle(CreateDummyLibrary(lib_name));
+  const Library& owner_library = Library::Handle(CreateDummyLibrary(lib_name));
   owner_class.set_library(owner_library);
   const String& function_name = String::ZoneHandle(Symbols::New(thread, name));
-  return Function::New(function_name, RawFunction::kRegularFunction,
-                       true, false, false, false, false, owner_class,
+  return Function::New(function_name, RawFunction::kRegularFunction, true,
+                       false, false, false, false, owner_class,
                        TokenPosition::kMinSource);
 }
 
 
 // Test for Code and Instruction object creation.
 VM_TEST_CASE(Code) {
-  extern void GenerateIncrement(Assembler* assembler);
+  extern void GenerateIncrement(Assembler * assembler);
   Assembler _assembler_;
   GenerateIncrement(&_assembler_);
   const Function& function = Function::Handle(CreateFunction("Test_Code"));
@@ -2723,8 +2698,8 @@
   const Instructions& instructions = Instructions::Handle(code.instructions());
   uword payload_start = instructions.PayloadStart();
   EXPECT_EQ(instructions.raw(), Instructions::FromPayloadStart(payload_start));
-  const Object& result = Object::Handle(
-      DartEntry::InvokeFunction(function, Array::empty_array()));
+  const Object& result =
+      Object::Handle(DartEntry::InvokeFunction(function, Array::empty_array()));
   EXPECT_EQ(1, Smi::Cast(result).Value());
 }
 
@@ -2732,7 +2707,7 @@
 // Test for immutability of generated instructions. The test crashes with a
 // segmentation fault when writing into it.
 VM_TEST_CASE(CodeImmutability) {
-  extern void GenerateIncrement(Assembler* assembler);
+  extern void GenerateIncrement(Assembler * assembler);
   Assembler _assembler_;
   GenerateIncrement(&_assembler_);
   const Function& function = Function::Handle(CreateFunction("Test_Code"));
@@ -2754,7 +2729,7 @@
 
 // Test for Embedded String object in the instructions.
 VM_TEST_CASE(EmbedStringInCode) {
-  extern void GenerateEmbedStringInCode(Assembler* assembler, const char* str);
+  extern void GenerateEmbedStringInCode(Assembler * assembler, const char* str);
   const char* kHello = "Hello World!";
   word expected_length = static_cast<word>(strlen(kHello));
   Assembler _assembler_;
@@ -2769,7 +2744,7 @@
   String& string_object = String::Handle();
   string_object ^= result.raw();
   EXPECT(string_object.Length() == expected_length);
-  for (int i = 0; i < expected_length; i ++) {
+  for (int i = 0; i < expected_length; i++) {
     EXPECT(string_object.CharAt(i) == kHello[i]);
   }
 }
@@ -2777,7 +2752,7 @@
 
 // Test for Embedded Smi object in the instructions.
 VM_TEST_CASE(EmbedSmiInCode) {
-  extern void GenerateEmbedSmiInCode(Assembler* assembler, intptr_t value);
+  extern void GenerateEmbedSmiInCode(Assembler * assembler, intptr_t value);
   const intptr_t kSmiTestValue = 5;
   Assembler _assembler_;
   GenerateEmbedSmiInCode(&_assembler_, kSmiTestValue);
@@ -2794,7 +2769,7 @@
 #if defined(ARCH_IS_64_BIT)
 // Test for Embedded Smi object in the instructions.
 VM_TEST_CASE(EmbedSmiIn64BitCode) {
-  extern void GenerateEmbedSmiInCode(Assembler* assembler, intptr_t value);
+  extern void GenerateEmbedSmiInCode(Assembler * assembler, intptr_t value);
   const intptr_t kSmiTestValue = DART_INT64_C(5) << 32;
   Assembler _assembler_;
   GenerateEmbedSmiInCode(&_assembler_, kSmiTestValue);
@@ -2821,7 +2796,7 @@
   exception_handlers.SetHandlerInfo(2, -1, 40u, kNoStacktrace, true);
   exception_handlers.SetHandlerInfo(3, 1, 150u, kNoStacktrace, true);
 
-  extern void GenerateIncrement(Assembler* assembler);
+  extern void GenerateIncrement(Assembler * assembler);
   Assembler _assembler_;
   GenerateIncrement(&_assembler_);
   Code& code = Code::Handle(Code::FinalizeCode(
@@ -2851,23 +2826,18 @@
   DescriptorList* builder = new DescriptorList(0);
 
   // kind, pc_offset, deopt_id, token_pos, try_index
-  builder->AddDescriptor(RawPcDescriptors::kOther,
-                         10, 1, TokenPosition(20), 1);
-  builder->AddDescriptor(RawPcDescriptors::kDeopt,
-                         20, 2, TokenPosition(30), 0);
-  builder->AddDescriptor(RawPcDescriptors::kOther,
-                         30, 3, TokenPosition(40), 1);
-  builder->AddDescriptor(RawPcDescriptors::kOther,
-                         10, 4, TokenPosition(40), 2);
-  builder->AddDescriptor(RawPcDescriptors::kOther,
-                         10, 5, TokenPosition(80), 3);
-  builder->AddDescriptor(RawPcDescriptors::kOther,
-                         80, 6, TokenPosition(150), 3);
+  builder->AddDescriptor(RawPcDescriptors::kOther, 10, 1, TokenPosition(20), 1);
+  builder->AddDescriptor(RawPcDescriptors::kDeopt, 20, 2, TokenPosition(30), 0);
+  builder->AddDescriptor(RawPcDescriptors::kOther, 30, 3, TokenPosition(40), 1);
+  builder->AddDescriptor(RawPcDescriptors::kOther, 10, 4, TokenPosition(40), 2);
+  builder->AddDescriptor(RawPcDescriptors::kOther, 10, 5, TokenPosition(80), 3);
+  builder->AddDescriptor(RawPcDescriptors::kOther, 80, 6, TokenPosition(150),
+                         3);
 
   PcDescriptors& descriptors = PcDescriptors::Handle();
   descriptors ^= builder->FinalizePcDescriptors(0);
 
-  extern void GenerateIncrement(Assembler* assembler);
+  extern void GenerateIncrement(Assembler * assembler);
   Assembler _assembler_;
   GenerateIncrement(&_assembler_);
   Code& code = Code::Handle(Code::FinalizeCode(
@@ -2914,23 +2884,22 @@
   DescriptorList* builder = new DescriptorList(0);
 
   // kind, pc_offset, deopt_id, token_pos, try_index
-  builder->AddDescriptor(RawPcDescriptors::kOther,
-                         100, 1, TokenPosition(200), 1);
-  builder->AddDescriptor(RawPcDescriptors::kDeopt,
-                         200, 2, TokenPosition(300), 0);
-  builder->AddDescriptor(RawPcDescriptors::kOther,
-                         300, 3, TokenPosition(400), 1);
-  builder->AddDescriptor(RawPcDescriptors::kOther,
-                         100, 4, TokenPosition(0), 2);
-  builder->AddDescriptor(RawPcDescriptors::kOther,
-                         100, 5, TokenPosition(800), 3);
-  builder->AddDescriptor(RawPcDescriptors::kOther,
-                         800, 6, TokenPosition(150), 3);
+  builder->AddDescriptor(RawPcDescriptors::kOther, 100, 1, TokenPosition(200),
+                         1);
+  builder->AddDescriptor(RawPcDescriptors::kDeopt, 200, 2, TokenPosition(300),
+                         0);
+  builder->AddDescriptor(RawPcDescriptors::kOther, 300, 3, TokenPosition(400),
+                         1);
+  builder->AddDescriptor(RawPcDescriptors::kOther, 100, 4, TokenPosition(0), 2);
+  builder->AddDescriptor(RawPcDescriptors::kOther, 100, 5, TokenPosition(800),
+                         3);
+  builder->AddDescriptor(RawPcDescriptors::kOther, 800, 6, TokenPosition(150),
+                         3);
 
   PcDescriptors& descriptors = PcDescriptors::Handle();
   descriptors ^= builder->FinalizePcDescriptors(0);
 
-  extern void GenerateIncrement(Assembler* assembler);
+  extern void GenerateIncrement(Assembler * assembler);
   Assembler _assembler_;
   GenerateIncrement(&_assembler_);
   Code& code = Code::Handle(Code::FinalizeCode(
@@ -2974,21 +2943,21 @@
 
 
 static RawClass* CreateTestClass(const char* name) {
-  const String& class_name = String::Handle(Symbols::New(Thread::Current(),
-                                                         name));
-  const Class& cls = Class::Handle(
-      CreateDummyClass(class_name, Script::Handle()));
+  const String& class_name =
+      String::Handle(Symbols::New(Thread::Current(), name));
+  const Class& cls =
+      Class::Handle(CreateDummyClass(class_name, Script::Handle()));
   return cls.raw();
 }
 
 
 static RawField* CreateTestField(const char* name) {
   const Class& cls = Class::Handle(CreateTestClass("global:"));
-  const String& field_name = String::Handle(Symbols::New(Thread::Current(),
-                                                         name));
-  const Field& field =
-      Field::Handle(Field::New(field_name, true, false, false, true, cls,
-          Object::dynamic_type(), TokenPosition::kMinSource));
+  const String& field_name =
+      String::Handle(Symbols::New(Thread::Current(), name));
+  const Field& field = Field::Handle(
+      Field::New(field_name, true, false, false, true, cls,
+                 Object::dynamic_type(), TokenPosition::kMinSource));
   return field.raw();
 }
 
@@ -3017,23 +2986,17 @@
 
 
 static RawFunction* GetDummyTarget(const char* name) {
-  const String& function_name = String::Handle(Symbols::New(Thread::Current(),
-                                                            name));
-  const Class& cls = Class::Handle(
-       CreateDummyClass(function_name, Script::Handle()));
+  const String& function_name =
+      String::Handle(Symbols::New(Thread::Current(), name));
+  const Class& cls =
+      Class::Handle(CreateDummyClass(function_name, Script::Handle()));
   const bool is_static = false;
   const bool is_const = false;
   const bool is_abstract = false;
   const bool is_external = false;
   const bool is_native = false;
-  return Function::New(function_name,
-                       RawFunction::kRegularFunction,
-                       is_static,
-                       is_const,
-                       is_abstract,
-                       is_external,
-                       is_native,
-                       cls,
+  return Function::New(function_name, RawFunction::kRegularFunction, is_static,
+                       is_const, is_abstract, is_external, is_native, cls,
                        TokenPosition::kMinSource);
 }
 
@@ -3046,8 +3009,8 @@
   const Array& args_descriptor =
       Array::Handle(ArgumentsDescriptor::New(1, Object::null_array()));
   ICData& o1 = ICData::Handle();
-  o1 = ICData::New(function, target_name, args_descriptor, id,
-                   num_args_tested, false);
+  o1 = ICData::New(function, target_name, args_descriptor, id, num_args_tested,
+                   false);
   EXPECT_EQ(1, o1.NumArgsTested());
   EXPECT_EQ(id, o1.deopt_id());
   EXPECT_EQ(function.raw(), o1.Owner());
@@ -3104,9 +3067,8 @@
 
   // Check ICData for unoptimized static calls.
   const intptr_t kNumArgsChecked = 0;
-  const ICData& scall_icdata = ICData::Handle(
-      ICData::New(function, target_name, args_descriptor, 57,
-                  kNumArgsChecked, false));
+  const ICData& scall_icdata = ICData::Handle(ICData::New(
+      function, target_name, args_descriptor, 57, kNumArgsChecked, false));
   scall_icdata.AddTarget(target1);
   EXPECT_EQ(target1.raw(), scall_icdata.GetTargetAt(0));
 }
@@ -3129,8 +3091,8 @@
   TypeArguments& test_targ_0 = TypeArguments::Handle();
   TypeArguments& test_targ_1 = TypeArguments::Handle();
   Bool& test_result = Bool::Handle();
-  cache.GetCheck(
-      0, &test_class_id_or_fun, &test_targ_0, &test_targ_1, &test_result);
+  cache.GetCheck(0, &test_class_id_or_fun, &test_targ_0, &test_targ_1,
+                 &test_result);
   EXPECT_EQ(class_id_or_fun.raw(), test_class_id_or_fun.raw());
   EXPECT_EQ(targ_0.raw(), test_targ_0.raw());
   EXPECT_EQ(targ_1.raw(), test_targ_1.raw());
@@ -3155,8 +3117,6 @@
 }
 
 
-
-
 // Expose helper function from object.cc for testing.
 bool EqualsIgnoringPrivate(const String& name, const String& private_name);
 
@@ -3271,9 +3231,9 @@
       reinterpret_cast<const uint8_t*>(ext_mangled_str),
       strlen(ext_mangled_str), NULL, NULL, Heap::kNew);
   EXPECT(ext_mangled_name.IsExternalOneByteString());
-  ext_bare_name = ExternalOneByteString::New(
-      reinterpret_cast<const uint8_t*>(ext_bare_str),
-      strlen(ext_bare_str), NULL, NULL, Heap::kNew);
+  ext_bare_name =
+      ExternalOneByteString::New(reinterpret_cast<const uint8_t*>(ext_bare_str),
+                                 strlen(ext_bare_str), NULL, NULL, Heap::kNew);
   EXPECT(ext_bare_name.IsExternalOneByteString());
   ext_bad_bare_name = ExternalOneByteString::New(
       reinterpret_cast<const uint8_t*>(ext_bad_bare_str),
@@ -3289,8 +3249,8 @@
 
   // str1 - ExternalOneByteString, str2 - ExternalOneByteString.
   EXPECT(String::EqualsIgnoringPrivateKey(ext_mangled_name, ext_bare_name));
-  EXPECT(!String::EqualsIgnoringPrivateKey(ext_mangled_name,
-                                           ext_bad_bare_name));
+  EXPECT(
+      !String::EqualsIgnoringPrivateKey(ext_mangled_name, ext_bad_bare_name));
 }
 
 
@@ -3342,21 +3302,20 @@
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
   EXPECT_VALID(lib);
   Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
-  EXPECT_ERROR(
-      result,
-      "Unhandled exception:\n"
-      "MyException\n"
-      "#0      baz (test-lib:2:3)\n"
-      "#1      _OtherClass._OtherClass._named (test-lib:7:5)\n"
-      "#2      globalVar= (test-lib:12:7)\n"
-      "#3      _bar (test-lib:16:3)\n"
-      "#4      MyClass.field (test-lib:25:5)\n"
-      "#5      MyClass.foo.fooHelper (test-lib:30:7)\n"
-      "#6      MyClass.foo (test-lib:32:14)\n"
-      "#7      MyClass.MyClass.<anonymous closure> (test-lib:21:12)\n"
-      "#8      MyClass.MyClass (test-lib:21:18)\n"
-      "#9      main.<anonymous closure> (test-lib:37:14)\n"
-      "#10     main (test-lib:37:24)");
+  EXPECT_ERROR(result,
+               "Unhandled exception:\n"
+               "MyException\n"
+               "#0      baz (test-lib:2:3)\n"
+               "#1      _OtherClass._OtherClass._named (test-lib:7:5)\n"
+               "#2      globalVar= (test-lib:12:7)\n"
+               "#3      _bar (test-lib:16:3)\n"
+               "#4      MyClass.field (test-lib:25:5)\n"
+               "#5      MyClass.foo.fooHelper (test-lib:30:7)\n"
+               "#6      MyClass.foo (test-lib:32:14)\n"
+               "#7      MyClass.MyClass.<anonymous closure> (test-lib:21:12)\n"
+               "#8      MyClass.MyClass (test-lib:21:18)\n"
+               "#9      main.<anonymous closure> (test-lib:37:14)\n"
+               "#10     main (test-lib:37:24)");
 }
 
 
@@ -3768,16 +3727,16 @@
 
 
 static RawFunction* GetFunction(const Class& cls, const char* name) {
-  const Function& result = Function::Handle(cls.LookupDynamicFunction(
-      String::Handle(String::New(name))));
+  const Function& result = Function::Handle(
+      cls.LookupDynamicFunction(String::Handle(String::New(name))));
   EXPECT(!result.IsNull());
   return result.raw();
 }
 
 
 static RawFunction* GetStaticFunction(const Class& cls, const char* name) {
-  const Function& result = Function::Handle(cls.LookupStaticFunction(
-      String::Handle(String::New(name))));
+  const Function& result = Function::Handle(
+      cls.LookupStaticFunction(String::Handle(String::New(name))));
   EXPECT(!result.IsNull());
   return result.raw();
 }
@@ -3809,9 +3768,9 @@
 
   Function& parent = Function::Handle();
   const String& parent_name = String::Handle(Symbols::New(thread, "foo_papa"));
-  parent = Function::New(parent_name, RawFunction::kRegularFunction,
-                         false, false, false, false, false, cls,
-                         TokenPosition::kMinSource);
+  parent =
+      Function::New(parent_name, RawFunction::kRegularFunction, false, false,
+                    false, false, false, cls, TokenPosition::kMinSource);
   functions.SetAt(0, parent);
   cls.SetFunctions(functions);
 
@@ -3846,9 +3805,9 @@
   const Array& functions = Array::Handle(Array::New(1));
   Function& parent = Function::Handle();
   const String& parent_name = String::Handle(Symbols::New(thread, "foo_papa"));
-  parent = Function::New(parent_name, RawFunction::kRegularFunction,
-                         false, false, false, false, false, cls,
-                         TokenPosition::kMinSource);
+  parent =
+      Function::New(parent_name, RawFunction::kRegularFunction, false, false,
+                    false, false, false, cls, TokenPosition::kMinSource);
   functions.SetAt(0, parent);
   cls.SetFunctions(functions);
   cls.Finalize();
@@ -3858,10 +3817,9 @@
       String::Handle(Symbols::New(thread, "myMethod"));
   const Array& args_desc = Array::Handle(ArgumentsDescriptor::New(1));
   Function& invocation_dispatcher = Function::Handle();
-  invocation_dispatcher ^=
-      cls.GetInvocationDispatcher(invocation_dispatcher_name, args_desc,
-                                  RawFunction::kNoSuchMethodDispatcher,
-                                  true /* create_if_absent */);
+  invocation_dispatcher ^= cls.GetInvocationDispatcher(
+      invocation_dispatcher_name, args_desc,
+      RawFunction::kNoSuchMethodDispatcher, true /* create_if_absent */);
   EXPECT(!invocation_dispatcher.IsNull());
   // Get index to function.
   intptr_t invocation_dispatcher_index =
@@ -3885,8 +3843,7 @@
 
 static void PrintMetadata(const char* name, const Object& data) {
   if (data.IsError()) {
-    OS::Print("Error in metadata evaluation for %s: '%s'\n",
-              name,
+    OS::Print("Error in metadata evaluation for %s: '%s'\n", name,
               Error::Cast(data).ToErrorCString());
   }
   EXPECT(data.IsArray());
@@ -3961,8 +3918,8 @@
   res = lib.GetMetadata(func);
   PrintMetadata("main", res);
 
-  func = lib.LookupLocalFunction(String::Handle(Symbols::New(thread,
-                                                             "get:tlGetter")));
+  func = lib.LookupLocalFunction(
+      String::Handle(Symbols::New(thread, "get:tlGetter")));
   EXPECT(!func.IsNull());
   res = lib.GetMetadata(func);
   PrintMetadata("tlGetter", res);
@@ -4018,10 +3975,10 @@
   const Library& lib = Library::Handle(Library::LookupLibrary(thread, name));
   EXPECT(!lib.IsNull());
 
-  const Class& class_a = Class::Handle(
-      lib.LookupClass(String::Handle(Symbols::New(thread, "A"))));
-  const Class& class_b = Class::Handle(
-      lib.LookupClass(String::Handle(Symbols::New(thread, "B"))));
+  const Class& class_a =
+      Class::Handle(lib.LookupClass(String::Handle(Symbols::New(thread, "A"))));
+  const Class& class_b =
+      Class::Handle(lib.LookupClass(String::Handle(Symbols::New(thread, "B"))));
   const Function& a_test1 =
       Function::Handle(GetStaticFunction(class_a, "test1"));
   const Function& b_test1 =
@@ -4036,10 +3993,8 @@
       Function::Handle(GetStaticFunction(class_a, "test5"));
   const Function& b_test5 =
       Function::Handle(GetStaticFunction(class_b, "test5"));
-  const Function& a_test6 =
-      Function::Handle(GetFunction(class_a, "test6"));
-  const Function& b_test6 =
-      Function::Handle(GetFunction(class_b, "test6"));
+  const Function& a_test6 = Function::Handle(GetFunction(class_a, "test6"));
+  const Function& b_test6 = Function::Handle(GetFunction(class_b, "test6"));
 
   EXPECT_EQ(a_test1.SourceFingerprint(), b_test1.SourceFingerprint());
   EXPECT_NE(a_test1.SourceFingerprint(), a_test2.SourceFingerprint());
@@ -4084,8 +4039,7 @@
   EXPECT(!vmlib.IsNull());
   const Class& class_a = Class::Handle(
       vmlib.LookupClass(String::Handle(Symbols::New(thread, "A"))));
-  const Function& func_b =
-      Function::Handle(GetFunction(class_a, "b"));
+  const Function& func_b = Function::Handle(GetFunction(class_a, "b"));
   EXPECT(func_b.CanBeInlined());
 
   // After setting a breakpoint in a function A.b, it is no longer inlineable.
@@ -4132,21 +4086,20 @@
 class ObjectAccumulator : public ObjectVisitor {
  public:
   explicit ObjectAccumulator(GrowableArray<Object*>* objects)
-      : objects_(objects) { }
-  virtual ~ObjectAccumulator() { }
+      : objects_(objects) {}
+  virtual ~ObjectAccumulator() {}
   virtual void VisitObject(RawObject* obj) {
     if (obj->IsPseudoObject()) {
       return;  // Cannot be wrapped in handles.
     }
     Object& handle = Object::Handle(obj);
     // Skip some common simple objects to run in reasonable time.
-    if (handle.IsString() ||
-        handle.IsArray() ||
-        handle.IsLiteralToken()) {
+    if (handle.IsString() || handle.IsArray() || handle.IsLiteralToken()) {
       return;
     }
     objects_->Add(&handle);
   }
+
  private:
   GrowableArray<Object*>* objects_;
 };
@@ -4629,8 +4582,8 @@
     pieces.Add(*data[i]);
     array.SetAt(i, *data[i]);
   }
-  const String& res1 = String::Handle(zone, Symbols::FromConcatAll(thread,
-                                                                   pieces));
+  const String& res1 =
+      String::Handle(zone, Symbols::FromConcatAll(thread, pieces));
   const String& res2 = String::Handle(zone, String::ConcatAll(array));
   EXPECT(res1.Equals(res2));
 }
@@ -4638,65 +4591,63 @@
 
 VM_TEST_CASE(Symbols_FromConcatAll) {
   {
-    const String* data[3] = { &Symbols::FallThroughError(),
-                              &Symbols::Dot(),
-                              &Symbols::isPaused() };
+    const String* data[3] = {&Symbols::FallThroughError(), &Symbols::Dot(),
+                             &Symbols::isPaused()};
     CheckConcatAll(data, 3);
   }
 
   {
     const intptr_t kWideCharsLen = 7;
-    uint16_t wide_chars[kWideCharsLen] = { 'H', 'e', 'l', 'l', 'o', 256, '!' };
-    const String& two_str = String::Handle(String::FromUTF16(wide_chars,
-                                                             kWideCharsLen));
+    uint16_t wide_chars[kWideCharsLen] = {'H', 'e', 'l', 'l', 'o', 256, '!'};
+    const String& two_str =
+        String::Handle(String::FromUTF16(wide_chars, kWideCharsLen));
 
-    const String* data[3] = { &two_str, &Symbols::Dot(), &two_str };
+    const String* data[3] = {&two_str, &Symbols::Dot(), &two_str};
     CheckConcatAll(data, 3);
   }
 
   {
-    uint8_t characters[] = { 0xF6, 0xF1, 0xE9 };
+    uint8_t characters[] = {0xF6, 0xF1, 0xE9};
     intptr_t len = ARRAY_SIZE(characters);
 
     const String& str = String::Handle(
         ExternalOneByteString::New(characters, len, NULL, NULL, Heap::kNew));
-    const String* data[3] = { &str, &Symbols::Dot(), &str };
+    const String* data[3] = {&str, &Symbols::Dot(), &str};
     CheckConcatAll(data, 3);
   }
 
   {
-    uint16_t characters[] =
-        { 'a', '\n', '\f', '\b', '\t', '\v', '\r', '\\', '$', 'z' };
+    uint16_t characters[] = {'a',  '\n', '\f', '\b', '\t',
+                             '\v', '\r', '\\', '$',  'z'};
     intptr_t len = ARRAY_SIZE(characters);
 
     const String& str = String::Handle(
         ExternalTwoByteString::New(characters, len, NULL, NULL, Heap::kNew));
-    const String* data[3] = { &str, &Symbols::Dot(), &str };
+    const String* data[3] = {&str, &Symbols::Dot(), &str};
     CheckConcatAll(data, 3);
   }
 
   {
-    uint8_t characters1[] = { 0xF6, 0xF1, 0xE9 };
+    uint8_t characters1[] = {0xF6, 0xF1, 0xE9};
     intptr_t len1 = ARRAY_SIZE(characters1);
 
     const String& str1 = String::Handle(
         ExternalOneByteString::New(characters1, len1, NULL, NULL, Heap::kNew));
 
-    uint16_t characters2[] =
-        { 'a', '\n', '\f', '\b', '\t', '\v', '\r', '\\', '$', 'z' };
+    uint16_t characters2[] = {'a',  '\n', '\f', '\b', '\t',
+                              '\v', '\r', '\\', '$',  'z'};
     intptr_t len2 = ARRAY_SIZE(characters2);
 
     const String& str2 = String::Handle(
         ExternalTwoByteString::New(characters2, len2, NULL, NULL, Heap::kNew));
-    const String* data[3] = { &str1, &Symbols::Dot(), &str2 };
+    const String* data[3] = {&str1, &Symbols::Dot(), &str2};
     CheckConcatAll(data, 3);
   }
 
   {
     const String& empty = String::Handle(String::New(""));
-    const String* data[3] = { &Symbols::FallThroughError(),
-                              &empty,
-                              &Symbols::isPaused() };
+    const String* data[3] = {&Symbols::FallThroughError(), &empty,
+                             &Symbols::isPaused()};
     CheckConcatAll(data, 3);
   }
 }
@@ -4710,19 +4661,20 @@
 
 VM_TEST_CASE(String_ScrubName) {
   TestResult tests[] = {
-    {"(dynamic, dynamic) => void", "(dynamic, dynamic) => void"},
-    {"_List@915557746", "_List"},
-    {"_HashMap@600006304<K, V>(dynamic) => V", "_HashMap<K, V>(dynamic) => V"},
-    {"set:foo", "foo="},
-    {"get:foo", "foo"},
-    {"_ReceivePortImpl@709387912", "_ReceivePortImpl"},
-    {"_ReceivePortImpl@709387912._internal@709387912",
-        "_ReceivePortImpl._internal"},
-    {"_C@6328321&_E@6328321&_F@6328321", "_C&_E&_F"},
-    {"List.", "List"},
-    {"get:foo@6328321", "foo"},
-    {"_MyClass@6328321.", "_MyClass"},
-    {"_MyClass@6328321.named", "_MyClass.named"},
+      {"(dynamic, dynamic) => void", "(dynamic, dynamic) => void"},
+      {"_List@915557746", "_List"},
+      {"_HashMap@600006304<K, V>(dynamic) => V",
+       "_HashMap<K, V>(dynamic) => V"},
+      {"set:foo", "foo="},
+      {"get:foo", "foo"},
+      {"_ReceivePortImpl@709387912", "_ReceivePortImpl"},
+      {"_ReceivePortImpl@709387912._internal@709387912",
+       "_ReceivePortImpl._internal"},
+      {"_C@6328321&_E@6328321&_F@6328321", "_C&_E&_F"},
+      {"List.", "List"},
+      {"get:foo@6328321", "foo"},
+      {"_MyClass@6328321.", "_MyClass"},
+      {"_MyClass@6328321.named", "_MyClass.named"},
   };
   String& test = String::Handle();
   String& result = String::Handle();
@@ -4739,9 +4691,8 @@
   // and utf32 arrays happens after conversion to utf16 instead of utf32, as
   // required for proper canonicalization of string literals with a lossy
   // utf32->utf16 conversion.
-  int32_t char_codes[] = {
-    0, 0x0a, 0x0d, 0x7f, 0xff, 0xffff, 0xd800, 0xdc00, 0xdbff, 0xdfff
-  };
+  int32_t char_codes[] = {0,      0x0a,   0x0d,   0x7f,   0xff,
+                          0xffff, 0xd800, 0xdc00, 0xdbff, 0xdfff};
 
   const String& str =
       String::Handle(String::FromUTF32(char_codes, ARRAY_SIZE(char_codes)));
diff --git a/runtime/vm/os.h b/runtime/vm/os.h
index e381269..b90b06d 100644
--- a/runtime/vm/os.h
+++ b/runtime/vm/os.h
@@ -121,9 +121,7 @@
   // that occur.
   static int SNPrint(char* str, size_t size, const char* format, ...)
       PRINTF_ATTRIBUTE(3, 4);
-  static int VSNPrint(char* str, size_t size,
-                      const char* format,
-                      va_list args);
+  static int VSNPrint(char* str, size_t size, const char* format, va_list args);
 
   // Allocate a string and print formatted output into the buffer.
   // Uses the zone for allocation if one if provided, and otherwise uses
diff --git a/runtime/vm/os_android.cc b/runtime/vm/os_android.cc
index 92fcfd9..1ce9650 100644
--- a/runtime/vm/os_android.cc
+++ b/runtime/vm/os_android.cc
@@ -7,16 +7,16 @@
 
 #include "vm/os.h"
 
-#include <android/log.h>  // NOLINT
-#include <endian.h>  // NOLINT
-#include <errno.h>  // NOLINT
-#include <limits.h>  // NOLINT
-#include <malloc.h>  // NOLINT
-#include <time.h>  // NOLINT
+#include <android/log.h>   // NOLINT
+#include <endian.h>        // NOLINT
+#include <errno.h>         // NOLINT
+#include <limits.h>        // NOLINT
+#include <malloc.h>        // NOLINT
+#include <time.h>          // NOLINT
 #include <sys/resource.h>  // NOLINT
-#include <sys/time.h>  // NOLINT
-#include <sys/types.h>  // NOLINT
-#include <unistd.h>  // NOLINT
+#include <sys/time.h>      // NOLINT
+#include <sys/types.h>     // NOLINT
+#include <unistd.h>        // NOLINT
 
 #include "platform/utils.h"
 #include "vm/code_observers.h"
@@ -31,8 +31,10 @@
 
 #ifndef PRODUCT
 
-DEFINE_FLAG(bool, generate_perf_events_symbols, false,
-    "Generate events symbols for profiling with perf");
+DEFINE_FLAG(bool,
+            generate_perf_events_symbols,
+            false,
+            "Generate events symbols for profiling with perf");
 
 class PerfCodeObserver : public CodeObserver {
  public:
@@ -69,8 +71,9 @@
       return;
     }
     const char* marker = optimized ? "*" : "";
-    char* buffer = OS::SCreate(Thread::Current()->zone(),
-        "%" Px " %" Px " %s%s\n", base, size, marker, name);
+    char* buffer =
+        OS::SCreate(Thread::Current()->zone(), "%" Px " %" Px " %s%s\n", base,
+                    size, marker, name);
     (*file_write)(buffer, strlen(buffer), out_file_);
   }
 
@@ -184,7 +187,7 @@
 // TODO(5411554):  May need to hoist these architecture dependent code
 // into a architecture specific file e.g: os_ia32_linux.cc
 intptr_t OS::ActivationFrameAlignment() {
-#if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64) || \
+#if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64) ||                   \
     defined(TARGET_ARCH_ARM64)
   const int kMinimumAlignment = 16;
 #elif defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_DBC)
@@ -203,10 +206,8 @@
 
 
 intptr_t OS::PreferredCodeAlignment() {
-#if defined(TARGET_ARCH_IA32) ||                                               \
-    defined(TARGET_ARCH_X64) ||                                                \
-    defined(TARGET_ARCH_ARM64) ||                                              \
-    defined(TARGET_ARCH_DBC)
+#if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64) ||                   \
+    defined(TARGET_ARCH_ARM64) || defined(TARGET_ARCH_DBC)
   const int kMinimumAlignment = 32;
 #elif defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_MIPS)
   const int kMinimumAlignment = 16;
@@ -390,8 +391,7 @@
   if (str[0] == '-') {
     i = 1;
   }
-  if ((str[i] == '0') &&
-      (str[i + 1] == 'x' || str[i + 1] == 'X') &&
+  if ((str[i] == '0') && (str[i + 1] == 'x' || str[i + 1] == 'X') &&
       (str[i + 2] != '\0')) {
     base = 16;
   }
@@ -430,8 +430,7 @@
 }
 
 
-void OS::Shutdown() {
-}
+void OS::Shutdown() {}
 
 
 void OS::Abort() {
diff --git a/runtime/vm/os_fuchsia.cc b/runtime/vm/os_fuchsia.cc
index 41a5d96..65e743c 100644
--- a/runtime/vm/os_fuchsia.cc
+++ b/runtime/vm/os_fuchsia.cc
@@ -18,8 +18,10 @@
 
 #ifndef PRODUCT
 
-DEFINE_FLAG(bool, generate_perf_events_symbols, false,
-    "Generate events symbols for profiling with perf");
+DEFINE_FLAG(bool,
+            generate_perf_events_symbols,
+            false,
+            "Generate events symbols for profiling with perf");
 
 #endif  // !PRODUCT
 
@@ -105,7 +107,7 @@
 // TODO(5411554):  May need to hoist these architecture dependent code
 // into a architecture specific file e.g: os_ia32_fuchsia.cc
 intptr_t OS::ActivationFrameAlignment() {
-#if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64) || \
+#if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64) ||                   \
     defined(TARGET_ARCH_ARM64)
   const int kMinimumAlignment = 16;
 #elif defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_DBC)
@@ -124,10 +126,8 @@
 
 
 intptr_t OS::PreferredCodeAlignment() {
-#if defined(TARGET_ARCH_IA32) ||                                               \
-    defined(TARGET_ARCH_X64) ||                                                \
-    defined(TARGET_ARCH_ARM64) ||                                              \
-    defined(TARGET_ARCH_DBC)
+#if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64) ||                   \
+    defined(TARGET_ARCH_ARM64) || defined(TARGET_ARCH_DBC)
   const int kMinimumAlignment = 32;
 #elif defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_MIPS)
   const int kMinimumAlignment = 16;
@@ -163,14 +163,13 @@
 
 
 void OS::Sleep(int64_t millis) {
-  mx_nanosleep(
-      millis * kMicrosecondsPerMillisecond * kNanosecondsPerMicrosecond);
+  mx_nanosleep(millis * kMicrosecondsPerMillisecond *
+               kNanosecondsPerMicrosecond);
 }
 
 
 void OS::SleepMicros(int64_t micros) {
-  mx_nanosleep(
-      micros * kNanosecondsPerMicrosecond);
+  mx_nanosleep(micros * kNanosecondsPerMicrosecond);
 }
 
 
@@ -262,8 +261,7 @@
   if (str[0] == '-') {
     i = 1;
   }
-  if ((str[i] == '0') &&
-      (str[i + 1] == 'x' || str[i + 1] == 'X') &&
+  if ((str[i] == '0') && (str[i + 1] == 'x' || str[i + 1] == 'X') &&
       (str[i + 2] != '\0')) {
     base = 16;
   }
@@ -300,8 +298,7 @@
 }
 
 
-void OS::Shutdown() {
-}
+void OS::Shutdown() {}
 
 
 void OS::Abort() {
diff --git a/runtime/vm/os_linux.cc b/runtime/vm/os_linux.cc
index 7f5eff7..163f436 100644
--- a/runtime/vm/os_linux.cc
+++ b/runtime/vm/os_linux.cc
@@ -7,17 +7,17 @@
 
 #include "vm/os.h"
 
-#include <errno.h>  // NOLINT
-#include <limits.h>  // NOLINT
-#include <malloc.h>  // NOLINT
-#include <time.h>  // NOLINT
+#include <errno.h>         // NOLINT
+#include <limits.h>        // NOLINT
+#include <malloc.h>        // NOLINT
+#include <time.h>          // NOLINT
 #include <sys/resource.h>  // NOLINT
-#include <sys/time.h>  // NOLINT
-#include <sys/types.h>  // NOLINT
-#include <sys/syscall.h>  // NOLINT
-#include <sys/stat.h>  // NOLINT
-#include <fcntl.h>  // NOLINT
-#include <unistd.h>  // NOLINT
+#include <sys/time.h>      // NOLINT
+#include <sys/types.h>     // NOLINT
+#include <sys/syscall.h>   // NOLINT
+#include <sys/stat.h>      // NOLINT
+#include <fcntl.h>         // NOLINT
+#include <unistd.h>        // NOLINT
 
 #include "platform/memory_sanitizer.h"
 #include "platform/utils.h"
@@ -34,8 +34,10 @@
 
 #ifndef PRODUCT
 
-DEFINE_FLAG(bool, generate_perf_events_symbols, false,
-    "Generate events symbols for profiling with perf");
+DEFINE_FLAG(bool,
+            generate_perf_events_symbols,
+            false,
+            "Generate events symbols for profiling with perf");
 
 // Linux CodeObservers.
 class PerfCodeObserver : public CodeObserver {
@@ -73,8 +75,9 @@
       return;
     }
     const char* marker = optimized ? "*" : "";
-    char* buffer = OS::SCreate(Thread::Current()->zone(),
-        "%" Px " %" Px " %s%s\n", base, size, marker, name);
+    char* buffer =
+        OS::SCreate(Thread::Current()->zone(), "%" Px " %" Px " %s%s\n", base,
+                    size, marker, name);
     {
       MutexLocker ml(CodeObservers::mutex());
       (*file_write)(buffer, strlen(buffer), out_file_);
@@ -192,10 +195,8 @@
 // TODO(5411554):  May need to hoist these architecture dependent code
 // into a architecture specific file e.g: os_ia32_linux.cc
 intptr_t OS::ActivationFrameAlignment() {
-#if defined(TARGET_ARCH_IA32) ||                                               \
-    defined(TARGET_ARCH_X64) ||                                                \
-    defined(TARGET_ARCH_ARM64) ||                                              \
-    defined(TARGET_ARCH_DBC)
+#if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64) ||                   \
+    defined(TARGET_ARCH_ARM64) || defined(TARGET_ARCH_DBC)
   const int kMinimumAlignment = 16;
 #elif defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_MIPS)
   const int kMinimumAlignment = 8;
@@ -213,10 +214,8 @@
 
 
 intptr_t OS::PreferredCodeAlignment() {
-#if defined(TARGET_ARCH_IA32) ||                                               \
-    defined(TARGET_ARCH_X64) ||                                                \
-    defined(TARGET_ARCH_ARM64) ||                                              \
-    defined(TARGET_ARCH_DBC)
+#if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64) ||                   \
+    defined(TARGET_ARCH_ARM64) || defined(TARGET_ARCH_DBC)
   const int kMinimumAlignment = 32;
 #elif defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_MIPS)
   const int kMinimumAlignment = 16;
@@ -372,8 +371,7 @@
   if (str[0] == '-') {
     i = 1;
   }
-  if ((str[i] == '0') &&
-      (str[i + 1] == 'x' || str[i + 1] == 'X') &&
+  if ((str[i] == '0') && (str[i + 1] == 'x' || str[i + 1] == 'X') &&
       (str[i + 2] != '\0')) {
     base = 16;
   }
@@ -410,8 +408,7 @@
 }
 
 
-void OS::Shutdown() {
-}
+void OS::Shutdown() {}
 
 
 void OS::Abort() {
diff --git a/runtime/vm/os_macos.cc b/runtime/vm/os_macos.cc
index db3adbb..7038dd5 100644
--- a/runtime/vm/os_macos.cc
+++ b/runtime/vm/os_macos.cc
@@ -7,17 +7,17 @@
 
 #include "vm/os.h"
 
-#include <errno.h>  // NOLINT
-#include <limits.h>  // NOLINT
-#include <mach/mach.h>  // NOLINT
-#include <mach/clock.h>  // NOLINT
+#include <errno.h>           // NOLINT
+#include <limits.h>          // NOLINT
+#include <mach/mach.h>       // NOLINT
+#include <mach/clock.h>      // NOLINT
 #include <mach/mach_time.h>  // NOLINT
-#include <sys/time.h>  // NOLINT
-#include <sys/resource.h>  // NOLINT
-#include <unistd.h>  // NOLINT
+#include <sys/time.h>        // NOLINT
+#include <sys/resource.h>    // NOLINT
+#include <unistd.h>          // NOLINT
 #if TARGET_OS_IOS
 #include <sys/sysctl.h>  // NOLINT
-#include <syslog.h>  // NOLINT
+#include <syslog.h>      // NOLINT
 #endif
 
 #include "platform/utils.h"
@@ -153,8 +153,8 @@
   if (thread_port == MACH_PORT_NULL) {
     return -1;
   }
-  kern_return_t r = thread_info(thread_port, THREAD_BASIC_INFO,
-                                (thread_info_t)info, &count);
+  kern_return_t r =
+      thread_info(thread_port, THREAD_BASIC_INFO, (thread_info_t)info, &count);
   mach_port_deallocate(mach_task_self(), thread_port);
   ASSERT(r == KERN_SUCCESS);
   int64_t thread_cpu_micros =
@@ -183,7 +183,7 @@
 #else
 #error Unimplemented
 #endif
-#else  // TARGET_OS_IOS
+#else   // TARGET_OS_IOS
   // OS X activation frames must be 16 byte-aligned; see "Mac OS X ABI
   // Function Call Guide".
   return 16;
@@ -192,10 +192,8 @@
 
 
 intptr_t OS::PreferredCodeAlignment() {
-#if defined(TARGET_ARCH_IA32) ||                                               \
-    defined(TARGET_ARCH_X64) ||                                                \
-    defined(TARGET_ARCH_ARM64) ||                                              \
-    defined(TARGET_ARCH_DBC)
+#if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64) ||                   \
+    defined(TARGET_ARCH_ARM64) || defined(TARGET_ARCH_DBC)
   const int kMinimumAlignment = 32;
 #elif defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_MIPS)
   const int kMinimumAlignment = 16;
@@ -269,9 +267,9 @@
 
 
 char* OS::StrNDup(const char* s, intptr_t n) {
-  // strndup has only been added to Mac OS X in 10.7. We are supplying
-  // our own copy here if needed.
-#if !defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) || \
+// strndup has only been added to Mac OS X in 10.7. We are supplying
+// our own copy here if needed.
+#if !defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) ||                 \
     __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ <= 1060
   intptr_t len = strlen(s);
   if ((n < 0) || (len < 0)) {
@@ -286,16 +284,16 @@
   }
   result[len] = '\0';
   return reinterpret_cast<char*>(memmove(result, s, len));
-#else  // !defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) || ...
+#else   // !defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) || ...
   return strndup(s, n);
 #endif  // !defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) || ...
 }
 
 
 intptr_t OS::StrNLen(const char* s, intptr_t n) {
-  // strnlen has only been added to Mac OS X in 10.7. We are supplying
-  // our own copy here if needed.
-#if !defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) || \
+// strnlen has only been added to Mac OS X in 10.7. We are supplying
+// our own copy here if needed.
+#if !defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) ||                 \
     __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ <= 1060
   intptr_t len = 0;
   while ((len <= n) && (*s != '\0')) {
@@ -303,7 +301,7 @@
     len++;
   }
   return len;
-#else  // !defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) || ...
+#else   // !defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) || ...
   return strnlen(s, n);
 #endif  // !defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) || ...
 }
@@ -389,8 +387,7 @@
   if (str[0] == '-') {
     i = 1;
   }
-  if ((str[i] == '0') &&
-      (str[i + 1] == 'x' || str[i + 1] == 'X') &&
+  if ((str[i] == '0') && (str[i + 1] == 'x' || str[i + 1] == 'X') &&
       (str[i + 2] != '\0')) {
     base = 16;
   }
@@ -400,8 +397,7 @@
 }
 
 
-void OS::RegisterCodeObservers() {
-}
+void OS::RegisterCodeObservers() {}
 
 
 void OS::PrintErr(const char* format, ...) {
@@ -429,8 +425,7 @@
 }
 
 
-void OS::Shutdown() {
-}
+void OS::Shutdown() {}
 
 
 void OS::Abort() {
diff --git a/runtime/vm/os_thread.cc b/runtime/vm/os_thread.cc
index 3700c9f..f5818a2 100644
--- a/runtime/vm/os_thread.cc
+++ b/runtime/vm/os_thread.cc
@@ -20,23 +20,23 @@
 bool OSThread::creation_enabled_ = false;
 
 
-OSThread::OSThread() :
-    BaseThread(true),
-    id_(OSThread::GetCurrentThreadId()),
+OSThread::OSThread()
+    : BaseThread(true),
+      id_(OSThread::GetCurrentThreadId()),
 #if defined(DEBUG)
-    join_id_(kInvalidThreadJoinId),
+      join_id_(kInvalidThreadJoinId),
 #endif
 #ifndef PRODUCT
-    trace_id_(OSThread::GetCurrentThreadTraceId()),
+      trace_id_(OSThread::GetCurrentThreadTraceId()),
 #endif
-    name_(NULL),
-    timeline_block_lock_(new Mutex()),
-    timeline_block_(NULL),
-    thread_list_next_(NULL),
-    thread_interrupt_disabled_(1),  // Thread interrupts disabled by default.
-    log_(new class Log()),
-    stack_base_(0),
-    thread_(NULL) {
+      name_(NULL),
+      timeline_block_lock_(new Mutex()),
+      timeline_block_(NULL),
+      thread_list_next_(NULL),
+      thread_interrupt_disabled_(1),  // Thread interrupts disabled by default.
+      log_(new class Log()),
+      stack_base_(0),
+      thread_(NULL) {
 }
 
 
@@ -67,7 +67,6 @@
 }
 
 
-
 void OSThread::SetName(const char* name) {
   MutexLocker ml(thread_list_lock_);
   // Clear the old thread name.
@@ -135,8 +134,8 @@
 
 
 void OSThread::Cleanup() {
-  // We cannot delete the thread local key and thread list lock,  yet.
-  // See the note on thread_list_lock_ in os_thread.h.
+// We cannot delete the thread local key and thread list lock,  yet.
+// See the note on thread_list_lock_ in os_thread.h.
 #if 0
   if (thread_list_lock_ != NULL) {
     // Delete the thread local key.
@@ -243,7 +242,7 @@
           previous->thread_list_next_ = current->thread_list_next_;
         }
         thread->thread_list_next_ = NULL;
-        final_thread = !creation_enabled_  && (thread_list_head_ == NULL);
+        final_thread = !creation_enabled_ && (thread_list_head_ == NULL);
         break;
       }
       previous = current;
diff --git a/runtime/vm/os_thread.h b/runtime/vm/os_thread.h
index 00fad7c..da29831 100644
--- a/runtime/vm/os_thread.h
+++ b/runtime/vm/os_thread.h
@@ -70,9 +70,7 @@
   }
 #endif
 
-  const char* name() const {
-    return name_;
-  }
+  const char* name() const { return name_; }
 
   void SetName(const char* name);
 
@@ -83,14 +81,10 @@
     name_ = strdup(name);
   }
 
-  Mutex* timeline_block_lock() const {
-    return timeline_block_lock_;
-  }
+  Mutex* timeline_block_lock() const { return timeline_block_lock_; }
 
   // Only safe to access when holding |timeline_block_lock_|.
-  TimelineEventBlock* timeline_block() const {
-    return timeline_block_;
-  }
+  TimelineEventBlock* timeline_block() const { return timeline_block_; }
 
   // Only safe to access when holding |timeline_block_lock_|.
   void set_timeline_block(TimelineEventBlock* block) {
@@ -147,18 +141,17 @@
   static BaseThread* GetCurrentTLS() {
     return reinterpret_cast<BaseThread*>(OSThread::GetThreadLocal(thread_key_));
   }
-  static void SetCurrentTLS(uword value) {
-    SetThreadLocal(thread_key_, value);
-  }
+  static void SetCurrentTLS(uword value) { SetThreadLocal(thread_key_, value); }
 
-  typedef void (*ThreadStartFunction) (uword parameter);
-  typedef void (*ThreadDestructor) (void* parameter);
+  typedef void (*ThreadStartFunction)(uword parameter);
+  typedef void (*ThreadDestructor)(void* parameter);
 
   // Start a thread running the specified function. Returns 0 if the
   // thread started successfuly and a system specific error code if
   // the thread failed to start.
-  static int Start(
-      const char* name, ThreadStartFunction function, uword parameter);
+  static int Start(const char* name,
+                   ThreadStartFunction function,
+                   uword parameter);
 
   static ThreadLocalKey CreateThreadLocal(ThreadDestructor destructor = NULL);
   static void DeleteThreadLocal(ThreadLocalKey key);
@@ -202,9 +195,7 @@
   // We could eliminate this requirement if the windows thread interrupter
   // is implemented differently.
   Thread* thread() const { return thread_; }
-  void set_thread(Thread* value) {
-    thread_ = value;
-  }
+  void set_thread(Thread* value) { thread_ = value; }
 
   static void Cleanup();
 #ifndef PRODUCT
@@ -311,10 +302,7 @@
 
 class Monitor {
  public:
-  enum WaitResult {
-    kNotified,
-    kTimedOut
-  };
+  enum WaitResult { kNotified, kTimedOut };
 
   static const int64_t kNoTimeout = 0;
 
diff --git a/runtime/vm/os_thread_android.cc b/runtime/vm/os_thread_android.cc
index 8f9c648..c1a9303 100644
--- a/runtime/vm/os_thread_android.cc
+++ b/runtime/vm/os_thread_android.cc
@@ -9,7 +9,7 @@
 
 #include "vm/os_thread.h"
 
-#include <errno.h>  // NOLINT
+#include <errno.h>     // NOLINT
 #include <sys/time.h>  // NOLINT
 
 #include "platform/assert.h"
@@ -20,13 +20,13 @@
 
 namespace dart {
 
-#define VALIDATE_PTHREAD_RESULT(result) \
-  if (result != 0) { \
-    const int kBufferSize = 1024; \
-    char error_message[kBufferSize]; \
-    NOT_IN_PRODUCT(Profiler::DumpStackTrace(true /* native_stack_trace */)); \
-    Utils::StrError(result, error_message, kBufferSize); \
-    FATAL2("pthread error: %d (%s)", result, error_message); \
+#define VALIDATE_PTHREAD_RESULT(result)                                        \
+  if (result != 0) {                                                           \
+    const int kBufferSize = 1024;                                              \
+    char error_message[kBufferSize];                                           \
+    NOT_IN_PRODUCT(Profiler::DumpStackTrace(true /* native_stack_trace */));   \
+    Utils::StrError(result, error_message, kBufferSize);                       \
+    FATAL2("pthread error: %d (%s)", result, error_message);                   \
   }
 
 
@@ -39,17 +39,17 @@
 
 
 #ifdef DEBUG
-#define RETURN_ON_PTHREAD_FAILURE(result) \
-  if (result != 0) { \
-    const int kBufferSize = 1024; \
-    char error_message[kBufferSize]; \
-    Utils::StrError(result, error_message, kBufferSize); \
-    fprintf(stderr, "%s:%d: pthread error: %d (%s)\n", \
-            __FILE__, __LINE__, result, error_message); \
-    return result; \
+#define RETURN_ON_PTHREAD_FAILURE(result)                                      \
+  if (result != 0) {                                                           \
+    const int kBufferSize = 1024;                                              \
+    char error_message[kBufferSize];                                           \
+    Utils::StrError(result, error_message, kBufferSize);                       \
+    fprintf(stderr, "%s:%d: pthread error: %d (%s)\n", __FILE__, __LINE__,     \
+            result, error_message);                                            \
+    return result;                                                             \
   }
 #else
-#define RETURN_ON_PTHREAD_FAILURE(result) \
+#define RETURN_ON_PTHREAD_FAILURE(result)                                      \
   if (result != 0) return result;
 #endif
 
diff --git a/runtime/vm/os_thread_fuchsia.cc b/runtime/vm/os_thread_fuchsia.cc
index 481e59f..c57c2a1 100644
--- a/runtime/vm/os_thread_fuchsia.cc
+++ b/runtime/vm/os_thread_fuchsia.cc
@@ -16,9 +16,9 @@
 
 namespace dart {
 
-#define VALIDATE_PTHREAD_RESULT(result) \
-  if (result != 0) { \
-    FATAL1("pthread error: %d", result); \
+#define VALIDATE_PTHREAD_RESULT(result)                                        \
+  if (result != 0) {                                                           \
+    FATAL1("pthread error: %d", result);                                       \
   }
 
 
@@ -31,16 +31,13 @@
 
 
 #ifdef DEBUG
-#define RETURN_ON_PTHREAD_FAILURE(result) \
-  if (result != 0) { \
-    const int kBufferSize = 1024; \
-    char error_buf[kBufferSize]; \
-    fprintf(stderr, "%s:%d: pthread error: %d\n", \
-            __FILE__, __LINE__, result); \
-    return result; \
+#define RETURN_ON_PTHREAD_FAILURE(result)                                      \
+  if (result != 0) {                                                           \
+    fprintf(stderr, "%s:%d: pthread error: %d\n", __FILE__, __LINE__, result); \
+    return result;                                                             \
   }
 #else
-#define RETURN_ON_PTHREAD_FAILURE(result) \
+#define RETURN_ON_PTHREAD_FAILURE(result)                                      \
   if (result != 0) return result;
 #endif
 
diff --git a/runtime/vm/os_thread_linux.cc b/runtime/vm/os_thread_linux.cc
index ac8a02b..8190521 100644
--- a/runtime/vm/os_thread_linux.cc
+++ b/runtime/vm/os_thread_linux.cc
@@ -8,10 +8,10 @@
 
 #include "vm/os_thread.h"
 
-#include <errno.h>  // NOLINT
+#include <errno.h>         // NOLINT
 #include <sys/resource.h>  // NOLINT
-#include <sys/syscall.h>  // NOLINT
-#include <sys/time.h>  // NOLINT
+#include <sys/syscall.h>   // NOLINT
+#include <sys/time.h>      // NOLINT
 
 #include "platform/assert.h"
 #include "platform/signal_blocker.h"
@@ -21,13 +21,13 @@
 
 namespace dart {
 
-#define VALIDATE_PTHREAD_RESULT(result) \
-  if (result != 0) { \
-    const int kBufferSize = 1024; \
-    char error_buf[kBufferSize]; \
-    NOT_IN_PRODUCT(Profiler::DumpStackTrace(true /* native_stack_trace */)); \
-    FATAL2("pthread error: %d (%s)", result, \
-           Utils::StrError(result, error_buf, kBufferSize)); \
+#define VALIDATE_PTHREAD_RESULT(result)                                        \
+  if (result != 0) {                                                           \
+    const int kBufferSize = 1024;                                              \
+    char error_buf[kBufferSize];                                               \
+    NOT_IN_PRODUCT(Profiler::DumpStackTrace(true /* native_stack_trace */));   \
+    FATAL2("pthread error: %d (%s)", result,                                   \
+           Utils::StrError(result, error_buf, kBufferSize));                   \
   }
 
 
@@ -40,17 +40,16 @@
 
 
 #ifdef DEBUG
-#define RETURN_ON_PTHREAD_FAILURE(result) \
-  if (result != 0) { \
-    const int kBufferSize = 1024; \
-    char error_buf[kBufferSize]; \
-    fprintf(stderr, "%s:%d: pthread error: %d (%s)\n", \
-            __FILE__, __LINE__, result, \
-            Utils::StrError(result, error_buf, kBufferSize)); \
-    return result; \
+#define RETURN_ON_PTHREAD_FAILURE(result)                                      \
+  if (result != 0) {                                                           \
+    const int kBufferSize = 1024;                                              \
+    char error_buf[kBufferSize];                                               \
+    fprintf(stderr, "%s:%d: pthread error: %d (%s)\n", __FILE__, __LINE__,     \
+            result, Utils::StrError(result, error_buf, kBufferSize));          \
+    return result;                                                             \
   }
 #else
-#define RETURN_ON_PTHREAD_FAILURE(result) \
+#define RETURN_ON_PTHREAD_FAILURE(result)                                      \
   if (result != 0) return result;
 #endif
 
diff --git a/runtime/vm/os_thread_macos.cc b/runtime/vm/os_thread_macos.cc
index 92d0414..ec0959b 100644
--- a/runtime/vm/os_thread_macos.cc
+++ b/runtime/vm/os_thread_macos.cc
@@ -7,16 +7,16 @@
 
 #include "vm/os_thread.h"
 
-#include <sys/errno.h>  // NOLINT
-#include <sys/types.h>  // NOLINT
-#include <sys/sysctl.h>  // NOLINT
-#include <mach/mach_init.h>  // NOLINT
-#include <mach/mach_host.h>  // NOLINT
-#include <mach/mach_port.h>  // NOLINT
-#include <mach/mach_traps.h>  // NOLINT
-#include <mach/task_info.h>  // NOLINT
+#include <sys/errno.h>         // NOLINT
+#include <sys/types.h>         // NOLINT
+#include <sys/sysctl.h>        // NOLINT
+#include <mach/mach_init.h>    // NOLINT
+#include <mach/mach_host.h>    // NOLINT
+#include <mach/mach_port.h>    // NOLINT
+#include <mach/mach_traps.h>   // NOLINT
+#include <mach/task_info.h>    // NOLINT
 #include <mach/thread_info.h>  // NOLINT
-#include <mach/thread_act.h>  // NOLINT
+#include <mach/thread_act.h>   // NOLINT
 
 #include "platform/assert.h"
 #include "platform/utils.h"
@@ -25,13 +25,13 @@
 
 namespace dart {
 
-#define VALIDATE_PTHREAD_RESULT(result)         \
-  if (result != 0) { \
-    const int kBufferSize = 1024; \
-    char error_message[kBufferSize]; \
-    NOT_IN_PRODUCT(Profiler::DumpStackTrace(true /* native_stack_trace */)); \
-    Utils::StrError(result, error_message, kBufferSize); \
-    FATAL2("pthread error: %d (%s)", result, error_message); \
+#define VALIDATE_PTHREAD_RESULT(result)                                        \
+  if (result != 0) {                                                           \
+    const int kBufferSize = 1024;                                              \
+    char error_message[kBufferSize];                                           \
+    NOT_IN_PRODUCT(Profiler::DumpStackTrace(true /* native_stack_trace */));   \
+    Utils::StrError(result, error_message, kBufferSize);                       \
+    FATAL2("pthread error: %d (%s)", result, error_message);                   \
   }
 
 
@@ -44,17 +44,17 @@
 
 
 #ifdef DEBUG
-#define RETURN_ON_PTHREAD_FAILURE(result) \
-  if (result != 0) { \
-    const int kBufferSize = 1024; \
-    char error_message[kBufferSize]; \
-    Utils::StrError(result, error_message, kBufferSize); \
-    fprintf(stderr, "%s:%d: pthread error: %d (%s)\n", \
-            __FILE__, __LINE__, result, error_message); \
-    return result; \
+#define RETURN_ON_PTHREAD_FAILURE(result)                                      \
+  if (result != 0) {                                                           \
+    const int kBufferSize = 1024;                                              \
+    char error_message[kBufferSize];                                           \
+    Utils::StrError(result, error_message, kBufferSize);                       \
+    fprintf(stderr, "%s:%d: pthread error: %d (%s)\n", __FILE__, __LINE__,     \
+            result, error_message);                                            \
+    return result;                                                             \
   }
 #else
-#define RETURN_ON_PTHREAD_FAILURE(result) \
+#define RETURN_ON_PTHREAD_FAILURE(result)                                      \
   if (result != 0) return result;
 #endif
 
@@ -394,9 +394,8 @@
         (micros - (secs * kMicrosecondsPerSecond)) * kNanosecondsPerMicrosecond;
     ts.tv_sec = static_cast<int32_t>(secs);
     ts.tv_nsec = static_cast<long>(nanos);  // NOLINT (long used in timespec).
-    int result = pthread_cond_timedwait_relative_np(data_.cond(),
-                                                    data_.mutex(),
-                                                    &ts);
+    int result =
+        pthread_cond_timedwait_relative_np(data_.cond(), data_.mutex(), &ts);
     ASSERT((result == 0) || (result == ETIMEDOUT));
     if (result == ETIMEDOUT) {
       retval = kTimedOut;
diff --git a/runtime/vm/os_thread_win.cc b/runtime/vm/os_thread_win.cc
index 6be6804..7599195 100644
--- a/runtime/vm/os_thread_win.cc
+++ b/runtime/vm/os_thread_win.cc
@@ -314,7 +314,7 @@
 void MonitorWaitData::ThreadExit() {
   if (MonitorWaitData::monitor_wait_data_key_ != kUnsetThreadLocalKey) {
     uword raw_wait_data =
-      OSThread::GetThreadLocal(MonitorWaitData::monitor_wait_data_key_);
+        OSThread::GetThreadLocal(MonitorWaitData::monitor_wait_data_key_);
     // Clear in case this is called a second time.
     OSThread::SetThreadLocal(MonitorWaitData::monitor_wait_data_key_, 0);
     if (raw_wait_data != 0) {
@@ -425,7 +425,7 @@
   // Get the MonitorWaitData object containing the event for this
   // thread from thread local storage. Create it if it does not exist.
   uword raw_wait_data =
-    OSThread::GetThreadLocal(MonitorWaitData::monitor_wait_data_key_);
+      OSThread::GetThreadLocal(MonitorWaitData::monitor_wait_data_key_);
   MonitorWaitData* wait_data = NULL;
   if (raw_wait_data == 0) {
     HANDLE event = CreateEvent(NULL, FALSE, FALSE, NULL);
diff --git a/runtime/vm/os_thread_win.h b/runtime/vm/os_thread_win.h
index 714d175..3620570 100644
--- a/runtime/vm/os_thread_win.h
+++ b/runtime/vm/os_thread_win.h
@@ -122,24 +122,18 @@
 };
 
 
-typedef void (*ThreadDestructor) (void* parameter);
+typedef void (*ThreadDestructor)(void* parameter);
 
 
 class ThreadLocalEntry {
  public:
   ThreadLocalEntry(ThreadLocalKey key, ThreadDestructor destructor)
-      : key_(key),
-        destructor_(destructor) {
-  }
+      : key_(key), destructor_(destructor) {}
 
-  ThreadLocalKey key() const {
-    return key_;
-  }
+  ThreadLocalKey key() const { return key_; }
 
 
-  ThreadDestructor destructor() const {
-    return destructor_;
-  }
+  ThreadDestructor destructor() const { return destructor_; }
 
  private:
   ThreadLocalKey key_;
@@ -149,7 +143,7 @@
 };
 
 
-template<typename T>
+template <typename T>
 class MallocGrowableArray;
 
 
diff --git a/runtime/vm/os_win.cc b/runtime/vm/os_win.cc
index 129dcd1..1134ce7 100644
--- a/runtime/vm/os_win.cc
+++ b/runtime/vm/os_win.cc
@@ -7,10 +7,10 @@
 
 #include "vm/os.h"
 
-#include <malloc.h>  // NOLINT
+#include <malloc.h>   // NOLINT
 #include <process.h>  // NOLINT
-#include <psapi.h>  // NOLINT
-#include <time.h>  // NOLINT
+#include <psapi.h>    // NOLINT
+#include <time.h>     // NOLINT
 
 #include "platform/utils.h"
 #include "platform/assert.h"
@@ -79,14 +79,12 @@
   }
 
   // Convert the wchar string to a null-terminated utf8 string.
-  wchar_t* wchar_name = daylight_savings
-                      ? zone_information.DaylightName
-                      : zone_information.StandardName;
-  intptr_t utf8_len = WideCharToMultiByte(
-      CP_UTF8, 0, wchar_name, -1, NULL, 0, NULL, NULL);
+  wchar_t* wchar_name = daylight_savings ? zone_information.DaylightName
+                                         : zone_information.StandardName;
+  intptr_t utf8_len =
+      WideCharToMultiByte(CP_UTF8, 0, wchar_name, -1, NULL, 0, NULL, NULL);
   char* name = Thread::Current()->zone()->Alloc<char>(utf8_len + 1);
-  WideCharToMultiByte(
-      CP_UTF8, 0, wchar_name, -1, name, utf8_len, NULL, NULL);
+  WideCharToMultiByte(CP_UTF8, 0, wchar_name, -1, name, utf8_len, NULL, NULL);
   name[utf8_len] = '\0';
   return name;
 }
@@ -377,8 +375,7 @@
   if (str[0] == '-') {
     i = 1;
   }
-  if ((str[i] == '0') &&
-      (str[i + 1] == 'x' || str[i + 1] == 'X') &&
+  if ((str[i] == '0') && (str[i + 1] == 'x' || str[i + 1] == 'X') &&
       (str[i + 2] != '\0')) {
     base = 16;
   }
@@ -388,8 +385,7 @@
 }
 
 
-void OS::RegisterCodeObservers() {
-}
+void OS::RegisterCodeObservers() {}
 
 
 void OS::PrintErr(const char* format, ...) {
diff --git a/runtime/vm/pages.cc b/runtime/vm/pages.cc
index f2bbdf2..36019130 100644
--- a/runtime/vm/pages.cc
+++ b/runtime/vm/pages.cc
@@ -17,23 +17,41 @@
 
 namespace dart {
 
-DEFINE_FLAG(int, heap_growth_rate, 0,
+DEFINE_FLAG(int,
+            heap_growth_rate,
+            0,
             "The max number of pages the heap can grow at a time");
-DEFINE_FLAG(int, old_gen_growth_space_ratio, 20,
+DEFINE_FLAG(int,
+            old_gen_growth_space_ratio,
+            20,
             "The desired maximum percentage of free space after old gen GC");
-DEFINE_FLAG(int, old_gen_growth_time_ratio, 3,
+DEFINE_FLAG(int,
+            old_gen_growth_time_ratio,
+            3,
             "The desired maximum percentage of time spent in old gen GC");
-DEFINE_FLAG(int, old_gen_growth_rate, 280,
+DEFINE_FLAG(int,
+            old_gen_growth_rate,
+            280,
             "The max number of pages the old generation can grow at a time");
-DEFINE_FLAG(bool, print_free_list_before_gc, false,
+DEFINE_FLAG(bool,
+            print_free_list_before_gc,
+            false,
             "Print free list statistics before a GC");
-DEFINE_FLAG(bool, print_free_list_after_gc, false,
+DEFINE_FLAG(bool,
+            print_free_list_after_gc,
+            false,
             "Print free list statistics after a GC");
-DEFINE_FLAG(int, code_collection_interval_in_us, 30000000,
+DEFINE_FLAG(int,
+            code_collection_interval_in_us,
+            30000000,
             "Time between attempts to collect unused code.");
-DEFINE_FLAG(bool, log_code_drop, false,
+DEFINE_FLAG(bool,
+            log_code_drop,
+            false,
             "Emit a log message when pointers to unused code are dropped.");
-DEFINE_FLAG(bool, always_drop_code, false,
+DEFINE_FLAG(bool,
+            always_drop_code,
+            false,
             "Always try to drop code if the function's usage counter is >= 0");
 DEFINE_FLAG(bool, log_growth, false, "Log PageSpace growth policy decisions.");
 
@@ -405,22 +423,22 @@
     // A successful allocation should increase usage_.
     ASSERT(usage_before.used_in_words < usage_.used_in_words);
   }
-  // Note we cannot assert that a failed allocation should not change
-  // used_in_words as another thread could have changed used_in_words.
+// Note we cannot assert that a failed allocation should not change
+// used_in_words as another thread could have changed used_in_words.
 #endif
   ASSERT((result & kObjectAlignmentMask) == kOldObjectAlignmentOffset);
   return result;
 }
 
 
-  void PageSpace::AcquireDataLock() {
-    freelist_[HeapPage::kData].mutex()->Lock();
-  }
+void PageSpace::AcquireDataLock() {
+  freelist_[HeapPage::kData].mutex()->Lock();
+}
 
 
-  void PageSpace::ReleaseDataLock() {
-    freelist_[HeapPage::kData].mutex()->Unlock();
-  }
+void PageSpace::ReleaseDataLock() {
+  freelist_[HeapPage::kData].mutex()->Unlock();
+}
 
 
 void PageSpace::AllocateExternal(intptr_t size) {
@@ -456,6 +474,7 @@
     ASSERT(!Done());
     page_ = space_->NextPageAnySize(page_);
   }
+
  private:
   const PageSpace* space_;
   MutexLocker ml_;
@@ -479,6 +498,7 @@
     ASSERT(!Done());
     page_ = page_->next();
   }
+
  private:
   const PageSpace* space_;
   MutexLocker ml_;
@@ -501,6 +521,7 @@
     ASSERT(!Done());
     page_ = page_->next();
   }
+
  private:
   const PageSpace* space_;
   MutexLocker ml_;
@@ -549,8 +570,7 @@
   ASSERT(heap_ != NULL);
   ASSERT(heap_->isolate() != NULL);
   Isolate* isolate = heap_->isolate();
-  isolate->GetHeapOldUsedMaxMetric()->SetValue(
-      UsedInWords() * kWordSize);
+  isolate->GetHeapOldUsedMaxMetric()->SetValue(UsedInWords() * kWordSize);
 }
 
 
@@ -699,25 +719,25 @@
 
 class HeapMapAsJSONVisitor : public ObjectVisitor {
  public:
-  explicit HeapMapAsJSONVisitor(JSONArray* array) : array_(array) { }
+  explicit HeapMapAsJSONVisitor(JSONArray* array) : array_(array) {}
   virtual void VisitObject(RawObject* obj) {
     array_->AddValue(obj->Size() / kObjectAlignment);
     array_->AddValue(obj->GetClassId());
   }
+
  private:
   JSONArray* array_;
 };
 
 
-void PageSpace::PrintHeapMapToJSONStream(
-    Isolate* isolate, JSONStream* stream) const {
+void PageSpace::PrintHeapMapToJSONStream(Isolate* isolate,
+                                         JSONStream* stream) const {
   if (!FLAG_support_service) {
     return;
   }
   JSONObject heap_map(stream);
   heap_map.AddProperty("type", "HeapMap");
-  heap_map.AddProperty("freeClassId",
-                       static_cast<intptr_t>(kFreeListElement));
+  heap_map.AddProperty("freeClassId", static_cast<intptr_t>(kFreeListElement));
   heap_map.AddProperty("unitSizeBytes",
                        static_cast<intptr_t>(kObjectAlignment));
   heap_map.AddProperty("pageSizeBytes", kPageSizeInWords * kWordSize);
@@ -735,16 +755,16 @@
     JSONArray all_pages(&heap_map, "pages");
     for (HeapPage* page = pages_; page != NULL; page = page->next()) {
       JSONObject page_container(&all_pages);
-      page_container.AddPropertyF("objectStart",
-                                  "0x%" Px "", page->object_start());
+      page_container.AddPropertyF("objectStart", "0x%" Px "",
+                                  page->object_start());
       JSONArray page_map(&page_container, "objects");
       HeapMapAsJSONVisitor printer(&page_map);
       page->VisitObjects(&printer);
     }
     for (HeapPage* page = exec_pages_; page != NULL; page = page->next()) {
       JSONObject page_container(&all_pages);
-      page_container.AddPropertyF("objectStart",
-                                  "0x%" Px "", page->object_start());
+      page_container.AddPropertyF("objectStart", "0x%" Px "",
+                                  page->object_start());
       JSONArray page_map(&page_container, "objects");
       HeapMapAsJSONVisitor printer(&page_map);
       page->VisitObjects(&printer);
@@ -841,8 +861,7 @@
     SpaceUsage usage_before = GetCurrentUsage();
 
     // Mark all reachable old-gen objects.
-    bool collect_code = FLAG_collect_code &&
-                        ShouldCollectCode() &&
+    bool collect_code = FLAG_collect_code && ShouldCollectCode() &&
                         !isolate->HasAttemptedReload();
     GCMarker marker(heap_);
     marker.MarkObjects(isolate, this, invoke_api_callbacks, collect_code);
@@ -911,8 +930,8 @@
         page = pages_;
         while (page != NULL) {
           HeapPage* next_page = page->next();
-          bool page_in_use = sweeper.SweepPage(
-              page, &freelist_[page->type()], true);
+          bool page_in_use =
+              sweeper.SweepPage(page, &freelist_[page->type()], true);
           if (page_in_use) {
             prev_page = page;
           } else {
@@ -928,8 +947,8 @@
         }
       } else {
         // Start the concurrent sweeper task now.
-        GCSweeper::SweepConcurrent(
-            isolate, pages_, pages_tail_, &freelist_[HeapPage::kData]);
+        GCSweeper::SweepConcurrent(isolate, pages_, pages_tail_,
+                                   &freelist_[HeapPage::kData]);
       }
     }
 
@@ -939,9 +958,8 @@
     int64_t end = OS::GetCurrentTimeMicros();
 
     // Record signals for growth control. Include size of external allocations.
-    page_space_controller_.EvaluateGarbageCollection(usage_before,
-                                                     GetCurrentUsage(),
-                                                     start, end);
+    page_space_controller_.EvaluateGarbageCollection(
+        usage_before, GetCurrentUsage(), start, end);
 
     heap_->RecordTime(kMarkObjects, mid1 - start);
     heap_->RecordTime(kResetFreeLists, mid2 - mid1);
@@ -979,21 +997,18 @@
   if (remaining < size) {
     // Checking this first would be logical, but needlessly slow.
     if (size >= kAllocatablePageSize) {
-      return is_locked ?
-          TryAllocateDataLocked(size, growth_policy) :
-          TryAllocate(size, HeapPage::kData, growth_policy);
+      return is_locked ? TryAllocateDataLocked(size, growth_policy)
+                       : TryAllocate(size, HeapPage::kData, growth_policy);
     }
-    FreeListElement* block = is_locked ?
-        freelist_[HeapPage::kData].TryAllocateLargeLocked(size) :
-        freelist_[HeapPage::kData].TryAllocateLarge(size);
+    FreeListElement* block =
+        is_locked ? freelist_[HeapPage::kData].TryAllocateLargeLocked(size)
+                  : freelist_[HeapPage::kData].TryAllocateLarge(size);
     if (block == NULL) {
       // Allocating from a new page (if growth policy allows) will have the
       // side-effect of populating the freelist with a large block. The next
       // bump allocation request will have a chance to consume that block.
       // TODO(koda): Could take freelist lock just once instead of twice.
-      return TryAllocateInFreshPage(size,
-                                    HeapPage::kData,
-                                    growth_policy,
+      return TryAllocateInFreshPage(size, HeapPage::kData, growth_policy,
                                     is_locked);
     }
     intptr_t block_size = block->Size();
@@ -1013,7 +1028,7 @@
   bump_top_ += size;
   AtomicOperations::IncrementBy(&(usage_.used_in_words),
                                 (size >> kWordSizeLog2));
-  // Note: Remaining block is unwalkable until MakeIterable is called.
+// Note: Remaining block is unwalkable until MakeIterable is called.
 #ifdef DEBUG
   if (bump_top_ < bump_end_) {
     // Fail fast if we try to walk the remaining block.
@@ -1071,7 +1086,7 @@
   page->object_end_ = memory->end();
 
   MutexLocker ml(pages_lock_);
-  HeapPage** first, **tail;
+  HeapPage **first, **tail;
   if (is_executable) {
     ASSERT(Utils::IsAligned(pointer, OS::PreferredCodeAlignment()));
     page->type_ = HeapPage::kExecutable;
@@ -1102,8 +1117,7 @@
       desired_utilization_((100.0 - heap_growth_ratio) / 100.0),
       heap_growth_max_(heap_growth_max),
       garbage_collection_time_ratio_(garbage_collection_time_ratio),
-      last_code_collection_in_us_(OS::GetCurrentTimeMicros()) {
-}
+      last_code_collection_in_us_(OS::GetCurrentTimeMicros()) {}
 
 
 PageSpaceController::~PageSpaceController() {}
@@ -1139,18 +1153,17 @@
   bool needs_gc = capacity_increase_in_pages * multiplier > grow_heap_;
   if (FLAG_log_growth) {
     OS::PrintErr("%s: %" Pd " * %f %s %" Pd "\n",
-                 needs_gc ? "NEEDS GC" : "grow",
-                 capacity_increase_in_pages,
-                 multiplier,
-                 needs_gc ? ">" : "<=",
-                 grow_heap_);
+                 needs_gc ? "NEEDS GC" : "grow", capacity_increase_in_pages,
+                 multiplier, needs_gc ? ">" : "<=", grow_heap_);
   }
   return needs_gc;
 }
 
 
-void PageSpaceController::EvaluateGarbageCollection(
-    SpaceUsage before, SpaceUsage after, int64_t start, int64_t end) {
+void PageSpaceController::EvaluateGarbageCollection(SpaceUsage before,
+                                                    SpaceUsage after,
+                                                    int64_t start,
+                                                    int64_t end) {
   ASSERT(end >= start);
   history_.AddGarbageCollectionTime(start, end);
   const int gc_time_fraction = history_.GarbageCollectionTimeFraction();
@@ -1174,15 +1187,16 @@
       t += (gc_time_fraction - garbage_collection_time_ratio_) / 100.0;
     }
 
-    const intptr_t grow_ratio = (
-        static_cast<intptr_t>(after.capacity_in_words / desired_utilization_) -
-        after.capacity_in_words) / PageSpace::kPageSizeInWords;
+    const intptr_t grow_ratio =
+        (static_cast<intptr_t>(after.capacity_in_words / desired_utilization_) -
+         after.capacity_in_words) /
+        PageSpace::kPageSizeInWords;
     if (garbage_ratio == 0) {
       // No garbage in the previous cycle so it would be hard to compute a
       // grow_heap_ size based on estimated garbage so we use growth ratio
       // heuristics instead.
-      grow_heap_ = Utils::Maximum(static_cast<intptr_t>(heap_growth_max_),
-                                  grow_ratio);
+      grow_heap_ =
+          Utils::Maximum(static_cast<intptr_t>(heap_growth_max_), grow_ratio);
     } else {
       // Find minimum 'grow_heap_' such that after increasing capacity by
       // 'grow_heap_' pages and filling them, we expect a GC to be worthwhile.
@@ -1192,7 +1206,7 @@
       while (min < max) {
         local_grow_heap = (max + min) / 2;
         const intptr_t limit = after.capacity_in_words +
-            (grow_heap_ * PageSpace::kPageSizeInWords);
+                               (grow_heap_ * PageSpace::kPageSizeInWords);
         const intptr_t allocated_before_next_gc = limit - after.used_in_words;
         const double estimated_garbage = k * allocated_before_next_gc;
         if (t <= estimated_garbage / limit) {
@@ -1225,8 +1239,8 @@
 }
 
 
-void PageSpaceGarbageCollectionHistory::
-    AddGarbageCollectionTime(int64_t start, int64_t end) {
+void PageSpaceGarbageCollectionHistory::AddGarbageCollectionTime(int64_t start,
+                                                                 int64_t end) {
   Entry entry;
   entry.start = start;
   entry.end = end;
@@ -1247,8 +1261,8 @@
     return 0;
   } else {
     ASSERT(total_time >= gc_time);
-    int result = static_cast<int>((static_cast<double>(gc_time) /
-                                   static_cast<double>(total_time)) * 100);
+    int result = static_cast<int>(
+        (static_cast<double>(gc_time) / static_cast<double>(total_time)) * 100);
     return result;
   }
 }
diff --git a/runtime/vm/pages.h b/runtime/vm/pages.h
index ff7a0e8..d1cfad2 100644
--- a/runtime/vm/pages.h
+++ b/runtime/vm/pages.h
@@ -28,30 +28,17 @@
 // A page containing old generation objects.
 class HeapPage {
  public:
-  enum PageType {
-    kData = 0,
-    kExecutable,
-    kReadOnlyData,
-    kNumPageTypes
-  };
+  enum PageType { kData = 0, kExecutable, kReadOnlyData, kNumPageTypes };
 
   HeapPage* next() const { return next_; }
   void set_next(HeapPage* next) { next_ = next; }
 
-  bool Contains(uword addr) {
-    return memory_->Contains(addr);
-  }
+  bool Contains(uword addr) { return memory_->Contains(addr); }
 
-  uword object_start() const {
-    return memory_->start() + ObjectStartOffset();
-  }
-  uword object_end() const {
-    return object_end_;
-  }
+  uword object_start() const { return memory_->start() + ObjectStartOffset(); }
+  uword object_end() const { return object_end_; }
 
-  PageType type() const {
-    return type_;
-  }
+  PageType type() const { return type_; }
 
   bool embedder_allocated() const { return memory_->embedder_allocated(); }
 
@@ -137,26 +124,19 @@
   // Should be called after each collection to update the controller state.
   void EvaluateGarbageCollection(SpaceUsage before,
                                  SpaceUsage after,
-                                 int64_t start, int64_t end);
+                                 int64_t start,
+                                 int64_t end);
 
   int64_t last_code_collection_in_us() { return last_code_collection_in_us_; }
   void set_last_code_collection_in_us(int64_t t) {
     last_code_collection_in_us_ = t;
   }
 
-  void set_last_usage(SpaceUsage current) {
-    last_usage_ = current;
-  }
+  void set_last_usage(SpaceUsage current) { last_usage_ = current; }
 
-  void Enable() {
-    is_enabled_ = true;
-  }
-  void Disable() {
-    is_enabled_ = false;
-  }
-  bool is_enabled() {
-    return is_enabled_;
-  }
+  void Enable() { is_enabled_ = true; }
+  void Disable() { is_enabled_ = false; }
+  bool is_enabled() { return is_enabled_; }
 
  private:
   Heap* heap_;
@@ -199,10 +179,7 @@
   // TODO(iposva): Determine heap sizes and tune the page size accordingly.
   static const intptr_t kPageSizeInWords = 256 * KBInWords;
 
-  enum GrowthPolicy {
-    kControlGrowth,
-    kForceGrowth
-  };
+  enum GrowthPolicy { kControlGrowth, kForceGrowth };
 
   PageSpace(Heap* heap,
             intptr_t max_capacity_in_words,
@@ -215,8 +192,8 @@
     bool is_protected =
         (type == HeapPage::kExecutable) && FLAG_write_protect_code;
     bool is_locked = false;
-    return TryAllocateInternal(
-        size, type, growth_policy, is_protected, is_locked);
+    return TryAllocateInternal(size, type, growth_policy, is_protected,
+                               is_locked);
   }
 
   bool NeedsGarbageCollection() const {
@@ -230,8 +207,8 @@
     return usage_.capacity_in_words;
   }
   void IncreaseCapacityInWords(intptr_t increase_in_words) {
-     MutexLocker ml(pages_lock_);
-     IncreaseCapacityInWordsLocked(increase_in_words);
+    MutexLocker ml(pages_lock_);
+    IncreaseCapacityInWordsLocked(increase_in_words);
   }
   void IncreaseCapacityInWordsLocked(intptr_t increase_in_words) {
     DEBUG_ASSERT(pages_lock_->IsOwnedByCurrentThread());
@@ -242,9 +219,7 @@
   void UpdateMaxCapacityLocked();
   void UpdateMaxUsed();
 
-  int64_t ExternalInWords() const {
-    return usage_.external_in_words;
-  }
+  int64_t ExternalInWords() const { return usage_.external_in_words; }
   SpaceUsage GetCurrentUsage() const {
     MutexLocker ml(pages_lock_);
     return usage_;
@@ -252,9 +227,7 @@
 
   bool Contains(uword addr) const;
   bool Contains(uword addr, HeapPage::PageType type) const;
-  bool IsValidAddress(uword addr) const {
-    return Contains(addr);
-  }
+  bool IsValidAddress(uword addr) const { return Contains(addr); }
 
   void VisitObjects(ObjectVisitor* visitor) const;
   void VisitObjectsNoEmbedderPages(ObjectVisitor* visitor) const;
@@ -285,13 +258,11 @@
     }
   }
 
-  bool GrowthControlState() {
-    return page_space_controller_.is_enabled();
-  }
+  bool GrowthControlState() { return page_space_controller_.is_enabled(); }
 
   bool NeedsExternalGC() const {
     return (max_external_in_words_ != 0) &&
-        (ExternalInWords() > max_external_in_words_);
+           (ExternalInWords() > max_external_in_words_);
   }
 
   // Note: Code pages are made executable/non-executable when 'read_only' is
@@ -299,21 +270,13 @@
   void WriteProtect(bool read_only);
   void WriteProtectCode(bool read_only);
 
-  void AddGCTime(int64_t micros) {
-    gc_time_micros_ += micros;
-  }
+  void AddGCTime(int64_t micros) { gc_time_micros_ += micros; }
 
-  int64_t gc_time_micros() const {
-    return gc_time_micros_;
-  }
+  int64_t gc_time_micros() const { return gc_time_micros_; }
 
-  void IncrementCollections() {
-    collections_++;
-  }
+  void IncrementCollections() { collections_++; }
 
-  intptr_t collections() const {
-    return collections_;
-  }
+  intptr_t collections() const { return collections_; }
 
 #ifndef PRODUCT
   void PrintToJSONObject(JSONObject* object) const;
@@ -330,9 +293,7 @@
   uword TryAllocateDataLocked(intptr_t size, GrowthPolicy growth_policy) {
     bool is_protected = false;
     bool is_locked = true;
-    return TryAllocateInternal(size,
-                               HeapPage::kData,
-                               growth_policy,
+    return TryAllocateInternal(size, HeapPage::kData, growth_policy,
                                is_protected, is_locked);
   }
 
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index a685452..86264b9 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -45,20 +45,32 @@
 DEFINE_FLAG(bool, enable_debug_break, false, "Allow use of break \"message\".");
 DEFINE_FLAG(bool, trace_parser, false, "Trace parser operations.");
 DEFINE_FLAG(bool, warn_mixin_typedef, true, "Warning on legacy mixin typedef.");
+DEFINE_FLAG(bool, warn_new_tearoff_syntax, true, "Warning on new tear off.");
 // TODO(floitsch): remove the conditional-directive flag, once we publicly
 // committed to the current version.
-DEFINE_FLAG(bool, conditional_directives, true,
-    "Enable conditional directives");
+DEFINE_FLAG(bool,
+            conditional_directives,
+            true,
+            "Enable conditional directives");
 DEFINE_FLAG(bool, generic_method_syntax, false, "Enable generic functions.");
-DEFINE_FLAG(bool, initializing_formal_access, false,
-    "Make initializing formal parameters visible in initializer list.");
-DEFINE_FLAG(bool, warn_super, false,
-    "Warning if super initializer not last in initializer list.");
+DEFINE_FLAG(bool,
+            initializing_formal_access,
+            false,
+            "Make initializing formal parameters visible in initializer list.");
+DEFINE_FLAG(bool,
+            warn_super,
+            false,
+            "Warning if super initializer not last in initializer list.");
 DEFINE_FLAG(bool, warn_patch, false, "Warn on old-style patch syntax.");
-DEFINE_FLAG(bool, await_is_keyword, false,
+DEFINE_FLAG(
+    bool,
+    await_is_keyword,
+    false,
     "await and yield are treated as proper keywords in synchronous code.");
-DEFINE_FLAG(bool, assert_initializer, false,
-    "Allow asserts in initializer lists.");
+DEFINE_FLAG(bool,
+            assert_initializer,
+            false,
+            "Allow asserts in initializer lists.");
 
 DECLARE_FLAG(bool, profile_vm);
 DECLARE_FLAG(bool, trace_service);
@@ -86,8 +98,8 @@
         intptr_t line, column;
         script.GetTokenLocation(token_pos, &line, &column);
         PrintIndent();
-        OS::Print("%s (line %" Pd ", col %" Pd ", token %" Pd ")\n",
-                  msg, line, column, token_pos.value());
+        OS::Print("%s (line %" Pd ", col %" Pd ", token %" Pd ")\n", msg, line,
+                  column, token_pos.value());
       }
       (*indent_)++;
     }
@@ -101,13 +113,15 @@
 
  private:
   void PrintIndent() {
-    for (intptr_t i = 0; i < *indent_; i++) { OS::Print(". "); }
+    for (intptr_t i = 0; i < *indent_; i++) {
+      OS::Print(". ");
+    }
   }
   intptr_t* indent_;
 };
 
 
-#define TRACE_PARSER(s) \
+#define TRACE_PARSER(s)                                                        \
   TraceParser __p__(this->TokenPos(), this->script_, &this->trace_indent_, s)
 
 #else  // not DEBUG
@@ -120,9 +134,7 @@
   BoolScope(bool* addr, bool new_value) : _addr(addr), _saved_value(*addr) {
     *_addr = new_value;
   }
-  ~BoolScope() {
-    *_addr = _saved_value;
-  }
+  ~BoolScope() { *_addr = _saved_value; }
 
  private:
   bool* _addr;
@@ -133,14 +145,9 @@
 // Helper class to save and restore token position.
 class Parser::TokenPosScope : public ValueObject {
  public:
-  explicit TokenPosScope(Parser *p) : p_(p) {
-    saved_pos_ = p_->TokenPos();
-  }
-  TokenPosScope(Parser *p, TokenPosition pos) : p_(p), saved_pos_(pos) {
-  }
-  ~TokenPosScope() {
-    p_->SetPosition(saved_pos_);
-  }
+  explicit TokenPosScope(Parser* p) : p_(p) { saved_pos_ = p_->TokenPos(); }
+  TokenPosScope(Parser* p, TokenPosition pos) : p_(p), saved_pos_(pos) {}
+  ~TokenPosScope() { p_->SetPosition(saved_pos_); }
 
  private:
   Parser* p_;
@@ -161,9 +168,7 @@
       parser_->CheckStack();
     }
   }
-  ~RecursionChecker() {
-    parser_->recursion_counter_--;
-  }
+  ~RecursionChecker() { parser_->recursion_counter_--; }
 
  private:
   Parser* parser_;
@@ -197,7 +202,8 @@
       // the resulting code anyway.
       if (Compiler::IsBackgroundCompilation()) {
         if (!other->IsConsistentWith(*field)) {
-          Compiler::AbortBackgroundCompilation(Thread::kNoDeoptId,
+          Compiler::AbortBackgroundCompilation(
+              Thread::kNoDeoptId,
               "Field's guarded state changed during compilation");
         }
       }
@@ -215,14 +221,10 @@
 
 
 void ParsedFunction::Bailout(const char* origin, const char* reason) const {
-  Report::MessageF(Report::kBailout,
-                   Script::Handle(function_.script()),
-                   function_.token_pos(),
-                   Report::AtLocation,
-                   "%s Bailout in %s: %s",
-                   origin,
-                   String::Handle(function_.name()).ToCString(),
-                   reason);
+  Report::MessageF(Report::kBailout, Script::Handle(function_.script()),
+                   function_.token_pos(), Report::AtLocation,
+                   "%s Bailout in %s: %s", origin,
+                   String::Handle(function_.name()).ToCString(), reason);
   UNREACHABLE();
 }
 
@@ -243,10 +245,8 @@
 LocalVariable* ParsedFunction::EnsureExpressionTemp() {
   if (!has_expression_temp_var()) {
     LocalVariable* temp =
-        new (Z) LocalVariable(function_.token_pos(),
-                              function_.token_pos(),
-                              Symbols::ExprTemp(),
-                              Object::dynamic_type());
+        new (Z) LocalVariable(function_.token_pos(), function_.token_pos(),
+                              Symbols::ExprTemp(), Object::dynamic_type());
     ASSERT(temp != NULL);
     set_expression_temp_var(temp);
   }
@@ -257,11 +257,9 @@
 
 void ParsedFunction::EnsureFinallyReturnTemp(bool is_async) {
   if (!has_finally_return_temp_var()) {
-    LocalVariable* temp = new(Z) LocalVariable(
-        function_.token_pos(),
-        function_.token_pos(),
-        Symbols::FinallyRetVal(),
-        Object::dynamic_type());
+    LocalVariable* temp =
+        new (Z) LocalVariable(function_.token_pos(), function_.token_pos(),
+                              Symbols::FinallyRetVal(), Object::dynamic_type());
     ASSERT(temp != NULL);
     temp->set_is_final();
     if (is_async) {
@@ -328,12 +326,9 @@
   // Allocate parameters and local variables, either in the local frame or
   // in the context(s).
   bool found_captured_variables = false;
-  int next_free_frame_index =
-      scope->AllocateVariables(first_parameter_index_,
-                               num_params,
-                               first_stack_local_index_,
-                               NULL,
-                               &found_captured_variables);
+  int next_free_frame_index = scope->AllocateVariables(
+      first_parameter_index_, num_params, first_stack_local_index_, NULL,
+      &found_captured_variables);
 
   // Frame indices are relative to the frame pointer and are decreasing.
   ASSERT(next_free_frame_index <= first_stack_local_index_);
@@ -346,7 +341,7 @@
       : token_pos(TokenPosition::kNoSource),
         type(NULL),
         name(NULL),
-        var(NULL) { }
+        var(NULL) {}
   TokenPosition token_pos;
   const AbstractType* type;
   const String* name;
@@ -374,7 +369,7 @@
 
 struct Parser::Block : public ZoneAllocated {
   Block(Block* outer_block, LocalScope* local_scope, SequenceNode* seq)
-    : parent(outer_block), scope(local_scope), statements(seq) {
+      : parent(outer_block), scope(local_scope), statements(seq) {
     ASSERT(scope != NULL);
     ASSERT(statements != NULL);
   }
@@ -395,7 +390,7 @@
         outer_try_(outer_try),
         try_index_(try_index),
         inside_catch_(false),
-        inside_finally_(false) { }
+        inside_finally_(false) {}
 
   TryStack* outer_try() const { return outer_try_; }
   Block* try_block() const { return try_block_; }
@@ -407,7 +402,7 @@
   void exit_finally() { inside_finally_ = false; }
 
   void AddNodeForFinallyInlining(AstNode* node);
-  void RemoveJumpToLabel(SourceLabel *label);
+  void RemoveJumpToLabel(SourceLabel* label);
   AstNode* GetNodeToInlineFinally(int index) {
     if (0 <= index && index < inlined_finally_nodes_.length()) {
       return inlined_finally_nodes_[index];
@@ -420,7 +415,7 @@
   GrowableArray<AstNode*> inlined_finally_nodes_;
   TryStack* outer_try_;
   const intptr_t try_index_;
-  bool inside_catch_;  // True when parsing a catch clause of this try.
+  bool inside_catch_;    // True when parsing a catch clause of this try.
   bool inside_finally_;  // True when parsing a finally clause of an inner try
                          // of this try.
 
@@ -433,7 +428,7 @@
 }
 
 
-void Parser::TryStack::RemoveJumpToLabel(SourceLabel *label) {
+void Parser::TryStack::RemoveJumpToLabel(SourceLabel* label) {
   int i = 0;
   while (i < inlined_finally_nodes_.length()) {
     if (inlined_finally_nodes_[i]->IsJumpNode()) {
@@ -501,14 +496,15 @@
       current_member_(NULL),
       allow_function_literals_(true),
       parsed_function_(parsed_function),
-      innermost_function_(Function::Handle(zone(),
-                                           parsed_function->function().raw())),
+      innermost_function_(
+          Function::Handle(zone(), parsed_function->function().raw())),
       literal_token_(LiteralToken::Handle(zone())),
-      current_class_(Class::Handle(zone(),
-                                   parsed_function->function().Owner())),
-      library_(Library::Handle(zone(), Class::Handle(
+      current_class_(
+          Class::Handle(zone(), parsed_function->function().Owner())),
+      library_(Library::Handle(
           zone(),
-          parsed_function->function().origin()).library())),
+          Class::Handle(zone(), parsed_function->function().origin())
+              .library())),
       try_stack_(NULL),
       last_used_try_index_(0),
       unregister_pending_function_(false),
@@ -528,7 +524,7 @@
     ASSERT(!pending_functions.IsNull());
     ASSERT(pending_functions.Length() > 0);
     ASSERT(pending_functions.At(pending_functions.Length() - 1) ==
-        current_function().raw());
+           current_function().raw());
     pending_functions.RemoveLast();
   }
 }
@@ -546,8 +542,8 @@
 
 void Parser::SetScript(const Script& script, TokenPosition token_pos) {
   script_ = script.raw();
-  tokens_iterator_.SetStream(
-      TokenStream::Handle(Z, script.tokens()), token_pos);
+  tokens_iterator_.SetStream(TokenStream::Handle(Z, script.tokens()),
+                             token_pos);
   token_kind_ = Token::kILLEGAL;
 }
 
@@ -616,8 +612,7 @@
   CSTAT_TIMER_SCOPE(thread, parser_timer);
 #ifndef PRODUCT
   VMTagScope tagScope(thread, VMTag::kCompileTopLevelTagId);
-  TimelineDurationScope tds(thread,
-                            Timeline::GetCompilerStream(),
+  TimelineDurationScope tds(thread, Timeline::GetCompilerStream(),
                             "CompileTopLevel");
   if (tds.enabled()) {
     tds.SetNumArguments(1);
@@ -646,8 +641,7 @@
 
 
 String* Parser::CurrentLiteral() const {
-  String& result =
-      String::ZoneHandle(Z, tokens_iterator_.CurrentLiteral());
+  String& result = String::ZoneHandle(Z, tokens_iterator_.CurrentLiteral());
   return &result;
 }
 
@@ -677,13 +671,13 @@
         var(NULL),
         is_final(false),
         is_field_initializer(false),
-        has_explicit_type(false) { }
+        has_explicit_type(false) {}
   const AbstractType* type;
   TokenPosition name_pos;
   const String* name;
   const Instance* default_value;  // NULL if not an optional parameter.
   const Object* metadata;  // NULL if no metadata or metadata not evaluated.
-  LocalVariable* var;  // Scope variable allocated for this parameter.
+  LocalVariable* var;      // Scope variable allocated for this parameter.
   bool is_final;
   bool is_field_initializer;
   bool has_explicit_type;
@@ -691,9 +685,7 @@
 
 
 struct ParamList {
-  ParamList() {
-    Clear();
-  }
+  ParamList() { Clear(); }
 
   void Clear() {
     num_fixed_parameters = 0;
@@ -719,8 +711,7 @@
     this->parameters->Add(param);
   }
 
-  void AddReceiver(const AbstractType* receiver_type,
-                   TokenPosition token_pos) {
+  void AddReceiver(const AbstractType* receiver_type, TokenPosition token_pos) {
     ASSERT(this->parameters->is_empty());
     AddFinalParameter(token_pos, &Symbols::This(), receiver_type);
   }
@@ -756,9 +747,7 @@
     }
   }
 
-  void SetImplicitlyFinal() {
-    implicitly_final = true;
-  }
+  void SetImplicitlyFinal() { implicitly_final = true; }
 
   int num_fixed_parameters;
   int num_optional_parameters;
@@ -773,9 +762,7 @@
 
 
 struct MemberDesc {
-  MemberDesc() {
-    Clear();
-  }
+  MemberDesc() { Clear(); }
 
   void Clear() {
     has_abstract = false;
@@ -808,12 +795,8 @@
   bool IsFactoryOrConstructor() const {
     return (kind == RawFunction::kConstructor);
   }
-  bool IsGetter() const {
-    return kind == RawFunction::kGetterFunction;
-  }
-  bool IsSetter() const {
-    return kind == RawFunction::kSetterFunction;
-  }
+  bool IsGetter() const { return kind == RawFunction::kGetterFunction; }
+  bool IsSetter() const { return kind == RawFunction::kSetterFunction; }
   const char* ToCString() const {
     if (field_ != NULL) {
       return "field";
@@ -828,9 +811,7 @@
     }
     return "method";
   }
-  String* DictName() const {
-    return (dict_name  != NULL) ? dict_name : name;
-  }
+  String* DictName() const { return (dict_name != NULL) ? dict_name : name; }
   bool has_abstract;
   bool has_external;
   bool has_final;
@@ -873,32 +854,23 @@
         class_name_(cls_name),
         token_pos_(token_pos),
         functions_(zone, 4),
-        fields_(zone, 4) {
-  }
+        fields_(zone, 4) {}
 
   void AddFunction(const Function& function) {
     functions_.Add(&Function::ZoneHandle(zone_, function.raw()));
   }
 
-  const GrowableArray<const Function*>& functions() const {
-    return functions_;
-  }
+  const GrowableArray<const Function*>& functions() const { return functions_; }
 
   void AddField(const Field& field) {
     fields_.Add(&Field::ZoneHandle(zone_, field.raw()));
   }
 
-  const GrowableArray<const Field*>& fields() const {
-    return fields_;
-  }
+  const GrowableArray<const Field*>& fields() const { return fields_; }
 
-  const Class& clazz() const {
-    return clazz_;
-  }
+  const Class& clazz() const { return clazz_; }
 
-  const String& class_name() const {
-    return class_name_;
-  }
+  const String& class_name() const { return class_name_; }
 
   bool has_constructor() const {
     for (int i = 0; i < functions_.length(); i++) {
@@ -910,17 +882,11 @@
     return false;
   }
 
-  TokenPosition token_pos() const {
-    return token_pos_;
-  }
+  TokenPosition token_pos() const { return token_pos_; }
 
-  void AddMember(const MemberDesc& member) {
-    members_.Add(member);
-  }
+  void AddMember(const MemberDesc& member) { members_.Add(member); }
 
-  const GrowableArray<MemberDesc>& members() const {
-    return members_;
-  }
+  const GrowableArray<MemberDesc>& members() const { return members_; }
 
   MemberDesc* LookupMember(const String& name) const {
     for (int i = 0; i < members_.length(); i++) {
@@ -944,7 +910,7 @@
   Zone* zone_;
   const Class& clazz_;
   const String& class_name_;
-  TokenPosition token_pos_;   // Token index of "class" keyword.
+  TokenPosition token_pos_;  // Token index of "class" keyword.
   GrowableArray<const Function*> functions_;
   GrowableArray<const Field*> fields_;
   GrowableArray<MemberDesc> members_;
@@ -953,10 +919,8 @@
 
 class TopLevel : public ValueObject {
  public:
-  explicit TopLevel(Zone* zone) :
-      zone_(zone),
-      fields_(zone, 4),
-      functions_(zone, 4) { }
+  explicit TopLevel(Zone* zone)
+      : zone_(zone), fields_(zone, 4), functions_(zone, 4) {}
 
   void AddField(const Field& field) {
     fields_.Add(&Field::ZoneHandle(zone_, field.raw()));
@@ -966,13 +930,9 @@
     functions_.Add(&Function::ZoneHandle(zone_, function.raw()));
   }
 
-  const GrowableArray<const Field*>& fields() const {
-    return fields_;
-  }
+  const GrowableArray<const Field*>& fields() const { return fields_; }
 
-  const GrowableArray<const Function*>& functions() const {
-    return functions_;
-  }
+  const GrowableArray<const Function*>& functions() const { return functions_; }
 
  private:
   Zone* zone_;
@@ -986,8 +946,7 @@
   Zone* zone = thread->zone();
   const int64_t num_tokes_before = STAT_VALUE(thread, num_tokens_consumed);
 #ifndef PRODUCT
-  TimelineDurationScope tds(thread,
-                            Timeline::GetCompilerStream(),
+  TimelineDurationScope tds(thread, Timeline::GetCompilerStream(),
                             "ParseClass");
   if (tds.enabled()) {
     tds.SetNumArguments(1);
@@ -1024,30 +983,32 @@
     const Script& script = Script::Handle(zone, func.script());
     const Class& owner = Class::Handle(zone, func.Owner());
     ASSERT(!owner.IsNull());
-    ParsedFunction* parsed_function = new ParsedFunction(
-        thread, Function::ZoneHandle(zone, func.raw()));
+    ParsedFunction* parsed_function =
+        new ParsedFunction(thread, Function::ZoneHandle(zone, func.raw()));
     Parser parser(script, parsed_function, func.token_pos());
     parser.SkipFunctionPreamble();
     ParamList params;
     parser.ParseFormalParameterList(true, true, &params);
     ParamDesc* param = params.parameters->data();
-    const int param_cnt = params.num_fixed_parameters +
-                          params.num_optional_parameters;
+    const int param_cnt =
+        params.num_fixed_parameters + params.num_optional_parameters;
     const Array& param_descriptor =
         Array::Handle(Array::New(param_cnt * kParameterEntrySize, Heap::kOld));
     for (int i = 0, j = 0; i < param_cnt; i++, j += kParameterEntrySize) {
       param_descriptor.SetAt(j + kParameterIsFinalOffset,
                              param[i].is_final ? Bool::True() : Bool::False());
       param_descriptor.SetAt(j + kParameterDefaultValueOffset,
-          (param[i].default_value == NULL) ? Object::null_instance() :
-                                             *(param[i].default_value));
+                             (param[i].default_value == NULL)
+                                 ? Object::null_instance()
+                                 : *(param[i].default_value));
       const Object* metadata = param[i].metadata;
       if ((metadata != NULL) && (*metadata).IsError()) {
         return metadata->raw();  // Error evaluating the metadata.
       }
       param_descriptor.SetAt(j + kParameterMetadataOffset,
-          (param[i].metadata == NULL) ? Object::null_instance() :
-                                        *(param[i].metadata));
+                             (param[i].metadata == NULL)
+                                 ? Object::null_instance()
+                                 : *(param[i].metadata));
     }
     return param_descriptor.raw();
   } else {
@@ -1103,8 +1064,7 @@
 #ifndef PRODUCT
   VMTagScope tagScope(thread, VMTag::kCompileParseFunctionTagId,
                       FLAG_profile_vm);
-  TimelineDurationScope tds(thread,
-                            Timeline::GetCompilerStream(),
+  TimelineDurationScope tds(thread, Timeline::GetCompilerStream(),
                             "ParseFunction");
 #endif  // !PRODUCT
   ASSERT(thread->long_jump_base()->IsSafeToJump());
@@ -1129,7 +1089,7 @@
         node_sequence = parser.ParseConstructorClosure(func);
         break;
       }
-      // Fall-through: Handle non-implicit closures.
+    // Fall-through: Handle non-implicit closures.
     case RawFunction::kRegularFunction:
     case RawFunction::kGetterFunction:
     case RawFunction::kSetterFunction:
@@ -1158,12 +1118,10 @@
       INC_STAT(thread, num_method_extractors, 1);
       break;
     case RawFunction::kNoSuchMethodDispatcher:
-      node_sequence =
-          parser.ParseNoSuchMethodDispatcher(func);
+      node_sequence = parser.ParseNoSuchMethodDispatcher(func);
       break;
     case RawFunction::kInvokeFieldDispatcher:
-      node_sequence =
-          parser.ParseInvokeFieldDispatcher(func);
+      node_sequence = parser.ParseInvokeFieldDispatcher(func);
       break;
     case RawFunction::kIrregexpFunction:
       UNREACHABLE();  // Irregexp functions have their own parser.
@@ -1174,8 +1132,7 @@
   if (parsed_function->has_expression_temp_var()) {
     node_sequence->scope()->AddVariable(parsed_function->expression_temp_var());
   }
-  node_sequence->scope()->AddVariable(
-      parsed_function->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());
@@ -1216,19 +1173,17 @@
     // normally used for expressions and assume current_function is non-null,
     // so we create a fake function to use as the current_function rather than
     // scattering special cases throughout the parser.
-    const Function& fake_function = Function::ZoneHandle(zone, Function::New(
-        Symbols::At(),
-        RawFunction::kRegularFunction,
-        true,  // is_static
-        false,  // is_const
-        false,  // is_abstract
-        false,  // is_external
-        false,  // is_native
-        Object::Handle(zone, meta_data.RawOwner()),
-        token_pos));
+    const Function& fake_function = Function::ZoneHandle(
+        zone,
+        Function::New(Symbols::At(), RawFunction::kRegularFunction,
+                      true,   // is_static
+                      false,  // is_const
+                      false,  // is_abstract
+                      false,  // is_external
+                      false,  // is_native
+                      Object::Handle(zone, meta_data.RawOwner()), token_pos));
     fake_function.set_is_debuggable(false);
-    ParsedFunction* parsed_function =
-        new ParsedFunction(thread, fake_function);
+    ParsedFunction* parsed_function = new ParsedFunction(thread, fake_function);
     Parser parser(script, parsed_function, token_pos);
     parser.set_current_class(owner_class);
     parser.OpenFunctionBlock(fake_function);
@@ -1270,10 +1225,10 @@
     AstNode* expr = NULL;
     if ((LookaheadToken(1) == Token::kLPAREN) ||
         ((LookaheadToken(1) == Token::kPERIOD) &&
-            (LookaheadToken(3) == Token::kLPAREN)) ||
+         (LookaheadToken(3) == Token::kLPAREN)) ||
         ((LookaheadToken(1) == Token::kPERIOD) &&
-            (LookaheadToken(3) == Token::kPERIOD) &&
-            (LookaheadToken(5) == Token::kLPAREN))) {
+         (LookaheadToken(3) == Token::kPERIOD) &&
+         (LookaheadToken(5) == Token::kLPAREN))) {
       expr = ParseNewOperator(Token::kCONST);
     } else {
       // Can be x, C.x, or L.C.x.
@@ -1303,16 +1258,12 @@
         String* ident = ExpectIdentifier("identifier expected");
         const Field& field = Field::Handle(Z, cls.LookupStaticField(*ident));
         if (field.IsNull()) {
-          ReportError(ident_pos,
-                      "Class '%s' has no field '%s'",
-                      cls.ToCString(),
-                      ident->ToCString());
+          ReportError(ident_pos, "Class '%s' has no field '%s'",
+                      cls.ToCString(), ident->ToCString());
         }
         if (!field.is_const()) {
-          ReportError(ident_pos,
-                      "Field '%s' of class '%s' is not const",
-                      ident->ToCString(),
-                      cls.ToCString());
+          ReportError(ident_pos, "Field '%s' of class '%s' is not const",
+                      ident->ToCString(), cls.ToCString());
         }
         expr = GenerateStaticFieldLookup(field, ident_pos);
       }
@@ -1334,7 +1285,7 @@
   OpenFunctionBlock(parsed_function()->function());
   TokenPosition expr_pos = TokenPos();
   AstNode* expr = ParseExpr(kAllowConst, kConsumeCascades);
-  ReturnNode* ret = new(Z) ReturnNode(expr_pos, expr);
+  ReturnNode* ret = new (Z) ReturnNode(expr_pos, expr);
   current_block_->statements->Add(ret);
   return CloseBlock();
 }
@@ -1353,24 +1304,21 @@
 #endif  // !PRODUCT
 
   const String& field_name = String::Handle(zone, field.name());
-  String& init_name = String::Handle(zone,
-      Symbols::FromConcat(thread, Symbols::InitPrefix(), field_name));
+  String& init_name = String::Handle(
+      zone, Symbols::FromConcat(thread, Symbols::InitPrefix(), field_name));
 
   const Script& script = Script::Handle(zone, field.Script());
   Object& initializer_owner = Object::Handle(field.Owner());
-  initializer_owner =
-      PatchClass::New(Class::Handle(field.Owner()), script);
+  initializer_owner = PatchClass::New(Class::Handle(field.Owner()), script);
 
-  const Function& initializer = Function::ZoneHandle(zone,
-      Function::New(init_name,
-                    RawFunction::kImplicitStaticFinalGetter,
-                    true,   // static
-                    false,  // !const
-                    false,  // !abstract
-                    false,  // !external
-                    false,  // !native
-                    initializer_owner,
-                    field.token_pos()));
+  const Function& initializer = Function::ZoneHandle(
+      zone, Function::New(init_name, RawFunction::kImplicitStaticFinalGetter,
+                          true,   // static
+                          false,  // !const
+                          false,  // !abstract
+                          false,  // !external
+                          false,  // !native
+                          initializer_owner, field.token_pos()));
   initializer.set_result_type(AbstractType::Handle(zone, field.type()));
   // Static initializer functions are hidden from the user.
   // Since they are only executed once, we avoid inlining them.
@@ -1440,11 +1388,10 @@
     // Call runtime support to parse and evaluate the initializer expression.
     // The runtime function will detect circular dependencies in expressions
     // and handle errors while evaluating the expression.
-    current_block_->statements->Add(
-        new (Z) InitStaticFieldNode(ident_pos, field));
+    current_block_->statements->Add(new (Z)
+                                        InitStaticFieldNode(ident_pos, field));
     ReturnNode* return_node =
-        new ReturnNode(ident_pos,
-                       new LoadStaticFieldNode(ident_pos, field));
+        new ReturnNode(ident_pos, new LoadStaticFieldNode(ident_pos, field));
     current_block_->statements->Add(return_node);
   }
   return CloseBlock();
@@ -1508,9 +1455,7 @@
   ParamList params;
   ASSERT(current_class().raw() == func.Owner());
   params.AddReceiver(ReceiverType(current_class()), ident_pos);
-  params.AddFinalParameter(ident_pos,
-                           &Symbols::Value(),
-                           &field_type);
+  params.AddFinalParameter(ident_pos, &Symbols::Value(), &field_type);
   ASSERT(func.num_fixed_parameters() == 2);  // receiver, value.
   ASSERT(!func.HasOptionalParameters());
   ASSERT(AbstractType::Handle(Z, func.result_type()).IsVoidType());
@@ -1546,8 +1491,7 @@
   ParamList params;
   // The first parameter of the closure function is the
   // implicit closure argument.
-  params.AddFinalParameter(token_pos,
-                           &Symbols::ClosureParameter(),
+  params.AddFinalParameter(token_pos, &Symbols::ClosureParameter(),
                            &Object::dynamic_type());
   bool params_ok = ParseFormalParameters(constructor, &params);
   USE(params_ok);
@@ -1595,17 +1539,14 @@
   OpenFunctionBlock(func);
 
   ParamList params;
-  params.AddFinalParameter(
-      token_pos,
-      &Symbols::ClosureParameter(),
-      &Object::dynamic_type());
+  params.AddFinalParameter(token_pos, &Symbols::ClosureParameter(),
+                           &Object::dynamic_type());
 
   const Function& parent = Function::Handle(func.parent_function());
   if (parent.IsImplicitSetterFunction()) {
     const TokenPosition ident_pos = func.token_pos();
     ASSERT(IsIdentifier());
-    params.AddFinalParameter(ident_pos,
-                             &Symbols::Value(),
+    params.AddFinalParameter(ident_pos, &Symbols::Value(),
                              &Object::dynamic_type());
     ASSERT(func.num_fixed_parameters() == 2);  // closure, value.
   } else if (!parent.IsGetterFunction() && !parent.IsImplicitGetterFunction()) {
@@ -1648,8 +1589,7 @@
   Function& target = Function::ZoneHandle(owner.LookupFunction(func_name));
   if (target.raw() != parent.raw()) {
     ASSERT(Isolate::Current()->HasAttemptedReload());
-    if (target.IsNull() ||
-        (target.is_static() != parent.is_static()) ||
+    if (target.IsNull() || (target.is_static() != parent.is_static()) ||
         (target.kind() != parent.kind())) {
       target = Function::null();
     }
@@ -1675,16 +1615,14 @@
     const intptr_t kNumArguments = 2;  // Receiver, InvocationMirror.
     ArgumentsDescriptor args_desc(
         Array::Handle(Z, ArgumentsDescriptor::New(kNumArguments)));
-    Function& no_such_method = Function::ZoneHandle(Z,
-    Resolver::ResolveDynamicForReceiverClass(owner,
-                                             Symbols::NoSuchMethod(),
-                                             args_desc));
+    Function& no_such_method =
+        Function::ZoneHandle(Z, Resolver::ResolveDynamicForReceiverClass(
+                                    owner, Symbols::NoSuchMethod(), args_desc));
     if (no_such_method.IsNull()) {
       // If noSuchMethod(i) is not found, call Object:noSuchMethod.
       no_such_method ^= Resolver::ResolveDynamicForReceiverClass(
           Class::Handle(Z, I->object_store()->object_class()),
-          Symbols::NoSuchMethod(),
-          args_desc);
+          Symbols::NoSuchMethod(), args_desc);
     }
     call = new StaticCallNode(token_pos, no_such_method, arguments);
   } else {
@@ -1702,12 +1640,8 @@
     } else {
       im_type = InvocationMirror::kMethod;
     }
-    call = ThrowNoSuchMethodError(TokenPos(),
-                                  owner,
-                                  func_name,
-                                  func_args,
-                                  InvocationMirror::kStatic,
-                                  im_type,
+    call = ThrowNoSuchMethodError(TokenPos(), owner, func_name, func_args,
+                                  InvocationMirror::kStatic, im_type,
                                   NULL);  // No existing function.
   }
 
@@ -1739,10 +1673,8 @@
   LoadLocalNode* load_receiver = new LoadLocalNode(ident_pos, receiver);
 
   ClosureNode* closure = new ClosureNode(
-      ident_pos,
-      Function::ZoneHandle(Z, func.extracted_method_closure()),
-      load_receiver,
-      NULL);
+      ident_pos, Function::ZoneHandle(Z, func.extracted_method_closure()),
+      load_receiver, NULL);
 
   ReturnNode* return_node = new ReturnNode(ident_pos, closure);
   current_block_->statements->Add(return_node);
@@ -1821,21 +1753,20 @@
   }
 
   const String& func_name = String::ZoneHandle(Z, func.name());
-  ArgumentListNode* arguments = BuildNoSuchMethodArguments(
-      token_pos, func_name, *func_args, NULL, false);
+  ArgumentListNode* arguments =
+      BuildNoSuchMethodArguments(token_pos, func_name, *func_args, NULL, false);
   const intptr_t kNumArguments = 2;  // Receiver, InvocationMirror.
   ArgumentsDescriptor args_desc(
       Array::Handle(Z, ArgumentsDescriptor::New(kNumArguments)));
-  Function& no_such_method = Function::ZoneHandle(Z,
-      Resolver::ResolveDynamicForReceiverClass(Class::Handle(Z, func.Owner()),
-                                               Symbols::NoSuchMethod(),
-                                               args_desc));
+  Function& no_such_method = Function::ZoneHandle(
+      Z,
+      Resolver::ResolveDynamicForReceiverClass(
+          Class::Handle(Z, func.Owner()), Symbols::NoSuchMethod(), args_desc));
   if (no_such_method.IsNull()) {
     // If noSuchMethod(i) is not found, call Object:noSuchMethod.
     no_such_method ^= Resolver::ResolveDynamicForReceiverClass(
         Class::Handle(Z, I->object_store()->object_class()),
-        Symbols::NoSuchMethod(),
-        args_desc);
+        Symbols::NoSuchMethod(), args_desc);
   }
   StaticCallNode* call =
       new StaticCallNode(token_pos, no_such_method, arguments);
@@ -1865,8 +1796,8 @@
   ArgumentListNode* no_args = new ArgumentListNode(token_pos);
   LoadLocalNode* receiver = new LoadLocalNode(token_pos, scope->VariableAt(0));
 
-  const Class& closure_cls = Class::Handle(
-      Isolate::Current()->object_store()->closure_class());
+  const Class& closure_cls =
+      Class::Handle(Isolate::Current()->object_store()->closure_class());
 
   const Class& owner = Class::Handle(Z, func.Owner());
   ASSERT(!owner.IsNull());
@@ -1875,16 +1806,16 @@
   if (owner.raw() == closure_cls.raw() && name.Equals(Symbols::Call())) {
     function_object = receiver;
   } else {
-    const String& getter_name = String::ZoneHandle(Z,
-        Field::GetterSymbol(name));
-    function_object = new(Z) InstanceCallNode(
-        token_pos, receiver, getter_name, no_args);
+    const String& getter_name =
+        String::ZoneHandle(Z, Field::GetterSymbol(name));
+    function_object =
+        new (Z) InstanceCallNode(token_pos, receiver, getter_name, no_args);
   }
 
   // Pass arguments 1..n to the closure call.
-  ArgumentListNode* args = new(Z) ArgumentListNode(token_pos);
-  const Array& names = Array::Handle(
-      Z, Array::New(desc.NamedCount(), Heap::kOld));
+  ArgumentListNode* args = new (Z) ArgumentListNode(token_pos);
+  const Array& names =
+      Array::Handle(Z, Array::New(desc.NamedCount(), Heap::kOld));
   // Positional parameters.
   intptr_t i = 1;
   for (; i < desc.PositionalCount(); ++i) {
@@ -1892,7 +1823,7 @@
   }
   // Named parameters.
   for (; i < desc.Count(); i++) {
-    args->Add(new(Z) LoadLocalNode(token_pos, scope->VariableAt(i)));
+    args->Add(new (Z) LoadLocalNode(token_pos, scope->VariableAt(i)));
     intptr_t index = i - desc.PositionalCount();
     names.SetAt(index, String::Handle(Z, desc.NameAt(index)));
   }
@@ -1914,10 +1845,7 @@
 AstNode* Parser::BuildClosureCall(TokenPosition token_pos,
                                   AstNode* closure,
                                   ArgumentListNode* arguments) {
-  return new InstanceCallNode(token_pos,
-                              closure,
-                              Symbols::Call(),
-                              arguments);
+  return new InstanceCallNode(token_pos, closure, Symbols::Call(), arguments);
 }
 
 
@@ -1930,7 +1858,7 @@
   // Adding the first opening brace here, because it will be consumed
   // in the loop right away.
   token_stack.Add(opening_token);
-  const TokenPosition start_pos =  TokenPos();
+  const TokenPosition start_pos = TokenPos();
   TokenPosition opening_pos = start_pos;
   token_pos_stack.Add(start_pos);
   bool is_match = true;
@@ -1974,20 +1902,18 @@
     }
   } while (!token_stack.is_empty() && is_match && !unexpected_token_found);
   if (!is_match) {
-    const Error& error = Error::Handle(
-        LanguageError::NewFormatted(Error::Handle(),
-            script_, opening_pos, Report::AtLocation,
-            Report::kWarning, Heap::kNew,
-            "unbalanced '%s' opens here", Token::Str(opening_token)));
-    ReportErrors(error, script_, token_pos,
-                 "unbalanced '%s'", Token::Str(token));
+    const Error& error = Error::Handle(LanguageError::NewFormatted(
+        Error::Handle(), script_, opening_pos, Report::AtLocation,
+        Report::kWarning, Heap::kNew, "unbalanced '%s' opens here",
+        Token::Str(opening_token)));
+    ReportErrors(error, script_, token_pos, "unbalanced '%s'",
+                 Token::Str(token));
   } else if (unexpected_token_found) {
     ReportError(start_pos, "unterminated '%s'", Token::Str(opening_token));
   }
 }
 
 
-
 void Parser::SkipBlock() {
   ASSERT(CurrentToken() == Token::kLBRACE);
   SkipToMatching();
@@ -2071,8 +1997,8 @@
       parameter.has_explicit_type = true;
       // It is too early to resolve the type here, since it can be a result type
       // referring to a not yet declared function type parameter.
-      parameter.type = &AbstractType::ZoneHandle(Z,
-          ParseType(ClassFinalizer::kDoNotResolve));
+      parameter.type = &AbstractType::ZoneHandle(
+          Z, ParseType(ClassFinalizer::kDoNotResolve));
     } else {
       // If this is an initializing formal, its type will be set to the type of
       // the respective field when the constructor is fully parsed.
@@ -2130,9 +2056,9 @@
       // signature functions (except typedef signature functions), therefore
       // we do not need to keep the correct script via a patch class. Use the
       // actual current class as owner of the signature function.
-      const Function& signature_function = Function::Handle(Z,
-          Function::NewSignatureFunction(current_class(),
-                                         TokenPosition::kNoSource));
+      const Function& signature_function =
+          Function::Handle(Z, Function::NewSignatureFunction(
+                                  current_class(), TokenPosition::kNoSource));
       signature_function.set_parent_function(innermost_function());
       innermost_function_ = signature_function.raw();
 
@@ -2151,10 +2077,8 @@
       ParamList func_params;
 
       // Add implicit closure object parameter.
-      func_params.AddFinalParameter(
-          TokenPos(),
-          &Symbols::ClosureParameter(),
-          &Object::dynamic_type());
+      func_params.AddFinalParameter(TokenPos(), &Symbols::ClosureParameter(),
+                                    &Object::dynamic_type());
 
       const bool no_explicit_default_values = false;
       ParseFormalParameterList(no_explicit_default_values, false, &func_params);
@@ -2187,8 +2111,7 @@
       ResolveType(ClassFinalizer::kResolveTypeParameters, &type);
       if (!is_top_level_) {
         type = ClassFinalizer::FinalizeType(
-            Class::Handle(Z, innermost_function().origin()),
-            type,
+            Class::Handle(Z, innermost_function().origin()), type,
             ClassFinalizer::kCanonicalize);
       }
       parameter.type = &type;
@@ -2261,16 +2184,16 @@
       params->has_optional_named_parameters = true;
       return;
     }
-    Token::Kind terminator =
-       params->has_optional_positional_parameters ? Token::kRBRACK :
-       params->has_optional_named_parameters ? Token::kRBRACE :
-       Token :: kRPAREN;
+    Token::Kind terminator = params->has_optional_positional_parameters
+                                 ? Token::kRBRACK
+                                 : params->has_optional_named_parameters
+                                       ? Token::kRBRACE
+                                       : Token::kRPAREN;
     if (has_seen_parameter && CurrentToken() == terminator) {
       // Allow a trailing comma.
       break;
     }
-    ParseFormalParameter(allow_explicit_default_values,
-                         evaluate_metadata,
+    ParseFormalParameter(allow_explicit_default_values, evaluate_metadata,
                          params);
     has_seen_parameter = true;
   } while (CurrentToken() == Token::kCOMMA);
@@ -2285,14 +2208,12 @@
 
   if (LookaheadToken(1) != Token::kRPAREN) {
     // Parse fixed parameters.
-    ParseFormalParameters(allow_explicit_default_values,
-                          evaluate_metadata,
+    ParseFormalParameters(allow_explicit_default_values, evaluate_metadata,
                           params);
     if (params->has_optional_positional_parameters ||
         params->has_optional_named_parameters) {
       // Parse optional parameters.
-      ParseFormalParameters(allow_explicit_default_values,
-                            evaluate_metadata,
+      ParseFormalParameters(allow_explicit_default_values, evaluate_metadata,
                             params);
       if (params->has_optional_positional_parameters) {
         CheckToken(Token::kRBRACK, "',' or ']' expected");
@@ -2338,11 +2259,10 @@
     ReportError(token_pos, "class '%s' does not have a superclass",
                 String::Handle(Z, current_class().Name()).ToCString());
   }
-  Function& super_func = Function::Handle(Z,
-      Resolver::ResolveDynamicAnyArgs(Z, super_class, name));
+  Function& super_func = Function::Handle(
+      Z, Resolver::ResolveDynamicAnyArgs(Z, super_class, name));
   if (!super_func.IsNull() &&
-      !super_func.AreValidArguments(arguments->length(),
-                                    arguments->names(),
+      !super_func.AreValidArguments(arguments->length(), arguments->names(),
                                     NULL)) {
     super_func = Function::null();
   } else if (super_func.IsNull() && resolve_getter) {
@@ -2352,8 +2272,8 @@
            (super_func.kind() != RawFunction::kImplicitStaticFinalGetter));
   }
   if (super_func.IsNull()) {
-    super_func = Resolver::ResolveDynamicAnyArgs(Z,
-        super_class, Symbols::NoSuchMethod());
+    super_func = Resolver::ResolveDynamicAnyArgs(Z, super_class,
+                                                 Symbols::NoSuchMethod());
     ASSERT(!super_func.IsNull());
     *is_no_such_method = true;
   } else {
@@ -2376,9 +2296,8 @@
   // The first argument is the original function name.
   arguments->Add(new LiteralNode(args_pos, function_name));
   // The second argument is the arguments descriptor of the original function.
-  const Array& args_descriptor =
-      Array::ZoneHandle(ArgumentsDescriptor::New(function_args.length(),
-                                                 function_args.names()));
+  const Array& args_descriptor = Array::ZoneHandle(
+      ArgumentsDescriptor::New(function_args.length(), function_args.names()));
   arguments->Add(new LiteralNode(args_pos, args_descriptor));
   // The third argument is an array containing the original function arguments,
   // including the receiver.
@@ -2388,11 +2307,10 @@
     AstNode* arg = function_args.NodeAt(i);
     if ((temp_for_last_arg != NULL) && (i == function_args.length() - 1)) {
       LetNode* store_arg = new LetNode(arg->token_pos());
-      store_arg->AddNode(new StoreLocalNode(arg->token_pos(),
-                                           temp_for_last_arg,
-                                           arg));
-      store_arg->AddNode(new LoadLocalNode(arg->token_pos(),
-                                           temp_for_last_arg));
+      store_arg->AddNode(
+          new StoreLocalNode(arg->token_pos(), temp_for_last_arg, arg));
+      store_arg->AddNode(
+          new LoadLocalNode(arg->token_pos(), temp_for_last_arg));
       args_array->AddElement(store_arg);
     } else {
       args_array->AddElement(arg);
@@ -2404,8 +2322,8 @@
   const Class& mirror_class =
       Class::Handle(Library::LookupCoreClass(Symbols::InvocationMirror()));
   ASSERT(!mirror_class.IsNull());
-  const Function& allocation_function = Function::ZoneHandle(
-      mirror_class.LookupStaticFunction(
+  const Function& allocation_function =
+      Function::ZoneHandle(mirror_class.LookupStaticFunction(
           Library::PrivateCoreLibName(Symbols::AllocateInvocationMirror())));
   ASSERT(!allocation_function.IsNull());
   return new StaticCallNode(call_pos, allocation_function, arguments);
@@ -2423,11 +2341,9 @@
   ArgumentListNode* arguments = new ArgumentListNode(args_pos);
   arguments->Add(function_args.NodeAt(0));
   // The second argument is the invocation mirror.
-  arguments->Add(BuildInvocationMirrorAllocation(call_pos,
-                                                 function_name,
-                                                 function_args,
-                                                 temp_for_last_arg,
-                                                 is_super_invocation));
+  arguments->Add(
+      BuildInvocationMirrorAllocation(call_pos, function_name, function_args,
+                                      temp_for_last_arg, is_super_invocation));
   return arguments;
 }
 
@@ -2445,20 +2361,15 @@
 
   const bool kResolveGetter = true;
   bool is_no_such_method = false;
-  const Function& super_function = Function::ZoneHandle(Z,
-      GetSuperFunction(supercall_pos,
-                       function_name,
-                       arguments,
-                       kResolveGetter,
-                       &is_no_such_method));
+  const Function& super_function = Function::ZoneHandle(
+      Z, GetSuperFunction(supercall_pos, function_name, arguments,
+                          kResolveGetter, &is_no_such_method));
   if (super_function.IsGetterFunction() ||
       super_function.IsImplicitGetterFunction()) {
     const Class& super_class =
         Class::ZoneHandle(Z, current_class().SuperClass());
-    AstNode* closure = new StaticGetterNode(supercall_pos,
-                                            LoadReceiver(supercall_pos),
-                                            super_class,
-                                            function_name);
+    AstNode* closure = new StaticGetterNode(
+        supercall_pos, LoadReceiver(supercall_pos), super_class, function_name);
     // 'this' is not passed as parameter to the closure.
     ArgumentListNode* closure_arguments = new ArgumentListNode(supercall_pos);
     for (int i = 1; i < arguments->length(); i++) {
@@ -2467,8 +2378,8 @@
     return BuildClosureCall(supercall_pos, closure, closure_arguments);
   }
   if (is_no_such_method) {
-    arguments = BuildNoSuchMethodArguments(
-        supercall_pos, function_name, *arguments, NULL, true);
+    arguments = BuildNoSuchMethodArguments(supercall_pos, function_name,
+                                           *arguments, NULL, true);
   }
   return new StaticCallNode(supercall_pos, super_function, arguments);
 }
@@ -2484,8 +2395,7 @@
   ASSERT(super->IsSuper());
   AstNode* super_op = NULL;
   const TokenPosition super_pos = super->token_pos();
-  if ((op == Token::kNEGATE) ||
-      (op == Token::kBIT_NOT)) {
+  if ((op == Token::kNEGATE) || (op == Token::kBIT_NOT)) {
     // Resolve the operator function in the superclass.
     const String& operator_function_name = Symbols::Token(op);
     ArgumentListNode* op_arguments = new ArgumentListNode(super_pos);
@@ -2493,12 +2403,9 @@
     op_arguments->Add(receiver);
     const bool kResolveGetter = false;
     bool is_no_such_method = false;
-    const Function& super_operator = Function::ZoneHandle(Z,
-        GetSuperFunction(super_pos,
-                         operator_function_name,
-                         op_arguments,
-                         kResolveGetter,
-                         &is_no_such_method));
+    const Function& super_operator = Function::ZoneHandle(
+        Z, GetSuperFunction(super_pos, operator_function_name, op_arguments,
+                            kResolveGetter, &is_no_such_method));
     if (is_no_such_method) {
       op_arguments = BuildNoSuchMethodArguments(
           super_pos, operator_function_name, *op_arguments, NULL, true);
@@ -2550,12 +2457,9 @@
     const String& operator_function_name = Symbols::Token(op);
     const bool kResolveGetter = false;
     bool is_no_such_method = false;
-    const Function& super_operator = Function::ZoneHandle(Z,
-        GetSuperFunction(operator_pos,
-                         operator_function_name,
-                         op_arguments,
-                         kResolveGetter,
-                         &is_no_such_method));
+    const Function& super_operator = Function::ZoneHandle(
+        Z, GetSuperFunction(operator_pos, operator_function_name, op_arguments,
+                            kResolveGetter, &is_no_such_method));
     if (is_no_such_method) {
       op_arguments = BuildNoSuchMethodArguments(
           operator_pos, operator_function_name, *op_arguments, NULL, true);
@@ -2599,37 +2503,36 @@
         String::ZoneHandle(Z, Field::LookupSetterSymbol(field_name));
     Function& super_setter = Function::ZoneHandle(Z);
     if (!setter_name.IsNull()) {
-      super_setter = Resolver::ResolveDynamicAnyArgs(Z,
-          super_class, setter_name);
+      super_setter =
+          Resolver::ResolveDynamicAnyArgs(Z, super_class, setter_name);
     }
     if (super_setter.IsNull()) {
       // Check if this is an access to an implicit closure using 'super'.
       // If a function exists of the specified field_name then try
       // accessing it as a getter, at runtime we will handle this by
       // creating an implicit closure of the function and returning it.
-      const Function& super_function = Function::ZoneHandle(Z,
-          Resolver::ResolveDynamicAnyArgs(Z, super_class, field_name));
+      const Function& super_function = Function::ZoneHandle(
+          Z, Resolver::ResolveDynamicAnyArgs(Z, super_class, field_name));
       if (!super_function.IsNull()) {
         // In case CreateAssignmentNode is called later on this
         // CreateImplicitClosureNode, it will be replaced by a StaticSetterNode.
-        return CreateImplicitClosureNode(super_function,
-                                         field_pos,
+        return CreateImplicitClosureNode(super_function, field_pos,
                                          implicit_argument);
       }
       // No function or field exists of the specified field_name.
       // Emit a StaticGetterNode anyway, so that noSuchMethod gets called.
     }
   }
-  return new(Z) StaticGetterNode(
-      field_pos, implicit_argument, super_class, field_name);
+  return new (Z)
+      StaticGetterNode(field_pos, implicit_argument, super_class, field_name);
 }
 
 
 StaticCallNode* Parser::GenerateSuperConstructorCall(
-      const Class& cls,
-      TokenPosition supercall_pos,
-      LocalVariable* receiver,
-      ArgumentListNode* forwarding_args) {
+    const Class& cls,
+    TokenPosition supercall_pos,
+    LocalVariable* receiver,
+    ArgumentListNode* forwarding_args) {
   const Class& super_class = Class::Handle(Z, cls.SuperClass());
   // Omit the implicit super() if there is no super class (i.e.
   // we're not compiling class Object), or if the super class is an
@@ -2659,27 +2562,26 @@
     if (ctor_name.Length() > class_name.Length() + 1) {
       // Generating a forwarding call to a named constructor 'C.n'.
       // Add the constructor name 'n' to the super constructor.
-      const intptr_t kLen =  class_name.Length() + 1;
+      const intptr_t kLen = class_name.Length() + 1;
       ctor_name = Symbols::New(T, ctor_name, kLen, ctor_name.Length() - kLen);
       super_ctor_name = Symbols::FromConcat(T, super_ctor_name, ctor_name);
     }
   }
 
   // Resolve super constructor function and check arguments.
-  const Function& super_ctor = Function::ZoneHandle(Z,
-      super_class.LookupConstructor(super_ctor_name));
+  const Function& super_ctor =
+      Function::ZoneHandle(Z, super_class.LookupConstructor(super_ctor_name));
   if (super_ctor.IsNull()) {
-      ReportError(supercall_pos,
-                  "unresolved implicit call to super constructor '%s()'",
-                  String::Handle(Z, super_class.Name()).ToCString());
+    ReportError(supercall_pos,
+                "unresolved implicit call to super constructor '%s()'",
+                String::Handle(Z, super_class.Name()).ToCString());
   }
   if (current_function().is_const() && !super_ctor.is_const()) {
     ReportError(supercall_pos, "implicit call to non-const super constructor");
   }
 
   String& error_message = String::Handle(Z);
-  if (!super_ctor.AreValidArguments(arguments->length(),
-                                    arguments->names(),
+  if (!super_ctor.AreValidArguments(arguments->length(), arguments->names(),
                                     &error_message)) {
     ReportError(supercall_pos,
                 "invalid arguments passed to super constructor '%s()': %s",
@@ -2699,11 +2601,11 @@
   const Class& super_class = Class::Handle(Z, cls.SuperClass());
   ASSERT(!super_class.IsNull());
   String& ctor_name = String::Handle(Z, super_class.Name());
-  ctor_name =  Symbols::FromConcat(T, ctor_name, Symbols::Dot());
+  ctor_name = Symbols::FromConcat(T, ctor_name, Symbols::Dot());
   if (CurrentToken() == Token::kPERIOD) {
     ConsumeToken();
-    ctor_name = Symbols::FromConcat(T,
-        ctor_name, *ExpectIdentifier("constructor name expected"));
+    ctor_name = Symbols::FromConcat(
+        T, ctor_name, *ExpectIdentifier("constructor name expected"));
   }
   CheckToken(Token::kLPAREN, "parameter list expected");
 
@@ -2718,24 +2620,21 @@
   receiver->set_invisible(false);
 
   // Resolve the constructor.
-  const Function& super_ctor = Function::ZoneHandle(Z,
-      super_class.LookupConstructor(ctor_name));
+  const Function& super_ctor =
+      Function::ZoneHandle(Z, super_class.LookupConstructor(ctor_name));
   if (super_ctor.IsNull()) {
-    ReportError(supercall_pos,
-                "super class constructor '%s' not found",
+    ReportError(supercall_pos, "super class constructor '%s' not found",
                 ctor_name.ToCString());
   }
   if (current_function().is_const() && !super_ctor.is_const()) {
     ReportError(supercall_pos, "super constructor must be const");
   }
   String& error_message = String::Handle(Z);
-  if (!super_ctor.AreValidArguments(arguments->length(),
-                                    arguments->names(),
+  if (!super_ctor.AreValidArguments(arguments->length(), arguments->names(),
                                     &error_message)) {
     ReportError(supercall_pos,
                 "invalid arguments passed to super class constructor '%s': %s",
-                ctor_name.ToCString(),
-                error_message.ToCString());
+                ctor_name.ToCString(), error_message.ToCString());
   }
   return new StaticCallNode(supercall_pos, super_ctor, arguments);
 }
@@ -2783,13 +2682,13 @@
                 field_name.ToCString());
   }
   EnsureExpressionTemp();
-  AstNode* instance = new(Z) LoadLocalNode(field_pos, receiver);
-  AstNode* initializer = CheckDuplicateFieldInit(field_pos,
-      initialized_fields, instance, &field, init_expr);
+  AstNode* instance = new (Z) LoadLocalNode(field_pos, receiver);
+  AstNode* initializer = CheckDuplicateFieldInit(field_pos, initialized_fields,
+                                                 instance, &field, init_expr);
   if (initializer == NULL) {
     initializer =
-        new(Z) StoreInstanceFieldNode(field_pos, instance, field, init_expr,
-                                      /* is_initializer = */ true);
+        new (Z) StoreInstanceFieldNode(field_pos, instance, field, init_expr,
+                                       /* is_initializer = */ true);
   }
   return initializer;
 }
@@ -2860,9 +2759,10 @@
 }
 
 
-void Parser::ParseInitializedInstanceFields(const Class& cls,
-                 LocalVariable* receiver,
-                 GrowableArray<Field*>* initialized_fields) {
+void Parser::ParseInitializedInstanceFields(
+    const Class& cls,
+    LocalVariable* receiver,
+    GrowableArray<Field*>* initialized_fields) {
   TRACE_PARSER("ParseInitializedInstanceFields");
   const Array& fields = Array::Handle(Z, cls.fields());
   Field& f = Field::Handle(Z);
@@ -2901,12 +2801,9 @@
       ASSERT(init_expr != NULL);
       AstNode* instance = new LoadLocalNode(field.token_pos(), receiver);
       EnsureExpressionTemp();
-      AstNode* field_init =
-          new StoreInstanceFieldNode(field.token_pos(),
-                                     instance,
-                                     field,
-                                     init_expr,
-                                     /* is_initializer = */ true);
+      AstNode* field_init = new StoreInstanceFieldNode(
+          field.token_pos(), instance, field, init_expr,
+          /* is_initializer = */ true);
       current_block_->statements->Add(field_init);
     }
   }
@@ -2951,46 +2848,42 @@
       //     List argumentNames,
       //     List existingArgumentNames);
 
-      ArgumentListNode* nsm_args = new(Z) ArgumentListNode(init_pos);
+      ArgumentListNode* nsm_args = new (Z) ArgumentListNode(init_pos);
       // Object receiver.
       nsm_args->Add(instance);
 
       // String memberName.
       String& setter_name = String::ZoneHandle(field->name());
       setter_name = Field::SetterSymbol(setter_name);
-      nsm_args->Add(new(Z) LiteralNode(init_pos, setter_name));
+      nsm_args->Add(new (Z) LiteralNode(init_pos, setter_name));
 
       // Smi invocation_type.
-      const int invocation_type =
-          InvocationMirror::EncodeType(InvocationMirror::kDynamic,
-                                       InvocationMirror::kSetter);
-      nsm_args->Add(new(Z) LiteralNode(
+      const int invocation_type = InvocationMirror::EncodeType(
+          InvocationMirror::kDynamic, InvocationMirror::kSetter);
+      nsm_args->Add(new (Z) LiteralNode(
           init_pos, Smi::ZoneHandle(Z, Smi::New(invocation_type))));
 
       // List arguments.
       GrowableArray<AstNode*> setter_args;
       setter_args.Add(init_value);
-      ArrayNode* setter_args_array = new(Z) ArrayNode(
-          init_pos,
-          Type::ZoneHandle(Z, Type::ArrayType()),
-          setter_args);
+      ArrayNode* setter_args_array = new (Z) ArrayNode(
+          init_pos, Type::ZoneHandle(Z, Type::ArrayType()), setter_args);
       nsm_args->Add(setter_args_array);
 
       // List argumentNames.
       // The missing implicit setter of the field has no argument names.
-      nsm_args->Add(new(Z) LiteralNode(init_pos, Object::null_array()));
+      nsm_args->Add(new (Z) LiteralNode(init_pos, Object::null_array()));
 
       // List existingArgumentNames.
       // There is no setter for the final field, thus there are
       // no existing names.
-      nsm_args->Add(new(Z) LiteralNode(init_pos, Object::null_array()));
+      nsm_args->Add(new (Z) LiteralNode(init_pos, Object::null_array()));
 
       AstNode* nsm_call = MakeStaticCall(
           Symbols::NoSuchMethodError(),
-          Library::PrivateCoreLibName(Symbols::ThrowNew()),
-          nsm_args);
+          Library::PrivateCoreLibName(Symbols::ThrowNew()), nsm_args);
 
-      LetNode* let = new(Z) LetNode(init_pos);
+      LetNode* let = new (Z) LetNode(init_pos);
       let->AddNode(init_value);
       let->AddNode(nsm_call);
       result = let;
@@ -3004,8 +2897,7 @@
     Field* initialized_field = (*initialized_fields)[initializer_idx];
     initializer_idx++;
     if (initialized_field->raw() == field->raw()) {
-      ReportError(init_pos,
-                  "duplicate initializer for field %s",
+      ReportError(init_pos, "duplicate initializer for field %s",
                   String::Handle(Z, field->name()).ToCString());
     }
   }
@@ -3068,16 +2960,16 @@
     }
     ASSERT(super_init_index >= 0);
     ArgumentListNode* ctor_args = super_init_call->arguments();
-    LetNode* saved_args = new(Z) LetNode(super_init_call->token_pos());
+    LetNode* saved_args = new (Z) LetNode(super_init_call->token_pos());
     // The super initializer call has at least 1 arguments: the
     // implicit receiver.
     ASSERT(ctor_args->length() >= 1);
     for (int i = 1; i < ctor_args->length(); i++) {
       AstNode* arg = ctor_args->NodeAt(i);
       LocalVariable* temp = CreateTempConstVariable(arg->token_pos(), "sca");
-      AstNode* save_temp = new(Z) StoreLocalNode(arg->token_pos(), temp, arg);
+      AstNode* save_temp = new (Z) StoreLocalNode(arg->token_pos(), temp, arg);
       saved_args->AddNode(save_temp);
-      ctor_args->SetNodeAt(i, new(Z) LoadLocalNode(arg->token_pos(), temp));
+      ctor_args->SetNodeAt(i, new (Z) LoadLocalNode(arg->token_pos(), temp));
     }
     current_block_->statements->ReplaceNodeAt(super_init_index, saved_args);
     current_block_->statements->Add(super_init_call);
@@ -3113,23 +3005,20 @@
   ParseActualParameters(arguments, kAllowConst);
   receiver->set_invisible(false);
   // Resolve the constructor.
-  const Function& redirect_ctor = Function::ZoneHandle(Z,
-      cls.LookupConstructor(ctor_name));
+  const Function& redirect_ctor =
+      Function::ZoneHandle(Z, cls.LookupConstructor(ctor_name));
   if (redirect_ctor.IsNull()) {
     ReportError(call_pos, "constructor '%s' not found",
-        String::Handle(Z, redirect_ctor.UserVisibleName()).ToCString());
+                String::Handle(Z, redirect_ctor.UserVisibleName()).ToCString());
   }
   if (current_function().is_const() && !redirect_ctor.is_const()) {
-    ReportError(call_pos,
-        "redirection constructor '%s' must be const",
-        String::Handle(Z, redirect_ctor.UserVisibleName()).ToCString());
+    ReportError(call_pos, "redirection constructor '%s' must be const",
+                String::Handle(Z, redirect_ctor.UserVisibleName()).ToCString());
   }
   String& error_message = String::Handle(Z);
-  if (!redirect_ctor.AreValidArguments(arguments->length(),
-                                       arguments->names(),
+  if (!redirect_ctor.AreValidArguments(arguments->length(), arguments->names(),
                                        &error_message)) {
-    ReportError(call_pos,
-                "invalid arguments passed to constructor '%s': %s",
+    ReportError(call_pos, "invalid arguments passed to constructor '%s': %s",
                 String::Handle(Z, redirect_ctor.UserVisibleName()).ToCString(),
                 error_message.ToCString());
   }
@@ -3144,11 +3033,9 @@
   const TokenPosition ctor_pos = TokenPos();
   OpenFunctionBlock(func);
 
-  LocalVariable* receiver = new LocalVariable(
-      TokenPosition::kNoSource,
-      TokenPosition::kNoSource,
-      Symbols::This(),
-      *ReceiverType(current_class()));
+  LocalVariable* receiver =
+      new LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
+                        Symbols::This(), *ReceiverType(current_class()));
   current_block_->scope->InsertParameterAt(0, receiver);
 
   // Parse expressions of instance fields that have an explicit
@@ -3156,8 +3043,8 @@
   // The receiver must not be visible to field initializer expressions.
   receiver->set_invisible(true);
   GrowableArray<Field*> initialized_fields;
-  ParseInitializedInstanceFields(
-      current_class(), receiver, &initialized_fields);
+  ParseInitializedInstanceFields(current_class(), receiver,
+                                 &initialized_fields);
   receiver->set_invisible(false);
 
   // If the class of this implicit constructor is a mixin application alias,
@@ -3193,21 +3080,17 @@
     // The first user-defined argument is at position 1.
     forwarding_args = new ArgumentListNode(ST(ctor_pos));
     for (int i = 1; i < func.NumParameters(); i++) {
-      LocalVariable* param = new LocalVariable(
-          TokenPosition::kNoSource,
-          TokenPosition::kNoSource,
-          String::ZoneHandle(Z, func.ParameterNameAt(i)),
-          Object::dynamic_type());
+      LocalVariable* param =
+          new LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
+                            String::ZoneHandle(Z, func.ParameterNameAt(i)),
+                            Object::dynamic_type());
       current_block_->scope->InsertParameterAt(i, param);
       forwarding_args->Add(new LoadLocalNode(ST(ctor_pos), param));
     }
   }
 
-  AstNode* super_call = GenerateSuperConstructorCall(
-      current_class(),
-      ctor_pos,
-      receiver,
-      forwarding_args);
+  AstNode* super_call = GenerateSuperConstructorCall(current_class(), ctor_pos,
+                                                     receiver, forwarding_args);
   if (super_call != NULL) {
     current_block_->statements->Add(super_call);
   }
@@ -3249,8 +3132,7 @@
             DumpPendingFunctions(Z, pending_functions);
         ASSERT(pending_function_dump != NULL);
         ReportError("circular dependency for function %s\n%s",
-                    fname.ToCString(),
-                    pending_function_dump);
+                    fname.ToCString(), pending_function_dump);
       } else {
         ReportError("circular dependency for function %s", fname.ToCString());
       }
@@ -3309,10 +3191,10 @@
 
   const bool is_redirecting_constructor =
       (CurrentToken() == Token::kCOLON) &&
-          ((LookaheadToken(1) == Token::kTHIS) &&
-              ((LookaheadToken(2) == Token::kLPAREN) ||
-              ((LookaheadToken(2) == Token::kPERIOD) &&
-              (LookaheadToken(4) == Token::kLPAREN))));
+      ((LookaheadToken(1) == Token::kTHIS) &&
+       ((LookaheadToken(2) == Token::kLPAREN) ||
+        ((LookaheadToken(2) == Token::kPERIOD) &&
+         (LookaheadToken(4) == Token::kLPAREN))));
 
   GrowableArray<Field*> initialized_fields;
   LocalVariable* receiver = (*params.parameters)[0].var;
@@ -3370,16 +3252,12 @@
         ASSERT(p != NULL);
         AstNode* value = new LoadLocalNode(param.name_pos, p);
         EnsureExpressionTemp();
-        AstNode* initializer =
-            CheckDuplicateFieldInit(param.name_pos,
-                                    &initialized_fields,
-                                    instance,
-                                    &field,
-                                    value);
+        AstNode* initializer = CheckDuplicateFieldInit(
+            param.name_pos, &initialized_fields, instance, &field, value);
         if (initializer == NULL) {
-          initializer = new(Z) StoreInstanceFieldNode(
-              param.name_pos, instance, field, value,
-              /* is_initializer = */ true);
+          initializer = new (Z)
+              StoreInstanceFieldNode(param.name_pos, instance, field, value,
+                                     /* is_initializer = */ true);
         }
         current_block_->statements->Add(initializer);
       }
@@ -3417,14 +3295,11 @@
     if (func.is_external()) {
       // Body of an external method contains a single throw.
       const String& function_name = String::ZoneHandle(func.name());
-      current_block_->statements->Add(
-          ThrowNoSuchMethodError(TokenPos(),
-                                 cls,
-                                 function_name,
-                                 NULL,   // No arguments.
-                                 InvocationMirror::kStatic,
-                                 InvocationMirror::kMethod,
-                                 NULL));  // No existing function.
+      current_block_->statements->Add(ThrowNoSuchMethodError(
+          TokenPos(), cls, function_name,
+          NULL,  // No arguments.
+          InvocationMirror::kStatic, InvocationMirror::kMethod,
+          NULL));  // No existing function.
     }
   } else {
     UnexpectedToken();
@@ -3470,10 +3345,8 @@
   if (func.IsClosureFunction()) {
     // The first parameter of a closure function is the closure object.
     ASSERT(!func.is_const());  // Closure functions cannot be const.
-    params.AddFinalParameter(
-        TokenPos(),
-        &Symbols::ClosureParameter(),
-        &Object::dynamic_type());
+    params.AddFinalParameter(TokenPos(), &Symbols::ClosureParameter(),
+                             &Object::dynamic_type());
   } else if (!func.is_static()) {
     // Static functions do not have a receiver.
     ASSERT(current_class().raw() == func.Owner());
@@ -3481,17 +3354,14 @@
   } else if (func.IsFactory()) {
     // The first parameter of a factory is the TypeArguments vector of
     // the type of the instance to be allocated.
-    params.AddFinalParameter(
-        TokenPos(),
-        &Symbols::TypeArgumentsParameter(),
-        &Object::dynamic_type());
+    params.AddFinalParameter(TokenPos(), &Symbols::TypeArgumentsParameter(),
+                             &Object::dynamic_type());
   }
   // Expect the parameter list unless this is a getter function, or the
   // body closure of an async or generator getter function.
-  ASSERT((CurrentToken() == Token::kLPAREN) ||
-         func.IsGetterFunction() ||
+  ASSERT((CurrentToken() == Token::kLPAREN) || func.IsGetterFunction() ||
          (func.is_generated_body() &&
-             Function::Handle(func.parent_function()).IsGetterFunction()));
+          Function::Handle(func.parent_function()).IsGetterFunction()));
   const bool allow_explicit_default_values = true;
   if (func.IsGetterFunction()) {
     // Populate function scope with the formal parameters. Since in this case
@@ -3549,8 +3419,7 @@
     // Populate function scope with the formal parameters.
     AddFormalParamsToScope(&params, current_block_->scope);
 
-    if (I->type_checks() &&
-        (FunctionLevel() > 0)) {
+    if (I->type_checks() && (FunctionLevel() > 0)) {
       // We are parsing, but not compiling, a local function.
       // The instantiator may be required at run time for generic type checks.
       if (IsInstantiatorRequired()) {
@@ -3620,8 +3489,7 @@
                   "=> style function may not be sync* or async* generator");
     }
     ConsumeToken();
-    if (String::Handle(Z, func.name()).Equals(
-        Symbols::EqualOperator())) {
+    if (String::Handle(Z, func.name()).Equals(Symbols::EqualOperator())) {
       const Class& owner = Class::Handle(Z, func.Owner());
       if (!owner.IsObjectClass()) {
         AddEqualityNullCheck();
@@ -3636,8 +3504,7 @@
       ExpectSemicolon();
     }
   } else if (IsSymbol(Symbols::Native())) {
-    if (String::Handle(Z, func.name()).Equals(
-        Symbols::EqualOperator())) {
+    if (String::Handle(Z, func.name()).Equals(Symbols::EqualOperator())) {
       const Class& owner = Class::Handle(Z, func.Owner());
       if (!owner.IsObjectClass()) {
         AddEqualityNullCheck();
@@ -3649,16 +3516,13 @@
   } else if (func.is_external()) {
     // Body of an external method contains a single throw.
     const String& function_name = String::ZoneHandle(Z, func.name());
-    current_block_->statements->Add(
-        ThrowNoSuchMethodError(TokenPos(),
-                               Class::Handle(func.Owner()),
-                               function_name,
-                               NULL,  // Ignore arguments.
-                               func.is_static() ?
-                                   InvocationMirror::kStatic :
-                                   InvocationMirror::kDynamic,
-                               InvocationMirror::kMethod,
-                               &func));  // Unpatched external function.
+    current_block_->statements->Add(ThrowNoSuchMethodError(
+        TokenPos(), Class::Handle(func.Owner()), function_name,
+        NULL,  // Ignore arguments.
+        func.is_static() ? InvocationMirror::kStatic
+                         : InvocationMirror::kDynamic,
+        InvocationMirror::kMethod,
+        &func));  // Unpatched external function.
     end_token_pos = TokenPos();
   } else {
     UnexpectedToken();
@@ -3693,28 +3557,20 @@
 
 
 void Parser::AddEqualityNullCheck() {
-  AstNode* argument =
-      new LoadLocalNode(TokenPosition::kNoSource,
-                        current_block_->scope->parent()->VariableAt(1));
+  AstNode* argument = new LoadLocalNode(
+      TokenPosition::kNoSource, current_block_->scope->parent()->VariableAt(1));
   LiteralNode* null_operand =
       new LiteralNode(TokenPosition::kNoSource, Instance::ZoneHandle(Z));
-  ComparisonNode* check_arg =
-      new ComparisonNode(TokenPosition::kNoSource,
-                         Token::kEQ_STRICT,
-                         argument,
-                         null_operand);
+  ComparisonNode* check_arg = new ComparisonNode(
+      TokenPosition::kNoSource, Token::kEQ_STRICT, argument, null_operand);
   ComparisonNode* result =
-      new ComparisonNode(TokenPosition::kNoSource,
-                         Token::kEQ_STRICT,
-                         LoadReceiver(TokenPosition::kNoSource),
-                         null_operand);
-  SequenceNode* arg_is_null = new SequenceNode(TokenPosition::kNoSource,
-                                               current_block_->scope);
+      new ComparisonNode(TokenPosition::kNoSource, Token::kEQ_STRICT,
+                         LoadReceiver(TokenPosition::kNoSource), null_operand);
+  SequenceNode* arg_is_null =
+      new SequenceNode(TokenPosition::kNoSource, current_block_->scope);
   arg_is_null->Add(new ReturnNode(TokenPosition::kNoSource, result));
-  IfNode* if_arg_null = new IfNode(TokenPosition::kNoSource,
-                                   check_arg,
-                                   arg_is_null,
-                                   NULL);
+  IfNode* if_arg_null =
+      new IfNode(TokenPosition::kNoSource, check_arg, arg_is_null, NULL);
   current_block_->statements->Add(if_arg_null);
 }
 
@@ -3807,8 +3663,7 @@
 void Parser::ParseMethodOrConstructor(ClassDesc* members, MemberDesc* method) {
   TRACE_PARSER("ParseMethodOrConstructor");
   // We are at the beginning of the formal parameters list.
-  ASSERT(CurrentToken() == Token::kLPAREN ||
-         CurrentToken() == Token::kLT ||
+  ASSERT(CurrentToken() == Token::kLPAREN || CurrentToken() == Token::kLT ||
          method->IsGetter());
   ASSERT(method->type != NULL);  // May still be unresolved.
   ASSERT(current_member_ == method);
@@ -3820,10 +3675,9 @@
     ReportError(method->name_pos, "'final' not allowed for methods");
   }
   if (method->has_abstract && method->has_static) {
-    ReportError(method->name_pos,
-                "static method '%s' cannot be abstract",
+    ReportError(method->name_pos, "static method '%s' cannot be abstract",
                 method->name->ToCString());
-     }
+  }
   if (method->has_const && !method->IsFactoryOrConstructor()) {
     ReportError(method->name_pos, "'const' not allowed for methods");
   }
@@ -3834,16 +3688,14 @@
     current_class().set_is_const();
   }
 
-  Function& func = Function::Handle(Z,
+  Function& func = Function::Handle(
+      Z,
       Function::New(*method->name,  // May change.
-                    method->kind,
-                    method->has_static,
-                    method->has_const,
+                    method->kind, method->has_static, method->has_const,
                     method->has_abstract,  // May change.
                     method->has_external,
                     method->has_native,  // May change.
-                    current_class(),
-                    method->decl_begin_pos));
+                    current_class(), method->decl_begin_pos));
 
   ASSERT(innermost_function().IsNull());
   innermost_function_ = func.raw();
@@ -3858,7 +3710,7 @@
     }
     if (method->IsGetter() || method->IsSetter()) {
       ReportError(type_param_pos, "%s cannot be generic",
-          method->IsGetter() ? "getter" : "setter");
+                  method->IsGetter() ? "getter" : "setter");
     }
     ParseTypeParameters(false);  // Not parameterizing class, but function.
   }
@@ -3881,17 +3733,15 @@
   if (!method->has_static || method->IsConstructor()) {
     method->params.AddReceiver(ReceiverType(current_class()), formal_param_pos);
   } else if (method->IsFactory()) {
-    method->params.AddFinalParameter(
-        formal_param_pos,
-        &Symbols::TypeArgumentsParameter(),
-        &Object::dynamic_type());
+    method->params.AddFinalParameter(formal_param_pos,
+                                     &Symbols::TypeArgumentsParameter(),
+                                     &Object::dynamic_type());
   }
   if (are_implicitly_final) {
     method->params.SetImplicitlyFinal();
   }
   if (!method->IsGetter()) {
-    ParseFormalParameterList(allow_explicit_default_values,
-                             false,
+    ParseFormalParameterList(allow_explicit_default_values, false,
                              &method->params);
   }
 
@@ -3899,7 +3749,7 @@
   // unary and binary operator -.
   if (method->has_operator) {
     if ((method->operator_token == Token::kSUB) &&
-       (method->params.num_fixed_parameters == 1)) {
+        (method->params.num_fixed_parameters == 1)) {
       // Patch up name for unary operator - so it does not clash with the
       // name for binary operator -.
       method->operator_token = Token::kNEGATE;
@@ -3919,8 +3769,8 @@
     } else {
       ASSERT(method->IsSetter());
       expected_num_parameters = (method->has_static) ? 1 : 2;
-      method->dict_name = &String::ZoneHandle(Z,
-          Symbols::FromConcat(T, *method->name, Symbols::Equals()));
+      method->dict_name = &String::ZoneHandle(
+          Z, Symbols::FromConcat(T, *method->name, Symbols::Equals()));
       method->name = &String::ZoneHandle(Z, Field::SetterSymbol(*method->name));
     }
     if ((method->params.num_fixed_parameters != expected_num_parameters) ||
@@ -3937,9 +3787,10 @@
   if (method->IsFactory() && (CurrentToken() == Token::kASSIGN)) {
     // Default parameter values are disallowed in redirecting factories.
     if (method->params.has_explicit_default_values) {
-      ReportError("redirecting factory '%s' may not specify default values "
-                  "for optional parameters",
-                  method->name->ToCString());
+      ReportError(
+          "redirecting factory '%s' may not specify default values "
+          "for optional parameters",
+          method->name->ToCString());
     }
     if (method->has_external) {
       ReportError(TokenPos(),
@@ -3952,16 +3803,14 @@
     const bool consume_unresolved_prefix =
         (LookaheadToken(3) == Token::kLT) ||
         (LookaheadToken(3) == Token::kPERIOD);
-    const AbstractType& type = AbstractType::Handle(Z,
-        ParseType(ClassFinalizer::kResolveTypeParameters,
-                  true,
-                  consume_unresolved_prefix));
+    const AbstractType& type = AbstractType::Handle(
+        Z, ParseType(ClassFinalizer::kResolveTypeParameters, true,
+                     consume_unresolved_prefix));
     if (!type.IsMalformed() && type.IsTypeParameter()) {
       // Replace the type with a malformed type and compile a throw when called.
       redirection_type = ClassFinalizer::NewFinalizedMalformedType(
           Error::Handle(Z),  // No previous error.
-          script_,
-          type_pos,
+          script_, type_pos,
           "factory '%s' may not redirect to type parameter '%s'",
           method->name->ToCString(),
           String::Handle(Z, type.UserVisibleName()).ToCString());
@@ -3992,7 +3841,8 @@
       if (method->params.has_field_initializer) {
         // Constructors that redirect to another constructor must not
         // initialize any fields using field initializer parameters.
-        ReportError(formal_param_pos, "Redirecting constructor "
+        ReportError(formal_param_pos,
+                    "Redirecting constructor "
                     "may not use field initializer parameters");
       }
       ConsumeToken();  // Colon.
@@ -4018,8 +3868,7 @@
   // Only constructors can redirect to another method.
   ASSERT((method->redirect_name == NULL) || method->IsConstructor());
 
-  if (method->IsConstructor() &&
-      method->has_external &&
+  if (method->IsConstructor() && method->has_external &&
       method->params.has_field_initializer) {
     ReportError(method->name_pos,
                 "external constructor '%s' may not have field initializers",
@@ -4030,23 +3879,20 @@
   RawFunction::AsyncModifier async_modifier = ParseFunctionModifier();
   if ((method->IsFactoryOrConstructor() || method->IsSetter()) &&
       (async_modifier != RawFunction::kNoModifier)) {
-    ReportError(modifier_pos,
-                "%s '%s' may not be async, async* or sync*",
+    ReportError(modifier_pos, "%s '%s' may not be async, async* or sync*",
                 (method->IsSetter()) ? "setter" : "constructor",
                 method->name->ToCString());
   }
 
   TokenPosition method_end_pos = TokenPos();
   String* native_name = NULL;
-  if ((CurrentToken() == Token::kLBRACE) ||
-      (CurrentToken() == Token::kARROW)) {
+  if ((CurrentToken() == Token::kLBRACE) || (CurrentToken() == Token::kARROW)) {
     if (method->has_abstract) {
       ReportError(TokenPos(),
                   "abstract method '%s' may not have a function body",
                   method->name->ToCString());
     } else if (method->has_external) {
-      ReportError(TokenPos(),
-                  "external %s '%s' may not have a function body",
+      ReportError(TokenPos(), "external %s '%s' may not have a function body",
                   method->IsFactoryOrConstructor() ? "constructor" : "method",
                   method->name->ToCString());
     } else if (method->IsConstructor() && method->has_const) {
@@ -4054,8 +3900,7 @@
                   "const constructor '%s' may not have a function body",
                   method->name->ToCString());
     } else if (method->IsFactory() && method->has_const) {
-      ReportError(TokenPos(),
-                  "const factory '%s' may not have a function body",
+      ReportError(TokenPos(), "const factory '%s' may not have a function body",
                   method->name->ToCString());
     }
     if (method->redirect_name != NULL) {
@@ -4085,8 +3930,7 @@
                   "abstract method '%s' may not have a function body",
                   method->name->ToCString());
     } else if (method->IsConstructor() && method->has_const) {
-      ReportError(method->name_pos,
-                  "const constructor '%s' may not be native",
+      ReportError(method->name_pos, "const constructor '%s' may not be native",
                   method->name->ToCString());
     }
     if (method->redirect_name != NULL) {
@@ -4099,23 +3943,19 @@
     method->has_native = true;
   } else {
     // We haven't found a method body. Issue error if one is required.
-    const bool must_have_body =
-        method->has_static &&
-        !method->has_external &&
-        redirection_type.IsNull();
+    const bool must_have_body = method->has_static && !method->has_external &&
+                                redirection_type.IsNull();
     if (must_have_body) {
-      ReportError(method->name_pos,
-                  "function body expected for method '%s'",
+      ReportError(method->name_pos, "function body expected for method '%s'",
                   method->name->ToCString());
     }
 
     if (CurrentToken() == Token::kSEMICOLON) {
       ConsumeToken();
-      if (!method->has_static &&
-          !method->has_external &&
+      if (!method->has_static && !method->has_external &&
           !method->IsConstructor()) {
-          // Methods, getters and setters without a body are
-          // implicitly abstract.
+        // Methods, getters and setters without a body are
+        // implicitly abstract.
         method->has_abstract = true;
       }
     } else {
@@ -4188,8 +4028,7 @@
   // The parser has read the first field name and is now at the token
   // after the field name.
   ASSERT(CurrentToken() == Token::kSEMICOLON ||
-         CurrentToken() == Token::kCOMMA ||
-         CurrentToken() == Token::kASSIGN);
+         CurrentToken() == Token::kCOMMA || CurrentToken() == Token::kASSIGN);
   ASSERT(field->type != NULL);
   ASSERT(field->name_pos.IsReal());
   ASSERT(current_member_ == field);
@@ -4249,14 +4088,9 @@
     // Create the field object.
     const bool is_reflectable =
         !(library_.is_dart_scheme() && library_.IsPrivate(*field->name));
-    class_field = Field::New(*field->name,
-                             field->has_static,
-                             field->has_final,
-                             field->has_const,
-                             is_reflectable,
-                             current_class(),
-                             *field->type,
-                             field->name_pos);
+    class_field = Field::New(*field->name, field->has_static, field->has_final,
+                             field->has_const, is_reflectable, current_class(),
+                             *field->type, field->name_pos);
     class_field.set_has_initializer(has_initializer);
     members->AddField(class_field);
     field->field_ = &class_field;
@@ -4286,15 +4120,12 @@
       if (!has_simple_literal) {
         String& getter_name =
             String::Handle(Z, Field::GetterSymbol(*field->name));
-        getter = Function::New(getter_name,
-                               RawFunction::kImplicitStaticFinalGetter,
-                               field->has_static,
-                               field->has_const,
-                               /* is_abstract = */ false,
-                               /* is_external = */ false,
-                               /* is_native = */ false,
-                               current_class(),
-                               field->name_pos);
+        getter = Function::New(
+            getter_name, RawFunction::kImplicitStaticFinalGetter,
+            field->has_static, field->has_const,
+            /* is_abstract = */ false,
+            /* is_external = */ false,
+            /* is_native = */ false, current_class(), field->name_pos);
         getter.set_result_type(*field->type);
         getter.set_is_debuggable(false);
         if (library_.is_dart_scheme() && library_.IsPrivate(*field->name)) {
@@ -4309,12 +4140,10 @@
       String& getter_name =
           String::Handle(Z, Field::GetterSymbol(*field->name));
       getter = Function::New(getter_name, RawFunction::kImplicitGetter,
-                             field->has_static,
-                             field->has_final,
+                             field->has_static, field->has_final,
                              /* is_abstract = */ false,
                              /* is_external = */ false,
-                             /* is_native = */ false,
-                             current_class(),
+                             /* is_native = */ false, current_class(),
                              field->name_pos);
       ParamList params;
       ASSERT(current_class().raw() == getter.Owner());
@@ -4328,19 +4157,15 @@
         String& setter_name =
             String::Handle(Z, Field::SetterSymbol(*field->name));
         setter = Function::New(setter_name, RawFunction::kImplicitSetter,
-                               field->has_static,
-                               field->has_final,
+                               field->has_static, field->has_final,
                                /* is_abstract = */ false,
                                /* is_external = */ false,
-                               /* is_native = */ false,
-                               current_class(),
+                               /* is_native = */ false, current_class(),
                                field->name_pos);
         ParamList params;
         ASSERT(current_class().raw() == setter.Owner());
         params.AddReceiver(ReceiverType(current_class()), field->name_pos);
-        params.AddFinalParameter(TokenPos(),
-                                 &Symbols::Value(),
-                                 field->type);
+        params.AddFinalParameter(TokenPos(), &Symbols::Value(), field->type);
         setter.set_result_type(Object::void_type());
         setter.set_is_debuggable(false);
         if (library_.is_dart_scheme() && library_.IsPrivate(*field->name)) {
@@ -4383,29 +4208,22 @@
 }
 
 
-void Parser::CheckMemberNameConflict(ClassDesc* members,
-                                     MemberDesc* member) {
+void Parser::CheckMemberNameConflict(ClassDesc* members, MemberDesc* member) {
   const String& name = *member->DictName();
   if (name.Equals(members->class_name())) {
-    ReportError(member->name_pos,
-                "%s '%s' conflicts with class name",
-                member->ToCString(),
-                name.ToCString());
+    ReportError(member->name_pos, "%s '%s' conflicts with class name",
+                member->ToCString(), name.ToCString());
   }
   if (members->clazz().LookupTypeParameter(name) != TypeParameter::null()) {
-    ReportError(member->name_pos,
-                "%s '%s' conflicts with type parameter",
-                member->ToCString(),
-                name.ToCString());
+    ReportError(member->name_pos, "%s '%s' conflicts with type parameter",
+                member->ToCString(), name.ToCString());
   }
   for (int i = 0; i < members->members().length(); i++) {
     MemberDesc* existing_member = &members->members()[i];
     if (name.Equals(*existing_member->DictName())) {
-      ReportError(member->name_pos,
-                  "%s '%s' conflicts with previously declared %s",
-                  member->ToCString(),
-                  name.ToCString(),
-                  existing_member->ToCString());
+      ReportError(
+          member->name_pos, "%s '%s' conflicts with previously declared %s",
+          member->ToCString(), name.ToCString(), existing_member->ToCString());
     }
   }
 }
@@ -4447,7 +4265,7 @@
     // The member type is the 'dynamic' type.
     member.type = &Object::dynamic_type();
   } else if ((CurrentToken() == Token::kFACTORY) &&
-      (LookaheadToken(1) != Token::kLPAREN)) {
+             (LookaheadToken(1) != Token::kLPAREN)) {
     ConsumeToken();
     if (member.has_static) {
       ReportError("factory method cannot be explicitly marked static");
@@ -4471,10 +4289,9 @@
       // Lookahead to determine whether the next tokens are a return type.
       TokenPosScope saved_pos(this);
       if (TryParseReturnType()) {
-        if (IsIdentifier() ||
-           (CurrentToken() == Token::kGET) ||
-           (CurrentToken() == Token::kSET) ||
-           (CurrentToken() == Token::kOPERATOR)) {
+        if (IsIdentifier() || (CurrentToken() == Token::kGET) ||
+            (CurrentToken() == Token::kSET) ||
+            (CurrentToken() == Token::kOPERATOR)) {
           found_type = true;
         }
       }
@@ -4482,8 +4299,8 @@
     if (found_type) {
       // It is too early to resolve the type here, since it can be a result type
       // referring to a not yet declared function type parameter.
-      member.type = &AbstractType::ZoneHandle(Z,
-          ParseType(ClassFinalizer::kDoNotResolve));
+      member.type = &AbstractType::ZoneHandle(
+          Z, ParseType(ClassFinalizer::kDoNotResolve));
     }
   }
 
@@ -4508,17 +4325,17 @@
     }
     // Do not bypass class resolution by using current_class() directly, since
     // it may be a patch class.
-    const Object& result_type_class = Object::Handle(Z,
-        UnresolvedClass::New(LibraryPrefix::Handle(Z),
-                             *member.name,
-                             member.name_pos));
+    const Object& result_type_class =
+        Object::Handle(Z, UnresolvedClass::New(LibraryPrefix::Handle(Z),
+                                               *member.name, member.name_pos));
     // The type arguments of the result type are the type parameters of the
     // current class. Note that in the case of a patch class, they are copied
     // from the class being patched.
-    member.type = &Type::ZoneHandle(Z, Type::New(
-        result_type_class,
-        TypeArguments::Handle(Z, current_class().type_parameters()),
-        member.name_pos));
+    member.type = &Type::ZoneHandle(
+        Z,
+        Type::New(result_type_class,
+                  TypeArguments::Handle(Z, current_class().type_parameters()),
+                  member.name_pos));
 
     // We must be dealing with a constructor or named constructor.
     member.kind = RawFunction::kConstructor;
@@ -4537,7 +4354,7 @@
              (LookaheadToken(1) != Token::kLPAREN) &&
              (LookaheadToken(1) != Token::kLT) &&
              (LookaheadToken(1) != Token::kASSIGN) &&
-             (LookaheadToken(1) != Token::kCOMMA)  &&
+             (LookaheadToken(1) != Token::kCOMMA) &&
              (LookaheadToken(1) != Token::kSEMICOLON)) {
     ConsumeToken();
     member.kind = RawFunction::kGetterFunction;
@@ -4548,8 +4365,8 @@
              (LookaheadToken(1) != Token::kLPAREN) &&
              (LookaheadToken(1) != Token::kLT) &&
              (LookaheadToken(1) != Token::kASSIGN) &&
-             (LookaheadToken(1) != Token::kCOMMA)  &&
-             (LookaheadToken(1) != Token::kSEMICOLON))  {
+             (LookaheadToken(1) != Token::kCOMMA) &&
+             (LookaheadToken(1) != Token::kSEMICOLON)) {
     ConsumeToken();
     member.kind = RawFunction::kSetterFunction;
     member.name_pos = this->TokenPos();
@@ -4563,7 +4380,7 @@
   } else if ((CurrentToken() == Token::kOPERATOR) && !member.has_var &&
              (LookaheadToken(1) != Token::kLPAREN) &&
              (LookaheadToken(1) != Token::kASSIGN) &&
-             (LookaheadToken(1) != Token::kCOMMA)  &&
+             (LookaheadToken(1) != Token::kCOMMA) &&
              (LookaheadToken(1) != Token::kSEMICOLON)) {
     // TODO(hausner): handle the case of a generic function named 'operator':
     // eg: T operator<T>(a, b) => ...
@@ -4578,8 +4395,8 @@
     member.has_operator = true;
     member.kind = RawFunction::kRegularFunction;
     member.name_pos = this->TokenPos();
-    member.name = &String::ZoneHandle(Z,
-        Symbols::Token(member.operator_token).raw());
+    member.name =
+        &String::ZoneHandle(Z, Symbols::Token(member.operator_token).raw());
     ConsumeToken();
   } else if (IsIdentifier()) {
     member.name = CurrentLiteral();
@@ -4598,7 +4415,7 @@
     ASSERT(member.IsFactory() == member.has_factory);
     // Note that member.type may still be unresolved.
     ParseMethodOrConstructor(members, &member);
-  } else if (CurrentToken() ==  Token::kSEMICOLON ||
+  } else if (CurrentToken() == Token::kSEMICOLON ||
              CurrentToken() == Token::kCOMMA ||
              CurrentToken() == Token::kASSIGN) {
     // Field definition.
@@ -4610,8 +4427,9 @@
       if (member.has_final) {
         member.type = &Object::dynamic_type();
       } else {
-        ReportError("missing 'var', 'final', 'const' or type"
-                    " in field declaration");
+        ReportError(
+            "missing 'var', 'final', 'const' or type"
+            " in field declaration");
       }
     } else if (member.type->IsVoidType()) {
       ReportError(member.name_pos, "field may not be 'void'");
@@ -4687,7 +4505,7 @@
   bool is_patch = false;
   bool is_abstract = false;
   TokenPosition declaration_pos =
-    metadata_pos.IsReal() ? metadata_pos : TokenPos();
+      metadata_pos.IsReal() ? metadata_pos : TokenPos();
   if (is_patch_source() && IsPatchAnnotation(metadata_pos)) {
     is_patch = true;
     metadata_pos = TokenPosition::kNoSource;
@@ -4769,8 +4587,7 @@
           ReportError(new_type_param.token_pos(),
                       "type parameter '%s' of patch class '%s' does not match "
                       "original type parameter '%s'",
-                      new_name.ToCString(),
-                      class_name.ToCString(),
+                      new_name.ToCString(), class_name.ToCString(),
                       orig_name.ToCString());
         }
         new_bound = new_type_param.bound();
@@ -4780,8 +4597,7 @@
                       "bound '%s' of type parameter '%s' of patch class '%s' "
                       "does not match original type parameter bound '%s'",
                       String::Handle(new_bound.UserVisibleName()).ToCString(),
-                      new_name.ToCString(),
-                      class_name.ToCString(),
+                      new_name.ToCString(), class_name.ToCString(),
                       String::Handle(orig_bound.UserVisibleName()).ToCString());
         }
       }
@@ -4813,16 +4629,13 @@
     }
     if (super_type.IsDynamicType()) {
       // Unlikely here, since super type is not resolved yet.
-      ReportError(type_pos,
-                  "class '%s' may not extend 'dynamic'",
+      ReportError(type_pos, "class '%s' may not extend 'dynamic'",
                   class_name.ToCString());
     }
     if (super_type.IsTypeParameter()) {
-      ReportError(type_pos,
-                  "class '%s' may not extend type parameter '%s'",
+      ReportError(type_pos, "class '%s' may not extend type parameter '%s'",
                   class_name.ToCString(),
-                  String::Handle(Z,
-                                 super_type.UserVisibleName()).ToCString());
+                  String::Handle(Z, super_type.UserVisibleName()).ToCString());
     }
     // The class finalizer will check whether the super type is malbounded.
     if (is_mixin_declaration) {
@@ -4895,8 +4708,7 @@
   ExpectToken(Token::kRBRACE);
 
   if (cls.LookupTypeParameter(class_name) != TypeParameter::null()) {
-    ReportError(class_pos,
-                "class name conflicts with type parameter '%s'",
+    ReportError(class_pos, "class name conflicts with type parameter '%s'",
                 class_name.ToCString());
   }
   CheckConstructors(&members);
@@ -4962,24 +4774,19 @@
                            true,   // Field is final.
                            false,  // Not const.
                            true,   // Is reflectable.
-                           cls,
-                           int_type,
-                           cls.token_pos());
+                           cls, int_type, cls.token_pos());
   enum_members.AddField(index_field);
 
   // Add implicit getter for index field.
   const String& getter_name =
       String::Handle(Z, Field::GetterSymbol(Symbols::Index()));
   Function& getter = Function::Handle(Z);
-  getter = Function::New(getter_name,
-                         RawFunction::kImplicitGetter,
+  getter = Function::New(getter_name, RawFunction::kImplicitGetter,
                          /* is_static = */ false,
                          /* is_const = */ true,
                          /* is_abstract = */ false,
                          /* is_external = */ false,
-                         /* is_native = */ false,
-                         cls,
-                         cls.token_pos());
+                         /* is_native = */ false, cls, cls.token_pos());
   getter.set_result_type(int_type);
   getter.set_is_debuggable(false);
   ParamList params;
@@ -5002,22 +4809,24 @@
     // Check for name conflicts.
     if (enum_ident->raw() == cls.Name()) {
       ReportError("enum identifier '%s' cannot be equal to enum type name",
-          CurrentLiteral()->ToCString());
+                  CurrentLiteral()->ToCString());
     } else if (enum_ident->raw() == Symbols::Index().raw()) {
-      ReportError("enum identifier conflicts with "
-                  "implicit instance field 'index'");
+      ReportError(
+          "enum identifier conflicts with "
+          "implicit instance field 'index'");
     } else if (enum_ident->raw() == Symbols::Values().raw()) {
-      ReportError("enum identifier conflicts with "
-                  "implicit static field 'values'");
+      ReportError(
+          "enum identifier conflicts with "
+          "implicit static field 'values'");
     } else if (enum_ident->raw() == Symbols::toString().raw()) {
-      ReportError("enum identifier conflicts with "
-                  "implicit instance method 'toString()'");
+      ReportError(
+          "enum identifier conflicts with "
+          "implicit instance method 'toString()'");
     }
     for (intptr_t n = 0; n < declared_names.length(); n++) {
       if (enum_ident->Equals(*declared_names[n])) {
         ReportError("Duplicate name '%s' in enum definition '%s'",
-                    enum_ident->ToCString(),
-                    enum_name.ToCString());
+                    enum_ident->ToCString(), enum_name.ToCString());
       }
     }
     declared_names.Add(enum_ident);
@@ -5027,10 +4836,8 @@
                             /* is_static = */ true,
                             /* is_final = */ true,
                             /* is_const = */ true,
-                            /* is_reflectable = */ true,
-                            cls,
-                            Object::dynamic_type(),
-                            cls.token_pos());
+                            /* is_reflectable = */ true, cls,
+                            Object::dynamic_type(), cls.token_pos());
     enum_value.set_has_initializer(false);
     enum_members.AddField(enum_value);
     // Initialize the field with the ordinal value. It will be patched
@@ -5049,14 +4856,13 @@
 
   // Add static field 'const List values'.
   Field& values_field = Field::ZoneHandle(Z);
-  values_field = Field::New(Symbols::Values(),
-                            /* is_static = */ true,
-                            /* is_final = */ true,
-                            /* is_const = */ true,
-                            /* is_reflectable = */ true,
-                            cls,
-                            Type::Handle(Z, Type::ArrayType()),
-                            cls.token_pos());
+  values_field =
+      Field::New(Symbols::Values(),
+                 /* is_static = */ true,
+                 /* is_final = */ true,
+                 /* is_const = */ true,
+                 /* is_reflectable = */ true, cls,
+                 Type::Handle(Z, Type::ArrayType()), cls.token_pos());
   enum_members.AddField(values_field);
 
   // Allocate the immutable array containing the enumeration values.
@@ -5066,8 +4872,8 @@
   values_field.RecordStore(values_array);
 
   // Clone the _name field from the helper class.
-  Field& _name_field = Field::Handle(Z,
-      helper_class.LookupInstanceFieldAllowPrivate(Symbols::_name()));
+  Field& _name_field = Field::Handle(
+      Z, helper_class.LookupInstanceFieldAllowPrivate(Symbols::_name()));
   ASSERT(!_name_field.IsNull());
   _name_field = _name_field.Clone(cls);
   enum_members.AddField(_name_field);
@@ -5076,18 +4882,15 @@
   // name directly here so that the private key matches those of the other
   // cloned helper functions and fields.
   const Type& string_type = Type::Handle(Z, Type::StringType());
-  const String& name_getter_name = String::Handle(Z,
-      Field::GetterSymbol(String::Handle(_name_field.name())));
+  const String& name_getter_name = String::Handle(
+      Z, Field::GetterSymbol(String::Handle(_name_field.name())));
   Function& name_getter = Function::Handle(Z);
-  name_getter = Function::New(name_getter_name,
-                              RawFunction::kImplicitGetter,
+  name_getter = Function::New(name_getter_name, RawFunction::kImplicitGetter,
                               /* is_static = */ false,
                               /* is_const = */ true,
                               /* is_abstract = */ false,
                               /* is_external = */ false,
-                              /* is_native = */ false,
-                              cls,
-                              cls.token_pos());
+                              /* is_native = */ false, cls, cls.token_pos());
   name_getter.set_result_type(string_type);
   name_getter.set_is_debuggable(false);
   ParamList name_params;
@@ -5096,15 +4899,15 @@
   enum_members.AddFunction(name_getter);
 
   // Clone the toString() function from the helper class.
-  Function& to_string_func = Function::Handle(Z,
-      helper_class.LookupDynamicFunctionAllowPrivate(Symbols::toString()));
+  Function& to_string_func = Function::Handle(
+      Z, helper_class.LookupDynamicFunctionAllowPrivate(Symbols::toString()));
   ASSERT(!to_string_func.IsNull());
   to_string_func = to_string_func.Clone(cls);
   enum_members.AddFunction(to_string_func);
 
   // Clone the hashCode getter function from the helper class.
-  Function& hash_code_func = Function::Handle(Z,
-      helper_class.LookupDynamicFunctionAllowPrivate(Symbols::hashCode()));
+  Function& hash_code_func = Function::Handle(
+      Z, helper_class.LookupDynamicFunctionAllowPrivate(Symbols::hashCode()));
   ASSERT(!hash_code_func.IsNull());
   hash_code_func = hash_code_func.Clone(cls);
   enum_members.AddFunction(hash_code_func);
@@ -5123,16 +4926,13 @@
   // To indicate that this is an implicit constructor, we set the
   // token position and end token position of the function
   // to the token position of the class.
-  Function& ctor = Function::Handle(Z,
-      Function::New(ctor_name,
-                    RawFunction::kConstructor,
-                    /* is_static = */ false,
-                    /* is_const = */ false,
-                    /* is_abstract = */ false,
-                    /* is_external = */ false,
-                    /* is_native = */ false,
-                    cls,
-                    cls.token_pos()));
+  Function& ctor = Function::Handle(
+      Z, Function::New(ctor_name, RawFunction::kConstructor,
+                       /* is_static = */ false,
+                       /* is_const = */ false,
+                       /* is_abstract = */ false,
+                       /* is_external = */ false,
+                       /* is_native = */ false, cls, cls.token_pos()));
   ctor.set_end_token_pos(ctor.token_pos());
   ctor.set_is_debuggable(false);
   if (library_.is_dart_scheme() && library_.IsPrivate(ctor_name)) {
@@ -5183,10 +4983,9 @@
 }
 
 
-void Parser::ParseMixinAppAlias(
-    const GrowableObjectArray& pending_classes,
-    const Object& tl_owner,
-    TokenPosition metadata_pos) {
+void Parser::ParseMixinAppAlias(const GrowableObjectArray& pending_classes,
+                                const Object& tl_owner,
+                                TokenPosition metadata_pos) {
   TRACE_PARSER("ParseMixinAppAlias");
   const TokenPosition classname_pos = TokenPos();
   String& class_name = *ExpectUserDefinedTypeIdentifier("class name expected");
@@ -5199,9 +4998,8 @@
     ReportError(classname_pos, "'%s' is already defined",
                 class_name.ToCString());
   }
-  const Class& mixin_application =
-      Class::Handle(Z, Class::New(library_, class_name,
-                                  script_, classname_pos));
+  const Class& mixin_application = Class::Handle(
+      Z, Class::New(library_, class_name, script_, classname_pos));
   mixin_application.set_is_mixin_app_alias();
   library_.AddClass(mixin_application);
   set_current_class(mixin_application);
@@ -5215,12 +5013,10 @@
   }
 
   const TokenPosition type_pos = TokenPos();
-  AbstractType& type =
-      AbstractType::Handle(Z,
-                           ParseType(ClassFinalizer::kResolveTypeParameters));
+  AbstractType& type = AbstractType::Handle(
+      Z, ParseType(ClassFinalizer::kResolveTypeParameters));
   if (type.IsTypeParameter()) {
-    ReportError(type_pos,
-                "class '%s' may not extend type parameter '%s'",
+    ReportError(type_pos, "class '%s' may not extend type parameter '%s'",
                 class_name.ToCString(),
                 String::Handle(Z, type.UserVisibleName()).ToCString());
   }
@@ -5317,17 +5113,16 @@
   const Object& obj =
       Object::Handle(Z, library_.LookupLocalObject(*alias_name));
   if (!obj.IsNull()) {
-    ReportError(alias_name_pos,
-                "'%s' is already defined", alias_name->ToCString());
+    ReportError(alias_name_pos, "'%s' is already defined",
+                alias_name->ToCString());
   }
 
   // Create the function type alias scope class. It will be linked to its
   // signature function after it has been parsed. The type parameters, in order
   // to be properly finalized, need to be associated to this scope class as
   // they are parsed.
-  const Class& function_type_alias =
-      Class::Handle(Z, Class::New(
-          library_, *alias_name, script_, declaration_pos));
+  const Class& function_type_alias = Class::Handle(
+      Z, Class::New(library_, *alias_name, script_, declaration_pos));
   function_type_alias.set_is_synthesized_class();
   function_type_alias.set_is_abstract();
   function_type_alias.set_is_prefinalized();
@@ -5345,18 +5140,15 @@
   ParamList func_params;
 
   // Add implicit closure object parameter.
-  func_params.AddFinalParameter(
-      TokenPos(),
-      &Symbols::ClosureParameter(),
-      &Object::dynamic_type());
+  func_params.AddFinalParameter(TokenPos(), &Symbols::ClosureParameter(),
+                                &Object::dynamic_type());
 
   // Mark the current class as a typedef class (by setting its signature
   // function field to a non-null function) before parsing its formal parameters
   // so that parsed function types are aware that their owner class is a
   // typedef class.
-  Function& signature_function =
-      Function::Handle(Z, Function::NewSignatureFunction(function_type_alias,
-                                                         alias_name_pos));
+  Function& signature_function = Function::Handle(
+      Z, Function::NewSignatureFunction(function_type_alias, alias_name_pos));
   ASSERT(innermost_function().IsNull());
   innermost_function_ = signature_function.raw();
   // Set the signature function in the function type alias class.
@@ -5380,9 +5172,7 @@
   ASSERT(!function_type_alias.is_finalized());
   pending_classes.Add(function_type_alias, Heap::kOld);
   if (FLAG_enable_mirrors && metadata_pos.IsReal()) {
-    library_.AddClassMetadata(function_type_alias,
-                              tl_owner,
-                              metadata_pos);
+    library_.AddClassMetadata(function_type_alias, tl_owner, metadata_pos);
   }
 }
 
@@ -5517,10 +5307,7 @@
       type_parameter = TypeParameter::New(
           parameterizing_class ? current_class() : Class::Handle(Z),
           parameterizing_class ? Function::Handle(Z) : innermost_function(),
-          index,
-          type_parameter_name,
-          type_parameter_bound,
-          declaration_pos);
+          index, type_parameter_name, type_parameter_bound, declaration_pos);
       if (!parameterizing_class) {
         // TODO(regis): Resolve and finalize function type parameter in
         // class finalizer. For now, already mark as finalized.
@@ -5641,7 +5428,7 @@
     mixin_types.Add(mixin_type);
   } while (CurrentToken() == Token::kCOMMA);
   return MixinAppType::New(super_type,
-      Array::Handle(Z, Array::MakeArray(mixin_types)));
+                           Array::Handle(Z, Array::MakeArray(mixin_types)));
 }
 
 
@@ -5653,8 +5440,8 @@
   // Const fields are implicitly final.
   const bool is_final = is_const || (CurrentToken() == Token::kFINAL);
   const bool is_static = true;
-  const AbstractType& type = AbstractType::ZoneHandle(Z,
-      ParseConstFinalVarOrType(ClassFinalizer::kResolveTypeParameters));
+  const AbstractType& type = AbstractType::ZoneHandle(
+      Z, ParseConstFinalVarOrType(ClassFinalizer::kResolveTypeParameters));
   Field& field = Field::Handle(Z);
   Function& getter = Function::Handle(Z);
   while (true) {
@@ -5706,15 +5493,12 @@
       if (!has_simple_literal) {
         // Create a static final getter.
         String& getter_name = String::Handle(Z, Field::GetterSymbol(var_name));
-        getter = Function::New(getter_name,
-                               RawFunction::kImplicitStaticFinalGetter,
-                               is_static,
-                               is_const,
-                               /* is_abstract = */ false,
-                               /* is_external = */ false,
-                               /* is_native = */ false,
-                               owner,
-                               name_pos);
+        getter =
+            Function::New(getter_name, RawFunction::kImplicitStaticFinalGetter,
+                          is_static, is_const,
+                          /* is_abstract = */ false,
+                          /* is_external = */ false,
+                          /* is_native = */ false, owner, name_pos);
         getter.set_result_type(type);
         getter.set_is_debuggable(false);
         getter.set_is_reflectable(is_reflectable);
@@ -5749,8 +5533,7 @@
     } else {
       return RawFunction::kAsync;
     }
-  } else if (IsSymbol(Symbols::Sync()) &&
-      (LookaheadToken(1) == Token::kMUL)) {
+  } else if (IsSymbol(Symbols::Sync()) && (LookaheadToken(1) == Token::kMUL)) {
     const bool enableSyncStar = true;
     if (!enableSyncStar) {
       ReportError("sync* generator functions are not yet supported");
@@ -5807,16 +5590,13 @@
   // A setter named x= may co-exist with a function named x, thus we do
   // not need to check setters.
 
-  Function& func = Function::Handle(Z,
-      Function::New(func_name,
-                    RawFunction::kRegularFunction,
-                    /* is_static = */ true,
-                    /* is_const = */ false,
-                    /* is_abstract = */ false,
-                    is_external,
-                    /* is_native = */ false,  // May change.
-                    owner,
-                    decl_begin_pos));
+  Function& func = Function::Handle(
+      Z, Function::New(func_name, RawFunction::kRegularFunction,
+                       /* is_static = */ true,
+                       /* is_const = */ false,
+                       /* is_abstract = */ false, is_external,
+                       /* is_native = */ false,  // May change.
+                       owner, decl_begin_pos));
 
   ASSERT(innermost_function().IsNull());
   innermost_function_ = func.raw();
@@ -5919,8 +5699,7 @@
     is_external = true;
   }
   bool is_getter = (CurrentToken() == Token::kGET);
-  if (CurrentToken() == Token::kGET ||
-      CurrentToken() == Token::kSET) {
+  if (CurrentToken() == Token::kGET || CurrentToken() == Token::kSET) {
     ConsumeToken();
     result_type = Type::DynamicType();
   } else {
@@ -5979,12 +5758,10 @@
   bool found = library_.LookupLocalObject(accessor_name) != Object::null();
   if (found && !is_patch) {
     ReportError(name_pos, "%s for '%s' is already defined",
-                is_getter ? "getter" : "setter",
-                field_name->ToCString());
+                is_getter ? "getter" : "setter", field_name->ToCString());
   } else if (!found && is_patch) {
     ReportError(name_pos, "missing %s for '%s' cannot be patched",
-                is_getter ? "getter" : "setter",
-                field_name->ToCString());
+                is_getter ? "getter" : "setter", field_name->ToCString());
   }
 
   const TokenPosition modifier_pos = TokenPos();
@@ -6023,17 +5800,13 @@
   } else {
     ReportError("function block expected");
   }
-  Function& func = Function::Handle(Z,
-      Function::New(accessor_name,
-                    is_getter ? RawFunction::kGetterFunction :
-                                RawFunction::kSetterFunction,
-                    is_static,
-                    /* is_const = */ false,
-                    /* is_abstract = */ false,
-                    is_external,
-                    is_native,
-                    owner,
-                    decl_begin_pos));
+  Function& func = Function::Handle(
+      Z, Function::New(accessor_name, is_getter ? RawFunction::kGetterFunction
+                                                : RawFunction::kSetterFunction,
+                       is_static,
+                       /* is_const = */ false,
+                       /* is_abstract = */ false, is_external, is_native, owner,
+                       decl_begin_pos));
   func.set_result_type(result_type);
   func.set_end_token_pos(accessor_end_pos);
   func.set_modifier(func_modifier);
@@ -6050,9 +5823,9 @@
     library_.AddObject(func, accessor_name);
   } else {
     // Need to remove the previously added accessor that is being patched.
-    const Class& toplevel_cls = Class::Handle(Z,
-        owner.IsClass() ? Class::Cast(owner).raw()
-                        : PatchClass::Cast(owner).patched_class());
+    const Class& toplevel_cls = Class::Handle(
+        Z, owner.IsClass() ? Class::Cast(owner).raw()
+                           : PatchClass::Cast(owner).patched_class());
     const Function& replaced_func =
         Function::Handle(Z, toplevel_cls.LookupFunction(accessor_name));
     ASSERT(!replaced_func.IsNull());
@@ -6085,8 +5858,7 @@
   {
     TransitionVMToNative transition(T);
     Api::Scope api_scope(T);
-    Dart_Handle retval = handler(tag,
-                                 Api::NewHandle(T, library_.raw()),
+    Dart_Handle retval = handler(tag, Api::NewHandle(T, library_.raw()),
                                  Api::NewHandle(T, url.raw()));
     result = Api::UnwrapHandle(retval);
   }
@@ -6185,9 +5957,10 @@
       // Check if this conditional line overrides the default import.
       const String& key = String::Handle(
           String::ConcatAll(Array::Handle(Array::MakeArray(pieces))));
-      const String& value = (valueNode == NULL)
-          ? Symbols::True()
-          : String::Cast(valueNode->AsLiteralNode()->literal());
+      const String& value =
+          (valueNode == NULL)
+              ? Symbols::True()
+              : String::Cast(valueNode->AsLiteralNode()->literal());
       // Call the embedder to supply us with the environment.
       const String& env_value =
           String::Handle(Api::GetEnvironmentValue(T, key));
@@ -6219,8 +5992,7 @@
 
   Array& show_names = Array::Handle(Z);
   Array& hide_names = Array::Handle(Z);
-  if (is_deferred_import ||
-      IsSymbol(Symbols::Show()) ||
+  if (is_deferred_import || IsSymbol(Symbols::Show()) ||
       IsSymbol(Symbols::Hide())) {
     GrowableObjectArray& show_list =
         GrowableObjectArray::Handle(Z, GrowableObjectArray::New());
@@ -6271,8 +6043,8 @@
     CallLibraryTagHandler(Dart_kImportTag, import_pos, canon_url);
   }
 
-  Namespace& ns = Namespace::Handle(Z,
-      Namespace::New(library, show_names, hide_names));
+  Namespace& ns =
+      Namespace::Handle(Z, Namespace::New(library, show_names, hide_names));
   if (FLAG_enable_mirrors && metadata_pos.IsReal()) {
     ns.AddMetadata(tl_owner, metadata_pos);
   }
@@ -6369,7 +6141,7 @@
     metadata_pos = SkipMetadata();
   }
   while ((CurrentToken() == Token::kIMPORT) ||
-      (CurrentToken() == Token::kEXPORT)) {
+         (CurrentToken() == Token::kEXPORT)) {
     ParseLibraryImportExport(tl_owner, metadata_pos);
     rewind_pos = TokenPos();
     metadata_pos = SkipMetadata();
@@ -6379,7 +6151,8 @@
   if (!library_.ImportsCorelib()) {
     Library& core_lib = Library::Handle(Z, Library::CoreLibrary());
     ASSERT(!core_lib.IsNull());
-    const Namespace& core_ns = Namespace::Handle(Z,
+    const Namespace& core_ns = Namespace::Handle(
+        Z,
         Namespace::New(core_lib, Object::null_array(), Object::null_array()));
     library_.AddImport(core_ns);
   }
@@ -6455,7 +6228,7 @@
       set_current_class(toplevel_class);
       ParseTypedef(pending_classes, tl_owner, metadata_pos);
     } else if ((CurrentToken() == Token::kABSTRACT) &&
-        (LookaheadToken(1) == Token::kCLASS)) {
+               (LookaheadToken(1) == Token::kCLASS)) {
       ParseClassDeclaration(pending_classes, tl_owner, metadata_pos);
     } else {
       set_current_class(toplevel_class);
@@ -6499,10 +6272,8 @@
 
 
 void Parser::ChainNewBlock(LocalScope* outer_scope) {
-  Block* block = new(Z) Block(
-      current_block_,
-      outer_scope,
-      new(Z) SequenceNode(TokenPos(), outer_scope));
+  Block* block = new (Z) Block(current_block_, outer_scope,
+                               new (Z) SequenceNode(TokenPos(), outer_scope));
   current_block_ = block;
 }
 
@@ -6510,18 +6281,16 @@
 void Parser::OpenBlock() {
   ASSERT(current_block_ != NULL);
   LocalScope* outer_scope = current_block_->scope;
-  ChainNewBlock(new(Z) LocalScope(
-      outer_scope, outer_scope->function_level(), outer_scope->loop_level()));
+  ChainNewBlock(new (Z) LocalScope(outer_scope, outer_scope->function_level(),
+                                   outer_scope->loop_level()));
 }
 
 
 void Parser::OpenLoopBlock() {
   ASSERT(current_block_ != NULL);
   LocalScope* outer_scope = current_block_->scope;
-  ChainNewBlock(new(Z) LocalScope(
-      outer_scope,
-      outer_scope->function_level(),
-      outer_scope->loop_level() + 1));
+  ChainNewBlock(new (Z) LocalScope(outer_scope, outer_scope->function_level(),
+                                   outer_scope->loop_level() + 1));
 }
 
 
@@ -6530,22 +6299,20 @@
   if (current_block_ == NULL) {
     if (!func.IsLocalFunction()) {
       // We are compiling a non-nested function.
-      outer_scope = new(Z) LocalScope(NULL, 0, 0);
+      outer_scope = new (Z) LocalScope(NULL, 0, 0);
     } else {
       // We are compiling the function of an invoked closure.
       // Restore the outer scope containing all captured variables.
       const ContextScope& context_scope =
           ContextScope::Handle(Z, func.context_scope());
       ASSERT(!context_scope.IsNull());
-      outer_scope = new(Z) LocalScope(
-          LocalScope::RestoreOuterScope(context_scope), 0, 0);
+      outer_scope = new (Z)
+          LocalScope(LocalScope::RestoreOuterScope(context_scope), 0, 0);
     }
   } else {
     // We are parsing a nested function while compiling the enclosing function.
-    outer_scope =
-        new(Z) LocalScope(current_block_->scope,
-                                  current_block_->scope->function_level() + 1,
-                                  0);
+    outer_scope = new (Z) LocalScope(
+        current_block_->scope, current_block_->scope->function_level() + 1, 0);
   }
   ChainNewBlock(outer_scope);
 }
@@ -6558,7 +6325,7 @@
 }
 
 
-SequenceNode* Parser::CloseAsyncGeneratorTryBlock(SequenceNode *body) {
+SequenceNode* Parser::CloseAsyncGeneratorTryBlock(SequenceNode* body) {
   TRACE_PARSER("CloseAsyncGeneratorTryBlock");
   // The generated try-catch-finally that wraps the async generator function
   // body is the outermost try statement.
@@ -6586,25 +6353,24 @@
   stack_trace_param.type = &Object::dynamic_type();
   stack_trace_param.name = &Symbols::StackTraceParameter();
 
-  AddCatchParamsToScope(
-      &exception_param, &stack_trace_param, current_block_->scope);
+  AddCatchParamsToScope(&exception_param, &stack_trace_param,
+                        current_block_->scope);
 
   // Generate code to save the exception object and stack trace
   // in local variables.
-  LocalVariable* context_var = try_scope->LocalLookupVariable(
-      Symbols::SavedTryContextVar());
+  LocalVariable* context_var =
+      try_scope->LocalLookupVariable(Symbols::SavedTryContextVar());
   ASSERT(context_var != NULL);
 
-  LocalVariable* exception_var = try_scope->LocalLookupVariable(
-      Symbols::ExceptionVar());
+  LocalVariable* exception_var =
+      try_scope->LocalLookupVariable(Symbols::ExceptionVar());
   ASSERT(exception_var != NULL);
   if (exception_param.var != NULL) {
     // Generate code to load the exception object (:exception_var) into
     // the exception variable specified in this block.
-    current_block_->statements->Add(new(Z) StoreLocalNode(
-        TokenPosition::kNoSource,
-        exception_param.var,
-        new(Z) LoadLocalNode(TokenPosition::kNoSource, exception_var)));
+    current_block_->statements->Add(new (Z) StoreLocalNode(
+        TokenPosition::kNoSource, exception_param.var,
+        new (Z) LoadLocalNode(TokenPosition::kNoSource, exception_var)));
   }
 
   LocalVariable* stack_trace_var =
@@ -6614,19 +6380,16 @@
     // A stack trace variable is specified in this block, so generate code
     // to load the stack trace object (:stack_trace_var) into the stack
     // trace variable specified in this block.
-    current_block_->statements->Add(new(Z) StoreLocalNode(
-        TokenPosition::kNoSource,
-        stack_trace_param.var,
-        new(Z) LoadLocalNode(TokenPosition::kNoSource, stack_trace_var)));
+    current_block_->statements->Add(new (Z) StoreLocalNode(
+        TokenPosition::kNoSource, stack_trace_param.var,
+        new (Z) LoadLocalNode(TokenPosition::kNoSource, stack_trace_var)));
   }
-  LocalVariable* saved_exception_var = try_scope->LocalLookupVariable(
-      Symbols::SavedExceptionVar());
-  LocalVariable* saved_stack_trace_var = try_scope->LocalLookupVariable(
-      Symbols::SavedStackTraceVar());
-  SaveExceptionAndStacktrace(current_block_->statements,
-                             exception_var,
-                             stack_trace_var,
-                             saved_exception_var,
+  LocalVariable* saved_exception_var =
+      try_scope->LocalLookupVariable(Symbols::SavedExceptionVar());
+  LocalVariable* saved_stack_trace_var =
+      try_scope->LocalLookupVariable(Symbols::SavedStackTraceVar());
+  SaveExceptionAndStacktrace(current_block_->statements, exception_var,
+                             stack_trace_var, saved_exception_var,
                              saved_stack_trace_var);
 
   // Catch block: add the error to the stream.
@@ -6635,18 +6398,15 @@
   LocalVariable* controller =
       current_block_->scope->LookupVariable(Symbols::Controller(), false);
   ASSERT(controller != NULL);
-  ArgumentListNode* args =
-      new(Z) ArgumentListNode(TokenPosition::kNoSource);
-  args->Add(new(Z) LoadLocalNode(
-      TokenPosition::kNoSource, exception_param.var));
-  args->Add(new(Z) LoadLocalNode(
-      TokenPosition::kNoSource, stack_trace_param.var));
-  current_block_->statements->Add(
-      new(Z) InstanceCallNode(try_end_pos,
-          new(Z) LoadLocalNode(TokenPosition::kNoSource, controller),
-          Symbols::AddError(),
-          args));
-  ReturnNode* return_node = new(Z) ReturnNode(TokenPosition::kNoSource);
+  ArgumentListNode* args = new (Z) ArgumentListNode(TokenPosition::kNoSource);
+  args->Add(new (Z)
+                LoadLocalNode(TokenPosition::kNoSource, exception_param.var));
+  args->Add(new (Z)
+                LoadLocalNode(TokenPosition::kNoSource, stack_trace_param.var));
+  current_block_->statements->Add(new (Z) InstanceCallNode(
+      try_end_pos, new (Z) LoadLocalNode(TokenPosition::kNoSource, controller),
+      Symbols::AddError(), args));
+  ReturnNode* return_node = new (Z) ReturnNode(TokenPosition::kNoSource);
   AddNodeForFinallyInlining(return_node);
   current_block_->statements->Add(return_node);
   AstNode* catch_block = CloseBlock();
@@ -6671,20 +6431,17 @@
   do {
     OpenBlock();
     ArgumentListNode* no_args =
-        new(Z) ArgumentListNode(TokenPosition::kNoSource);
-    current_block_->statements->Add(
-        new(Z) InstanceCallNode(try_end_pos,
-            new(Z) LoadLocalNode(TokenPosition::kNoSource, controller),
-            Symbols::Close(),
-            no_args));
+        new (Z) ArgumentListNode(TokenPosition::kNoSource);
+    current_block_->statements->Add(new (Z) InstanceCallNode(
+        try_end_pos,
+        new (Z) LoadLocalNode(TokenPosition::kNoSource, controller),
+        Symbols::Close(), no_args));
 
     // Suspend after the close.
-    AwaitMarkerNode* await_marker =
-        new(Z) AwaitMarkerNode(async_temp_scope_,
-                               current_block_->scope,
-                               TokenPosition::kNoSource);
+    AwaitMarkerNode* await_marker = new (Z) AwaitMarkerNode(
+        async_temp_scope_, current_block_->scope, TokenPosition::kNoSource);
     current_block_->statements->Add(await_marker);
-    ReturnNode* continuation_ret = new(Z) ReturnNode(try_end_pos);
+    ReturnNode* continuation_ret = new (Z) ReturnNode(try_end_pos);
     continuation_ret->set_return_type(ReturnNode::kContinuationTarget);
     current_block_->statements->Add(continuation_ret);
 
@@ -6692,11 +6449,9 @@
     AstNode* node_to_inline = try_statement->GetNodeToInlineFinally(node_index);
     if (node_to_inline != NULL) {
       InlinedFinallyNode* node =
-          new(Z) InlinedFinallyNode(try_end_pos,
-                                    finally_clause,
-                                    context_var,
-                                    // No outer try statement
-                                    CatchClauseNode::kInvalidTryIndex);
+          new (Z) InlinedFinallyNode(try_end_pos, finally_clause, context_var,
+                                     // No outer try statement
+                                     CatchClauseNode::kInvalidTryIndex);
       finally_clause = NULL;
       AddFinallyClauseToNode(true, node_to_inline, node);
       node_index++;
@@ -6712,28 +6467,17 @@
   // Catch block handles all exceptions.
   handler_types.Add(Object::dynamic_type());
 
-  CatchClauseNode* catch_clause = new(Z) CatchClauseNode(
-      TokenPosition::kNoSource,
-      catch_handler_list,
-      Array::ZoneHandle(Z, Array::MakeArray(handler_types)),
-      context_var,
-      exception_var,
-      stack_trace_var,
-      saved_exception_var,
-      saved_stack_trace_var,
-      AllocateTryIndex(),
-      true);
+  CatchClauseNode* catch_clause = new (Z) CatchClauseNode(
+      TokenPosition::kNoSource, catch_handler_list,
+      Array::ZoneHandle(Z, Array::MakeArray(handler_types)), context_var,
+      exception_var, stack_trace_var, saved_exception_var,
+      saved_stack_trace_var, AllocateTryIndex(), true);
 
   const intptr_t try_index = try_statement->try_index();
 
-  AstNode* try_catch_node =
-      new(Z) TryCatchNode(TokenPosition::kNoSource,
-                          body,
-                          context_var,
-                          catch_clause,
-                          finally_clause,
-                          try_index,
-                          finally_clause);
+  AstNode* try_catch_node = new (Z)
+      TryCatchNode(TokenPosition::kNoSource, body, context_var, catch_clause,
+                   finally_clause, try_index, finally_clause);
   current_block_->statements->Add(try_catch_node);
   return CloseBlock();
 }
@@ -6759,23 +6503,22 @@
   stack_trace_param.type = &Object::dynamic_type();
   stack_trace_param.name = &Symbols::StackTraceParameter();
 
-  AddCatchParamsToScope(
-      &exception_param, &stack_trace_param, current_block_->scope);
+  AddCatchParamsToScope(&exception_param, &stack_trace_param,
+                        current_block_->scope);
 
-  LocalVariable* context_var = try_scope->LocalLookupVariable(
-      Symbols::SavedTryContextVar());
+  LocalVariable* context_var =
+      try_scope->LocalLookupVariable(Symbols::SavedTryContextVar());
   ASSERT(context_var != NULL);
 
-  LocalVariable* exception_var = try_scope->LocalLookupVariable(
-      Symbols::ExceptionVar());
+  LocalVariable* exception_var =
+      try_scope->LocalLookupVariable(Symbols::ExceptionVar());
   if (exception_param.var != NULL) {
     // Generate code to load the exception object (:exception_var) into
     // the exception variable specified in this block.
     ASSERT(exception_var != NULL);
-    current_block_->statements->Add(new(Z) StoreLocalNode(
-        TokenPosition::kNoSource,
-        exception_param.var,
-        new(Z) LoadLocalNode(TokenPosition::kNoSource, exception_var)));
+    current_block_->statements->Add(new (Z) StoreLocalNode(
+        TokenPosition::kNoSource, exception_param.var,
+        new (Z) LoadLocalNode(TokenPosition::kNoSource, exception_var)));
   }
 
   LocalVariable* stack_trace_var =
@@ -6785,38 +6528,33 @@
     // to load the stack trace object (:stack_trace_var) into the stack
     // trace variable specified in this block.
     ASSERT(stack_trace_var != NULL);
-    current_block_->statements->Add(new(Z) StoreLocalNode(
-        TokenPosition::kNoSource,
-        stack_trace_param.var,
-        new(Z) LoadLocalNode(TokenPosition::kNoSource, stack_trace_var)));
+    current_block_->statements->Add(new (Z) StoreLocalNode(
+        TokenPosition::kNoSource, stack_trace_param.var,
+        new (Z) LoadLocalNode(TokenPosition::kNoSource, stack_trace_var)));
   }
-  LocalVariable* saved_exception_var = try_scope->LocalLookupVariable(
-      Symbols::SavedExceptionVar());
-  LocalVariable* saved_stack_trace_var = try_scope->LocalLookupVariable(
-      Symbols::SavedStackTraceVar());
-  SaveExceptionAndStacktrace(current_block_->statements,
-                             exception_var,
-                             stack_trace_var,
-                             saved_exception_var,
+  LocalVariable* saved_exception_var =
+      try_scope->LocalLookupVariable(Symbols::SavedExceptionVar());
+  LocalVariable* saved_stack_trace_var =
+      try_scope->LocalLookupVariable(Symbols::SavedStackTraceVar());
+  SaveExceptionAndStacktrace(current_block_->statements, exception_var,
+                             stack_trace_var, saved_exception_var,
                              saved_stack_trace_var);
 
   // Complete the async future with an error. This catch block executes
   // unconditionally, there is no need to generate a type check for.
-  LocalVariable* async_completer = current_block_->scope->LookupVariable(
-      Symbols::AsyncCompleter(), false);
+  LocalVariable* async_completer =
+      current_block_->scope->LookupVariable(Symbols::AsyncCompleter(), false);
   ASSERT(async_completer != NULL);
   ArgumentListNode* completer_args =
       new (Z) ArgumentListNode(TokenPosition::kNoSource);
   completer_args->Add(
       new (Z) LoadLocalNode(TokenPosition::kNoSource, exception_param.var));
   completer_args->Add(
-      new (Z) LoadLocalNode(TokenPosition::kNoSource,
-                            stack_trace_param.var));
+      new (Z) LoadLocalNode(TokenPosition::kNoSource, stack_trace_param.var));
   current_block_->statements->Add(new (Z) InstanceCallNode(
       TokenPos(),
       new (Z) LoadLocalNode(TokenPosition::kNoSource, async_completer),
-      Symbols::CompleterCompleteError(),
-      completer_args));
+      Symbols::CompleterCompleteError(), completer_args));
   ReturnNode* return_node = new (Z) ReturnNode(TokenPosition::kNoSource);
   // Behavior like a continuation return, i.e,. don't call a completer.
   return_node->set_return_type(ReturnNode::kContinuation);
@@ -6834,21 +6572,12 @@
   const intptr_t try_index = try_statement->try_index();
 
   CatchClauseNode* catch_clause = new (Z) CatchClauseNode(
-      TokenPosition::kNoSource,
-      catch_handler_list,
-      Array::ZoneHandle(Z, Array::MakeArray(handler_types)),
-      context_var,
-      exception_var,
-      stack_trace_var,
-      saved_exception_var,
-      saved_stack_trace_var,
-      CatchClauseNode::kInvalidTryIndex,
-      true);
+      TokenPosition::kNoSource, catch_handler_list,
+      Array::ZoneHandle(Z, Array::MakeArray(handler_types)), context_var,
+      exception_var, stack_trace_var, saved_exception_var,
+      saved_stack_trace_var, CatchClauseNode::kInvalidTryIndex, true);
   AstNode* try_catch_node = new (Z) TryCatchNode(
-      TokenPosition::kNoSource,
-      try_block,
-      context_var,
-      catch_clause,
+      TokenPosition::kNoSource, try_block, context_var, catch_clause,
       NULL,  // No finally clause.
       try_index,
       NULL);  // No rethrow-finally clause.
@@ -6866,13 +6595,9 @@
   LocalVariable* stack_trace_var = NULL;
   LocalVariable* saved_exception_var = NULL;
   LocalVariable* saved_stack_trace_var = NULL;
-  SetupExceptionVariables(current_block_->scope,
-                          true,
-                          &context_var,
-                          &exception_var,
-                          &stack_trace_var,
-                          &saved_exception_var,
-                          &saved_stack_trace_var);
+  SetupExceptionVariables(current_block_->scope, true, &context_var,
+                          &exception_var, &stack_trace_var,
+                          &saved_exception_var, &saved_stack_trace_var);
 
   // Open the try block.
   OpenBlock();
@@ -6890,10 +6615,9 @@
   // 2) Iterator
   // Add implicit closure parameter if not already present.
   if (params->parameters->length() == 0) {
-    params->AddFinalParameter(
-        TokenPosition::kMinSource,
-        &Symbols::ClosureParameter(),
-        &Object::dynamic_type());
+    params->AddFinalParameter(TokenPosition::kMinSource,
+                              &Symbols::ClosureParameter(),
+                              &Object::dynamic_type());
   }
   ParamDesc iterator_param;
   iterator_param.name = &Symbols::IteratorParameter();
@@ -6931,8 +6655,7 @@
     String& generator_name = String::Handle(Z, innermost_function().name());
     body_closure_name =
         Symbols::NewFormatted(T, "<%s_sync_body>", generator_name.ToCString());
-    body = Function::NewClosureFunction(body_closure_name,
-                                        innermost_function(),
+    body = Function::NewClosureFunction(body_closure_name, innermost_function(),
                                         func_pos);
     body.set_is_generated_body(true);
     body.set_result_type(Object::dynamic_type());
@@ -6975,33 +6698,31 @@
   // :await_jump_var = -1;
   LocalVariable* jump_var =
       current_block_->scope->LookupVariable(Symbols::AwaitJumpVar(), false);
-  LiteralNode* init_value = new(Z) LiteralNode(TokenPosition::kNoSource,
-                                               Smi::ZoneHandle(Smi::New(-1)));
+  LiteralNode* init_value = new (Z)
+      LiteralNode(TokenPosition::kNoSource, Smi::ZoneHandle(Smi::New(-1)));
   current_block_->statements->Add(
-      new(Z) StoreLocalNode(TokenPosition::kNoSource, jump_var, init_value));
+      new (Z) StoreLocalNode(TokenPosition::kNoSource, jump_var, init_value));
 
   // return new SyncIterable(body_closure);
   const Class& iterable_class =
       Class::Handle(Z, Library::LookupCoreClass(Symbols::_SyncIterable()));
   ASSERT(!iterable_class.IsNull());
-  const Function& iterable_constructor = Function::ZoneHandle(Z,
-      iterable_class.LookupConstructorAllowPrivate(
-          Symbols::_SyncIterableConstructor()));
+  const Function& iterable_constructor =
+      Function::ZoneHandle(Z, iterable_class.LookupConstructorAllowPrivate(
+                                  Symbols::_SyncIterableConstructor()));
   ASSERT(!iterable_constructor.IsNull());
 
   const String& closure_name = String::Handle(Z, closure.name());
   ASSERT(closure_name.IsSymbol());
 
   ArgumentListNode* arguments =
-      new(Z) ArgumentListNode(TokenPosition::kNoSource);
-  ClosureNode* closure_obj = new(Z) ClosureNode(
+      new (Z) ArgumentListNode(TokenPosition::kNoSource);
+  ClosureNode* closure_obj = new (Z) ClosureNode(
       TokenPosition::kNoSource, closure, NULL, closure_body->scope());
   arguments->Add(closure_obj);
-  ConstructorCallNode* new_iterable =
-      new(Z) ConstructorCallNode(TokenPosition::kNoSource,
-          TypeArguments::ZoneHandle(Z),
-          iterable_constructor,
-          arguments);
+  ConstructorCallNode* new_iterable = new (Z) ConstructorCallNode(
+      TokenPosition::kNoSource, TypeArguments::ZoneHandle(Z),
+      iterable_constructor, arguments);
   ReturnNode* return_node =
       new (Z) ReturnNode(TokenPosition::kNoSource, new_iterable);
   current_block_->statements->Add(return_node);
@@ -7017,10 +6738,9 @@
   ASSERT(params->parameters->length() <= 1);
   // Add implicit closure parameter if not yet present.
   if (params->parameters->length() == 0) {
-    params->AddFinalParameter(
-        TokenPosition::kMinSource,
-        &Symbols::ClosureParameter(),
-        &Object::dynamic_type());
+    params->AddFinalParameter(TokenPosition::kMinSource,
+                              &Symbols::ClosureParameter(),
+                              &Object::dynamic_type());
   }
   ParamDesc result_param;
   result_param.name = &Symbols::AsyncOperationParam();
@@ -7061,12 +6781,11 @@
     // Create the closure containing the body of this async function.
     const String& async_func_name =
         String::Handle(Z, innermost_function().name());
-    String& closure_name = String::Handle(Z, Symbols::NewFormatted(T,
-        "<%s_async_body>", async_func_name.ToCString()));
-    closure = Function::NewClosureFunction(
-        closure_name,
-        innermost_function(),
-        async_func_pos);
+    String& closure_name =
+        String::Handle(Z, Symbols::NewFormatted(T, "<%s_async_body>",
+                                                async_func_name.ToCString()));
+    closure = Function::NewClosureFunction(closure_name, innermost_function(),
+                                           async_func_pos);
     closure.set_is_generated_body(true);
     closure.set_result_type(Object::dynamic_type());
     is_new_closure = true;
@@ -7104,17 +6823,13 @@
   // Add to current block's scope:
   //   var :await_jump_var;
   //   var :await_ctx_var;
-  LocalVariable* await_jump_var = new (Z) LocalVariable(
-      TokenPosition::kNoSource,
-      TokenPosition::kNoSource,
-      Symbols::AwaitJumpVar(),
-      Object::dynamic_type());
+  LocalVariable* await_jump_var =
+      new (Z) LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
+                            Symbols::AwaitJumpVar(), Object::dynamic_type());
   current_block_->scope->AddVariable(await_jump_var);
-  LocalVariable* await_ctx_var = new (Z) LocalVariable(
-      TokenPosition::kNoSource,
-      TokenPosition::kNoSource,
-      Symbols::AwaitContextVar(),
-      Object::dynamic_type());
+  LocalVariable* await_ctx_var =
+      new (Z) LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
+                            Symbols::AwaitContextVar(), Object::dynamic_type());
   current_block_->scope->AddVariable(await_ctx_var);
 }
 
@@ -7125,29 +6840,21 @@
   //   var :async_then_callback;
   //   var :async_catch_error_callback;
   //   var :async_completer;
-  LocalVariable* async_op_var = new(Z) LocalVariable(
-      TokenPosition::kNoSource,
-      TokenPosition::kNoSource,
-      Symbols::AsyncOperation(),
-      Object::dynamic_type());
+  LocalVariable* async_op_var =
+      new (Z) LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
+                            Symbols::AsyncOperation(), Object::dynamic_type());
   current_block_->scope->AddVariable(async_op_var);
-  LocalVariable* async_then_callback_var = new(Z) LocalVariable(
-      TokenPosition::kNoSource,
-      TokenPosition::kNoSource,
-      Symbols::AsyncThenCallback(),
-      Object::dynamic_type());
+  LocalVariable* async_then_callback_var = new (Z)
+      LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
+                    Symbols::AsyncThenCallback(), Object::dynamic_type());
   current_block_->scope->AddVariable(async_then_callback_var);
-  LocalVariable* async_catch_error_callback_var = new(Z) LocalVariable(
-      TokenPosition::kNoSource,
-      TokenPosition::kNoSource,
-      Symbols::AsyncCatchErrorCallback(),
-      Object::dynamic_type());
+  LocalVariable* async_catch_error_callback_var = new (Z)
+      LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
+                    Symbols::AsyncCatchErrorCallback(), Object::dynamic_type());
   current_block_->scope->AddVariable(async_catch_error_callback_var);
-  LocalVariable* async_completer = new(Z) LocalVariable(
-      TokenPosition::kNoSource,
-      TokenPosition::kNoSource,
-      Symbols::AsyncCompleter(),
-      Object::dynamic_type());
+  LocalVariable* async_completer =
+      new (Z) LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
+                            Symbols::AsyncCompleter(), Object::dynamic_type());
   current_block_->scope->AddVariable(async_completer);
 }
 
@@ -7163,35 +6870,26 @@
   //   var :async_catch_error_callback;
   // These variables are used to store the async generator closure containing
   // the body of the async* function. They are used by the await operator.
-  LocalVariable* controller_var = new(Z) LocalVariable(
-      TokenPosition::kNoSource,
-      TokenPosition::kNoSource,
-      Symbols::Controller(),
-      Object::dynamic_type());
+  LocalVariable* controller_var =
+      new (Z) LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
+                            Symbols::Controller(), Object::dynamic_type());
   current_block_->scope->AddVariable(controller_var);
-  LocalVariable* async_op_var = new(Z) LocalVariable(
-      TokenPosition::kNoSource,
-      TokenPosition::kNoSource,
-      Symbols::AsyncOperation(),
-      Object::dynamic_type());
+  LocalVariable* async_op_var =
+      new (Z) LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
+                            Symbols::AsyncOperation(), Object::dynamic_type());
   current_block_->scope->AddVariable(async_op_var);
-  LocalVariable* async_then_callback_var = new(Z) LocalVariable(
-      TokenPosition::kNoSource,
-      TokenPosition::kNoSource,
-      Symbols::AsyncThenCallback(),
-      Object::dynamic_type());
+  LocalVariable* async_then_callback_var = new (Z)
+      LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
+                    Symbols::AsyncThenCallback(), Object::dynamic_type());
   current_block_->scope->AddVariable(async_then_callback_var);
-  LocalVariable* async_catch_error_callback_var = new(Z) LocalVariable(
-      TokenPosition::kNoSource,
-      TokenPosition::kNoSource,
-      Symbols::AsyncCatchErrorCallback(),
-      Object::dynamic_type());
+  LocalVariable* async_catch_error_callback_var = new (Z)
+      LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
+                    Symbols::AsyncCatchErrorCallback(), Object::dynamic_type());
   current_block_->scope->AddVariable(async_catch_error_callback_var);
 }
 
 
-RawFunction* Parser::OpenAsyncGeneratorFunction(
-    TokenPosition async_func_pos) {
+RawFunction* Parser::OpenAsyncGeneratorFunction(TokenPosition async_func_pos) {
   TRACE_PARSER("OpenAsyncGeneratorFunction");
   AddContinuationVariables();
   AddAsyncGeneratorVariables();
@@ -7211,10 +6909,10 @@
     // Create the closure containing the body of this async generator function.
     const String& async_generator_name =
         String::Handle(Z, innermost_function().name());
-    const String& closure_name = String::Handle(Z, Symbols::NewFormatted(T,
-          "<%s_async_gen_body>", async_generator_name.ToCString()));
-    closure = Function::NewClosureFunction(closure_name,
-                                           innermost_function(),
+    const String& closure_name = String::Handle(
+        Z, Symbols::NewFormatted(T, "<%s_async_gen_body>",
+                                 async_generator_name.ToCString()));
+    closure = Function::NewClosureFunction(closure_name, innermost_function(),
                                            async_func_pos);
     closure.set_is_generated_body(true);
     closure.set_result_type(Object::dynamic_type());
@@ -7267,17 +6965,17 @@
 
   // Explicitly reference variables of the async genenerator function from the
   // closure body in order to mark them as captured.
-  LocalVariable* existing_var = closure_body->scope()->LookupVariable(
-      Symbols::AwaitJumpVar(), false);
+  LocalVariable* existing_var =
+      closure_body->scope()->LookupVariable(Symbols::AwaitJumpVar(), false);
   ASSERT((existing_var != NULL) && existing_var->is_captured());
-  existing_var = closure_body->scope()->LookupVariable(
-      Symbols::AwaitContextVar(), false);
+  existing_var =
+      closure_body->scope()->LookupVariable(Symbols::AwaitContextVar(), false);
   ASSERT((existing_var != NULL) && existing_var->is_captured());
-  existing_var = closure_body->scope()->LookupVariable(
-      Symbols::Controller(), false);
+  existing_var =
+      closure_body->scope()->LookupVariable(Symbols::Controller(), false);
   ASSERT((existing_var != NULL) && existing_var->is_captured());
-  existing_var = closure_body->scope()->LookupVariable(
-      Symbols::AsyncOperation(), false);
+  existing_var =
+      closure_body->scope()->LookupVariable(Symbols::AsyncOperation(), false);
   ASSERT((existing_var != NULL) && existing_var->is_captured());
   existing_var = closure_body->scope()->LookupVariable(
       Symbols::AsyncThenCallback(), false);
@@ -7288,106 +6986,96 @@
 
   const Library& async_lib = Library::Handle(Library::AsyncLibrary());
 
-  const Class& controller_class = Class::Handle(Z,
-      async_lib.LookupClassAllowPrivate(
-          Symbols::_AsyncStarStreamController()));
+  const Class& controller_class = Class::Handle(
+      Z,
+      async_lib.LookupClassAllowPrivate(Symbols::_AsyncStarStreamController()));
   ASSERT(!controller_class.IsNull());
-  const Function& controller_constructor = Function::ZoneHandle(Z,
-      controller_class.LookupConstructorAllowPrivate(
-          Symbols::_AsyncStarStreamControllerConstructor()));
+  const Function& controller_constructor = Function::ZoneHandle(
+      Z, controller_class.LookupConstructorAllowPrivate(
+             Symbols::_AsyncStarStreamControllerConstructor()));
 
   // :await_jump_var = -1;
   LocalVariable* jump_var =
       current_block_->scope->LookupVariable(Symbols::AwaitJumpVar(), false);
-  LiteralNode* init_value = new(Z) LiteralNode(TokenPosition::kNoSource,
-                                               Smi::ZoneHandle(Smi::New(-1)));
+  LiteralNode* init_value = new (Z)
+      LiteralNode(TokenPosition::kNoSource, Smi::ZoneHandle(Smi::New(-1)));
   current_block_->statements->Add(
-      new(Z) StoreLocalNode(TokenPosition::kNoSource, jump_var, init_value));
+      new (Z) StoreLocalNode(TokenPosition::kNoSource, jump_var, init_value));
 
   // Add to AST:
   //   :async_op = <closure>;  (containing the original body)
   LocalVariable* async_op_var =
       current_block_->scope->LookupVariable(Symbols::AsyncOperation(), false);
-  ClosureNode* closure_obj = new(Z) ClosureNode(
+  ClosureNode* closure_obj = new (Z) ClosureNode(
       TokenPosition::kNoSource, closure_func, NULL, closure_body->scope());
-  StoreLocalNode* store_async_op = new (Z) StoreLocalNode(
-      TokenPosition::kNoSource,
-      async_op_var,
-      closure_obj);
+  StoreLocalNode* store_async_op = new (Z)
+      StoreLocalNode(TokenPosition::kNoSource, async_op_var, closure_obj);
 
   current_block_->statements->Add(store_async_op);
 
   // :async_then_callback = _asyncThenWrapperHelper(:async_op)
   const Function& async_then_wrapper_helper = Function::ZoneHandle(
-      Z, async_lib.LookupFunctionAllowPrivate(
-          Symbols::AsyncThenWrapperHelper()));
+      Z,
+      async_lib.LookupFunctionAllowPrivate(Symbols::AsyncThenWrapperHelper()));
   ASSERT(!async_then_wrapper_helper.IsNull());
-  ArgumentListNode* async_then_wrapper_helper_args = new (Z) ArgumentListNode(
-      TokenPosition::kNoSource);
+  ArgumentListNode* async_then_wrapper_helper_args =
+      new (Z) ArgumentListNode(TokenPosition::kNoSource);
   async_then_wrapper_helper_args->Add(
       new (Z) LoadLocalNode(TokenPosition::kNoSource, async_op_var));
-  StaticCallNode* then_wrapper_call = new (Z) StaticCallNode(
-      TokenPosition::kNoSource,
-      async_then_wrapper_helper,
-      async_then_wrapper_helper_args);
+  StaticCallNode* then_wrapper_call = new (Z)
+      StaticCallNode(TokenPosition::kNoSource, async_then_wrapper_helper,
+                     async_then_wrapper_helper_args);
   LocalVariable* async_then_callback_var =
-      current_block_->scope->LookupVariable(
-          Symbols::AsyncThenCallback(), false);
+      current_block_->scope->LookupVariable(Symbols::AsyncThenCallback(),
+                                            false);
   StoreLocalNode* store_async_then_callback = new (Z) StoreLocalNode(
-      TokenPosition::kNoSource,
-      async_then_callback_var,
-      then_wrapper_call);
+      TokenPosition::kNoSource, async_then_callback_var, then_wrapper_call);
 
   current_block_->statements->Add(store_async_then_callback);
 
   // :async_catch_error_callback = _asyncErrorWrapperHelper(:async_op)
 
   const Function& async_error_wrapper_helper = Function::ZoneHandle(
-      Z, async_lib.LookupFunctionAllowPrivate(
-          Symbols::AsyncErrorWrapperHelper()));
+      Z,
+      async_lib.LookupFunctionAllowPrivate(Symbols::AsyncErrorWrapperHelper()));
   ASSERT(!async_error_wrapper_helper.IsNull());
-  ArgumentListNode* async_error_wrapper_helper_args = new (Z) ArgumentListNode(
-      TokenPosition::kNoSource);
+  ArgumentListNode* async_error_wrapper_helper_args =
+      new (Z) ArgumentListNode(TokenPosition::kNoSource);
   async_error_wrapper_helper_args->Add(
       new (Z) LoadLocalNode(TokenPosition::kNoSource, async_op_var));
-  StaticCallNode* error_wrapper_call = new (Z) StaticCallNode(
-      TokenPosition::kNoSource,
-      async_error_wrapper_helper,
-      async_error_wrapper_helper_args);
+  StaticCallNode* error_wrapper_call = new (Z)
+      StaticCallNode(TokenPosition::kNoSource, async_error_wrapper_helper,
+                     async_error_wrapper_helper_args);
   LocalVariable* async_catch_error_callback_var =
-      current_block_->scope->LookupVariable(
-          Symbols::AsyncCatchErrorCallback(), false);
-  StoreLocalNode* store_async_catch_error_callback = new (Z) StoreLocalNode(
-      TokenPosition::kNoSource,
-      async_catch_error_callback_var,
-      error_wrapper_call);
+      current_block_->scope->LookupVariable(Symbols::AsyncCatchErrorCallback(),
+                                            false);
+  StoreLocalNode* store_async_catch_error_callback = new (Z)
+      StoreLocalNode(TokenPosition::kNoSource, async_catch_error_callback_var,
+                     error_wrapper_call);
 
   current_block_->statements->Add(store_async_catch_error_callback);
 
   // :controller = new _AsyncStarStreamController(body_closure);
   ArgumentListNode* arguments =
-      new(Z) ArgumentListNode(TokenPosition::kNoSource);
-  arguments->Add(
-      new (Z) LoadLocalNode(TokenPosition::kNoSource, async_op_var));
+      new (Z) ArgumentListNode(TokenPosition::kNoSource);
+  arguments->Add(new (Z) LoadLocalNode(TokenPosition::kNoSource, async_op_var));
   ConstructorCallNode* controller_constructor_call =
-      new(Z) ConstructorCallNode(TokenPosition::kNoSource,
-                                 TypeArguments::ZoneHandle(Z),
-                                 controller_constructor,
-                                 arguments);
+      new (Z) ConstructorCallNode(TokenPosition::kNoSource,
+                                  TypeArguments::ZoneHandle(Z),
+                                  controller_constructor, arguments);
   LocalVariable* controller_var =
-     current_block_->scope->LookupVariable(Symbols::Controller(), false);
-  StoreLocalNode* store_controller =
-      new(Z) StoreLocalNode(TokenPosition::kNoSource,
-                            controller_var,
-                            controller_constructor_call);
+      current_block_->scope->LookupVariable(Symbols::Controller(), false);
+  StoreLocalNode* store_controller = new (Z) StoreLocalNode(
+      TokenPosition::kNoSource, controller_var, controller_constructor_call);
   current_block_->statements->Add(store_controller);
 
   // return :controller.stream;
-  ReturnNode* return_node = new(Z) ReturnNode(TokenPosition::kNoSource,
-      new(Z) InstanceGetterNode(TokenPosition::kNoSource,
-          new(Z) LoadLocalNode(TokenPosition::kNoSource,
-              controller_var),
-              Symbols::Stream()));
+  ReturnNode* return_node = new (Z) ReturnNode(
+      TokenPosition::kNoSource,
+      new (Z) InstanceGetterNode(
+          TokenPosition::kNoSource,
+          new (Z) LoadLocalNode(TokenPosition::kNoSource, controller_var),
+          Symbols::Stream()));
   current_block_->statements->Add(return_node);
   return CloseBlock();
 }
@@ -7413,15 +7101,15 @@
 // Add a return node to the sequence if necessary.
 void Parser::EnsureHasReturnStatement(SequenceNode* seq,
                                       TokenPosition return_pos) {
-  if ((seq->length() == 0) ||
-      !seq->NodeAt(seq->length() - 1)->IsReturnNode()) {
+  if ((seq->length() == 0) || !seq->NodeAt(seq->length() - 1)->IsReturnNode()) {
     const Function& func = innermost_function();
     // The implicit return value of synchronous generator closures is false,
     // to indicate that there are no more elements in the iterable.
     // In other cases the implicit return value is null.
-    AstNode* return_value = func.IsSyncGenClosure()
-        ? new LiteralNode(return_pos, Bool::False())
-        : new LiteralNode(return_pos, Instance::ZoneHandle());
+    AstNode* return_value =
+        func.IsSyncGenClosure()
+            ? new LiteralNode(return_pos, Bool::False())
+            : new LiteralNode(return_pos, Instance::ZoneHandle());
     seq->Add(new ReturnNode(return_pos, return_value));
   }
 }
@@ -7464,115 +7152,96 @@
   // No need to capture parameters or other variables, since they have already
   // been captured in the corresponding scope as the body has been parsed within
   // a nested block (contained in the async function's block).
-  const Class& future =
-      Class::ZoneHandle(Z, I->object_store()->future_class());
+  const Class& future = Class::ZoneHandle(Z, I->object_store()->future_class());
   ASSERT(!future.IsNull());
-  const Function& constructor = Function::ZoneHandle(Z,
-      future.LookupFunction(Symbols::FutureMicrotask()));
+  const Function& constructor = Function::ZoneHandle(
+      Z, future.LookupFunction(Symbols::FutureMicrotask()));
   ASSERT(!constructor.IsNull());
   const Class& completer =
       Class::ZoneHandle(Z, I->object_store()->completer_class());
   ASSERT(!completer.IsNull());
-  const Function& completer_constructor = Function::ZoneHandle(Z,
-      completer.LookupFunction(Symbols::CompleterSyncConstructor()));
+  const Function& completer_constructor = Function::ZoneHandle(
+      Z, completer.LookupFunction(Symbols::CompleterSyncConstructor()));
   ASSERT(!completer_constructor.IsNull());
 
-  LocalVariable* async_completer = current_block_->scope->LookupVariable(
-      Symbols::AsyncCompleter(), false);
+  LocalVariable* async_completer =
+      current_block_->scope->LookupVariable(Symbols::AsyncCompleter(), false);
 
   const TokenPosition token_pos = ST(closure_body->token_pos());
   // Add to AST:
   //   :async_completer = new Completer.sync();
-  ArgumentListNode* empty_args =
-      new (Z) ArgumentListNode(token_pos);
-  ConstructorCallNode* completer_constructor_node = new (Z) ConstructorCallNode(
-      token_pos,
-      TypeArguments::ZoneHandle(Z),
-      completer_constructor,
-      empty_args);
-  StoreLocalNode* store_completer = new (Z) StoreLocalNode(
-      token_pos,
-      async_completer,
-      completer_constructor_node);
+  ArgumentListNode* empty_args = new (Z) ArgumentListNode(token_pos);
+  ConstructorCallNode* completer_constructor_node =
+      new (Z) ConstructorCallNode(token_pos, TypeArguments::ZoneHandle(Z),
+                                  completer_constructor, empty_args);
+  StoreLocalNode* store_completer = new (Z)
+      StoreLocalNode(token_pos, async_completer, completer_constructor_node);
   current_block_->statements->Add(store_completer);
 
   // :await_jump_var = -1;
   LocalVariable* jump_var =
       current_block_->scope->LookupVariable(Symbols::AwaitJumpVar(), false);
   LiteralNode* init_value =
-      new(Z) LiteralNode(token_pos,
-                         Smi::ZoneHandle(Smi::New(-1)));
+      new (Z) LiteralNode(token_pos, Smi::ZoneHandle(Smi::New(-1)));
   current_block_->statements->Add(
-      new(Z) StoreLocalNode(token_pos, jump_var, init_value));
+      new (Z) StoreLocalNode(token_pos, jump_var, init_value));
 
   // Add to AST:
   //   :async_op = <closure>;  (containing the original body)
-  LocalVariable* async_op_var = current_block_->scope->LookupVariable(
-      Symbols::AsyncOperation(), false);
-  ClosureNode* cn = new(Z) ClosureNode(
-      token_pos, closure, NULL, closure_body->scope());
-  StoreLocalNode* store_async_op = new (Z) StoreLocalNode(
-      token_pos,
-      async_op_var,
-      cn);
+  LocalVariable* async_op_var =
+      current_block_->scope->LookupVariable(Symbols::AsyncOperation(), false);
+  ClosureNode* cn =
+      new (Z) ClosureNode(token_pos, closure, NULL, closure_body->scope());
+  StoreLocalNode* store_async_op =
+      new (Z) StoreLocalNode(token_pos, async_op_var, cn);
   current_block_->statements->Add(store_async_op);
 
   const Library& async_lib = Library::Handle(Library::AsyncLibrary());
   // :async_then_callback = _asyncThenWrapperHelper(:async_op)
   const Function& async_then_wrapper_helper = Function::ZoneHandle(
-      Z, async_lib.LookupFunctionAllowPrivate(
-          Symbols::AsyncThenWrapperHelper()));
+      Z,
+      async_lib.LookupFunctionAllowPrivate(Symbols::AsyncThenWrapperHelper()));
   ASSERT(!async_then_wrapper_helper.IsNull());
-  ArgumentListNode* async_then_wrapper_helper_args = new (Z) ArgumentListNode(
-      token_pos);
+  ArgumentListNode* async_then_wrapper_helper_args =
+      new (Z) ArgumentListNode(token_pos);
   async_then_wrapper_helper_args->Add(
       new (Z) LoadLocalNode(token_pos, async_op_var));
   StaticCallNode* then_wrapper_call = new (Z) StaticCallNode(
-      token_pos,
-      async_then_wrapper_helper,
-      async_then_wrapper_helper_args);
+      token_pos, async_then_wrapper_helper, async_then_wrapper_helper_args);
   LocalVariable* async_then_callback_var =
-      current_block_->scope->LookupVariable(
-          Symbols::AsyncThenCallback(), false);
-  StoreLocalNode* store_async_then_callback = new (Z) StoreLocalNode(
-      token_pos,
-      async_then_callback_var,
-      then_wrapper_call);
+      current_block_->scope->LookupVariable(Symbols::AsyncThenCallback(),
+                                            false);
+  StoreLocalNode* store_async_then_callback = new (Z)
+      StoreLocalNode(token_pos, async_then_callback_var, then_wrapper_call);
 
   current_block_->statements->Add(store_async_then_callback);
 
   // :async_catch_error_callback = _asyncErrorWrapperHelper(:async_op)
 
   const Function& async_error_wrapper_helper = Function::ZoneHandle(
-      Z, async_lib.LookupFunctionAllowPrivate(
-          Symbols::AsyncErrorWrapperHelper()));
+      Z,
+      async_lib.LookupFunctionAllowPrivate(Symbols::AsyncErrorWrapperHelper()));
   ASSERT(!async_error_wrapper_helper.IsNull());
-  ArgumentListNode* async_error_wrapper_helper_args = new (Z) ArgumentListNode(
-      token_pos);
+  ArgumentListNode* async_error_wrapper_helper_args =
+      new (Z) ArgumentListNode(token_pos);
   async_error_wrapper_helper_args->Add(
       new (Z) LoadLocalNode(token_pos, async_op_var));
   StaticCallNode* error_wrapper_call = new (Z) StaticCallNode(
-      token_pos,
-      async_error_wrapper_helper,
-      async_error_wrapper_helper_args);
+      token_pos, async_error_wrapper_helper, async_error_wrapper_helper_args);
   LocalVariable* async_catch_error_callback_var =
-      current_block_->scope->LookupVariable(
-          Symbols::AsyncCatchErrorCallback(), false);
+      current_block_->scope->LookupVariable(Symbols::AsyncCatchErrorCallback(),
+                                            false);
   StoreLocalNode* store_async_catch_error_callback = new (Z) StoreLocalNode(
-      token_pos,
-      async_catch_error_callback_var,
-      error_wrapper_call);
+      token_pos, async_catch_error_callback_var, error_wrapper_call);
 
   current_block_->statements->Add(store_async_catch_error_callback);
 
   // Add to AST:
   //   new Future.microtask(:async_op);
   ArgumentListNode* arguments = new (Z) ArgumentListNode(token_pos);
-  arguments->Add(new (Z) LoadLocalNode(
-      token_pos, async_op_var));
+  arguments->Add(new (Z) LoadLocalNode(token_pos, async_op_var));
   ConstructorCallNode* future_node = new (Z) ConstructorCallNode(
-      token_pos, TypeArguments::ZoneHandle(Z), constructor,
-      arguments);
+      token_pos, TypeArguments::ZoneHandle(Z), constructor, arguments);
   current_block_->statements->Add(future_node);
 
   // Add to AST:
@@ -7580,10 +7249,7 @@
   ReturnNode* return_node = new (Z) ReturnNode(
       token_pos,
       new (Z) InstanceGetterNode(
-          token_pos,
-          new (Z) LoadLocalNode(
-              token_pos,
-              async_completer),
+          token_pos, new (Z) LoadLocalNode(token_pos, async_completer),
           Symbols::CompleterFuture()));
   current_block_->statements->Add(return_node);
   return CloseBlock();
@@ -7632,9 +7298,8 @@
   if (!Utils::IsInt(16, params->num_fixed_parameters) ||
       !Utils::IsInt(16, params->num_optional_parameters)) {
     const Script& script = Script::Handle(Class::Handle(func.Owner()).script());
-    Report::MessageF(Report::kError,
-                     script, func.token_pos(), Report::AtLocation,
-                     "too many formal parameters");
+    Report::MessageF(Report::kError, script, func.token_pos(),
+                     Report::AtLocation, "too many formal parameters");
   }
   func.set_num_fixed_parameters(params->num_fixed_parameters);
   func.SetNumOptionalParameters(params->num_optional_parameters,
@@ -7643,10 +7308,10 @@
   ASSERT(num_parameters == func.NumParameters());
   ASSERT(func.parameter_types() == Object::empty_array().raw());
   ASSERT(func.parameter_names() == Object::empty_array().raw());
-  func.set_parameter_types(Array::Handle(Array::New(num_parameters,
-                                                    Heap::kOld)));
-  func.set_parameter_names(Array::Handle(Array::New(num_parameters,
-                                                    Heap::kOld)));
+  func.set_parameter_types(
+      Array::Handle(Array::New(num_parameters, Heap::kOld)));
+  func.set_parameter_names(
+      Array::Handle(Array::New(num_parameters, Heap::kOld)));
   for (int i = 0; i < num_parameters; i++) {
     ParamDesc& param_desc = (*params->parameters)[i];
     func.SetParameterTypeAt(i, *param_desc.type);
@@ -7671,14 +7336,10 @@
     ParamDesc& param_desc = (*params->parameters)[i];
     ASSERT(!is_top_level_ || param_desc.type->IsResolved());
     const String* name = param_desc.name;
-    LocalVariable* parameter = new(Z) LocalVariable(
-        param_desc.name_pos,
-        param_desc.name_pos,
-        *name,
-        *param_desc.type);
+    LocalVariable* parameter = new (Z) LocalVariable(
+        param_desc.name_pos, param_desc.name_pos, *name, *param_desc.type);
     if (!scope->InsertParameterAt(i, parameter)) {
-      ReportError(param_desc.name_pos,
-                  "name '%s' already exists in scope",
+      ReportError(param_desc.name_pos, "name '%s' already exists in scope",
                   param_desc.name->ToCString());
     }
     param_desc.var = parameter;
@@ -7706,14 +7367,11 @@
   const String& native_name = ParseNativeDeclaration();
 
   // Now add the NativeBodyNode and return statement.
-  current_block_->statements->Add(new(Z) ReturnNode(
+  current_block_->statements->Add(new (Z) ReturnNode(
       TokenPos(),
-      new(Z) NativeBodyNode(
-          TokenPos(),
-          Function::ZoneHandle(Z, func.raw()),
-          native_name,
-          current_block_->scope,
-          FLAG_link_natives_lazily)));
+      new (Z) NativeBodyNode(TokenPos(), Function::ZoneHandle(Z, func.raw()),
+                             native_name, current_block_->scope,
+                             FLAG_link_natives_lazily)));
 }
 
 
@@ -7733,8 +7391,9 @@
 
 void Parser::CaptureInstantiator() {
   ASSERT(FunctionLevel() > 0);
-  const String* variable_name = current_function().IsInFactoryScope() ?
-      &Symbols::TypeArgumentsParameter() : &Symbols::This();
+  const String* variable_name = current_function().IsInFactoryScope()
+                                    ? &Symbols::TypeArgumentsParameter()
+                                    : &Symbols::This();
   current_block_->scope->CaptureVariable(
       current_block_->scope->LookupVariable(*variable_name, true));
 }
@@ -7756,14 +7415,14 @@
   if (receiver == NULL) {
     ReportError(token_pos, "illegal implicit access to receiver 'this'");
   }
-  return new(Z) LoadLocalNode(TokenPos(), receiver);
+  return new (Z) LoadLocalNode(TokenPos(), receiver);
 }
 
 
 InstanceGetterNode* Parser::CallGetter(TokenPosition token_pos,
                                        AstNode* object,
                                        const String& name) {
-  return new(Z) InstanceGetterNode(token_pos, object, name);
+  return new (Z) InstanceGetterNode(token_pos, object, name);
 }
 
 
@@ -7783,16 +7442,11 @@
   if (CurrentToken() == Token::kASSIGN) {
     // Variable initialization.
     ConsumeToken();
-    AstNode* expr = ParseAwaitableExpr(
-        is_const, kConsumeCascades, await_preamble);
+    AstNode* expr =
+        ParseAwaitableExpr(is_const, kConsumeCascades, await_preamble);
     const TokenPosition expr_end_pos = TokenPos();
-    variable = new(Z) LocalVariable(
-        ident_pos,
-        expr_end_pos,
-        ident,
-        type);
-    initialization = new(Z) StoreLocalNode(
-        assign_pos, variable, expr);
+    variable = new (Z) LocalVariable(ident_pos, expr_end_pos, ident, type);
+    initialization = new (Z) StoreLocalNode(assign_pos, variable, expr);
     if (is_const) {
       ASSERT(expr->IsLiteralNode());
       variable->SetConstValue(expr->AsLiteralNode()->literal());
@@ -7802,14 +7456,10 @@
                 "missing initialization of 'final' or 'const' variable");
   } else {
     // Initialize variable with null.
-    variable = new(Z) LocalVariable(
-        ident_pos,
-        assign_pos,
-        ident,
-        type);
-    AstNode* null_expr = new(Z) LiteralNode(ident_pos, Object::null_instance());
-    initialization = new(Z) StoreLocalNode(
-        ident_pos, variable, null_expr);
+    variable = new (Z) LocalVariable(ident_pos, assign_pos, ident, type);
+    AstNode* null_expr =
+        new (Z) LiteralNode(ident_pos, Object::null_instance());
+    initialization = new (Z) StoreLocalNode(ident_pos, variable, null_expr);
   }
 
   ASSERT(current_block_ != NULL);
@@ -7818,17 +7468,14 @@
   if (previous_pos.IsReal()) {
     ASSERT(!script_.IsNull());
     if (previous_pos > ident_pos) {
-      ReportError(ident_pos,
-                  "initializer of '%s' may not refer to itself",
+      ReportError(ident_pos, "initializer of '%s' may not refer to itself",
                   ident.ToCString());
 
     } else {
       intptr_t line_number;
       script_.GetTokenLocation(previous_pos, &line_number, NULL);
-      ReportError(ident_pos,
-                  "identifier '%s' previously used in line %" Pd "",
-                  ident.ToCString(),
-                  line_number);
+      ReportError(ident_pos, "identifier '%s' previously used in line %" Pd "",
+                  ident.ToCString(), line_number);
     }
   }
 
@@ -7877,10 +7524,10 @@
     Token::Kind follower = LookaheadToken(1);
     // We have an identifier followed by a 'follower' token.
     // We either parse a type or return now.
-    if ((follower != Token::kLT) &&  // Parameterized type.
-        (follower != Token::kPERIOD) &&  // Qualified class name of type.
+    if ((follower != Token::kLT) &&        // Parameterized type.
+        (follower != Token::kPERIOD) &&    // Qualified class name of type.
         !Token::IsIdentifier(follower) &&  // Variable name following a type.
-        (follower != Token::kTHIS)) {  // Field parameter following a type.
+        (follower != Token::kTHIS)) {      // Field parameter following a type.
       return Type::DynamicType();
     }
   }
@@ -7896,9 +7543,10 @@
   SkipMetadata();
   bool is_final = (CurrentToken() == Token::kFINAL);
   bool is_const = (CurrentToken() == Token::kCONST);
-  const AbstractType& type = AbstractType::ZoneHandle(Z,
-      ParseConstFinalVarOrType(I->type_checks() ?
-          ClassFinalizer::kCanonicalize : ClassFinalizer::kIgnore));
+  const AbstractType& type = AbstractType::ZoneHandle(
+      Z,
+      ParseConstFinalVarOrType(I->type_checks() ? ClassFinalizer::kCanonicalize
+                                                : ClassFinalizer::kIgnore));
   if (!IsIdentifier()) {
     ReportError("identifier expected");
   }
@@ -7918,12 +7566,11 @@
     }
     // We have a second initializer. Allocate a sequence node now.
     // The sequence does not own the current scope. Set its own scope to NULL.
-    SequenceNode* sequence = NodeAsSequenceNode(initializers->token_pos(),
-                                                initializers,
-                                                NULL);
+    SequenceNode* sequence =
+        NodeAsSequenceNode(initializers->token_pos(), initializers, NULL);
     preamble = NULL;
-    AstNode* declaration = ParseVariableDeclaration(
-        type, is_final, is_const, &preamble);
+    AstNode* declaration =
+        ParseVariableDeclaration(type, is_final, is_const, &preamble);
     if (preamble != NULL) {
       sequence->Add(preamble);
     }
@@ -7973,8 +7620,7 @@
       script_.GetTokenLocation(previous_pos, &line_number, NULL);
       ReportError(function_name_pos,
                   "identifier '%s' previously used in line %" Pd "",
-                  function_name->ToCString(),
-                  line_number);
+                  function_name->ToCString(), line_number);
     }
   }
 
@@ -7995,8 +7641,7 @@
     // function has been properly setup.
     found_func = false;
     function = Function::NewClosureFunction(*function_name,
-                                            innermost_function(),
-                                            function_pos);
+                                            innermost_function(), function_pos);
     function.set_result_type(result_type);
     if (FLAG_enable_mirrors && metadata_pos.IsReal()) {
       library_.AddFunctionMetadata(function, metadata_pos);
@@ -8021,8 +7666,8 @@
     // Now that type parameters are declared, the result type can be resolved
     // and finalized.
     ResolveType(ClassFinalizer::kResolveTypeParameters, &result_type);
-    result_type = ClassFinalizer::FinalizeType(
-        current_class(), result_type, ClassFinalizer::kCanonicalize);
+    result_type = ClassFinalizer::FinalizeType(current_class(), result_type,
+                                               ClassFinalizer::kCanonicalize);
     function.set_result_type(result_type);
   }
 
@@ -8040,27 +7685,23 @@
     // function is parsed. Therefore, we set the function type to a new
     // function type to be patched after the actual type is known.
     // We temporarily use the Closure class as scope class.
-    const Class& unknown_scope_class = Class::Handle(Z,
-        I->object_store()->closure_class());
-    function_type = Type::New(unknown_scope_class,
-                              TypeArguments::Handle(Z),
-                              function_pos);
+    const Class& unknown_scope_class =
+        Class::Handle(Z, I->object_store()->closure_class());
+    function_type =
+        Type::New(unknown_scope_class, TypeArguments::Handle(Z), function_pos);
     function_type.set_signature(function);
     function_type.SetIsFinalized();  // No finalization needed.
 
     // Add the function variable to the scope before parsing the function in
     // order to allow self reference from inside the function.
-    function_variable = new(Z) LocalVariable(function_name_pos,
-                                             function_pos,
-                                             *variable_name,
-                                             function_type);
+    function_variable = new (Z) LocalVariable(function_name_pos, function_pos,
+                                              *variable_name, function_type);
     function_variable->set_is_final();
     ASSERT(current_block_ != NULL);
     ASSERT(current_block_->scope != NULL);
     if (!current_block_->scope->AddVariable(function_variable)) {
-      LocalVariable* existing_var =
-          current_block_->scope->LookupVariable(function_variable->name(),
-                                                true);
+      LocalVariable* existing_var = current_block_->scope->LookupVariable(
+          function_variable->name(), true);
       ASSERT(existing_var != NULL);
       // Use before define cases have already been detected and reported above.
       ASSERT(existing_var->owner() == current_block_->scope);
@@ -8124,8 +7765,7 @@
 
   if (variable_name != NULL) {
     // Patch the function type of the variable now that the signature is known.
-    function_type.set_type_class(
-        Class::Handle(Z, signature_type.type_class()));
+    function_type.set_type_class(Class::Handle(Z, signature_type.type_class()));
     function_type.set_arguments(
         TypeArguments::Handle(Z, signature_type.arguments()));
     ASSERT(function_type.signature() == function.raw());
@@ -8159,8 +7799,8 @@
   // This pruning is done by omitting to hook the local scope in its parent
   // scope in the constructor of LocalScope.
   AstNode* closure =
-      new(Z) ClosureNode(function_pos, function, NULL,
-                         statements != NULL ? statements->scope() : NULL);
+      new (Z) ClosureNode(function_pos, function, NULL,
+                          statements != NULL ? statements->scope() : NULL);
 
   ASSERT(innermost_function_.raw() == function.raw());
   innermost_function_ = function.parent_function();
@@ -8169,8 +7809,8 @@
     ASSERT(is_literal);
     return closure;
   } else {
-    AstNode* initialization = new(Z) StoreLocalNode(
-        function_pos, function_variable, closure);
+    AstNode* initialization =
+        new (Z) StoreLocalNode(function_pos, function_variable, closure);
     return initialization;
   }
 }
@@ -8195,8 +7835,7 @@
         // Consume the identifier, the period will be consumed below.
         ConsumeToken();
       }
-    } else if ((ct != Token::kCOMMA) &&
-               (ct != Token::kEXTENDS) &&
+    } else if ((ct != Token::kCOMMA) && (ct != Token::kEXTENDS) &&
                (!FLAG_generic_method_syntax || (ct != Token::kSUPER))) {
       // We are looking at something other than type parameters.
       return false;
@@ -8329,16 +7968,16 @@
 // Returns true if the current token is kIDENT or a pseudo-keyword.
 bool Parser::IsIdentifier() {
   return Token::IsIdentifier(CurrentToken()) &&
-      !(await_is_keyword_ &&
-       ((CurrentLiteral()->raw() == Symbols::Await().raw()) ||
-       (CurrentLiteral()->raw() == Symbols::Async().raw()) ||
-       (CurrentLiteral()->raw() == Symbols::YieldKw().raw())));
+         !(await_is_keyword_ &&
+           ((CurrentLiteral()->raw() == Symbols::Await().raw()) ||
+            (CurrentLiteral()->raw() == Symbols::Async().raw()) ||
+            (CurrentLiteral()->raw() == Symbols::YieldKw().raw())));
 }
 
 
 bool Parser::IsSymbol(const String& symbol) {
   return (CurrentLiteral()->raw() == symbol.raw()) &&
-      (CurrentToken() == Token::kIDENT);
+         (CurrentToken() == Token::kIDENT);
 }
 
 
@@ -8399,8 +8038,7 @@
 //   | type ident (';' | '=' | ',')
 // Token position remains unchanged.
 bool Parser::IsVariableDeclaration() {
-  if ((CurrentToken() == Token::kVAR) ||
-      (CurrentToken() == Token::kFINAL)) {
+  if ((CurrentToken() == Token::kVAR) || (CurrentToken() == Token::kFINAL)) {
     return true;
   }
   // Skip optional metadata.
@@ -8424,8 +8062,8 @@
   }
   if (IsIdentifier()) {  // Type or variable name.
     Token::Kind follower = LookaheadToken(1);
-    if ((follower == Token::kLT) ||  // Parameterized type.
-        (follower == Token::kPERIOD) ||  // Qualified class name of type.
+    if ((follower == Token::kLT) ||       // Parameterized type.
+        (follower == Token::kPERIOD) ||   // Qualified class name of type.
         Token::IsIdentifier(follower)) {  // Variable name following a type.
       // We see the beginning of something that could be a type.
       const TokenPosition type_pos = TokenPos();
@@ -8498,12 +8136,9 @@
 
   // Check parameter list and the following token.
   SkipToMatchingParenthesis();
-  if ((CurrentToken() == Token::kLBRACE) ||
-      (CurrentToken() == Token::kARROW) ||
-      (is_top_level_ && IsSymbol(Symbols::Native())) ||
-      is_external ||
-      IsSymbol(Symbols::Async()) ||
-      IsSymbol(Symbols::Sync())) {
+  if ((CurrentToken() == Token::kLBRACE) || (CurrentToken() == Token::kARROW) ||
+      (is_top_level_ && IsSymbol(Symbols::Native())) || is_external ||
+      IsSymbol(Symbols::Async()) || IsSymbol(Symbols::Sync())) {
     return true;
   }
   return false;
@@ -8545,7 +8180,7 @@
     ParseFunctionModifier();
     if ((CurrentToken() == Token::kLBRACE) ||
         (CurrentToken() == Token::kARROW)) {
-       return true;
+      return true;
     }
   }
   return false;
@@ -8560,8 +8195,7 @@
   // Allow const modifier as well when recognizing a for-in statement
   // pattern. We will get an error later if the loop variable is
   // declared with const.
-  if (CurrentToken() == Token::kVAR ||
-      CurrentToken() == Token::kFINAL ||
+  if (CurrentToken() == Token::kVAR || CurrentToken() == Token::kFINAL ||
       CurrentToken() == Token::kCONST) {
     ConsumeToken();
   }
@@ -8582,11 +8216,10 @@
 static bool ContainsAbruptCompletingStatement(SequenceNode* seq);
 
 static bool IsAbruptCompleting(AstNode* statement) {
-  return statement->IsReturnNode() ||
-         statement->IsJumpNode()   ||
-         statement->IsThrowNode()  ||
+  return statement->IsReturnNode() || statement->IsJumpNode() ||
+         statement->IsThrowNode() ||
          (statement->IsSequenceNode() &&
-             ContainsAbruptCompletingStatement(statement->AsSequenceNode()));
+          ContainsAbruptCompletingStatement(statement->AsSequenceNode()));
 }
 
 
@@ -8676,8 +8309,8 @@
     ConsumeToken();
     false_branch = ParseNestedStatement(parsing_loop_body, NULL);
   }
-  AstNode* if_node = new(Z) IfNode(
-      if_pos, cond_expr, true_branch, false_branch);
+  AstNode* if_node =
+      new (Z) IfNode(if_pos, cond_expr, true_branch, false_branch);
   if (label != NULL) {
     current_block_->statements->Add(if_node);
     SequenceNode* sequence = CloseBlock();
@@ -8692,7 +8325,8 @@
 // == operator.
 static bool ImplementsEqualOperator(Zone* zone, const Instance& value) {
   Class& cls = Class::Handle(value.clazz());
-  const Function& equal_op = Function::Handle(zone,
+  const Function& equal_op = Function::Handle(
+      zone,
       Resolver::ResolveDynamicAnyArgs(zone, cls, Symbols::EqualOperator()));
   ASSERT(!equal_op.IsNull());
   cls = equal_op.Owner();
@@ -8763,7 +8397,7 @@
   bool default_seen = false;
   const TokenPosition case_pos = TokenPos();
   // The case expressions node sequence does not own the enclosing scope.
-  SequenceNode* case_expressions = new(Z) SequenceNode(case_pos, NULL);
+  SequenceNode* case_expressions = new (Z) SequenceNode(case_pos, NULL);
   while (CurrentToken() == Token::kCASE || CurrentToken() == Token::kDEFAULT) {
     if (CurrentToken() == Token::kCASE) {
       if (default_seen) {
@@ -8775,10 +8409,10 @@
       ASSERT(expr->IsLiteralNode());
       case_expr_values->Add(expr->AsLiteralNode());
 
-      AstNode* switch_expr_load = new(Z) LoadLocalNode(
-          case_pos, switch_expr_value);
-      AstNode* case_comparison = new(Z) ComparisonNode(
-          expr_pos, Token::kEQ, expr, switch_expr_load);
+      AstNode* switch_expr_load =
+          new (Z) LoadLocalNode(case_pos, switch_expr_value);
+      AstNode* case_comparison =
+          new (Z) ComparisonNode(expr_pos, Token::kEQ, expr, switch_expr_load);
       case_expressions->Add(case_comparison);
     } else {
       if (default_seen) {
@@ -8811,15 +8445,13 @@
       // End of this case clause. If there is a possible fall-through to
       // the next case clause, throw an implicit FallThroughError.
       if (!abrupt_completing_seen) {
-        ArgumentListNode* arguments = new(Z) ArgumentListNode(TokenPos());
-        arguments->Add(new(Z) LiteralNode(
-            TokenPos(),
-            Integer::ZoneHandle(Z, Integer::New(TokenPos().value(),
-                                                Heap::kOld))));
-        current_block_->statements->Add(
-            MakeStaticCall(Symbols::FallThroughError(),
-                           Library::PrivateCoreLibName(Symbols::ThrowNew()),
-                           arguments));
+        ArgumentListNode* arguments = new (Z) ArgumentListNode(TokenPos());
+        arguments->Add(new (Z) LiteralNode(
+            TokenPos(), Integer::ZoneHandle(
+                            Z, Integer::New(TokenPos().value(), Heap::kOld))));
+        current_block_->statements->Add(MakeStaticCall(
+            Symbols::FallThroughError(),
+            Library::PrivateCoreLibName(Symbols::ThrowNew()), arguments));
       }
       break;
     }
@@ -8831,8 +8463,8 @@
     }
   }
   SequenceNode* statements = CloseBlock();
-  return new(Z) CaseNode(case_pos, case_label,
-      case_expressions, default_seen, switch_expr_value, statements);
+  return new (Z) CaseNode(case_pos, case_label, case_expressions, default_seen,
+                          switch_expr_value, statements);
 }
 
 
@@ -8845,8 +8477,8 @@
   ConsumeToken();
   ExpectToken(Token::kLPAREN);
   const TokenPosition expr_pos = TokenPos();
-  AstNode* switch_expr = ParseAwaitableExpr(
-      kAllowConst, kConsumeCascades, NULL);
+  AstNode* switch_expr =
+      ParseAwaitableExpr(kAllowConst, kConsumeCascades, NULL);
   ExpectToken(Token::kRPAREN);
   ExpectToken(Token::kLBRACE);
   OpenBlock();
@@ -8857,16 +8489,15 @@
   // type of the case clause expressions. Therefore, we have to allocate
   // a new type representing dynamic and can't reuse the canonical
   // type object for dynamic.
-  const Type& temp_var_type = Type::ZoneHandle(Z,
-       Type::New(Class::Handle(Z, Object::dynamic_class()),
-                 TypeArguments::Handle(Z),
-                 expr_pos));
+  const Type& temp_var_type =
+      Type::ZoneHandle(Z, Type::New(Class::Handle(Z, Object::dynamic_class()),
+                                    TypeArguments::Handle(Z), expr_pos));
   temp_var_type.SetIsFinalized();
-  LocalVariable* temp_variable = new(Z) LocalVariable(
-      expr_pos, expr_pos,  Symbols::SwitchExpr(), temp_var_type);
+  LocalVariable* temp_variable = new (Z)
+      LocalVariable(expr_pos, expr_pos, Symbols::SwitchExpr(), temp_var_type);
   current_block_->scope->AddVariable(temp_variable);
-  AstNode* save_switch_expr = new(Z) StoreLocalNode(
-      expr_pos, temp_variable, switch_expr);
+  AstNode* save_switch_expr =
+      new (Z) StoreLocalNode(expr_pos, temp_variable, switch_expr);
   current_block_->statements->Add(save_switch_expr);
 
   // Parse case clauses
@@ -8884,8 +8515,8 @@
       case_label = current_block_->scope->LocalLookupLabel(*label_name);
       if (case_label == NULL) {
         // Label does not exist yet. Add it to scope of switch statement.
-        case_label = new(Z) SourceLabel(
-            label_pos, *label_name, SourceLabel::kCase);
+        case_label =
+            new (Z) SourceLabel(label_pos, *label_name, SourceLabel::kCase);
         current_block_->scope->AddLabel(case_label);
       } else if (case_label->kind() == SourceLabel::kForward) {
         // We have seen a 'continue' with this label name. Resolve
@@ -8898,8 +8529,7 @@
       }
       ASSERT(case_label->kind() == SourceLabel::kCase);
     }
-    if (CurrentToken() == Token::kCASE ||
-        CurrentToken() == Token::kDEFAULT) {
+    if (CurrentToken() == Token::kCASE || CurrentToken() == Token::kDEFAULT) {
       if (default_seen) {
         ReportError("no case clauses allowed after default clause");
       }
@@ -8933,7 +8563,7 @@
 
   SequenceNode* switch_body = CloseBlock();
   ExpectToken(Token::kRBRACE);
-  return new(Z) SwitchNode(switch_pos, label, switch_body);
+  return new (Z) SwitchNode(switch_pos, label, switch_body);
 }
 
 
@@ -8945,16 +8575,13 @@
   ConsumeToken();
   ExpectToken(Token::kLPAREN);
   SequenceNode* await_preamble = NULL;
-  AstNode* cond_expr = ParseAwaitableExpr(
-      kAllowConst, kConsumeCascades, &await_preamble);
+  AstNode* cond_expr =
+      ParseAwaitableExpr(kAllowConst, kConsumeCascades, &await_preamble);
   ExpectToken(Token::kRPAREN);
-  const bool parsing_loop_body =  true;
+  const bool parsing_loop_body = true;
   SequenceNode* while_body = ParseNestedStatement(parsing_loop_body, label);
-  WhileNode* while_node = new (Z) WhileNode(while_pos,
-                                            label,
-                                            cond_expr,
-                                            await_preamble,
-                                            while_body);
+  WhileNode* while_node = new (Z)
+      WhileNode(while_pos, label, cond_expr, await_preamble, while_body);
   return while_node;
 }
 
@@ -8965,7 +8592,7 @@
   SourceLabel* label =
       SourceLabel::New(do_pos, label_name, SourceLabel::kDoWhile);
   ConsumeToken();
-  const bool parsing_loop_body =  true;
+  const bool parsing_loop_body = true;
   SequenceNode* dowhile_body = ParseNestedStatement(parsing_loop_body, label);
   ExpectToken(Token::kWHILE);
   ExpectToken(Token::kLPAREN);
@@ -8975,14 +8602,14 @@
       ParseAwaitableExpr(kAllowConst, kConsumeCascades, &await_preamble);
   if (await_preamble != NULL) {
     // Prepend the preamble to the condition.
-    LetNode* await_cond = new(Z) LetNode(expr_pos);
+    LetNode* await_cond = new (Z) LetNode(expr_pos);
     await_cond->AddNode(await_preamble);
     await_cond->AddNode(cond_expr);
     cond_expr = await_cond;
   }
   ExpectToken(Token::kRPAREN);
   ExpectSemicolon();
-  return new(Z) DoWhileNode(do_pos, label, cond_expr, dowhile_body);
+  return new (Z) DoWhileNode(do_pos, label, cond_expr, dowhile_body);
 }
 
 
@@ -8998,11 +8625,10 @@
                                                     LocalScope* scope,
                                                     uint16_t try_index) {
   Zone* zone = thread->zone();
-  const String& async_saved_try_ctx_name = String::ZoneHandle(zone,
-      Symbols::NewFormatted(thread,
-                            "%s%d",
-                            Symbols::AsyncSavedTryCtxVarPrefix().ToCString(),
-                            try_index));
+  const String& async_saved_try_ctx_name = String::ZoneHandle(
+      zone, Symbols::NewFormatted(
+                thread, "%s%d",
+                Symbols::AsyncSavedTryCtxVarPrefix().ToCString(), try_index));
   LocalVariable* var = scope->LocalLookupVariable(async_saved_try_ctx_name);
   ASSERT(var != NULL);
   return var;
@@ -9040,8 +8666,8 @@
       // The block declaring :saved_try_ctx_var variable is the parent of the
       // pushed try block.
       *saved_try_ctx = LookupSavedTryContextVar(scope->parent());
-      *async_saved_try_ctx = LookupAsyncSavedTryContextVar(T,
-          async_temp_scope_, try_index);
+      *async_saved_try_ctx =
+          LookupAsyncSavedTryContextVar(T, async_temp_scope_, try_index);
       if ((try_stack_->outer_try() != NULL) && !try_stack_->inside_finally()) {
         // Collecting the outer try scope is not necessary if we
         // are in a finally block.
@@ -9049,8 +8675,8 @@
         try_index = try_stack_->outer_try()->try_index();
         if (scope->function_level() == current_function_level) {
           *outer_saved_try_ctx = LookupSavedTryContextVar(scope->parent());
-          *outer_async_saved_try_ctx = LookupAsyncSavedTryContextVar(T,
-              async_temp_scope_, try_index);
+          *outer_async_saved_try_ctx =
+              LookupAsyncSavedTryContextVar(T, async_temp_scope_, try_index);
         }
       }
     }
@@ -9058,8 +8684,7 @@
   // An async or async* has an implicitly created try-catch around the
   // function body, so the await or yield inside the async closure should always
   // be created with a try scope.
-  ASSERT((*saved_try_ctx != NULL) ||
-         innermost_function().IsAsyncFunction() ||
+  ASSERT((*saved_try_ctx != NULL) || innermost_function().IsAsyncFunction() ||
          innermost_function().IsAsyncGenerator() ||
          innermost_function().IsSyncGenClosure() ||
          innermost_function().IsSyncGenerator());
@@ -9070,15 +8695,15 @@
 // Used during debugging to insert print in generated dart code.
 AstNode* Parser::DartPrint(const char* str) {
   const Library& lib = Library::Handle(Library::CoreLibrary());
-  const Function& print_fn = Function::ZoneHandle(
-      Z, lib.LookupFunctionAllowPrivate(Symbols::print()));
+  const Function& print_fn =
+      Function::ZoneHandle(Z, lib.LookupFunctionAllowPrivate(Symbols::print()));
   ASSERT(!print_fn.IsNull());
   ArgumentListNode* one_arg =
-      new(Z) ArgumentListNode(TokenPosition::kNoSource);
+      new (Z) ArgumentListNode(TokenPosition::kNoSource);
   String& msg = String::ZoneHandle(Symbols::NewFormatted(T, "%s", str));
-  one_arg->Add(new(Z) LiteralNode(TokenPosition::kNoSource, msg));
+  one_arg->Add(new (Z) LiteralNode(TokenPosition::kNoSource, msg));
   AstNode* print_call =
-      new(Z) StaticCallNode(TokenPosition::kNoSource, print_fn, one_arg);
+      new (Z) StaticCallNode(TokenPosition::kNoSource, print_fn, one_arg);
   return print_call;
 }
 
@@ -9106,15 +8731,15 @@
     ReportError("Loop variable cannot be 'const'");
   }
   bool new_loop_var = false;
-  AbstractType& loop_var_type =  AbstractType::ZoneHandle(Z);
+  AbstractType& loop_var_type = AbstractType::ZoneHandle(Z);
   if (LookaheadToken(1) != Token::kIN) {
     // Declaration of a new loop variable.
     // Delay creation of the local variable until we know its actual
     // position, which is inside the loop body.
     new_loop_var = true;
-    loop_var_type = ParseConstFinalVarOrType(
-       I->type_checks() ? ClassFinalizer::kCanonicalize :
-                                  ClassFinalizer::kIgnore);
+    loop_var_type = ParseConstFinalVarOrType(I->type_checks()
+                                                 ? ClassFinalizer::kCanonicalize
+                                                 : ClassFinalizer::kIgnore);
   }
   TokenPosition loop_var_pos = TokenPos();
   const String* loop_var_name = ExpectIdentifier("variable name expected");
@@ -9140,23 +8765,20 @@
   const Class& stream_iterator_cls =
       Class::ZoneHandle(Z, I->object_store()->stream_iterator_class());
   ASSERT(!stream_iterator_cls.IsNull());
-  const Function& iterator_ctor =
-      Function::ZoneHandle(Z, stream_iterator_cls.LookupFunction(
-          Symbols::StreamIteratorConstructor()));
+  const Function& iterator_ctor = Function::ZoneHandle(
+      Z,
+      stream_iterator_cls.LookupFunction(Symbols::StreamIteratorConstructor()));
   ASSERT(!iterator_ctor.IsNull());
   ArgumentListNode* ctor_args = new (Z) ArgumentListNode(stream_expr_pos);
   ctor_args->Add(stream_expr);
-  ConstructorCallNode* ctor_call =
-      new (Z) ConstructorCallNode(stream_expr_pos,
-                              TypeArguments::ZoneHandle(Z),
-                              iterator_ctor,
-                              ctor_args);
+  ConstructorCallNode* ctor_call = new (Z) ConstructorCallNode(
+      stream_expr_pos, TypeArguments::ZoneHandle(Z), iterator_ctor, ctor_args);
   const AbstractType& iterator_type = Object::dynamic_type();
-  LocalVariable* iterator_var = new(Z) LocalVariable(
+  LocalVariable* iterator_var = new (Z) LocalVariable(
       stream_expr_pos, stream_expr_pos, Symbols::ForInIter(), iterator_type);
   current_block_->scope->AddVariable(iterator_var);
   AstNode* iterator_init =
-      new(Z) StoreLocalNode(stream_expr_pos, iterator_var, ctor_call);
+      new (Z) StoreLocalNode(stream_expr_pos, iterator_var, ctor_call);
   current_block_->statements->Add(iterator_init);
 
   // We need to ensure that the stream is cancelled after the loop.
@@ -9175,11 +8797,8 @@
   LocalVariable* saved_stack_trace_var = NULL;
   SetupExceptionVariables(current_block_->scope,
                           false,  // Do not create the saved_ vars.
-                          &context_var,
-                          &exception_var,
-                          &stack_trace_var,
-                          &saved_exception_var,
-                          &saved_stack_trace_var);
+                          &context_var, &exception_var, &stack_trace_var,
+                          &saved_exception_var, &saved_stack_trace_var);
   OpenBlock();  // try block.
   PushTry(current_block_);
   SetupSavedTryContext(context_var);
@@ -9190,25 +8809,16 @@
   LocalVariable* async_saved_try_ctx;
   LocalVariable* outer_saved_try_ctx;
   LocalVariable* outer_async_saved_try_ctx;
-  CheckAsyncOpInTryBlock(&saved_try_ctx,
-                         &async_saved_try_ctx,
-                         &outer_saved_try_ctx,
-                         &outer_async_saved_try_ctx);
-  ArgumentListNode* no_args = new(Z) ArgumentListNode(stream_expr_pos);
-  AstNode* iterator_moveNext = new(Z) InstanceCallNode(
-      stream_expr_pos,
-      new(Z) LoadLocalNode(stream_expr_pos, iterator_var),
-                           Symbols::MoveNext(),
-                           no_args);
+  CheckAsyncOpInTryBlock(&saved_try_ctx, &async_saved_try_ctx,
+                         &outer_saved_try_ctx, &outer_async_saved_try_ctx);
+  ArgumentListNode* no_args = new (Z) ArgumentListNode(stream_expr_pos);
+  AstNode* iterator_moveNext = new (Z) InstanceCallNode(
+      stream_expr_pos, new (Z) LoadLocalNode(stream_expr_pos, iterator_var),
+      Symbols::MoveNext(), no_args);
   OpenBlock();
-  AstNode* await_moveNext =
-      new(Z) AwaitNode(stream_expr_pos,
-                       iterator_moveNext,
-                       saved_try_ctx,
-                       async_saved_try_ctx,
-                       outer_saved_try_ctx,
-                       outer_async_saved_try_ctx,
-                       current_block_->scope);
+  AstNode* await_moveNext = new (Z) AwaitNode(
+      stream_expr_pos, iterator_moveNext, saved_try_ctx, async_saved_try_ctx,
+      outer_saved_try_ctx, outer_async_saved_try_ctx, current_block_->scope);
   AwaitTransformer at(current_block_->statements, async_temp_scope_);
   await_moveNext = at.Transform(await_moveNext);
   SequenceNode* await_preamble = CloseBlock();
@@ -9224,9 +8834,9 @@
   current_block_->scope->AddLabel(label);
   const TokenPosition loop_var_assignment_pos = TokenPos();
 
-  AstNode* iterator_current = new(Z) InstanceGetterNode(
+  AstNode* iterator_current = new (Z) InstanceGetterNode(
       loop_var_assignment_pos,
-      new(Z) LoadLocalNode(loop_var_assignment_pos, iterator_var),
+      new (Z) LoadLocalNode(loop_var_assignment_pos, iterator_var),
       Symbols::Current());
 
   // Generate assignment of next iterator value to loop variable.
@@ -9237,24 +8847,21 @@
     // Note that the variable token position needs to be inside the
     // loop block, so it gets put in the loop context level.
     LocalVariable* loop_var =
-        new(Z) LocalVariable(loop_var_assignment_pos,
-                             loop_var_assignment_pos,
-                             *loop_var_name,
-                             loop_var_type);
+        new (Z) LocalVariable(loop_var_assignment_pos, loop_var_assignment_pos,
+                              *loop_var_name, loop_var_type);
     if (loop_var_is_final) {
       loop_var->set_is_final();
     }
     current_block_->scope->AddVariable(loop_var);
-    loop_var_assignment = new(Z) StoreLocalNode(
-        loop_var_assignment_pos, loop_var, iterator_current);
+    loop_var_assignment = new (Z)
+        StoreLocalNode(loop_var_assignment_pos, loop_var, iterator_current);
   } else {
     AstNode* loop_var_primary =
         ResolveIdent(loop_var_pos, *loop_var_name, false);
     ASSERT(!loop_var_primary->IsPrimaryNode());
-    loop_var_assignment = CreateAssignmentNode(loop_var_primary,
-                                               iterator_current,
-                                               loop_var_name,
-                                               loop_var_assignment_pos);
+    loop_var_assignment =
+        CreateAssignmentNode(loop_var_primary, iterator_current, loop_var_name,
+                             loop_var_assignment_pos);
     ASSERT(loop_var_assignment != NULL);
   }
   current_block_->statements->Add(loop_var_assignment);
@@ -9272,11 +8879,8 @@
   }
   SequenceNode* for_loop_block = CloseBlock();
 
-  WhileNode* while_node = new (Z) WhileNode(await_for_pos,
-                                            label,
-                                            await_moveNext,
-                                            await_preamble,
-                                            for_loop_block);
+  WhileNode* while_node = new (Z) WhileNode(
+      await_for_pos, label, await_moveNext, await_preamble, for_loop_block);
   // Add the while loop to the try block.
   current_block_->statements->Add(while_node);
   SequenceNode* try_block = CloseBlock();
@@ -9284,12 +8888,11 @@
   // Create an empty "catch all" block that rethrows the current
   // exception and stacktrace.
   try_stack_->enter_catch();
-  SequenceNode* catch_block = new(Z) SequenceNode(await_for_pos, NULL);
+  SequenceNode* catch_block = new (Z) SequenceNode(await_for_pos, NULL);
 
   if (outer_saved_try_ctx != NULL) {
     catch_block->Add(new (Z) StoreLocalNode(
-        TokenPosition::kNoSource,
-        outer_saved_try_ctx,
+        TokenPosition::kNoSource, outer_saved_try_ctx,
         new (Z) LoadLocalNode(TokenPosition::kNoSource,
                               outer_async_saved_try_ctx)));
   }
@@ -9299,16 +8902,16 @@
   // is no code in the catch clause that could suspend the function.
 
   // Rethrow the exception.
-  catch_block->Add(new(Z) ThrowNode(
-      await_for_pos,
-      new(Z) LoadLocalNode(await_for_pos, exception_var),
-      new(Z) LoadLocalNode(await_for_pos, stack_trace_var)));
+  catch_block->Add(new (Z) ThrowNode(
+      await_for_pos, new (Z) LoadLocalNode(await_for_pos, exception_var),
+      new (Z) LoadLocalNode(await_for_pos, stack_trace_var)));
 
   TryStack* try_statement = PopTry();
   const intptr_t try_index = try_statement->try_index();
   TryStack* outer_try = try_stack_;
-  const intptr_t outer_try_index = (outer_try != NULL) ?
-      outer_try->try_index() : CatchClauseNode::kInvalidTryIndex;
+  const intptr_t outer_try_index = (outer_try != NULL)
+                                       ? outer_try->try_index()
+                                       : CatchClauseNode::kInvalidTryIndex;
 
   // The finally block contains a call to cancel the stream.
   // :for-in-iter.cancel();
@@ -9326,28 +8929,24 @@
     // exists.
     if (outer_saved_try_ctx != NULL) {
       current_block_->statements->Add(new (Z) StoreLocalNode(
-          TokenPosition::kNoSource,
-          outer_saved_try_ctx,
+          TokenPosition::kNoSource, outer_saved_try_ctx,
           new (Z) LoadLocalNode(TokenPosition::kNoSource,
                                 outer_async_saved_try_ctx)));
     }
     // :for-in-iter.cancel();
     ArgumentListNode* no_args =
-        new(Z) ArgumentListNode(TokenPosition::kNoSource);
-    current_block_->statements->Add(
-        new(Z) InstanceCallNode(TokenPosition::kNoSource,
-            new(Z) LoadLocalNode(TokenPosition::kNoSource, iterator_var),
-            Symbols::Cancel(),
-            no_args));
+        new (Z) ArgumentListNode(TokenPosition::kNoSource);
+    current_block_->statements->Add(new (Z) InstanceCallNode(
+        TokenPosition::kNoSource,
+        new (Z) LoadLocalNode(TokenPosition::kNoSource, iterator_var),
+        Symbols::Cancel(), no_args));
     finally_clause = CloseBlock();
 
     AstNode* node_to_inline = try_statement->GetNodeToInlineFinally(node_index);
     if (node_to_inline != NULL) {
       InlinedFinallyNode* node =
-          new(Z) InlinedFinallyNode(TokenPosition::kNoSource,
-                                    finally_clause,
-                                    context_var,
-                                    outer_try_index);
+          new (Z) InlinedFinallyNode(TokenPosition::kNoSource, finally_clause,
+                                     context_var, outer_try_index);
       finally_clause = NULL;
       AddFinallyClauseToNode(true, node_to_inline, node);
       node_index++;
@@ -9365,25 +8964,14 @@
   // Catch block handles all exceptions.
   handler_types.SetAt(0, Object::dynamic_type());
 
-  CatchClauseNode* catch_clause = new(Z) CatchClauseNode(await_for_pos,
-      catch_block,
-      handler_types,
-      context_var,
-      exception_var,
-      stack_trace_var,
-      exception_var,
-      stack_trace_var,
-      AllocateTryIndex(),
+  CatchClauseNode* catch_clause = new (Z) CatchClauseNode(
+      await_for_pos, catch_block, handler_types, context_var, exception_var,
+      stack_trace_var, exception_var, stack_trace_var, AllocateTryIndex(),
       true);  // Needs stack trace.
 
   AstNode* try_catch_node =
-      new(Z) TryCatchNode(await_for_pos,
-                         try_block,
-                         context_var,
-                         catch_clause,
-                         finally_clause,
-                         try_index,
-                         finally_clause);
+      new (Z) TryCatchNode(await_for_pos, try_block, context_var, catch_clause,
+                           finally_clause, try_index, finally_clause);
 
   ASSERT(current_block_ == await_for_block);
   await_for_block->statements->Add(try_catch_node);
@@ -9402,7 +8990,7 @@
   const String* loop_var_name = NULL;
   TokenPosition loop_var_pos = TokenPosition::kNoSource;
   bool new_loop_var = false;
-  AbstractType& loop_var_type =  AbstractType::ZoneHandle(Z);
+  AbstractType& loop_var_type = AbstractType::ZoneHandle(Z);
   if (LookaheadToken(1) == Token::kIN) {
     loop_var_pos = TokenPos();
     loop_var_name = ExpectIdentifier("variable name expected");
@@ -9411,9 +8999,9 @@
     // Delay creation of the local variable until we know its actual
     // position, which is inside the loop body.
     new_loop_var = true;
-    loop_var_type = ParseConstFinalVarOrType(
-        I->type_checks() ? ClassFinalizer::kCanonicalize :
-                                   ClassFinalizer::kIgnore);
+    loop_var_type = ParseConstFinalVarOrType(I->type_checks()
+                                                 ? ClassFinalizer::kCanonicalize
+                                                 : ClassFinalizer::kIgnore);
     loop_var_pos = TokenPos();
     loop_var_name = ExpectIdentifier("variable name expected");
   }
@@ -9437,25 +9025,22 @@
   // It is better to leave the iterator untyped and postpone the type error
   // until the loop variable is assigned to.
   const AbstractType& iterator_type = Object::dynamic_type();
-  LocalVariable* iterator_var = new(Z) LocalVariable(
-      collection_pos,
-      collection_pos, Symbols::ForInIter(), iterator_type);
+  LocalVariable* iterator_var = new (Z) LocalVariable(
+      collection_pos, collection_pos, Symbols::ForInIter(), iterator_type);
   current_block_->scope->AddVariable(iterator_var);
 
   // Generate initialization of iterator variable.
-  ArgumentListNode* no_args = new(Z) ArgumentListNode(collection_pos);
-  AstNode* get_iterator = new(Z) InstanceGetterNode(
-      collection_pos, collection_expr, Symbols::Iterator());
+  ArgumentListNode* no_args = new (Z) ArgumentListNode(collection_pos);
+  AstNode* get_iterator = new (Z)
+      InstanceGetterNode(collection_pos, collection_expr, Symbols::Iterator());
   AstNode* iterator_init =
-      new(Z) StoreLocalNode(collection_pos, iterator_var, get_iterator);
+      new (Z) StoreLocalNode(collection_pos, iterator_var, get_iterator);
   current_block_->statements->Add(iterator_init);
 
   // Generate while loop condition.
-  AstNode* iterator_moveNext = new(Z) InstanceCallNode(
-      collection_pos,
-      new(Z) LoadLocalNode(collection_pos, iterator_var),
-      Symbols::MoveNext(),
-      no_args);
+  AstNode* iterator_moveNext = new (Z) InstanceCallNode(
+      collection_pos, new (Z) LoadLocalNode(collection_pos, iterator_var),
+      Symbols::MoveNext(), no_args);
 
   // Parse the for loop body. Ideally, we would use ParseNestedStatement()
   // here, but that does not work well because we have to insert an implicit
@@ -9465,9 +9050,9 @@
   current_block_->scope->AddLabel(label);
   const TokenPosition loop_var_assignment_pos = TokenPos();
 
-  AstNode* iterator_current = new(Z) InstanceGetterNode(
+  AstNode* iterator_current = new (Z) InstanceGetterNode(
       loop_var_assignment_pos,
-      new(Z) LoadLocalNode(loop_var_assignment_pos, iterator_var),
+      new (Z) LoadLocalNode(loop_var_assignment_pos, iterator_var),
       Symbols::Current());
 
   // Generate assignment of next iterator value to loop variable.
@@ -9475,25 +9060,21 @@
   if (new_loop_var) {
     // The for loop variable is new for each iteration.
     // Create a variable and add it to the loop body scope.
-    LocalVariable* loop_var =
-       new(Z) LocalVariable(loop_var_pos,
-                            loop_var_assignment_pos,
-                            *loop_var_name,
-                            loop_var_type);
+    LocalVariable* loop_var = new (Z) LocalVariable(
+        loop_var_pos, loop_var_assignment_pos, *loop_var_name, loop_var_type);
     if (loop_var_is_final) {
       loop_var->set_is_final();
     }
     current_block_->scope->AddVariable(loop_var);
-    loop_var_assignment = new(Z) StoreLocalNode(
-        loop_var_assignment_pos, loop_var, iterator_current);
+    loop_var_assignment = new (Z)
+        StoreLocalNode(loop_var_assignment_pos, loop_var, iterator_current);
   } else {
     AstNode* loop_var_primary =
         ResolveIdent(loop_var_pos, *loop_var_name, false);
     ASSERT(!loop_var_primary->IsPrimaryNode());
-    loop_var_assignment = CreateAssignmentNode(loop_var_primary,
-                                               iterator_current,
-                                               loop_var_name,
-                                               loop_var_assignment_pos);
+    loop_var_assignment =
+        CreateAssignmentNode(loop_var_primary, iterator_current, loop_var_name,
+                             loop_var_assignment_pos);
     ASSERT(loop_var_assignment != NULL);
   }
   current_block_->statements->Add(loop_var_assignment);
@@ -9512,8 +9093,8 @@
 
   SequenceNode* for_loop_statement = CloseBlock();
 
-  AstNode* while_statement = new(Z) WhileNode(
-      forin_pos, label, iterator_moveNext, NULL, for_loop_statement);
+  AstNode* while_statement = new (Z)
+      WhileNode(forin_pos, label, iterator_moveNext, NULL, for_loop_statement);
   current_block_->statements->Add(while_statement);
 
   return CloseBlock();  // Implicit block around while loop.
@@ -9546,8 +9127,8 @@
   AstNode* condition = NULL;
   SequenceNode* condition_preamble = NULL;
   if (CurrentToken() != Token::kSEMICOLON) {
-    condition = ParseAwaitableExpr(
-        kAllowConst, kConsumeCascades, &condition_preamble);
+    condition =
+        ParseAwaitableExpr(kAllowConst, kConsumeCascades, &condition_preamble);
   }
   ExpectSemicolon();
   AstNode* increment = NULL;
@@ -9556,7 +9137,7 @@
     increment = ParseAwaitableExprList();
   }
   ExpectToken(Token::kRPAREN);
-  const bool parsing_loop_body =  true;
+  const bool parsing_loop_body = true;
   SequenceNode* body = ParseNestedStatement(parsing_loop_body, label);
 
   // Check whether any of the variables in the initializer part of
@@ -9566,8 +9147,8 @@
   for (int i = 0; i < init_scope->num_variables(); i++) {
     if (init_scope->VariableAt(i)->is_captured() &&
         (init_scope->VariableAt(i)->owner() == init_scope)) {
-      SequenceNode* incr_sequence = new(Z) SequenceNode(incr_pos, NULL);
-      incr_sequence->Add(new(Z) CloneContextNode(for_pos));
+      SequenceNode* incr_sequence = new (Z) SequenceNode(incr_pos, NULL);
+      incr_sequence->Add(new (Z) CloneContextNode(for_pos));
       if (increment != NULL) {
         incr_sequence->Add(increment);
       }
@@ -9575,14 +9156,10 @@
       break;
     }
   }
-  AstNode* for_node = new(Z) ForNode(
-      for_pos,
-      label,
-      NodeAsSequenceNode(init_pos, initializer, NULL),
-      condition,
-      condition_preamble,
-      NodeAsSequenceNode(incr_pos, increment, NULL),
-      body);
+  AstNode* for_node = new (Z)
+      ForNode(for_pos, label, NodeAsSequenceNode(init_pos, initializer, NULL),
+              condition, condition_preamble,
+              NodeAsSequenceNode(incr_pos, increment, NULL), body);
   current_block_->statements->Add(for_node);
   return CloseBlock();
 }
@@ -9594,13 +9171,11 @@
                                 ArgumentListNode* arguments) {
   const Class& cls = Class::Handle(Z, Library::LookupCoreClass(cls_name));
   ASSERT(!cls.IsNull());
-  const Function& func = Function::ZoneHandle(Z,
-      Resolver::ResolveStatic(cls,
-                              func_name,
-                              arguments->length(),
-                              arguments->names()));
+  const Function& func = Function::ZoneHandle(
+      Z, Resolver::ResolveStatic(cls, func_name, arguments->length(),
+                                 arguments->names()));
   ASSERT(!func.IsNull());
-  return new(Z) StaticCallNode(arguments->token_pos(), func, arguments);
+  return new (Z) StaticCallNode(arguments->token_pos(), func, arguments);
 }
 
 
@@ -9622,13 +9197,16 @@
   const TokenPosition condition_end = TokenPos();
   ExpectToken(Token::kRPAREN);
 
-  ArgumentListNode* arguments = new(Z) ArgumentListNode(condition_pos);
+  ArgumentListNode* arguments = new (Z) ArgumentListNode(condition_pos);
   arguments->Add(condition);
-  arguments->Add(new(Z) LiteralNode(condition_pos,
+  arguments->Add(new (Z) LiteralNode(
+      condition_pos,
       Integer::ZoneHandle(Z, Integer::New(condition_pos.value(), Heap::kOld))));
-  arguments->Add(new(Z) LiteralNode(condition_end,
+  arguments->Add(new (Z) LiteralNode(
+      condition_end,
       Integer::ZoneHandle(Z, Integer::New(condition_end.value(), Heap::kOld))));
-  AstNode* assert_throw = MakeStaticCall(Symbols::AssertionError(),
+  AstNode* assert_throw = MakeStaticCall(
+      Symbols::AssertionError(),
       Library::PrivateCoreLibName(is_const ? Symbols::CheckConstAssertion()
                                            : Symbols::CheckAssertion()),
       arguments);
@@ -9642,22 +9220,18 @@
                                    CatchParamDesc* stack_trace_param,
                                    LocalScope* scope) {
   if (exception_param->name != NULL) {
-    LocalVariable* var = new(Z) LocalVariable(
-        exception_param->token_pos,
-        exception_param->token_pos,
-        *exception_param->name,
-        *exception_param->type);
+    LocalVariable* var = new (Z)
+        LocalVariable(exception_param->token_pos, exception_param->token_pos,
+                      *exception_param->name, *exception_param->type);
     var->set_is_final();
     bool added_to_scope = scope->AddVariable(var);
     ASSERT(added_to_scope);
     exception_param->var = var;
   }
   if (stack_trace_param->name != NULL) {
-    LocalVariable* var = new(Z) LocalVariable(
-        stack_trace_param->token_pos,
-        stack_trace_param->token_pos,
-        *stack_trace_param->name,
-        *stack_trace_param->type);
+    LocalVariable* var = new (Z) LocalVariable(
+        stack_trace_param->token_pos, stack_trace_param->token_pos,
+        *stack_trace_param->name, *stack_trace_param->type);
     var->set_is_final();
     bool added_to_scope = scope->AddVariable(var);
     if (!added_to_scope) {
@@ -9689,17 +9263,15 @@
 
   ASSERT(saved_exception_var != NULL);
   ASSERT(exception_var != NULL);
-  statements->Add(new(Z) StoreLocalNode(
-      TokenPosition::kNoSource,
-      saved_exception_var,
-      new(Z) LoadLocalNode(TokenPosition::kNoSource, exception_var)));
+  statements->Add(new (Z) StoreLocalNode(
+      TokenPosition::kNoSource, saved_exception_var,
+      new (Z) LoadLocalNode(TokenPosition::kNoSource, exception_var)));
 
   ASSERT(saved_stack_trace_var != NULL);
   ASSERT(stack_trace_var != NULL);
-  statements->Add(new(Z) StoreLocalNode(
-      TokenPosition::kNoSource,
-      saved_stack_trace_var,
-      new(Z) LoadLocalNode(TokenPosition::kNoSource, stack_trace_var)));
+  statements->Add(new (Z) StoreLocalNode(
+      TokenPosition::kNoSource, saved_stack_trace_var,
+      new (Z) LoadLocalNode(TokenPosition::kNoSource, stack_trace_var)));
 }
 
 
@@ -9738,24 +9310,20 @@
       if (scope->function_level() == current_block_->scope->function_level()) {
         LocalVariable* saved_try_ctx =
             LookupSavedTryContextVar(scope->parent());
-        LocalVariable* async_saved_try_ctx = LookupAsyncSavedTryContextVar(T,
-            async_temp_scope_, try_stack_->try_index());
-        current_block_->statements->Add(
-            new (Z) StoreLocalNode(
-                TokenPosition::kNoSource,
-                saved_try_ctx,
-                new (Z) LoadLocalNode(TokenPosition::kNoSource,
-                                      async_saved_try_ctx)));
+        LocalVariable* async_saved_try_ctx = LookupAsyncSavedTryContextVar(
+            T, async_temp_scope_, try_stack_->try_index());
+        current_block_->statements->Add(new (Z) StoreLocalNode(
+            TokenPosition::kNoSource, saved_try_ctx,
+            new (Z)
+                LoadLocalNode(TokenPosition::kNoSource, async_saved_try_ctx)));
       }
     }
     // We need to save the exception variables as in catch clauses, whether
     // there is an outer try or not. Note that this is only necessary if the
     // finally clause contains an await or yield.
     // TODO(hausner): Optimize.
-    SaveExceptionAndStacktrace(current_block_->statements,
-                               exception_var,
-                               stack_trace_var,
-                               rethrow_exception_var,
+    SaveExceptionAndStacktrace(current_block_->statements, exception_var,
+                               stack_trace_var, rethrow_exception_var,
                                rethrow_stack_trace_var);
   }
 
@@ -9773,7 +9341,7 @@
 
 void Parser::PushTry(Block* try_block) {
   intptr_t try_index = AllocateTryIndex();
-  try_stack_ = new(Z) TryStack(try_block, try_stack_, try_index);
+  try_stack_ = new (Z) TryStack(try_block, try_stack_, try_index);
 }
 
 
@@ -9792,7 +9360,7 @@
   const intptr_t func_level = FunctionLevel();
   TryStack* iterator = try_stack_;
   while ((iterator != NULL) &&
-      (iterator->try_block()->scope->function_level() == func_level)) {
+         (iterator->try_block()->scope->function_level() == func_level)) {
     // For continue and break node check if the target label is in scope.
     if (node->IsJumpNode()) {
       SourceLabel* label = node->AsJumpNode()->label();
@@ -9873,8 +9441,8 @@
     CatchParamDesc stack_trace_param;
     if (IsSymbol(Symbols::On())) {
       ConsumeToken();
-      exception_param.type = &AbstractType::ZoneHandle(Z,
-          ParseType(ClassFinalizer::kCanonicalize));
+      exception_param.type = &AbstractType::ZoneHandle(
+          Z, ParseType(ClassFinalizer::kCanonicalize));
     } else {
       exception_param.type = &Object::dynamic_type();
     }
@@ -9907,9 +9475,9 @@
       // Generate code to load the exception object (:exception_var) into
       // the exception variable specified in this block.
       ASSERT(exception_var != NULL);
-      current_block_->statements->Add(new(Z) StoreLocalNode(
-          catch_pos, exception_param.var, new(Z) LoadLocalNode(
-              catch_pos, exception_var)));
+      current_block_->statements->Add(new (Z) StoreLocalNode(
+          catch_pos, exception_param.var,
+          new (Z) LoadLocalNode(catch_pos, exception_var)));
     }
     if (stack_trace_param.var != NULL) {
       // A stack trace variable is specified in this block, so generate code
@@ -9917,9 +9485,9 @@
       // trace variable specified in this block.
       *needs_stack_trace = true;
       ASSERT(stack_trace_var != NULL);
-      current_block_->statements->Add(new(Z) StoreLocalNode(
-          catch_pos, stack_trace_param.var, new(Z) LoadLocalNode(
-              catch_pos, stack_trace_var)));
+      current_block_->statements->Add(new (Z) StoreLocalNode(
+          catch_pos, stack_trace_param.var,
+          new (Z) LoadLocalNode(catch_pos, stack_trace_var)));
     }
 
     // Add nested block with user-defined code.  This block allows
@@ -9929,18 +9497,17 @@
     current_block_->statements->Add(ParseNestedStatement(false, NULL));
     catch_blocks.Add(CloseBlock());
 
-    const bool is_bad_type =
-        exception_param.type->IsMalformed() ||
-        exception_param.type->IsMalbounded();
+    const bool is_bad_type = exception_param.type->IsMalformed() ||
+                             exception_param.type->IsMalbounded();
     if (exception_param.type->IsDynamicType() || is_bad_type) {
       // There is no exception type or else it is malformed or malbounded.
       // In the first case, unconditionally execute the catch body.  In the
       // second case, unconditionally throw.
       generic_catch_seen = true;
-      type_tests.Add(new(Z) LiteralNode(catch_pos, Bool::True()));
+      type_tests.Add(new (Z) LiteralNode(catch_pos, Bool::True()));
       if (is_bad_type) {
         // Replace the body with one that throws.
-        SequenceNode* block = new(Z) SequenceNode(catch_pos, NULL);
+        SequenceNode* block = new (Z) SequenceNode(catch_pos, NULL);
         block->Add(ThrowTypeError(catch_pos, *exception_param.type));
         catch_blocks.Last() = block;
       }
@@ -9951,20 +9518,19 @@
     } else {
       // Has a type specification that is not malformed or malbounded.  Now
       // form an 'if type check' to guard the catch handler code.
-      if (!exception_param.type->IsInstantiated() &&
-          (FunctionLevel() > 0)) {
+      if (!exception_param.type->IsInstantiated() && (FunctionLevel() > 0)) {
         // Make sure that the instantiator is captured.
         CaptureInstantiator();
       }
-      TypeNode* exception_type = new(Z) TypeNode(
-          catch_pos, *exception_param.type);
-      AstNode* exception_value = new(Z) LoadLocalNode(
-          catch_pos, exception_var);
+      TypeNode* exception_type =
+          new (Z) TypeNode(catch_pos, *exception_param.type);
+      AstNode* exception_value =
+          new (Z) LoadLocalNode(catch_pos, exception_var);
       if (!exception_type->type().IsInstantiated()) {
         EnsureExpressionTemp();
       }
-      type_tests.Add(new(Z) ComparisonNode(
-          catch_pos, Token::kIS, exception_value, exception_type));
+      type_tests.Add(new (Z) ComparisonNode(catch_pos, Token::kIS,
+                                            exception_value, exception_type));
 
       // Do not add uninstantiated types (e.g. type parameter T or generic
       // type List<T>), since the debugger won't be able to instantiate it
@@ -9994,11 +9560,10 @@
     // An await cannot possibly be executed inbetween the catch entry and here,
     // therefore, it is safe to rethrow the stack-based :exception_var instead
     // of the captured copy :saved_exception_var.
-    current = new(Z) SequenceNode(handler_pos, NULL);
-    current->Add(new(Z) ThrowNode(
-        handler_pos,
-        new(Z) LoadLocalNode(handler_pos, exception_var),
-        new(Z) LoadLocalNode(handler_pos, stack_trace_var)));
+    current = new (Z) SequenceNode(handler_pos, NULL);
+    current->Add(new (Z) ThrowNode(
+        handler_pos, new (Z) LoadLocalNode(handler_pos, exception_var),
+        new (Z) LoadLocalNode(handler_pos, stack_trace_var)));
   } else if (type_tests.Last()->IsLiteralNode()) {
     ASSERT(type_tests.Last()->AsLiteralNode()->literal().raw() ==
            Bool::True().raw());
@@ -10015,7 +9580,7 @@
   while (!type_tests.is_empty()) {
     AstNode* type_test = type_tests.RemoveLast();
     SequenceNode* catch_block = catch_blocks.RemoveLast();
-    current_block_->statements->Add(new(Z) IfNode(
+    current_block_->statements->Add(new (Z) IfNode(
         type_test->token_pos(), type_test, catch_block, current));
     current = CloseBlock();
   }
@@ -10023,28 +9588,23 @@
   // the catch clauses.
   if (is_async && (current != NULL)) {
     ASSERT(try_stack_ != NULL);
-    SequenceNode* async_code = new(Z) SequenceNode(handler_pos, NULL);
+    SequenceNode* async_code = new (Z) SequenceNode(handler_pos, NULL);
     const TryStack* try_block = try_stack_->outer_try();
     if (try_block != NULL) {
       LocalScope* scope = try_block->try_block()->scope;
       if (scope->function_level() == current_block_->scope->function_level()) {
         LocalVariable* saved_try_ctx =
             LookupSavedTryContextVar(scope->parent());
-        LocalVariable* async_saved_try_ctx = LookupAsyncSavedTryContextVar(T,
-            async_temp_scope_, try_block->try_index());
-        async_code->Add(
-            new (Z) StoreLocalNode(
-                TokenPosition::kNoSource,
-                saved_try_ctx,
-                new (Z) LoadLocalNode(TokenPosition::kNoSource,
-                                      async_saved_try_ctx)));
+        LocalVariable* async_saved_try_ctx = LookupAsyncSavedTryContextVar(
+            T, async_temp_scope_, try_block->try_index());
+        async_code->Add(new (Z) StoreLocalNode(
+            TokenPosition::kNoSource, saved_try_ctx,
+            new (Z)
+                LoadLocalNode(TokenPosition::kNoSource, async_saved_try_ctx)));
       }
     }
-    SaveExceptionAndStacktrace(async_code,
-                               exception_var,
-                               stack_trace_var,
-                               rethrow_exception_var,
-                               rethrow_stack_trace_var);
+    SaveExceptionAndStacktrace(async_code, exception_var, stack_trace_var,
+                               rethrow_exception_var, rethrow_stack_trace_var);
     // The async_code node sequence contains code to restore the context (if
     // an outer try block is present) and code to save the exception and
     // stack trace variables.
@@ -10058,23 +9618,19 @@
 
 
 void Parser::SetupSavedTryContext(LocalVariable* saved_try_context) {
-  const String& async_saved_try_ctx_name = String::ZoneHandle(Z,
-      Symbols::NewFormatted(T,
-                            "%s%d",
-                            Symbols::AsyncSavedTryCtxVarPrefix().ToCString(),
-                            last_used_try_index_ - 1));
-  LocalVariable* async_saved_try_ctx = new (Z) LocalVariable(
-      TokenPosition::kNoSource,
-      TokenPosition::kNoSource,
-      async_saved_try_ctx_name,
-      Object::dynamic_type());
+  const String& async_saved_try_ctx_name = String::ZoneHandle(
+      Z, Symbols::NewFormatted(T, "%s%d",
+                               Symbols::AsyncSavedTryCtxVarPrefix().ToCString(),
+                               last_used_try_index_ - 1));
+  LocalVariable* async_saved_try_ctx =
+      new (Z) LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
+                            async_saved_try_ctx_name, Object::dynamic_type());
   ASSERT(async_temp_scope_ != NULL);
   async_temp_scope_->AddVariable(async_saved_try_ctx);
   ASSERT(saved_try_context != NULL);
-  current_block_->statements->Add(new(Z) StoreLocalNode(
-      TokenPosition::kNoSource,
-      async_saved_try_ctx,
-      new(Z) LoadLocalNode(TokenPosition::kNoSource, saved_try_context)));
+  current_block_->statements->Add(new (Z) StoreLocalNode(
+      TokenPosition::kNoSource, async_saved_try_ctx,
+      new (Z) LoadLocalNode(TokenPosition::kNoSource, saved_try_context)));
 }
 
 
@@ -10105,50 +9661,40 @@
   // Consecutive try statements share the same set of variables.
   *context_var = try_scope->LocalLookupVariable(Symbols::SavedTryContextVar());
   if (*context_var == NULL) {
-    *context_var = new(Z) LocalVariable(
-        TokenPos(),
-        TokenPos(),
-        Symbols::SavedTryContextVar(),
-        Object::dynamic_type());
+    *context_var = new (Z)
+        LocalVariable(TokenPos(), TokenPos(), Symbols::SavedTryContextVar(),
+                      Object::dynamic_type());
     try_scope->AddVariable(*context_var);
   }
   *exception_var = try_scope->LocalLookupVariable(Symbols::ExceptionVar());
   if (*exception_var == NULL) {
-    *exception_var = new(Z) LocalVariable(
-        TokenPos(),
-        TokenPos(),
-        Symbols::ExceptionVar(),
-        Object::dynamic_type());
+    *exception_var =
+        new (Z) LocalVariable(TokenPos(), TokenPos(), Symbols::ExceptionVar(),
+                              Object::dynamic_type());
     try_scope->AddVariable(*exception_var);
   }
   *stack_trace_var = try_scope->LocalLookupVariable(Symbols::StackTraceVar());
   if (*stack_trace_var == NULL) {
-    *stack_trace_var = new(Z) LocalVariable(
-        TokenPos(),
-        TokenPos(),
-        Symbols::StackTraceVar(),
-        Object::dynamic_type());
+    *stack_trace_var =
+        new (Z) LocalVariable(TokenPos(), TokenPos(), Symbols::StackTraceVar(),
+                              Object::dynamic_type());
     try_scope->AddVariable(*stack_trace_var);
   }
   if (is_async) {
-    *saved_exception_var = try_scope->LocalLookupVariable(
-        Symbols::SavedExceptionVar());
+    *saved_exception_var =
+        try_scope->LocalLookupVariable(Symbols::SavedExceptionVar());
     if (*saved_exception_var == NULL) {
-      *saved_exception_var = new(Z) LocalVariable(
-          TokenPos(),
-          TokenPos(),
-          Symbols::SavedExceptionVar(),
-          Object::dynamic_type());
+      *saved_exception_var = new (Z)
+          LocalVariable(TokenPos(), TokenPos(), Symbols::SavedExceptionVar(),
+                        Object::dynamic_type());
       try_scope->AddVariable(*saved_exception_var);
     }
-    *saved_stack_trace_var = try_scope->LocalLookupVariable(
-        Symbols::SavedStackTraceVar());
+    *saved_stack_trace_var =
+        try_scope->LocalLookupVariable(Symbols::SavedStackTraceVar());
     if (*saved_stack_trace_var == NULL) {
-      *saved_stack_trace_var = new(Z) LocalVariable(
-          TokenPos(),
-          TokenPos(),
-          Symbols::SavedStackTraceVar(),
-          Object::dynamic_type());
+      *saved_stack_trace_var = new (Z)
+          LocalVariable(TokenPos(), TokenPos(), Symbols::SavedStackTraceVar(),
+                        Object::dynamic_type());
       try_scope->AddVariable(*saved_stack_trace_var);
     }
   }
@@ -10177,13 +9723,9 @@
   LocalVariable* stack_trace_var = NULL;
   LocalVariable* saved_exception_var = NULL;
   LocalVariable* saved_stack_trace_var = NULL;
-  SetupExceptionVariables(current_block_->scope,
-                          is_async,
-                          &context_var,
-                          &exception_var,
-                          &stack_trace_var,
-                          &saved_exception_var,
-                          &saved_stack_trace_var);
+  SetupExceptionVariables(current_block_->scope, is_async, &context_var,
+                          &exception_var, &stack_trace_var,
+                          &saved_exception_var, &saved_stack_trace_var);
 
   ConsumeToken();  // Consume the 'try'.
 
@@ -10212,20 +9754,17 @@
       GrowableObjectArray::Handle(Z, GrowableObjectArray::New(Heap::kOld));
   bool needs_stack_trace = false;
   SequenceNode* catch_handler_list =
-      ParseCatchClauses(handler_pos,
-                        is_async,
-                        exception_var,
-                        stack_trace_var,
+      ParseCatchClauses(handler_pos, is_async, exception_var, stack_trace_var,
                         is_async ? saved_exception_var : exception_var,
                         is_async ? saved_stack_trace_var : stack_trace_var,
-                        handler_types,
-                        &needs_stack_trace);
+                        handler_types, &needs_stack_trace);
 
   TryStack* try_statement = PopTry();
   const intptr_t try_index = try_statement->try_index();
   TryStack* outer_try = try_stack_;
-  const intptr_t outer_try_index = (outer_try != NULL) ?
-      outer_try->try_index() : CatchClauseNode::kInvalidTryIndex;
+  const intptr_t outer_try_index = (outer_try != NULL)
+                                       ? outer_try->try_index()
+                                       : CatchClauseNode::kInvalidTryIndex;
 
   // Finally, parse or generate the 'finally' clause.
   // A finally clause is required in async code to restore the saved try context
@@ -10244,28 +9783,20 @@
     AstNode* node_to_inline = try_statement->GetNodeToInlineFinally(node_index);
     while (node_to_inline != NULL) {
       finally_clause = EnsureFinallyClause(
-          parse,
-          is_async,
-          exception_var,
-          stack_trace_var,
+          parse, is_async, exception_var, stack_trace_var,
           is_async ? saved_exception_var : exception_var,
           is_async ? saved_stack_trace_var : stack_trace_var);
-      InlinedFinallyNode* node = new(Z) InlinedFinallyNode(finally_pos,
-                                                           finally_clause,
-                                                           context_var,
-                                                           outer_try_index);
+      InlinedFinallyNode* node = new (Z) InlinedFinallyNode(
+          finally_pos, finally_clause, context_var, outer_try_index);
       AddFinallyClauseToNode(is_async, node_to_inline, node);
       node_index += 1;
       node_to_inline = try_statement->GetNodeToInlineFinally(node_index);
       tokens_iterator_.SetCurrentPosition(finally_pos);
     }
-    finally_clause = EnsureFinallyClause(
-        parse,
-        is_async,
-        exception_var,
-        stack_trace_var,
-        is_async ? saved_exception_var : exception_var,
-        is_async ? saved_stack_trace_var : stack_trace_var);
+    finally_clause =
+        EnsureFinallyClause(parse, is_async, exception_var, stack_trace_var,
+                            is_async ? saved_exception_var : exception_var,
+                            is_async ? saved_stack_trace_var : stack_trace_var);
     if (finally_clause != NULL) {
       // Re-parse to create a duplicate of finally clause to avoid unintended
       // sharing of try-indices if the finally-block contains a try-catch.
@@ -10274,34 +9805,28 @@
       // non-exception case (see EffectGraphVisitor::VisitTryCatchNode)
       tokens_iterator_.SetCurrentPosition(finally_pos);
       rethrow_clause = EnsureFinallyClause(
-          parse,
-          is_async,
-          exception_var,
-          stack_trace_var,
+          parse, is_async, exception_var, stack_trace_var,
           is_async ? saved_exception_var : exception_var,
           is_async ? saved_stack_trace_var : stack_trace_var);
     }
   }
 
-  CatchClauseNode* catch_clause = new(Z) CatchClauseNode(
-      handler_pos,
-      catch_handler_list,
-      Array::ZoneHandle(Z, Array::MakeArray(handler_types)),
-      context_var,
-      exception_var,
-      stack_trace_var,
+  CatchClauseNode* catch_clause = new (Z) CatchClauseNode(
+      handler_pos, catch_handler_list,
+      Array::ZoneHandle(Z, Array::MakeArray(handler_types)), context_var,
+      exception_var, stack_trace_var,
       is_async ? saved_exception_var : exception_var,
       is_async ? saved_stack_trace_var : stack_trace_var,
-      (finally_clause != NULL) ?
-          AllocateTryIndex() : CatchClauseNode::kInvalidTryIndex,
+      (finally_clause != NULL) ? AllocateTryIndex()
+                               : CatchClauseNode::kInvalidTryIndex,
       needs_stack_trace);
 
   // Now create the try/catch ast node and return it. If there is a label
   // on the try/catch, close the block that's embedding the try statement
   // and attach the label to it.
-  AstNode* try_catch_node = new(Z) TryCatchNode(
-      try_pos, try_block, context_var, catch_clause, finally_clause, try_index,
-      rethrow_clause);
+  AstNode* try_catch_node =
+      new (Z) TryCatchNode(try_pos, try_block, context_var, catch_clause,
+                           finally_clause, try_index, rethrow_clause);
 
   if (try_label != NULL) {
     current_block_->statements->Add(try_catch_node);
@@ -10343,8 +9868,8 @@
       LocalScope* switch_scope = current_block_->scope->LookupSwitchScope();
       if (switch_scope != NULL) {
         // We found a switch scope. Enter a forward reference to the label.
-        target = new(Z) SourceLabel(
-            TokenPos(), target_name, SourceLabel::kForward);
+        target =
+            new (Z) SourceLabel(TokenPos(), target_name, SourceLabel::kForward);
         switch_scope->AddLabel(target);
       }
     }
@@ -10354,7 +9879,7 @@
   } else if (FLAG_enable_debug_break && (CurrentToken() == Token::kSTRING)) {
     const char* message = strdup(CurrentLiteral()->ToCString());
     ConsumeToken();
-    return new(Z) StopNode(jump_pos, message);
+    return new (Z) StopNode(jump_pos, message);
   } else {
     target = current_block_->scope->LookupInnermostLabel(jump_kind);
     if (target == NULL) {
@@ -10377,7 +9902,7 @@
     ReportError(jump_pos, "'%s' target must be in same function context",
                 Token::Str(jump_kind));
   }
-  return new(Z) JumpNode(jump_pos, jump_kind, target);
+  return new (Z) JumpNode(jump_pos, jump_kind, target);
 }
 
 
@@ -10398,7 +9923,7 @@
 
   AstNode* expr = ParseAwaitableExpr(kAllowConst, kConsumeCascades, NULL);
 
-  LetNode* yield = new(Z) LetNode(yield_pos);
+  LetNode* yield = new (Z) LetNode(yield_pos);
   if (innermost_function().IsSyncGenerator() ||
       innermost_function().IsSyncGenClosure()) {
     // Yield statement in sync* function.
@@ -10408,31 +9933,25 @@
     ASSERT(iterator_param != NULL);
     // Generate :iterator.current = expr;
     AstNode* iterator =
-        new(Z) LoadLocalNode(TokenPosition::kNoSource, iterator_param);
-    AstNode* store_current =
-        new(Z) InstanceSetterNode(TokenPosition::kNoSource,
-                                  iterator,
-                                  Library::PrivateCoreLibName(
-                                      Symbols::_current()),
-                                  expr);
+        new (Z) LoadLocalNode(TokenPosition::kNoSource, iterator_param);
+    AstNode* store_current = new (Z) InstanceSetterNode(
+        TokenPosition::kNoSource, iterator,
+        Library::PrivateCoreLibName(Symbols::_current()), expr);
     yield->AddNode(store_current);
     if (is_yield_each) {
       // Generate :iterator.isYieldEach = true;
-      AstNode* set_is_yield_each =
-          new(Z) InstanceSetterNode(TokenPosition::kNoSource,
-              iterator,
-              String::ZoneHandle(Symbols::IsYieldEach().raw()),
-              new(Z) LiteralNode(TokenPos(), Bool::True()));
+      AstNode* set_is_yield_each = new (Z)
+          InstanceSetterNode(TokenPosition::kNoSource, iterator,
+                             String::ZoneHandle(Symbols::IsYieldEach().raw()),
+                             new (Z) LiteralNode(TokenPos(), Bool::True()));
       yield->AddNode(set_is_yield_each);
     }
-    AwaitMarkerNode* await_marker =
-        new(Z) AwaitMarkerNode(async_temp_scope_,
-                               current_block_->scope,
-                               TokenPosition::kNoSource);
+    AwaitMarkerNode* await_marker = new (Z) AwaitMarkerNode(
+        async_temp_scope_, current_block_->scope, TokenPosition::kNoSource);
     yield->AddNode(await_marker);
     // Return true to indicate that a value has been generated.
-    ReturnNode* return_true = new(Z) ReturnNode(yield_pos,
-        new(Z) LiteralNode(TokenPos(), Bool::True()));
+    ReturnNode* return_true = new (Z)
+        ReturnNode(yield_pos, new (Z) LiteralNode(TokenPos(), Bool::True()));
     return_true->set_return_type(ReturnNode::kContinuationTarget);
     yield->AddNode(return_true);
 
@@ -10443,20 +9962,16 @@
     LocalVariable* async_saved_try_ctx;
     LocalVariable* outer_saved_try_ctx;
     LocalVariable* outer_async_saved_try_ctx;
-    CheckAsyncOpInTryBlock(&saved_try_ctx,
-                           &async_saved_try_ctx,
-                           &outer_saved_try_ctx,
-                           &outer_async_saved_try_ctx);
+    CheckAsyncOpInTryBlock(&saved_try_ctx, &async_saved_try_ctx,
+                           &outer_saved_try_ctx, &outer_async_saved_try_ctx);
     if (saved_try_ctx != NULL) {
       yield->AddNode(new (Z) StoreLocalNode(
-          TokenPosition::kNoSource,
-          saved_try_ctx,
-          new (Z) LoadLocalNode(TokenPosition::kNoSource,
-                                async_saved_try_ctx)));
+          TokenPosition::kNoSource, saved_try_ctx,
+          new (Z)
+              LoadLocalNode(TokenPosition::kNoSource, async_saved_try_ctx)));
       if (outer_saved_try_ctx != NULL) {
         yield->AddNode(new (Z) StoreLocalNode(
-            TokenPosition::kNoSource,
-            outer_saved_try_ctx,
+            TokenPosition::kNoSource, outer_saved_try_ctx,
             new (Z) LoadLocalNode(TokenPosition::kNoSource,
                                   outer_async_saved_try_ctx)));
       }
@@ -10471,13 +9986,12 @@
     LocalVariable* controller_var = LookupLocalScope(Symbols::Controller());
     ASSERT(controller_var != NULL);
     // :controller.add[Stream](expr);
-    ArgumentListNode* add_args = new(Z) ArgumentListNode(yield_pos);
+    ArgumentListNode* add_args = new (Z) ArgumentListNode(yield_pos);
     add_args->Add(expr);
-    AstNode* add_call =
-        new(Z) InstanceCallNode(yield_pos,
-            new(Z) LoadLocalNode(TokenPosition::kNoSource, controller_var),
-            is_yield_each ? Symbols::AddStream() : Symbols::add(),
-            add_args);
+    AstNode* add_call = new (Z) InstanceCallNode(
+        yield_pos,
+        new (Z) LoadLocalNode(TokenPosition::kNoSource, controller_var),
+        is_yield_each ? Symbols::AddStream() : Symbols::add(), add_args);
 
     // if (:controller.add[Stream](expr)) {
     //   return;
@@ -10487,20 +10001,18 @@
     // restore saved_try_context
 
     SequenceNode* true_branch =
-        new(Z) SequenceNode(TokenPosition::kNoSource, NULL);
-    AstNode* return_from_generator = new(Z) ReturnNode(yield_pos);
+        new (Z) SequenceNode(TokenPosition::kNoSource, NULL);
+    AstNode* return_from_generator = new (Z) ReturnNode(yield_pos);
     true_branch->Add(return_from_generator);
     AddNodeForFinallyInlining(return_from_generator);
     AstNode* if_is_cancelled =
-       new(Z) IfNode(TokenPosition::kNoSource, add_call, true_branch, NULL);
+        new (Z) IfNode(TokenPosition::kNoSource, add_call, true_branch, NULL);
     yield->AddNode(if_is_cancelled);
 
-    AwaitMarkerNode* await_marker =
-        new(Z) AwaitMarkerNode(async_temp_scope_,
-                               current_block_->scope,
-                               TokenPosition::kNoSource);
+    AwaitMarkerNode* await_marker = new (Z) AwaitMarkerNode(
+        async_temp_scope_, current_block_->scope, TokenPosition::kNoSource);
     yield->AddNode(await_marker);
-    ReturnNode* continuation_return = new(Z) ReturnNode(yield_pos);
+    ReturnNode* continuation_return = new (Z) ReturnNode(yield_pos);
     continuation_return->set_return_type(ReturnNode::kContinuationTarget);
     yield->AddNode(continuation_return);
 
@@ -10511,20 +10023,16 @@
     LocalVariable* async_saved_try_ctx;
     LocalVariable* outer_saved_try_ctx;
     LocalVariable* outer_async_saved_try_ctx;
-    CheckAsyncOpInTryBlock(&saved_try_ctx,
-                           &async_saved_try_ctx,
-                           &outer_saved_try_ctx,
-                           &outer_async_saved_try_ctx);
+    CheckAsyncOpInTryBlock(&saved_try_ctx, &async_saved_try_ctx,
+                           &outer_saved_try_ctx, &outer_async_saved_try_ctx);
     if (saved_try_ctx != NULL) {
       yield->AddNode(new (Z) StoreLocalNode(
-          TokenPosition::kNoSource,
-          saved_try_ctx,
-          new (Z) LoadLocalNode(TokenPosition::kNoSource,
-                                async_saved_try_ctx)));
+          TokenPosition::kNoSource, saved_try_ctx,
+          new (Z)
+              LoadLocalNode(TokenPosition::kNoSource, async_saved_try_ctx)));
       if (outer_saved_try_ctx != NULL) {
         yield->AddNode(new (Z) StoreLocalNode(
-            TokenPosition::kNoSource,
-            outer_saved_try_ctx,
+            TokenPosition::kNoSource, outer_saved_try_ctx,
             new (Z) LoadLocalNode(TokenPosition::kNoSource,
                                   outer_async_saved_try_ctx)));
       }
@@ -10577,7 +10085,7 @@
         ReportError(expr_pos,
                     "return of a value is not allowed in constructors");
       } else if (current_function().IsGeneratorClosure() &&
-          (function_level == 0)) {
+                 (function_level == 0)) {
         ReportError(expr_pos, "generator functions may not return a value");
       }
       AstNode* expr = ParseAwaitableExpr(kAllowConst, kConsumeCascades, NULL);
@@ -10601,46 +10109,37 @@
           if (!result_type_args.IsNull() && (result_type_args.Length() == 1)) {
             const AbstractType& result_type_arg =
                 AbstractType::ZoneHandle(Z, result_type_args.TypeAt(0));
-            LetNode* checked_expr = new(Z) LetNode(expr_pos);
+            LetNode* checked_expr = new (Z) LetNode(expr_pos);
             LocalVariable* temp = checked_expr->AddInitializer(expr);
             temp->set_is_final();
             const AbstractType& future_type =
                 AbstractType::ZoneHandle(Z, future_class.RareType());
-            AstNode* is_future = new(Z) LoadLocalNode(expr_pos, temp);
-            is_future = new(Z) ComparisonNode(expr_pos,
-                                              Token::kIS,
-                                              is_future,
-                                              new(Z) TypeNode(expr_pos,
-                                                              future_type));
-            AstNode* as_future_t = new(Z) LoadLocalNode(expr_pos, temp);
-            as_future_t = new(Z) AssignableNode(expr_pos,
-                                                as_future_t,
-                                                result_type,
-                                                Symbols::FunctionResult());
-            AstNode* as_t = new(Z) LoadLocalNode(expr_pos, temp);
-            as_t = new(Z) AssignableNode(expr_pos,
-                                         as_t,
-                                         result_type_arg,
-                                         Symbols::FunctionResult());
-            checked_expr->AddNode(new(Z) ConditionalExprNode(expr_pos,
-                                                             is_future,
-                                                             as_future_t,
-                                                             as_t));
+            AstNode* is_future = new (Z) LoadLocalNode(expr_pos, temp);
+            is_future =
+                new (Z) ComparisonNode(expr_pos, Token::kIS, is_future,
+                                       new (Z) TypeNode(expr_pos, future_type));
+            AstNode* as_future_t = new (Z) LoadLocalNode(expr_pos, temp);
+            as_future_t = new (Z) AssignableNode(
+                expr_pos, as_future_t, result_type, Symbols::FunctionResult());
+            AstNode* as_t = new (Z) LoadLocalNode(expr_pos, temp);
+            as_t = new (Z) AssignableNode(expr_pos, as_t, result_type_arg,
+                                          Symbols::FunctionResult());
+            checked_expr->AddNode(new (Z) ConditionalExprNode(
+                expr_pos, is_future, as_future_t, as_t));
             expr = checked_expr;
           }
         }
       }
-      statement = new(Z) ReturnNode(statement_pos, expr);
+      statement = new (Z) ReturnNode(statement_pos, expr);
     } else {
-      if (current_function().IsSyncGenClosure() &&
-          (FunctionLevel() == 0)) {
+      if (current_function().IsSyncGenClosure() && (FunctionLevel() == 0)) {
         // In a synchronous generator, return without an expression
         // returns false, signaling that the iterator terminates and
         // did not yield a value.
-        statement = new(Z) ReturnNode(statement_pos,
-            new(Z) LiteralNode(return_pos, Bool::False()));
+        statement = new (Z) ReturnNode(
+            statement_pos, new (Z) LiteralNode(return_pos, Bool::False()));
       } else {
-        statement = new(Z) ReturnNode(statement_pos);
+        statement = new (Z) ReturnNode(statement_pos);
       }
     }
     AddNodeForFinallyInlining(statement);
@@ -10722,10 +10221,9 @@
     ASSERT(excp_var != NULL);
     ASSERT(trace_var != NULL);
 
-    statement = new(Z) ThrowNode(
-        statement_pos,
-        new(Z) LoadLocalNode(statement_pos, excp_var),
-        new(Z) LoadLocalNode(statement_pos, trace_var));
+    statement = new (Z)
+        ThrowNode(statement_pos, new (Z) LoadLocalNode(statement_pos, excp_var),
+                  new (Z) LoadLocalNode(statement_pos, trace_var));
   } else {
     statement = ParseAwaitableExpr(kAllowConst, kConsumeCascades, NULL);
     ExpectSemicolon();
@@ -10741,8 +10239,10 @@
 
 
 void Parser::ReportErrors(const Error& prev_error,
-                          const Script& script, TokenPosition token_pos,
-                          const char* format, ...) {
+                          const Script& script,
+                          TokenPosition token_pos,
+                          const char* format,
+                          ...) {
   va_list args;
   va_start(args, format);
   Report::LongJumpV(prev_error, script, token_pos, format, args);
@@ -10752,11 +10252,12 @@
 
 
 void Parser::ReportError(TokenPosition token_pos,
-                         const char* format, ...) const {
+                         const char* format,
+                         ...) const {
   va_list args;
   va_start(args, format);
-  Report::MessageV(Report::kError,
-                   script_, token_pos, Report::AtLocation, format, args);
+  Report::MessageV(Report::kError, script_, token_pos, Report::AtLocation,
+                   format, args);
   va_end(args);
   UNREACHABLE();
 }
@@ -10765,9 +10266,8 @@
 void Parser::ReportErrorBefore(const char* format, ...) {
   va_list args;
   va_start(args, format);
-  Report::MessageV(Report::kError,
-                   script_, PrevTokenPos(), Report::AfterLocation,
-                   format, args);
+  Report::MessageV(Report::kError, script_, PrevTokenPos(),
+                   Report::AfterLocation, format, args);
   va_end(args);
   UNREACHABLE();
 }
@@ -10776,19 +10276,20 @@
 void Parser::ReportError(const char* format, ...) const {
   va_list args;
   va_start(args, format);
-  Report::MessageV(Report::kError,
-                   script_, TokenPos(), Report::AtLocation, format, args);
+  Report::MessageV(Report::kError, script_, TokenPos(), Report::AtLocation,
+                   format, args);
   va_end(args);
   UNREACHABLE();
 }
 
 
 void Parser::ReportWarning(TokenPosition token_pos,
-                           const char* format, ...) const {
+                           const char* format,
+                           ...) const {
   va_list args;
   va_start(args, format);
-  Report::MessageV(Report::kWarning,
-                   script_, token_pos, Report::AtLocation, format, args);
+  Report::MessageV(Report::kWarning, script_, token_pos, Report::AtLocation,
+                   format, args);
   va_end(args);
 }
 
@@ -10796,8 +10297,8 @@
 void Parser::ReportWarning(const char* format, ...) const {
   va_list args;
   va_start(args, format);
-  Report::MessageV(Report::kWarning,
-                   script_, TokenPos(), Report::AtLocation, format, args);
+  Report::MessageV(Report::kWarning, script_, TokenPos(), Report::AtLocation,
+                   format, args);
   va_end(args);
 }
 
@@ -10830,9 +10331,9 @@
 
 
 void Parser::UnexpectedToken() {
-  ReportError("unexpected token '%s'",
-              CurrentToken() == Token::kIDENT ?
-                  CurrentLiteral()->ToCString() : Token::Str(CurrentToken()));
+  ReportError("unexpected token '%s'", CurrentToken() == Token::kIDENT
+                                           ? CurrentLiteral()->ToCString()
+                                           : Token::Str(CurrentToken()));
 }
 
 
@@ -10862,13 +10363,13 @@
 
 bool Parser::IsAwaitKeyword() {
   return (FLAG_await_is_keyword || await_is_keyword_) &&
-      IsSymbol(Symbols::Await());
+         IsSymbol(Symbols::Await());
 }
 
 
 bool Parser::IsYieldKeyword() {
   return (FLAG_await_is_keyword || await_is_keyword_) &&
-      IsSymbol(Symbols::YieldKw());
+         IsSymbol(Symbols::YieldKw());
 }
 
 
@@ -10878,8 +10379,7 @@
 
 
 static bool IsPrefixOperator(Token::Kind token) {
-  return (token == Token::kSUB) ||
-         (token == Token::kNOT) ||
+  return (token == Token::kSUB) || (token == Token::kNOT) ||
          (token == Token::kBIT_NOT);
 }
 
@@ -10902,28 +10402,28 @@
 AstNode* Parser::ThrowTypeError(TokenPosition type_pos,
                                 const AbstractType& type,
                                 LibraryPrefix* prefix) {
-  ArgumentListNode* arguments = new(Z) ArgumentListNode(type_pos);
+  ArgumentListNode* arguments = new (Z) ArgumentListNode(type_pos);
 
   String& method_name = String::Handle(Z);
   if (prefix == NULL) {
     method_name = Library::PrivateCoreLibName(Symbols::ThrowNew()).raw();
   } else {
-    arguments->Add(new(Z) LiteralNode(type_pos, *prefix));
-    method_name = Library::PrivateCoreLibName(
-        Symbols::ThrowNewIfNotLoaded()).raw();
+    arguments->Add(new (Z) LiteralNode(type_pos, *prefix));
+    method_name =
+        Library::PrivateCoreLibName(Symbols::ThrowNewIfNotLoaded()).raw();
   }
   // Location argument.
-  arguments->Add(new(Z) LiteralNode(
-      type_pos, Integer::ZoneHandle(Z, Integer::New(type_pos.value(),
-                                                    Heap::kOld))));
+  arguments->Add(new (Z) LiteralNode(
+      type_pos,
+      Integer::ZoneHandle(Z, Integer::New(type_pos.value(), Heap::kOld))));
   // Src value argument.
-  arguments->Add(new(Z) LiteralNode(type_pos, Object::null_instance()));
+  arguments->Add(new (Z) LiteralNode(type_pos, Object::null_instance()));
   // Dst type argument.
-  arguments->Add(new(Z) LiteralNode(type_pos, type));
+  arguments->Add(new (Z) LiteralNode(type_pos, type));
   // Dst name argument.
-  arguments->Add(new(Z) LiteralNode(type_pos, Symbols::Empty()));
+  arguments->Add(new (Z) LiteralNode(type_pos, Symbols::Empty()));
   // Bound error msg argument.
-  arguments->Add(new(Z) LiteralNode(type_pos, Object::null_instance()));
+  arguments->Add(new (Z) LiteralNode(type_pos, Object::null_instance()));
   return MakeStaticCall(Symbols::TypeError(), method_name, arguments);
 }
 
@@ -10937,31 +10437,31 @@
                                         InvocationMirror::Type im_type,
                                         const Function* func,
                                         const LibraryPrefix* prefix) {
-  ArgumentListNode* arguments = new(Z) ArgumentListNode(call_pos);
+  ArgumentListNode* arguments = new (Z) ArgumentListNode(call_pos);
 
   String& method_name = String::Handle(Z);
   if (prefix == NULL) {
     method_name = Library::PrivateCoreLibName(Symbols::ThrowNew()).raw();
   } else {
-    arguments->Add(new(Z) LiteralNode(call_pos, *prefix));
-    method_name = Library::PrivateCoreLibName(
-        Symbols::ThrowNewIfNotLoaded()).raw();
+    arguments->Add(new (Z) LiteralNode(call_pos, *prefix));
+    method_name =
+        Library::PrivateCoreLibName(Symbols::ThrowNewIfNotLoaded()).raw();
   }
   // Object receiver.
   // If the function is external and dynamic, pass the actual receiver,
   // otherwise, pass a class literal of the unresolved method's owner.
-  if ((func != NULL) && !func->IsNull() &&
-      func->is_external() && !func->is_static()) {
+  if ((func != NULL) && !func->IsNull() && func->is_external() &&
+      !func->is_static()) {
     arguments->Add(LoadReceiver(func->token_pos()));
   } else {
     AbstractType& type = AbstractType::ZoneHandle(Z);
     type ^= Type::New(cls, TypeArguments::Handle(Z), call_pos, Heap::kOld);
-    type ^= ClassFinalizer::FinalizeType(
-        current_class(), type, ClassFinalizer::kCanonicalize);
-    arguments->Add(new(Z) LiteralNode(call_pos, type));
+    type ^= ClassFinalizer::FinalizeType(current_class(), type,
+                                         ClassFinalizer::kCanonicalize);
+    arguments->Add(new (Z) LiteralNode(call_pos, type));
   }
   // String memberName.
-  arguments->Add(new(Z) LiteralNode(
+  arguments->Add(new (Z) LiteralNode(
       call_pos, String::ZoneHandle(Z, Symbols::New(T, function_name))));
   // Smi invocation_type.
   if (cls.IsTopLevel()) {
@@ -10969,23 +10469,23 @@
            im_call == InvocationMirror::kTopLevel);
     im_call = InvocationMirror::kTopLevel;
   }
-  arguments->Add(new(Z) LiteralNode(call_pos, Smi::ZoneHandle(Z,
-      Smi::New(InvocationMirror::EncodeType(im_call, im_type)))));
+  arguments->Add(new (Z) LiteralNode(
+      call_pos, Smi::ZoneHandle(Z, Smi::New(InvocationMirror::EncodeType(
+                                       im_call, im_type)))));
   // List arguments.
   if (function_arguments == NULL) {
-    arguments->Add(new(Z) LiteralNode(call_pos, Object::null_array()));
+    arguments->Add(new (Z) LiteralNode(call_pos, Object::null_array()));
   } else {
-    ArrayNode* array = new(Z) ArrayNode(
-        call_pos,
-        Type::ZoneHandle(Z, Type::ArrayType()),
-        function_arguments->nodes());
+    ArrayNode* array =
+        new (Z) ArrayNode(call_pos, Type::ZoneHandle(Z, Type::ArrayType()),
+                          function_arguments->nodes());
     arguments->Add(array);
   }
   // List argumentNames.
   if (function_arguments == NULL) {
-    arguments->Add(new(Z) LiteralNode(call_pos, Object::null_array()));
+    arguments->Add(new (Z) LiteralNode(call_pos, Object::null_array()));
   } else {
-    arguments->Add(new(Z) LiteralNode(call_pos, function_arguments->names()));
+    arguments->Add(new (Z) LiteralNode(call_pos, function_arguments->names()));
   }
 
   // List existingArgumentNames.
@@ -11017,7 +10517,7 @@
     array = Array::New(1, Heap::kOld);
     array.SetAt(0, String::Handle(Z, function.UserVisibleFormalParameters()));
   }
-  arguments->Add(new(Z) LiteralNode(call_pos, array));
+  arguments->Add(new (Z) LiteralNode(call_pos, array));
 
   return MakeStaticCall(Symbols::NoSuchMethodError(), method_name, arguments);
 }
@@ -11047,13 +10547,13 @@
           op_kind = Token::kISNOT;
         }
         const TokenPosition type_pos = TokenPos();
-        const AbstractType& type = AbstractType::ZoneHandle(Z,
-            ParseType(ClassFinalizer::kCanonicalize));
+        const AbstractType& type = AbstractType::ZoneHandle(
+            Z, ParseType(ClassFinalizer::kCanonicalize));
         if (!type.IsInstantiated() && (FunctionLevel() > 0)) {
           // Make sure that the instantiator is captured.
           CaptureInstantiator();
         }
-        right_operand = new(Z) TypeNode(type_pos, type);
+        right_operand = new (Z) TypeNode(type_pos, type);
         // In production mode, the type may be malformed.
         // In checked mode, the type may be malformed or malbounded.
         if (type.IsMalformedOrMalbounded()) {
@@ -11061,23 +10561,23 @@
           // a type cast even if the tested value is null.
           // We need to evaluate the left operand for potential
           // side effects.
-          LetNode* let = new(Z) LetNode(left_operand->token_pos());
+          LetNode* let = new (Z) LetNode(left_operand->token_pos());
           let->AddNode(left_operand);
           let->AddNode(ThrowTypeError(type_pos, type));
           left_operand = let;
           break;  // Type checks and casts can't be chained.
         }
       }
-      if (Token::IsRelationalOperator(op_kind)
-          || Token::IsTypeTestOperator(op_kind)
-          || Token::IsTypeCastOperator(op_kind)
-          || Token::IsEqualityOperator(op_kind)) {
-        left_operand = new(Z) ComparisonNode(
-            op_pos, op_kind, left_operand, right_operand);
+      if (Token::IsRelationalOperator(op_kind) ||
+          Token::IsTypeTestOperator(op_kind) ||
+          Token::IsTypeCastOperator(op_kind) ||
+          Token::IsEqualityOperator(op_kind)) {
+        left_operand = new (Z)
+            ComparisonNode(op_pos, op_kind, left_operand, right_operand);
         break;  // Equality and relational operators cannot be chained.
       } else {
-        left_operand = OptimizeBinaryOpNode(
-            op_pos, op_kind, left_operand, right_operand);
+        left_operand =
+            OptimizeBinaryOpNode(op_pos, op_kind, left_operand, right_operand);
       }
     }
     current_preced--;
@@ -11089,21 +10589,21 @@
 AstNode* Parser::ParseAwaitableExprList() {
   TRACE_PARSER("ParseAwaitableExprList");
   SequenceNode* preamble = NULL;
-  AstNode* expressions = ParseAwaitableExpr(
-      kAllowConst, kConsumeCascades, &preamble);
+  AstNode* expressions =
+      ParseAwaitableExpr(kAllowConst, kConsumeCascades, &preamble);
   if (preamble != NULL) {
     preamble->Add(expressions);
     expressions = preamble;
   }
   if (CurrentToken() == Token::kCOMMA) {
     // Collect comma-separated expressions in a non scope owning sequence node.
-    SequenceNode* list = new(Z) SequenceNode(TokenPos(), NULL);
+    SequenceNode* list = new (Z) SequenceNode(TokenPos(), NULL);
     list->Add(expressions);
     while (CurrentToken() == Token::kCOMMA) {
       ConsumeToken();
       preamble = NULL;
-      AstNode* expr = ParseAwaitableExpr(
-          kAllowConst, kConsumeCascades, &preamble);
+      AstNode* expr =
+          ParseAwaitableExpr(kAllowConst, kConsumeCascades, &preamble);
       if (preamble != NULL) {
         list->Add(preamble);
       }
@@ -11125,10 +10625,8 @@
                                                const char* s) {
   char name[64];
   OS::SNPrint(name, 64, ":%s%" Pd "", s, token_pos.value());
-  LocalVariable* temp = new(Z) LocalVariable(
-      token_pos,
-      token_pos,
-      String::ZoneHandle(Z, Symbols::New(T, name)),
+  LocalVariable* temp = new (Z) LocalVariable(
+      token_pos, token_pos, String::ZoneHandle(Z, Symbols::New(T, name)),
       Object::dynamic_type());
   temp->set_is_final();
   current_block_->scope->AddVariable(temp);
@@ -11148,9 +10646,9 @@
       double left_double = Double::Cast(lhs_literal->literal()).value();
       double right_double = Double::Cast(rhs_literal->literal()).value();
       if (binary_op == Token::kDIV) {
-        const Double& dbl_obj = Double::ZoneHandle(Z,
-            Double::NewCanonical((left_double / right_double)));
-        return new(Z) LiteralNode(op_pos, dbl_obj);
+        const Double& dbl_obj = Double::ZoneHandle(
+            Z, Double::NewCanonical((left_double / right_double)));
+        return new (Z) LiteralNode(op_pos, dbl_obj);
       }
     }
   }
@@ -11166,33 +10664,28 @@
   if (binary_op == Token::kIFNULL) {
     // Handle a ?? b.
     if ((lhs->EvalConstExpr() != NULL) && (rhs->EvalConstExpr() != NULL)) {
-      Instance& expr_value = Instance::ZoneHandle(Z,
-          EvaluateConstExpr(lhs->token_pos(), lhs).raw());
+      Instance& expr_value = Instance::ZoneHandle(
+          Z, EvaluateConstExpr(lhs->token_pos(), lhs).raw());
       if (expr_value.IsNull()) {
         expr_value = EvaluateConstExpr(rhs->token_pos(), rhs).raw();
       }
-      return new(Z) LiteralNode(op_pos, expr_value);
+      return new (Z) LiteralNode(op_pos, expr_value);
     }
 
-    LetNode* result = new(Z) LetNode(op_pos);
+    LetNode* result = new (Z) LetNode(op_pos);
     LocalVariable* left_temp = result->AddInitializer(lhs);
     left_temp->set_is_final();
     const TokenPosition no_pos = TokenPosition::kNoSource;
     LiteralNode* null_operand =
-        new(Z) LiteralNode(no_pos, Object::null_instance());
-    LoadLocalNode* load_left_temp = new(Z) LoadLocalNode(no_pos, left_temp);
-    ComparisonNode* null_compare =
-        new(Z) ComparisonNode(no_pos,
-                              Token::kNE_STRICT,
-                              load_left_temp,
-                              null_operand);
-    result->AddNode(new(Z) ConditionalExprNode(op_pos,
-                                               null_compare,
-                                               load_left_temp,
-                                               rhs));
+        new (Z) LiteralNode(no_pos, Object::null_instance());
+    LoadLocalNode* load_left_temp = new (Z) LoadLocalNode(no_pos, left_temp);
+    ComparisonNode* null_compare = new (Z)
+        ComparisonNode(no_pos, Token::kNE_STRICT, load_left_temp, null_operand);
+    result->AddNode(
+        new (Z) ConditionalExprNode(op_pos, null_compare, load_left_temp, rhs));
     return result;
   }
-  return new(Z) BinaryOpNode(op_pos, binary_op, lhs, rhs);
+  return new (Z) BinaryOpNode(op_pos, binary_op, lhs, rhs);
 }
 
 
@@ -11205,29 +10698,29 @@
     case Token::kASSIGN:
       return rhs;
     case Token::kASSIGN_ADD:
-      return new(Z) BinaryOpNode(op_pos, Token::kADD, lhs, rhs);
+      return new (Z) BinaryOpNode(op_pos, Token::kADD, lhs, rhs);
     case Token::kASSIGN_SUB:
-      return new(Z) BinaryOpNode(op_pos, Token::kSUB, lhs, rhs);
+      return new (Z) BinaryOpNode(op_pos, Token::kSUB, lhs, rhs);
     case Token::kASSIGN_MUL:
-      return new(Z) BinaryOpNode(op_pos, Token::kMUL, lhs, rhs);
+      return new (Z) BinaryOpNode(op_pos, Token::kMUL, lhs, rhs);
     case Token::kASSIGN_TRUNCDIV:
-      return new(Z) BinaryOpNode(op_pos, Token::kTRUNCDIV, lhs, rhs);
+      return new (Z) BinaryOpNode(op_pos, Token::kTRUNCDIV, lhs, rhs);
     case Token::kASSIGN_DIV:
-      return new(Z) BinaryOpNode(op_pos, Token::kDIV, lhs, rhs);
+      return new (Z) BinaryOpNode(op_pos, Token::kDIV, lhs, rhs);
     case Token::kASSIGN_MOD:
-      return new(Z) BinaryOpNode(op_pos, Token::kMOD, lhs, rhs);
+      return new (Z) BinaryOpNode(op_pos, Token::kMOD, lhs, rhs);
     case Token::kASSIGN_SHR:
-      return new(Z) BinaryOpNode(op_pos, Token::kSHR, lhs, rhs);
+      return new (Z) BinaryOpNode(op_pos, Token::kSHR, lhs, rhs);
     case Token::kASSIGN_SHL:
-      return new(Z) BinaryOpNode(op_pos, Token::kSHL, lhs, rhs);
+      return new (Z) BinaryOpNode(op_pos, Token::kSHL, lhs, rhs);
     case Token::kASSIGN_OR:
-      return new(Z) BinaryOpNode(op_pos, Token::kBIT_OR, lhs, rhs);
+      return new (Z) BinaryOpNode(op_pos, Token::kBIT_OR, lhs, rhs);
     case Token::kASSIGN_AND:
-      return new(Z) BinaryOpNode(op_pos, Token::kBIT_AND, lhs, rhs);
+      return new (Z) BinaryOpNode(op_pos, Token::kBIT_AND, lhs, rhs);
     case Token::kASSIGN_XOR:
-      return new(Z) BinaryOpNode(op_pos, Token::kBIT_XOR, lhs, rhs);
+      return new (Z) BinaryOpNode(op_pos, Token::kBIT_XOR, lhs, rhs);
     case Token::kASSIGN_COND:
-      return new(Z) BinaryOpNode(op_pos, Token::kIFNULL, lhs, rhs);
+      return new (Z) BinaryOpNode(op_pos, Token::kIFNULL, lhs, rhs);
     default:
       ReportError(op_pos,
                   "internal error: ExpandAssignableOp '%s' unimplemented",
@@ -11247,31 +10740,28 @@
   if (expr->EvalConstExpr() == NULL) {
     ReportError(expr_pos, "expression is not a valid compile-time constant");
   }
-  return new(Z) LiteralNode(expr_pos, EvaluateConstExpr(expr_pos, expr));
+  return new (Z) LiteralNode(expr_pos, EvaluateConstExpr(expr_pos, expr));
 }
 
 
 LetNode* Parser::PrepareCompoundAssignmentNodes(AstNode** expr) {
   AstNode* node = *expr;
   TokenPosition token_pos = node->token_pos();
-  LetNode* result = new(Z) LetNode(token_pos);
+  LetNode* result = new (Z) LetNode(token_pos);
   if (node->IsLoadIndexedNode()) {
     LoadIndexedNode* load_indexed = node->AsLoadIndexedNode();
     AstNode* array = load_indexed->array();
     AstNode* index = load_indexed->index_expr();
     if (!IsSimpleLocalOrLiteralNode(load_indexed->array())) {
       LocalVariable* t0 = result->AddInitializer(load_indexed->array());
-      array = new(Z) LoadLocalNode(token_pos, t0);
+      array = new (Z) LoadLocalNode(token_pos, t0);
     }
     if (!IsSimpleLocalOrLiteralNode(load_indexed->index_expr())) {
-      LocalVariable* t1 = result->AddInitializer(
-          load_indexed->index_expr());
-      index = new(Z) LoadLocalNode(token_pos, t1);
+      LocalVariable* t1 = result->AddInitializer(load_indexed->index_expr());
+      index = new (Z) LoadLocalNode(token_pos, t1);
     }
-    *expr = new(Z) LoadIndexedNode(token_pos,
-                                   array,
-                                   index,
-                                   load_indexed->super_class());
+    *expr = new (Z)
+        LoadIndexedNode(token_pos, array, index, load_indexed->super_class());
     return result;
   }
   if (node->IsInstanceGetterNode()) {
@@ -11279,9 +10769,9 @@
     AstNode* receiver = getter->receiver();
     if (!IsSimpleLocalOrLiteralNode(getter->receiver())) {
       LocalVariable* t0 = result->AddInitializer(getter->receiver());
-      receiver = new(Z) LoadLocalNode(token_pos, t0);
+      receiver = new (Z) LoadLocalNode(token_pos, t0);
     }
-    *expr = new(Z) InstanceGetterNode(
+    *expr = new (Z) InstanceGetterNode(
         token_pos, receiver, getter->field_name(), getter->is_conditional());
     return result;
   }
@@ -11324,28 +10814,25 @@
       name = Symbols::New(T, original->AsTypeNode()->TypeName());
     } else if (original->IsLoadStaticFieldNode()) {
       name = original->AsLoadStaticFieldNode()->field().name();
-      target_cls = &Class::Handle(Z,
-          original->AsLoadStaticFieldNode()->field().Owner());
+      target_cls =
+          &Class::Handle(Z, original->AsLoadStaticFieldNode()->field().Owner());
     } else if ((left_ident != NULL) &&
-               (original->IsLiteralNode() ||
-                original->IsLoadLocalNode())) {
+               (original->IsLiteralNode() || original->IsLoadLocalNode())) {
       name = left_ident->raw();
     }
     if (name.IsNull()) {
       ReportError(left_pos, "expression is not assignable");
     }
     ArgumentListNode* error_arguments =
-        new(Z) ArgumentListNode(rhs->token_pos());
+        new (Z) ArgumentListNode(rhs->token_pos());
     error_arguments->Add(rhs);
-    result = ThrowNoSuchMethodError(
-         original->token_pos(),
-         *target_cls,
-         String::Handle(Z, Field::SetterName(name)),
-         error_arguments,
-         InvocationMirror::kStatic,
-         original->IsLoadLocalNode() ?
-         InvocationMirror::kLocalVar : InvocationMirror::kSetter,
-         NULL);  // No existing function.
+    result = ThrowNoSuchMethodError(original->token_pos(), *target_cls,
+                                    String::Handle(Z, Field::SetterName(name)),
+                                    error_arguments, InvocationMirror::kStatic,
+                                    original->IsLoadLocalNode()
+                                        ? InvocationMirror::kLocalVar
+                                        : InvocationMirror::kSetter,
+                                    NULL);  // No existing function.
   }
   // The compound assignment operator a ??= b is different from other
   // a op= b assignments. If a is non-null, the assignment to a must be
@@ -11353,19 +10840,13 @@
   // normally: a op= b ==> a = a op b
   // however:  a ??= b ==> a ?? (a = b)
   // Therefore, we need to transform a = (a ?? b) into a ?? (a = b)
-  if (is_compound &&
-      rhs->IsBinaryOpNode() &&
+  if (is_compound && rhs->IsBinaryOpNode() &&
       (rhs->AsBinaryOpNode()->kind() == Token::kIFNULL)) {
     BinaryOpNode* ifnull = rhs->AsBinaryOpNode();
     AstNode* modified_assign =
-        CreateAssignmentNode(original,
-                             ifnull->right(),
-                             left_ident,
-                             left_pos);
-    result = OptimizeBinaryOpNode(ifnull->token_pos(),
-                                  ifnull->kind(),
-                                  ifnull->left(),
-                                  modified_assign);
+        CreateAssignmentNode(original, ifnull->right(), left_ident, left_pos);
+    result = OptimizeBinaryOpNode(ifnull->token_pos(), ifnull->kind(),
+                                  ifnull->left(), modified_assign);
   }
   return result;
 }
@@ -11373,12 +10854,12 @@
 
 AstNode* Parser::ParseCascades(AstNode* expr) {
   TokenPosition cascade_pos = TokenPos();
-  LetNode* cascade = new(Z) LetNode(cascade_pos);
+  LetNode* cascade = new (Z) LetNode(cascade_pos);
   LocalVariable* cascade_receiver_var = cascade->AddInitializer(expr);
   while (CurrentToken() == Token::kCASCADE) {
     cascade_pos = TokenPos();
     LoadLocalNode* load_cascade_receiver =
-        new(Z) LoadLocalNode(cascade_pos, cascade_receiver_var);
+        new (Z) LoadLocalNode(cascade_pos, cascade_receiver_var);
     if (Token::IsIdentifier(LookaheadToken(1))) {
       // Replace .. with . for ParseSelectors().
       token_kind_ = Token::kPERIOD;
@@ -11423,7 +10904,7 @@
   }
   // The result is an expression with the (side effects of the) cascade
   // sequence followed by the (value of the) receiver temp variable load.
-  cascade->AddNode(new(Z) LoadLocalNode(cascade_pos, cascade_receiver_var));
+  cascade->AddNode(new (Z) LoadLocalNode(cascade_pos, cascade_receiver_var));
   return cascade;
 }
 
@@ -11436,9 +10917,8 @@
         !expr->AsLoadStaticFieldNode()->is_deferred_reference()) {
       ASSERT(field.StaticValue() != Object::sentinel().raw());
       ASSERT(field.StaticValue() != Object::transition_sentinel().raw());
-      return new(zone) LiteralNode(
-          expr->token_pos(),
-          Instance::ZoneHandle(zone, field.StaticValue()));
+      return new (zone) LiteralNode(
+          expr->token_pos(), Instance::ZoneHandle(zone, field.StaticValue()));
     }
   }
   return expr;
@@ -11489,7 +10969,7 @@
       ReportError("expression expected after throw");
     }
     AstNode* expr = ParseExpr(require_compiletime_const, consume_cascades);
-    return new(Z) ThrowNode(expr_pos, expr, NULL);
+    return new (Z) ThrowNode(expr_pos, expr, NULL);
   }
 
   if (require_compiletime_const) {
@@ -11498,7 +10978,7 @@
     Instance& existing_const = Instance::ZoneHandle(Z);
     if (GetCachedConstant(expr_pos, &existing_const)) {
       SkipConditionalExpr();
-      return new(Z) LiteralNode(expr_pos, existing_const);
+      return new (Z) LiteralNode(expr_pos, existing_const);
     }
   }
 
@@ -11568,7 +11048,7 @@
     AstNode* expr1 = ParseExpr(kAllowConst, kNoCascades);
     ExpectToken(Token::kCOLON);
     AstNode* expr2 = ParseExpr(kAllowConst, kNoCascades);
-    expr = new(Z) ConditionalExprNode(expr_pos, expr, expr1, expr2);
+    expr = new (Z) ConditionalExprNode(expr_pos, expr, expr1, expr2);
   }
   return expr;
 }
@@ -11593,17 +11073,11 @@
     LocalVariable* async_saved_try_ctx;
     LocalVariable* outer_saved_try_ctx;
     LocalVariable* outer_async_saved_try_ctx;
-    CheckAsyncOpInTryBlock(&saved_try_ctx,
-                           &async_saved_try_ctx,
-                           &outer_saved_try_ctx,
-                           &outer_async_saved_try_ctx);
-    expr = new (Z) AwaitNode(op_pos,
-                             ParseUnaryExpr(),
-                             saved_try_ctx,
-                             async_saved_try_ctx,
-                             outer_saved_try_ctx,
-                             outer_async_saved_try_ctx,
-                             current_block_->scope);
+    CheckAsyncOpInTryBlock(&saved_try_ctx, &async_saved_try_ctx,
+                           &outer_saved_try_ctx, &outer_async_saved_try_ctx);
+    expr = new (Z) AwaitNode(op_pos, ParseUnaryExpr(), saved_try_ctx,
+                             async_saved_try_ctx, outer_saved_try_ctx,
+                             outer_async_saved_try_ctx, current_block_->scope);
   } else if (IsPrefixOperator(CurrentToken())) {
     Token::Kind unary_op = CurrentToken();
     if (unary_op == Token::kSUB) {
@@ -11630,11 +11104,9 @@
     LetNode* let_expr = PrepareCompoundAssignmentNodes(&expr);
     Token::Kind binary_op =
         (incr_op == Token::kINCR) ? Token::kADD : Token::kSUB;
-    BinaryOpNode* add = new(Z) BinaryOpNode(
-        op_pos,
-        binary_op,
-        expr,
-        new(Z) LiteralNode(op_pos, Smi::ZoneHandle(Z, Smi::New(1))));
+    BinaryOpNode* add = new (Z) BinaryOpNode(
+        op_pos, binary_op, expr,
+        new (Z) LiteralNode(op_pos, Smi::ZoneHandle(Z, Smi::New(1))));
     AstNode* store =
         CreateAssignmentNode(expr, add, expr_ident, expr_pos, true);
     ASSERT(store != NULL);
@@ -11648,14 +11120,14 @@
 
 
 ArgumentListNode* Parser::ParseActualParameters(
-                              ArgumentListNode* implicit_arguments,
-                              bool require_const) {
+    ArgumentListNode* implicit_arguments,
+    bool require_const) {
   TRACE_PARSER("ParseActualParameters");
   ASSERT(CurrentToken() == Token::kLPAREN);
   const bool saved_mode = SetAllowFunctionLiterals(true);
   ArgumentListNode* arguments;
   if (implicit_arguments == NULL) {
-    arguments = new(Z) ArgumentListNode(TokenPos());
+    arguments = new (Z) ArgumentListNode(TokenPos());
   } else {
     arguments = implicit_arguments;
   }
@@ -11712,11 +11184,9 @@
   ASSERT(CurrentToken() == Token::kLPAREN);
   ArgumentListNode* arguments = ParseActualParameters(NULL, kAllowConst);
   const int num_arguments = arguments->length();
-  const Function& func = Function::ZoneHandle(Z,
-      Resolver::ResolveStatic(cls,
-                              func_name,
-                              num_arguments,
-                              arguments->names()));
+  const Function& func = Function::ZoneHandle(
+      Z, Resolver::ResolveStatic(cls, func_name, num_arguments,
+                                 arguments->names()));
   if (func.IsNull()) {
     // Check if there is a static field of the same name, it could be a closure
     // and so we try and invoke the closure.
@@ -11728,17 +11198,12 @@
       const String& getter_name =
           String::ZoneHandle(Z, Field::GetterName(func_name));
       const int kNumArguments = 0;  // no arguments.
-      func = Resolver::ResolveStatic(cls,
-                                     getter_name,
-                                     kNumArguments,
+      func = Resolver::ResolveStatic(cls, getter_name, kNumArguments,
                                      Object::empty_array());
       if (!func.IsNull()) {
         ASSERT(func.kind() != RawFunction::kImplicitStaticFinalGetter);
-        closure = new(Z) StaticGetterNode(
-            call_pos,
-            NULL,
-            Class::ZoneHandle(Z, cls.raw()),
-            func_name);
+        closure = new (Z) StaticGetterNode(
+            call_pos, NULL, Class::ZoneHandle(Z, cls.raw()), func_name);
         return BuildClosureCall(call_pos, closure, arguments);
       }
     } else {
@@ -11746,16 +11211,12 @@
       return BuildClosureCall(call_pos, closure, arguments);
     }
     // Could not resolve static method: throw a NoSuchMethodError.
-    return ThrowNoSuchMethodError(ident_pos,
-                                  cls,
-                                  func_name,
-                                  arguments,
+    return ThrowNoSuchMethodError(ident_pos, cls, func_name, arguments,
                                   InvocationMirror::kStatic,
                                   InvocationMirror::kMethod,
                                   NULL);  // No existing function.
-  } else if (cls.IsTopLevel() &&
-      (cls.library() == Library::CoreLibrary()) &&
-      (func.name() == Symbols::Identical().raw())) {
+  } else if (cls.IsTopLevel() && (cls.library() == Library::CoreLibrary()) &&
+             (func.name() == Symbols::Identical().raw())) {
     // This is the predefined toplevel function identical(a,b).
     // Create a comparison node instead of a static call to the function.
     ASSERT(num_arguments == 2);
@@ -11771,20 +11232,18 @@
       AstNode* arg1 = arguments->NodeAt(1);
       const Instance* val1 = arg1->EvalConstExpr();
       if ((val1 != NULL) && (val1->IsString())) {
-        arguments->SetNodeAt(0,
-            new(Z) LiteralNode(arg0->token_pos(),
-                               EvaluateConstExpr(arg0->token_pos(), arg0)));
-        arguments->SetNodeAt(1,
-            new(Z) LiteralNode(arg1->token_pos(),
-                               EvaluateConstExpr(arg1->token_pos(), arg1)));
+        arguments->SetNodeAt(
+            0, new (Z) LiteralNode(arg0->token_pos(),
+                                   EvaluateConstExpr(arg0->token_pos(), arg0)));
+        arguments->SetNodeAt(
+            1, new (Z) LiteralNode(arg1->token_pos(),
+                                   EvaluateConstExpr(arg1->token_pos(), arg1)));
       }
     }
-    return new(Z) ComparisonNode(ident_pos,
-                                 Token::kEQ_STRICT,
-                                 arguments->NodeAt(0),
-                                 arguments->NodeAt(1));
+    return new (Z) ComparisonNode(ident_pos, Token::kEQ_STRICT,
+                                  arguments->NodeAt(0), arguments->NodeAt(1));
   }
-  return new(Z) StaticCallNode(ident_pos, func, arguments);
+  return new (Z) StaticCallNode(ident_pos, func, arguments);
 }
 
 
@@ -11795,11 +11254,8 @@
   TRACE_PARSER("ParseInstanceCall");
   CheckToken(Token::kLPAREN);
   ArgumentListNode* arguments = ParseActualParameters(NULL, kAllowConst);
-  return new(Z) InstanceCallNode(ident_pos,
-                                 receiver,
-                                 func_name,
-                                 arguments,
-                                 is_conditional);
+  return new (Z) InstanceCallNode(ident_pos, receiver, func_name, arguments,
+                                  is_conditional);
 }
 
 
@@ -11828,18 +11284,17 @@
   const String& field_name = String::ZoneHandle(Z, field.name());
   const String& getter_name =
       String::Handle(Z, Field::GetterSymbol(field_name));
-  const Function& getter = Function::Handle(Z,
-      field_owner.LookupStaticFunction(getter_name));
+  const Function& getter =
+      Function::Handle(Z, field_owner.LookupStaticFunction(getter_name));
   // Never load field directly if there is a getter (deterministic AST).
   if (getter.IsNull() || field.is_const()) {
-    return new(Z) LoadStaticFieldNode(
-        ident_pos, Field::ZoneHandle(Z, field.raw()));
+    return new (Z)
+        LoadStaticFieldNode(ident_pos, Field::ZoneHandle(Z, field.raw()));
   } else {
     ASSERT(getter.kind() == RawFunction::kImplicitStaticFinalGetter);
-    return new(Z) StaticGetterNode(ident_pos,
-                                   NULL,  // Receiver.
-                                   field_owner,
-                                   field_name);
+    return new (Z) StaticGetterNode(ident_pos,
+                                    NULL,  // Receiver.
+                                    field_owner, field_name);
   }
 }
 
@@ -11866,14 +11321,12 @@
         // Create a getter call, which may later be turned into
         // a setter call, or else the backend will generate
         // a throw NoSuchMethodError().
-        access = new(Z) StaticGetterNode(ident_pos,
-                                         NULL,
-                                         Class::ZoneHandle(Z, cls.raw()),
-                                         field_name);
+        access = new (Z) StaticGetterNode(
+            ident_pos, NULL, Class::ZoneHandle(Z, cls.raw()), field_name);
       }
     } else {
       ASSERT(func.kind() != RawFunction::kImplicitStaticFinalGetter);
-      access = new(Z) StaticGetterNode(
+      access = new (Z) StaticGetterNode(
           ident_pos, NULL, Class::ZoneHandle(Z, cls.raw()), field_name);
     }
   } else {
@@ -11900,11 +11353,10 @@
         String::Cast(Object::ZoneHandle(primary->primary().raw()));
     if (current_function().is_static() ||
         current_function().IsInFactoryScope()) {
-      StaticGetterNode* getter = new(Z) StaticGetterNode(
-          primary->token_pos(),
-          NULL,  // No receiver.
-          Class::ZoneHandle(Z, current_class().raw()),
-          name);
+      StaticGetterNode* getter = new (Z)
+          StaticGetterNode(primary->token_pos(),
+                           NULL,  // No receiver.
+                           Class::ZoneHandle(Z, current_class().raw()), name);
       getter->set_is_deferred(primary->is_deferred_reference());
       return getter;
     } else {
@@ -11964,7 +11416,7 @@
     type_parameter ^= ClassFinalizer::FinalizeType(
         current_class(), type_parameter, ClassFinalizer::kCanonicalize);
     ASSERT(!type_parameter.IsMalformed());
-    return new(Z) TypeNode(primary_pos, type_parameter);
+    return new (Z) TypeNode(primary_pos, type_parameter);
   } else {
     ASSERT(type_parameter.IsFunctionTypeParameter());
     // TODO(regis): Verify that CaptureFunctionInstantiator() was already
@@ -11972,7 +11424,7 @@
     // TODO(regis): Finalize type parameter and return as type node.
     // For now, map to dynamic type.
     Type& type = Type::ZoneHandle(Z, Type::DynamicType());
-    return new(Z) TypeNode(primary_pos, type);
+    return new (Z) TypeNode(primary_pos, type);
   }
 }
 
@@ -12036,10 +11488,8 @@
         }
         if (cls.IsNull()) {
           // Instance field access.
-          selector = new(Z) InstanceGetterNode(ident_pos,
-                                               left,
-                                               *ident,
-                                               is_conditional);
+          selector = new (Z)
+              InstanceGetterNode(ident_pos, left, *ident, is_conditional);
         } else {
           // Static field access.
           selector = GenerateStaticFieldAccess(cls, *ident, ident_pos);
@@ -12070,22 +11520,22 @@
           array = LoadClosure(primary_node);
         } else if (primary_node->primary().IsClass()) {
           const Class& type_class = Class::Cast(primary_node->primary());
-          AbstractType& type = Type::ZoneHandle(Z,
-              Type::New(type_class, TypeArguments::Handle(Z),
-                        primary_pos, Heap::kOld));
-          type ^= ClassFinalizer::FinalizeType(
-              current_class(), type, ClassFinalizer::kCanonicalize);
+          AbstractType& type = Type::ZoneHandle(
+              Z, Type::New(type_class, TypeArguments::Handle(Z), primary_pos,
+                           Heap::kOld));
+          type ^= ClassFinalizer::FinalizeType(current_class(), type,
+                                               ClassFinalizer::kCanonicalize);
           // Type may be malbounded, but not malformed.
           ASSERT(!type.IsMalformed());
-          array = new(Z) TypeNode(primary_pos, type);
+          array = new (Z) TypeNode(primary_pos, type);
         } else if (primary_node->primary().IsTypeParameter()) {
           array = LoadTypeParameter(primary_node);
         } else {
           UNREACHABLE();  // Internal parser error.
         }
       }
-      selector =  new(Z) LoadIndexedNode(
-          bracket_pos, array, index, Class::ZoneHandle(Z));
+      selector = new (Z)
+          LoadIndexedNode(bracket_pos, array, index, Class::ZoneHandle(Z));
     } else if (IsArgumentPart()) {
       if (CurrentToken() == Token::kLT) {
         // Type arguments.
@@ -12114,10 +11564,9 @@
                           "from static function",
                           func_name.ToCString());
             }
-            selector = ParseInstanceCall(LoadReceiver(primary_pos),
-                                         func_name,
-                                         primary_pos,
-                                         false /* is_conditional */);
+            selector =
+                ParseInstanceCall(LoadReceiver(primary_pos), func_name,
+                                  primary_pos, false /* is_conditional */);
           }
         } else if (primary_node->primary().IsString()) {
           // Primary is an unresolved name.
@@ -12131,10 +11580,9 @@
             selector = ParseStaticCall(current_class(), name, primary_pos);
           } else {
             // Treat as call to unresolved (instance) method.
-            selector = ParseInstanceCall(LoadReceiver(primary_pos),
-                                         name,
-                                         primary_pos,
-                                         false /* is_conditional */);
+            selector =
+                ParseInstanceCall(LoadReceiver(primary_pos), name, primary_pos,
+                                  false /* is_conditional */);
           }
         } else if (primary_node->primary().IsTypeParameter()) {
           TypeParameter& type_parameter = TypeParameter::ZoneHandle(Z);
@@ -12142,17 +11590,16 @@
           const String& name = String::ZoneHandle(Z, type_parameter.name());
           if (type_parameter.IsClassTypeParameter()) {
             if (ParsingStaticMember()) {
-                // Treat as this.T(), because T is in scope.
-                ReportError(primary_pos,
-                            "cannot access type parameter '%s' "
-                            "from static function",
-                            name.ToCString());
+              // Treat as this.T(), because T is in scope.
+              ReportError(primary_pos,
+                          "cannot access type parameter '%s' "
+                          "from static function",
+                          name.ToCString());
             } else {
               // Treat as call to unresolved (instance) method.
-              selector = ParseInstanceCall(LoadReceiver(primary_pos),
-                                           name,
-                                           primary_pos,
-                                           false /* is_conditional */);
+              selector =
+                  ParseInstanceCall(LoadReceiver(primary_pos), name,
+                                    primary_pos, false /* is_conditional */);
             }
           } else {
             ASSERT(type_parameter.IsFunctionTypeParameter());
@@ -12163,13 +11610,14 @@
           }
         } else if (primary_node->primary().IsClass()) {
           const Class& type_class = Class::Cast(primary_node->primary());
-          AbstractType& type = Type::ZoneHandle(Z, Type::New(
-              type_class, TypeArguments::Handle(Z), primary_pos, Heap::kOld));
-          type ^= ClassFinalizer::FinalizeType(
-              current_class(), type, ClassFinalizer::kCanonicalize);
+          AbstractType& type = Type::ZoneHandle(
+              Z, Type::New(type_class, TypeArguments::Handle(Z), primary_pos,
+                           Heap::kOld));
+          type ^= ClassFinalizer::FinalizeType(current_class(), type,
+                                               ClassFinalizer::kCanonicalize);
           // Type may be malbounded, but not malformed.
           ASSERT(!type.IsMalformed());
-          selector = new(Z) TypeNode(primary_pos, type);
+          selector = new (Z) TypeNode(primary_pos, type);
         } else {
           UNREACHABLE();  // Internal parser error.
         }
@@ -12189,13 +11637,14 @@
           left = LoadClosure(primary_node);
         } else if (primary_node->primary().IsClass()) {
           const Class& type_class = Class::Cast(primary_node->primary());
-          AbstractType& type = Type::ZoneHandle(Z, Type::New(
-              type_class, TypeArguments::Handle(Z), primary_pos, Heap::kOld));
-          type = ClassFinalizer::FinalizeType(
-              current_class(), type, ClassFinalizer::kCanonicalize);
+          AbstractType& type = Type::ZoneHandle(
+              Z, Type::New(type_class, TypeArguments::Handle(Z), primary_pos,
+                           Heap::kOld));
+          type = ClassFinalizer::FinalizeType(current_class(), type,
+                                              ClassFinalizer::kCanonicalize);
           // Type may be malbounded, but not malformed.
           ASSERT(!type.IsMalformed());
-          left = new(Z) TypeNode(primary_pos, type);
+          left = new (Z) TypeNode(primary_pos, type);
         } else if (primary_node->primary().IsTypeParameter()) {
           left = LoadTypeParameter(primary_node);
         } else if (primary_node->IsSuper()) {
@@ -12217,6 +11666,11 @@
 
 // Closurization e#m of getter, setter, method or operator.
 AstNode* Parser::ParseClosurization(AstNode* primary) {
+  if (FLAG_warn_new_tearoff_syntax) {
+    ReportWarning(
+        "Tear-offs using the x#id syntax is a deprecated feature,"
+        "it will not be supported in the next release");
+  }
   ExpectToken(Token::kHASH);
   TokenPosition property_pos = TokenPos();
   bool is_setter_name = false;
@@ -12281,22 +11735,19 @@
       const Field& field = Field::Cast(obj);
       if (is_setter_name && !field.is_final()) {
         Instance& setter_closure = Instance::ZoneHandle(field.SetterClosure());
-        return new(Z) LiteralNode(property_pos, setter_closure);
+        return new (Z) LiteralNode(property_pos, setter_closure);
       }
       if (!is_setter_name) {
         Instance& getter_closure = Instance::ZoneHandle(field.GetterClosure());
-        return new(Z) LiteralNode(property_pos, getter_closure);
+        return new (Z) LiteralNode(property_pos, getter_closure);
       }
     }
-    return ThrowNoSuchMethodError(property_pos,
-                                  current_class(),
-                                  extractor_name,
-                                  NULL,  // No arguments.
-                                  InvocationMirror::kTopLevel,
-                                  is_setter_name
-                                      ? InvocationMirror::kSetter
-                                      : InvocationMirror::kMethod,
-                                  NULL);  // No existing function.
+    return ThrowNoSuchMethodError(
+        property_pos, current_class(), extractor_name,
+        NULL,  // No arguments.
+        InvocationMirror::kTopLevel,
+        is_setter_name ? InvocationMirror::kSetter : InvocationMirror::kMethod,
+        NULL);  // No existing function.
   }
 
   // Handle closurization of static properties of classes, C#n.
@@ -12315,13 +11766,13 @@
           // Note: the created closure is cached after it's created
           // once. If eager compilation is desired, the compiler can
           // be invoked here. The same applies for getters below.
-          return new(Z) LiteralNode(property_pos, setter_closure);
+          return new (Z) LiteralNode(property_pos, setter_closure);
         }
       } else {
         const Instance& getter_closure =
             Instance::ZoneHandle(Z, field.GetterClosure());
         ASSERT(getter_closure.IsClosure());
-        return new(Z) LiteralNode(property_pos, getter_closure);
+        return new (Z) LiteralNode(property_pos, getter_closure);
       }
     } else {
       Function& func = Function::Handle(Z);
@@ -12340,15 +11791,12 @@
         return CreateImplicitClosureNode(func, property_pos, NULL);
       }
     }
-    return ThrowNoSuchMethodError(property_pos,
-                                  cls,
-                                  extractor_name,
-                                  NULL,  // No arguments.
-                                  InvocationMirror::kStatic,
-                                  is_setter_name
-                                      ? InvocationMirror::kSetter
-                                      : InvocationMirror::kMethod,
-                                  NULL);  // No existing function.
+    return ThrowNoSuchMethodError(
+        property_pos, cls, extractor_name,
+        NULL,  // No arguments.
+        InvocationMirror::kStatic,
+        is_setter_name ? InvocationMirror::kSetter : InvocationMirror::kMethod,
+        NULL);  // No existing function.
   }
 
   // Closurization of instance getter, setter, method or operator.
@@ -12359,7 +11807,7 @@
   }
   pieces.Add(extractor_name);
   extractor_name = Symbols::FromConcatAll(T, pieces);
-  return new(Z) InstanceGetterNode(property_pos, primary, extractor_name);
+  return new (Z) InstanceGetterNode(property_pos, primary, extractor_name);
 }
 
 
@@ -12388,18 +11836,16 @@
     LocalVariable* temp = let_expr->AddInitializer(expr);
     Token::Kind binary_op =
         (incr_op == Token::kINCR) ? Token::kADD : Token::kSUB;
-    BinaryOpNode* add = new(Z) BinaryOpNode(
-        op_pos,
-        binary_op,
-        new(Z) LoadLocalNode(op_pos, temp),
-        new(Z) LiteralNode(op_pos, Smi::ZoneHandle(Z, Smi::New(1))));
+    BinaryOpNode* add = new (Z) BinaryOpNode(
+        op_pos, binary_op, new (Z) LoadLocalNode(op_pos, temp),
+        new (Z) LiteralNode(op_pos, Smi::ZoneHandle(Z, Smi::New(1))));
     AstNode* store =
         CreateAssignmentNode(expr, add, expr_ident, expr_pos, true);
     ASSERT(store != NULL);
     // The result is a pair of the (side effects of the) store followed by
     // the (value of the) initial value temp variable load.
     let_expr->AddNode(store);
-    let_expr->AddNode(new(Z) LoadLocalNode(op_pos, temp));
+    let_expr->AddNode(new (Z) LoadLocalNode(op_pos, temp));
     return let_expr;
   }
   return expr;
@@ -12429,9 +11875,9 @@
       // First check if the type is a function type parameter.
       if (!innermost_function().IsNull()) {
         // TODO(regis): Shortcut this lookup if no generic functions in scope.
-        TypeParameter& type_parameter = TypeParameter::ZoneHandle(Z,
-            innermost_function().LookupTypeParameter(unresolved_class_name,
-                                                     NULL));
+        TypeParameter& type_parameter = TypeParameter::ZoneHandle(
+            Z, innermost_function().LookupTypeParameter(unresolved_class_name,
+                                                        NULL));
         if (!type_parameter.IsNull()) {
           // TODO(regis): Check for absence of type arguments.
           // For now, resolve the function type parameter to dynamic.
@@ -12440,16 +11886,15 @@
         }
       }
       // Then check if the type is a class type parameter.
-      const TypeParameter& type_parameter = TypeParameter::Handle(Z,
-          current_class().LookupTypeParameter(unresolved_class_name));
+      const TypeParameter& type_parameter = TypeParameter::Handle(
+          Z, current_class().LookupTypeParameter(unresolved_class_name));
       if (!type_parameter.IsNull()) {
         // A type parameter is considered to be a malformed type when
         // referenced by a static member.
         if (ParsingStaticMember()) {
           *type = ClassFinalizer::NewFinalizedMalformedType(
               Error::Handle(Z),  // No previous error.
-              script_,
-              type->token_pos(),
+              script_, type->token_pos(),
               "type parameter '%s' cannot be referenced "
               "from static member",
               String::Handle(Z, type_parameter.name()).ToCString());
@@ -12460,8 +11905,7 @@
         if (type->arguments() != TypeArguments::null()) {
           *type = ClassFinalizer::NewFinalizedMalformedType(
               Error::Handle(Z),  // No previous error.
-              script_,
-              type_parameter.token_pos(),
+              script_, type_parameter.token_pos(),
               "type parameter '%s' cannot be parameterized",
               String::Handle(Z, type_parameter.name()).ToCString());
           return;
@@ -12489,9 +11933,7 @@
     } else if (finalization >= ClassFinalizer::kCanonicalize) {
       ClassFinalizer::FinalizeMalformedType(
           Error::Handle(Z),  // No previous error.
-          script_,
-          parameterized_type,
-          "type '%s' is not loaded",
+          script_, parameterized_type, "type '%s' is not loaded",
           String::Handle(Z, parameterized_type.UserVisibleName()).ToCString());
       return;
     }
@@ -12535,12 +11977,12 @@
 
 bool Parser::ParsingStaticMember() const {
   if (is_top_level_) {
-    return (current_member_ != NULL) &&
-           current_member_->has_static && !current_member_->has_factory;
+    return (current_member_ != NULL) && current_member_->has_static &&
+           !current_member_->has_factory;
   }
   ASSERT(!current_function().IsNull());
-  return
-      current_function().is_static() && !current_function().IsInFactoryScope();
+  return current_function().is_static() &&
+         !current_function().IsInFactoryScope();
 }
 
 
@@ -12582,9 +12024,8 @@
   const intptr_t kInitialConstMapSize = 16;
   ASSERT(!script.InVMHeap());
   if (script.compile_time_constants() == Array::null()) {
-    const Array& array =
-        Array::Handle(HashTables::New<ConstantsMap>(kInitialConstMapSize,
-                                                    Heap::kNew));
+    const Array& array = Array::Handle(
+        HashTables::New<ConstantsMap>(kInitialConstMapSize, Heap::kNew));
     script.set_compile_time_constants(array);
   }
   ConstantsMap constants(script.compile_time_constants());
@@ -12643,14 +12084,15 @@
 // Otherwise, if the field is constant, initialize the field and return no ast.
 // If the field is not initialized and not const, return the ast for the getter.
 StaticGetterNode* Parser::RunStaticFieldInitializer(
-    const Field& field, TokenPosition field_ref_pos) {
+    const Field& field,
+    TokenPosition field_ref_pos) {
   ASSERT(field.is_static());
   const Class& field_owner = Class::ZoneHandle(Z, field.Owner());
   const String& field_name = String::ZoneHandle(Z, field.name());
   const String& getter_name =
       String::Handle(Z, Field::GetterSymbol(field_name));
-  const Function& getter = Function::Handle(Z,
-      field_owner.LookupStaticFunction(getter_name));
+  const Function& getter =
+      Function::Handle(Z, field_owner.LookupStaticFunction(getter_name));
   const Instance& value = Instance::Handle(Z, field.StaticValue());
   if (value.raw() == Object::transition_sentinel().raw()) {
     if (field.is_const()) {
@@ -12658,8 +12100,8 @@
                   field_name.ToCString());
     } else {
       // The implicit static getter will throw the exception if necessary.
-      return new(Z) StaticGetterNode(
-          field_ref_pos, NULL, field_owner, field_name);
+      return new (Z)
+          StaticGetterNode(field_ref_pos, NULL, field_owner, field_name);
     }
   } else if (value.raw() == Object::sentinel().raw()) {
     // This field has not been referenced yet and thus the value has
@@ -12670,11 +12112,9 @@
       NoOOBMessageScope no_msg_scope(thread());
       field.SetStaticValue(Object::transition_sentinel());
       const int kNumArguments = 0;  // no arguments.
-      const Function& func = Function::Handle(Z,
-          Resolver::ResolveStatic(field_owner,
-                                  getter_name,
-                                  kNumArguments,
-                                  Object::empty_array()));
+      const Function& func = Function::Handle(
+          Z, Resolver::ResolveStatic(field_owner, getter_name, kNumArguments,
+                                     Object::empty_array()));
       ASSERT(!func.IsNull());
       ASSERT(func.kind() == RawFunction::kImplicitStaticFinalGetter);
       Object& const_value = Object::Handle(Z);
@@ -12690,8 +12130,7 @@
           // It is a compile-time error if evaluation of a compile-time constant
           // would raise an exception.
           const String& field_name = String::Handle(Z, field.name());
-          ReportErrors(error,
-                       script_, field_ref_pos,
+          ReportErrors(error, script_, field_ref_pos,
                        "error initializing const field '%s'",
                        field_name.ToCString());
         } else {
@@ -12704,10 +12143,10 @@
       instance ^= const_value.raw();
       instance = TryCanonicalize(instance, field_ref_pos);
       field.SetStaticValue(instance);
-      return NULL;   // Constant
+      return NULL;  // Constant
     } else {
-      return new(Z) StaticGetterNode(
-          field_ref_pos, NULL, field_owner, field_name);
+      return new (Z)
+          StaticGetterNode(field_ref_pos, NULL, field_owner, field_name);
     }
   }
   if (getter.IsNull() ||
@@ -12715,8 +12154,7 @@
     return NULL;
   }
   ASSERT(getter.kind() == RawFunction::kImplicitGetter);
-  return new(Z) StaticGetterNode(
-      field_ref_pos, NULL, field_owner, field_name);
+  return new (Z) StaticGetterNode(field_ref_pos, NULL, field_owner, field_name);
 }
 
 
@@ -12755,22 +12193,22 @@
     ASSERT(arg->IsLiteralNode());
     arg_values.SetAt((i + kNumExtraArgs), arg->AsLiteralNode()->literal());
   }
-  const Array& args_descriptor = Array::Handle(Z,
-      ArgumentsDescriptor::New(num_arguments, arguments->names()));
-  const Object& result = Object::Handle(Z,
-      DartEntry::InvokeFunction(constructor, arg_values, args_descriptor));
+  const Array& args_descriptor = Array::Handle(
+      Z, ArgumentsDescriptor::New(num_arguments, arguments->names()));
+  const Object& result = Object::Handle(
+      Z, DartEntry::InvokeFunction(constructor, arg_values, args_descriptor));
   if (result.IsError()) {
-      // An exception may not occur in every parse attempt, i.e., the
-      // generated AST is not deterministic. Therefore mark the function as
-      // not optimizable.
-      current_function().SetIsOptimizable(false);
-      if (result.IsUnhandledException()) {
-        return result.raw();
-      } else {
-        thread()->long_jump_base()->Jump(1, Error::Cast(result));
-        UNREACHABLE();
-        return Object::null();
-      }
+    // An exception may not occur in every parse attempt, i.e., the
+    // generated AST is not deterministic. Therefore mark the function as
+    // not optimizable.
+    current_function().SetIsOptimizable(false);
+    if (result.IsUnhandledException()) {
+      return result.raw();
+    } else {
+      thread()->long_jump_base()->Jump(1, Error::Cast(result));
+      UNREACHABLE();
+      return Object::null();
+    }
   } else {
     if (constructor.IsFactory()) {
       // The factory method returns the allocated object.
@@ -12785,7 +12223,7 @@
 // return true if the identifier is found, false otherwise.
 // If node is non NULL return an AST node corresponding to the identifier.
 bool Parser::ResolveIdentInLocalScope(TokenPosition ident_pos,
-                                      const String &ident,
+                                      const String& ident,
                                       AstNode** node,
                                       intptr_t* function_level) {
   TRACE_PARSER("ResolveIdentInLocalScope");
@@ -12796,7 +12234,7 @@
   }
   if (local != NULL) {
     if (node != NULL) {
-      *node = new(Z) LoadLocalNode(ident_pos, local);
+      *node = new (Z) LoadLocalNode(ident_pos, local);
     }
     if (function_level != NULL) {
       *function_level = local->owner()->function_level();
@@ -12845,13 +12283,11 @@
 
   // Check if an instance/static function exists.
   func = cls.LookupFunction(ident);
-  if (!func.IsNull() &&
-      (func.IsDynamicFunction() ||
-      func.IsStaticFunction() ||
-      func.is_abstract())) {
+  if (!func.IsNull() && (func.IsDynamicFunction() || func.IsStaticFunction() ||
+                         func.is_abstract())) {
     if (node != NULL) {
-      *node = new(Z) PrimaryNode(
-          ident_pos, Function::ZoneHandle(Z, func.raw()));
+      *node =
+          new (Z) PrimaryNode(ident_pos, Function::ZoneHandle(Z, func.raw()));
     }
     return true;
   }
@@ -12876,10 +12312,8 @@
       return true;
     } else if (func.IsStaticFunction()) {
       if (node != NULL) {
-        *node = new(Z) StaticGetterNode(ident_pos,
-                                        NULL,
-                                        Class::ZoneHandle(Z, cls.raw()),
-                                        ident);
+        *node = new (Z) StaticGetterNode(
+            ident_pos, NULL, Class::ZoneHandle(Z, cls.raw()), ident);
       }
       return true;
     }
@@ -12903,7 +12337,7 @@
   const Object& obj = Object::Handle(Z, library_.ResolveName(ident));
   if (obj.IsClass()) {
     const Class& cls = Class::Cast(obj);
-    return new(Z) PrimaryNode(ident_pos, Class::ZoneHandle(Z, cls.raw()));
+    return new (Z) PrimaryNode(ident_pos, Class::ZoneHandle(Z, cls.raw()));
   } else if (obj.IsField()) {
     const Field& field = Field::Cast(obj);
     ASSERT(field.is_static());
@@ -12916,26 +12350,24 @@
     const Function& func = Function::Cast(obj);
     ASSERT(func.is_static());
     if (func.IsGetterFunction() || func.IsSetterFunction()) {
-      StaticGetterNode* getter =
-          new(Z) StaticGetterNode(ident_pos,
-                                  /* receiver */ NULL,
-                                  Class::ZoneHandle(Z, func.Owner()),
-                                  ident);
+      StaticGetterNode* getter = new (Z) StaticGetterNode(
+          ident_pos,
+          /* receiver */ NULL, Class::ZoneHandle(Z, func.Owner()), ident);
       getter->set_owner(library_);
       return getter;
     } else {
-      return new(Z) PrimaryNode(ident_pos, Function::ZoneHandle(Z, func.raw()));
+      return new (Z)
+          PrimaryNode(ident_pos, Function::ZoneHandle(Z, func.raw()));
     }
   } else if (obj.IsLibraryPrefix()) {
     const LibraryPrefix& prefix = LibraryPrefix::Cast(obj);
-    ReportError(ident_pos,
-                "illegal use of library prefix '%s'",
+    ReportError(ident_pos, "illegal use of library prefix '%s'",
                 String::Handle(prefix.name()).ToCString());
   } else {
     ASSERT(obj.IsNull());
   }
   // Lexically unresolved primary identifiers are referenced by their name.
-  return new(Z) PrimaryNode(ident_pos, ident);
+  return new (Z) PrimaryNode(ident_pos, ident);
 }
 
 
@@ -12974,7 +12406,7 @@
   } else if (obj.IsClass()) {
     const Class& cls = Class::Cast(obj);
     PrimaryNode* primary =
-        new(Z) PrimaryNode(ident_pos, Class::ZoneHandle(Z, cls.raw()));
+        new (Z) PrimaryNode(ident_pos, Class::ZoneHandle(Z, cls.raw()));
     primary->set_is_deferred(is_deferred);
     return primary;
   } else if (obj.IsField()) {
@@ -12995,17 +12427,15 @@
     const Function& func = Function::Cast(obj);
     ASSERT(func.is_static());
     if (func.IsGetterFunction() || func.IsSetterFunction()) {
-      StaticGetterNode* getter = new(Z) StaticGetterNode(
-         ident_pos,
-         /* receiver */ NULL,
-         Class::ZoneHandle(Z, func.Owner()),
-         ident);
+      StaticGetterNode* getter = new (Z) StaticGetterNode(
+          ident_pos,
+          /* receiver */ NULL, Class::ZoneHandle(Z, func.Owner()), ident);
       getter->set_is_deferred(is_deferred);
       getter->set_owner(prefix);
       return getter;
     } else {
-      PrimaryNode* primary = new(Z) PrimaryNode(
-           ident_pos, Function::ZoneHandle(Z, func.raw()));
+      PrimaryNode* primary =
+          new (Z) PrimaryNode(ident_pos, Function::ZoneHandle(Z, func.raw()));
       primary->set_is_deferred(is_deferred);
       return primary;
     }
@@ -13033,9 +12463,9 @@
   if (!innermost_function().IsNull()) {
     // TODO(regis): Shortcut this lookup if no generic functions in scope.
     intptr_t type_param_func_level = FunctionLevel();
-    const TypeParameter& type_parameter = TypeParameter::ZoneHandle(Z,
-        innermost_function().LookupTypeParameter(ident,
-                                                 &type_param_func_level));
+    const TypeParameter& type_parameter =
+        TypeParameter::ZoneHandle(Z, innermost_function().LookupTypeParameter(
+                                         ident, &type_param_func_level));
     if (!type_parameter.IsNull()) {
       if ((resolved == NULL) || (resolved_func_level < type_param_func_level)) {
         // The identifier is a function type parameter, possibly shadowing
@@ -13047,15 +12477,15 @@
         // TODO(regis): Finalize type parameter and return as type node.
         // For now, map to dynamic type.
         Type& type = Type::ZoneHandle(Z, Type::DynamicType());
-        return new(Z) TypeNode(ident_pos, type);
+        return new (Z) TypeNode(ident_pos, type);
       }
     }
   }
   if (resolved == NULL) {
     // Check whether the identifier is a class type parameter.
     if (!current_class().IsNull()) {
-      TypeParameter& type_parameter = TypeParameter::ZoneHandle(Z,
-          current_class().LookupTypeParameter(ident));
+      TypeParameter& type_parameter = TypeParameter::ZoneHandle(
+          Z, current_class().LookupTypeParameter(ident));
       if (!type_parameter.IsNull()) {
         if (FunctionLevel() > 0) {
           // Make sure that the class instantiator is captured.
@@ -13064,7 +12494,7 @@
         type_parameter ^= ClassFinalizer::FinalizeType(
             current_class(), type_parameter, ClassFinalizer::kCanonicalize);
         ASSERT(!type_parameter.IsMalformed());
-        return new(Z) TypeNode(ident_pos, type_parameter);
+        return new (Z) TypeNode(ident_pos, type_parameter);
       }
     }
     // Not found in the local scope, and the name is not a type parameter.
@@ -13082,9 +12512,7 @@
       // the unresolved name to an instance field access, since a
       // subclass might define a field with this name.
       if (current_function().is_static()) {
-        resolved = ThrowNoSuchMethodError(ident_pos,
-                                          current_class(),
-                                          ident,
+        resolved = ThrowNoSuchMethodError(ident_pos, current_class(), ident,
                                           NULL,  // No arguments.
                                           InvocationMirror::kStatic,
                                           InvocationMirror::kField,
@@ -13102,14 +12530,14 @@
       }
     } else if (primary->primary().IsClass()) {
       const Class& type_class = Class::Cast(primary->primary());
-      AbstractType& type = Type::ZoneHandle(Z,
-          Type::New(type_class, TypeArguments::Handle(Z), primary_pos,
-                    Heap::kOld));
-      type ^= ClassFinalizer::FinalizeType(
-          current_class(), type, ClassFinalizer::kCanonicalize);
+      AbstractType& type =
+          Type::ZoneHandle(Z, Type::New(type_class, TypeArguments::Handle(Z),
+                                        primary_pos, Heap::kOld));
+      type ^= ClassFinalizer::FinalizeType(current_class(), type,
+                                           ClassFinalizer::kCanonicalize);
       // Type may be malbounded, but not malformed.
       ASSERT(!type.IsMalformed());
-      resolved = new(Z) TypeNode(primary_pos, type);
+      resolved = new (Z) TypeNode(primary_pos, type);
     }
   }
   return resolved;
@@ -13121,8 +12549,8 @@
     bool allow_deferred_type,
     bool consume_unresolved_prefix) {
   LibraryPrefix& prefix = LibraryPrefix::Handle(Z);
-  return ParseType(finalization, allow_deferred_type,
-                   consume_unresolved_prefix, &prefix);
+  return ParseType(finalization, allow_deferred_type, consume_unresolved_prefix,
+                   &prefix);
 }
 
 // Parses type = [ident "."] ident ["<" type { "," type } ">"], then resolve and
@@ -13157,8 +12585,7 @@
     // If we didn't see a valid prefix but the identifier is followed by
     // a period and another identifier, consume the qualified identifier
     // and create a malformed type.
-    if (consume_unresolved_prefix &&
-        prefix->IsNull() &&
+    if (consume_unresolved_prefix && prefix->IsNull() &&
         (CurrentToken() == Token::kPERIOD) &&
         (Token::IsIdentifier(LookaheadToken(1)))) {
       if (!is_top_level_ && (current_block_ != NULL)) {
@@ -13176,24 +12603,19 @@
       ParseTypeArguments(ClassFinalizer::kIgnore);
       return ClassFinalizer::NewFinalizedMalformedType(
           Error::Handle(Z),  // No previous error.
-          script_,
-          ident_pos,
-          "qualified name '%s' does not refer to a type",
+          script_, ident_pos, "qualified name '%s' does not refer to a type",
           qualified_name.ToCString());
     }
 
     // If parsing inside a local scope, check whether the type name
     // is shadowed by a local declaration.
-    if (!is_top_level_ &&
-        (prefix->IsNull()) &&
+    if (!is_top_level_ && (prefix->IsNull()) &&
         ResolveIdentInLocalScope(ident_pos, type_name, NULL, NULL)) {
       // The type is malformed. Skip over its type arguments.
       ParseTypeArguments(ClassFinalizer::kIgnore);
       return ClassFinalizer::NewFinalizedMalformedType(
           Error::Handle(Z),  // No previous error.
-          script_,
-          ident_pos,
-          "using '%s' in this context is invalid",
+          script_, ident_pos, "using '%s' in this context is invalid",
           type_name.ToCString());
     }
     if ((!FLAG_load_deferred_eagerly || !allow_deferred_type) &&
@@ -13209,16 +12631,14 @@
       // loaded when finalization is requested, return a malformed type.
       // Otherwise, handle resolution below, as needed.
       if (!allow_deferred_type ||
-          (!prefix->is_loaded()
-              && (finalization > ClassFinalizer::kResolveTypeParameters))) {
+          (!prefix->is_loaded() &&
+           (finalization > ClassFinalizer::kResolveTypeParameters))) {
         ParseTypeArguments(ClassFinalizer::kIgnore);
         return ClassFinalizer::NewFinalizedMalformedType(
             Error::Handle(Z),  // No previous error.
-            script_,
-            ident_pos,
-            !prefix->is_loaded() && allow_deferred_type
-                ? "deferred type '%s.%s' is not yet loaded"
-                : "using deferred type '%s.%s' is invalid",
+            script_, ident_pos, !prefix->is_loaded() && allow_deferred_type
+                                    ? "deferred type '%s.%s' is not yet loaded"
+                                    : "using deferred type '%s.%s' is invalid",
             String::Handle(Z, prefix->name()).ToCString(),
             type_name.ToCString());
       }
@@ -13229,8 +12649,8 @@
   if (finalization != ClassFinalizer::kIgnore) {
     type_class = UnresolvedClass::New(*prefix, type_name, ident_pos);
   }
-  TypeArguments& type_arguments = TypeArguments::Handle(
-      Z, ParseTypeArguments(finalization));
+  TypeArguments& type_arguments =
+      TypeArguments::Handle(Z, ParseTypeArguments(finalization));
   if (finalization == ClassFinalizer::kIgnore) {
     return Type::DynamicType();
   }
@@ -13247,7 +12667,8 @@
 
 
 void Parser::CheckConstructorCallTypeArguments(
-    TokenPosition pos, const Function& constructor,
+    TokenPosition pos,
+    const Function& constructor,
     const TypeArguments& type_arguments) {
   if (!type_arguments.IsNull()) {
     const Class& constructor_class = Class::Handle(Z, constructor.Owner());
@@ -13279,7 +12700,7 @@
     Instance& existing_const = Instance::ZoneHandle(Z);
     if (GetCachedConstant(literal_pos, &existing_const)) {
       SkipListLiteral();
-      return new(Z) LiteralNode(literal_pos, existing_const);
+      return new (Z) LiteralNode(literal_pos, existing_const);
     }
   }
 
@@ -13296,7 +12717,7 @@
     // List literals take a single type argument.
     if (list_type_arguments.Length() == 1) {
       element_type = list_type_arguments.TypeAt(0);
-      ASSERT(!element_type.IsMalformed());  // Would be mapped to dynamic.
+      ASSERT(!element_type.IsMalformed());   // Would be mapped to dynamic.
       ASSERT(!element_type.IsMalbounded());  // No declared bound in List.
       if (element_type.IsDynamicType()) {
         list_type_arguments = TypeArguments::null();
@@ -13317,10 +12738,10 @@
   }
   ASSERT(list_type_arguments.IsNull() || (list_type_arguments.Length() == 1));
   const Class& array_class = Class::Handle(Z, I->object_store()->array_class());
-  Type& type = Type::ZoneHandle(Z,
-      Type::New(array_class, list_type_arguments, type_pos, Heap::kOld));
-  type ^= ClassFinalizer::FinalizeType(
-      current_class(), type, ClassFinalizer::kCanonicalize);
+  Type& type = Type::ZoneHandle(
+      Z, Type::New(array_class, list_type_arguments, type_pos, Heap::kOld));
+  type ^= ClassFinalizer::FinalizeType(current_class(), type,
+                                       ClassFinalizer::kCanonicalize);
   GrowableArray<AstNode*> element_list;
   // Parse the list elements. Note: there may be an optional extra
   // comma after the last element.
@@ -13329,13 +12750,9 @@
     while (CurrentToken() != Token::kRBRACK) {
       const TokenPosition element_pos = TokenPos();
       AstNode* element = ParseExpr(is_const, kConsumeCascades);
-      if (I->type_checks() &&
-          !is_const &&
-          !element_type.IsDynamicType()) {
-        element = new(Z) AssignableNode(element_pos,
-                                        element,
-                                        element_type,
-                                        Symbols::ListLiteralElement());
+      if (I->type_checks() && !is_const && !element_type.IsDynamicType()) {
+        element = new (Z) AssignableNode(element_pos, element, element_type,
+                                         Symbols::ListLiteralElement());
       }
       element_list.Add(element);
       if (CurrentToken() == Token::kCOMMA) {
@@ -13351,10 +12768,10 @@
   if (is_const) {
     // Allocate and initialize the const list at compile time.
     if ((element_list.length() == 0) && list_type_arguments.IsNull()) {
-      return new(Z) LiteralNode(literal_pos, Object::empty_array());
+      return new (Z) LiteralNode(literal_pos, Object::empty_array());
     }
-    Array& const_list = Array::ZoneHandle(Z,
-        Array::New(element_list.length(), Heap::kOld));
+    Array& const_list =
+        Array::ZoneHandle(Z, Array::New(element_list.length(), Heap::kOld));
     const_list.SetTypeArguments(
         TypeArguments::Handle(Z, list_type_arguments.Canonicalize()));
     Error& bound_error = Error::Handle(Z);
@@ -13363,23 +12780,19 @@
       // Arguments have been evaluated to a literal value already.
       ASSERT(elem->IsLiteralNode());
       ASSERT(!is_top_level_);  // We cannot check unresolved types.
-      if (I->type_checks() &&
-          !element_type.IsDynamicType() &&
+      if (I->type_checks() && !element_type.IsDynamicType() &&
           (!elem->AsLiteralNode()->literal().IsNull() &&
            !elem->AsLiteralNode()->literal().IsInstanceOf(
-               element_type,
-               TypeArguments::Handle(Z),
-               &bound_error))) {
+               element_type, TypeArguments::Handle(Z), &bound_error))) {
         // If the failure is due to a bound error, display it instead.
         if (!bound_error.IsNull()) {
           ReportError(bound_error);
         } else {
-          ReportError(elem->AsLiteralNode()->token_pos(),
-                      "list literal element at index %d must be "
-                      "a constant of type '%s'",
-                      i,
-                      String::Handle(Z,
-                          element_type.UserVisibleName()).ToCString());
+          ReportError(
+              elem->AsLiteralNode()->token_pos(),
+              "list literal element at index %d must be "
+              "a constant of type '%s'",
+              i, String::Handle(Z, element_type.UserVisibleName()).ToCString());
         }
       }
       const_list.SetAt(i, elem->AsLiteralNode()->literal());
@@ -13387,19 +12800,18 @@
     const_list.MakeImmutable();
     const_list ^= TryCanonicalize(const_list, literal_pos);
     CacheConstantValue(literal_pos, const_list);
-    return new(Z) LiteralNode(literal_pos, const_list);
+    return new (Z) LiteralNode(literal_pos, const_list);
   } else {
     // Factory call at runtime.
     const Class& factory_class =
         Class::Handle(Z, Library::LookupCoreClass(Symbols::List()));
     ASSERT(!factory_class.IsNull());
-    const Function& factory_method = Function::ZoneHandle(Z,
-        factory_class.LookupFactory(
-            Library::PrivateCoreLibName(Symbols::ListLiteralFactory())));
+    const Function& factory_method = Function::ZoneHandle(
+        Z, factory_class.LookupFactory(
+               Library::PrivateCoreLibName(Symbols::ListLiteralFactory())));
     ASSERT(!factory_method.IsNull());
     if (!list_type_arguments.IsNull() &&
-        !list_type_arguments.IsInstantiated() &&
-        (FunctionLevel() > 0)) {
+        !list_type_arguments.IsInstantiated() && (FunctionLevel() > 0)) {
       // Make sure that the instantiator is captured.
       CaptureInstantiator();
     }
@@ -13409,28 +12821,25 @@
     // type argument vector.
     if (!factory_type_args.IsNull() && (factory_class.NumTypeArguments() > 1)) {
       ASSERT(factory_type_args.Length() == 1);
-      Type& factory_type = Type::Handle(Z, Type::New(
-          factory_class, factory_type_args, type_pos, Heap::kOld));
+      Type& factory_type = Type::Handle(
+          Z, Type::New(factory_class, factory_type_args, type_pos, Heap::kOld));
       factory_type ^= ClassFinalizer::FinalizeType(
           current_class(), factory_type, ClassFinalizer::kFinalize);
       factory_type_args = factory_type.arguments();
       ASSERT(factory_type_args.Length() == factory_class.NumTypeArguments());
     }
     factory_type_args = factory_type_args.Canonicalize();
-    ArgumentListNode* factory_param = new(Z) ArgumentListNode(
-        literal_pos);
+    ArgumentListNode* factory_param = new (Z) ArgumentListNode(literal_pos);
     if (element_list.length() == 0) {
       LiteralNode* empty_array_literal =
-          new(Z) LiteralNode(TokenPos(), Object::empty_array());
+          new (Z) LiteralNode(TokenPos(), Object::empty_array());
       factory_param->Add(empty_array_literal);
     } else {
-      ArrayNode* list = new(Z) ArrayNode(TokenPos(), type, element_list);
+      ArrayNode* list = new (Z) ArrayNode(TokenPos(), type, element_list);
       factory_param->Add(list);
     }
-    return CreateConstructorCallNode(literal_pos,
-                                     factory_type_args,
-                                     factory_method,
-                                     factory_param);
+    return CreateConstructorCallNode(literal_pos, factory_type_args,
+                                     factory_method, factory_param);
   }
 }
 
@@ -13443,8 +12852,8 @@
   if (!type_arguments.IsNull() && !type_arguments.IsInstantiated()) {
     EnsureExpressionTemp();
   }
-  return new(Z) ConstructorCallNode(
-      token_pos, type_arguments, constructor, arguments);
+  return new (Z)
+      ConstructorCallNode(token_pos, type_arguments, constructor, arguments);
 }
 
 
@@ -13485,7 +12894,7 @@
     Instance& existing_const = Instance::ZoneHandle(Z);
     if (GetCachedConstant(literal_pos, &existing_const)) {
       SkipMapLiteral();
-      return new(Z) LiteralNode(literal_pos, existing_const);
+      return new (Z) LiteralNode(literal_pos, existing_const);
     }
   }
 
@@ -13534,11 +12943,9 @@
     const bool saved_mode = SetAllowFunctionLiterals(true);
     const TokenPosition key_pos = TokenPos();
     AstNode* key = ParseExpr(is_const, kConsumeCascades);
-    if (I->type_checks() &&
-        !is_const &&
-        !key_type.IsDynamicType()) {
-      key = new(Z) AssignableNode(
-          key_pos, key, key_type, Symbols::ListLiteralElement());
+    if (I->type_checks() && !is_const && !key_type.IsDynamicType()) {
+      key = new (Z)
+          AssignableNode(key_pos, key, key_type, Symbols::ListLiteralElement());
     }
     if (is_const) {
       ASSERT(key->IsLiteralNode());
@@ -13546,8 +12953,7 @@
       if (key_value.IsDouble()) {
         ReportError(key_pos, "key value must not be of type double");
       }
-      if (!key_value.IsInteger() &&
-          !key_value.IsString() &&
+      if (!key_value.IsInteger() && !key_value.IsString() &&
           (key_value.clazz() != I->object_store()->symbol_class()) &&
           ImplementsEqualOperator(Z, key_value)) {
         ReportError(key_pos, "key value must not implement operator ==");
@@ -13557,11 +12963,9 @@
     const TokenPosition value_pos = TokenPos();
     AstNode* value = ParseExpr(is_const, kConsumeCascades);
     SetAllowFunctionLiterals(saved_mode);
-    if (I->type_checks() &&
-        !is_const &&
-        !value_type.IsDynamicType()) {
-      value = new(Z) AssignableNode(
-          value_pos, value, value_type, Symbols::ListLiteralElement());
+    if (I->type_checks() && !is_const && !value_type.IsDynamicType()) {
+      value = new (Z) AssignableNode(value_pos, value, value_type,
+                                     Symbols::ListLiteralElement());
     }
     AddKeyValuePair(&kv_pairs_list, is_const, key, value);
 
@@ -13600,20 +13004,17 @@
         if (!arg_type.IsDynamicType() &&
             (!arg->AsLiteralNode()->literal().IsNull() &&
              !arg->AsLiteralNode()->literal().IsInstanceOf(
-                 arg_type,
-                 Object::null_type_arguments(),
-                 &bound_error))) {
+                 arg_type, Object::null_type_arguments(), &bound_error))) {
           // If the failure is due to a bound error, display it.
           if (!bound_error.IsNull()) {
             ReportError(bound_error);
           } else {
-            ReportError(arg->AsLiteralNode()->token_pos(),
-                        "map literal %s at index %d must be "
-                        "a constant of type '%s'",
-                        ((i % 2) == 0) ? "key" : "value",
-                        i >> 1,
-                        String::Handle(Z,
-                                       arg_type.UserVisibleName()).ToCString());
+            ReportError(
+                arg->AsLiteralNode()->token_pos(),
+                "map literal %s at index %d must be "
+                "a constant of type '%s'",
+                ((i % 2) == 0) ? "key" : "value", i >> 1,
+                String::Handle(Z, arg_type.UserVisibleName()).ToCString());
           }
         }
       }
@@ -13623,44 +13024,40 @@
     key_value_array ^= TryCanonicalize(key_value_array, TokenPos());
 
     // Construct the map object.
-    const Class& immutable_map_class = Class::Handle(Z,
-        Library::LookupCoreClass(Symbols::ImmutableMap()));
+    const Class& immutable_map_class =
+        Class::Handle(Z, Library::LookupCoreClass(Symbols::ImmutableMap()));
     ASSERT(!immutable_map_class.IsNull());
     // If the immutable map class extends other parameterized classes, we need
     // to adjust the type argument vector. This is currently not the case.
     ASSERT(immutable_map_class.NumTypeArguments() == 2);
-    ArgumentListNode* constr_args = new(Z) ArgumentListNode(TokenPos());
-    constr_args->Add(new(Z) LiteralNode(literal_pos, key_value_array));
-    const Function& map_constr =
-        Function::ZoneHandle(Z, immutable_map_class.LookupConstructor(
-            Library::PrivateCoreLibName(Symbols::ImmutableMapConstructor())));
+    ArgumentListNode* constr_args = new (Z) ArgumentListNode(TokenPos());
+    constr_args->Add(new (Z) LiteralNode(literal_pos, key_value_array));
+    const Function& map_constr = Function::ZoneHandle(
+        Z, immutable_map_class.LookupConstructor(Library::PrivateCoreLibName(
+               Symbols::ImmutableMapConstructor())));
     ASSERT(!map_constr.IsNull());
-    const Object& constructor_result = Object::Handle(Z,
-        EvaluateConstConstructorCall(immutable_map_class,
-                                     map_type_arguments,
-                                     map_constr,
-                                     constr_args));
+    const Object& constructor_result = Object::Handle(
+        Z, EvaluateConstConstructorCall(immutable_map_class, map_type_arguments,
+                                        map_constr, constr_args));
     if (constructor_result.IsUnhandledException()) {
-      ReportErrors(Error::Cast(constructor_result),
-                   script_, literal_pos,
+      ReportErrors(Error::Cast(constructor_result), script_, literal_pos,
                    "error executing const Map constructor");
     } else {
       const Instance& const_instance = Instance::Cast(constructor_result);
       CacheConstantValue(literal_pos, const_instance);
-      return new(Z) LiteralNode(
-          literal_pos, Instance::ZoneHandle(Z, const_instance.raw()));
+      return new (Z) LiteralNode(literal_pos,
+                                 Instance::ZoneHandle(Z, const_instance.raw()));
     }
   } else {
     // Factory call at runtime.
     const Class& factory_class =
         Class::Handle(Z, Library::LookupCoreClass(Symbols::Map()));
     ASSERT(!factory_class.IsNull());
-    const Function& factory_method = Function::ZoneHandle(Z,
-        factory_class.LookupFactory(
-            Library::PrivateCoreLibName(Symbols::MapLiteralFactory())));
+    const Function& factory_method = Function::ZoneHandle(
+        Z, factory_class.LookupFactory(
+               Library::PrivateCoreLibName(Symbols::MapLiteralFactory())));
     ASSERT(!factory_method.IsNull());
-    if (!map_type_arguments.IsNull() &&
-        !map_type_arguments.IsInstantiated() &&
+    if (!map_type_arguments.IsNull() && !map_type_arguments.IsInstantiated() &&
         (FunctionLevel() > 0)) {
       // Make sure that the instantiator is captured.
       CaptureInstantiator();
@@ -13671,34 +13068,30 @@
     // type argument vector.
     if (!factory_type_args.IsNull() && (factory_class.NumTypeArguments() > 2)) {
       ASSERT(factory_type_args.Length() == 2);
-      Type& factory_type = Type::Handle(Z, Type::New(
-          factory_class, factory_type_args, type_pos, Heap::kOld));
+      Type& factory_type = Type::Handle(
+          Z, Type::New(factory_class, factory_type_args, type_pos, Heap::kOld));
       factory_type ^= ClassFinalizer::FinalizeType(
           current_class(), factory_type, ClassFinalizer::kFinalize);
       factory_type_args = factory_type.arguments();
       ASSERT(factory_type_args.Length() == factory_class.NumTypeArguments());
     }
     factory_type_args = factory_type_args.Canonicalize();
-    ArgumentListNode* factory_param = new(Z) ArgumentListNode(literal_pos);
+    ArgumentListNode* factory_param = new (Z) ArgumentListNode(literal_pos);
     // The kv_pair array is temporary and of element type dynamic. It is passed
     // to the factory to initialize a properly typed map. Pass a pre-allocated
     // array for the common empty map literal case.
     if (kv_pairs_list.length() == 0) {
       LiteralNode* empty_array_literal =
-          new(Z) LiteralNode(TokenPos(), Object::empty_array());
+          new (Z) LiteralNode(TokenPos(), Object::empty_array());
       factory_param->Add(empty_array_literal);
     } else {
-      ArrayNode* kv_pairs = new(Z) ArrayNode(
-          TokenPos(),
-          Type::ZoneHandle(Z, Type::ArrayType()),
-          kv_pairs_list);
+      ArrayNode* kv_pairs = new (Z) ArrayNode(
+          TokenPos(), Type::ZoneHandle(Z, Type::ArrayType()), kv_pairs_list);
       factory_param->Add(kv_pairs);
     }
 
-    return CreateConstructorCallNode(literal_pos,
-                                     factory_type_args,
-                                     factory_method,
-                                     factory_param);
+    return CreateConstructorCallNode(literal_pos, factory_type_args,
+                                     factory_method, factory_param);
   }
   UNREACHABLE();
   return NULL;
@@ -13713,15 +13106,14 @@
     ConsumeToken();
   }
   const TokenPosition type_pos = TokenPos();
-  TypeArguments& type_arguments = TypeArguments::Handle(Z,
-      ParseTypeArguments(ClassFinalizer::kCanonicalize));
+  TypeArguments& type_arguments = TypeArguments::Handle(
+      Z, ParseTypeArguments(ClassFinalizer::kCanonicalize));
   // Malformed type arguments are mapped to dynamic, so we will not encounter
   // them here.
   // Map and List interfaces do not declare bounds on their type parameters, so
   // we will not see malbounded type arguments here.
   AstNode* primary = NULL;
-  if ((CurrentToken() == Token::kLBRACK) ||
-      (CurrentToken() == Token::kINDEX)) {
+  if ((CurrentToken() == Token::kLBRACK) || (CurrentToken() == Token::kINDEX)) {
     primary = ParseListLiteral(type_pos, is_const, type_arguments);
   } else if (CurrentToken() == Token::kLBRACE) {
     primary = ParseMapLiteral(type_pos, is_const, type_arguments);
@@ -13758,35 +13150,32 @@
 
   Instance& symbol_instance = Instance::ZoneHandle(Z);
   if (GetCachedConstant(symbol_pos, &symbol_instance)) {
-    return new(Z) LiteralNode(symbol_pos, symbol_instance);
+    return new (Z) LiteralNode(symbol_pos, symbol_instance);
   }
 
   // Call Symbol class constructor to create a symbol instance.
   const Class& symbol_class = Class::Handle(I->object_store()->symbol_class());
   ASSERT(!symbol_class.IsNull());
-  ArgumentListNode* constr_args = new(Z) ArgumentListNode(symbol_pos);
-  constr_args->Add(new(Z) LiteralNode(symbol_pos, symbol));
-  const Function& constr = Function::ZoneHandle(Z,
-      symbol_class.LookupConstructor(Symbols::SymbolCtor()));
+  ArgumentListNode* constr_args = new (Z) ArgumentListNode(symbol_pos);
+  constr_args->Add(new (Z) LiteralNode(symbol_pos, symbol));
+  const Function& constr = Function::ZoneHandle(
+      Z, symbol_class.LookupConstructor(Symbols::SymbolCtor()));
   ASSERT(!constr.IsNull());
-  const Object& result = Object::Handle(Z,
-      EvaluateConstConstructorCall(symbol_class,
-                                   TypeArguments::Handle(Z),
-                                   constr,
-                                   constr_args));
+  const Object& result = Object::Handle(
+      Z, EvaluateConstConstructorCall(symbol_class, TypeArguments::Handle(Z),
+                                      constr, constr_args));
   if (result.IsUnhandledException()) {
-    ReportErrors(Error::Cast(result),
-                 script_, symbol_pos,
+    ReportErrors(Error::Cast(result), script_, symbol_pos,
                  "error executing const Symbol constructor");
   }
   symbol_instance ^= result.raw();
   CacheConstantValue(symbol_pos, symbol_instance);
-  return new(Z) LiteralNode(symbol_pos, symbol_instance);
+  return new (Z) LiteralNode(symbol_pos, symbol_instance);
 }
 
 
-RawFunction* Parser::BuildConstructorClosureFunction(
-    const Function& ctr, TokenPosition token_pos) {
+RawFunction* Parser::BuildConstructorClosureFunction(const Function& ctr,
+                                                     TokenPosition token_pos) {
   ASSERT(ctr.kind() == RawFunction::kConstructor);
   Function& closure = Function::Handle(Z);
   closure = I->LookupClosureFunction(innermost_function(), token_pos);
@@ -13796,12 +13185,11 @@
   }
 
   String& closure_name = String::Handle(Z, ctr.name());
-  closure_name = Symbols::FromConcat(T,
-      Symbols::ConstructorClosurePrefix(), closure_name);
+  closure_name =
+      Symbols::FromConcat(T, Symbols::ConstructorClosurePrefix(), closure_name);
 
   ParamList params;
-  params.AddFinalParameter(token_pos,
-                           &Symbols::ClosureParameter(),
+  params.AddFinalParameter(token_pos, &Symbols::ClosureParameter(),
                            &Object::dynamic_type());
 
   ParseFormalParameters(ctr, &params);
@@ -13809,8 +13197,7 @@
   // Replace the types parsed from the constructor.
   params.EraseParameterTypes();
 
-  closure = Function::NewClosureFunction(closure_name,
-                                         innermost_function(),
+  closure = Function::NewClosureFunction(closure_name, innermost_function(),
                                          token_pos);
   closure.set_is_generated_body(true);
   closure.set_is_debuggable(false);
@@ -13837,8 +13224,8 @@
   // unnamed constructor for class 'A' is labeled 'A.'.
   // This convention prevents users from explicitly calling constructors.
   Zone* zone = thread->zone();
-  String& constructor_name = String::Handle(zone,
-      Symbols::FromDot(thread, type_class_name));
+  String& constructor_name =
+      String::Handle(zone, Symbols::FromDot(thread, type_class_name));
   if (named_constructor != NULL) {
     constructor_name =
         Symbols::FromConcat(thread, constructor_name, *named_constructor);
@@ -13861,15 +13248,19 @@
   const bool consume_unresolved_prefix =
       (la3 == Token::kLT) || (la3 == Token::kPERIOD) || (la3 == Token::kHASH);
   LibraryPrefix& prefix = LibraryPrefix::ZoneHandle(Z);
-  AbstractType& type = AbstractType::Handle(Z,
-      ParseType(ClassFinalizer::kCanonicalizeWellFormed,
-      true,  // allow deferred type
-      consume_unresolved_prefix,
-      &prefix));
+  AbstractType& type =
+      AbstractType::Handle(Z, ParseType(ClassFinalizer::kCanonicalizeWellFormed,
+                                        true,  // allow deferred type
+                                        consume_unresolved_prefix, &prefix));
   // A constructor tear-off closure can only have been created for a
   // type that is loaded.
   ASSERT(prefix.IsNull() || prefix.is_loaded());
   ASSERT(!type.IsMalformed() && !type.IsTypeParameter());
+  if (FLAG_warn_new_tearoff_syntax) {
+    ReportWarning(
+        "Tear-offs using the x#id syntax is a deprecated feature,"
+        "it will not be supported in the next release");
+  }
   ExpectToken(Token::kHASH);
   String* named_constructor = NULL;
   if (IsIdentifier()) {
@@ -13880,8 +13271,8 @@
   Class& type_class = Class::Handle(Z, type.type_class());
   String& type_class_name = String::Handle(Z, type_class.Name());
   *type_arguments = type.arguments();
-  String& constructor_name = BuildConstructorName(T,
-      type_class_name, named_constructor);
+  String& constructor_name =
+      BuildConstructorName(T, type_class_name, named_constructor);
   *constructor = type_class.LookupConstructor(constructor_name);
   if (constructor->IsNull()) {
     *constructor = type_class.LookupFactory(constructor_name);
@@ -13892,8 +13283,7 @@
       ASSERT(!type.IsMalformedOrMalbounded());
       if (!type.IsInstantiated()) {
         Error& error = Error::Handle(Z);
-        type ^= type.InstantiateFrom(*type_arguments,
-                                     &error,
+        type ^= type.InstantiateFrom(*type_arguments, &error,
                                      NULL,  // instantiation_trail
                                      NULL,  // bound_trail
                                      Heap::kOld);
@@ -13922,21 +13312,17 @@
       (la3 == Token::kLT) || (la3 == Token::kPERIOD) || (la3 == Token::kHASH);
 
   LibraryPrefix& prefix = LibraryPrefix::ZoneHandle(Z);
-  AbstractType& type = AbstractType::ZoneHandle(Z,
-      ParseType(ClassFinalizer::kCanonicalizeWellFormed,
-                allow_deferred_type,
-                consume_unresolved_prefix,
-                &prefix));
+  AbstractType& type = AbstractType::ZoneHandle(
+      Z, ParseType(ClassFinalizer::kCanonicalizeWellFormed, allow_deferred_type,
+                   consume_unresolved_prefix, &prefix));
 
-  if (FLAG_load_deferred_eagerly &&
-      !prefix.IsNull() && prefix.is_deferred_load() && !prefix.is_loaded()) {
+  if (FLAG_load_deferred_eagerly && !prefix.IsNull() &&
+      prefix.is_deferred_load() && !prefix.is_loaded()) {
     // Add runtime check.
     Type& malformed_type = Type::ZoneHandle(Z);
     malformed_type = ClassFinalizer::NewFinalizedMalformedType(
         Error::Handle(Z),  // No previous error.
-        script_,
-        type_pos,
-        "deferred type '%s.%s' is not yet loaded",
+        script_, type_pos, "deferred type '%s.%s' is not yet loaded",
         String::Handle(Z, prefix.name()).ToCString(),
         String::Handle(type.Name()).ToCString());
     // Note: Adding a statement to current block is a hack, parsing an
@@ -13950,13 +13336,11 @@
     // Replace the type with a malformed type.
     type = ClassFinalizer::NewFinalizedMalformedType(
         Error::Handle(Z),  // No previous error.
-        script_,
-        type_pos,
-        "%s'%s' cannot be instantiated",
+        script_, type_pos, "%s'%s' cannot be instantiated",
         type.IsTypeParameter() ? "type parameter " : "",
-        type.IsTypeParameter() ?
-            String::Handle(Z, type.UserVisibleName()).ToCString() :
-            "dynamic");
+        type.IsTypeParameter()
+            ? String::Handle(Z, type.UserVisibleName()).ToCString()
+            : "dynamic");
   }
   // Attempting to instantiate an enum type is a compile-time error.
   Class& type_class = Class::Handle(Z, type.type_class());
@@ -13975,6 +13359,11 @@
     if (is_const) {
       ReportError("tear-off closure not allowed with const allocation");
     }
+    if (FLAG_warn_new_tearoff_syntax) {
+      ReportWarning(
+          "Tear-offs using the x#id syntax is a deprecated feature,"
+          "and will not be supported in the next release");
+    }
     ConsumeToken();
     if (IsIdentifier()) {
       named_constructor = ExpectIdentifier("name of constructor expected");
@@ -13994,7 +13383,7 @@
   } else {
     // Allocate dummy node with no arguments so we don't have to deal
     // with the NULL corner case below.
-    arguments = new(Z) ArgumentListNode(TokenPos());
+    arguments = new (Z) ArgumentListNode(TokenPos());
   }
 
   // Parsing is complete, so we can return a throw in case of a malformed or
@@ -14006,7 +13395,7 @@
     }
     if (arguments->length() > 0) {
       // Evaluate arguments for side-effects and throw.
-      LetNode* error_result = new(Z) LetNode(type_pos);
+      LetNode* error_result = new (Z) LetNode(type_pos);
       for (intptr_t i = 0; i < arguments->length(); ++i) {
         error_result->AddNode(arguments->NodeAt(i));
       }
@@ -14030,10 +13419,10 @@
   AbstractType& type_bound = AbstractType::ZoneHandle(Z);
 
   // Make sure that an appropriate constructor exists.
-  String& constructor_name = BuildConstructorName(T,
-              type_class_name, named_constructor);
-  Function& constructor = Function::ZoneHandle(Z,
-      type_class.LookupConstructor(constructor_name));
+  String& constructor_name =
+      BuildConstructorName(T, type_class_name, named_constructor);
+  Function& constructor =
+      Function::ZoneHandle(Z, type_class.LookupConstructor(constructor_name));
   if (constructor.IsNull()) {
     constructor = type_class.LookupFactory(constructor_name);
     if (constructor.IsNull()) {
@@ -14044,20 +13433,16 @@
       if (is_const) {
         type = ClassFinalizer::NewFinalizedMalformedType(
             Error::Handle(Z),  // No previous error.
-            script_,
-            call_pos,
+            script_, call_pos,
             "class '%s' has no constructor or factory named '%s'",
             String::Handle(Z, type_class.Name()).ToCString(),
             external_constructor_name.ToCString());
         ReportError(Error::Handle(Z, type.error()));
       }
-      return ThrowNoSuchMethodError(call_pos,
-                                    type_class,
-                                    external_constructor_name,
-                                    arguments,
-                                    InvocationMirror::kConstructor,
-                                    InvocationMirror::kMethod,
-                                    NULL);  // No existing function.
+      return ThrowNoSuchMethodError(
+          call_pos, type_class, external_constructor_name, arguments,
+          InvocationMirror::kConstructor, InvocationMirror::kMethod,
+          NULL);  // No existing function.
     } else if (constructor.IsRedirectingFactory()) {
       ClassFinalizer::ResolveRedirectingFactory(type_class, constructor);
       Type& redirect_type = Type::ZoneHandle(Z, constructor.RedirectionType());
@@ -14066,17 +13451,14 @@
         // The type arguments of the redirection type are instantiated from the
         // type arguments of the parsed type of the 'new' or 'const' expression.
         Error& error = Error::Handle(Z);
-        redirect_type ^= redirect_type.InstantiateFrom(
-            type_arguments,
-            &error,
-            NULL,  // instantiation_trail
-            NULL,  // bound_trail
-            Heap::kOld);
+        redirect_type ^=
+            redirect_type.InstantiateFrom(type_arguments, &error,
+                                          NULL,  // instantiation_trail
+                                          NULL,  // bound_trail
+                                          Heap::kOld);
         if (!error.IsNull()) {
           redirect_type = ClassFinalizer::NewFinalizedMalformedType(
-              error,
-              script_,
-              call_pos,
+              error, script_, call_pos,
               "redirecting factory type '%s' cannot be instantiated",
               String::Handle(Z, redirect_type.UserVisibleName()).ToCString());
         }
@@ -14097,9 +13479,7 @@
           parsed_function()->AddDeferredPrefix(prefix);
         }
         redirect_type = ClassFinalizer::NewFinalizedMalformedType(
-            Error::Handle(Z),
-            script_,
-            call_pos,
+            Error::Handle(Z), script_, call_pos,
             "redirection type '%s' is not loaded",
             String::Handle(Z, redirect_type.UserVisibleName()).ToCString());
       }
@@ -14111,7 +13491,7 @@
         return ThrowTypeError(redirect_type.token_pos(), redirect_type);
       }
       if (I->type_checks() &&
-              !redirect_type.IsSubtypeOf(type, NULL, NULL, Heap::kOld)) {
+          !redirect_type.IsSubtypeOf(type, NULL, NULL, Heap::kOld)) {
         // Additional type checking of the result is necessary.
         type_bound = type.raw();
       }
@@ -14136,28 +13516,27 @@
   // a dynamic error to instantiate an abstract class.
   if (type_class.is_abstract() && !constructor.IsFactory()) {
     // Evaluate arguments before throwing.
-    LetNode* result = new(Z) LetNode(call_pos);
+    LetNode* result = new (Z) LetNode(call_pos);
     for (intptr_t i = 0; i < arguments->length(); ++i) {
       result->AddNode(arguments->NodeAt(i));
     }
-    ArgumentListNode* error_arguments = new(Z) ArgumentListNode(type_pos);
-    error_arguments->Add(new(Z) LiteralNode(
-        TokenPos(), Integer::ZoneHandle(Z, Integer::New(type_pos.value(),
-                                                        Heap::kOld))));
-    error_arguments->Add(new(Z) LiteralNode(
+    ArgumentListNode* error_arguments = new (Z) ArgumentListNode(type_pos);
+    error_arguments->Add(new (Z) LiteralNode(
+        TokenPos(),
+        Integer::ZoneHandle(Z, Integer::New(type_pos.value(), Heap::kOld))));
+    error_arguments->Add(new (Z) LiteralNode(
         TokenPos(), String::ZoneHandle(Z, type_class_name.raw())));
-    result->AddNode(
-        MakeStaticCall(Symbols::AbstractClassInstantiationError(),
-                       Library::PrivateCoreLibName(Symbols::ThrowNew()),
-                       error_arguments));
+    result->AddNode(MakeStaticCall(
+        Symbols::AbstractClassInstantiationError(),
+        Library::PrivateCoreLibName(Symbols::ThrowNew()), error_arguments));
     return result;
   }
 
   type_arguments ^= type_arguments.Canonicalize();
 
   if (is_tearoff_expression) {
-    const Function& tearoff_func = Function::ZoneHandle(Z,
-        BuildConstructorClosureFunction(constructor, new_pos));
+    const Function& tearoff_func = Function::ZoneHandle(
+        Z, BuildConstructorClosureFunction(constructor, new_pos));
 
     // Local functions normally get parsed when the enclosing function is
     // compiled. Since constructor tearoff closures don't get parsed here,
@@ -14167,20 +13546,19 @@
     OpenFunctionBlock(tearoff_func);
     // If there are type arguments in the tearoff expression that are
     // not yet instantiated, capture the instantiator.
-    if (IsInstantiatorRequired() &&
-        !type_arguments.IsNull() && !type_arguments.IsInstantiated()) {
+    if (IsInstantiatorRequired() && !type_arguments.IsNull() &&
+        !type_arguments.IsInstantiated()) {
       CaptureInstantiator();
     }
     SequenceNode* tearoff_body = CloseBlock();
     ClosureNode* closure_obj =
-        new(Z) ClosureNode(new_pos, tearoff_func, NULL, tearoff_body->scope());
+        new (Z) ClosureNode(new_pos, tearoff_func, NULL, tearoff_body->scope());
     return closure_obj;
   }
 
   ASSERT(!is_tearoff_expression);
   String& error_message = String::Handle(Z);
-  if (!constructor.AreValidArguments(arguments_length,
-                                     arguments->names(),
+  if (!constructor.AreValidArguments(arguments_length, arguments->names(),
                                      &error_message)) {
     const String& external_constructor_name =
         (named_constructor ? constructor_name : type_class_name);
@@ -14192,13 +13570,10 @@
                   String::Handle(Z, type_class.Name()).ToCString(),
                   error_message.ToCString());
     }
-    return ThrowNoSuchMethodError(call_pos,
-                                  type_class,
-                                  external_constructor_name,
-                                  arguments,
+    return ThrowNoSuchMethodError(call_pos, type_class,
+                                  external_constructor_name, arguments,
                                   InvocationMirror::kConstructor,
-                                  InvocationMirror::kMethod,
-                                  &constructor);
+                                  InvocationMirror::kMethod, &constructor);
   }
 
   // Return a throw in case of a malformed or malbounded type or report a
@@ -14216,42 +13591,37 @@
     if (!constructor.is_const()) {
       const String& external_constructor_name =
           (named_constructor ? constructor_name : type_class_name);
-      ReportError("non-const constructor '%s' cannot be used in "
-                  "const object creation",
-                  external_constructor_name.ToCString());
+      ReportError(
+          "non-const constructor '%s' cannot be used in "
+          "const object creation",
+          external_constructor_name.ToCString());
     }
 
     Instance& const_instance = Instance::ZoneHandle(Z);
     if (GetCachedConstant(new_pos, &const_instance)) {
       // Cache hit, nothing else to do.
     } else {
-      Object& constructor_result = Object::Handle(Z,
-          EvaluateConstConstructorCall(type_class,
-                                       type_arguments,
-                                       constructor,
-                                       arguments));
+      Object& constructor_result = Object::Handle(
+          Z, EvaluateConstConstructorCall(type_class, type_arguments,
+                                          constructor, arguments));
       if (constructor_result.IsUnhandledException()) {
         // It's a compile-time error if invocation of a const constructor
         // call fails.
-        ReportErrors(Error::Cast(constructor_result),
-                     script_, new_pos,
+        ReportErrors(Error::Cast(constructor_result), script_, new_pos,
                      "error while evaluating const constructor");
       }
       const_instance ^= constructor_result.raw();
       CacheConstantValue(new_pos, const_instance);
     }
-    new_object = new(Z) LiteralNode(new_pos, const_instance);
+    new_object = new (Z) LiteralNode(new_pos, const_instance);
     if (!type_bound.IsNull()) {
       ASSERT(!type_bound.IsMalformed());
       Error& bound_error = Error::Handle(Z);
       ASSERT(!is_top_level_);  // We cannot check unresolved types.
-      if (!const_instance.IsInstanceOf(type_bound,
-                                       TypeArguments::Handle(Z),
+      if (!const_instance.IsInstanceOf(type_bound, TypeArguments::Handle(Z),
                                        &bound_error)) {
         type_bound = ClassFinalizer::NewFinalizedMalformedType(
-            bound_error,
-            script_,
-            new_pos,
+            bound_error, script_, new_pos,
             "const factory result is not an instance of '%s'",
             String::Handle(Z, type_bound.UserVisibleName()).ToCString());
         new_object = ThrowTypeError(new_pos, type_bound);
@@ -14260,20 +13630,19 @@
     }
   } else {
     CheckConstructorCallTypeArguments(new_pos, constructor, type_arguments);
-    if (!type_arguments.IsNull() &&
-        !type_arguments.IsInstantiated() &&
+    if (!type_arguments.IsNull() && !type_arguments.IsInstantiated() &&
         (FunctionLevel() > 0)) {
       // Make sure that the instantiator is captured.
       CaptureInstantiator();
     }
     // If the type argument vector is not instantiated, we verify in checked
     // mode at runtime that it is within its declared bounds.
-    new_object = CreateConstructorCallNode(
-        new_pos, type_arguments, constructor, arguments);
+    new_object = CreateConstructorCallNode(new_pos, type_arguments, constructor,
+                                           arguments);
   }
   if (!type_bound.IsNull()) {
-    new_object = new(Z) AssignableNode(
-         new_pos, new_object, type_bound, Symbols::FactoryResult());
+    new_object = new (Z) AssignableNode(new_pos, new_object, type_bound,
+                                        Symbols::FactoryResult());
   }
   return new_object;
 }
@@ -14282,16 +13651,17 @@
 String& Parser::Interpolate(const GrowableArray<AstNode*>& values) {
   NoReloadScope no_reload_scope(isolate(), thread());
   NoOOBMessageScope no_msg_scope(thread());
-  const Class& cls = Class::Handle(
-      Z, Library::LookupCoreClass(Symbols::StringBase()));
+  const Class& cls =
+      Class::Handle(Z, Library::LookupCoreClass(Symbols::StringBase()));
   ASSERT(!cls.IsNull());
-  const Function& func = Function::Handle(Z, cls.LookupStaticFunction(
-      Library::PrivateCoreLibName(Symbols::Interpolate())));
+  const Function& func = Function::Handle(
+      Z, cls.LookupStaticFunction(
+             Library::PrivateCoreLibName(Symbols::Interpolate())));
   ASSERT(!func.IsNull());
 
   // Build the array of literal values to interpolate.
-  const Array& value_arr = Array::Handle(Z,
-      Array::New(values.length(), Heap::kOld));
+  const Array& value_arr =
+      Array::Handle(Z, Array::New(values.length(), Heap::kOld));
   for (int i = 0; i < values.length(); i++) {
     ASSERT(values[i]->IsLiteralNode());
     value_arr.SetAt(i, values[i]->AsLiteralNode()->literal());
@@ -14326,11 +13696,10 @@
   const TokenPosition literal_start = TokenPos();
   ASSERT(CurrentToken() == Token::kSTRING);
   Token::Kind l1_token = LookaheadToken(1);
-  if ((l1_token != Token::kSTRING) &&
-      (l1_token != Token::kINTERPOL_VAR) &&
+  if ((l1_token != Token::kSTRING) && (l1_token != Token::kINTERPOL_VAR) &&
       (l1_token != Token::kINTERPOL_START)) {
     // Common case: no interpolation.
-    primary = new(Z) LiteralNode(literal_start, *CurrentLiteral());
+    primary = new (Z) LiteralNode(literal_start, *CurrentLiteral());
     ConsumeToken();
     return primary;
   }
@@ -14341,8 +13710,8 @@
   Instance& cached_string = Instance::Handle(Z);
   if (GetCachedConstant(literal_start, &cached_string)) {
     SkipStringLiteral();
-    return new(Z) LiteralNode(literal_start,
-                              Instance::ZoneHandle(Z, cached_string.raw()));
+    return new (Z) LiteralNode(literal_start,
+                               Instance::ZoneHandle(Z, cached_string.raw()));
   }
 
   bool is_compiletime_const = true;
@@ -14352,11 +13721,11 @@
     if (CurrentLiteral()->Length() > 0) {
       // Only add non-empty string sections to the values list
       // that will be concatenated.
-      values_list.Add(new(Z) LiteralNode(TokenPos(), *CurrentLiteral()));
+      values_list.Add(new (Z) LiteralNode(TokenPos(), *CurrentLiteral()));
     }
     ConsumeToken();
     while ((CurrentToken() == Token::kINTERPOL_VAR) ||
-        (CurrentToken() == Token::kINTERPOL_START)) {
+           (CurrentToken() == Token::kINTERPOL_START)) {
       if (!allow_interpolation) {
         ReportError("string interpolation not allowed in this context");
       }
@@ -14381,13 +13750,11 @@
       if (is_compiletime_const) {
         const Object* const_expr = expr->EvalConstExpr();
         if ((const_expr != NULL) &&
-            (const_expr->IsNumber() ||
-            const_expr->IsString() ||
-            const_expr->IsBool() ||
-            const_expr->IsNull())) {
+            (const_expr->IsNumber() || const_expr->IsString() ||
+             const_expr->IsBool() || const_expr->IsNull())) {
           // Change expr into a literal.
-          expr = new(Z) LiteralNode(expr_pos,
-                                    EvaluateConstExpr(expr_pos, expr));
+          expr =
+              new (Z) LiteralNode(expr_pos, EvaluateConstExpr(expr_pos, expr));
         } else {
           is_compiletime_const = false;
         }
@@ -14398,7 +13765,7 @@
   if (is_compiletime_const) {
     if (has_interpolation) {
       const String& interpolated_string = Interpolate(values_list);
-      primary = new(Z) LiteralNode(literal_start, interpolated_string);
+      primary = new (Z) LiteralNode(literal_start, interpolated_string);
       CacheConstantValue(literal_start, interpolated_string);
     } else {
       GrowableHandlePtrArray<const String> pieces(Z, values_list.length());
@@ -14407,18 +13774,16 @@
         ASSERT(part.IsString());
         pieces.Add(String::Cast(part));
       }
-      const String& lit = String::ZoneHandle(Z,
-          Symbols::FromConcatAll(T, pieces));
-      primary = new(Z) LiteralNode(literal_start, lit);
+      const String& lit =
+          String::ZoneHandle(Z, Symbols::FromConcatAll(T, pieces));
+      primary = new (Z) LiteralNode(literal_start, lit);
       // Caching of constant not necessary because the symbol lookup will
       // find the value next time.
     }
   } else {
-    ArrayNode* values = new(Z) ArrayNode(
-        TokenPos(),
-        Type::ZoneHandle(Z, Type::ArrayType()),
-        values_list);
-    primary = new(Z) StringInterpolateNode(TokenPos(), values);
+    ArrayNode* values = new (Z) ArrayNode(
+        TokenPos(), Type::ZoneHandle(Z, Type::ArrayType()), values_list);
+    primary = new (Z) StringInterpolateNode(TokenPos(), values);
   }
   return primary;
 }
@@ -14440,8 +13805,13 @@
     const LibraryPrefix& prefix = LibraryPrefix::ZoneHandle(Z, ParsePrefix());
     if (!prefix.IsNull()) {
       if (CurrentToken() == Token::kHASH) {
+        if (FLAG_warn_new_tearoff_syntax) {
+          ReportWarning(
+              "Tear-offs using the x#id syntax is a deprecated feature,"
+              "it will not be supported in the next release");
+        }
         // Closurization of top-level entity in prefix scope.
-        return new(Z) LiteralNode(qual_ident_pos, prefix);
+        return new (Z) LiteralNode(qual_ident_pos, prefix);
       } else {
         ExpectToken(Token::kPERIOD);
       }
@@ -14450,15 +13820,15 @@
     ConsumeToken();
     if (prefix.IsNull()) {
       intptr_t primary_func_level = 0;
-      ResolveIdentInLocalScope(
-          qual_ident_pos, ident, &primary, &primary_func_level);
+      ResolveIdentInLocalScope(qual_ident_pos, ident, &primary,
+                               &primary_func_level);
       // Check whether the identifier is shadowed by a function type parameter.
       if (!innermost_function().IsNull()) {
         // TODO(regis): Shortcut this lookup if no generic functions in scope.
         intptr_t type_param_func_level = FunctionLevel();
-        TypeParameter& type_param = TypeParameter::ZoneHandle(Z,
-            innermost_function().LookupTypeParameter(ident,
-                                                     &type_param_func_level));
+        TypeParameter& type_param = TypeParameter::ZoneHandle(
+            Z, innermost_function().LookupTypeParameter(
+                   ident, &type_param_func_level));
         if (!type_param.IsNull()) {
           if ((primary == NULL) ||
               (primary_func_level < type_param_func_level)) {
@@ -14468,17 +13838,17 @@
               // Make sure that the function instantiator is captured.
               CaptureFunctionInstantiator();
             }
-            return new(Z) PrimaryNode(qual_ident_pos, type_param);
+            return new (Z) PrimaryNode(qual_ident_pos, type_param);
           }
         }
       }
       if (primary == NULL) {
         // Check whether the identifier is a type parameter.
         if (!current_class().IsNull()) {
-          TypeParameter& type_param = TypeParameter::ZoneHandle(Z,
-              current_class().LookupTypeParameter(ident));
+          TypeParameter& type_param = TypeParameter::ZoneHandle(
+              Z, current_class().LookupTypeParameter(ident));
           if (!type_param.IsNull()) {
-            return new(Z) PrimaryNode(qual_ident_pos, type_param);
+            return new (Z) PrimaryNode(qual_ident_pos, type_param);
           }
         }
         // This is a non-local unqualified identifier so resolve the
@@ -14497,22 +13867,21 @@
       // interpret the unresolved identifier as an instance method or
       // instance getter call when compiling an instance method.
       if (primary == NULL) {
-        if (prefix.is_deferred_load() &&
-            ident.Equals(Symbols::LoadLibrary())) {
+        if (prefix.is_deferred_load() && ident.Equals(Symbols::LoadLibrary())) {
           // Hack Alert: recognize special 'loadLibrary' call on the
           // prefix object. The prefix is the primary. Rewind parser and
           // let ParseSelectors() handle the loadLibrary call.
           SetPosition(qual_ident_pos);
           ConsumeToken();  // Prefix name.
-          primary = new(Z) LiteralNode(qual_ident_pos, prefix);
+          primary = new (Z) LiteralNode(qual_ident_pos, prefix);
         } else {
           GrowableHandlePtrArray<const String> pieces(Z, 3);
           pieces.Add(String::Handle(Z, prefix.name()));
           pieces.Add(Symbols::Dot());
           pieces.Add(ident);
-          const String& qualified_name = String::ZoneHandle(Z,
-              Symbols::FromConcatAll(T, pieces));
-          primary = new(Z) PrimaryNode(qual_ident_pos, qualified_name);
+          const String& qualified_name =
+              String::ZoneHandle(Z, Symbols::FromConcatAll(T, pieces));
+          primary = new (Z) PrimaryNode(qual_ident_pos, qualified_name);
         }
       } else if (FLAG_load_deferred_eagerly && prefix.is_deferred_load()) {
         // primary != NULL.
@@ -14520,22 +13889,19 @@
         pieces.Add(String::Handle(Z, prefix.name()));
         pieces.Add(Symbols::Dot());
         pieces.Add(ident);
-        const String& qualified_name = String::ZoneHandle(Z,
-            Symbols::FromConcatAll(T, pieces));
-        InvocationMirror::Type call_type =
-            CurrentToken() == Token::kLPAREN ?
-                InvocationMirror::kMethod : InvocationMirror::kGetter;
+        const String& qualified_name =
+            String::ZoneHandle(Z, Symbols::FromConcatAll(T, pieces));
+        InvocationMirror::Type call_type = CurrentToken() == Token::kLPAREN
+                                               ? InvocationMirror::kMethod
+                                               : InvocationMirror::kGetter;
         // Note: Adding a statement to current block is a hack, parsing an
         // espression should have no side-effect.
         current_block_->statements->Add(ThrowNoSuchMethodError(
-                                            qual_ident_pos,
-                                            current_class(),
-                                            qualified_name,
-                                            NULL,  // No arguments.
-                                            InvocationMirror::kTopLevel,
-                                            call_type,
-                                            NULL,  // No existing function.
-                                            &prefix));
+            qual_ident_pos, current_class(), qualified_name,
+            NULL,  // No arguments.
+            InvocationMirror::kTopLevel, call_type,
+            NULL,  // No existing function.
+            &prefix));
       }
     }
     ASSERT(primary != NULL);
@@ -14544,20 +13910,20 @@
     if (local == NULL) {
       ReportError("receiver 'this' is not in scope");
     }
-    primary = new(Z) LoadLocalNode(TokenPos(), local);
+    primary = new (Z) LoadLocalNode(TokenPos(), local);
     ConsumeToken();
   } else if (token == Token::kINTEGER) {
     const Integer& literal = Integer::ZoneHandle(Z, CurrentIntegerLiteral());
-    primary = new(Z) LiteralNode(TokenPos(), literal);
+    primary = new (Z) LiteralNode(TokenPos(), literal);
     ConsumeToken();
   } else if (token == Token::kTRUE) {
-    primary = new(Z) LiteralNode(TokenPos(), Bool::True());
+    primary = new (Z) LiteralNode(TokenPos(), Bool::True());
     ConsumeToken();
   } else if (token == Token::kFALSE) {
-    primary = new(Z) LiteralNode(TokenPos(), Bool::False());
+    primary = new (Z) LiteralNode(TokenPos(), Bool::False());
     ConsumeToken();
   } else if (token == Token::kNULL) {
-    primary = new(Z) LiteralNode(TokenPos(), Object::null_instance());
+    primary = new (Z) LiteralNode(TokenPos(), Object::null_instance());
     ConsumeToken();
   } else if (token == Token::kLPAREN) {
     ConsumeToken();
@@ -14570,7 +13936,7 @@
     if (double_value.IsNull()) {
       ReportError("invalid double literal");
     }
-    primary = new(Z) LiteralNode(TokenPos(), double_value);
+    primary = new (Z) LiteralNode(TokenPos(), double_value);
     ConsumeToken();
   } else if (token == Token::kSTRING) {
     primary = ParseStringLiteral(true);
@@ -14587,10 +13953,8 @@
       ConsumeToken();
       primary = ParseNewOperator(Token::kCONST);
     }
-  } else if (token == Token::kLT ||
-             token == Token::kLBRACK ||
-             token == Token::kINDEX ||
-             token == Token::kLBRACE) {
+  } else if (token == Token::kLT || token == Token::kLBRACK ||
+             token == Token::kINDEX || token == Token::kLBRACE) {
     primary = ParseCompoundLiteral();
   } else if (token == Token::kHASH) {
     primary = ParseSymbolLiteral();
@@ -14614,13 +13978,13 @@
         primary = ParseSuperFieldAccess(ident, ident_pos);
       }
     } else if ((CurrentToken() == Token::kLBRACK) ||
-        Token::CanBeOverloaded(CurrentToken()) ||
-        (CurrentToken() == Token::kNE)) {
+               Token::CanBeOverloaded(CurrentToken()) ||
+               (CurrentToken() == Token::kNE)) {
       primary = ParseSuperOperator();
     } else if (CurrentToken() == Token::kQM_PERIOD) {
       ReportError("super call or super getter may not use ?.");
     } else {
-      primary = new(Z) PrimaryNode(super_pos, Symbols::Super());
+      primary = new (Z) PrimaryNode(super_pos, Symbols::Super());
     }
   } else {
     UnexpectedToken();
@@ -14638,7 +14002,7 @@
   if (expr->IsLiteralNode()) {
     return expr->AsLiteralNode()->literal();
   } else if (expr->IsLoadLocalNode() &&
-      expr->AsLoadLocalNode()->local().IsConst()) {
+             expr->AsLoadLocalNode()->local().IsConst()) {
     return *expr->AsLoadLocalNode()->local().ConstValue();
   } else if (expr->IsLoadStaticFieldNode()) {
     const Field& field = expr->AsLoadStaticFieldNode()->field();
@@ -14665,18 +14029,17 @@
     if (GetCachedConstant(expr_pos, &value)) {
       return value;
     }
-    ReturnNode* ret = new(Z) ReturnNode(expr_pos, expr);
+    ReturnNode* ret = new (Z) ReturnNode(expr_pos, expr);
     // Compile time constant expressions cannot reference anything from a
     // local scope.
-    LocalScope* empty_scope = new(Z) LocalScope(NULL, 0, 0);
-    SequenceNode* seq = new(Z) SequenceNode(expr_pos, empty_scope);
+    LocalScope* empty_scope = new (Z) LocalScope(NULL, 0, 0);
+    SequenceNode* seq = new (Z) SequenceNode(expr_pos, empty_scope);
     seq->Add(ret);
 
     INC_STAT(thread_, num_execute_const, 1);
     Object& result = Object::Handle(Z, Compiler::ExecuteOnce(seq));
     if (result.IsError()) {
-      ReportErrors(Error::Cast(result),
-                   script_, expr_pos,
+      ReportErrors(Error::Cast(result), script_, expr_pos,
                    "error evaluating constant expression");
     }
     ASSERT(result.IsInstance() || result.IsNull());
@@ -14795,8 +14158,7 @@
   if (CurrentToken() == Token::kLT) {
     SkipTypeArguments();
   }
-  if ((CurrentToken() == Token::kLBRACK) ||
-      (CurrentToken() == Token::kINDEX)) {
+  if ((CurrentToken() == Token::kLBRACK) || (CurrentToken() == Token::kINDEX)) {
     SkipListLiteral();
   } else if (CurrentToken() == Token::kLBRACE) {
     SkipMapLiteral();
@@ -14935,7 +14297,7 @@
         ExpectIdentifier("identifier or [ expected after ..");
       }
     } else if ((current_token == Token::kPERIOD) ||
-        (current_token == Token::kQM_PERIOD)) {
+               (current_token == Token::kQM_PERIOD)) {
       ConsumeToken();
       ExpectIdentifier("identifier expected");
     } else if (current_token == Token::kLBRACK) {
@@ -14971,8 +14333,7 @@
 
 
 void Parser::SkipUnaryExpr() {
-  if (IsPrefixOperator(CurrentToken()) ||
-      IsIncrementOperator(CurrentToken()) ||
+  if (IsPrefixOperator(CurrentToken()) || IsIncrementOperator(CurrentToken()) ||
       IsAwaitKeyword()) {
     ConsumeToken();
     SkipUnaryExpr();
@@ -14987,7 +14348,7 @@
   const int min_prec = Token::Precedence(Token::kIFNULL);
   const int max_prec = Token::Precedence(Token::kMUL);
   while (((min_prec <= Token::Precedence(CurrentToken())) &&
-      (Token::Precedence(CurrentToken()) <= max_prec))) {
+          (Token::Precedence(CurrentToken()) <= max_prec))) {
     if (CurrentToken() == Token::kIS) {
       ConsumeToken();
       if (CurrentToken() == Token::kNOT) {
diff --git a/runtime/vm/parser.h b/runtime/vm/parser.h
index b7c7b14..004913e 100644
--- a/runtime/vm/parser.h
+++ b/runtime/vm/parser.h
@@ -36,7 +36,8 @@
 class LocalVariable;
 struct RegExpCompileData;
 class SourceLabel;
-template <typename T> class GrowableArray;
+template <typename T>
+class GrowableArray;
 class Parser;
 
 struct CatchParamDesc;
@@ -74,18 +75,14 @@
     const Smi& key = Smi::Cast(obj);
     return HashValue(key.Value());
   }
-  static uword Hash(const TokenPosition& key) {
-    return HashValue(key.value());
-  }
+  static uword Hash(const TokenPosition& key) { return HashValue(key.value()); }
   // Used by CacheConstantValue if a new constant is added to the map.
   static RawObject* NewKey(const TokenPosition& key) {
     return Smi::New(key.value());
   }
 
  private:
-  static uword HashValue(intptr_t pos) {
-    return pos % (Smi::kMaxValue - 13);
-  }
+  static uword HashValue(intptr_t pos) { return pos % (Smi::kMaxValue - 13); }
 };
 typedef UnorderedHashMap<ConstMapKeyEqualsTraits> ConstantsMap;
 
@@ -113,11 +110,9 @@
         kernel_scopes_(NULL) {
     ASSERT(function.IsZoneHandle());
     // Every function has a local variable for the current context.
-    LocalVariable* temp = new(zone()) LocalVariable(
-        function.token_pos(),
-        function.token_pos(),
-        Symbols::CurrentContextVar(),
-        Object::dynamic_type());
+    LocalVariable* temp = new (zone())
+        LocalVariable(function.token_pos(), function.token_pos(),
+                      Symbols::CurrentContextVar(), Object::dynamic_type());
     ASSERT(temp != NULL);
     current_context_var_ = temp;
   }
@@ -159,9 +154,7 @@
     return default_parameter_values_;
   }
 
-  LocalVariable* current_context_var() const {
-    return current_context_var_;
-  }
+  LocalVariable* current_context_var() const { return current_context_var_; }
 
   LocalVariable* expression_temp_var() const {
     ASSERT(has_expression_temp_var());
@@ -171,9 +164,7 @@
     ASSERT(!has_expression_temp_var());
     expression_temp_var_ = value;
   }
-  bool has_expression_temp_var() const {
-    return expression_temp_var_ != NULL;
-  }
+  bool has_expression_temp_var() const { return expression_temp_var_ != NULL; }
 
   LocalVariable* finally_return_temp_var() const {
     ASSERT(has_finally_return_temp_var());
@@ -205,8 +196,7 @@
   int num_copied_params() const { return num_copied_params_; }
   int num_stack_locals() const { return num_stack_locals_; }
   int num_non_copied_params() const {
-    return (num_copied_params_ == 0)
-        ? function().num_fixed_parameters() : 0;
+    return (num_copied_params_ == 0) ? function().num_fixed_parameters() : 0;
   }
 
   void AllocateVariables();
@@ -301,9 +291,7 @@
   class TryStack;
   class TokenPosScope;
 
-  Parser(const Script& script,
-         const Library& library,
-         TokenPosition token_pos);
+  Parser(const Script& script, const Library& library, TokenPosition token_pos);
   Parser(const Script& script,
          ParsedFunction* function,
          TokenPosition token_pos);
@@ -345,9 +333,7 @@
   void set_current_class(const Class& value);
 
   // ParsedFunction accessor.
-  ParsedFunction* parsed_function() const {
-    return parsed_function_;
-  }
+  ParsedFunction* parsed_function() const { return parsed_function_; }
 
   const Script& script() const { return script_; }
   void SetScript(const Script& script, TokenPosition token_pos);
@@ -358,7 +344,7 @@
   // Parsing a library or a regular source script.
   bool is_library_source() const {
     return (script_.kind() == RawScript::kScriptTag) ||
-        (script_.kind() == RawScript::kLibraryTag);
+           (script_.kind() == RawScript::kLibraryTag);
   }
 
   bool is_part_source() const {
@@ -370,9 +356,7 @@
     return script_.kind() == RawScript::kPatchTag;
   }
 
-  TokenPosition TokenPos() const {
-    return tokens_iterator_.CurrentPosition();
-  }
+  TokenPosition TokenPos() const { return tokens_iterator_.CurrentPosition(); }
   TokenPosition PrevTokenPos() const { return prev_token_pos_; }
 
   Token::Kind CurrentToken() {
@@ -453,8 +437,10 @@
 
   // Concatenate and report an already formatted error and a new error message.
   static void ReportErrors(const Error& prev_error,
-                           const Script& script, TokenPosition token_pos,
-                           const char* format, ...) PRINTF_ATTRIBUTE(4, 5);
+                           const Script& script,
+                           TokenPosition token_pos,
+                           const char* format,
+                           ...) PRINTF_ATTRIBUTE(4, 5);
 
   // Report error message at location of current token in current script.
   void ReportError(const char* msg, ...) const PRINTF_ATTRIBUTE(2, 3);
@@ -462,15 +448,15 @@
   void ReportErrorBefore(const char* format, ...) PRINTF_ATTRIBUTE(2, 3);
 
   // Report error message at given location in current script.
-  void ReportError(TokenPosition token_pos,
-                   const char* msg, ...) const PRINTF_ATTRIBUTE(3, 4);
+  void ReportError(TokenPosition token_pos, const char* msg, ...) const
+      PRINTF_ATTRIBUTE(3, 4);
 
   // Report warning message at location of current token in current script.
   void ReportWarning(const char* msg, ...) const PRINTF_ATTRIBUTE(2, 3);
 
   // Report warning message at given location in current script.
-  void ReportWarning(TokenPosition token_pos,
-                     const char* msg, ...) const PRINTF_ATTRIBUTE(3, 4);
+  void ReportWarning(TokenPosition token_pos, const char* msg, ...) const
+      PRINTF_ATTRIBUTE(3, 4);
 
   void CheckRecursiveInvocation();
 
@@ -500,11 +486,14 @@
                     const Object& tl_owner,
                     TokenPosition metadata_pos);
   void ParseTopLevelVariable(TopLevel* top_level,
-                             const Object& owner, TokenPosition metadata_pos);
+                             const Object& owner,
+                             TokenPosition metadata_pos);
   void ParseTopLevelFunction(TopLevel* top_level,
-                             const Object& owner, TokenPosition metadata_pos);
+                             const Object& owner,
+                             TokenPosition metadata_pos);
   void ParseTopLevelAccessor(TopLevel* top_level,
-                             const Object& owner, TokenPosition metadata_pos);
+                             const Object& owner,
+                             TokenPosition metadata_pos);
   RawArray* EvaluateMetadata();
 
   RawFunction::AsyncModifier ParseFunctionModifier();
@@ -529,11 +518,10 @@
   RawAbstractType* ParseType(ClassFinalizer::FinalizationKind finalization,
                              bool allow_deferred_type = false,
                              bool consume_unresolved_prefix = true);
-  RawAbstractType* ParseType(
-      ClassFinalizer::FinalizationKind finalization,
-      bool allow_deferred_type,
-      bool consume_unresolved_prefix,
-      LibraryPrefix* prefix);
+  RawAbstractType* ParseType(ClassFinalizer::FinalizationKind finalization,
+                             bool allow_deferred_type,
+                             bool consume_unresolved_prefix,
+                             LibraryPrefix* prefix);
 
   void ParseTypeParameters(bool parameterizing_class);
   RawTypeArguments* ParseTypeArguments(
@@ -560,20 +548,18 @@
       const Class& cls,
       LocalVariable* receiver,
       GrowableArray<Field*>* initialized_fields);
-  AstNode* CheckDuplicateFieldInit(
-      TokenPosition init_pos,
-      GrowableArray<Field*>* initialized_fields,
-      AstNode* instance,
-      Field* field,
-      AstNode* init_value);
+  AstNode* CheckDuplicateFieldInit(TokenPosition init_pos,
+                                   GrowableArray<Field*>* initialized_fields,
+                                   AstNode* instance,
+                                   Field* field,
+                                   AstNode* init_value);
   StaticCallNode* GenerateSuperConstructorCall(
       const Class& cls,
       TokenPosition supercall_pos,
       LocalVariable* receiver,
       ArgumentListNode* forwarding_args);
-  StaticCallNode* ParseSuperInitializer(
-      const Class& cls,
-      LocalVariable* receiver);
+  StaticCallNode* ParseSuperInitializer(const Class& cls,
+                                        LocalVariable* receiver);
   AstNode* ParseInitializer(const Class& cls,
                             LocalVariable* receiver,
                             GrowableArray<Field*>* initialized_fields);
@@ -663,7 +649,7 @@
 
   SequenceNode* CloseAsyncClosure(SequenceNode* body);
   SequenceNode* CloseAsyncTryBlock(SequenceNode* try_block);
-  SequenceNode* CloseAsyncGeneratorTryBlock(SequenceNode *body);
+  SequenceNode* CloseAsyncGeneratorTryBlock(SequenceNode* body);
 
   void AddAsyncClosureParameters(ParamList* params);
   void AddContinuationVariables();
@@ -734,11 +720,10 @@
   // Pop the inner most try block from the stack.
   TryStack* PopTry();
   // Collect saved try context variables if await or yield is in try block.
-  void CheckAsyncOpInTryBlock(
-      LocalVariable** saved_try_ctx,
-      LocalVariable** async_saved_try_ctx,
-      LocalVariable** outer_saved_try_ctx,
-      LocalVariable** outer_async_saved_try_ctx) const;
+  void CheckAsyncOpInTryBlock(LocalVariable** saved_try_ctx,
+                              LocalVariable** async_saved_try_ctx,
+                              LocalVariable** outer_saved_try_ctx,
+                              LocalVariable** outer_async_saved_try_ctx) const;
   // Add specified node to try block list so that it can be patched with
   // inlined finally code if needed.
   void AddNodeForFinallyInlining(AstNode* node);
@@ -840,7 +825,7 @@
   const AbstractType* ReceiverType(const Class& cls);
   bool IsInstantiatorRequired() const;
   bool ResolveIdentInLocalScope(TokenPosition ident_pos,
-                                const String &ident,
+                                const String& ident,
                                 AstNode** node,
                                 intptr_t* function_level);
   static const bool kResolveLocally = true;
@@ -924,7 +909,7 @@
   Isolate* isolate() const { return isolate_; }
   Zone* zone() const { return thread_->zone(); }
 
-  Thread* thread_;  // Cached current thread.
+  Thread* thread_;    // Cached current thread.
   Isolate* isolate_;  // Cached current isolate.
 
   Script& script_;
diff --git a/runtime/vm/parser_test.cc b/runtime/vm/parser_test.cc
index 14fae8e..ece6a9a 100644
--- a/runtime/vm/parser_test.cc
+++ b/runtime/vm/parser_test.cc
@@ -21,8 +21,8 @@
 static void DumpFunction(const Library& lib,
                          const char* cname,
                          const char* fname) {
-  const String& classname = String::Handle(Symbols::New(Thread::Current(),
-                                                        cname));
+  const String& classname =
+      String::Handle(Symbols::New(Thread::Current(), cname));
   String& funcname = String::Handle(String::New(fname));
 
   bool retval;
@@ -32,7 +32,7 @@
     Class& cls = Class::Handle(lib.LookupClass(classname));
     EXPECT(!cls.IsNull());
     Function& function =
-      Function::ZoneHandle(cls.LookupStaticFunction(funcname));
+        Function::ZoneHandle(cls.LookupStaticFunction(funcname));
     EXPECT(!function.IsNull());
     ParsedFunction* parsed_function =
         new ParsedFunction(Thread::Current(), function);
@@ -58,8 +58,8 @@
                 const char* field_name,
                 bool expect_static,
                 bool is_final) {
-  const String& classname = String::Handle(Symbols::New(Thread::Current(),
-                                                        class_name));
+  const String& classname =
+      String::Handle(Symbols::New(Thread::Current(), class_name));
   Class& cls = Class::Handle(lib.LookupClass(classname));
   EXPECT(!cls.IsNull());
 
@@ -94,8 +94,8 @@
                    const char* class_name,
                    const char* function_name,
                    bool expect_static) {
-  const String& classname = String::Handle(Symbols::New(Thread::Current(),
-                                                        class_name));
+  const String& classname =
+      String::Handle(Symbols::New(Thread::Current(), class_name));
   Class& cls = Class::Handle(lib.LookupClass(classname));
   EXPECT(!cls.IsNull());
 
@@ -126,9 +126,8 @@
 
   String& url = String::Handle(String::New("dart-test:Parser_TopLevel"));
   String& source = String::Handle(String::New(script_chars));
-  Script& script = Script::Handle(Script::New(url,
-                                              source,
-                                              RawScript::kScriptTag));
+  Script& script =
+      Script::Handle(Script::New(url, source, RawScript::kScriptTag));
   Library& lib = Library::ZoneHandle(Library::CoreLibrary());
 
   script.Tokenize(String::Handle(String::New("")));
@@ -161,9 +160,8 @@
 
   String& url = String::Handle(String::New("dart-test:Parser_TopLevel"));
   String& source = String::Handle(String::New(script_chars));
-  Script& script = Script::Handle(Script::New(url,
-                                              source,
-                                              RawScript::kScriptTag));
+  Script& script =
+      Script::Handle(Script::New(url, source, RawScript::kScriptTag));
   Library& lib = Library::ZoneHandle(Library::CoreLibrary());
 
   script.Tokenize(String::Handle(String::New("")));
@@ -217,8 +215,7 @@
 static void SaveVars(Dart_IsolateId isolate_id,
                      intptr_t bp_id,
                      const Dart_CodeLocation& loc) {
-  DebuggerStackTrace* stack =
-      Isolate::Current()->debugger()->StackTrace();
+  DebuggerStackTrace* stack = Isolate::Current()->debugger()->StackTrace();
   intptr_t num_frames = stack->Length();
   const int kBufferLen = 2048;
   char* buffer = new char[kBufferLen];
@@ -228,13 +225,12 @@
     ActivationFrame* frame = stack->FrameAt(i);
     var_desc = frame->code().GetLocalVarDescriptors();
     const char* var_str = SkipIndex(var_desc.ToCString());
-    const char* function_str = String::Handle(
-        frame->function().QualifiedUserVisibleName()).ToCString();
-    pos += OS::SNPrint(pos, (kBufferLen - (pos - buffer)),
-                       "%s\n%s",
-                       function_str,
-                       var_str);
-    delete [] var_str;
+    const char* function_str =
+        String::Handle(frame->function().QualifiedUserVisibleName())
+            .ToCString();
+    pos += OS::SNPrint(pos, (kBufferLen - (pos - buffer)), "%s\n%s",
+                       function_str, var_str);
+    delete[] var_str;
   }
   pos[0] = '\0';
   saved_vars = buffer;
diff --git a/runtime/vm/port.cc b/runtime/vm/port.cc
index d5513d5..20a142d 100644
--- a/runtime/vm/port.cc
+++ b/runtime/vm/port.cc
@@ -112,11 +112,12 @@
     map_[index].handler->increment_live_ports();
   }
   if (FLAG_trace_isolates) {
-    OS::Print("[^] Port (%s) -> (%s): \n"
-              "\thandler:    %s\n"
-              "\tport:       %" Pd64 "\n",
-              PortStateString(old_state), PortStateString(state),
-              map_[index].handler->name(), port);
+    OS::Print(
+        "[^] Port (%s) -> (%s): \n"
+        "\thandler:    %s\n"
+        "\tport:       %" Pd64 "\n",
+        PortStateString(old_state), PortStateString(state),
+        map_[index].handler->name(), port);
   }
 }
 
@@ -174,10 +175,11 @@
   MaintainInvariants();
 
   if (FLAG_trace_isolates) {
-    OS::Print("[+] Opening port: \n"
-              "\thandler:    %s\n"
-              "\tport:       %" Pd64 "\n",
-              handler->name(), entry.port);
+    OS::Print(
+        "[+] Opening port: \n"
+        "\thandler:    %s\n"
+        "\tport:       %" Pd64 "\n",
+        handler->name(), entry.port);
   }
 
   return entry.port;
diff --git a/runtime/vm/port_test.cc b/runtime/vm/port_test.cc
index ee443cd..d42a3e6 100644
--- a/runtime/vm/port_test.cc
+++ b/runtime/vm/port_test.cc
@@ -34,9 +34,7 @@
  public:
   PortTestMessageHandler() : notify_count(0) {}
 
-  void MessageNotify(Message::Priority priority) {
-    notify_count++;
-  }
+  void MessageNotify(Message::Priority priority) { notify_count++; }
 
   MessageStatus HandleMessage(Message* message) { return kOK; }
 
@@ -141,9 +139,9 @@
   const char* message = "msg";
   intptr_t message_len = strlen(message) + 1;
 
-  EXPECT(PortMap::PostMessage(new Message(
-      port, reinterpret_cast<uint8_t*>(strdup(message)), message_len,
-      Message::kNormalPriority)));
+  EXPECT(PortMap::PostMessage(
+      new Message(port, reinterpret_cast<uint8_t*>(strdup(message)),
+                  message_len, Message::kNormalPriority)));
 
   // Check that the message notify callback was called.
   EXPECT_EQ(1, handler.notify_count);
@@ -156,8 +154,8 @@
   Dart_Port port = PortMap::CreatePort(&handler);
   EXPECT_EQ(0, handler.notify_count);
 
-  EXPECT(PortMap::PostMessage(new Message(
-      port, Smi::New(42), Message::kNormalPriority)));
+  EXPECT(PortMap::PostMessage(
+      new Message(port, Smi::New(42), Message::kNormalPriority)));
 
   // Check that the message notify callback was called.
   EXPECT_EQ(1, handler.notify_count);
@@ -170,8 +168,8 @@
   Dart_Port port = PortMap::CreatePort(&handler);
   EXPECT_EQ(0, handler.notify_count);
 
-  EXPECT(PortMap::PostMessage(new Message(
-      port, Object::null(), Message::kNormalPriority)));
+  EXPECT(PortMap::PostMessage(
+      new Message(port, Object::null(), Message::kNormalPriority)));
 
   // Check that the message notify callback was called.
   EXPECT_EQ(1, handler.notify_count);
@@ -188,9 +186,9 @@
   const char* message = "msg";
   intptr_t message_len = strlen(message) + 1;
 
-  EXPECT(!PortMap::PostMessage(new Message(
-      port, reinterpret_cast<uint8_t*>(strdup(message)), message_len,
-      Message::kNormalPriority)));
+  EXPECT(!PortMap::PostMessage(
+      new Message(port, reinterpret_cast<uint8_t*>(strdup(message)),
+                  message_len, Message::kNormalPriority)));
 }
 
 }  // namespace dart
diff --git a/runtime/vm/precompiler.cc b/runtime/vm/precompiler.cc
index 6f57ab8..5c50458 100644
--- a/runtime/vm/precompiler.cc
+++ b/runtime/vm/precompiler.cc
@@ -53,7 +53,10 @@
 
 DEFINE_FLAG(bool, print_unique_targets, false, "Print unique dynaic targets");
 DEFINE_FLAG(bool, trace_precompiler, false, "Trace precompiler.");
-DEFINE_FLAG(int, max_speculative_inlining_attempts, 1,
+DEFINE_FLAG(
+    int,
+    max_speculative_inlining_attempts,
+    1,
     "Max number of attempts with speculative inlining (precompilation only)");
 DEFINE_FLAG(int, precompiler_rounds, 1, "Number of precompiler iterations");
 
@@ -80,16 +83,13 @@
  public:
   explicit DartPrecompilationPipeline(Zone* zone,
                                       FieldTypeMap* field_map = NULL)
-      : zone_(zone),
-        result_type_(CompileType::None()),
-        field_map_(field_map) { }
+      : zone_(zone), result_type_(CompileType::None()), field_map_(field_map) {}
 
   virtual void FinalizeCompilation(FlowGraph* flow_graph) {
-    if ((field_map_ != NULL )&&
+    if ((field_map_ != NULL) &&
         flow_graph->function().IsGenerativeConstructor()) {
       for (BlockIterator block_it = flow_graph->reverse_postorder_iterator();
-           !block_it.Done();
-           block_it.Advance()) {
+           !block_it.Done(); block_it.Advance()) {
         ForwardInstructionIterator it(block_it.Current());
         for (; !it.Done(); it.Advance()) {
           StoreInstanceFieldInstr* store = it.Current()->AsStoreInstanceField();
@@ -106,18 +106,18 @@
                     &Field::Handle(zone_, store->field().raw()),  // Re-wrap.
                     store->value()->Type()->ToCid()));
                 if (FLAG_trace_precompiler && FLAG_support_il_printer) {
-                    THR_Print(" initial type = %s\n",
-                              store->value()->Type()->ToCString());
+                  THR_Print(" initial type = %s\n",
+                            store->value()->Type()->ToCString());
                 }
                 continue;
               }
               CompileType type = CompileType::FromCid(entry->cid_);
               if (FLAG_trace_precompiler && FLAG_support_il_printer) {
-                  THR_Print(" old type = %s\n", type.ToCString());
+                THR_Print(" old type = %s\n", type.ToCString());
               }
               type.Union(store->value()->Type());
               if (FLAG_trace_precompiler && FLAG_support_il_printer) {
-                  THR_Print(" new type = %s\n", type.ToCString());
+                THR_Print(" new type = %s\n", type.ToCString());
               }
               entry->cid_ = type.ToCid();
             }
@@ -128,8 +128,7 @@
 
     CompileType result_type = CompileType::None();
     for (BlockIterator block_it = flow_graph->reverse_postorder_iterator();
-         !block_it.Done();
-         block_it.Advance()) {
+         !block_it.Done(); block_it.Advance()) {
       ForwardInstructionIterator it(block_it.Current());
       for (; !it.Done(); it.Advance()) {
         ReturnInstr* return_instr = it.Current()->AsReturn();
@@ -158,8 +157,7 @@
       : precompiler_(precompiler),
         parsed_function_(parsed_function),
         optimized_(optimized),
-        thread_(Thread::Current()) {
-  }
+        thread_(Thread::Current()) {}
 
   bool Compile(CompilationPipeline* pipeline);
 
@@ -216,7 +214,8 @@
   const TypeArguments& type_arguments =
       TypeArguments::Handle(zone, type.arguments());
   if (!type_arguments.IsNull() &&
-      !type_arguments.IsRaw(0, type_arguments.Length())) return false;
+      !type_arguments.IsRaw(0, type_arguments.Length()))
+    return false;
 
 
   intptr_t type_cid = type.type_class_id();
@@ -290,36 +289,35 @@
 }
 
 
-Precompiler::Precompiler(Thread* thread, bool reset_fields) :
-    thread_(thread),
-    zone_(NULL),
-    isolate_(thread->isolate()),
-    reset_fields_(reset_fields),
-    changed_(false),
-    function_count_(0),
-    class_count_(0),
-    selector_count_(0),
-    dropped_function_count_(0),
-    dropped_field_count_(0),
-    dropped_class_count_(0),
-    dropped_typearg_count_(0),
-    dropped_type_count_(0),
-    dropped_library_count_(0),
-    libraries_(GrowableObjectArray::Handle(I->object_store()->libraries())),
-    pending_functions_(
-        GrowableObjectArray::Handle(GrowableObjectArray::New())),
-    sent_selectors_(),
-    enqueued_functions_(),
-    fields_to_retain_(),
-    functions_to_retain_(),
-    classes_to_retain_(),
-    typeargs_to_retain_(),
-    types_to_retain_(),
-    consts_to_retain_(),
-    field_type_map_(),
-    error_(Error::Handle()),
-    get_runtime_type_is_unique_(false) {
-}
+Precompiler::Precompiler(Thread* thread, bool reset_fields)
+    : thread_(thread),
+      zone_(NULL),
+      isolate_(thread->isolate()),
+      reset_fields_(reset_fields),
+      changed_(false),
+      function_count_(0),
+      class_count_(0),
+      selector_count_(0),
+      dropped_function_count_(0),
+      dropped_field_count_(0),
+      dropped_class_count_(0),
+      dropped_typearg_count_(0),
+      dropped_type_count_(0),
+      dropped_library_count_(0),
+      libraries_(GrowableObjectArray::Handle(I->object_store()->libraries())),
+      pending_functions_(
+          GrowableObjectArray::Handle(GrowableObjectArray::New())),
+      sent_selectors_(),
+      enqueued_functions_(),
+      fields_to_retain_(),
+      functions_to_retain_(),
+      classes_to_retain_(),
+      typeargs_to_retain_(),
+      types_to_retain_(),
+      consts_to_retain_(),
+      field_type_map_(),
+      error_(Error::Handle()),
+      get_runtime_type_is_unique_(false) {}
 
 
 void Precompiler::DoCompileAll(
@@ -330,7 +328,8 @@
     StackZone stack_zone(T);
     zone_ = stack_zone.GetZone();
 
-    { HANDLESCOPE(T);
+    {
+      HANDLESCOPE(T);
       // Make sure class hierarchy is stable before compilation so that CHA
       // can be used. Also ensures lookup of entry points won't miss functions
       // because their class hasn't been finalized yet.
@@ -454,15 +453,14 @@
   class StaticInitializerVisitor : public ClassVisitor {
    public:
     explicit StaticInitializerVisitor(Zone* zone)
-      : fields_(Array::Handle(zone)),
-        field_(Field::Handle(zone)),
-        function_(Function::Handle(zone)) { }
+        : fields_(Array::Handle(zone)),
+          field_(Field::Handle(zone)),
+          function_(Function::Handle(zone)) {}
     void Visit(const Class& cls) {
       fields_ = cls.fields();
       for (intptr_t j = 0; j < fields_.Length(); j++) {
         field_ ^= fields_.At(j);
-        if (field_.is_static() &&
-            field_.is_final() &&
+        if (field_.is_static() && field_.is_final() &&
             field_.has_initializer()) {
           if (FLAG_trace_precompiler) {
             THR_Print("Precompiling initializer for %s\n", field_.ToCString());
@@ -488,8 +486,7 @@
   class ConstructorVisitor : public FunctionVisitor {
    public:
     explicit ConstructorVisitor(Precompiler* precompiler, Zone* zone)
-        : precompiler_(precompiler), zone_(zone) {
-    }
+        : precompiler_(precompiler), zone_(zone) {}
     void Visit(const Function& function) {
       if (!function.IsGenerativeConstructor()) return;
       if (function.HasCode()) {
@@ -500,10 +497,7 @@
       if (FLAG_trace_precompiler) {
         THR_Print("Precompiling constructor %s\n", function.ToCString());
       }
-      CompileFunction(precompiler_,
-                      Thread::Current(),
-                      zone_,
-                      function,
+      CompileFunction(precompiler_, Thread::Current(), zone_, function,
                       precompiler_->field_type_map());
     }
 
@@ -517,14 +511,14 @@
   VisitFunctions(&visitor);
 
   FieldTypeMap::Iterator it(field_type_map_.GetIterator());
-  for (FieldTypePair* current = it.Next();
-       current != NULL;
+  for (FieldTypePair* current = it.Next(); current != NULL;
        current = it.Next()) {
     const intptr_t cid = current->cid_;
     current->field_->set_guarded_cid(cid);
     current->field_->set_is_nullable(cid == kNullCid || cid == kDynamicCid);
     if (FLAG_trace_precompiler) {
-      THR_Print("Field %s <- Type %s\n", current->field_->ToCString(),
+      THR_Print(
+          "Field %s <- Type %s\n", current->field_->ToCString(),
           Class::Handle(T->isolate()->class_table()->At(cid)).ToCString());
     }
   }
@@ -542,9 +536,7 @@
   VisitFunctions(&function_visitor);
 
   class ClearCodeClassVisitor : public ClassVisitor {
-    void Visit(const Class& cls) {
-      cls.DisableAllocationStub();
-    }
+    void Visit(const Class& cls) { cls.DisableAllocationStub(); }
   };
   ClearCodeClassVisitor class_visitor;
   VisitClasses(&class_visitor);
@@ -566,10 +558,8 @@
     if (!isolate()->class_table()->HasValidClassAt(cid)) {
       continue;
     }
-    if ((cid == kDynamicCid) ||
-        (cid == kVoidCid) ||
-        (cid == kFreeListElement) ||
-        (cid == kForwardingCorpse)) {
+    if ((cid == kDynamicCid) || (cid == kVoidCid) ||
+        (cid == kFreeListElement) || (cid == kForwardingCorpse)) {
       continue;
     }
     cls = isolate()->class_table()->At(cid);
@@ -578,49 +568,48 @@
 
   Dart_QualifiedFunctionName vm_entry_points[] = {
     // Functions
-    { "dart:async", "::", "_setScheduleImmediateClosure" },
-    { "dart:core", "::", "_completeDeferredLoads" },
-    { "dart:core", "AbstractClassInstantiationError",
-                   "AbstractClassInstantiationError._create" },
-    { "dart:core", "ArgumentError", "ArgumentError." },
-    { "dart:core", "CyclicInitializationError",
-                   "CyclicInitializationError." },
-    { "dart:core", "FallThroughError", "FallThroughError._create" },
-    { "dart:core", "FormatException", "FormatException." },
-    { "dart:core", "NoSuchMethodError", "NoSuchMethodError._withType" },
-    { "dart:core", "NullThrownError", "NullThrownError." },
-    { "dart:core", "OutOfMemoryError", "OutOfMemoryError." },
-    { "dart:core", "RangeError", "RangeError." },
-    { "dart:core", "RangeError", "RangeError.range" },
-    { "dart:core", "StackOverflowError", "StackOverflowError." },
-    { "dart:core", "UnsupportedError", "UnsupportedError." },
-    { "dart:core", "_AssertionError", "_AssertionError._create" },
-    { "dart:core", "_CastError", "_CastError._create" },
-    { "dart:core", "_InternalError", "_InternalError." },
-    { "dart:core", "_InvocationMirror", "_allocateInvocationMirror" },
-    { "dart:core", "_TypeError", "_TypeError._create" },
-    { "dart:isolate", "IsolateSpawnException", "IsolateSpawnException." },
-    { "dart:isolate", "::", "_getIsolateScheduleImmediateClosure" },
-    { "dart:isolate", "::", "_setupHooks" },
-    { "dart:isolate", "::", "_startMainIsolate" },
-    { "dart:isolate", "::", "_startIsolate" },
-    { "dart:isolate", "_RawReceivePortImpl", "_handleMessage" },
-    { "dart:isolate", "_RawReceivePortImpl", "_lookupHandler" },
-    { "dart:isolate", "_SendPortImpl", "send" },
-    { "dart:typed_data", "ByteData", "ByteData." },
-    { "dart:typed_data", "ByteData", "ByteData._view" },
-    { "dart:typed_data", "ByteBuffer", "ByteBuffer._New" },
-    { "dart:_vmservice", "::", "_registerIsolate" },
-    { "dart:_vmservice", "::", "boot" },
+    {"dart:async", "::", "_setScheduleImmediateClosure"},
+    {"dart:core", "::", "_completeDeferredLoads"},
+    {"dart:core", "AbstractClassInstantiationError",
+     "AbstractClassInstantiationError._create"},
+    {"dart:core", "ArgumentError", "ArgumentError."},
+    {"dart:core", "CyclicInitializationError", "CyclicInitializationError."},
+    {"dart:core", "FallThroughError", "FallThroughError._create"},
+    {"dart:core", "FormatException", "FormatException."},
+    {"dart:core", "NoSuchMethodError", "NoSuchMethodError._withType"},
+    {"dart:core", "NullThrownError", "NullThrownError."},
+    {"dart:core", "OutOfMemoryError", "OutOfMemoryError."},
+    {"dart:core", "RangeError", "RangeError."},
+    {"dart:core", "RangeError", "RangeError.range"},
+    {"dart:core", "StackOverflowError", "StackOverflowError."},
+    {"dart:core", "UnsupportedError", "UnsupportedError."},
+    {"dart:core", "_AssertionError", "_AssertionError._create"},
+    {"dart:core", "_CastError", "_CastError._create"},
+    {"dart:core", "_InternalError", "_InternalError."},
+    {"dart:core", "_InvocationMirror", "_allocateInvocationMirror"},
+    {"dart:core", "_TypeError", "_TypeError._create"},
+    {"dart:isolate", "IsolateSpawnException", "IsolateSpawnException."},
+    {"dart:isolate", "::", "_getIsolateScheduleImmediateClosure"},
+    {"dart:isolate", "::", "_setupHooks"},
+    {"dart:isolate", "::", "_startMainIsolate"},
+    {"dart:isolate", "::", "_startIsolate"},
+    {"dart:isolate", "_RawReceivePortImpl", "_handleMessage"},
+    {"dart:isolate", "_RawReceivePortImpl", "_lookupHandler"},
+    {"dart:isolate", "_SendPortImpl", "send"},
+    {"dart:typed_data", "ByteData", "ByteData."},
+    {"dart:typed_data", "ByteData", "ByteData._view"},
+    {"dart:typed_data", "ByteBuffer", "ByteBuffer._New"},
+    {"dart:_vmservice", "::", "_registerIsolate"},
+    {"dart:_vmservice", "::", "boot"},
 #if !defined(PRODUCT)
-    { "dart:developer", "Metrics", "_printMetrics" },
-    { "dart:developer", "::", "_runExtension" },
-    { "dart:isolate", "::", "_runPendingImmediateCallback" },
+    {"dart:developer", "Metrics", "_printMetrics"},
+    {"dart:developer", "::", "_runExtension"},
+    {"dart:isolate", "::", "_runPendingImmediateCallback"},
 #endif  // !PRODUCT
     // Fields
-    { "dart:core", "Error", "_stackTrace" },
-    { "dart:math", "_Random", "_state" },
-    { NULL, NULL, NULL }  // Must be terminated with NULL entries.
+    {"dart:core", "Error", "_stackTrace"},
+    {"dart:math", "_Random", "_state"},
+    {NULL, NULL, NULL}  // Must be terminated with NULL entries.
   };
 
   AddEntryPoints(vm_entry_points);
@@ -644,8 +633,9 @@
 
     lib = Library::LookupLibrary(T, library_uri);
     if (lib.IsNull()) {
-      String& msg = String::Handle(Z, String::NewFormatted(
-          "Cannot find entry point %s\n", entry_points[i].library_uri));
+      String& msg =
+          String::Handle(Z, String::NewFormatted("Cannot find entry point %s\n",
+                                                 entry_points[i].library_uri));
       Jump(Error::Handle(Z, ApiError::New(msg)));
       UNREACHABLE();
     }
@@ -662,10 +652,10 @@
       }
       cls = lib.LookupLocalClass(class_name);
       if (cls.IsNull()) {
-        String& msg = String::Handle(Z, String::NewFormatted(
-            "Cannot find entry point %s %s\n",
-            entry_points[i].library_uri,
-            entry_points[i].class_name));
+        String& msg = String::Handle(
+            Z, String::NewFormatted("Cannot find entry point %s %s\n",
+                                    entry_points[i].library_uri,
+                                    entry_points[i].class_name));
         Jump(Error::Handle(Z, ApiError::New(msg)));
         UNREACHABLE();
       }
@@ -676,11 +666,11 @@
     }
 
     if (func.IsNull() && field.IsNull()) {
-      String& msg = String::Handle(Z, String::NewFormatted(
-          "Cannot find entry point %s %s %s\n",
-          entry_points[i].library_uri,
-          entry_points[i].class_name,
-          entry_points[i].function_name));
+      String& msg = String::Handle(
+          Z, String::NewFormatted("Cannot find entry point %s %s %s\n",
+                                  entry_points[i].library_uri,
+                                  entry_points[i].class_name,
+                                  entry_points[i].function_name));
       Jump(Error::Handle(Z, ApiError::New(msg)));
       UNREACHABLE();
     }
@@ -759,8 +749,7 @@
         if (FLAG_trace_precompiler) {
           THR_Print("Found callback field %s\n", field_name.ToCString());
         }
-        args_desc =
-            ArgumentsDescriptor::New(function.num_fixed_parameters());
+        args_desc = ArgumentsDescriptor::New(function.num_fixed_parameters());
         cids.Clear();
         if (T->cha()->ConcreteSubclasses(cls, &cids)) {
           for (intptr_t j = 0; j < cids.length(); ++j) {
@@ -768,9 +757,7 @@
             if (subcls.is_allocated()) {
               // Add dispatcher to cls.
               dispatcher = subcls.GetInvocationDispatcher(
-                  field_name,
-                  args_desc,
-                  RawFunction::kInvokeFieldDispatcher,
+                  field_name, args_desc, RawFunction::kInvokeFieldDispatcher,
                   /* create_if_absent = */ true);
               if (FLAG_trace_precompiler) {
                 THR_Print("Added invoke-field-dispatcher for %s to %s\n",
@@ -791,8 +778,7 @@
     function_count_++;
 
     if (FLAG_trace_precompiler) {
-      THR_Print("Precompiling %" Pd " %s (%s, %s)\n",
-                function_count_,
+      THR_Print("Precompiling %" Pd " %s (%s, %s)\n", function_count_,
                 function.ToLibNamePrefixedQualifiedCString(),
                 function.token_pos().ToCString(),
                 Function::KindToCString(function.kind()));
@@ -1057,10 +1043,10 @@
 
   class ConstObjectVisitor : public ObjectPointerVisitor {
    public:
-    ConstObjectVisitor(Precompiler* precompiler, Isolate* isolate) :
-        ObjectPointerVisitor(isolate),
-        precompiler_(precompiler),
-        subinstance_(Object::Handle()) {}
+    ConstObjectVisitor(Precompiler* precompiler, Isolate* isolate)
+        : ObjectPointerVisitor(isolate),
+          precompiler_(precompiler),
+          subinstance_(Object::Handle()) {}
 
     virtual void VisitPointers(RawObject** first, RawObject** last) {
       for (RawObject** current = first; current <= last; current++) {
@@ -1087,11 +1073,10 @@
       Array::Handle(Z, call_site.arguments_descriptor());
   const Class& cache_class =
       Class::Handle(Z, I->object_store()->closure_class());
-  const Function& dispatcher = Function::Handle(Z,
-      cache_class.GetInvocationDispatcher(Symbols::Call(),
-                                          arguments_descriptor,
-                                          RawFunction::kInvokeFieldDispatcher,
-                                          true /* create_if_absent */));
+  const Function& dispatcher = Function::Handle(
+      Z, cache_class.GetInvocationDispatcher(
+             Symbols::Call(), arguments_descriptor,
+             RawFunction::kInvokeFieldDispatcher, true /* create_if_absent */));
   AddFunction(dispatcher);
 }
 
@@ -1118,8 +1103,8 @@
           THR_Print("Precompiling initializer for %s\n", field.ToCString());
         }
         ASSERT(Dart::snapshot_kind() != Snapshot::kAppNoJIT);
-        const Function& initializer = Function::Handle(Z,
-            CompileStaticInitializer(field, /* compute_type = */ true));
+        const Function& initializer = Function::Handle(
+            Z, CompileStaticInitializer(field, /* compute_type = */ true));
         ASSERT(!initializer.IsNull());
         field.SetPrecompiledInitializer(initializer);
         AddCalleesOf(initializer);
@@ -1187,8 +1172,7 @@
   } else {
     Thread* const thread = Thread::Current();
     StackZone zone(thread);
-    const Error& error =
-        Error::Handle(thread->zone(), thread->sticky_error());
+    const Error& error = Error::Handle(thread->zone(), thread->sticky_error());
     thread->clear_sticky_error();
     return error.raw();
   }
@@ -1214,7 +1198,7 @@
     const Function& func = Function::ZoneHandle(Function::New(
         String::Handle(Symbols::New(thread, kEvalConst)),
         RawFunction::kRegularFunction,
-        true,  // static function
+        true,   // static function
         false,  // not const function
         false,  // not abstract
         false,  // not external
@@ -1235,8 +1219,7 @@
     ParsedFunction* parsed_function = new ParsedFunction(thread, func);
     parsed_function->SetNodeSequence(fragment);
     fragment->scope()->AddVariable(parsed_function->EnsureExpressionTemp());
-    fragment->scope()->AddVariable(
-        parsed_function->current_context_var());
+    fragment->scope()->AddVariable(parsed_function->current_context_var());
     parsed_function->AllocateVariables();
 
     // Non-optimized code generator.
@@ -1245,16 +1228,15 @@
                                           parsed_function,
                                           /* optimized = */ false);
     helper.Compile(&pipeline);
-    Code::Handle(func.unoptimized_code()).set_var_descriptors(
-        Object::empty_var_descriptors());
+    Code::Handle(func.unoptimized_code())
+        .set_var_descriptors(Object::empty_var_descriptors());
 
     const Object& result = PassiveObject::Handle(
         DartEntry::InvokeFunction(func, Object::empty_array()));
     return result.raw();
   } else {
     Thread* const thread = Thread::Current();
-    const Object& result =
-      PassiveObject::Handle(thread->sticky_error());
+    const Object& result = PassiveObject::Handle(thread->sticky_error());
     thread->clear_sticky_error();
     return result.raw();
   }
@@ -1289,8 +1271,7 @@
     changed_ = true;
 
     if (FLAG_trace_precompiler) {
-      THR_Print("Enqueueing selector %" Pd " %s\n",
-                selector_count_,
+      THR_Print("Enqueueing selector %" Pd " %s\n", selector_count_,
                 selector.ToCString());
     }
   }
@@ -1362,8 +1343,8 @@
             // Function is get:foo and somewhere foo is called.
             AddFunction(function);
           }
-          selector3 = Symbols::LookupFromConcat(thread(),
-              Symbols::ClosurizePrefix(), selector2);
+          selector3 = Symbols::LookupFromConcat(
+              thread(), Symbols::ClosurizePrefix(), selector2);
           if (IsSent(selector3)) {
             // Hash-closurization.
             // Function is get:foo and somewhere get:#foo is called.
@@ -1377,8 +1358,8 @@
             AddFunction(function2);
           }
         } else if (Field::IsSetterName(selector)) {
-          selector2 = Symbols::LookupFromConcat(thread(),
-              Symbols::ClosurizePrefix(), selector);
+          selector2 = Symbols::LookupFromConcat(
+              thread(), Symbols::ClosurizePrefix(), selector);
           if (IsSent(selector2)) {
             // Hash-closurization.
             // Function is set:foo and somewhere get:#set:foo is called.
@@ -1403,8 +1384,8 @@
             function2 = function.GetMethodExtractor(selector2);
             AddFunction(function2);
           }
-          selector2 = Symbols::LookupFromConcat(thread(),
-              Symbols::ClosurizePrefix(), selector);
+          selector2 = Symbols::LookupFromConcat(
+              thread(), Symbols::ClosurizePrefix(), selector);
           if (IsSent(selector2)) {
             // Hash-closurization.
             // Function is foo and somewhere get:#foo is called.
@@ -1429,14 +1410,10 @@
 
   static bool IsMatch(const Object& a, const Object& b) {
     return a.IsString() && b.IsString() &&
-        String::Cast(a).Equals(String::Cast(b));
+           String::Cast(a).Equals(String::Cast(b));
   }
-  static uword Hash(const Object& obj) {
-    return String::Cast(obj).Hash();
-  }
-  static RawObject* NewKey(const String& str) {
-    return str.raw();
-  }
+  static uword Hash(const Object& obj) { return String::Cast(obj).Hash(); }
+  static RawObject* NewKey(const String& str) { return str.raw(); }
 };
 
 typedef UnorderedHashMap<NameFunctionsTraits> Table;
@@ -1530,7 +1507,7 @@
       THR_Print("* %s\n", function.ToQualifiedCString());
     }
     THR_Print("%" Pd " of %" Pd " dynamic selectors are unique\n",
-        functions_set.NumOccupied(), table.NumOccupied());
+              functions_set.NumOccupied(), table.NumOccupied());
   }
 
   isolate()->object_store()->set_unique_dynamic_targets(
@@ -1736,8 +1713,7 @@
           }
           dropped_field_count_++;
           if (FLAG_trace_precompiler) {
-            THR_Print("Dropping field %s\n",
-                      field.ToCString());
+            THR_Print("Dropping field %s\n", field.ToCString());
           }
         }
       }
@@ -1816,8 +1792,8 @@
   // Now construct a new type arguments table and save in the object store.
   const intptr_t dict_size =
       Utils::RoundUpToPowerOfTwo(retained_typeargs.Length() * 4 / 3);
-  typeargs_array = HashTables::New<CanonicalTypeArgumentsSet>(dict_size,
-                                                              Heap::kOld);
+  typeargs_array =
+      HashTables::New<CanonicalTypeArgumentsSet>(dict_size, Heap::kOld);
   CanonicalTypeArgumentsSet typeargs_table(Z, typeargs_array.raw());
   bool present;
   for (intptr_t i = 0; i < retained_typeargs.Length(); i++) {
@@ -1969,8 +1945,7 @@
         class_table->StatsWithUpdatedSize(cid)->post_gc.old_count;
     if (instances != 0) {
       FATAL2("Want to drop class %s, but it has %" Pd " instances\n",
-             cls.ToCString(),
-             instances);
+             cls.ToCString(), instances);
     }
 #endif
 
@@ -1994,8 +1969,8 @@
 void Precompiler::DropLibraries() {
   const GrowableObjectArray& retained_libraries =
       GrowableObjectArray::Handle(Z, GrowableObjectArray::New());
-  const Library& root_lib = Library::Handle(Z,
-      I->object_store()->root_library());
+  const Library& root_lib =
+      Library::Handle(Z, I->object_store()->root_library());
   Library& lib = Library::Handle(Z);
 
   for (intptr_t i = 0; i < libraries_.Length(); i++) {
@@ -2047,13 +2022,12 @@
 void Precompiler::BindStaticCalls() {
   class BindStaticCallsVisitor : public FunctionVisitor {
    public:
-    explicit BindStaticCallsVisitor(Zone* zone) :
-        code_(Code::Handle(zone)),
-        table_(Array::Handle(zone)),
-        pc_offset_(Smi::Handle(zone)),
-        target_(Function::Handle(zone)),
-        target_code_(Code::Handle(zone)) {
-    }
+    explicit BindStaticCallsVisitor(Zone* zone)
+        : code_(Code::Handle(zone)),
+          table_(Array::Handle(zone)),
+          pc_offset_(Smi::Handle(zone)),
+          target_(Function::Handle(zone)),
+          target_code_(Code::Handle(zone)) {}
 
     void Visit(const Function& function) {
       if (!function.HasCode()) {
@@ -2062,8 +2036,7 @@
       code_ = function.CurrentCode();
       table_ = code_.static_calls_target_table();
 
-      for (intptr_t i = 0;
-           i < table_.Length();
+      for (intptr_t i = 0; i < table_.Length();
            i += Code::kSCallTableEntryLength) {
         pc_offset_ ^= table_.At(i + Code::kSCallTableOffsetEntry);
         target_ ^= table_.At(i + Code::kSCallTableFunctionEntry);
@@ -2114,18 +2087,17 @@
 
   class SwitchICCallsVisitor : public FunctionVisitor {
    public:
-    explicit SwitchICCallsVisitor(Zone* zone) :
-        zone_(zone),
-        code_(Code::Handle(zone)),
-        pool_(ObjectPool::Handle(zone)),
-        entry_(Object::Handle(zone)),
-        ic_(ICData::Handle(zone)),
-        target_name_(String::Handle(zone)),
-        args_descriptor_(Array::Handle(zone)),
-        unlinked_(UnlinkedCall::Handle(zone)),
-        target_code_(Code::Handle(zone)),
-        canonical_unlinked_calls_() {
-    }
+    explicit SwitchICCallsVisitor(Zone* zone)
+        : zone_(zone),
+          code_(Code::Handle(zone)),
+          pool_(ObjectPool::Handle(zone)),
+          entry_(Object::Handle(zone)),
+          ic_(ICData::Handle(zone)),
+          target_name_(String::Handle(zone)),
+          args_descriptor_(Array::Handle(zone)),
+          unlinked_(UnlinkedCall::Handle(zone)),
+          target_code_(Code::Handle(zone)),
+          canonical_unlinked_calls_() {}
 
     void Visit(const Function& function) {
       if (!function.HasCode()) {
@@ -2191,18 +2163,18 @@
 
 
 void Precompiler::ShareMegamorphicBuckets() {
-  const GrowableObjectArray& table = GrowableObjectArray::Handle(Z,
-      I->object_store()->megamorphic_cache_table());
+  const GrowableObjectArray& table = GrowableObjectArray::Handle(
+      Z, I->object_store()->megamorphic_cache_table());
   if (table.IsNull()) return;
   MegamorphicCache& cache = MegamorphicCache::Handle(Z);
 
   const intptr_t capacity = 1;
-  const Array& buckets = Array::Handle(Z,
-      Array::New(MegamorphicCache::kEntryLength * capacity, Heap::kOld));
+  const Array& buckets = Array::Handle(
+      Z, Array::New(MegamorphicCache::kEntryLength * capacity, Heap::kOld));
   const Function& handler =
       Function::Handle(Z, MegamorphicCacheTable::miss_handler(I));
-  MegamorphicCache::SetEntry(buckets, 0,
-                             MegamorphicCache::smi_illegal_cid(), handler);
+  MegamorphicCache::SetEntry(buckets, 0, MegamorphicCache::smi_illegal_cid(),
+                             handler);
 
   for (intptr_t i = 0; i < table.Length(); i++) {
     cache ^= table.At(i);
@@ -2216,13 +2188,12 @@
 void Precompiler::DedupStackmaps() {
   class DedupStackmapsVisitor : public FunctionVisitor {
    public:
-    explicit DedupStackmapsVisitor(Zone* zone) :
-      zone_(zone),
-      canonical_stackmaps_(),
-      code_(Code::Handle(zone)),
-      stackmaps_(Array::Handle(zone)),
-      stackmap_(Stackmap::Handle(zone)) {
-    }
+    explicit DedupStackmapsVisitor(Zone* zone)
+        : zone_(zone),
+          canonical_stackmaps_(),
+          code_(Code::Handle(zone)),
+          stackmaps_(Array::Handle(zone)),
+          stackmap_(Stackmap::Handle(zone)) {}
 
     void Visit(const Function& function) {
       if (!function.HasCode()) {
@@ -2266,12 +2237,11 @@
 void Precompiler::DedupLists() {
   class DedupListsVisitor : public FunctionVisitor {
    public:
-    explicit DedupListsVisitor(Zone* zone) :
-      zone_(zone),
-      canonical_lists_(),
-      code_(Code::Handle(zone)),
-      list_(Array::Handle(zone)) {
-    }
+    explicit DedupListsVisitor(Zone* zone)
+        : zone_(zone),
+          canonical_lists_(),
+          code_(Code::Handle(zone)),
+          list_(Array::Handle(zone)) {}
 
     void Visit(const Function& function) {
       code_ = function.CurrentCode();
@@ -2285,10 +2255,8 @@
 
       list_ = function.parameter_types();
       if (!list_.IsNull()) {
-        if (!function.IsSignatureFunction() &&
-            !function.IsClosureFunction() &&
-            (function.name() != Symbols::Call().raw()) &&
-            !list_.InVMHeap()) {
+        if (!function.IsSignatureFunction() && !function.IsClosureFunction() &&
+            (function.name() != Symbols::Call().raw()) && !list_.InVMHeap()) {
           // Parameter types not needed for function type tests.
           for (intptr_t i = 0; i < list_.Length(); i++) {
             list_.SetAt(i, Object::dynamic_type());
@@ -2300,8 +2268,7 @@
 
       list_ = function.parameter_names();
       if (!list_.IsNull()) {
-        if (!function.HasOptionalNamedParameters() &&
-            !list_.InVMHeap()) {
+        if (!function.HasOptionalNamedParameters() && !list_.InVMHeap()) {
           // Parameter names not needed for resolution.
           for (intptr_t i = 0; i < list_.Length(); i++) {
             list_.SetAt(i, Symbols::OptimizedOut());
@@ -2337,12 +2304,11 @@
 void Precompiler::DedupInstructions() {
   class DedupInstructionsVisitor : public FunctionVisitor {
    public:
-    explicit DedupInstructionsVisitor(Zone* zone) :
-      zone_(zone),
-      canonical_instructions_set_(),
-      code_(Code::Handle(zone)),
-      instructions_(Instructions::Handle(zone)) {
-    }
+    explicit DedupInstructionsVisitor(Zone* zone)
+        : zone_(zone),
+          canonical_instructions_set_(),
+          code_(Code::Handle(zone)),
+          instructions_(Instructions::Handle(zone)) {}
 
     void Visit(const Function& function) {
       if (!function.HasCode()) {
@@ -2463,9 +2429,11 @@
     lib ^= libraries_.At(i);
     if (!lib.Loaded()) {
       String& uri = String::Handle(Z, lib.url());
-      String& msg = String::Handle(Z, String::NewFormatted(
-          "Library '%s' is not loaded. "
-          "Did you forget to call Dart_FinalizeLoading?", uri.ToCString()));
+      String& msg = String::Handle(
+          Z,
+          String::NewFormatted("Library '%s' is not loaded. "
+                               "Did you forget to call Dart_FinalizeLoading?",
+                               uri.ToCString()));
       Jump(Error::Handle(Z, ApiError::New(msg)));
     }
 
@@ -2523,8 +2491,8 @@
     if (old_to_new_cid[cid] == -1) {
       old_to_new_cid[cid] = next_new_cid++;
       if (FLAG_trace_precompiler) {
-        THR_Print("%" Pd ": %s, was %" Pd "\n",
-                  old_to_new_cid[cid], cls.ToCString(), cid);
+        THR_Print("%" Pd ": %s, was %" Pd "\n", old_to_new_cid[cid],
+                  cls.ToCString(), cid);
       }
     }
     subclasses = cls.direct_subclasses();
@@ -2543,8 +2511,8 @@
       old_to_new_cid[cid] = next_new_cid++;
       if (FLAG_trace_precompiler && table->HasValidClassAt(cid)) {
         cls = table->At(cid);
-        THR_Print("%" Pd ": %s, was %" Pd "\n",
-                  old_to_new_cid[cid], cls.ToCString(), cid);
+        THR_Print("%" Pd ": %s, was %" Pd "\n", old_to_new_cid[cid],
+                  cls.ToCString(), cid);
       }
     }
   }
@@ -2558,7 +2526,7 @@
 class CidRewriteVisitor : public ObjectVisitor {
  public:
   explicit CidRewriteVisitor(intptr_t* old_to_new_cids)
-      : old_to_new_cids_(old_to_new_cids) { }
+      : old_to_new_cids_(old_to_new_cids) {}
 
   intptr_t Map(intptr_t cid) {
     ASSERT(cid != -1);
@@ -2670,8 +2638,8 @@
            deopt_info_array.Length() * sizeof(uword));
   // Allocates instruction object. Since this occurs only at safepoint,
   // there can be no concurrent access to the instruction page.
-  const Code& code = Code::Handle(
-      Code::FinalizeCode(function, assembler, optimized()));
+  const Code& code =
+      Code::Handle(Code::FinalizeCode(function, assembler, optimized()));
   code.set_is_optimized(optimized());
   code.set_owner(function);
   if (!function.IsOptimizable()) {
@@ -2681,8 +2649,7 @@
   }
 
   const Array& intervals = graph_compiler->inlined_code_intervals();
-  INC_STAT(thread(), total_code_size,
-           intervals.Length() * sizeof(uword));
+  INC_STAT(thread(), total_code_size, intervals.Length() * sizeof(uword));
   code.SetInlinedIntervals(intervals);
 
   const Array& inlined_id_array =
@@ -2767,16 +2734,13 @@
       {
         CSTAT_TIMER_SCOPE(thread(), graphbuilder_timer);
         ZoneGrowableArray<const ICData*>* ic_data_array =
-            new(zone) ZoneGrowableArray<const ICData*>();
+            new (zone) ZoneGrowableArray<const ICData*>();
 #ifndef PRODUCT
-        TimelineDurationScope tds(thread(),
-                                  compiler_timeline,
+        TimelineDurationScope tds(thread(), compiler_timeline,
                                   "BuildFlowGraph");
 #endif  // !PRODUCT
-        flow_graph = pipeline->BuildFlowGraph(zone,
-                                              parsed_function(),
-                                              *ic_data_array,
-                                              Compiler::kNoOSRDeoptId);
+        flow_graph = pipeline->BuildFlowGraph(
+            zone, parsed_function(), *ic_data_array, Compiler::kNoOSRDeoptId);
       }
 
       const bool print_flow_graph =
@@ -2790,9 +2754,7 @@
 
       if (optimized()) {
 #ifndef PRODUCT
-        TimelineDurationScope tds(thread(),
-                                  compiler_timeline,
-                                  "ComputeSSA");
+        TimelineDurationScope tds(thread(), compiler_timeline, "ComputeSSA");
 #endif  // !PRODUCT
         CSTAT_TIMER_SCOPE(thread(), ssa_timer);
         // Transform to SSA (virtual register 0 and no inlining arguments).
@@ -2815,8 +2777,7 @@
       // potentially affect optimizations.
       if (optimized()) {
 #ifndef PRODUCT
-        TimelineDurationScope tds(thread(),
-                                  compiler_timeline,
+        TimelineDurationScope tds(thread(), compiler_timeline,
                                   "OptimizationPasses");
 #endif  // !PRODUCT
         inline_id_to_function.Add(&function);
@@ -2830,10 +2791,8 @@
         caller_inline_id.Add(-1);
         CSTAT_TIMER_SCOPE(thread(), graphoptimizer_timer);
 
-        AotOptimizer optimizer(precompiler_,
-                               flow_graph,
-                               use_speculative_inlining,
-                               &inlining_black_list);
+        AotOptimizer optimizer(precompiler_, flow_graph,
+                               use_speculative_inlining, &inlining_black_list);
         optimizer.PopulateWithICData();
 
         optimizer.ApplyClassIds();
@@ -2855,9 +2814,7 @@
         // Inlining (mutates the flow graph)
         if (FLAG_use_inlining) {
 #ifndef PRODUCT
-          TimelineDurationScope tds2(thread(),
-                                     compiler_timeline,
-                                     "Inlining");
+          TimelineDurationScope tds2(thread(), compiler_timeline, "Inlining");
 #endif  // !PRODUCT
           CSTAT_TIMER_SCOPE(thread(), graphinliner_timer);
           // Propagate types to create more inlining opportunities.
@@ -2868,13 +2825,10 @@
           optimizer.ApplyClassIds();
           DEBUG_ASSERT(flow_graph->VerifyUseLists());
 
-          FlowGraphInliner inliner(flow_graph,
-                                   &inline_id_to_function,
-                                   &inline_id_to_token_pos,
-                                   &caller_inline_id,
+          FlowGraphInliner inliner(flow_graph, &inline_id_to_function,
+                                   &inline_id_to_token_pos, &caller_inline_id,
                                    use_speculative_inlining,
-                                   &inlining_black_list,
-                                   precompiler_);
+                                   &inlining_black_list, precompiler_);
           inliner.Inline();
           // Use lists are maintained and validated by the inliner.
           DEBUG_ASSERT(flow_graph->VerifyUseLists());
@@ -2886,8 +2840,7 @@
 
         {
 #ifndef PRODUCT
-          TimelineDurationScope tds2(thread(),
-                                     compiler_timeline,
+          TimelineDurationScope tds2(thread(), compiler_timeline,
                                      "ApplyClassIds");
 #endif  // !PRODUCT
           // Use propagated class-ids to optimize further.
@@ -2910,8 +2863,7 @@
 
         {
 #ifndef PRODUCT
-          TimelineDurationScope tds2(thread(),
-                                     compiler_timeline,
+          TimelineDurationScope tds2(thread(), compiler_timeline,
                                      "BranchSimplifier");
 #endif  // !PRODUCT
           BranchSimplifier::Simplify(flow_graph);
@@ -2923,8 +2875,7 @@
 
         if (FLAG_constant_propagation) {
 #ifndef PRODUCT
-          TimelineDurationScope tds2(thread(),
-                                     compiler_timeline,
+          TimelineDurationScope tds2(thread(), compiler_timeline,
                                      "ConstantPropagation");
 #endif  // !PRODUCT
           ConstantPropagator::Optimize(flow_graph);
@@ -2954,8 +2905,7 @@
 
         {
 #ifndef PRODUCT
-          TimelineDurationScope tds2(thread(),
-                                     compiler_timeline,
+          TimelineDurationScope tds2(thread(), compiler_timeline,
                                      "SelectRepresentations");
 #endif  // !PRODUCT
           // Where beneficial convert Smi operations into Int32 operations.
@@ -2971,8 +2921,7 @@
 
         {
 #ifndef PRODUCT
-          TimelineDurationScope tds2(thread(),
-                                     compiler_timeline,
+          TimelineDurationScope tds2(thread(), compiler_timeline,
                                      "CommonSubexpressionElinination");
 #endif  // !PRODUCT
           if (FLAG_common_subexpression_elimination ||
@@ -3013,8 +2962,7 @@
 
         {
 #ifndef PRODUCT
-          TimelineDurationScope tds2(thread(),
-                                     compiler_timeline,
+          TimelineDurationScope tds2(thread(), compiler_timeline,
                                      "DeadStoreElimination");
 #endif  // !PRODUCT
           DeadStoreElimination::Optimize(flow_graph);
@@ -3022,8 +2970,7 @@
 
         if (FLAG_range_analysis) {
 #ifndef PRODUCT
-          TimelineDurationScope tds2(thread(),
-                                     compiler_timeline,
+          TimelineDurationScope tds2(thread(), compiler_timeline,
                                      "RangeAnalysis");
 #endif  // !PRODUCT
           // Propagate types after store-load-forwarding. Some phis may have
@@ -3041,8 +2988,7 @@
 
         if (FLAG_constant_propagation) {
 #ifndef PRODUCT
-          TimelineDurationScope tds2(thread(),
-                                     compiler_timeline,
+          TimelineDurationScope tds2(thread(), compiler_timeline,
                                      "ConstantPropagator::OptimizeBranches");
 #endif  // !PRODUCT
           // Constant propagation can use information from range analysis to
@@ -3059,8 +3005,7 @@
 
         {
 #ifndef PRODUCT
-          TimelineDurationScope tds2(thread(),
-                                     compiler_timeline,
+          TimelineDurationScope tds2(thread(), compiler_timeline,
                                      "TryCatchAnalyzer::Optimize");
 #endif  // !PRODUCT
           // Optimize try-blocks.
@@ -3074,8 +3019,7 @@
 
         {
 #ifndef PRODUCT
-          TimelineDurationScope tds2(thread(),
-                                     compiler_timeline,
+          TimelineDurationScope tds2(thread(), compiler_timeline,
                                      "EliminateDeadPhis");
 #endif  // !PRODUCT
           DeadCodeElimination::EliminateDeadPhis(flow_graph);
@@ -3090,10 +3034,9 @@
         // the deoptimization path.
         AllocationSinking* sinking = NULL;
         if (FLAG_allocation_sinking &&
-            (flow_graph->graph_entry()->SuccessorCount()  == 1)) {
+            (flow_graph->graph_entry()->SuccessorCount() == 1)) {
 #ifndef PRODUCT
-          TimelineDurationScope tds2(thread(),
-                                     compiler_timeline,
+          TimelineDurationScope tds2(thread(), compiler_timeline,
                                      "AllocationSinking::Optimize");
 #endif  // !PRODUCT
           // TODO(fschneider): Support allocation sinking with try-catch.
@@ -3110,8 +3053,7 @@
 
         {
 #ifndef PRODUCT
-          TimelineDurationScope tds2(thread(),
-                                     compiler_timeline,
+          TimelineDurationScope tds2(thread(), compiler_timeline,
                                      "SelectRepresentations");
 #endif  // !PRODUCT
           // Ensure that all phis inserted by optimization passes have
@@ -3132,8 +3074,7 @@
         if (sinking != NULL) {
 #ifndef PRODUCT
           TimelineDurationScope tds2(
-              thread(),
-              compiler_timeline,
+              thread(), compiler_timeline,
               "AllocationSinking::DetachMaterializations");
 #endif  // !PRODUCT
           // Remove all MaterializeObject instructions inserted by allocation
@@ -3152,8 +3093,7 @@
 
         {
 #ifndef PRODUCT
-          TimelineDurationScope tds2(thread(),
-                                     compiler_timeline,
+          TimelineDurationScope tds2(thread(), compiler_timeline,
                                      "AllocateRegisters");
 #endif  // !PRODUCT
           // Perform register allocation on the SSA graph.
@@ -3168,25 +3108,20 @@
 
       ASSERT(inline_id_to_function.length() == caller_inline_id.length());
       Assembler assembler(use_far_branches);
-      FlowGraphCompiler graph_compiler(&assembler, flow_graph,
-                                       *parsed_function(), optimized(),
-                                       inline_id_to_function,
-                                       inline_id_to_token_pos,
-                                       caller_inline_id);
+      FlowGraphCompiler graph_compiler(
+          &assembler, flow_graph, *parsed_function(), optimized(),
+          inline_id_to_function, inline_id_to_token_pos, caller_inline_id);
       {
         CSTAT_TIMER_SCOPE(thread(), graphcompiler_timer);
 #ifndef PRODUCT
-        TimelineDurationScope tds(thread(),
-                                  compiler_timeline,
-                                  "CompileGraph");
+        TimelineDurationScope tds(thread(), compiler_timeline, "CompileGraph");
 #endif  // !PRODUCT
         graph_compiler.CompileGraph();
         pipeline->FinalizeCompilation(flow_graph);
       }
       {
 #ifndef PRODUCT
-        TimelineDurationScope tds(thread(),
-                                  compiler_timeline,
+        TimelineDurationScope tds(thread(), compiler_timeline,
                                   "FinalizeCompilation");
 #endif  // !PRODUCT
         ASSERT(thread()->IsMutatorThread());
@@ -3267,20 +3202,17 @@
     StackZone stack_zone(thread);
     Zone* const zone = stack_zone.GetZone();
     const bool trace_compiler =
-        FLAG_trace_compiler ||
-        (FLAG_trace_optimizing_compiler && optimized);
+        FLAG_trace_compiler || (FLAG_trace_optimizing_compiler && optimized);
     Timer per_compile_timer(trace_compiler, "Compilation time");
     per_compile_timer.Start();
 
-    ParsedFunction* parsed_function = new(zone) ParsedFunction(
-        thread, Function::ZoneHandle(zone, function.raw()));
+    ParsedFunction* parsed_function = new (zone)
+        ParsedFunction(thread, Function::ZoneHandle(zone, function.raw()));
     if (trace_compiler) {
-      THR_Print(
-          "Precompiling %sfunction: '%s' @ token %" Pd ", size %" Pd "\n",
-          (optimized ? "optimized " : ""),
-          function.ToFullyQualifiedCString(),
-          function.token_pos().Pos(),
-          (function.end_token_pos().Pos() - function.token_pos().Pos()));
+      THR_Print("Precompiling %sfunction: '%s' @ token %" Pd ", size %" Pd "\n",
+                (optimized ? "optimized " : ""),
+                function.ToFullyQualifiedCString(), function.token_pos().Pos(),
+                (function.end_token_pos().Pos() - function.token_pos().Pos()));
     }
     INC_STAT(thread, num_functions_compiled, 1);
     if (optimized) {
@@ -3291,13 +3223,12 @@
       const int64_t num_tokens_before = STAT_VALUE(thread, num_tokens_consumed);
       pipeline->ParseFunction(parsed_function);
       const int64_t num_tokens_after = STAT_VALUE(thread, num_tokens_consumed);
-      INC_STAT(thread,
-               num_func_tokens_compiled,
+      INC_STAT(thread, num_func_tokens_compiled,
                num_tokens_after - num_tokens_before);
     }
 
-    PrecompileParsedFunctionHelper helper(
-        precompiler, parsed_function, optimized);
+    PrecompileParsedFunctionHelper helper(precompiler, parsed_function,
+                                          optimized);
     const bool success = helper.Compile(pipeline);
     if (!success) {
       // Encountered error.
@@ -3322,8 +3253,7 @@
 
     if (FLAG_disassemble && FlowGraphPrinter::ShouldPrint(function)) {
       Disassembler::DisassembleCode(function, optimized);
-    } else if (FLAG_disassemble_optimized &&
-               optimized &&
+    } else if (FLAG_disassemble_optimized && optimized &&
                FlowGraphPrinter::ShouldPrint(function)) {
       Disassembler::DisassembleCode(function, true);
     }
diff --git a/runtime/vm/precompiler.h b/runtime/vm/precompiler.h
index f3a8d02..2566a78 100644
--- a/runtime/vm/precompiler.h
+++ b/runtime/vm/precompiler.h
@@ -69,9 +69,7 @@
 
   static Value ValueOf(Pair kv) { return kv; }
 
-  static inline intptr_t Hashcode(Key key) {
-    return key->Hash();
-  }
+  static inline intptr_t Hashcode(Key key) { return key->Hash(); }
 
   static inline bool IsKeyEqual(Pair pair, Key key) {
     return pair->raw() == key->raw();
@@ -91,9 +89,7 @@
 
   static Value ValueOf(Pair kv) { return kv; }
 
-  static inline intptr_t Hashcode(Key key) {
-    return key->PcOffset();
-  }
+  static inline intptr_t Hashcode(Key key) { return key->PcOffset(); }
 
   static inline bool IsKeyEqual(Pair pair, Key key) {
     return pair->Equals(*key);
@@ -114,9 +110,7 @@
 
   static Value ValueOf(Pair kv) { return kv; }
 
-  static inline intptr_t Hashcode(Key key) {
-    return key->Length();
-  }
+  static inline intptr_t Hashcode(Key key) { return key->Length(); }
 
   static inline bool IsKeyEqual(Pair pair, Key key) {
     if (pair->Length() != key->Length()) {
@@ -145,9 +139,7 @@
 
   static Value ValueOf(Pair kv) { return kv; }
 
-  static inline intptr_t Hashcode(Key key) {
-    return key->size();
-  }
+  static inline intptr_t Hashcode(Key key) { return key->Size(); }
 
   static inline bool IsKeyEqual(Pair pair, Key key) {
     return pair->Equals(*key);
@@ -174,7 +166,7 @@
 
   static inline bool IsKeyEqual(Pair pair, Key key) {
     return (pair->target_name() == key->target_name()) &&
-        (pair->args_descriptor() == key->args_descriptor());
+           (pair->args_descriptor() == key->args_descriptor());
   }
 };
 
@@ -192,9 +184,7 @@
 
   static Value ValueOf(Pair kv) { return kv; }
 
-  static inline intptr_t Hashcode(Key key) {
-    return key->token_pos().value();
-  }
+  static inline intptr_t Hashcode(Key key) { return key->token_pos().value(); }
 
   static inline bool IsKeyEqual(Pair pair, Key key) {
     return pair->raw() == key->raw();
@@ -215,9 +205,7 @@
 
   static Value ValueOf(Pair kv) { return kv; }
 
-  static inline intptr_t Hashcode(Key key) {
-    return key->token_pos().value();
-  }
+  static inline intptr_t Hashcode(Key key) { return key->token_pos().value(); }
 
   static inline bool IsKeyEqual(Pair pair, Key key) {
     return pair->raw() == key->raw();
@@ -238,9 +226,7 @@
 
   static Value ValueOf(Pair kv) { return kv; }
 
-  static inline intptr_t Hashcode(Key key) {
-    return key->token_pos().value();
-  }
+  static inline intptr_t Hashcode(Key key) { return key->token_pos().value(); }
 
   static inline bool IsKeyEqual(Pair pair, Key key) {
     return pair->raw() == key->raw();
@@ -261,9 +247,7 @@
 
   static Value ValueOf(Pair kv) { return kv; }
 
-  static inline intptr_t Hashcode(Key key) {
-    return key->Hash();
-  }
+  static inline intptr_t Hashcode(Key key) { return key->Hash(); }
 
   static inline bool IsKeyEqual(Pair pair, Key key) {
     return pair->raw() == key->raw();
@@ -284,9 +268,7 @@
 
   static Value ValueOf(Pair kv) { return kv; }
 
-  static inline intptr_t Hashcode(Key key) {
-    return key->Hash();
-  }
+  static inline intptr_t Hashcode(Key key) { return key->Hash(); }
 
   static inline bool IsKeyEqual(Pair pair, Key key) {
     return pair->raw() == key->raw();
@@ -307,9 +289,7 @@
 
   static Value ValueOf(Pair kv) { return kv; }
 
-  static inline intptr_t Hashcode(Key key) {
-    return key->GetClassId();
-  }
+  static inline intptr_t Hashcode(Key key) { return key->GetClassId(); }
 
   static inline bool IsKeyEqual(Pair pair, Key key) {
     return pair->raw() == key->raw();
@@ -329,17 +309,15 @@
 
   static Value ValueOf(Pair kv) { return kv.cid_; }
 
-  static inline intptr_t Hashcode(Key key) {
-    return key->token_pos().value();
-  }
+  static inline intptr_t Hashcode(Key key) { return key->token_pos().value(); }
 
   static inline bool IsKeyEqual(Pair pair, Key key) {
     return pair.field_->raw() == key->raw();
   }
 
-  FieldTypePair(const Field* f, intptr_t cid) : field_(f), cid_(cid) { }
+  FieldTypePair(const Field* f, intptr_t cid) : field_(f), cid_(cid) {}
 
-  FieldTypePair() : field_(NULL), cid_(-1) { }
+  FieldTypePair() : field_(NULL), cid_(-1) {}
 
   void Print() const;
 
@@ -373,9 +351,7 @@
     return get_runtime_type_is_unique_;
   }
 
-  FieldTypeMap* field_type_map() {
-    return &field_type_map_;
-  }
+  FieldTypeMap* field_type_map() { return &field_type_map_; }
 
  private:
   Precompiler(Thread* thread, bool reset_fields);
@@ -427,7 +403,7 @@
   void PrecompileStaticInitializers();
   void PrecompileConstructors();
 
-  template<typename T>
+  template <typename T>
   class Visitor : public ValueObject {
    public:
     virtual ~Visitor() {}
@@ -503,9 +479,7 @@
       return String::Cast(obj).Hash();
     }
   }
-  static RawObject* NewKey(const Function& function) {
-    return function.raw();
-  }
+  static RawObject* NewKey(const Function& function) { return function.raw(); }
 };
 
 typedef UnorderedHashSet<FunctionsTraits> UniqueFunctionsSet;
diff --git a/runtime/vm/proccpuinfo.cc b/runtime/vm/proccpuinfo.cc
index 94e8db6..dd8416f 100644
--- a/runtime/vm/proccpuinfo.cc
+++ b/runtime/vm/proccpuinfo.cc
@@ -7,7 +7,7 @@
 
 #include "vm/proccpuinfo.h"
 
-#include <ctype.h>  // NOLINT
+#include <ctype.h>   // NOLINT
 #include <string.h>  // NOLINT
 
 #include "platform/assert.h"
@@ -41,7 +41,7 @@
   data_ = reinterpret_cast<char*>(malloc(datalen_ + 1));
   fp = fopen(PATHNAME, "r");
   if (fp != NULL) {
-    for (intptr_t offset = 0; offset < datalen_; ) {
+    for (intptr_t offset = 0; offset < datalen_;) {
       size_t n = fread(data_ + offset, 1, datalen_ - offset, fp);
       if (n == 0) {
         break;
diff --git a/runtime/vm/profiler.cc b/runtime/vm/profiler.cc
index 50a202a..05f8302 100644
--- a/runtime/vm/profiler.cc
+++ b/runtime/vm/profiler.cc
@@ -33,20 +33,24 @@
 
 #if defined(TARGET_OS_ANDROID) || defined(TARGET_ARCH_ARM64) ||                \
     defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_MIPS)
-  DEFINE_FLAG(int, profile_period, 10000,
-              "Time between profiler samples in microseconds. Minimum 50.");
+DEFINE_FLAG(int,
+            profile_period,
+            10000,
+            "Time between profiler samples in microseconds. Minimum 50.");
 #else
-  DEFINE_FLAG(int, profile_period, 1000,
-              "Time between profiler samples in microseconds. Minimum 50.");
+DEFINE_FLAG(int,
+            profile_period,
+            1000,
+            "Time between profiler samples in microseconds. Minimum 50.");
 #endif
-DEFINE_FLAG(int, max_profile_depth, kSampleSize * kMaxSamplesPerTick,
+DEFINE_FLAG(int,
+            max_profile_depth,
+            kSampleSize* kMaxSamplesPerTick,
             "Maximum number stack frames walked. Minimum 1. Maximum 255.");
 #if defined(USING_SIMULATOR)
-DEFINE_FLAG(bool, profile_vm, true,
-            "Always collect native stack traces.");
+DEFINE_FLAG(bool, profile_vm, true, "Always collect native stack traces.");
 #else
-DEFINE_FLAG(bool, profile_vm, false,
-            "Always collect native stack traces.");
+DEFINE_FLAG(bool, profile_vm, false, "Always collect native stack traces.");
 #endif
 
 #ifndef PRODUCT
@@ -113,21 +117,20 @@
 
 void Sample::InitOnce() {
   pcs_length_ = kSampleSize;
-  instance_size_ =
-      sizeof(Sample) + (sizeof(uword) * pcs_length_);  // NOLINT.
+  instance_size_ = sizeof(Sample) + (sizeof(uword) * pcs_length_);  // NOLINT.
 }
 
 
 uword* Sample::GetPCArray() const {
-  return reinterpret_cast<uword*>(
-        reinterpret_cast<uintptr_t>(this) + sizeof(*this));
+  return reinterpret_cast<uword*>(reinterpret_cast<uintptr_t>(this) +
+                                  sizeof(*this));
 }
 
 
 SampleBuffer::SampleBuffer(intptr_t capacity) {
   ASSERT(Sample::instance_size() > 0);
-  samples_ = reinterpret_cast<Sample*>(
-      calloc(capacity, Sample::instance_size()));
+  samples_ =
+      reinterpret_cast<Sample*>(calloc(capacity, Sample::instance_size()));
   if (FLAG_trace_profiler) {
     OS::Print("Profiler holds %" Pd " samples\n", capacity);
     OS::Print("Profiler sample is %" Pd " bytes\n", Sample::instance_size());
@@ -194,9 +197,7 @@
     ASSERT(code_.ContainsInstructionAt(pc_));
   }
 
-  uword pc() {
-    return pc_;
-  }
+  uword pc() { return pc_; }
 
   // Returns false on failure.
   bool LocateReturnAddress(uword* return_address);
@@ -303,8 +304,7 @@
 
 
 bool SampleFilter::TimeFilterSample(Sample* sample) {
-  if ((time_origin_micros_ == -1) ||
-      (time_extent_micros_ == -1)) {
+  if ((time_origin_micros_ == -1) || (time_extent_micros_ == -1)) {
     // No time filter passed in, always pass.
     return true;
   }
@@ -321,8 +321,7 @@
 
 
 ClearProfileVisitor::ClearProfileVisitor(Isolate* isolate)
-    : SampleVisitor(isolate) {
-}
+    : SampleVisitor(isolate) {}
 
 
 void ClearProfileVisitor::VisitSample(Sample* sample) {
@@ -332,8 +331,7 @@
 
 static void DumpStackFrame(intptr_t frame_index, uword pc) {
   uintptr_t start = 0;
-  char* native_symbol_name =
-      NativeSymbolResolver::LookupSymbolName(pc, &start);
+  char* native_symbol_name = NativeSymbolResolver::LookupSymbolName(pc, &start);
   if (native_symbol_name == NULL) {
     OS::PrintErr("  [0x%" Pp "] Unknown symbol\n", pc);
   } else {
@@ -343,14 +341,12 @@
 }
 
 
-static void DumpStackFrame(intptr_t frame_index,
-                           uword pc,
-                           const Code& code) {
+static void DumpStackFrame(intptr_t frame_index, uword pc, const Code& code) {
   if (code.IsNull()) {
     DumpStackFrame(frame_index, pc);
   } else {
-    OS::PrintErr("Frame[%" Pd "] = Dart:`%s` [0x%" Px "]\n",
-                 frame_index, code.ToCString(), pc);
+    OS::PrintErr("Frame[%" Pd "] = Dart:`%s` [0x%" Px "]\n", frame_index,
+                 code.ToCString(), pc);
   }
 }
 
@@ -360,11 +356,11 @@
   ProfilerStackWalker(Isolate* isolate,
                       Sample* head_sample,
                       SampleBuffer* sample_buffer)
-    : isolate_(isolate),
-      sample_(head_sample),
-      sample_buffer_(sample_buffer),
-      frame_index_(0),
-      total_frames_(0) {
+      : isolate_(isolate),
+        sample_(head_sample),
+        sample_buffer_(sample_buffer),
+        frame_index_(0),
+        total_frames_(0) {
     ASSERT(isolate_ != NULL);
     if (sample_ == NULL) {
       ASSERT(sample_buffer_ == NULL);
@@ -430,8 +426,7 @@
                               Sample* sample,
                               SampleBuffer* sample_buffer)
       : ProfilerStackWalker(isolate, sample, sample_buffer),
-        frame_iterator_(thread) {
-  }
+        frame_iterator_(thread) {}
 
   void walk() {
     // Mark that this sample was collected from an exit frame.
@@ -595,9 +590,7 @@
     return reinterpret_cast<uword*>(*exit_link_ptr);
   }
 
-  bool ValidFramePointer() const {
-    return ValidFramePointer(fp_);
-  }
+  bool ValidFramePointer() const { return ValidFramePointer(fp_); }
 
   bool ValidFramePointer(uword* fp) const {
     if (fp == NULL) {
@@ -635,8 +628,7 @@
         original_pc_(pc),
         original_fp_(fp),
         original_sp_(sp),
-        lower_bound_(stack_lower) {
-  }
+        lower_bound_(stack_lower) {}
 
   void walk() {
     const uword kMaxStep = VirtualMemory::PageSize();
@@ -778,32 +770,32 @@
   __try {
 #endif
 
-  if (in_dart_code) {
-    // We can only trust the stack pointer if we are executing Dart code.
-    // See http://dartbug.com/20421 for details.
-    CopyStackBuffer(sample, sp);
-  }
+    if (in_dart_code) {
+      // We can only trust the stack pointer if we are executing Dart code.
+      // See http://dartbug.com/20421 for details.
+      CopyStackBuffer(sample, sp);
+    }
 
-  if (FLAG_profile_vm) {
-    // Always walk the native stack collecting both native and Dart frames.
-    AtomicOperations::IncrementInt64By(&counters->stack_walker_native, 1);
-    native_stack_walker->walk();
-  } else if (StubCode::HasBeenInitialized() && exited_dart_code) {
-    AtomicOperations::IncrementInt64By(&counters->stack_walker_dart_exit, 1);
-    // We have a valid exit frame info, use the Dart stack walker.
-    dart_exit_stack_walker->walk();
-  } else if (StubCode::HasBeenInitialized() && in_dart_code) {
-    AtomicOperations::IncrementInt64By(&counters->stack_walker_dart, 1);
-    // We are executing Dart code. We have frame pointers.
-    dart_stack_walker->walk();
-  } else {
-    AtomicOperations::IncrementInt64By(&counters->stack_walker_none, 1);
-    sample->SetAt(0, pc);
-  }
+    if (FLAG_profile_vm) {
+      // Always walk the native stack collecting both native and Dart frames.
+      AtomicOperations::IncrementInt64By(&counters->stack_walker_native, 1);
+      native_stack_walker->walk();
+    } else if (StubCode::HasBeenInitialized() && exited_dart_code) {
+      AtomicOperations::IncrementInt64By(&counters->stack_walker_dart_exit, 1);
+      // We have a valid exit frame info, use the Dart stack walker.
+      dart_exit_stack_walker->walk();
+    } else if (StubCode::HasBeenInitialized() && in_dart_code) {
+      AtomicOperations::IncrementInt64By(&counters->stack_walker_dart, 1);
+      // We are executing Dart code. We have frame pointers.
+      dart_stack_walker->walk();
+    } else {
+      AtomicOperations::IncrementInt64By(&counters->stack_walker_none, 1);
+      sample->SetAt(0, pc);
+    }
 
 #if defined(TARGET_OS_WINDOWS)
-  // Use structured exception handling to trap guard page access.
-  } __except(GuardPageExceptionFilter(GetExceptionInformation())) {
+    // Use structured exception handling to trap guard page access.
+  } __except (GuardPageExceptionFilter(GetExceptionInformation())) {  // NOLINT
     // Sample collection triggered a guard page fault:
     // 1) discard entire sample.
     sample->set_ignore_sample(true);
@@ -812,10 +804,9 @@
     // https://goo.gl/5mCsXW
     DWORD new_protect = PAGE_READWRITE | PAGE_GUARD;
     DWORD old_protect = 0;
-    BOOL success = VirtualProtect(reinterpret_cast<void*>(fault_address),
-                                  sizeof(fault_address),
-                                  new_protect,
-                                  &old_protect);
+    BOOL success =
+        VirtualProtect(reinterpret_cast<void*>(fault_address),
+                       sizeof(fault_address), new_protect, &old_protect);
     USE(success);
     ASSERT(success);
     ASSERT(old_protect == PAGE_READWRITE);
@@ -942,8 +933,7 @@
 
 
 #if defined(TARGET_OS_WINDOWS)
-__declspec(noinline)
-static uintptr_t GetProgramCounter() {
+__declspec(noinline) static uintptr_t GetProgramCounter() {
   return reinterpret_cast<uintptr_t>(_ReturnAddress());
 }
 #else
@@ -990,15 +980,11 @@
   uword stack_upper = 0;
 
   if (!InitialRegisterCheck(pc, fp, sp)) {
-    OS::PrintErr(
-        "Stack dump aborted because InitialRegisterCheck.\n");
+    OS::PrintErr("Stack dump aborted because InitialRegisterCheck.\n");
     return;
   }
 
-  if (!GetAndValidateIsolateStackBounds(thread,
-                                        fp,
-                                        sp,
-                                        &stack_lower,
+  if (!GetAndValidateIsolateStackBounds(thread, fp, sp, &stack_lower,
                                         &stack_upper)) {
     OS::PrintErr(
         "Stack dump aborted because GetAndValidateIsolateStackBounds.\n");
@@ -1006,30 +992,16 @@
   }
 
   if (native_stack_trace) {
-    ProfilerNativeStackWalker native_stack_walker(isolate,
-                                                  NULL,
-                                                  NULL,
-                                                  stack_lower,
-                                                  stack_upper,
-                                                  pc,
-                                                  fp,
-                                                  sp);
+    ProfilerNativeStackWalker native_stack_walker(
+        isolate, NULL, NULL, stack_lower, stack_upper, pc, fp, sp);
     native_stack_walker.walk();
   } else if (exited_dart_code) {
-    ProfilerDartExitStackWalker dart_exit_stack_walker(thread,
-                                                       isolate,
-                                                       NULL,
+    ProfilerDartExitStackWalker dart_exit_stack_walker(thread, isolate, NULL,
                                                        NULL);
     dart_exit_stack_walker.walk();
   } else {
-    ProfilerDartStackWalker dart_stack_walker(isolate,
-                                              NULL,
-                                              NULL,
-                                              stack_lower,
-                                              stack_upper,
-                                              pc,
-                                              fp,
-                                              sp);
+    ProfilerDartStackWalker dart_stack_walker(isolate, NULL, NULL, stack_lower,
+                                              stack_upper, pc, fp, sp);
   }
   OS::PrintErr("-- End of DumpStackTrace\n");
 }
@@ -1066,10 +1038,7 @@
       return;
     }
 
-    if (!GetAndValidateIsolateStackBounds(thread,
-                                          fp,
-                                          sp,
-                                          &stack_lower,
+    if (!GetAndValidateIsolateStackBounds(thread, fp, sp, &stack_lower,
                                           &stack_upper)) {
       // Could not get stack boundary.
       return;
@@ -1077,21 +1046,13 @@
 
     Sample* sample = SetupSample(thread, sample_buffer, os_thread->trace_id());
     sample->SetAllocationCid(cid);
-    ProfilerNativeStackWalker native_stack_walker(isolate,
-                                                  sample,
-                                                  sample_buffer,
-                                                  stack_lower,
-                                                  stack_upper,
-                                                  pc,
-                                                  fp,
-                                                  sp);
+    ProfilerNativeStackWalker native_stack_walker(
+        isolate, sample, sample_buffer, stack_lower, stack_upper, pc, fp, sp);
     native_stack_walker.walk();
   } else if (exited_dart_code) {
     Sample* sample = SetupSample(thread, sample_buffer, os_thread->trace_id());
     sample->SetAllocationCid(cid);
-    ProfilerDartExitStackWalker dart_exit_stack_walker(thread,
-                                                       isolate,
-                                                       sample,
+    ProfilerDartExitStackWalker dart_exit_stack_walker(thread, isolate, sample,
                                                        sample_buffer);
     dart_exit_stack_walker.walk();
   } else {
@@ -1163,7 +1124,7 @@
 #endif
 
   if (in_dart_code) {
-    // If we're in Dart code, use the Dart stack pointer.
+// If we're in Dart code, use the Dart stack pointer.
 #if defined(TARGET_ARCH_DBC)
     simulator = isolate->simulator();
     sp = simulator->get_sp();
@@ -1203,13 +1164,10 @@
 
   uword stack_lower = 0;
   uword stack_upper = 0;
-  if (!GetAndValidateIsolateStackBounds(thread,
-                                        fp,
-                                        sp,
-                                        &stack_lower,
+  if (!GetAndValidateIsolateStackBounds(thread, fp, sp, &stack_lower,
                                         &stack_upper)) {
     AtomicOperations::IncrementInt64By(
-       &counters_.single_frame_sample_get_and_validate_stack_bounds, 1);
+        &counters_.single_frame_sample_get_and_validate_stack_bounds, 1);
     // Could not get stack boundary.
     SampleThreadSingleFrame(thread, pc);
     return;
@@ -1232,47 +1190,24 @@
     counters->Increment(sample->vm_tag());
   }
 
-  ProfilerNativeStackWalker native_stack_walker(isolate,
-                                                sample,
-                                                sample_buffer,
-                                                stack_lower,
-                                                stack_upper,
-                                                pc,
-                                                fp,
-                                                sp);
+  ProfilerNativeStackWalker native_stack_walker(
+      isolate, sample, sample_buffer, stack_lower, stack_upper, pc, fp, sp);
 
-  ProfilerDartExitStackWalker dart_exit_stack_walker(thread,
-                                                     isolate,
-                                                     sample,
+  ProfilerDartExitStackWalker dart_exit_stack_walker(thread, isolate, sample,
                                                      sample_buffer);
 
-  ProfilerDartStackWalker dart_stack_walker(isolate,
-                                            sample,
-                                            sample_buffer,
-                                            stack_lower,
-                                            stack_upper,
-                                            pc,
-                                            fp,
-                                            sp);
+  ProfilerDartStackWalker dart_stack_walker(
+      isolate, sample, sample_buffer, stack_lower, stack_upper, pc, fp, sp);
 
   const bool exited_dart_code = thread->HasExitedDartCode();
 
   // All memory access is done inside CollectSample.
-  CollectSample(isolate,
-                exited_dart_code,
-                in_dart_code,
-                sample,
-                &native_stack_walker,
-                &dart_exit_stack_walker,
-                &dart_stack_walker,
-                pc,
-                fp,
-                sp,
-                &counters_);
+  CollectSample(isolate, exited_dart_code, in_dart_code, sample,
+                &native_stack_walker, &dart_exit_stack_walker,
+                &dart_stack_walker, pc, fp, sp, &counters_);
 }
 
 
-
 CodeDescriptor::CodeDescriptor(const Code& code) : code_(code) {
   ASSERT(!code_.IsNull());
 }
@@ -1304,8 +1239,7 @@
     ASSERT(table_ != NULL);
   }
 
-  ~CodeLookupTableBuilder() {
-  }
+  ~CodeLookupTableBuilder() {}
 
   void VisitObject(RawObject* raw_obj) {
     uword tags = raw_obj->ptr()->tags_;
@@ -1408,7 +1342,7 @@
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
 
-  ProcessedSampleBuffer* buffer = new(zone) ProcessedSampleBuffer();
+  ProcessedSampleBuffer* buffer = new (zone) ProcessedSampleBuffer();
 
   const intptr_t length = capacity();
   for (intptr_t i = 0; i < length; i++) {
@@ -1457,7 +1391,7 @@
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
 
-  ProcessedSample* processed_sample = new(zone) ProcessedSample();
+  ProcessedSample* processed_sample = new (zone) ProcessedSample();
 
   // Copy state bits from sample.
   processed_sample->set_timestamp(sample->timestamp());
@@ -1485,8 +1419,7 @@
   }
 
   if (!sample->exit_frame_sample()) {
-    processed_sample->FixupCaller(clt,
-                                  sample->pc_marker(),
+    processed_sample->FixupCaller(clt, sample->pc_marker(),
                                   sample->GetStackBuffer());
   }
 
@@ -1496,8 +1429,7 @@
 
 
 Sample* SampleBuffer::Next(Sample* sample) {
-  if (!sample->is_continuation_sample())
-    return NULL;
+  if (!sample->is_continuation_sample()) return NULL;
   Sample* next_sample = At(sample->continuation_index());
   // Sanity check.
   ASSERT(sample != next_sample);
@@ -1522,8 +1454,7 @@
       user_tag_(0),
       allocation_cid_(-1),
       truncated_(false),
-      timeline_trie_(NULL) {
-}
+      timeline_trie_(NULL) {}
 
 
 void ProcessedSample::FixupCaller(const CodeLookupTable& clt,
diff --git a/runtime/vm/profiler.h b/runtime/vm/profiler.h
index 4f7ce96..1ea5f2d 100644
--- a/runtime/vm/profiler.h
+++ b/runtime/vm/profiler.h
@@ -52,9 +52,7 @@
   static void SetSampleDepth(intptr_t depth);
   static void SetSamplePeriod(intptr_t period);
 
-  static SampleBuffer* sample_buffer() {
-    return sample_buffer_;
-  }
+  static SampleBuffer* sample_buffer() { return sample_buffer_; }
 
   static void DumpStackTrace(bool native_stack_trace = true);
 
@@ -68,8 +66,7 @@
   //   * Allocating memory -- Because this takes locks which may already be
   //                          held, resulting in a dead lock.
   //   * Taking a lock -- See above.
-  static void SampleThread(Thread* thread,
-                           const InterruptedThreadState& state);
+  static void SampleThread(Thread* thread, const InterruptedThreadState& state);
 
   static ProfilerCounters counters() {
     // Copies the counter values.
@@ -91,22 +88,16 @@
 
 class SampleVisitor : public ValueObject {
  public:
-  explicit SampleVisitor(Isolate* isolate) : isolate_(isolate), visited_(0) { }
+  explicit SampleVisitor(Isolate* isolate) : isolate_(isolate), visited_(0) {}
   virtual ~SampleVisitor() {}
 
   virtual void VisitSample(Sample* sample) = 0;
 
-  intptr_t visited() const {
-    return visited_;
-  }
+  intptr_t visited() const { return visited_; }
 
-  void IncrementVisited() {
-    visited_++;
-  }
+  void IncrementVisited() { visited_++; }
 
-  Isolate* isolate() const {
-    return isolate_;
-  }
+  Isolate* isolate() const { return isolate_; }
 
  private:
   Isolate* isolate_;
@@ -130,17 +121,13 @@
     ASSERT(time_origin_micros_ >= -1);
     ASSERT(time_extent_micros_ >= -1);
   }
-  virtual ~SampleFilter() { }
+  virtual ~SampleFilter() {}
 
   // Override this function.
   // Return |true| if |sample| passes the filter.
-  virtual bool FilterSample(Sample* sample) {
-    return true;
-  }
+  virtual bool FilterSample(Sample* sample) { return true; }
 
-  Isolate* isolate() const {
-    return isolate_;
-  }
+  Isolate* isolate() const { return isolate_; }
 
   // Returns |true| if |sample| passes the time filter.
   bool TimeFilterSample(Sample* sample);
@@ -175,14 +162,10 @@
   }
 
   // Isolate sample was taken from.
-  Isolate* isolate() const {
-    return isolate_;
-  }
+  Isolate* isolate() const { return isolate_; }
 
   // Thread sample was taken on.
-  ThreadId tid() const {
-    return tid_;
-  }
+  ThreadId tid() const { return tid_; }
 
   void Clear() {
     isolate_ = NULL;
@@ -204,14 +187,10 @@
   }
 
   // Timestamp sample was taken at.
-  int64_t timestamp() const {
-    return timestamp_;
-  }
+  int64_t timestamp() const { return timestamp_; }
 
   // Top most pc.
-  uword pc() const {
-    return At(0);
-  }
+  uword pc() const { return At(0); }
 
   // Get stack trace entry.
   uword At(intptr_t i) const {
@@ -229,56 +208,36 @@
     pcs[i] = pc;
   }
 
-  uword vm_tag() const {
-    return vm_tag_;
-  }
+  uword vm_tag() const { return vm_tag_; }
   void set_vm_tag(uword tag) {
     ASSERT(tag != VMTag::kInvalidTagId);
     vm_tag_ = tag;
   }
 
-  uword user_tag() const {
-    return user_tag_;
-  }
-  void set_user_tag(uword tag) {
-    user_tag_ = tag;
-  }
+  uword user_tag() const { return user_tag_; }
+  void set_user_tag(uword tag) { user_tag_ = tag; }
 
-  uword pc_marker() const {
-    return pc_marker_;
-  }
+  uword pc_marker() const { return pc_marker_; }
 
-  void set_pc_marker(uword pc_marker) {
-    pc_marker_ = pc_marker;
-  }
+  void set_pc_marker(uword pc_marker) { pc_marker_ = pc_marker; }
 
-  uword lr() const {
-    return lr_;
-  }
+  uword lr() const { return lr_; }
 
-  void set_lr(uword link_register) {
-    lr_ = link_register;
-  }
+  void set_lr(uword link_register) { lr_ = link_register; }
 
-  bool leaf_frame_is_dart() const {
-    return LeafFrameIsDart::decode(state_);
-  }
+  bool leaf_frame_is_dart() const { return LeafFrameIsDart::decode(state_); }
 
   void set_leaf_frame_is_dart(bool leaf_frame_is_dart) {
     state_ = LeafFrameIsDart::update(leaf_frame_is_dart, state_);
   }
 
-  bool ignore_sample() const {
-    return IgnoreBit::decode(state_);
-  }
+  bool ignore_sample() const { return IgnoreBit::decode(state_); }
 
   void set_ignore_sample(bool ignore_sample) {
     state_ = IgnoreBit::update(ignore_sample, state_);
   }
 
-  bool exit_frame_sample() const {
-    return ExitFrameBit::decode(state_);
-  }
+  bool exit_frame_sample() const { return ExitFrameBit::decode(state_); }
 
   void set_exit_frame_sample(bool exit_frame_sample) {
     state_ = ExitFrameBit::update(exit_frame_sample, state_);
@@ -292,9 +251,7 @@
     state_ = MissingFrameInsertedBit::update(missing_frame_inserted, state_);
   }
 
-  bool truncated_trace() const {
-    return TruncatedTraceBit::decode(state_);
-  }
+  bool truncated_trace() const { return TruncatedTraceBit::decode(state_); }
 
   void set_truncated_trace(bool truncated_trace) {
     state_ = TruncatedTraceBit::update(truncated_trace, state_);
@@ -308,9 +265,7 @@
     state_ = ClassAllocationSampleBit::update(allocation_sample, state_);
   }
 
-  Thread::TaskKind thread_task() const {
-    return ThreadTaskBit::decode(state_);
-  }
+  Thread::TaskKind thread_task() const { return ThreadTaskBit::decode(state_); }
 
   void set_thread_task(Thread::TaskKind task) {
     state_ = ThreadTaskBit::update(task, state_);
@@ -342,13 +297,9 @@
     state_ = HeadSampleBit::update(head_sample, state_);
   }
 
-  bool head_sample() const {
-    return HeadSampleBit::decode(state_);
-  }
+  bool head_sample() const { return HeadSampleBit::decode(state_); }
 
-  void set_metadata(intptr_t metadata) {
-    metadata_ = metadata;
-  }
+  void set_metadata(intptr_t metadata) { metadata_ = metadata; }
 
   void SetAllocationCid(intptr_t cid) {
     set_is_allocation_sample(true);
@@ -357,16 +308,12 @@
 
   static void InitOnce();
 
-  static intptr_t instance_size() {
-    return instance_size_;
-  }
+  static intptr_t instance_size() { return instance_size_; }
 
   uword* GetPCArray() const;
 
   static const int kStackBufferSizeInWords = 2;
-  uword* GetStackBuffer() {
-    return &stack_buffer_[0];
-  }
+  uword* GetStackBuffer() { return &stack_buffer_[0]; }
 
  private:
   static intptr_t instance_size_;
@@ -384,14 +331,14 @@
     kNextFreeBit = 13,
   };
   class HeadSampleBit : public BitField<uword, bool, kHeadSampleBit, 1> {};
-  class LeafFrameIsDart :
-      public BitField<uword, bool, kLeafFrameIsDartBit, 1> {};
+  class LeafFrameIsDart : public BitField<uword, bool, kLeafFrameIsDartBit, 1> {
+  };
   class IgnoreBit : public BitField<uword, bool, kIgnoreBit, 1> {};
   class ExitFrameBit : public BitField<uword, bool, kExitFrameBit, 1> {};
   class MissingFrameInsertedBit
       : public BitField<uword, bool, kMissingFrameInsertedBit, 1> {};
-  class TruncatedTraceBit :
-      public BitField<uword, bool, kTruncatedTraceBit, 1> {};
+  class TruncatedTraceBit
+      : public BitField<uword, bool, kTruncatedTraceBit, 1> {};
   class ClassAllocationSampleBit
       : public BitField<uword, bool, kClassAllocationSampleBit, 1> {};
   class ContinuationSampleBit
@@ -429,21 +376,16 @@
 
   int64_t CompileTimestamp() const;
 
-  RawCode* code() const {
-    return code_.raw();
-  }
+  RawCode* code() const { return code_.raw(); }
 
-  const char* Name() const {
-    return code_.Name();
-  }
+  const char* Name() const { return code_.Name(); }
 
   bool Contains(uword pc) const {
     uword end = Start() + Size();
     return (pc >= Start()) && (pc < end);
   }
 
-  static int Compare(CodeDescriptor* const* a,
-                     CodeDescriptor* const* b) {
+  static int Compare(CodeDescriptor* const* a, CodeDescriptor* const* b) {
     ASSERT(a != NULL);
     ASSERT(b != NULL);
 
@@ -471,9 +413,7 @@
  public:
   explicit CodeLookupTable(Thread* thread);
 
-  intptr_t length() const {
-    return code_objects_.length();
-  }
+  intptr_t length() const { return code_objects_.length(); }
 
   const CodeDescriptor* At(intptr_t index) const {
     return code_objects_.At(index);
@@ -571,14 +511,10 @@
   ProcessedSample();
 
   // Add |pc| to stack trace.
-  void Add(uword pc) {
-    pcs_.Add(pc);
-  }
+  void Add(uword pc) { pcs_.Add(pc); }
 
   // Insert |pc| at |index|.
-  void InsertAt(intptr_t index, uword pc) {
-    pcs_.InsertAt(index, pc);
-  }
+  void InsertAt(intptr_t index, uword pc) { pcs_.InsertAt(index, pc); }
 
   // Number of pcs in stack trace.
   intptr_t length() const { return pcs_.length(); }
@@ -609,9 +545,7 @@
   intptr_t allocation_cid() const { return allocation_cid_; }
   void set_allocation_cid(intptr_t cid) { allocation_cid_ = cid; }
 
-  bool IsAllocationSample() const {
-    return allocation_cid_ > 0;
-  }
+  bool IsAllocationSample() const { return allocation_cid_ > 0; }
 
   // Was the stack trace truncated?
   bool truncated() const { return truncated_; }
@@ -659,17 +593,11 @@
  public:
   ProcessedSampleBuffer();
 
-  void Add(ProcessedSample* sample) {
-    samples_.Add(sample);
-  }
+  void Add(ProcessedSample* sample) { samples_.Add(sample); }
 
-  intptr_t length() const {
-    return samples_.length();
-  }
+  intptr_t length() const { return samples_.length(); }
 
-  ProcessedSample* At(intptr_t index) {
-    return samples_.At(index);
-  }
+  ProcessedSample* At(intptr_t index) { return samples_.At(index); }
 
   const CodeLookupTable& code_lookup_table() const {
     return *code_lookup_table_;
diff --git a/runtime/vm/profiler_service.cc b/runtime/vm/profiler_service.cc
index b198a22..6731e2d 100644
--- a/runtime/vm/profiler_service.cc
+++ b/runtime/vm/profiler_service.cc
@@ -29,9 +29,8 @@
       : previous_(
             GrowableObjectArray::ZoneHandle(isolate->deoptimized_code_array())),
         current_(GrowableObjectArray::ZoneHandle(
-            previous_.IsNull() ? GrowableObjectArray::null() :
-                                 GrowableObjectArray::New())) {
-  }
+            previous_.IsNull() ? GrowableObjectArray::null()
+                               : GrowableObjectArray::New())) {}
 
   void Add(const Code& code) {
     if (current_.IsNull()) {
@@ -49,9 +48,10 @@
     if ((size_before > 0) && FLAG_trace_profiler) {
       intptr_t length_before = previous_.Length();
       intptr_t length_after = current_.Length();
-      OS::Print("Updating isolate deoptimized code array: "
-                "%" Pd " -> %" Pd " [%" Pd " -> %" Pd "]\n",
-                size_before, size_after, length_before, length_after);
+      OS::Print(
+          "Updating isolate deoptimized code array: "
+          "%" Pd " -> %" Pd " [%" Pd " -> %" Pd "]\n",
+          size_before, size_after, length_before, length_after);
     }
     isolate->set_deoptimized_code_array(current_);
   }
@@ -93,10 +93,7 @@
 
 ProfileFunctionSourcePosition::ProfileFunctionSourcePosition(
     TokenPosition token_pos)
-    : token_pos_(token_pos),
-      exclusive_ticks_(0),
-      inclusive_ticks_(0) {
-}
+    : token_pos_(token_pos), exclusive_ticks_(0), inclusive_ticks_(0) {}
 
 
 void ProfileFunctionSourcePosition::Tick(bool exclusive) {
@@ -109,9 +106,9 @@
 
 
 ProfileFunction::ProfileFunction(Kind kind,
-                  const char* name,
-                  const Function& function,
-                  const intptr_t table_index)
+                                 const char* name,
+                                 const Function& function,
+                                 const intptr_t table_index)
     : kind_(kind),
       name_(name),
       function_(Function::ZoneHandle(function.raw())),
@@ -273,10 +270,7 @@
 
 
 ProfileCodeAddress::ProfileCodeAddress(uword pc)
-    : pc_(pc),
-      exclusive_ticks_(0),
-      inclusive_ticks_(0) {
-}
+    : pc_(pc), exclusive_ticks_(0), inclusive_ticks_(0) {}
 
 
 void ProfileCodeAddress::Tick(bool exclusive) {
@@ -304,8 +298,7 @@
       compile_timestamp_(0),
       function_(NULL),
       code_table_index_(-1),
-      address_ticks_(0) {
-}
+      address_ticks_(0) {}
 
 
 void ProfileCode::AdjustExtent(uword start, uword end) {
@@ -321,10 +314,8 @@
 
 bool ProfileCode::Overlaps(const ProfileCode* other) const {
   ASSERT(other != NULL);
-  return other->Contains(start_)   ||
-         other->Contains(end_ - 1) ||
-         Contains(other->start())  ||
-         Contains(other->end() - 1);
+  return other->Contains(start_) || other->Contains(end_ - 1) ||
+         Contains(other->start()) || Contains(other->end() - 1);
 }
 
 
@@ -347,8 +338,8 @@
 void ProfileCode::GenerateAndSetSymbolName(const char* prefix) {
   const intptr_t kBuffSize = 512;
   char buff[kBuffSize];
-  OS::SNPrint(&buff[0], kBuffSize-1, "%s [%" Px ", %" Px ")",
-              prefix, start(), end());
+  OS::SNPrint(&buff[0], kBuffSize - 1, "%s [%" Px ", %" Px ")", prefix, start(),
+              end());
   SetName(buff);
 }
 
@@ -527,8 +518,8 @@
       : null_function_(Function::ZoneHandle()),
         unknown_function_(NULL),
         table_(8) {
-    unknown_function_ = Add(ProfileFunction::kUnknownFunction,
-                            "<unknown Dart function>");
+    unknown_function_ =
+        Add(ProfileFunction::kUnknownFunction, "<unknown Dart function>");
   }
 
   ProfileFunction* LookupOrAdd(const Function& function) {
@@ -568,9 +559,7 @@
     return Add(ProfileFunction::kStubFunction, name);
   }
 
-  intptr_t length() const {
-    return table_.length();
-  }
+  intptr_t length() const { return table_.length(); }
 
   ProfileFunction* At(intptr_t i) const {
     ASSERT(i >= 0);
@@ -583,21 +572,15 @@
     ASSERT(kind != ProfileFunction::kDartFunction);
     ASSERT(name != NULL);
     ProfileFunction* profile_function =
-        new ProfileFunction(kind,
-                            name,
-                            null_function_,
-                            table_.length());
+        new ProfileFunction(kind, name, null_function_, table_.length());
     table_.Add(profile_function);
     return profile_function;
   }
 
   ProfileFunction* Add(const Function& function) {
     ASSERT(Lookup(function) == NULL);
-    ProfileFunction* profile_function =
-        new ProfileFunction(ProfileFunction::kDartFunction,
-                            NULL,
-                            function,
-                            table_.length());
+    ProfileFunction* profile_function = new ProfileFunction(
+        ProfileFunction::kDartFunction, NULL, function, table_.length());
     table_.Add(profile_function);
     function_hash_.Insert(profile_function);
     return profile_function;
@@ -609,17 +592,11 @@
     typedef const Function* Key;
     typedef ProfileFunction* Pair;
 
-    static Key KeyOf(Pair kv) {
-      return kv->function();
-    }
+    static Key KeyOf(Pair kv) { return kv->function(); }
 
-    static Value ValueOf(Pair kv) {
-      return kv;
-    }
+    static Value ValueOf(Pair kv) { return kv; }
 
-    static inline intptr_t Hashcode(Key key) {
-      return key->Hash();
-    }
+    static inline intptr_t Hashcode(Key key) { return key->Hash(); }
 
     static inline bool IsKeyEqual(Pair kv, Key key) {
       return kv->function()->raw() == key->raw();
@@ -667,8 +644,7 @@
         const char* tag_name = UserTags::TagName(start());
         ASSERT(tag_name != NULL);
         SetName(tag_name);
-      } else if (VMTag::IsVMTag(start()) ||
-                 VMTag::IsRuntimeEntryTag(start()) ||
+      } else if (VMTag::IsVMTag(start()) || VMTag::IsRuntimeEntryTag(start()) ||
                  VMTag::IsNativeEntryTag(start())) {
         const char* tag_name = VMTag::TagName(start());
         ASSERT(tag_name != NULL);
@@ -701,7 +677,7 @@
             break;
           default:
             UNIMPLEMENTED();
-          break;
+            break;
         }
       }
     }
@@ -722,9 +698,7 @@
 
 class ProfileCodeTable : public ZoneAllocated {
  public:
-  ProfileCodeTable()
-      : table_(8) {
-  }
+  ProfileCodeTable() : table_(8) {}
 
   intptr_t length() const { return table_.length(); }
 
@@ -846,8 +820,10 @@
     return end <= pc;
   }
 
-  void HandleOverlap(ProfileCode* existing, ProfileCode* code,
-                     uword start, uword end) {
+  void HandleOverlap(ProfileCode* existing,
+                     ProfileCode* code,
+                     uword start,
+                     uword end) {
     // We should never see overlapping Dart code regions.
     ASSERT(existing->kind() != ProfileCode::kDartCode);
     // We should never see overlapping Tag code regions.
@@ -874,12 +850,10 @@
     const intptr_t length = table_.length();
     for (intptr_t i = 0; i < length; i++) {
       ProfileCode* a = table_[i];
-      for (intptr_t j = i+1; j < length; j++) {
+      for (intptr_t j = i + 1; j < length; j++) {
         ProfileCode* b = table_[j];
-        ASSERT(!a->Contains(b->start()) &&
-               !a->Contains(b->end() - 1) &&
-               !b->Contains(a->start()) &&
-               !b->Contains(a->end() - 1));
+        ASSERT(!a->Contains(b->start()) && !a->Contains(b->end() - 1) &&
+               !b->Contains(a->start()) && !b->Contains(a->end() - 1));
       }
     }
   }
@@ -889,16 +863,12 @@
 
 
 ProfileTrieNode::ProfileTrieNode(intptr_t table_index)
-    : table_index_(table_index),
-      count_(0),
-      children_(0),
-      frame_id_(-1) {
+    : table_index_(table_index), count_(0), children_(0), frame_id_(-1) {
   ASSERT(table_index_ >= 0);
 }
 
 
-ProfileTrieNode::~ProfileTrieNode() {
-}
+ProfileTrieNode::~ProfileTrieNode() {}
 
 
 void ProfileTrieNode::SortChildren() {
@@ -923,8 +893,7 @@
 class ProfileCodeTrieNode : public ProfileTrieNode {
  public:
   explicit ProfileCodeTrieNode(intptr_t table_index)
-      : ProfileTrieNode(table_index) {
-  }
+      : ProfileTrieNode(table_index) {}
 
   void PrintToJSONArray(JSONArray* array) const {
     ASSERT(array != NULL);
@@ -971,21 +940,13 @@
 class ProfileFunctionTrieNodeCode {
  public:
   explicit ProfileFunctionTrieNodeCode(intptr_t index)
-      : code_index_(index),
-        ticks_(0) {
-  }
+      : code_index_(index), ticks_(0) {}
 
-  intptr_t index() const {
-    return code_index_;
-  }
+  intptr_t index() const { return code_index_; }
 
-  void Tick() {
-    ticks_++;
-  }
+  void Tick() { ticks_++; }
 
-  intptr_t ticks() const {
-    return ticks_;
-  }
+  intptr_t ticks() const { return ticks_; }
 
  private:
   intptr_t code_index_;
@@ -996,9 +957,7 @@
 class ProfileFunctionTrieNode : public ProfileTrieNode {
  public:
   explicit ProfileFunctionTrieNode(intptr_t table_index)
-      : ProfileTrieNode(table_index),
-        code_objects_(1) {
-  }
+      : ProfileTrieNode(table_index), code_objects_(1) {}
 
   void PrintToJSONArray(JSONArray* array) const {
     ASSERT(array != NULL);
@@ -1069,9 +1028,7 @@
 
 class ProfileCodeInlinedFunctionsCache : public ValueObject {
  public:
-  ProfileCodeInlinedFunctionsCache()
-      : cache_cursor_(0),
-        last_hit_(0) {
+  ProfileCodeInlinedFunctionsCache() : cache_cursor_(0), last_hit_(0) {
     for (intptr_t i = 0; i < kCacheSize; i++) {
       cache_[i].Reset();
     }
@@ -1082,10 +1039,8 @@
   ~ProfileCodeInlinedFunctionsCache() {
     if (FLAG_trace_profiler) {
       intptr_t total = cache_hit_ + cache_miss_;
-      OS::Print("LOOKUPS: %" Pd " HITS: %" Pd " MISSES: %" Pd "\n",
-                total,
-                cache_hit_,
-                cache_miss_);
+      OS::Print("LOOKUPS: %" Pd " HITS: %" Pd " MISSES: %" Pd "\n", total,
+                cache_hit_, cache_miss_);
     }
   }
 
@@ -1098,16 +1053,13 @@
            GrowableArray<TokenPosition>** inlined_token_positions,
            TokenPosition* token_position) {
     const intptr_t offset = OffsetForPC(pc, code, sample, frame_index);
-    if (FindInCache(pc,
-                    offset,
-                    inlined_functions,
-                    inlined_token_positions,
+    if (FindInCache(pc, offset, inlined_functions, inlined_token_positions,
                     token_position)) {
       // Found in cache.
       return;
     }
-    Add(pc, code, sample, frame_index,
-        inlined_functions, inlined_token_positions, token_position);
+    Add(pc, code, sample, frame_index, inlined_functions,
+        inlined_token_positions, token_position);
   }
 
  private:
@@ -1151,8 +1103,7 @@
     CacheEntry* cache_entry = &cache_[NextFreeIndex()];
     cache_entry->pc = pc;
     cache_entry->offset = offset;
-    code.GetInlinedFunctionsAt(offset,
-                               &(cache_entry->inlined_functions),
+    code.GetInlinedFunctionsAt(offset, &(cache_entry->inlined_functions),
                                &(cache_entry->inlined_token_positions));
     cache_entry->token_position = code.GetTokenPositionAt(offset);
     *token_position = (cache_entry->token_position);
@@ -1164,9 +1115,8 @@
     // The inlined token position table does not include the token position
     // of the final call. Insert it at the beginning because the table.
     // is reversed.
-    cache_entry->inlined_token_positions.InsertAt(
-        0,
-        cache_entry->token_position);
+    cache_entry->inlined_token_positions.InsertAt(0,
+                                                  cache_entry->token_position);
 
     // Write outputs.
     *inlined_functions = &(cache_entry->inlined_functions);
@@ -1275,8 +1225,8 @@
  private:
   // Returns true if |frame_index| in |sample| is using CPU.
   static bool IsExecutingFrame(ProcessedSample* sample, intptr_t frame_index) {
-    return (frame_index == 0) && (sample->first_frame_executing() ||
-                                  sample->IsAllocationSample());
+    return (frame_index == 0) &&
+           (sample->first_frame_executing() || sample->IsAllocationSample());
   }
 
   static bool IsInclusiveTrie(Profile::TrieKind kind) {
@@ -1340,17 +1290,13 @@
       ASSERT(descriptor != NULL);
       const Code& code = Code::Handle(descriptor->code());
       ASSERT(!code.IsNull());
-      RegisterLiveProfileCode(
-          new ProfileCode(ProfileCode::kDartCode,
-                          code.PayloadStart(),
-                          code.PayloadStart() + code.Size(),
-                          code.compile_timestamp(),
-                          code));
+      RegisterLiveProfileCode(new ProfileCode(
+          ProfileCode::kDartCode, code.PayloadStart(),
+          code.PayloadStart() + code.Size(), code.compile_timestamp(), code));
     }
 
     // Iterate over samples.
-    for (intptr_t sample_index = 0;
-         sample_index < samples_->length();
+    for (intptr_t sample_index = 0; sample_index < samples_->length();
          sample_index++) {
       ProcessedSample* sample = samples_->At(sample_index);
       const int64_t timestamp = sample->timestamp();
@@ -1371,8 +1317,7 @@
 
       // Make sure that a ProfileCode objects exist for all pcs in the sample
       // and tick each one.
-      for (intptr_t frame_index = 0;
-           frame_index < sample->length();
+      for (intptr_t frame_index = 0; frame_index < sample->length();
            frame_index++) {
         const uword pc = sample->At(frame_index);
         ASSERT(pc != 0);
@@ -1461,8 +1406,7 @@
   void BuildInclusiveCodeTrie(ProfileCodeTrieNode* root) {
     ScopeTimer sw("ProfileBuilder::BuildInclusiveCodeTrie",
                   FLAG_trace_profiler);
-    for (intptr_t sample_index = 0;
-         sample_index < samples_->length();
+    for (intptr_t sample_index = 0; sample_index < samples_->length();
          sample_index++) {
       ProcessedSample* sample = samples_->At(sample_index);
 
@@ -1482,8 +1426,7 @@
 
       // Walk the sampled PCs.
       Code& code = Code::Handle();
-      for (intptr_t frame_index = sample->length() - 1;
-           frame_index >= 0;
+      for (intptr_t frame_index = sample->length() - 1; frame_index >= 0;
            frame_index--) {
         ASSERT(sample->At(frame_index) != 0);
         intptr_t index =
@@ -1507,8 +1450,7 @@
   void BuildExclusiveCodeTrie(ProfileCodeTrieNode* root) {
     ScopeTimer sw("ProfileBuilder::BuildExclusiveCodeTrie",
                   FLAG_trace_profiler);
-    for (intptr_t sample_index = 0;
-         sample_index < samples_->length();
+    for (intptr_t sample_index = 0; sample_index < samples_->length();
          sample_index++) {
       ProcessedSample* sample = samples_->At(sample_index);
 
@@ -1527,8 +1469,7 @@
 
       // Walk the sampled PCs.
       Code& code = Code::Handle();
-      for (intptr_t frame_index = 0;
-           frame_index < sample->length();
+      for (intptr_t frame_index = 0; frame_index < sample->length();
            frame_index++) {
         ASSERT(sample->At(frame_index) != 0);
         intptr_t index =
@@ -1552,9 +1493,8 @@
   }
 
   void BuildFunctionTrie(Profile::TrieKind kind) {
-    ProfileFunctionTrieNode* root =
-        new ProfileFunctionTrieNode(
-            GetProfileFunctionTagIndex(VMTag::kRootTagId));
+    ProfileFunctionTrieNode* root = new ProfileFunctionTrieNode(
+        GetProfileFunctionTagIndex(VMTag::kRootTagId));
     // We tick the functions while building the trie, but, we don't want to do
     // it for both tries, just the exclusive trie.
     inclusive_tree_ = IsInclusiveTrie(kind);
@@ -1572,8 +1512,7 @@
     ScopeTimer sw("ProfileBuilder::BuildInclusiveFunctionTrie",
                   FLAG_trace_profiler);
     ASSERT(!tick_functions_);
-    for (intptr_t sample_index = 0;
-         sample_index < samples_->length();
+    for (intptr_t sample_index = 0; sample_index < samples_->length();
          sample_index++) {
       ProcessedSample* sample = samples_->At(sample_index);
 
@@ -1590,8 +1529,7 @@
       }
 
       // Walk the sampled PCs.
-      for (intptr_t frame_index = sample->length() - 1;
-           frame_index >= 0;
+      for (intptr_t frame_index = sample->length() - 1; frame_index >= 0;
            frame_index--) {
         ASSERT(sample->At(frame_index) != 0);
         current = ProcessFrame(current, sample_index, sample, frame_index);
@@ -1609,8 +1547,7 @@
     ScopeTimer sw("ProfileBuilder::BuildExclusiveFunctionTrie",
                   FLAG_trace_profiler);
     ASSERT(tick_functions_);
-    for (intptr_t sample_index = 0;
-         sample_index < samples_->length();
+    for (intptr_t sample_index = 0; sample_index < samples_->length();
          sample_index++) {
       ProcessedSample* sample = samples_->At(sample_index);
 
@@ -1628,8 +1565,7 @@
       }
 
       // Walk the sampled PCs.
-      for (intptr_t frame_index = 0;
-           frame_index < sample->length();
+      for (intptr_t frame_index = 0; frame_index < sample->length();
            frame_index++) {
         ASSERT(sample->At(frame_index) != 0);
         current = ProcessFrame(current, sample_index, sample, frame_index);
@@ -1645,14 +1581,12 @@
     }
   }
 
-  ProfileFunctionTrieNode* ProcessFrame(
-      ProfileFunctionTrieNode* current,
-      intptr_t sample_index,
-      ProcessedSample* sample,
-      intptr_t frame_index) {
+  ProfileFunctionTrieNode* ProcessFrame(ProfileFunctionTrieNode* current,
+                                        intptr_t sample_index,
+                                        ProcessedSample* sample,
+                                        intptr_t frame_index) {
     const uword pc = sample->At(frame_index);
-    ProfileCode* profile_code = GetProfileCode(pc,
-                                               sample->timestamp());
+    ProfileCode* profile_code = GetProfileCode(pc, sample->timestamp());
     ProfileFunction* function = profile_code->function();
     ASSERT(function != NULL);
     const intptr_t code_index = profile_code->code_table_index();
@@ -1663,34 +1597,26 @@
     TokenPosition token_position = TokenPosition::kNoSource;
     if (!code.IsNull()) {
       inlined_functions_cache_.Get(pc, code, sample, frame_index,
-                                   &inlined_functions,
-                                   &inlined_token_positions,
+                                   &inlined_functions, &inlined_token_positions,
                                    &token_position);
       if (FLAG_trace_profiler_verbose) {
         for (intptr_t i = 0; i < inlined_functions->length(); i++) {
           const String& name =
               String::Handle((*inlined_functions)[i]->QualifiedScrubbedName());
-          THR_Print("InlinedFunction[%" Pd "] = {%s, %s}\n",
-                    i,
+          THR_Print("InlinedFunction[%" Pd "] = {%s, %s}\n", i,
                     name.ToCString(),
                     (*inlined_token_positions)[i].ToCString());
         }
       }
     }
-    if (code.IsNull() ||
-        (inlined_functions == NULL) ||
+    if (code.IsNull() || (inlined_functions == NULL) ||
         (inlined_functions->length() == 0)) {
       // No inlined functions.
       if (inclusive_tree_) {
         current = AppendKind(code, current);
       }
-      current = ProcessFunction(current,
-                                sample_index,
-                                sample,
-                                frame_index,
-                                function,
-                                token_position,
-                                code_index);
+      current = ProcessFunction(current, sample_index, sample, frame_index,
+                                function, token_position, code_index);
       if (!inclusive_tree_) {
         current = AppendKind(code, current);
       }
@@ -1709,13 +1635,9 @@
         if (inliner) {
           current = AppendKind(code, current);
         }
-        current = ProcessInlinedFunction(current,
-                                         sample_index,
-                                         sample,
-                                         frame_index,
-                                         inlined_function,
-                                         inlined_token_position,
-                                         code_index);
+        current = ProcessInlinedFunction(current, sample_index, sample,
+                                         frame_index, inlined_function,
+                                         inlined_token_position, code_index);
         if (inliner) {
           current = AppendKind(kInlineStart, current);
         }
@@ -1733,13 +1655,9 @@
         if (inliner) {
           current = AppendKind(kInlineStart, current);
         }
-        current = ProcessInlinedFunction(current,
-                                         sample_index,
-                                         sample,
-                                         frame_index + i,
-                                         inlined_function,
-                                         inlined_token_position,
-                                         code_index);
+        current = ProcessInlinedFunction(current, sample_index, sample,
+                                         frame_index + i, inlined_function,
+                                         inlined_token_position, code_index);
         if (inliner) {
           current = AppendKind(code, current);
         }
@@ -1760,13 +1678,8 @@
     ProfileFunctionTable* function_table = profile_->functions_;
     ProfileFunction* function = function_table->LookupOrAdd(*inlined_function);
     ASSERT(function != NULL);
-    return ProcessFunction(current,
-                           sample_index,
-                           sample,
-                           frame_index,
-                           function,
-                           inlined_token_position,
-                           code_index);
+    return ProcessFunction(current, sample_index, sample, frame_index, function,
+                           inlined_token_position, code_index);
   }
 
   bool ShouldTickNode(ProcessedSample* sample, intptr_t frame_index) {
@@ -1775,8 +1688,8 @@
     }
     // Only tick the first frame's node, if we are executing OR
     // vm tags have been emitted.
-    return IsExecutingFrame(sample, frame_index) ||
-           !FLAG_profile_vm || vm_tags_emitted();
+    return IsExecutingFrame(sample, frame_index) || !FLAG_profile_vm ||
+           vm_tags_emitted();
   }
 
   ProfileFunctionTrieNode* ProcessFunction(ProfileFunctionTrieNode* current,
@@ -1791,15 +1704,11 @@
     }
     if (tick_functions_) {
       if (FLAG_trace_profiler_verbose) {
-        THR_Print("S[%" Pd "]F[%" Pd "] %s %s 0x%" Px "\n",
-                  sample_index,
-                  frame_index,
-                  function->Name(),
-                  token_position.ToCString(),
+        THR_Print("S[%" Pd "]F[%" Pd "] %s %s 0x%" Px "\n", sample_index,
+                  frame_index, function->Name(), token_position.ToCString(),
                   sample->At(frame_index));
       }
-      function->Tick(IsExecutingFrame(sample, frame_index),
-                     sample_index,
+      function->Tick(IsExecutingFrame(sample, frame_index), sample_index,
                      token_position);
     }
     function->AddProfileCode(code_index);
@@ -1847,8 +1756,7 @@
     return current;
   }
 
-  ProfileCodeTrieNode* AppendVMTag(uword vm_tag,
-                                   ProfileCodeTrieNode* current) {
+  ProfileCodeTrieNode* AppendVMTag(uword vm_tag, ProfileCodeTrieNode* current) {
     if (VMTag::IsNativeEntryTag(vm_tag)) {
       // Insert a dummy kNativeTagId node.
       intptr_t tag_index = GetProfileCodeTagIndex(VMTag::kNativeTagId);
@@ -1871,10 +1779,10 @@
   }
 
   ProfileCodeTrieNode* AppendSpecificNativeRuntimeEntryVMTag(
-      uword vm_tag, ProfileCodeTrieNode* current) {
+      uword vm_tag,
+      ProfileCodeTrieNode* current) {
     // Only Native and Runtime entries have a second VM tag.
-    if (!VMTag::IsNativeEntryTag(vm_tag) &&
-        !VMTag::IsRuntimeEntryTag(vm_tag)) {
+    if (!VMTag::IsNativeEntryTag(vm_tag) && !VMTag::IsRuntimeEntryTag(vm_tag)) {
       return current;
     }
     intptr_t tag_index = GetProfileCodeTagIndex(vm_tag);
@@ -1976,8 +1884,7 @@
       return current;
     }
 
-    if (VMTag::IsNativeEntryTag(vm_tag) ||
-        VMTag::IsRuntimeEntryTag(vm_tag)) {
+    if (VMTag::IsNativeEntryTag(vm_tag) || VMTag::IsRuntimeEntryTag(vm_tag)) {
       current = AppendSpecificNativeRuntimeEntryVMTag(vm_tag, current);
     } else {
       intptr_t tag_index = GetProfileCodeTagIndex(vm_tag);
@@ -2025,9 +1932,7 @@
   }
 
   // ProfileFunctionTrieNode
-  void ResetKind() {
-    info_kind_ = kNone;
-  }
+  void ResetKind() { info_kind_ = kNone; }
 
   ProfileFunctionTrieNode* AppendKind(ProfileInfoKind kind,
                                       ProfileFunctionTrieNode* current) {
@@ -2101,10 +2006,10 @@
   }
 
   ProfileFunctionTrieNode* AppendSpecificNativeRuntimeEntryVMTag(
-      uword vm_tag, ProfileFunctionTrieNode* current) {
+      uword vm_tag,
+      ProfileFunctionTrieNode* current) {
     // Only Native and Runtime entries have a second VM tag.
-    if (!VMTag::IsNativeEntryTag(vm_tag) &&
-        !VMTag::IsRuntimeEntryTag(vm_tag)) {
+    if (!VMTag::IsNativeEntryTag(vm_tag) && !VMTag::IsRuntimeEntryTag(vm_tag)) {
       return current;
     }
     intptr_t tag_index = GetProfileFunctionTagIndex(vm_tag);
@@ -2130,8 +2035,7 @@
     if (!VMTag::IsExitFrameTag(vm_tag)) {
       return current;
     }
-    if (VMTag::IsNativeEntryTag(vm_tag) ||
-        VMTag::IsRuntimeEntryTag(vm_tag)) {
+    if (VMTag::IsNativeEntryTag(vm_tag) || VMTag::IsRuntimeEntryTag(vm_tag)) {
       current = AppendSpecificNativeRuntimeEntryVMTag(vm_tag, current);
     } else {
       intptr_t tag_index = GetProfileFunctionTagIndex(vm_tag);
@@ -2240,21 +2144,15 @@
       // Already created.
       return;
     }
-    ProfileCode* code = new ProfileCode(ProfileCode::kTagCode,
-                                        tag,
-                                        tag + 1,
-                                        0,
-                                        null_code_);
+    ProfileCode* code =
+        new ProfileCode(ProfileCode::kTagCode, tag, tag + 1, 0, null_code_);
     index = tag_table->InsertCode(code);
     ASSERT(index >= 0);
   }
 
   ProfileCode* CreateProfileCodeReused(uword pc) {
-    ProfileCode* code = new ProfileCode(ProfileCode::kReusedCode,
-                                        pc,
-                                        pc + 1,
-                                        0,
-                                        null_code_);
+    ProfileCode* code =
+        new ProfileCode(ProfileCode::kReusedCode, pc, pc + 1, 0, null_code_);
     return code;
   }
 
@@ -2277,8 +2175,8 @@
 
     // Check NativeSymbolResolver for pc.
     uintptr_t native_start = 0;
-    char* native_name = NativeSymbolResolver::LookupSymbolName(pc,
-                                                               &native_start);
+    char* native_name =
+        NativeSymbolResolver::LookupSymbolName(pc, &native_start);
     if (native_name == NULL) {
       // Failed to find a native symbol for pc.
       native_start = pc;
@@ -2291,11 +2189,8 @@
 #endif
 
     ASSERT(pc >= native_start);
-    profile_code = new ProfileCode(ProfileCode::kNativeCode,
-                                   native_start,
-                                   pc + 1,
-                                   0,
-                                   code);
+    profile_code = new ProfileCode(ProfileCode::kNativeCode, native_start,
+                                   pc + 1, 0, code);
     if (native_name != NULL) {
       profile_code->SetName(native_name);
       NativeSymbolResolver::FreeSymbolName(native_name);
@@ -2340,14 +2235,11 @@
     return FindOrRegisterDeadProfileCode(pc);
   }
 
-  Profile::TagOrder tag_order() const {
-    return tag_order_;
-  }
+  Profile::TagOrder tag_order() const { return tag_order_; }
 
   bool vm_tags_emitted() const {
     return (tag_order_ == Profile::kUserVM) ||
-           (tag_order_ == Profile::kVMUser) ||
-           (tag_order_ == Profile::kVM);
+           (tag_order_ == Profile::kVMUser) || (tag_order_ == Profile::kVM);
   }
 
   bool TagsEnabled(intptr_t extra_tags_bits) const {
@@ -2441,10 +2333,8 @@
 
 
 void Profile::PrintHeaderJSON(JSONObject* obj) {
-  obj->AddProperty("samplePeriod",
-                   static_cast<intptr_t>(FLAG_profile_period));
-  obj->AddProperty("stackDepth",
-                   static_cast<intptr_t>(FLAG_max_profile_depth));
+  obj->AddProperty("samplePeriod", static_cast<intptr_t>(FLAG_profile_period));
+  obj->AddProperty("stackDepth", static_cast<intptr_t>(FLAG_max_profile_depth));
   obj->AddProperty("sampleCount", sample_count());
   obj->AddProperty("timeSpan", MicrosecondsToSeconds(GetTimeSpan()));
   obj->AddPropertyTimeMicros("timeOriginMicros", min_time());
@@ -2453,36 +2343,24 @@
   ProfilerCounters counters = Profiler::counters();
   {
     JSONObject counts(obj, "counters");
-    counts.AddProperty64(
-        "bail_out_unknown_task",
-        counters.bail_out_unknown_task);
-    counts.AddProperty64(
-        "bail_out_jump_to_exception_handler",
-        counters.bail_out_jump_to_exception_handler);
-    counts.AddProperty64(
-        "bail_out_check_isolate",
-        counters.bail_out_check_isolate);
-    counts.AddProperty64(
-        "single_frame_sample_deoptimizing",
-        counters.single_frame_sample_deoptimizing);
-    counts.AddProperty64(
-        "single_frame_sample_register_check",
-        counters.single_frame_sample_register_check);
+    counts.AddProperty64("bail_out_unknown_task",
+                         counters.bail_out_unknown_task);
+    counts.AddProperty64("bail_out_jump_to_exception_handler",
+                         counters.bail_out_jump_to_exception_handler);
+    counts.AddProperty64("bail_out_check_isolate",
+                         counters.bail_out_check_isolate);
+    counts.AddProperty64("single_frame_sample_deoptimizing",
+                         counters.single_frame_sample_deoptimizing);
+    counts.AddProperty64("single_frame_sample_register_check",
+                         counters.single_frame_sample_register_check);
     counts.AddProperty64(
         "single_frame_sample_get_and_validate_stack_bounds",
         counters.single_frame_sample_get_and_validate_stack_bounds);
-    counts.AddProperty64(
-        "stack_walker_native",
-        counters.stack_walker_native);
-    counts.AddProperty64(
-        "stack_walker_dart_exit",
-        counters.stack_walker_dart_exit);
-    counts.AddProperty64(
-        "stack_walker_dart",
-        counters.stack_walker_dart);
-    counts.AddProperty64(
-        "stack_walker_none",
-        counters.stack_walker_none);
+    counts.AddProperty64("stack_walker_native", counters.stack_walker_native);
+    counts.AddProperty64("stack_walker_dart_exit",
+                         counters.stack_walker_dart_exit);
+    counts.AddProperty64("stack_walker_dart", counters.stack_walker_dart);
+    counts.AddProperty64("stack_walker_none", counters.stack_walker_none);
   }
 }
 
@@ -2501,16 +2379,16 @@
     // The samples from many isolates may be merged into a single timeline,
     // so prefix frames id with the isolate.
     intptr_t isolate_id = reinterpret_cast<intptr_t>(isolate_);
-    const char* key = zone_->PrintToString("%" Pd "-%" Pd,
-                                           isolate_id, current->frame_id());
+    const char* key =
+        zone_->PrintToString("%" Pd "-%" Pd, isolate_id, current->frame_id());
     JSONObject frame(frames, key);
     frame.AddProperty("category", "Dart");
     ProfileFunction* func = GetFunction(current->table_index());
     frame.AddProperty("name", func->Name());
     if (parent != NULL) {
       ASSERT(parent->frame_id() != -1);
-      frame.AddPropertyF("parent", "%" Pd "-%" Pd,
-                         isolate_id, parent->frame_id());
+      frame.AddPropertyF("parent", "%" Pd "-%" Pd, isolate_id,
+                         parent->frame_id());
     }
   }
 
@@ -2536,8 +2414,7 @@
     JSONArray events(&obj, "traceEvents");
     intptr_t pid = OS::ProcessId();
     intptr_t isolate_id = reinterpret_cast<intptr_t>(isolate_);
-    for (intptr_t sample_index = 0;
-         sample_index < samples_->length();
+    for (intptr_t sample_index = 0; sample_index < samples_->length();
          sample_index++) {
       ProcessedSample* sample = samples_->At(sample_index);
       JSONObject event(&events);
@@ -2549,8 +2426,7 @@
 
       ProfileTrieNode* trie = sample->timeline_trie();
       ASSERT(trie->frame_id() != -1);
-      event.AddPropertyF("sf", "%" Pd "-%" Pd,
-                         isolate_id, trie->frame_id());
+      event.AddPropertyF("sf", "%" Pd "-%" Pd, isolate_id, trie->frame_id());
     }
   }
 }
@@ -2801,12 +2677,9 @@
       : SampleFilter(isolate,
                      thread_task_mask,
                      time_origin_micros,
-                     time_extent_micros) {
-  }
+                     time_extent_micros) {}
 
-  bool FilterSample(Sample* sample) {
-    return !sample->is_allocation_sample();
-  }
+  bool FilterSample(Sample* sample) { return !sample->is_allocation_sample(); }
 };
 
 
@@ -2817,10 +2690,8 @@
                                 int64_t time_extent_micros) {
   Thread* thread = Thread::Current();
   Isolate* isolate = thread->isolate();
-  NoAllocationSampleFilter filter(isolate,
-                                  Thread::kMutatorTask,
-                                  time_origin_micros,
-                                  time_extent_micros);
+  NoAllocationSampleFilter filter(isolate, Thread::kMutatorTask,
+                                  time_origin_micros, time_extent_micros);
   const bool as_timeline = false;
   PrintJSONImpl(thread, stream, tag_order, extra_tags, &filter, as_timeline);
 }
@@ -2858,11 +2729,8 @@
                                           int64_t time_extent_micros) {
   Thread* thread = Thread::Current();
   Isolate* isolate = thread->isolate();
-  ClassAllocationSampleFilter filter(isolate,
-                                     cls,
-                                     Thread::kMutatorTask,
-                                     time_origin_micros,
-                                     time_extent_micros);
+  ClassAllocationSampleFilter filter(isolate, cls, Thread::kMutatorTask,
+                                     time_origin_micros, time_extent_micros);
   const bool as_timeline = false;
   PrintJSONImpl(thread, stream, tag_order, kNoExtraTags, &filter, as_timeline);
 }
@@ -2876,11 +2744,8 @@
   Isolate* isolate = thread->isolate();
   const intptr_t thread_task_mask = Thread::kMutatorTask |
                                     Thread::kCompilerTask |
-                                    Thread::kSweeperTask |
-                                    Thread::kMarkerTask;
-  NoAllocationSampleFilter filter(isolate,
-                                  thread_task_mask,
-                                  time_origin_micros,
+                                    Thread::kSweeperTask | Thread::kMarkerTask;
+  NoAllocationSampleFilter filter(isolate, thread_task_mask, time_origin_micros,
                                   time_extent_micros);
   const bool as_timeline = true;
   PrintJSONImpl(thread, stream, tag_order, kNoExtraTags, &filter, as_timeline);
diff --git a/runtime/vm/profiler_service.h b/runtime/vm/profiler_service.h
index 61c8891..7251432 100644
--- a/runtime/vm/profiler_service.h
+++ b/runtime/vm/profiler_service.h
@@ -54,10 +54,10 @@
 class ProfileFunction : public ZoneAllocated {
  public:
   enum Kind {
-    kDartFunction,    // Dart function.
-    kNativeFunction,  // Synthetic function for Native (C/C++).
-    kTagFunction,     // Synthetic function for a VM or User tag.
-    kStubFunction,    // Synthetic function for stub code.
+    kDartFunction,     // Dart function.
+    kNativeFunction,   // Synthetic function for Native (C/C++).
+    kTagFunction,      // Synthetic function for a VM or User tag.
+    kStubFunction,     // Synthetic function for stub code.
     kUnknownFunction,  // A singleton function for unknown objects.
   };
 
@@ -73,26 +73,18 @@
 
   const char* Name() const;
 
-  const Function* function() const {
-    return &function_;
-  }
+  const Function* function() const { return &function_; }
 
   bool is_visible() const;
 
-  intptr_t table_index() const {
-    return table_index_;
-  }
+  intptr_t table_index() const { return table_index_; }
 
-  Kind kind() const {
-    return kind_;
-  }
+  Kind kind() const { return kind_; }
 
   intptr_t exclusive_ticks() const { return exclusive_ticks_; }
   intptr_t inclusive_ticks() const { return inclusive_ticks_; }
 
-  void IncInclusiveTicks() {
-    inclusive_ticks_++;
-  }
+  void IncInclusiveTicks() { inclusive_ticks_++; }
 
   void Tick(bool exclusive,
             intptr_t inclusive_serial,
@@ -180,9 +172,7 @@
 
   void AdjustExtent(uword start, uword end);
 
-  bool Contains(uword pc) const {
-    return (pc >= start_) && (pc < end_);
-  }
+  bool Contains(uword pc) const { return (pc >= start_) && (pc < end_); }
 
   bool Overlaps(const ProfileCode* other) const;
 
@@ -195,22 +185,16 @@
   void set_exclusive_ticks(intptr_t exclusive_ticks) {
     exclusive_ticks_ = exclusive_ticks;
   }
-  void IncExclusiveTicks() {
-    exclusive_ticks_++;
-  }
+  void IncExclusiveTicks() { exclusive_ticks_++; }
 
   intptr_t inclusive_ticks() const { return inclusive_ticks_; }
   void set_inclusive_ticks(intptr_t inclusive_ticks) {
     inclusive_ticks_ = inclusive_ticks;
   }
-  void IncInclusiveTicks() {
-    inclusive_ticks_++;
-  }
+  void IncInclusiveTicks() { inclusive_ticks_++; }
 
   bool IsOptimizedDart() const;
-  RawCode* code() const {
-    return code_.raw();
-  }
+  RawCode* code() const { return code_.raw(); }
 
   const char* name() const { return name_; }
   void SetName(const char* name);
@@ -226,9 +210,7 @@
 
   ProfileFunction* SetFunctionAndName(ProfileFunctionTable* table);
 
-  ProfileFunction* function() const {
-    return function_;
-  }
+  ProfileFunction* function() const { return function_; }
 
   void PrintNativeCode(JSONObject* profile_code_obj);
   void PrintCollectedCode(JSONObject* profile_code_obj);
@@ -275,17 +257,11 @@
 
   intptr_t count() const { return count_; }
 
-  void Tick() {
-    count_++;
-  }
+  void Tick() { count_++; }
 
-  intptr_t NumChildren() const {
-    return children_.length();
-  }
+  intptr_t NumChildren() const { return children_.length(); }
 
-  ProfileTrieNode* At(intptr_t i) {
-    return children_.At(i);
-  }
+  ProfileTrieNode* At(intptr_t i) { return children_.At(i); }
 
   intptr_t IndexOf(ProfileTrieNode* node);
 
@@ -319,13 +295,7 @@
 // a zone must be created that lives longer than this object.
 class Profile : public ValueObject {
  public:
-  enum TagOrder {
-    kNoTags,
-    kUser,
-    kUserVM,
-    kVM,
-    kVMUser
-  };
+  enum TagOrder { kNoTags, kUser, kUserVM, kVM, kVMUser };
 
   enum TrieKind {
     kExclusiveCode,
@@ -339,22 +309,20 @@
     return (kind == kExclusiveCode) || (kind == kInclusiveCode);
   }
 
-  static bool IsFunctionTrie(TrieKind kind) {
-    return !IsCodeTrie(kind);
-  }
+  static bool IsFunctionTrie(TrieKind kind) { return !IsCodeTrie(kind); }
 
   explicit Profile(Isolate* isolate);
 
   // Build a filtered model using |filter| with the specified |tag_order|.
   void Build(Thread* thread,
-             SampleFilter* filter, TagOrder tag_order, intptr_t extra_tags = 0);
+             SampleFilter* filter,
+             TagOrder tag_order,
+             intptr_t extra_tags = 0);
 
   // After building:
   int64_t min_time() const { return min_time_; }
   int64_t max_time() const { return max_time_; }
-  int64_t GetTimeSpan() const {
-    return max_time() - min_time();
-  }
+  int64_t GetTimeSpan() const { return max_time() - min_time(); }
   intptr_t sample_count() const { return sample_count_; }
 
   intptr_t NumFunctions() const;
@@ -399,10 +367,7 @@
 class ProfileTrieWalker : public ValueObject {
  public:
   explicit ProfileTrieWalker(Profile* profile)
-      : profile_(profile),
-        parent_(NULL),
-        current_(NULL),
-        code_trie_(false) {
+      : profile_(profile), parent_(NULL), current_(NULL), code_trie_(false) {
     ASSERT(profile_ != NULL);
   }
 
diff --git a/runtime/vm/profiler_test.cc b/runtime/vm/profiler_test.cc
index 3f9c92a..f1c0b92 100644
--- a/runtime/vm/profiler_test.cc
+++ b/runtime/vm/profiler_test.cc
@@ -24,14 +24,11 @@
 // Some tests are written assuming native stack trace profiling is disabled.
 class DisableNativeProfileScope : public ValueObject {
  public:
-  DisableNativeProfileScope()
-      : FLAG_profile_vm_(FLAG_profile_vm) {
+  DisableNativeProfileScope() : FLAG_profile_vm_(FLAG_profile_vm) {
     FLAG_profile_vm = false;
   }
 
-  ~DisableNativeProfileScope() {
-    FLAG_profile_vm = FLAG_profile_vm_;
-  }
+  ~DisableNativeProfileScope() { FLAG_profile_vm = FLAG_profile_vm_; }
 
  private:
   const bool FLAG_profile_vm_;
@@ -62,9 +59,7 @@
     Profiler::SetSampleDepth(new_max_depth);
   }
 
-  ~MaxProfileDepthScope() {
-    Profiler::SetSampleDepth(FLAG_max_profile_depth_);
-  }
+  ~MaxProfileDepthScope() { Profiler::SetSampleDepth(FLAG_max_profile_depth_); }
 
  private:
   const intptr_t FLAG_max_profile_depth_;
@@ -161,9 +156,8 @@
 
 
 static RawClass* GetClass(const Library& lib, const char* name) {
-  const Class& cls = Class::Handle(
-      lib.LookupClassAllowPrivate(String::Handle(Symbols::New(Thread::Current(),
-                                                              name))));
+  const Class& cls = Class::Handle(lib.LookupClassAllowPrivate(
+      String::Handle(Symbols::New(Thread::Current(), name))));
   EXPECT(!cls.IsNull());  // No ambiguity error expected.
   return cls.raw();
 }
@@ -188,22 +182,17 @@
                      time_origin_micros,
                      time_extent_micros),
         cid_(cid),
-        enable_vm_ticks_(false) {
-  }
+        enable_vm_ticks_(false) {}
 
   bool FilterSample(Sample* sample) {
-    if (!enable_vm_ticks_ &&
-        (sample->vm_tag() == VMTag::kVMTagId)) {
+    if (!enable_vm_ticks_ && (sample->vm_tag() == VMTag::kVMTagId)) {
       // We don't want to see embedder ticks in the test.
       return false;
     }
-    return sample->is_allocation_sample() &&
-           (sample->allocation_cid() == cid_);
+    return sample->is_allocation_sample() && (sample->allocation_cid() == cid_);
   }
 
-  void set_enable_vm_ticks(bool enable) {
-    enable_vm_ticks_ = enable;
-  }
+  void set_enable_vm_ticks(bool enable) { enable_vm_ticks_ = enable; }
 
  private:
   intptr_t cid_;
@@ -250,9 +239,7 @@
     HANDLESCOPE(thread);
     Profile profile(isolate);
     // Filter for the class in the time range.
-    AllocationFilter filter(isolate,
-                            class_a.id(),
-                            before_allocations_micros,
+    AllocationFilter filter(isolate, class_a.id(), before_allocations_micros,
                             allocation_extent_micros);
     profile.Build(thread, &filter, Profile::kNoTags);
     // We should have 1 allocation sample.
@@ -311,9 +298,7 @@
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
-    AllocationFilter filter(isolate,
-                            class_a.id(),
-                            Dart_TimelineGetMicros(),
+    AllocationFilter filter(isolate, class_a.id(), Dart_TimelineGetMicros(),
                             16000);
     profile.Build(thread, &filter, Profile::kNoTags);
     // We should have no allocation samples because none occured within
@@ -657,7 +642,9 @@
       Class::Handle(isolate->object_store()->double_class());
   EXPECT(!double_class.IsNull());
 
-  Dart_Handle args[2] = { Dart_NewDouble(1.0), Dart_NewDouble(2.0), };
+  Dart_Handle args[2] = {
+      Dart_NewDouble(1.0), Dart_NewDouble(2.0),
+  };
 
   Dart_Handle result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]);
   EXPECT_VALID(result);
@@ -836,8 +823,7 @@
   root_library ^= Api::UnwrapHandle(lib);
   Isolate* isolate = thread->isolate();
 
-  const Class& context_class =
-      Class::Handle(Object::context_class());
+  const Class& context_class = Class::Handle(Object::context_class());
   EXPECT(!context_class.IsNull());
 
   Dart_Handle result = Dart_Invoke(lib, NewString("foo"), 0, NULL);
@@ -1059,7 +1045,9 @@
       Class::Handle(isolate->object_store()->one_byte_string_class());
   EXPECT(!one_byte_string_class.IsNull());
 
-  Dart_Handle args[2] = { NewString("a"), NewString("b"), };
+  Dart_Handle args[2] = {
+      NewString("a"), NewString("b"),
+  };
 
   Dart_Handle result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]);
   EXPECT_VALID(result);
@@ -1142,7 +1130,9 @@
       Class::Handle(isolate->object_store()->one_byte_string_class());
   EXPECT(!one_byte_string_class.IsNull());
 
-  Dart_Handle args[2] = { NewString("a"), NewString("b"), };
+  Dart_Handle args[2] = {
+      NewString("a"), NewString("b"),
+  };
 
   Dart_Handle result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]);
   EXPECT_VALID(result);
@@ -1397,9 +1387,7 @@
     HANDLESCOPE(thread);
     Profile profile(isolate);
     AllocationFilter filter(isolate, class_a.id());
-    profile.Build(thread,
-                  &filter,
-                  Profile::kNoTags,
+    profile.Build(thread, &filter, Profile::kNoTags,
                   ProfilerService::kCodeTransitionTagsBit);
     // We should have 50,000 allocation samples.
     EXPECT_EQ(50000, profile.sample_count());
@@ -2358,14 +2346,12 @@
 }
 
 
-static void InsertFakeSample(SampleBuffer* sample_buffer,
-                             uword* pc_offsets) {
+static void InsertFakeSample(SampleBuffer* sample_buffer, uword* pc_offsets) {
   ASSERT(sample_buffer != NULL);
   Isolate* isolate = Isolate::Current();
   Sample* sample = sample_buffer->ReserveSample();
   ASSERT(sample != NULL);
-  sample->Init(isolate,
-               OS::GetCurrentMonotonicMicros(),
+  sample->Init(isolate, OS::GetCurrentMonotonicMicros(),
                OSThread::Current()->trace_id());
   sample->set_thread_task(Thread::kMutatorTask);
 
@@ -2473,10 +2459,8 @@
   CodeSourceMap::Dump(main_code_source_map, main_code, main);
 
   // Look up some source token position's pc.
-  uword squarePositionPc =
-      FindPCForTokenPosition(do_work_code,
-                             do_work_code_source_map,
-                             squarePosition);
+  uword squarePositionPc = FindPCForTokenPosition(
+      do_work_code, do_work_code_source_map, squarePosition);
   EXPECT(squarePositionPc != 0);
 
   uword callPositionPc =
@@ -2484,16 +2468,12 @@
   EXPECT(callPositionPc != 0);
 
   // Look up some classifying token position's pc.
-  uword controlFlowPc =
-      FindPCForTokenPosition(do_work_code,
-                             do_work_code_source_map,
-                             TokenPosition::kControlFlow);
+  uword controlFlowPc = FindPCForTokenPosition(
+      do_work_code, do_work_code_source_map, TokenPosition::kControlFlow);
   EXPECT(controlFlowPc != 0);
 
-  uword tempMovePc =
-      FindPCForTokenPosition(main_code,
-                             main_code_source_map,
-                             TokenPosition::kTempMove);
+  uword tempMovePc = FindPCForTokenPosition(main_code, main_code_source_map,
+                                            TokenPosition::kTempMove);
   EXPECT(tempMovePc != 0);
 
   // Insert fake samples.
@@ -2501,34 +2481,28 @@
   // Sample 1:
   // squarePositionPc exclusive.
   // callPositionPc inclusive.
-  uword sample1[] = {
-    squarePositionPc,  // doWork.
-    callPositionPc,    // main.
-    0
-  };
+  uword sample1[] = {squarePositionPc,  // doWork.
+                     callPositionPc,    // main.
+                     0};
 
   // Sample 2:
   // squarePositionPc exclusive.
   uword sample2[] = {
-    squarePositionPc,  // doWork.
-    0,
+      squarePositionPc,  // doWork.
+      0,
   };
 
   // Sample 3:
   // controlFlowPc exclusive.
   // callPositionPc inclusive.
-  uword sample3[] = {
-    controlFlowPc,   // doWork.
-    callPositionPc,  // main.
-    0
-  };
+  uword sample3[] = {controlFlowPc,   // doWork.
+                     callPositionPc,  // main.
+                     0};
 
   // Sample 4:
   // tempMovePc exclusive.
-  uword sample4[] = {
-    tempMovePc,  // main.
-    0
-  };
+  uword sample4[] = {tempMovePc,  // main.
+                     0};
 
   InsertFakeSample(sample_buffer, &sample1[0]);
   InsertFakeSample(sample_buffer, &sample2[0]);
@@ -2538,9 +2512,7 @@
   // Generate source report for main.
   SourceReport sourceReport(SourceReport::kProfile);
   JSONStream js;
-  sourceReport.PrintJSON(&js,
-                         script,
-                         do_work.token_pos(),
+  sourceReport.PrintJSON(&js, script, do_work.token_pos(),
                          main.end_token_pos());
 
   // Verify positions in do_work.
diff --git a/runtime/vm/random.h b/runtime/vm/random.h
index 311760f8..2af1fa7 100644
--- a/runtime/vm/random.h
+++ b/runtime/vm/random.h
@@ -20,7 +20,7 @@
   uint32_t NextUInt32();
   uint64_t NextUInt64() {
     return (static_cast<uint64_t>(NextUInt32()) << 32) |
-        static_cast<uint64_t>(NextUInt32());
+           static_cast<uint64_t>(NextUInt32());
   }
 
  private:
diff --git a/runtime/vm/raw_object.cc b/runtime/vm/raw_object.cc
index dea8f2d..bfe850a 100644
--- a/runtime/vm/raw_object.cc
+++ b/runtime/vm/raw_object.cc
@@ -68,13 +68,12 @@
     case kInstructionsCid: {
       const RawInstructions* raw_instructions =
           reinterpret_cast<const RawInstructions*>(this);
-      intptr_t instructions_size = abs(raw_instructions->ptr()->size_);
+      intptr_t instructions_size = Instructions::Size(raw_instructions);
       instance_size = Instructions::InstanceSize(instructions_size);
       break;
     }
     case kContextCid: {
-      const RawContext* raw_context =
-          reinterpret_cast<const RawContext*>(this);
+      const RawContext* raw_context = reinterpret_cast<const RawContext*>(this);
       intptr_t num_variables = raw_context->ptr()->num_variables_;
       instance_size = Context::InstanceSize(num_variables);
       break;
@@ -114,17 +113,16 @@
       instance_size = ObjectPool::InstanceSize(len);
       break;
     }
-#define SIZE_FROM_CLASS(clazz)                                                 \
-    case kTypedData##clazz##Cid:
-    CLASS_LIST_TYPED_DATA(SIZE_FROM_CLASS) {
-      const RawTypedData* raw_obj =
-          reinterpret_cast<const RawTypedData*>(this);
-      intptr_t cid = raw_obj->GetClassId();
-      intptr_t array_len = Smi::Value(raw_obj->ptr()->length_);
-      intptr_t lengthInBytes = array_len * TypedData::ElementSizeInBytes(cid);
-      instance_size = TypedData::InstanceSize(lengthInBytes);
-      break;
-    }
+#define SIZE_FROM_CLASS(clazz) case kTypedData##clazz##Cid:
+      CLASS_LIST_TYPED_DATA(SIZE_FROM_CLASS) {
+        const RawTypedData* raw_obj =
+            reinterpret_cast<const RawTypedData*>(this);
+        intptr_t cid = raw_obj->GetClassId();
+        intptr_t array_len = Smi::Value(raw_obj->ptr()->length_);
+        intptr_t lengthInBytes = array_len * TypedData::ElementSizeInBytes(cid);
+        instance_size = TypedData::InstanceSize(lengthInBytes);
+        break;
+      }
 #undef SIZE_FROM_CLASS
     case kTypeArgumentsCid: {
       const RawTypeArguments* raw_array =
@@ -187,13 +185,13 @@
       ClassTable* class_table = isolate->class_table();
       if (!class_table->IsValidIndex(class_id) ||
           !class_table->HasValidClassAt(class_id)) {
-        FATAL2("Invalid class id: %" Pd " from tags %" Px "\n",
-               class_id, ptr()->tags_);
+        FATAL2("Invalid class id: %" Pd " from tags %" Px "\n", class_id,
+               ptr()->tags_);
       }
 #endif  // DEBUG
       RawClass* raw_class = isolate->GetClassForHeapWalkAt(class_id);
-      instance_size =
-          raw_class->ptr()->instance_size_in_words_ << kWordSizeLog2;
+      instance_size = raw_class->ptr()->instance_size_in_words_
+                      << kWordSizeLog2;
     }
   }
   ASSERT(instance_size != 0);
@@ -233,23 +231,21 @@
   if (class_id < kNumPredefinedCids) {
     switch (class_id) {
 #define RAW_VISITPOINTERS(clazz)                                               \
-      case k##clazz##Cid: {                                                    \
-        Raw##clazz* raw_obj = reinterpret_cast<Raw##clazz*>(this);             \
-        size = Raw##clazz::Visit##clazz##Pointers(raw_obj, visitor);           \
-        break;                                                                 \
-      }
+  case k##clazz##Cid: {                                                        \
+    Raw##clazz* raw_obj = reinterpret_cast<Raw##clazz*>(this);                 \
+    size = Raw##clazz::Visit##clazz##Pointers(raw_obj, visitor);               \
+    break;                                                                     \
+  }
       CLASS_LIST_NO_OBJECT(RAW_VISITPOINTERS)
 #undef RAW_VISITPOINTERS
-#define RAW_VISITPOINTERS(clazz)                                               \
-      case kTypedData##clazz##Cid:
+#define RAW_VISITPOINTERS(clazz) case kTypedData##clazz##Cid:
       CLASS_LIST_TYPED_DATA(RAW_VISITPOINTERS) {
         RawTypedData* raw_obj = reinterpret_cast<RawTypedData*>(this);
         size = RawTypedData::VisitTypedDataPointers(raw_obj, visitor);
         break;
       }
 #undef RAW_VISITPOINTERS
-#define RAW_VISITPOINTERS(clazz)                                               \
-      case kExternalTypedData##clazz##Cid:
+#define RAW_VISITPOINTERS(clazz) case kExternalTypedData##clazz##Cid:
       CLASS_LIST_TYPED_DATA(RAW_VISITPOINTERS) {
         RawExternalTypedData* raw_obj =
             reinterpret_cast<RawExternalTypedData*>(this);
@@ -258,8 +254,7 @@
         break;
       }
 #undef RAW_VISITPOINTERS
-#define RAW_VISITPOINTERS(clazz)                                               \
-      case kTypedData##clazz##ViewCid:
+#define RAW_VISITPOINTERS(clazz) case kTypedData##clazz##ViewCid:
       CLASS_LIST_TYPED_DATA(RAW_VISITPOINTERS)
       case kByteDataViewCid:
       case kByteBufferCid: {
@@ -313,57 +308,63 @@
 
 
 intptr_t RawUnresolvedClass::VisitUnresolvedClassPointers(
-    RawUnresolvedClass* raw_obj, ObjectPointerVisitor* visitor) {
+    RawUnresolvedClass* raw_obj,
+    ObjectPointerVisitor* visitor) {
   visitor->VisitPointers(raw_obj->from(), raw_obj->to());
   return UnresolvedClass::InstanceSize();
 }
 
 
 intptr_t RawAbstractType::VisitAbstractTypePointers(
-    RawAbstractType* raw_obj, ObjectPointerVisitor* visitor) {
+    RawAbstractType* raw_obj,
+    ObjectPointerVisitor* visitor) {
   // RawAbstractType is an abstract class.
   UNREACHABLE();
   return 0;
 }
 
 
-intptr_t RawType::VisitTypePointers(
-    RawType* raw_obj, ObjectPointerVisitor* visitor) {
+intptr_t RawType::VisitTypePointers(RawType* raw_obj,
+                                    ObjectPointerVisitor* visitor) {
   visitor->VisitPointers(raw_obj->from(), raw_obj->to());
   return Type::InstanceSize();
 }
 
 
-intptr_t RawTypeRef::VisitTypeRefPointers(
-    RawTypeRef* raw_obj, ObjectPointerVisitor* visitor) {
+intptr_t RawTypeRef::VisitTypeRefPointers(RawTypeRef* raw_obj,
+                                          ObjectPointerVisitor* visitor) {
   visitor->VisitPointers(raw_obj->from(), raw_obj->to());
   return TypeRef::InstanceSize();
 }
 
 
 intptr_t RawTypeParameter::VisitTypeParameterPointers(
-    RawTypeParameter* raw_obj, ObjectPointerVisitor* visitor) {
+    RawTypeParameter* raw_obj,
+    ObjectPointerVisitor* visitor) {
   visitor->VisitPointers(raw_obj->from(), raw_obj->to());
   return TypeParameter::InstanceSize();
 }
 
 
 intptr_t RawBoundedType::VisitBoundedTypePointers(
-    RawBoundedType* raw_obj, ObjectPointerVisitor* visitor) {
+    RawBoundedType* raw_obj,
+    ObjectPointerVisitor* visitor) {
   visitor->VisitPointers(raw_obj->from(), raw_obj->to());
   return BoundedType::InstanceSize();
 }
 
 
 intptr_t RawMixinAppType::VisitMixinAppTypePointers(
-    RawMixinAppType* raw_obj, ObjectPointerVisitor* visitor) {
+    RawMixinAppType* raw_obj,
+    ObjectPointerVisitor* visitor) {
   visitor->VisitPointers(raw_obj->from(), raw_obj->to());
   return MixinAppType::InstanceSize();
 }
 
 
 intptr_t RawTypeArguments::VisitTypeArgumentsPointers(
-    RawTypeArguments* raw_obj, ObjectPointerVisitor* visitor) {
+    RawTypeArguments* raw_obj,
+    ObjectPointerVisitor* visitor) {
   intptr_t length = Smi::Value(raw_obj->ptr()->length_);
   visitor->VisitPointers(raw_obj->from(), raw_obj->to(length));
   return TypeArguments::InstanceSize(length);
@@ -377,22 +378,24 @@
 }
 
 
-intptr_t RawClosure::VisitClosurePointers(
-    RawClosure* raw_obj, ObjectPointerVisitor* visitor) {
+intptr_t RawClosure::VisitClosurePointers(RawClosure* raw_obj,
+                                          ObjectPointerVisitor* visitor) {
   visitor->VisitPointers(raw_obj->from(), raw_obj->to());
   return Closure::InstanceSize();
 }
 
 
 intptr_t RawClosureData::VisitClosureDataPointers(
-    RawClosureData* raw_obj, ObjectPointerVisitor* visitor) {
+    RawClosureData* raw_obj,
+    ObjectPointerVisitor* visitor) {
   visitor->VisitPointers(raw_obj->from(), raw_obj->to());
   return ClosureData::InstanceSize();
 }
 
 
 intptr_t RawRedirectionData::VisitRedirectionDataPointers(
-    RawRedirectionData* raw_obj, ObjectPointerVisitor* visitor) {
+    RawRedirectionData* raw_obj,
+    ObjectPointerVisitor* visitor) {
   visitor->VisitPointers(raw_obj->from(), raw_obj->to());
   return RedirectionData::InstanceSize();
 }
@@ -473,14 +476,16 @@
 
 
 intptr_t RawLiteralToken::VisitLiteralTokenPointers(
-    RawLiteralToken* raw_obj, ObjectPointerVisitor* visitor) {
+    RawLiteralToken* raw_obj,
+    ObjectPointerVisitor* visitor) {
   visitor->VisitPointers(raw_obj->from(), raw_obj->to());
   return LiteralToken::InstanceSize();
 }
 
 
 intptr_t RawTokenStream::VisitTokenStreamPointers(
-    RawTokenStream* raw_obj, ObjectPointerVisitor* visitor) {
+    RawTokenStream* raw_obj,
+    ObjectPointerVisitor* visitor) {
   visitor->VisitPointers(raw_obj->from(), raw_obj->to());
   return TokenStream::InstanceSize();
 }
@@ -501,14 +506,15 @@
 
 
 intptr_t RawLibraryPrefix::VisitLibraryPrefixPointers(
-    RawLibraryPrefix* raw_obj, ObjectPointerVisitor* visitor) {
+    RawLibraryPrefix* raw_obj,
+    ObjectPointerVisitor* visitor) {
   visitor->VisitPointers(raw_obj->from(), raw_obj->to());
   return LibraryPrefix::InstanceSize();
 }
 
 
-intptr_t RawNamespace::VisitNamespacePointers(
-    RawNamespace* raw_obj, ObjectPointerVisitor* visitor) {
+intptr_t RawNamespace::VisitNamespacePointers(RawNamespace* raw_obj,
+                                              ObjectPointerVisitor* visitor) {
   visitor->VisitPointers(raw_obj->from(), raw_obj->to());
   return Namespace::InstanceSize();
 }
@@ -536,7 +542,7 @@
   // find those pointers for tracing.
   if (Code::AliveBit::decode(obj->state_bits_)) {
     uword entry_point = reinterpret_cast<uword>(obj->instructions_->ptr()) +
-        Instructions::HeaderSize();
+                        Instructions::HeaderSize();
     for (intptr_t i = 0; i < length; i++) {
       int32_t offset = obj->data()[i];
       visitor->VisitPointer(
@@ -553,8 +559,8 @@
 }
 
 
-intptr_t RawObjectPool::VisitObjectPoolPointers(
-    RawObjectPool* raw_obj, ObjectPointerVisitor* visitor) {
+intptr_t RawObjectPool::VisitObjectPoolPointers(RawObjectPool* raw_obj,
+                                                ObjectPointerVisitor* visitor) {
   visitor->VisitPointer(
       reinterpret_cast<RawObject**>(&raw_obj->ptr()->info_array_));
   const intptr_t len = raw_obj->ptr()->length_;
@@ -572,29 +578,31 @@
 
 
 intptr_t RawInstructions::VisitInstructionsPointers(
-    RawInstructions* raw_obj, ObjectPointerVisitor* visitor) {
-  RawInstructions* obj = raw_obj->ptr();
-  return Instructions::InstanceSize(abs(obj->size_));
+    RawInstructions* raw_obj,
+    ObjectPointerVisitor* visitor) {
+  return Instructions::InstanceSize(Instructions::Size(raw_obj));
 }
 
 
 bool RawInstructions::ContainsPC(RawInstructions* raw_instr, uword pc) {
   uword start_pc =
       reinterpret_cast<uword>(raw_instr->ptr()) + Instructions::HeaderSize();
-  uword end_pc = start_pc + abs(raw_instr->ptr()->size_);
+  uword end_pc = start_pc + Instructions::Size(raw_instr);
   ASSERT(end_pc > start_pc);
   return (pc >= start_pc) && (pc < end_pc);
 }
 
 
 intptr_t RawPcDescriptors::VisitPcDescriptorsPointers(
-    RawPcDescriptors* raw_obj, ObjectPointerVisitor* visitor) {
+    RawPcDescriptors* raw_obj,
+    ObjectPointerVisitor* visitor) {
   return PcDescriptors::InstanceSize(raw_obj->ptr()->length_);
 }
 
 
 intptr_t RawCodeSourceMap::VisitCodeSourceMapPointers(
-    RawCodeSourceMap* raw_obj, ObjectPointerVisitor* visitor) {
+    RawCodeSourceMap* raw_obj,
+    ObjectPointerVisitor* visitor) {
   return CodeSourceMap::InstanceSize(raw_obj->ptr()->length_);
 }
 
@@ -606,7 +614,8 @@
 
 
 intptr_t RawLocalVarDescriptors::VisitLocalVarDescriptorsPointers(
-    RawLocalVarDescriptors* raw_obj, ObjectPointerVisitor* visitor) {
+    RawLocalVarDescriptors* raw_obj,
+    ObjectPointerVisitor* visitor) {
   intptr_t num_entries = raw_obj->ptr()->num_entries_;
   visitor->VisitPointers(raw_obj->from(), raw_obj->to(num_entries));
   return LocalVarDescriptors::InstanceSize(num_entries);
@@ -614,7 +623,8 @@
 
 
 intptr_t RawExceptionHandlers::VisitExceptionHandlersPointers(
-    RawExceptionHandlers* raw_obj, ObjectPointerVisitor* visitor) {
+    RawExceptionHandlers* raw_obj,
+    ObjectPointerVisitor* visitor) {
   RawExceptionHandlers* obj = raw_obj->ptr();
   intptr_t len = obj->num_entries_;
   visitor->VisitPointer(
@@ -632,7 +642,8 @@
 
 
 intptr_t RawContextScope::VisitContextScopePointers(
-    RawContextScope* raw_obj, ObjectPointerVisitor* visitor) {
+    RawContextScope* raw_obj,
+    ObjectPointerVisitor* visitor) {
   intptr_t num_variables = raw_obj->ptr()->num_variables_;
   visitor->VisitPointers(raw_obj->from(), raw_obj->to(num_variables));
   return ContextScope::InstanceSize(num_variables);
@@ -640,14 +651,16 @@
 
 
 intptr_t RawSingleTargetCache::VisitSingleTargetCachePointers(
-    RawSingleTargetCache* raw_obj, ObjectPointerVisitor* visitor) {
+    RawSingleTargetCache* raw_obj,
+    ObjectPointerVisitor* visitor) {
   visitor->VisitPointers(raw_obj->from(), raw_obj->to());
   return SingleTargetCache::InstanceSize();
 }
 
 
 intptr_t RawUnlinkedCall::VisitUnlinkedCallPointers(
-    RawUnlinkedCall* raw_obj, ObjectPointerVisitor* visitor) {
+    RawUnlinkedCall* raw_obj,
+    ObjectPointerVisitor* visitor) {
   visitor->VisitPointers(raw_obj->from(), raw_obj->to());
   return UnlinkedCall::InstanceSize();
 }
@@ -669,7 +682,8 @@
 
 
 intptr_t RawSubtypeTestCache::VisitSubtypeTestCachePointers(
-    RawSubtypeTestCache* raw_obj, ObjectPointerVisitor* visitor) {
+    RawSubtypeTestCache* raw_obj,
+    ObjectPointerVisitor* visitor) {
   // Make sure that we got here with the tagged pointer as this.
   RawSubtypeTestCache* obj = raw_obj->ptr();
   visitor->VisitPointer(reinterpret_cast<RawObject**>(&obj->cache_));
@@ -685,29 +699,32 @@
 }
 
 
-intptr_t RawApiError::VisitApiErrorPointers(
-    RawApiError* raw_obj, ObjectPointerVisitor* visitor) {
+intptr_t RawApiError::VisitApiErrorPointers(RawApiError* raw_obj,
+                                            ObjectPointerVisitor* visitor) {
   visitor->VisitPointers(raw_obj->from(), raw_obj->to());
   return ApiError::InstanceSize();
 }
 
 
 intptr_t RawLanguageError::VisitLanguageErrorPointers(
-    RawLanguageError* raw_obj, ObjectPointerVisitor* visitor) {
+    RawLanguageError* raw_obj,
+    ObjectPointerVisitor* visitor) {
   visitor->VisitPointers(raw_obj->from(), raw_obj->to());
   return LanguageError::InstanceSize();
 }
 
 
 intptr_t RawUnhandledException::VisitUnhandledExceptionPointers(
-    RawUnhandledException* raw_obj, ObjectPointerVisitor* visitor) {
+    RawUnhandledException* raw_obj,
+    ObjectPointerVisitor* visitor) {
   visitor->VisitPointers(raw_obj->from(), raw_obj->to());
   return UnhandledException::InstanceSize();
 }
 
 
 intptr_t RawUnwindError::VisitUnwindErrorPointers(
-    RawUnwindError* raw_obj, ObjectPointerVisitor* visitor) {
+    RawUnwindError* raw_obj,
+    ObjectPointerVisitor* visitor) {
   visitor->VisitPointers(raw_obj->from(), raw_obj->to());
   return UnwindError::InstanceSize();
 }
@@ -793,7 +810,8 @@
 
 
 intptr_t RawOneByteString::VisitOneByteStringPointers(
-    RawOneByteString* raw_obj, ObjectPointerVisitor* visitor) {
+    RawOneByteString* raw_obj,
+    ObjectPointerVisitor* visitor) {
   ASSERT(!raw_obj->ptr()->length_->IsHeapObject());
   ASSERT(!raw_obj->ptr()->hash_->IsHeapObject());
   intptr_t length = Smi::Value(raw_obj->ptr()->length_);
@@ -802,7 +820,8 @@
 
 
 intptr_t RawTwoByteString::VisitTwoByteStringPointers(
-    RawTwoByteString* raw_obj, ObjectPointerVisitor* visitor) {
+    RawTwoByteString* raw_obj,
+    ObjectPointerVisitor* visitor) {
   ASSERT(!raw_obj->ptr()->length_->IsHeapObject());
   ASSERT(!raw_obj->ptr()->hash_->IsHeapObject());
   intptr_t length = Smi::Value(raw_obj->ptr()->length_);
@@ -811,7 +830,8 @@
 
 
 intptr_t RawExternalOneByteString::VisitExternalOneByteStringPointers(
-    RawExternalOneByteString* raw_obj, ObjectPointerVisitor* visitor) {
+    RawExternalOneByteString* raw_obj,
+    ObjectPointerVisitor* visitor) {
   // Make sure that we got here with the tagged pointer as this.
   ASSERT(raw_obj->IsHeapObject());
   visitor->VisitPointers(raw_obj->from(), raw_obj->to());
@@ -820,7 +840,8 @@
 
 
 intptr_t RawExternalTwoByteString::VisitExternalTwoByteStringPointers(
-    RawExternalTwoByteString* raw_obj, ObjectPointerVisitor* visitor) {
+    RawExternalTwoByteString* raw_obj,
+    ObjectPointerVisitor* visitor) {
   // Make sure that we got here with the tagged pointer as this.
   ASSERT(raw_obj->IsHeapObject());
   visitor->VisitPointers(raw_obj->from(), raw_obj->to());
@@ -845,50 +866,50 @@
 
 
 intptr_t RawImmutableArray::VisitImmutableArrayPointers(
-    RawImmutableArray* raw_obj, ObjectPointerVisitor* visitor) {
+    RawImmutableArray* raw_obj,
+    ObjectPointerVisitor* visitor) {
   return RawArray::VisitArrayPointers(raw_obj, visitor);
 }
 
 
 intptr_t RawGrowableObjectArray::VisitGrowableObjectArrayPointers(
-    RawGrowableObjectArray* raw_obj, ObjectPointerVisitor* visitor) {
+    RawGrowableObjectArray* raw_obj,
+    ObjectPointerVisitor* visitor) {
   visitor->VisitPointers(raw_obj->from(), raw_obj->to());
   return GrowableObjectArray::InstanceSize();
 }
 
 
 intptr_t RawLinkedHashMap::VisitLinkedHashMapPointers(
-    RawLinkedHashMap* raw_obj, ObjectPointerVisitor* visitor) {
+    RawLinkedHashMap* raw_obj,
+    ObjectPointerVisitor* visitor) {
   visitor->VisitPointers(raw_obj->from(), raw_obj->to());
   return LinkedHashMap::InstanceSize();
 }
 
 
-intptr_t RawFloat32x4::VisitFloat32x4Pointers(
-    RawFloat32x4* raw_obj,
-    ObjectPointerVisitor* visitor) {
-    ASSERT(raw_obj->IsHeapObject());
-    return Float32x4::InstanceSize();
+intptr_t RawFloat32x4::VisitFloat32x4Pointers(RawFloat32x4* raw_obj,
+                                              ObjectPointerVisitor* visitor) {
+  ASSERT(raw_obj->IsHeapObject());
+  return Float32x4::InstanceSize();
 }
 
 
-intptr_t RawInt32x4::VisitInt32x4Pointers(
-    RawInt32x4* raw_obj,
-    ObjectPointerVisitor* visitor) {
-    ASSERT(raw_obj->IsHeapObject());
-    return Int32x4::InstanceSize();
+intptr_t RawInt32x4::VisitInt32x4Pointers(RawInt32x4* raw_obj,
+                                          ObjectPointerVisitor* visitor) {
+  ASSERT(raw_obj->IsHeapObject());
+  return Int32x4::InstanceSize();
 }
 
 
-intptr_t RawFloat64x2::VisitFloat64x2Pointers(
-    RawFloat64x2* raw_obj,
-    ObjectPointerVisitor* visitor) {
-    ASSERT(raw_obj->IsHeapObject());
-    return Float64x2::InstanceSize();
+intptr_t RawFloat64x2::VisitFloat64x2Pointers(RawFloat64x2* raw_obj,
+                                              ObjectPointerVisitor* visitor) {
+  ASSERT(raw_obj->IsHeapObject());
+  return Float64x2::InstanceSize();
 }
 
-intptr_t RawTypedData::VisitTypedDataPointers(
-    RawTypedData* raw_obj, ObjectPointerVisitor* visitor) {
+intptr_t RawTypedData::VisitTypedDataPointers(RawTypedData* raw_obj,
+                                              ObjectPointerVisitor* visitor) {
   // Make sure that we got here with the tagged pointer as this.
   ASSERT(raw_obj->IsHeapObject());
   intptr_t cid = raw_obj->GetClassId();
@@ -900,7 +921,8 @@
 
 
 intptr_t RawExternalTypedData::VisitExternalTypedDataPointers(
-    RawExternalTypedData* raw_obj, ObjectPointerVisitor* visitor) {
+    RawExternalTypedData* raw_obj,
+    ObjectPointerVisitor* visitor) {
   // Make sure that we got here with the tagged pointer as this.
   ASSERT(raw_obj->IsHeapObject());
   visitor->VisitPointers(raw_obj->from(), raw_obj->to());
@@ -916,7 +938,8 @@
 
 
 intptr_t RawReceivePort::VisitReceivePortPointers(
-    RawReceivePort* raw_obj, ObjectPointerVisitor* visitor) {
+    RawReceivePort* raw_obj,
+    ObjectPointerVisitor* visitor) {
   // Make sure that we got here with the tagged pointer as this.
   ASSERT(raw_obj->IsHeapObject());
   visitor->VisitPointers(raw_obj->from(), raw_obj->to());
@@ -951,7 +974,8 @@
 
 
 intptr_t RawWeakProperty::VisitWeakPropertyPointers(
-    RawWeakProperty* raw_obj, ObjectPointerVisitor* visitor) {
+    RawWeakProperty* raw_obj,
+    ObjectPointerVisitor* visitor) {
   // Make sure that we got here with the tagged pointer as this.
   ASSERT(raw_obj->IsHeapObject());
   visitor->VisitPointers(raw_obj->from(), raw_obj->to());
@@ -960,7 +984,8 @@
 
 
 intptr_t RawMirrorReference::VisitMirrorReferencePointers(
-    RawMirrorReference* raw_obj, ObjectPointerVisitor* visitor) {
+    RawMirrorReference* raw_obj,
+    ObjectPointerVisitor* visitor) {
   // Make sure that we got here with the tagged pointer as this.
   ASSERT(raw_obj->IsHeapObject());
   visitor->VisitPointers(raw_obj->from(), raw_obj->to());
@@ -968,8 +993,8 @@
 }
 
 
-intptr_t RawUserTag::VisitUserTagPointers(
-    RawUserTag* raw_obj, ObjectPointerVisitor* visitor) {
+intptr_t RawUserTag::VisitUserTagPointers(RawUserTag* raw_obj,
+                                          ObjectPointerVisitor* visitor) {
   // Make sure that we got here with the tagged pointer as this.
   ASSERT(raw_obj->IsHeapObject());
   visitor->VisitPointers(raw_obj->from(), raw_obj->to());
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index cb47575..71b64583 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -45,52 +45,52 @@
   V(MegamorphicCache)                                                          \
   V(SubtypeTestCache)                                                          \
   V(Error)                                                                     \
-    V(ApiError)                                                                \
-    V(LanguageError)                                                           \
-    V(UnhandledException)                                                      \
-    V(UnwindError)                                                             \
+  V(ApiError)                                                                  \
+  V(LanguageError)                                                             \
+  V(UnhandledException)                                                        \
+  V(UnwindError)                                                               \
   V(Instance)                                                                  \
-    V(LibraryPrefix)                                                           \
-    V(AbstractType)                                                            \
-      V(Type)                                                                  \
-      V(TypeRef)                                                               \
-      V(TypeParameter)                                                         \
-      V(BoundedType)                                                           \
-      V(MixinAppType)                                                          \
-    V(Closure)                                                                 \
-    V(Number)                                                                  \
-      V(Integer)                                                               \
-        V(Smi)                                                                 \
-        V(Mint)                                                                \
-        V(Bigint)                                                              \
-      V(Double)                                                                \
-    V(Bool)                                                                    \
-    V(GrowableObjectArray)                                                     \
-    V(Float32x4)                                                               \
-    V(Int32x4)                                                                 \
-    V(Float64x2)                                                               \
-    V(TypedData)                                                               \
-    V(ExternalTypedData)                                                       \
-    V(Capability)                                                              \
-    V(ReceivePort)                                                             \
-    V(SendPort)                                                                \
-    V(Stacktrace)                                                              \
-    V(RegExp)                                                                  \
-    V(WeakProperty)                                                            \
-    V(MirrorReference)                                                         \
-    V(LinkedHashMap)                                                           \
-    V(UserTag)                                                                 \
+  V(LibraryPrefix)                                                             \
+  V(AbstractType)                                                              \
+  V(Type)                                                                      \
+  V(TypeRef)                                                                   \
+  V(TypeParameter)                                                             \
+  V(BoundedType)                                                               \
+  V(MixinAppType)                                                              \
+  V(Closure)                                                                   \
+  V(Number)                                                                    \
+  V(Integer)                                                                   \
+  V(Smi)                                                                       \
+  V(Mint)                                                                      \
+  V(Bigint)                                                                    \
+  V(Double)                                                                    \
+  V(Bool)                                                                      \
+  V(GrowableObjectArray)                                                       \
+  V(Float32x4)                                                                 \
+  V(Int32x4)                                                                   \
+  V(Float64x2)                                                                 \
+  V(TypedData)                                                                 \
+  V(ExternalTypedData)                                                         \
+  V(Capability)                                                                \
+  V(ReceivePort)                                                               \
+  V(SendPort)                                                                  \
+  V(Stacktrace)                                                                \
+  V(RegExp)                                                                    \
+  V(WeakProperty)                                                              \
+  V(MirrorReference)                                                           \
+  V(LinkedHashMap)                                                             \
+  V(UserTag)
 
 #define CLASS_LIST_ARRAYS(V)                                                   \
   V(Array)                                                                     \
-    V(ImmutableArray)                                                          \
+  V(ImmutableArray)
 
 #define CLASS_LIST_STRINGS(V)                                                  \
   V(String)                                                                    \
-    V(OneByteString)                                                           \
-    V(TwoByteString)                                                           \
-    V(ExternalOneByteString)                                                   \
-    V(ExternalTwoByteString)
+  V(OneByteString)                                                             \
+  V(TwoByteString)                                                             \
+  V(ExternalOneByteString)                                                     \
+  V(ExternalTwoByteString)
 
 #define CLASS_LIST_TYPED_DATA(V)                                               \
   V(Int8Array)                                                                 \
@@ -106,7 +106,7 @@
   V(Float64Array)                                                              \
   V(Float32x4Array)                                                            \
   V(Int32x4Array)                                                              \
-  V(Float64x2Array)                                                            \
+  V(Float64x2Array)
 
 #define DART_CLASS_LIST_TYPED_DATA(V)                                          \
   V(Int8)                                                                      \
@@ -141,8 +141,7 @@
 
 // Forward declarations.
 class Isolate;
-#define DEFINE_FORWARD_DECLARATION(clazz)                                      \
-  class Raw##clazz;
+#define DEFINE_FORWARD_DECLARATION(clazz) class Raw##clazz;
 CLASS_LIST(DEFINE_FORWARD_DECLARATION)
 #undef DEFINE_FORWARD_DECLARATION
 
@@ -158,30 +157,26 @@
   kFreeListElement,
   kForwardingCorpse,
 
-  // List of Ids for predefined classes.
-#define DEFINE_OBJECT_KIND(clazz)                                              \
-  k##clazz##Cid,
-CLASS_LIST(DEFINE_OBJECT_KIND)
+// List of Ids for predefined classes.
+#define DEFINE_OBJECT_KIND(clazz) k##clazz##Cid,
+  CLASS_LIST(DEFINE_OBJECT_KIND)
 #undef DEFINE_OBJECT_KIND
 
-#define DEFINE_OBJECT_KIND(clazz)                                              \
-  kTypedData##clazz##Cid,
-CLASS_LIST_TYPED_DATA(DEFINE_OBJECT_KIND)
+#define DEFINE_OBJECT_KIND(clazz) kTypedData##clazz##Cid,
+      CLASS_LIST_TYPED_DATA(DEFINE_OBJECT_KIND)
 #undef DEFINE_OBJECT_KIND
 
-#define DEFINE_OBJECT_KIND(clazz)                                              \
-  kTypedData##clazz##ViewCid,
-CLASS_LIST_TYPED_DATA(DEFINE_OBJECT_KIND)
+#define DEFINE_OBJECT_KIND(clazz) kTypedData##clazz##ViewCid,
+          CLASS_LIST_TYPED_DATA(DEFINE_OBJECT_KIND)
 #undef DEFINE_OBJECT_KIND
 
-  kByteDataViewCid,
+              kByteDataViewCid,
 
-#define DEFINE_OBJECT_KIND(clazz)                                              \
-  kExternalTypedData##clazz##Cid,
-CLASS_LIST_TYPED_DATA(DEFINE_OBJECT_KIND)
+#define DEFINE_OBJECT_KIND(clazz) kExternalTypedData##clazz##Cid,
+  CLASS_LIST_TYPED_DATA(DEFINE_OBJECT_KIND)
 #undef DEFINE_OBJECT_KIND
 
-  kByteBufferCid,
+      kByteBufferCid,
 
   // The following entries do not describe a predefined class, but instead
   // are class indexes for pre-allocated instance (Null, dynamic and Void).
@@ -212,25 +207,23 @@
 
 enum TypedDataElementType {
 #define V(name) k##name##Element,
-CLASS_LIST_TYPED_DATA(V)
+  CLASS_LIST_TYPED_DATA(V)
 #undef V
 };
 
 #define SNAPSHOT_WRITER_SUPPORT()                                              \
-  void WriteTo(                                                                \
-      SnapshotWriter* writer, intptr_t object_id,                              \
-      Snapshot::Kind kind, bool as_reference);                                 \
-  friend class SnapshotWriter;                                                 \
+  void WriteTo(SnapshotWriter* writer, intptr_t object_id,                     \
+               Snapshot::Kind kind, bool as_reference);                        \
+  friend class SnapshotWriter;
 
 #define VISITOR_SUPPORT(object)                                                \
   static intptr_t Visit##object##Pointers(Raw##object* raw_obj,                \
                                           ObjectPointerVisitor* visitor);
 
-#define HEAP_PROFILER_SUPPORT()                                                \
-  friend class HeapProfiler;                                                   \
+#define HEAP_PROFILER_SUPPORT() friend class HeapProfiler;
 
 #define RAW_OBJECT_IMPLEMENTATION(object)                                      \
- private:  /* NOLINT */                                                        \
+ private: /* NOLINT */                                                         \
   VISITOR_SUPPORT(object)                                                      \
   friend class object;                                                         \
   friend class RawObject;                                                      \
@@ -242,17 +235,17 @@
 
 // TODO(koda): Make ptr() return const*, like Object::raw_ptr().
 #define RAW_HEAP_OBJECT_IMPLEMENTATION(object)                                 \
-  private:                                                                     \
-    RAW_OBJECT_IMPLEMENTATION(object);                                         \
-    Raw##object* ptr() const {                                                 \
-      ASSERT(IsHeapObject());                                                  \
-      return reinterpret_cast<Raw##object*>(                                   \
-          reinterpret_cast<uword>(this) - kHeapObjectTag);                     \
-    }                                                                          \
-    SNAPSHOT_WRITER_SUPPORT()                                                  \
-    HEAP_PROFILER_SUPPORT()                                                    \
-    friend class object##SerializationCluster;                                 \
-    friend class object##DeserializationCluster;                               \
+ private:                                                                      \
+  RAW_OBJECT_IMPLEMENTATION(object);                                           \
+  Raw##object* ptr() const {                                                   \
+    ASSERT(IsHeapObject());                                                    \
+    return reinterpret_cast<Raw##object*>(reinterpret_cast<uword>(this) -      \
+                                          kHeapObjectTag);                     \
+  }                                                                            \
+  SNAPSHOT_WRITER_SUPPORT()                                                    \
+  HEAP_PROFILER_SUPPORT()                                                      \
+  friend class object##SerializationCluster;                                   \
+  friend class object##DeserializationCluster;
 
 // RawObject is the base class of all raw objects; even though it carries the
 // tags_ field not all raw objects are allocated in the heap and thus cannot
@@ -289,8 +282,8 @@
   // Encodes the object size in the tag in units of object alignment.
   class SizeTag {
    public:
-    static const intptr_t kMaxSizeTag =
-        ((1 << RawObject::kSizeTagSize) - 1) << kObjectAlignmentLog2;
+    static const intptr_t kMaxSizeTag = ((1 << RawObject::kSizeTagSize) - 1)
+                                        << kObjectAlignmentLog2;
 
     static uword encode(intptr_t size) {
       return SizeBits::encode(SizeToTagValue(size));
@@ -306,25 +299,25 @@
 
    private:
     // The actual unscaled bit field used within the tag field.
-    class SizeBits :
-        public BitField<uword, intptr_t, kSizeTagPos, kSizeTagSize> {};
+    class SizeBits
+        : public BitField<uword, intptr_t, kSizeTagPos, kSizeTagSize> {};
 
     static intptr_t SizeToTagValue(intptr_t size) {
       ASSERT(Utils::IsAligned(size, kObjectAlignment));
-      return  (size > kMaxSizeTag) ? 0 : (size >> kObjectAlignmentLog2);
+      return (size > kMaxSizeTag) ? 0 : (size >> kObjectAlignmentLog2);
     }
     static intptr_t TagValueToSize(intptr_t value) {
       return value << kObjectAlignmentLog2;
     }
   };
 
-  class ClassIdTag :
-      public BitField<uword, intptr_t, kClassIdTagPos, kClassIdTagSize> {};
+  class ClassIdTag
+      : public BitField<uword, intptr_t, kClassIdTagPos, kClassIdTagSize> {};
 
   bool IsWellFormed() const {
     uword value = reinterpret_cast<uword>(this);
     return (value & kSmiTagMask) == 0 ||
-        Utils::IsAligned(value - kHeapObjectTag, kWordSize);
+           Utils::IsAligned(value - kHeapObjectTag, kWordSize);
   }
   bool IsHeapObject() const {
     ASSERT(IsWellFormed());
@@ -356,9 +349,7 @@
   }
 
   // Support for GC marking bit.
-  bool IsMarked() const {
-    return MarkBit::decode(ptr()->tags_);
-  }
+  bool IsMarked() const { return MarkBit::decode(ptr()->tags_); }
   void SetMarkBit() {
     ASSERT(!IsMarked());
     UpdateTagBit<MarkBit>(true);
@@ -374,31 +365,17 @@
   }
   // Returns false if the bit was already set.
   // TODO(koda): Add "must use result" annotation here, after we add support.
-  bool TryAcquireMarkBit() {
-    return TryAcquireTagBit<MarkBit>();
-  }
+  bool TryAcquireMarkBit() { return TryAcquireTagBit<MarkBit>(); }
 
   // Support for object tags.
-  bool IsCanonical() const {
-    return CanonicalObjectTag::decode(ptr()->tags_);
-  }
-  void SetCanonical() {
-    UpdateTagBit<CanonicalObjectTag>(true);
-  }
-  void ClearCanonical() {
-    UpdateTagBit<CanonicalObjectTag>(false);
-  }
-  bool IsVMHeapObject() const {
-    return VMHeapObjectTag::decode(ptr()->tags_);
-  }
-  void SetVMHeapObject() {
-    UpdateTagBit<VMHeapObjectTag>(true);
-  }
+  bool IsCanonical() const { return CanonicalObjectTag::decode(ptr()->tags_); }
+  void SetCanonical() { UpdateTagBit<CanonicalObjectTag>(true); }
+  void ClearCanonical() { UpdateTagBit<CanonicalObjectTag>(false); }
+  bool IsVMHeapObject() const { return VMHeapObjectTag::decode(ptr()->tags_); }
+  void SetVMHeapObject() { UpdateTagBit<VMHeapObjectTag>(true); }
 
   // Support for GC remembered bit.
-  bool IsRemembered() const {
-    return RememberedBit::decode(ptr()->tags_);
-  }
+  bool IsRemembered() const { return RememberedBit::decode(ptr()->tags_); }
   void SetRememberedBit() {
     ASSERT(!IsRemembered());
     UpdateTagBit<RememberedBit>(true);
@@ -408,22 +385,18 @@
     uword tags = ptr()->tags_;
     ptr()->tags_ = RememberedBit::update(true, tags);
   }
-  void ClearRememberedBit() {
-    UpdateTagBit<RememberedBit>(false);
-  }
+  void ClearRememberedBit() { UpdateTagBit<RememberedBit>(false); }
   void ClearRememberedBitUnsynchronized() {
     uword tags = ptr()->tags_;
     ptr()->tags_ = RememberedBit::update(false, tags);
   }
   // Returns false if the bit was already set.
   // TODO(koda): Add "must use result" annotation here, after we add support.
-  bool TryAcquireRememberedBit() {
-    return TryAcquireTagBit<RememberedBit>();
-  }
+  bool TryAcquireRememberedBit() { return TryAcquireTagBit<RememberedBit>(); }
 
 #define DEFINE_IS_CID(clazz)                                                   \
   bool Is##clazz() const { return ((GetClassId() == k##clazz##Cid)); }
-CLASS_LIST(DEFINE_IS_CID)
+  CLASS_LIST(DEFINE_IS_CID)
 #undef DEFINE_IS_CID
 
 #define DEFINE_IS_CID(clazz)                                                   \
@@ -436,12 +409,10 @@
   bool IsExternalTypedData##clazz() const {                                    \
     return ((GetClassId() == kExternalTypedData##clazz##Cid));                 \
   }
-CLASS_LIST_TYPED_DATA(DEFINE_IS_CID)
+  CLASS_LIST_TYPED_DATA(DEFINE_IS_CID)
 #undef DEFINE_IS_CID
 
-  bool IsStringInstance() const {
-    return IsStringClassId(GetClassId());
-  }
+  bool IsStringInstance() const { return IsStringClassId(GetClassId()); }
   bool IsDartInstance() const {
     return (!IsHeapObject() || (GetClassId() >= kInstanceCid));
   }
@@ -524,14 +495,14 @@
 
   class VMHeapObjectTag : public BitField<uword, bool, kVMHeapObjectBit, 1> {};
 
-  class ReservedBits : public
-      BitField<uword, intptr_t, kReservedTagPos, kReservedTagSize> {};
+  class ReservedBits
+      : public BitField<uword, intptr_t, kReservedTagPos, kReservedTagSize> {};
 
   // TODO(koda): After handling tags_, return const*, like Object::raw_ptr().
   RawObject* ptr() const {
     ASSERT(IsHeapObject());
-    return reinterpret_cast<RawObject*>(
-        reinterpret_cast<uword>(this) - kHeapObjectTag);
+    return reinterpret_cast<RawObject*>(reinterpret_cast<uword>(this) -
+                                        kHeapObjectTag);
   }
 
   intptr_t SizeFromClass() const;
@@ -546,19 +517,19 @@
     ptr()->tags_ = ClassIdTag::update(new_cid, tags);
   }
 
-  template<class TagBitField>
+  template <class TagBitField>
   void UpdateTagBit(bool value) {
     uword tags = ptr()->tags_;
     uword old_tags;
     do {
       old_tags = tags;
       uword new_tags = TagBitField::update(value, old_tags);
-      tags = AtomicOperations::CompareAndSwapWord(
-          &ptr()->tags_, old_tags, new_tags);
+      tags = AtomicOperations::CompareAndSwapWord(&ptr()->tags_, old_tags,
+                                                  new_tags);
     } while (tags != old_tags);
   }
 
-  template<class TagBitField>
+  template <class TagBitField>
   bool TryAcquireTagBit() {
     uword tags = ptr()->tags_;
     uword old_tags;
@@ -566,8 +537,8 @@
       old_tags = tags;
       if (TagBitField::decode(tags)) return false;
       uword new_tags = TagBitField::update(true, old_tags);
-      tags = AtomicOperations::CompareAndSwapWord(
-          &ptr()->tags_, old_tags, new_tags);
+      tags = AtomicOperations::CompareAndSwapWord(&ptr()->tags_, old_tags,
+                                                  new_tags);
     } while (tags != old_tags);
     return true;
   }
@@ -576,13 +547,12 @@
   // methods below or their counterparts in Object, to ensure that the
   // write barrier is correctly applied.
 
-  template<typename type>
+  template <typename type>
   void StorePointer(type const* addr, type value) {
     *const_cast<type*>(addr) = value;
     // Filter stores based on source and target.
     if (!value->IsHeapObject()) return;
-    if (value->IsNewObject() && this->IsOldObject() &&
-        !this->IsRemembered()) {
+    if (value->IsNewObject() && this->IsOldObject() && !this->IsRemembered()) {
       this->SetRememberedBit();
       Thread::Current()->StoreBufferAddObject(this);
     }
@@ -598,7 +568,7 @@
 
   friend class Api;
   friend class ApiMessageReader;  // GetClassId
-  friend class Serializer;  // GetClassId
+  friend class Serializer;        // GetClassId
   friend class Array;
   friend class Become;  // GetClassId
   friend class Bigint;
@@ -617,7 +587,8 @@
   friend class Heap;
   friend class HeapMapAsJSONVisitor;
   friend class ClassStatsVisitor;
-  template<bool> friend class MarkingVisitorBase;
+  template <bool>
+  friend class MarkingVisitorBase;
   friend class Mint;
   friend class Object;
   friend class OneByteString;  // StoreSmi
@@ -629,10 +600,10 @@
   friend class Scavenger;
   friend class ScavengerVisitor;
   friend class SizeExcludingClassVisitor;  // GetClassId
-  friend class InstanceAccumulator;  // GetClassId
-  friend class RetainingPathVisitor;  // GetClassId
-  friend class SkippedCodeFunctions;  // StorePointer
-  friend class InstructionsReader;  // tags_ check
+  friend class InstanceAccumulator;        // GetClassId
+  friend class RetainingPathVisitor;       // GetClassId
+  friend class SkippedCodeFunctions;       // StorePointer
+  friend class InstructionsReader;         // tags_ check
   friend class AssemblyInstructionsWriter;
   friend class BlobInstructionsWriter;
   friend class SnapshotReader;
@@ -642,11 +613,11 @@
   friend class Type;  // GetClassId
   friend class TypedData;
   friend class TypedDataView;
-  friend class WeakProperty;  // StorePointer
-  friend class Instance;  // StorePointer
-  friend class StackFrame;  // GetCodeObject assertion.
+  friend class WeakProperty;            // StorePointer
+  friend class Instance;                // StorePointer
+  friend class StackFrame;              // GetCodeObject assertion.
   friend class CodeLookupTableBuilder;  // profiler
-  friend class NativeEntry;  // GetClassId
+  friend class NativeEntry;             // GetClassId
   friend class Simulator;
   friend class SimulatorHelpers;
   friend class ObjectLocator;
@@ -661,9 +632,9 @@
 class RawClass : public RawObject {
  public:
   enum ClassFinalizedState {
-    kAllocated = 0,  // Initial state.
-    kPreFinalized,  // VM classes: size precomputed, but no checks done.
-    kFinalized,  // Class parsed, finalized and ready for use.
+    kAllocated = 0,         // Initial state.
+    kPreFinalized,          // VM classes: size precomputed, but no checks done.
+    kFinalized,             // Class parsed, finalized and ready for use.
     kRefinalizeAfterPatch,  // Class needs to be refinalized (patched).
   };
 
@@ -684,12 +655,12 @@
   RawAbstractType* super_type_;
   RawType* mixin_;  // Generic mixin type, e.g. M<T>, not M<int>.
   RawFunction* signature_function_;  // Associated function for typedef class.
-  RawArray* constants_;  // Canonicalized const instances of this class.
+  RawArray* constants_;      // Canonicalized const instances of this class.
   RawType* canonical_type_;  // Canonical type for this class.
   RawArray* invocation_dispatcher_cache_;  // Cache for dispatcher functions.
   RawCode* allocation_stub_;  // Stub code for allocation of instances.
   RawGrowableObjectArray* direct_subclasses_;  // Array of Class.
-  RawArray* dependent_code_;  // CHA optimized codes.
+  RawArray* dependent_code_;                   // CHA optimized codes.
   RawObject** to() {
     return reinterpret_cast<RawObject**>(&ptr()->dependent_code_);
   }
@@ -714,10 +685,10 @@
   int32_t instance_size_in_words_;  // Size if fixed len or 0 if variable len.
   int32_t type_arguments_field_offset_in_words_;  // Offset of type args fld.
   int32_t next_field_offset_in_words_;  // Offset of the next instance field.
-  classid_t id_;  // Class Id, also index in the class table.
+  classid_t id_;                // Class Id, also index in the class table.
   int16_t num_type_arguments_;  // Number of type arguments in flattened vector.
   int16_t num_own_type_arguments_;  // Number of non-overlapping type arguments.
-  uint16_t num_native_fields_;  // Number of native fields in class.
+  uint16_t num_native_fields_;      // Number of native fields in class.
   uint16_t state_bits_;
 
   friend class Instance;
@@ -738,10 +709,8 @@
     return reinterpret_cast<RawObject**>(&ptr()->library_prefix_);
   }
   RawLibraryPrefix* library_prefix_;  // Library prefix qualifier for the ident.
-  RawString* ident_;  // Name of the unresolved identifier.
-  RawObject** to() {
-    return reinterpret_cast<RawObject**>(&ptr()->ident_);
-  }
+  RawString* ident_;                  // Name of the unresolved identifier.
+  RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->ident_); }
   TokenPosition token_pos_;
 };
 
@@ -787,9 +756,7 @@
   RawClass* patched_class_;
   RawClass* origin_class_;
   RawScript* script_;
-  RawObject** to() {
-    return reinterpret_cast<RawObject**>(&ptr()->script_);
-  }
+  RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->script_); }
 
   friend class Function;
 };
@@ -804,23 +771,23 @@
     kGetterFunction,     // represents getter functions e.g: get foo() { .. }.
     kSetterFunction,     // represents setter functions e.g: set foo(..) { .. }.
     kConstructor,
-    kImplicitGetter,     // represents an implicit getter for fields.
-    kImplicitSetter,     // represents an implicit setter for fields.
+    kImplicitGetter,             // represents an implicit getter for fields.
+    kImplicitSetter,             // represents an implicit setter for fields.
     kImplicitStaticFinalGetter,  // represents an implicit getter for static
                                  // final fields (incl. static const fields).
     kMethodExtractor,  // converts method into implicit closure on the receiver.
     kNoSuchMethodDispatcher,  // invokes noSuchMethod.
-    kInvokeFieldDispatcher,  // invokes a field as a closure.
-    kIrregexpFunction,   // represents a generated irregexp matcher function.
+    kInvokeFieldDispatcher,   // invokes a field as a closure.
+    kIrregexpFunction,  // represents a generated irregexp matcher function.
   };
 
   enum AsyncModifier {
     kNoModifier = 0x0,
-    kAsyncBit   = 0x1,
-    kGeneratorBit =  0x2,
-    kAsync      = kAsyncBit,
-    kSyncGen    = kGeneratorBit,
-    kAsyncGen   = kAsyncBit | kGeneratorBit,
+    kAsyncBit = 0x1,
+    kGeneratorBit = 0x2,
+    kAsync = kAsyncBit,
+    kSyncGen = kGeneratorBit,
+    kAsyncGen = kAsyncBit | kGeneratorBit,
   };
 
  private:
@@ -866,7 +833,7 @@
   NOT_IN_PRECOMPILED(TokenPosition end_token_pos_);
   NOT_IN_PRECOMPILED(int32_t usage_counter_);  // Accessed from generated code
                                                // (JIT only).
-  uint32_t kind_tag_;  // See Function::KindTagBits.
+  uint32_t kind_tag_;                          // See Function::KindTagBits.
   int16_t num_fixed_parameters_;
   int16_t num_optional_parameters_;  // > 0: positional; < 0: named.
   NOT_IN_PRECOMPILED(void* kernel_function_);
@@ -888,9 +855,7 @@
   RawFunction* parent_function_;  // Enclosing function of this local function.
   RawType* signature_type_;
   RawInstance* closure_;  // Closure object for static implicit closures.
-  RawObject** to() {
-    return reinterpret_cast<RawObject**>(&ptr()->closure_);
-  }
+  RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->closure_); }
 
   friend class Function;
 };
@@ -900,15 +865,11 @@
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(RedirectionData);
 
-  RawObject** from() {
-    return reinterpret_cast<RawObject**>(&ptr()->type_);
-  }
+  RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->type_); }
   RawType* type_;
   RawString* identifier_;
   RawFunction* target_;
-  RawObject** to() {
-    return reinterpret_cast<RawObject**>(&ptr()->target_);
-  }
+  RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->target_); }
 };
 
 
@@ -922,7 +883,7 @@
   RawAbstractType* type_;
   union {
     RawInstance* static_value_;  // Value for static fields.
-    RawSmi* offset_;  // Offset in words for instance fields.
+    RawSmi* offset_;             // Offset in words for instance fields.
   } value_;
   union {
     // When precompiling we need to save the static initializer function here
@@ -975,14 +936,10 @@
 class RawLiteralToken : public RawObject {
   RAW_HEAP_OBJECT_IMPLEMENTATION(LiteralToken);
 
-  RawObject** from() {
-    return reinterpret_cast<RawObject**>(&ptr()->literal_);
-  }
+  RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->literal_); }
   RawString* literal_;  // Literal characters as they appear in source text.
-  RawObject* value_;  // The actual object corresponding to the token.
-  RawObject** to() {
-    return reinterpret_cast<RawObject**>(&ptr()->value_);
-  }
+  RawObject* value_;    // The actual object corresponding to the token.
+  RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->value_); }
   Token::Kind kind_;  // The literal kind (string, integer, double).
 
   friend class SnapshotReader;
@@ -998,9 +955,7 @@
   RawString* private_key_;  // Key used for private identifiers.
   RawGrowableObjectArray* token_objects_;
   RawExternalTypedData* stream_;
-  RawObject** to() {
-    return reinterpret_cast<RawObject**>(&ptr()->stream_);
-  }
+  RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->stream_); }
 
   friend class SnapshotReader;
 };
@@ -1025,7 +980,7 @@
   RawArray* compile_time_constants_;
   RawTokenStream* tokens_;
   RawString* source_;
-  RawObject** to() {return reinterpret_cast<RawObject**>(&ptr()->source_); }
+  RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->source_); }
   RawObject** to_snapshot(Snapshot::Kind kind) {
     switch (kind) {
       case Snapshot::kAppNoJIT:
@@ -1065,32 +1020,32 @@
   RawString* name_;
   RawString* url_;
   RawString* private_key_;
-  RawArray* dictionary_;         // Top-level names in this library.
+  RawArray* dictionary_;              // Top-level names in this library.
   RawGrowableObjectArray* metadata_;  // Metadata on classes, methods etc.
-  RawClass* toplevel_class_;     // Class containing top-level elements.
+  RawClass* toplevel_class_;          // Class containing top-level elements.
   RawGrowableObjectArray* patch_classes_;
-  RawArray* imports_;            // List of Namespaces imported without prefix.
-  RawArray* exports_;            // List of re-exported Namespaces.
-  RawInstance* load_error_;      // Error iff load_state_ == kLoadError.
+  RawArray* imports_;        // List of Namespaces imported without prefix.
+  RawArray* exports_;        // List of re-exported Namespaces.
+  RawInstance* load_error_;  // Error iff load_state_ == kLoadError.
   RawObject** to_snapshot() {
     return reinterpret_cast<RawObject**>(&ptr()->load_error_);
   }
-  RawArray* resolved_names_;     // Cache of resolved names in library scope.
-  RawArray* exported_names_;     // Cache of exported names by library.
-  RawArray* loaded_scripts_;     // Array of scripts loaded in this library.
+  RawArray* resolved_names_;  // Cache of resolved names in library scope.
+  RawArray* exported_names_;  // Cache of exported names by library.
+  RawArray* loaded_scripts_;  // Array of scripts loaded in this library.
   RawObject** to() {
     return reinterpret_cast<RawObject**>(&ptr()->loaded_scripts_);
   }
 
   Dart_NativeEntryResolver native_entry_resolver_;  // Resolves natives.
   Dart_NativeEntrySymbol native_entry_symbol_resolver_;
-  classid_t index_;              // Library id number.
-  uint16_t num_imports_;         // Number of entries in imports_.
-  int8_t load_state_;            // Of type LibraryState.
+  classid_t index_;       // Library id number.
+  uint16_t num_imports_;  // Number of entries in imports_.
+  int8_t load_state_;     // Of type LibraryState.
   bool corelib_imported_;
   bool is_dart_scheme_;
-  bool debuggable_;              // True if debugger can stop in library.
-  bool is_in_fullsnapshot_;      // True if library is in a full snapshot.
+  bool debuggable_;          // True if debugger can stop in library.
+  bool is_in_fullsnapshot_;  // True if library is in a full snapshot.
 
   friend class Class;
   friend class Isolate;
@@ -1100,14 +1055,12 @@
 class RawNamespace : public RawObject {
   RAW_HEAP_OBJECT_IMPLEMENTATION(Namespace);
 
-  RawObject** from() {
-    return reinterpret_cast<RawObject**>(&ptr()->library_);
-  }
-  RawLibrary* library_;          // library with name dictionary.
-  RawArray* show_names_;         // list of names that are exported.
-  RawArray* hide_names_;         // blacklist of names that are not exported.
-  RawField* metadata_field_;     // remembers the token pos of metadata if any,
-                                 // and the metadata values if computed.
+  RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->library_); }
+  RawLibrary* library_;       // library with name dictionary.
+  RawArray* show_names_;      // list of names that are exported.
+  RawArray* hide_names_;      // blacklist of names that are not exported.
+  RawField* metadata_field_;  // remembers the token pos of metadata if any,
+                              // and the metadata values if computed.
   RawObject** to() {
     return reinterpret_cast<RawObject**>(&ptr()->metadata_field_);
   }
@@ -1125,13 +1078,13 @@
 
   RAW_HEAP_OBJECT_IMPLEMENTATION(Code);
 
-  uword entry_point_;  // Accessed from generated code.
+  uword entry_point_;          // Accessed from generated code.
   uword checked_entry_point_;  // Accessed from generated code (AOT only).
 
   RawObject** from() {
     return reinterpret_cast<RawObject**>(&ptr()->object_pool_);
   }
-  RawObjectPool* object_pool_;  // Accessed from generated code.
+  RawObjectPool* object_pool_;     // Accessed from generated code.
   RawInstructions* instructions_;  // Accessed from generated code.
   // If owner_ is Function::null() the owner is a regular stub.
   // If owner_ is a Class the owner is the allocation stub for that class.
@@ -1175,7 +1128,8 @@
   static bool ContainsPC(RawObject* raw_obj, uword pc);
 
   friend class Function;
-  template<bool> friend class MarkingVisitorBase;
+  template <bool>
+  friend class MarkingVisitorBase;
   friend class SkippedCodeFunctions;
   friend class StackFrame;
   friend class Profiler;
@@ -1207,7 +1161,9 @@
 class RawInstructions : public RawObject {
   RAW_HEAP_OBJECT_IMPLEMENTATION(Instructions);
 
-  int32_t size_;
+  // Instructions size in bytes and flags.
+  // Currently, only flag indicates 1 or 2 entry points.
+  uint32_t size_and_flags_;
 
   // Variable length data follows here.
   uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); }
@@ -1221,7 +1177,8 @@
   friend class RawFunction;
   friend class Code;
   friend class StackFrame;
-  template<bool> friend class MarkingVisitorBase;
+  template <bool>
+  friend class MarkingVisitorBase;
   friend class SkippedCodeFunctions;
   friend class Function;
   friend class InstructionsReader;
@@ -1232,14 +1189,14 @@
 class RawPcDescriptors : public RawObject {
  public:
   enum Kind {
-    kDeopt           = 1,  // Deoptimization continuation point.
-    kIcCall          = kDeopt << 1,  // IC call.
-    kUnoptStaticCall = kIcCall << 1,  // Call to a known target via stub.
-    kRuntimeCall     = kUnoptStaticCall << 1,  // Runtime call.
-    kOsrEntry        = kRuntimeCall << 1,  // OSR entry point in unopt. code.
-    kOther           = kOsrEntry << 1,
-    kLastKind        = kOther,
-    kAnyKind         = -1
+    kDeopt = 1,                            // Deoptimization continuation point.
+    kIcCall = kDeopt << 1,                 // IC call.
+    kUnoptStaticCall = kIcCall << 1,       // Call to a known target via stub.
+    kRuntimeCall = kUnoptStaticCall << 1,  // Runtime call.
+    kOsrEntry = kRuntimeCall << 1,         // OSR entry point in unopt. code.
+    kOther = kOsrEntry << 1,
+    kLastKind = kOther,
+    kAnyKind = -1
   };
 
   class MergedKindTry {
@@ -1315,7 +1272,7 @@
   // to be as large as 96, meaning 7 bits, leaving 25 bits for the length, or
   // as large as ~33 million entries. If that is sufficient, then these two
   // fields can be merged into a BitField.
-  int32_t length_;  // Length of payload, in bits.
+  int32_t length_;               // Length of payload, in bits.
   int32_t slow_path_bit_count_;  // Slow path live values, included in length_.
 
   // Offset from code entry point corresponding to this stack map
@@ -1350,15 +1307,15 @@
   };
 
   class IndexBits : public BitField<int32_t, int32_t, kIndexPos, kIndexSize> {};
-  class KindBits : public BitField<int32_t, int8_t, kKindPos, kKindSize>{};
+  class KindBits : public BitField<int32_t, int8_t, kKindPos, kKindSize> {};
 
   struct VarInfo {
     int32_t index_kind;  // Bitfield for slot index on stack or in context,
                          // and Entry kind of type VarInfoKind.
-    TokenPosition declaration_pos;   // Token position of declaration.
-    TokenPosition begin_pos;   // Token position of scope start.
-    TokenPosition end_pos;     // Token position of scope end.
-    int16_t scope_id;    // Scope to which the variable belongs.
+    TokenPosition declaration_pos;  // Token position of declaration.
+    TokenPosition begin_pos;        // Token position of scope start.
+    TokenPosition end_pos;          // Token position of scope end.
+    int16_t scope_id;               // Scope to which the variable belongs.
 
     VarInfoKind kind() const {
       return static_cast<VarInfoKind>(KindBits::decode(index_kind));
@@ -1366,9 +1323,7 @@
     void set_kind(VarInfoKind kind) {
       index_kind = KindBits::update(kind, index_kind);
     }
-    int32_t index() const {
-      return IndexBits::decode(index_kind) - kIndexBias;
-    }
+    int32_t index() const { return IndexBits::decode(index_kind) - kIndexBias; }
     void set_index(int32_t index) {
       index_kind = IndexBits::update(index + kIndexBias, index_kind);
     }
@@ -1385,9 +1340,7 @@
     // Array of [num_entries_] variable names.
     OPEN_ARRAY_START(RawString*, RawString*);
   }
-  RawString** nameAddrAt(intptr_t i) {
-    return &(ptr()->names()[i]);
-  }
+  RawString** nameAddrAt(intptr_t i) { return &(ptr()->names()[i]); }
 
   RawObject** to(intptr_t num_entries) {
     return reinterpret_cast<RawObject**>(nameAddrAt(num_entries - 1));
@@ -1408,9 +1361,9 @@
   // the try_index of the handler.
   struct HandlerInfo {
     uint32_t handler_pc_offset;  // PC offset value of handler.
-    int16_t outer_try_index;   // Try block index of enclosing try block.
-    int8_t needs_stacktrace;   // True if a stacktrace is needed.
-    int8_t has_catch_all;      // Catches all exceptions.
+    int16_t outer_try_index;     // Try block index of enclosing try block.
+    int8_t needs_stacktrace;     // True if a stacktrace is needed.
+    int8_t has_catch_all;        // Catches all exceptions.
   };
 
  private:
@@ -1441,9 +1394,7 @@
 
   // Variable length data follows here.
   RawObject** data() { OPEN_ARRAY_START(RawObject*, RawObject*); }
-  RawObject* const* data() const {
-      OPEN_ARRAY_START(RawObject*, RawObject*);
-  }
+  RawObject* const* data() const { OPEN_ARRAY_START(RawObject*, RawObject*); }
   RawObject** to(intptr_t num_vars) {
     return reinterpret_cast<RawObject**>(&ptr()->data()[num_vars - 1]);
   }
@@ -1499,13 +1450,9 @@
 
 class RawSingleTargetCache : public RawObject {
   RAW_HEAP_OBJECT_IMPLEMENTATION(SingleTargetCache);
-  RawObject** from() {
-    return reinterpret_cast<RawObject**>(&ptr()->target_);
-  }
+  RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->target_); }
   RawCode* target_;
-  RawObject** to() {
-    return reinterpret_cast<RawObject**>(&ptr()->target_);
-  }
+  RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->target_); }
   uword entry_point_;
   classid_t lower_limit_;
   classid_t upper_limit_;
@@ -1528,16 +1475,12 @@
 class RawICData : public RawObject {
   RAW_HEAP_OBJECT_IMPLEMENTATION(ICData);
 
-  RawObject** from() {
-    return reinterpret_cast<RawObject**>(&ptr()->ic_data_);
-  }
-  RawArray* ic_data_;  // Contains class-ids, target and count.
-  RawString* target_name_;  // Name of target function.
+  RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->ic_data_); }
+  RawArray* ic_data_;          // Contains class-ids, target and count.
+  RawString* target_name_;     // Name of target function.
   RawArray* args_descriptor_;  // Arguments descriptor.
   RawObject* owner_;  // Parent/calling function or original IC of cloned IC.
-  RawObject** to() {
-    return reinterpret_cast<RawObject**>(&ptr()->owner_);
-  }
+  RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->owner_); }
   RawObject** to_snapshot(Snapshot::Kind kind) {
     switch (kind) {
       case Snapshot::kAppNoJIT:
@@ -1566,9 +1509,7 @@
 class RawMegamorphicCache : public RawObject {
   RAW_HEAP_OBJECT_IMPLEMENTATION(MegamorphicCache);
 
-  RawObject** from() {
-    return reinterpret_cast<RawObject**>(&ptr()->buckets_);
-  }
+  RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->buckets_); }
   RawArray* buckets_;
   RawSmi* mask_;
   RawString* target_name_;     // Name of target function.
@@ -1595,13 +1536,9 @@
 class RawApiError : public RawError {
   RAW_HEAP_OBJECT_IMPLEMENTATION(ApiError);
 
-  RawObject** from() {
-    return reinterpret_cast<RawObject**>(&ptr()->message_);
-  }
+  RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->message_); }
   RawString* message_;
-  RawObject** to() {
-    return reinterpret_cast<RawObject**>(&ptr()->message_);
-  }
+  RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->message_); }
 };
 
 
@@ -1620,7 +1557,7 @@
   }
   TokenPosition token_pos_;  // Source position in script_.
   bool report_after_token_;  // Report message at or after the token.
-  int8_t kind_;  // Of type Report::Kind.
+  int8_t kind_;              // Of type Report::Kind.
 };
 
 
@@ -1641,13 +1578,9 @@
 class RawUnwindError : public RawError {
   RAW_HEAP_OBJECT_IMPLEMENTATION(UnwindError);
 
-  RawObject** from() {
-    return reinterpret_cast<RawObject**>(&ptr()->message_);
-  }
+  RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->message_); }
   RawString* message_;
-  RawObject** to() {
-    return reinterpret_cast<RawObject**>(&ptr()->message_);
-  }
+  RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->message_); }
   bool is_user_initiated_;
   bool is_vm_restart_;
 };
@@ -1662,11 +1595,11 @@
   RAW_HEAP_OBJECT_IMPLEMENTATION(LibraryPrefix);
 
   RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->name_); }
-  RawString* name_;               // Library prefix name.
-  RawLibrary* importer_;          // Library which declares this prefix.
-  RawArray* imports_;             // Libraries imported with this prefix.
-  RawArray* dependent_code_;      // Code that refers to deferred, unloaded
-                                  // library prefix.
+  RawString* name_;           // Library prefix name.
+  RawLibrary* importer_;      // Library which declares this prefix.
+  RawArray* imports_;         // Libraries imported with this prefix.
+  RawArray* dependent_code_;  // Code that refers to deferred, unloaded
+                              // library prefix.
   RawObject** to() {
     return reinterpret_cast<RawObject**>(&ptr()->dependent_code_);
   }
@@ -1686,7 +1619,7 @@
     UNREACHABLE();
     return NULL;
   }
-  uint16_t num_imports_;          // Number of library entries in libraries_.
+  uint16_t num_imports_;  // Number of library entries in libraries_.
   bool is_deferred_load_;
   bool is_loaded_;
 };
@@ -1695,10 +1628,10 @@
 class RawAbstractType : public RawInstance {
  protected:
   enum TypeState {
-    kAllocated,  // Initial state.
-    kResolved,  // Type class and type arguments resolved.
-    kBeingFinalized,  // In the process of being finalized.
-    kFinalizedInstantiated,  // Instantiated type ready for use.
+    kAllocated,                // Initial state.
+    kResolved,                 // Type class and type arguments resolved.
+    kBeingFinalized,           // In the process of being finalized.
+    kFinalizedInstantiated,    // Instantiated type ready for use.
     kFinalizedUninstantiated,  // Uninstantiated type ready for use.
   };
 
@@ -1727,7 +1660,7 @@
   // function type, its signature is lost, but the message in the error object
   // can describe the issue without needing the signature.
   union {
-    RawFunction* signature_;  // If not null, this type is a function type.
+    RawFunction* signature_;   // If not null, this type is a function type.
     RawLanguageError* error_;  // If not null, type is malformed or malbounded.
   } sig_or_err_;
   RawObject** to() {
@@ -1744,13 +1677,9 @@
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(TypeRef);
 
-  RawObject** from() {
-    return reinterpret_cast<RawObject**>(&ptr()->type_);
-  }
+  RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->type_); }
   RawAbstractType* type_;  // The referenced type.
-  RawObject** to() {
-    return reinterpret_cast<RawObject**>(&ptr()->type_);
-  }
+  RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->type_); }
 };
 
 
@@ -1758,9 +1687,7 @@
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(TypeParameter);
 
-  RawObject** from() {
-    return reinterpret_cast<RawObject**>(&ptr()->name_);
-  }
+  RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->name_); }
   RawString* name_;
   RawSmi* hash_;
   RawAbstractType* bound_;  // ObjectType if no explicit bound specified.
@@ -1782,9 +1709,7 @@
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(BoundedType);
 
-  RawObject** from() {
-    return reinterpret_cast<RawObject**>(&ptr()->type_);
-  }
+  RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->type_); }
   RawAbstractType* type_;
   RawAbstractType* bound_;
   RawSmi* hash_;
@@ -1823,9 +1748,7 @@
   RawFunction* function_;
   RawContext* context_;
 
-  RawObject** to() {
-    return reinterpret_cast<RawObject**>(&ptr()->context_);
-  }
+  RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->context_); }
 };
 
 
@@ -1915,22 +1838,17 @@
 };
 
 
-template<typename T>
+template <typename T>
 class ExternalStringData {
  public:
-  ExternalStringData(const T* data, void* peer, Dart_PeerFinalizer callback) :
-      data_(data), peer_(peer), callback_(callback) {
-  }
+  ExternalStringData(const T* data, void* peer, Dart_PeerFinalizer callback)
+      : data_(data), peer_(peer), callback_(callback) {}
   ~ExternalStringData() {
     if (callback_ != NULL) (*callback_)(peer_);
   }
 
-  const T* data() {
-    return data_;
-  }
-  void* peer() {
-    return peer_;
-  }
+  const T* data() { return data_; }
+  void* peer() { return peer_; }
 
   static intptr_t data_offset() {
     return OFFSET_OF(ExternalStringData<T>, data_);
@@ -1945,6 +1863,7 @@
 
 class RawExternalOneByteString : public RawString {
   RAW_HEAP_OBJECT_IMPLEMENTATION(ExternalOneByteString);
+
  public:
   typedef ExternalStringData<uint8_t> ExternalData;
 
@@ -1956,6 +1875,7 @@
 
 class RawExternalTwoByteString : public RawString {
   RAW_HEAP_OBJECT_IMPLEMENTATION(ExternalTwoByteString);
+
  public:
   typedef ExternalStringData<uint16_t> ExternalData;
 
@@ -1997,7 +1917,7 @@
   friend class LinkedHashMap;
   friend class RawLinkedHashMap;
   friend class Object;
-  friend class ICData;  // For high performance access.
+  friend class ICData;            // For high performance access.
   friend class SubtypeTestCache;  // For high performance access.
 };
 
@@ -2018,9 +1938,7 @@
   RawTypeArguments* type_arguments_;
   RawSmi* length_;
   RawArray* data_;
-  RawObject** to() {
-    return reinterpret_cast<RawObject**>(&ptr()->data_);
-  }
+  RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->data_); }
 
   friend class SnapshotReader;
 };
@@ -2164,9 +2082,7 @@
   }
   RawSendPort* send_port_;
   RawInstance* handler_;
-  RawObject** to() {
-    return reinterpret_cast<RawObject**>(&ptr()->handler_);
-  }
+  RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->handler_); }
 };
 
 
@@ -2180,7 +2096,7 @@
   RawObject** from() {
     return reinterpret_cast<RawObject**>(&ptr()->code_array_);
   }
-  RawArray* code_array_;  // Code object for each frame in the stack trace.
+  RawArray* code_array_;       // Code object for each frame in the stack trace.
   RawArray* pc_offset_array_;  // Offset of PC for each frame.
   RawObject** to() {
     return reinterpret_cast<RawObject**>(&ptr()->pc_offset_array_);
@@ -2221,21 +2137,18 @@
 class RawWeakProperty : public RawInstance {
   RAW_HEAP_OBJECT_IMPLEMENTATION(WeakProperty);
 
-  RawObject** from() {
-    return reinterpret_cast<RawObject**>(&ptr()->key_);
-  }
+  RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->key_); }
   RawObject* key_;
   RawObject* value_;
-  RawObject** to() {
-    return reinterpret_cast<RawObject**>(&ptr()->value_);
-  }
+  RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->value_); }
 
   // Linked list is chaining all pending weak properties.
   // Untyped to make it clear that it is not to be visited by GC.
   uword next_;
 
   friend class GCMarker;
-  template<bool> friend class MarkingVisitorBase;
+  template <bool>
+  friend class MarkingVisitorBase;
   friend class Scavenger;
   friend class ScavengerVisitor;
 };
@@ -2249,9 +2162,7 @@
     return reinterpret_cast<RawObject**>(&ptr()->referent_);
   }
   RawObject* referent_;
-  RawObject** to() {
-    return reinterpret_cast<RawObject**>(&ptr()->referent_);
-  }
+  RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->referent_); }
 };
 
 
@@ -2259,15 +2170,11 @@
 class RawUserTag : public RawInstance {
   RAW_HEAP_OBJECT_IMPLEMENTATION(UserTag);
 
-  RawObject** from() {
-    return reinterpret_cast<RawObject**>(&ptr()->label_);
-  }
+  RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->label_); }
 
   RawString* label_;
 
-  RawObject** to() {
-    return reinterpret_cast<RawObject**>(&ptr()->label_);
-  }
+  RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->label_); }
 
   // Isolate unique tag.
   uword tag_;
@@ -2283,21 +2190,18 @@
 
 inline bool RawObject::IsErrorClassId(intptr_t index) {
   // Make sure this function is updated when new Error types are added.
-  COMPILE_ASSERT(kApiErrorCid == kErrorCid + 1 &&
-                 kLanguageErrorCid == kErrorCid + 2 &&
-                 kUnhandledExceptionCid == kErrorCid + 3 &&
-                 kUnwindErrorCid == kErrorCid + 4 &&
-                 kInstanceCid == kErrorCid + 5);
+  COMPILE_ASSERT(
+      kApiErrorCid == kErrorCid + 1 && kLanguageErrorCid == kErrorCid + 2 &&
+      kUnhandledExceptionCid == kErrorCid + 3 &&
+      kUnwindErrorCid == kErrorCid + 4 && kInstanceCid == kErrorCid + 5);
   return (index >= kErrorCid && index < kInstanceCid);
 }
 
 
 inline bool RawObject::IsNumberClassId(intptr_t index) {
   // Make sure this function is updated when new Number types are added.
-  COMPILE_ASSERT(kIntegerCid == kNumberCid + 1 &&
-                 kSmiCid == kNumberCid + 2 &&
-                 kMintCid == kNumberCid + 3 &&
-                 kBigintCid == kNumberCid + 4 &&
+  COMPILE_ASSERT(kIntegerCid == kNumberCid + 1 && kSmiCid == kNumberCid + 2 &&
+                 kMintCid == kNumberCid + 3 && kBigintCid == kNumberCid + 4 &&
                  kDoubleCid == kNumberCid + 5);
   return (index >= kNumberCid && index < kBoolCid);
 }
@@ -2305,8 +2209,7 @@
 
 inline bool RawObject::IsIntegerClassId(intptr_t index) {
   // Make sure this function is updated when new Integer types are added.
-  COMPILE_ASSERT(kSmiCid == kIntegerCid + 1 &&
-                 kMintCid == kIntegerCid + 2 &&
+  COMPILE_ASSERT(kSmiCid == kIntegerCid + 1 && kMintCid == kIntegerCid + 2 &&
                  kBigintCid == kIntegerCid + 3 &&
                  kDoubleCid == kIntegerCid + 4);
   return (index >= kIntegerCid && index < kDoubleCid);
@@ -2358,10 +2261,8 @@
   // Make sure this function is updated when new builtin List types are added.
   COMPILE_ASSERT(kImmutableArrayCid == kArrayCid + 1);
   return ((index >= kArrayCid && index <= kImmutableArrayCid) ||
-          (index == kGrowableObjectArrayCid) ||
-          IsTypedDataClassId(index) ||
-          IsTypedDataViewClassId(index) ||
-          IsExternalTypedDataClassId(index) ||
+          (index == kGrowableObjectArrayCid) || IsTypedDataClassId(index) ||
+          IsTypedDataViewClassId(index) || IsExternalTypedDataClassId(index) ||
           (index == kByteBufferCid));
 }
 
@@ -2405,28 +2306,23 @@
       kTypedDataFloat64x2ArrayViewCid == kTypedDataInt8ArrayViewCid + 13 &&
       kByteDataViewCid == kTypedDataInt8ArrayViewCid + 14 &&
       kExternalTypedDataInt8ArrayCid == kTypedDataInt8ArrayViewCid + 15);
-  return (index >= kTypedDataInt8ArrayViewCid &&
-          index <= kByteDataViewCid);
+  return (index >= kTypedDataInt8ArrayViewCid && index <= kByteDataViewCid);
 }
 
 
 inline bool RawObject::IsExternalTypedDataClassId(intptr_t index) {
   // Make sure this is updated when new ExternalTypedData types are added.
   COMPILE_ASSERT(
-      (kExternalTypedDataUint8ArrayCid ==
-       kExternalTypedDataInt8ArrayCid + 1) &&
+      (kExternalTypedDataUint8ArrayCid == kExternalTypedDataInt8ArrayCid + 1) &&
       (kExternalTypedDataUint8ClampedArrayCid ==
        kExternalTypedDataInt8ArrayCid + 2) &&
-      (kExternalTypedDataInt16ArrayCid ==
-       kExternalTypedDataInt8ArrayCid + 3) &&
+      (kExternalTypedDataInt16ArrayCid == kExternalTypedDataInt8ArrayCid + 3) &&
       (kExternalTypedDataUint16ArrayCid ==
        kExternalTypedDataInt8ArrayCid + 4) &&
-      (kExternalTypedDataInt32ArrayCid ==
-       kExternalTypedDataInt8ArrayCid + 5) &&
+      (kExternalTypedDataInt32ArrayCid == kExternalTypedDataInt8ArrayCid + 5) &&
       (kExternalTypedDataUint32ArrayCid ==
        kExternalTypedDataInt8ArrayCid + 6) &&
-      (kExternalTypedDataInt64ArrayCid ==
-       kExternalTypedDataInt8ArrayCid + 7) &&
+      (kExternalTypedDataInt64ArrayCid == kExternalTypedDataInt8ArrayCid + 7) &&
       (kExternalTypedDataUint64ArrayCid ==
        kExternalTypedDataInt8ArrayCid + 8) &&
       (kExternalTypedDataFloat32ArrayCid ==
@@ -2452,23 +2348,16 @@
 
 
 inline bool RawObject::IsVariableSizeClassId(intptr_t index) {
-  return (index == kArrayCid) ||
-         (index == kImmutableArrayCid) ||
+  return (index == kArrayCid) || (index == kImmutableArrayCid) ||
          RawObject::IsOneByteStringClassId(index) ||
          RawObject::IsTwoByteStringClassId(index) ||
-         RawObject::IsTypedDataClassId(index) ||
-         (index == kContextCid) ||
-         (index == kTypeArgumentsCid) ||
-         (index == kInstructionsCid) ||
-         (index == kObjectPoolCid) ||
-         (index == kPcDescriptorsCid) ||
-         (index == kCodeSourceMapCid) ||
-         (index == kStackmapCid) ||
+         RawObject::IsTypedDataClassId(index) || (index == kContextCid) ||
+         (index == kTypeArgumentsCid) || (index == kInstructionsCid) ||
+         (index == kObjectPoolCid) || (index == kPcDescriptorsCid) ||
+         (index == kCodeSourceMapCid) || (index == kStackmapCid) ||
          (index == kLocalVarDescriptorsCid) ||
-         (index == kExceptionHandlersCid) ||
-         (index == kCodeCid) ||
-         (index == kContextScopeCid) ||
-         (index == kInstanceCid) ||
+         (index == kExceptionHandlersCid) || (index == kCodeCid) ||
+         (index == kContextScopeCid) || (index == kInstanceCid) ||
          (index == kRegExpCid);
 }
 
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index 91a752e..aebda45 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -25,8 +25,7 @@
   for (intptr_t i = 0; i <= num_flds; i++) {                                   \
     (*reader->PassiveObjectHandle()) =                                         \
         reader->ReadObjectImpl(as_reference, object_id, (i + from_offset));    \
-    object.StorePointer(((from) + i),                                          \
-                        reader->PassiveObjectHandle()->raw());                 \
+    object.StorePointer(((from) + i), reader->PassiveObjectHandle()->raw());   \
   }
 
 RawClass* Class::ReadFrom(SnapshotReader* reader,
@@ -65,9 +64,7 @@
     cls.set_state_bits(reader->Read<uint16_t>());
 
     // Set all the object fields.
-    READ_OBJECT_FIELDS(cls,
-                       cls.raw()->from(),
-                       cls.raw()->to_snapshot(kind),
+    READ_OBJECT_FIELDS(cls, cls.raw()->from(), cls.raw()->to_snapshot(kind),
                        kAsReference);
     cls.StorePointer(&cls.raw_ptr()->dependent_code_, Array::null());
     ASSERT(!cls.IsInFullSnapshot());
@@ -143,8 +140,8 @@
   ASSERT(reader != NULL);
 
   // Allocate unresolved class object.
-  UnresolvedClass& unresolved_class = UnresolvedClass::ZoneHandle(
-      reader->zone(), UnresolvedClass::New());
+  UnresolvedClass& unresolved_class =
+      UnresolvedClass::ZoneHandle(reader->zone(), UnresolvedClass::New());
   reader->AddBackRef(object_id, &unresolved_class, kIsDeserialized);
 
   // Set all non object fields.
@@ -152,10 +149,8 @@
       TokenPosition::SnapshotDecode(reader->Read<int32_t>()));
 
   // Set all the object fields.
-  READ_OBJECT_FIELDS(unresolved_class,
-                     unresolved_class.raw()->from(),
-                     unresolved_class.raw()->to(),
-                     kAsReference);
+  READ_OBJECT_FIELDS(unresolved_class, unresolved_class.raw()->from(),
+                     unresolved_class.raw()->to(), kAsReference);
 
   return unresolved_class.raw();
 }
@@ -214,7 +209,8 @@
   // Allocate type object.
   Type& type = Type::ZoneHandle(reader->zone(), Type::New());
   bool is_canonical = RawObject::IsCanonical(tags);
-  bool defer_canonicalization = is_canonical &&
+  bool defer_canonicalization =
+      is_canonical &&
       ((kind == Snapshot::kMessage) ||
        (!Snapshot::IsFull(kind) && typeclass_is_in_fullsnapshot));
   reader->AddBackRef(object_id, &type, kIsDeserialized, defer_canonicalization);
@@ -298,13 +294,11 @@
   ASSERT(reader != NULL);
 
   // Allocate type ref object.
-  TypeRef& type_ref = TypeRef::ZoneHandle(
-      reader->zone(), TypeRef::New());
+  TypeRef& type_ref = TypeRef::ZoneHandle(reader->zone(), TypeRef::New());
   reader->AddBackRef(object_id, &type_ref, kIsDeserialized);
 
   // Set all the object fields.
-  READ_OBJECT_FIELDS(type_ref,
-                     type_ref.raw()->from(), type_ref.raw()->to(),
+  READ_OBJECT_FIELDS(type_ref, type_ref.raw()->from(), type_ref.raw()->to(),
                      kAsReference);
 
   return type_ref.raw();
@@ -338,8 +332,8 @@
   ASSERT(reader != NULL);
 
   // Allocate type parameter object.
-  TypeParameter& type_parameter = TypeParameter::ZoneHandle(
-      reader->zone(), TypeParameter::New());
+  TypeParameter& type_parameter =
+      TypeParameter::ZoneHandle(reader->zone(), TypeParameter::New());
   reader->AddBackRef(object_id, &type_parameter, kIsDeserialized);
 
   // Set all non object fields.
@@ -350,9 +344,8 @@
   type_parameter.set_type_state(reader->Read<int8_t>());
 
   // Set all the object fields.
-  READ_OBJECT_FIELDS(type_parameter,
-                     type_parameter.raw()->from(), type_parameter.raw()->to(),
-                     kAsReference);
+  READ_OBJECT_FIELDS(type_parameter, type_parameter.raw()->from(),
+                     type_parameter.raw()->to(), kAsReference);
 
   // Read in the parameterized class.
   (*reader->ClassHandle()) =
@@ -404,14 +397,13 @@
   ASSERT(reader != NULL);
 
   // Allocate bounded type object.
-  BoundedType& bounded_type = BoundedType::ZoneHandle(
-      reader->zone(), BoundedType::New());
+  BoundedType& bounded_type =
+      BoundedType::ZoneHandle(reader->zone(), BoundedType::New());
   reader->AddBackRef(object_id, &bounded_type, kIsDeserialized);
 
   // Set all the object fields.
-  READ_OBJECT_FIELDS(bounded_type,
-                     bounded_type.raw()->from(), bounded_type.raw()->to(),
-                     kAsReference);
+  READ_OBJECT_FIELDS(bounded_type, bounded_type.raw()->from(),
+                     bounded_type.raw()->to(), kAsReference);
 
   return bounded_type.raw();
 }
@@ -468,16 +460,15 @@
       reader->zone(), TypeArguments::New(len, HEAP_SPACE(kind)));
   bool is_canonical = RawObject::IsCanonical(tags);
   bool defer_canonicalization = is_canonical && (!Snapshot::IsFull(kind));
-  reader->AddBackRef(object_id,
-                     &type_arguments,
-                     kIsDeserialized,
+  reader->AddBackRef(object_id, &type_arguments, kIsDeserialized,
                      defer_canonicalization);
 
   // Set the instantiations field, which is only read from a full snapshot.
   type_arguments.set_instantiations(Object::zero_array());
 
   // Now set all the type fields.
-  intptr_t offset = type_arguments.TypeAddr(0) -
+  intptr_t offset =
+      type_arguments.TypeAddr(0) -
       reinterpret_cast<RawAbstractType**>(type_arguments.raw()->ptr());
   for (intptr_t i = 0; i < len; i++) {
     *reader->TypeHandle() ^=
@@ -527,8 +518,7 @@
   ASSERT(kind == Snapshot::kScript);
 
   // Allocate function object.
-  PatchClass& cls = PatchClass::ZoneHandle(reader->zone(),
-                                           PatchClass::New());
+  PatchClass& cls = PatchClass::ZoneHandle(reader->zone(), PatchClass::New());
   reader->AddBackRef(object_id, &cls, kIsDeserialized);
 
   // Set all the object fields.
@@ -577,8 +567,7 @@
   // Check if closure is serializable, throw an exception otherwise.
   RawFunction* func = writer->IsSerializableClosure(this);
   if (func != Function::null()) {
-    writer->WriteStaticImplicitClosure(object_id,
-                                       func,
+    writer->WriteStaticImplicitClosure(object_id, func,
                                        writer->GetObjectTags(this));
     return;
   }
@@ -596,13 +585,12 @@
   ASSERT(kind == Snapshot::kScript);
 
   // Allocate closure data object.
-  ClosureData& data = ClosureData::ZoneHandle(reader->zone(),
-                                              ClosureData::New());
+  ClosureData& data =
+      ClosureData::ZoneHandle(reader->zone(), ClosureData::New());
   reader->AddBackRef(object_id, &data, kIsDeserialized);
 
   // Set all the object fields.
-  READ_OBJECT_FIELDS(data,
-                     data.raw()->from(), data.raw()->to(),
+  READ_OBJECT_FIELDS(data, data.raw()->from(), data.raw()->to(),
                      kAsInlinedObject);
 
   return data.raw();
@@ -653,14 +641,12 @@
   ASSERT(kind == Snapshot::kScript);
 
   // Allocate redirection data object.
-  RedirectionData& data = RedirectionData::ZoneHandle(reader->zone(),
-                                                      RedirectionData::New());
+  RedirectionData& data =
+      RedirectionData::ZoneHandle(reader->zone(), RedirectionData::New());
   reader->AddBackRef(object_id, &data, kIsDeserialized);
 
   // Set all the object fields.
-  READ_OBJECT_FIELDS(data,
-                     data.raw()->from(), data.raw()->to(),
-                     kAsReference);
+  READ_OBJECT_FIELDS(data, data.raw()->from(), data.raw()->to(), kAsReference);
 
   return data.raw();
 }
@@ -697,8 +683,7 @@
   bool is_in_fullsnapshot = reader->Read<bool>();
   if (!is_in_fullsnapshot) {
     // Allocate function object.
-    Function& func = Function::ZoneHandle(reader->zone(),
-                                          Function::New());
+    Function& func = Function::ZoneHandle(reader->zone(), Function::New());
     reader->AddBackRef(object_id, &func, kIsDeserialized);
 
     // Set all the non object fields. Read the token positions now but
@@ -718,8 +703,7 @@
     func.set_was_compiled(false);
 
     // Set all the object fields.
-    READ_OBJECT_FIELDS(func,
-                       func.raw()->from(), func.raw()->to_snapshot(),
+    READ_OBJECT_FIELDS(func, func.raw()->from(), func.raw()->to_snapshot(),
                        kAsReference);
     // Initialize all fields that are not part of the snapshot.
     bool is_optimized = func.usage_counter() != 0;
@@ -750,10 +734,11 @@
     intptr_t tags = writer->GetObjectTags(ptr()->owner_);
     intptr_t cid = ClassIdTag::decode(tags);
     owner_is_class = (cid == kClassCid);
-    is_in_fullsnapshot = owner_is_class ?
-        Class::IsInFullSnapshot(reinterpret_cast<RawClass*>(ptr()->owner_)) :
-        PatchClass::IsInFullSnapshot(
-            reinterpret_cast<RawPatchClass*>(ptr()->owner_));
+    is_in_fullsnapshot =
+        owner_is_class ? Class::IsInFullSnapshot(
+                             reinterpret_cast<RawClass*>(ptr()->owner_))
+                       : PatchClass::IsInFullSnapshot(
+                             reinterpret_cast<RawPatchClass*>(ptr()->owner_));
   }
 
   // Write out the serialization header value for this object.
@@ -771,7 +756,7 @@
   if (!is_in_fullsnapshot) {
     bool is_optimized = Code::IsOptimized(ptr()->code_);
 
-    // Write out all the non object fields.
+// Write out all the non object fields.
 #if !defined(DART_PRECOMPILED_RUNTIME)
     writer->Write<int32_t>(ptr()->token_pos_.SnapshotEncode());
     writer->Write<int32_t>(ptr()->end_token_pos_.SnapshotEncode());
@@ -816,17 +801,14 @@
   reader->AddBackRef(object_id, &field, kIsDeserialized);
 
   // Set all non object fields.
-  field.set_token_pos(
-      TokenPosition::SnapshotDecode(reader->Read<int32_t>()));
+  field.set_token_pos(TokenPosition::SnapshotDecode(reader->Read<int32_t>()));
   field.set_guarded_cid(reader->Read<int32_t>());
   field.set_is_nullable(reader->Read<int32_t>());
   field.set_kind_bits(reader->Read<uint8_t>());
   field.set_kernel_field(NULL);
 
   // Set all the object fields.
-  READ_OBJECT_FIELDS(field,
-                     field.raw()->from(),
-                     field.raw()->to_snapshot(kind),
+  READ_OBJECT_FIELDS(field, field.raw()->from(), field.raw()->to_snapshot(kind),
                      kAsReference);
   field.StorePointer(&field.raw_ptr()->dependent_code_, Array::null());
 
@@ -897,8 +879,8 @@
   ASSERT(kind != Snapshot::kMessage);
 
   // Create the literal token object.
-  LiteralToken& literal_token = LiteralToken::ZoneHandle(reader->zone(),
-                                                         LiteralToken::New());
+  LiteralToken& literal_token =
+      LiteralToken::ZoneHandle(reader->zone(), LiteralToken::New());
   reader->AddBackRef(object_id, &literal_token, kIsDeserialized);
 
   // Read the token attributes.
@@ -906,9 +888,8 @@
   literal_token.set_kind(token_kind);
 
   // Set all the object fields.
-  READ_OBJECT_FIELDS(literal_token,
-                     literal_token.raw()->from(), literal_token.raw()->to(),
-                     kAsReference);
+  READ_OBJECT_FIELDS(literal_token, literal_token.raw()->from(),
+                     literal_token.raw()->to(), kAsReference);
 
   return literal_token.raw();
 }
@@ -949,8 +930,8 @@
   intptr_t len = reader->ReadSmiValue();
 
   // Create the token stream object.
-  TokenStream& token_stream = TokenStream::ZoneHandle(reader->zone(),
-                                                      TokenStream::New(len));
+  TokenStream& token_stream =
+      TokenStream::ZoneHandle(reader->zone(), TokenStream::New(len));
   reader->AddBackRef(object_id, &token_stream, kIsDeserialized);
 
   // Read the stream of tokens into the TokenStream object for script
@@ -1015,8 +996,7 @@
                          reader->Read<int32_t>());
   script.StoreNonPointer(&script.raw_ptr()->col_offset_,
                          reader->Read<int32_t>());
-  script.StoreNonPointer(&script.raw_ptr()->kind_,
-                         reader->Read<int8_t>());
+  script.StoreNonPointer(&script.raw_ptr()->kind_, reader->Read<int8_t>());
 
   *reader->StringHandle() ^= String::null();
   script.set_source(*reader->StringHandle());
@@ -1033,8 +1013,8 @@
                         reader->PassiveObjectHandle()->raw());
   }
 
-  script.set_load_timestamp(FLAG_remove_script_timestamps_for_test
-                            ? 0 : OS::GetCurrentTimeMillis());
+  script.set_load_timestamp(
+      FLAG_remove_script_timestamps_for_test ? 0 : OS::GetCurrentTimeMillis());
 
   return script.raw();
 }
@@ -1182,8 +1162,8 @@
   ASSERT(kind == Snapshot::kScript);
 
   // Allocate library prefix object.
-  LibraryPrefix& prefix = LibraryPrefix::ZoneHandle(reader->zone(),
-                                                    LibraryPrefix::New());
+  LibraryPrefix& prefix =
+      LibraryPrefix::ZoneHandle(reader->zone(), LibraryPrefix::New());
   reader->AddBackRef(object_id, &prefix, kIsDeserialized);
 
   // Set all non object fields.
@@ -1195,12 +1175,9 @@
                          !prefix.raw_ptr()->is_deferred_load_);
 
   // Set all the object fields.
-  READ_OBJECT_FIELDS(prefix,
-                     prefix.raw()->from(),
-                     prefix.raw()->to_snapshot(kind),
-                     kAsReference);
-  prefix.StorePointer(&prefix.raw_ptr()->dependent_code_,
-                      Array::null());
+  READ_OBJECT_FIELDS(prefix, prefix.raw()->from(),
+                     prefix.raw()->to_snapshot(kind), kAsReference);
+  prefix.StorePointer(&prefix.raw_ptr()->dependent_code_, Array::null());
 
   return prefix.raw();
 }
@@ -1581,10 +1558,8 @@
 #endif
 
   // Set all the object fields.
-  READ_OBJECT_FIELDS(result,
-                     result.raw()->from(),
-                     result.raw()->to_snapshot(kind),
-                     kAsReference);
+  READ_OBJECT_FIELDS(result, result.raw()->from(),
+                     result.raw()->to_snapshot(kind), kAsReference);
 
   return result.raw();
 }
@@ -1680,13 +1655,11 @@
   ASSERT(reader != NULL);
 
   // Allocate ApiError object.
-  ApiError& api_error =
-      ApiError::ZoneHandle(reader->zone(), ApiError::New());
+  ApiError& api_error = ApiError::ZoneHandle(reader->zone(), ApiError::New());
   reader->AddBackRef(object_id, &api_error, kIsDeserialized);
 
   // Set all the object fields.
-  READ_OBJECT_FIELDS(api_error,
-                     api_error.raw()->from(), api_error.raw()->to(),
+  READ_OBJECT_FIELDS(api_error, api_error.raw()->from(), api_error.raw()->to(),
                      kAsReference);
 
   return api_error.raw();
@@ -1731,9 +1704,8 @@
   language_error.set_kind(reader->Read<uint8_t>());
 
   // Set all the object fields.
-  READ_OBJECT_FIELDS(language_error,
-                     language_error.raw()->from(), language_error.raw()->to(),
-                     kAsReference);
+  READ_OBJECT_FIELDS(language_error, language_error.raw()->from(),
+                     language_error.raw()->to(), kAsReference);
 
   return language_error.raw();
 }
@@ -1768,13 +1740,12 @@
                                                     intptr_t tags,
                                                     Snapshot::Kind kind,
                                                     bool as_reference) {
-  UnhandledException& result = UnhandledException::ZoneHandle(
-      reader->zone(), UnhandledException::New());
+  UnhandledException& result =
+      UnhandledException::ZoneHandle(reader->zone(), UnhandledException::New());
   reader->AddBackRef(object_id, &result, kIsDeserialized);
 
   // Set all the object fields.
-  READ_OBJECT_FIELDS(result,
-                     result.raw()->from(), result.raw()->to(),
+  READ_OBJECT_FIELDS(result, result.raw()->from(), result.raw()->to(),
                      kAsReference);
 
   return result.raw();
@@ -1825,8 +1796,7 @@
   // Create an Instance object or get canonical one if it is a canonical
   // constant.
   Instance& obj = Instance::ZoneHandle(reader->zone(), Instance::null());
-  obj ^= Object::Allocate(kInstanceCid,
-                          Instance::InstanceSize(),
+  obj ^= Object::Allocate(kInstanceCid, Instance::InstanceSize(),
                           HEAP_SPACE(kind));
   if (RawObject::IsCanonical(tags)) {
     obj = obj.CheckAndCanonicalize(reader->thread(), NULL);
@@ -1865,8 +1835,8 @@
   // Check if the value could potentially fit in a Smi in our current
   // architecture, if so return the object as a Smi.
   if (Smi::IsValid(value)) {
-    Smi& smi = Smi::ZoneHandle(reader->zone(),
-                               Smi::New(static_cast<intptr_t>(value)));
+    Smi& smi =
+        Smi::ZoneHandle(reader->zone(), Smi::New(static_cast<intptr_t>(value)));
     reader->AddBackRef(object_id, &smi, kIsDeserialized);
     return smi.raw();
   }
@@ -2017,7 +1987,7 @@
 }
 
 
-template<typename StringType, typename CharacterType, typename CallbackType>
+template <typename StringType, typename CharacterType, typename CallbackType>
 void String::ReadFromImpl(SnapshotReader* reader,
                           String* str_obj,
                           intptr_t len,
@@ -2060,8 +2030,8 @@
   intptr_t len = reader->ReadSmiValue();
   String& str_obj = String::ZoneHandle(reader->zone(), String::null());
 
-  String::ReadFromImpl<OneByteString, uint8_t>(
-      reader, &str_obj, len, tags, Symbols::FromLatin1, kind);
+  String::ReadFromImpl<OneByteString, uint8_t>(reader, &str_obj, len, tags,
+                                               Symbols::FromLatin1, kind);
   reader->AddBackRef(object_id, &str_obj, kIsDeserialized);
   return raw(str_obj);
 }
@@ -2077,14 +2047,14 @@
   intptr_t len = reader->ReadSmiValue();
   String& str_obj = String::ZoneHandle(reader->zone(), String::null());
 
-  String::ReadFromImpl<TwoByteString, uint16_t>(
-      reader, &str_obj, len, tags, Symbols::FromUTF16, kind);
+  String::ReadFromImpl<TwoByteString, uint16_t>(reader, &str_obj, len, tags,
+                                                Symbols::FromUTF16, kind);
   reader->AddBackRef(object_id, &str_obj, kIsDeserialized);
   return raw(str_obj);
 }
 
 
-template<typename T>
+template <typename T>
 static void StringWriteTo(SnapshotWriter* writer,
                           intptr_t object_id,
                           Snapshot::Kind kind,
@@ -2122,13 +2092,8 @@
                                intptr_t object_id,
                                Snapshot::Kind kind,
                                bool as_reference) {
-  StringWriteTo(writer,
-                object_id,
-                kind,
-                kOneByteStringCid,
-                writer->GetObjectTags(this),
-                ptr()->length_,
-                ptr()->data());
+  StringWriteTo(writer, object_id, kind, kOneByteStringCid,
+                writer->GetObjectTags(this), ptr()->length_, ptr()->data());
 }
 
 
@@ -2136,13 +2101,8 @@
                                intptr_t object_id,
                                Snapshot::Kind kind,
                                bool as_reference) {
-  StringWriteTo(writer,
-                object_id,
-                kind,
-                kTwoByteStringCid,
-                writer->GetObjectTags(this),
-                ptr()->length_,
-                ptr()->data());
+  StringWriteTo(writer, object_id, kind, kTwoByteStringCid,
+                writer->GetObjectTags(this), ptr()->length_, ptr()->data());
 }
 
 
@@ -2173,12 +2133,8 @@
                                        Snapshot::Kind kind,
                                        bool as_reference) {
   // Serialize as a non-external one byte string.
-  StringWriteTo(writer,
-                object_id,
-                kind,
-                kOneByteStringCid,
-                writer->GetObjectTags(this),
-                ptr()->length_,
+  StringWriteTo(writer, object_id, kind, kOneByteStringCid,
+                writer->GetObjectTags(this), ptr()->length_,
                 ptr()->external_data_->data());
 }
 
@@ -2188,12 +2144,8 @@
                                        Snapshot::Kind kind,
                                        bool as_reference) {
   // Serialize as a non-external two byte string.
-  StringWriteTo(writer,
-                object_id,
-                kind,
-                kTwoByteStringCid,
-                writer->GetObjectTags(this),
-                ptr()->length_,
+  StringWriteTo(writer, object_id, kind, kTwoByteStringCid,
+                writer->GetObjectTags(this), ptr()->length_,
                 ptr()->external_data_->data());
 }
 
@@ -2234,8 +2186,8 @@
     state = kIsNotDeserialized;
   }
   if (array == NULL) {
-    array = &(Array::ZoneHandle(reader->zone(),
-                                Array::New(len, HEAP_SPACE(kind))));
+    array =
+        &(Array::ZoneHandle(reader->zone(), Array::New(len, HEAP_SPACE(kind))));
     reader->AddBackRef(object_id, array, state);
   }
   if (!as_reference) {
@@ -2265,9 +2217,8 @@
     state = kIsNotDeserialized;
   }
   if (array == NULL) {
-    array = &(Array::ZoneHandle(
-        reader->zone(),
-        ImmutableArray::New(len, HEAP_SPACE(kind))));
+    array = &(Array::ZoneHandle(reader->zone(),
+                                ImmutableArray::New(len, HEAP_SPACE(kind))));
     reader->AddBackRef(object_id, array, state);
   }
   if (!as_reference) {
@@ -2286,12 +2237,8 @@
                        Snapshot::Kind kind,
                        bool as_reference) {
   ASSERT(!this->IsCanonical());
-  writer->ArrayWriteTo(object_id,
-                       kArrayCid,
-                       writer->GetObjectTags(this),
-                       ptr()->length_,
-                       ptr()->type_arguments_,
-                       ptr()->data(),
+  writer->ArrayWriteTo(object_id, kArrayCid, writer->GetObjectTags(this),
+                       ptr()->length_, ptr()->type_arguments_, ptr()->data(),
                        as_reference);
 }
 
@@ -2300,13 +2247,9 @@
                                 intptr_t object_id,
                                 Snapshot::Kind kind,
                                 bool as_reference) {
-  writer->ArrayWriteTo(object_id,
-                       kImmutableArrayCid,
-                       writer->GetObjectTags(this),
-                       ptr()->length_,
-                       ptr()->type_arguments_,
-                       ptr()->data(),
-                       as_reference);
+  writer->ArrayWriteTo(object_id, kImmutableArrayCid,
+                       writer->GetObjectTags(this), ptr()->length_,
+                       ptr()->type_arguments_, ptr()->data(), as_reference);
 }
 
 
@@ -2373,8 +2316,8 @@
                                           bool as_reference) {
   ASSERT(reader != NULL);
 
-  LinkedHashMap& map = LinkedHashMap::ZoneHandle(
-      reader->zone(), LinkedHashMap::null());
+  LinkedHashMap& map =
+      LinkedHashMap::ZoneHandle(reader->zone(), LinkedHashMap::null());
   if (kind == Snapshot::kScript) {
     // The immutable maps that seed map literals are not yet VM-internal, so
     // we don't reach this.
@@ -2398,9 +2341,9 @@
   map.SetUsedData(used_data);
 
   // Allocate the data array.
-  intptr_t data_size = Utils::Maximum(
-      Utils::RoundUpToPowerOfTwo(used_data),
-      static_cast<uintptr_t>(LinkedHashMap::kInitialIndexSize));
+  intptr_t data_size =
+      Utils::Maximum(Utils::RoundUpToPowerOfTwo(used_data),
+                     static_cast<uintptr_t>(LinkedHashMap::kInitialIndexSize));
   Array& data = Array::ZoneHandle(reader->zone(),
                                   Array::New(data_size, HEAP_SPACE(kind)));
   map.SetData(data);
@@ -2487,8 +2430,7 @@
   float value3 = reader->Read<float>();
 
   // Create a Float32x4 object.
-  Float32x4& simd = Float32x4::ZoneHandle(reader->zone(),
-                                          Float32x4::null());
+  Float32x4& simd = Float32x4::ZoneHandle(reader->zone(), Float32x4::null());
   simd = Float32x4::New(value0, value1, value2, value3, HEAP_SPACE(kind));
   reader->AddBackRef(object_id, &simd, kIsDeserialized);
   return simd.raw();
@@ -2568,8 +2510,7 @@
   double value1 = reader->Read<double>();
 
   // Create a Float64x2 object.
-  Float64x2& simd = Float64x2::ZoneHandle(reader->zone(),
-                                          Float64x2::null());
+  Float64x2& simd = Float64x2::ZoneHandle(reader->zone(), Float64x2::null());
   simd = Float64x2::New(value0, value1, HEAP_SPACE(kind));
   reader->AddBackRef(object_id, &simd, kIsDeserialized);
   return simd.raw();
@@ -2598,7 +2539,7 @@
 #define TYPED_DATA_READ(setter, type)                                          \
   for (intptr_t i = 0; i < length_in_bytes; i += element_size) {               \
     result.Set##setter(i, reader->Read<type>());                               \
-  }                                                                            \
+  }
 
 
 RawTypedData* TypedData::ReadFrom(SnapshotReader* reader,
@@ -2677,8 +2618,8 @@
   intptr_t cid = RawObject::ClassIdTag::decode(tags);
   intptr_t length = reader->ReadSmiValue();
   uint8_t* data = reinterpret_cast<uint8_t*>(reader->ReadRawPointerValue());
-  ExternalTypedData& obj = ExternalTypedData::ZoneHandle(
-      ExternalTypedData::New(cid, data, length));
+  ExternalTypedData& obj =
+      ExternalTypedData::ZoneHandle(ExternalTypedData::New(cid, data, length));
   reader->AddBackRef(object_id, &obj, kIsDeserialized);
   void* peer = reinterpret_cast<void*>(reader->ReadRawPointerValue());
   Dart_WeakPersistentHandleFinalizer callback =
@@ -2696,7 +2637,7 @@
     for (intptr_t i = 0; i < len; i++) {                                       \
       writer->Write(data[i]);                                                  \
     }                                                                          \
-  }                                                                            \
+  }
 
 
 void RawTypedData::WriteTo(SnapshotWriter* writer,
@@ -2762,14 +2703,14 @@
     for (intptr_t i = 0; i < len; i++) {                                       \
       writer->Write(data[i]);                                                  \
     }                                                                          \
-  }                                                                            \
+  }
 
 
 #define EXT_TYPED_DATA_WRITE(cid, type)                                        \
   writer->WriteIndexedObject(cid);                                             \
   writer->WriteTags(writer->GetObjectTags(this));                              \
   writer->Write<RawObject*>(ptr()->length_);                                   \
-  TYPED_EXT_DATA_WRITE(type)                                                   \
+  TYPED_EXT_DATA_WRITE(type)
 
 
 void RawExternalTypedData::WriteTo(SnapshotWriter* writer,
@@ -2832,8 +2773,8 @@
                                     bool as_reference) {
   uint64_t id = reader->Read<uint64_t>();
 
-  Capability& result = Capability::ZoneHandle(reader->zone(),
-                                              Capability::New(id));
+  Capability& result =
+      Capability::ZoneHandle(reader->zone(), Capability::New(id));
   reader->AddBackRef(object_id, &result, kIsDeserialized);
   return result.raw();
 }
@@ -2890,8 +2831,7 @@
   uint64_t origin_id = reader->Read<uint64_t>();
 
   SendPort& result =
-      SendPort::ZoneHandle(reader->zone(),
-                           SendPort::New(id, origin_id));
+      SendPort::ZoneHandle(reader->zone(), SendPort::New(id, origin_id));
   reader->AddBackRef(object_id, &result, kIsDeserialized);
   return result.raw();
 }
@@ -2952,8 +2892,7 @@
   regex.set_pattern(*reader->StringHandle());
   regex.StoreNonPointer(&regex.raw_ptr()->num_registers_,
                         reader->Read<int32_t>());
-  regex.StoreNonPointer(&regex.raw_ptr()->type_flags_,
-                        reader->Read<int8_t>());
+  regex.StoreNonPointer(&regex.raw_ptr()->type_flags_, reader->Read<int8_t>());
 
   // TODO(18854): Need to implement a way of recreating the irrexp functions.
   const Function& no_function = Function::Handle(reader->zone());
@@ -2999,14 +2938,13 @@
   ASSERT(reader != NULL);
 
   // Allocate the weak property object.
-  WeakProperty& weak_property = WeakProperty::ZoneHandle(reader->zone(),
-                                                         WeakProperty::New());
+  WeakProperty& weak_property =
+      WeakProperty::ZoneHandle(reader->zone(), WeakProperty::New());
   reader->AddBackRef(object_id, &weak_property, kIsDeserialized);
 
   // Set all the object fields.
-  READ_OBJECT_FIELDS(weak_property,
-                     weak_property.raw()->from(), weak_property.raw()->to(),
-                     kAsReference);
+  READ_OBJECT_FIELDS(weak_property, weak_property.raw()->from(),
+                     weak_property.raw()->to(), kAsReference);
 
   return weak_property.raw();
 }
diff --git a/runtime/vm/redundancy_elimination.cc b/runtime/vm/redundancy_elimination.cc
index c13ec9d..e8ffd2c 100644
--- a/runtime/vm/redundancy_elimination.cc
+++ b/runtime/vm/redundancy_elimination.cc
@@ -16,8 +16,10 @@
 
 DEFINE_FLAG(bool, dead_store_elimination, true, "Eliminate dead stores");
 DEFINE_FLAG(bool, load_cse, true, "Use redundant load elimination.");
-DEFINE_FLAG(bool, trace_load_optimization, false,
-    "Print live sets for load optimization pass.");
+DEFINE_FLAG(bool,
+            trace_load_optimization,
+            false,
+            "Print live sets for load optimization pass.");
 
 // Quick access to the current zone.
 #define Z (zone())
@@ -31,12 +33,11 @@
   // forwarding pass via Alias structure.
   COMPILE_ASSERT(EffectSet::kLastEffect == 1);
 
-  CSEInstructionMap() : independent_(), dependent_() { }
+  CSEInstructionMap() : independent_(), dependent_() {}
   explicit CSEInstructionMap(const CSEInstructionMap& other)
       : ValueObject(),
         independent_(other.independent_),
-        dependent_(other.dependent_) {
-  }
+        dependent_(other.dependent_) {}
 
   void RemoveAffected(EffectSet effects) {
     if (!effects.IsNone()) {
@@ -48,12 +49,10 @@
     return GetMapFor(other)->LookupValue(other);
   }
 
-  void Insert(Instruction* instr) {
-    return GetMapFor(instr)->Insert(instr);
-  }
+  void Insert(Instruction* instr) { return GetMapFor(instr)->Insert(instr); }
 
  private:
-  typedef DirectChainedHashMap<PointerKeyValueTrait<Instruction> >  Map;
+  typedef DirectChainedHashMap<PointerKeyValueTrait<Instruction> > Map;
 
   Map* GetMapFor(Instruction* instr) {
     return instr->Dependencies().IsNone() ? &independent_ : &dependent_;
@@ -178,16 +177,12 @@
         flags_(other.flags_),
         instance_(other.instance_),
         raw_selector_(other.raw_selector_),
-        id_(other.id_) {
-  }
+        id_(other.id_) {}
 
   // Construct a place from instruction if instruction accesses any place.
   // Otherwise constructs kNone place.
   Place(Instruction* instr, bool* is_load, bool* is_store)
-      : flags_(0),
-        instance_(NULL),
-        raw_selector_(0),
-        id_(0) {
+      : flags_(0), instance_(NULL), raw_selector_(0), id_(0) {
     switch (instr->tag()) {
       case Instruction::kLoadField: {
         LoadFieldInstr* load_field = instr->AsLoadField();
@@ -205,8 +200,7 @@
       }
 
       case Instruction::kStoreInstanceField: {
-        StoreInstanceFieldInstr* store =
-            instr->AsStoreInstanceField();
+        StoreInstanceFieldInstr* store = instr->AsStoreInstanceField();
         set_representation(store->RequiredInputRepresentation(
             StoreInstanceFieldInstr::kValuePos));
         instance_ = store->instance()->definition()->OriginalDefinition();
@@ -230,8 +224,9 @@
 
       case Instruction::kStoreStaticField:
         set_kind(kField);
-        set_representation(instr->AsStoreStaticField()->
-            RequiredInputRepresentation(StoreStaticFieldInstr::kValuePos));
+        set_representation(
+            instr->AsStoreStaticField()->RequiredInputRepresentation(
+                StoreStaticFieldInstr::kValuePos));
         field_ = &instr->AsStoreStaticField()->field();
         *is_store = true;
         break;
@@ -241,20 +236,18 @@
         set_representation(load_indexed->representation());
         instance_ = load_indexed->array()->definition()->OriginalDefinition();
         SetIndex(load_indexed->index()->definition(),
-                 load_indexed->index_scale(),
-                 load_indexed->class_id());
+                 load_indexed->index_scale(), load_indexed->class_id());
         *is_load = true;
         break;
       }
 
       case Instruction::kStoreIndexed: {
         StoreIndexedInstr* store_indexed = instr->AsStoreIndexed();
-        set_representation(store_indexed->
-            RequiredInputRepresentation(StoreIndexedInstr::kValuePos));
+        set_representation(store_indexed->RequiredInputRepresentation(
+            StoreIndexedInstr::kValuePos));
         instance_ = store_indexed->array()->definition()->OriginalDefinition();
         SetIndex(store_indexed->index()->definition(),
-                 store_indexed->index_scale(),
-                 store_indexed->class_id());
+                 store_indexed->index_scale(), store_indexed->class_id());
         *is_store = true;
         break;
       }
@@ -265,12 +258,10 @@
   }
 
   // Create object representing *[*] alias.
-  static Place* CreateAnyInstanceAnyIndexAlias(Zone* zone,
-                                               intptr_t id) {
-    return Wrap(zone, Place(
-        EncodeFlags(kIndexed, kNoRepresentation, kNoSize),
-        NULL,
-        0), id);
+  static Place* CreateAnyInstanceAnyIndexAlias(Zone* zone, intptr_t id) {
+    return Wrap(
+        zone, Place(EncodeFlags(kIndexed, kNoRepresentation, kNoSize), NULL, 0),
+        id);
   }
 
   // Return least generic alias for this place. Given that aliases are
@@ -321,8 +312,7 @@
   // Given alias X[C] or *[C] return X[*] and *[*] respectively.
   Place CopyWithoutIndex() const {
     ASSERT(kind() == kConstantIndexed);
-    return Place(EncodeFlags(kIndexed, kNoRepresentation, kNoSize),
-                 instance_,
+    return Place(EncodeFlags(kIndexed, kNoRepresentation, kNoSize), instance_,
                  0);
   }
 
@@ -337,8 +327,7 @@
     ASSERT(kind() == kConstantIndexed);
     ASSERT(element_size() != kNoSize);
     ASSERT(element_size() < to);
-    return Place(ElementSizeBits::update(to, flags_),
-                 instance_,
+    return Place(ElementSizeBits::update(to, flags_), instance_,
                  RoundByteOffset(to, index_constant_));
   }
 
@@ -376,9 +365,7 @@
     return index_;
   }
 
-  ElementSize element_size() const {
-    return ElementSizeBits::decode(flags_);
-  }
+  ElementSize element_size() const { return ElementSizeBits::decode(flags_); }
 
   intptr_t index_constant() const {
     ASSERT(kind() == kConstantIndexed);
@@ -389,8 +376,8 @@
     if (def == NULL) {
       return "*";
     } else {
-      return Thread::Current()->zone()->PrintToString(
-            "v%" Pd, def->ssa_temp_index());
+      return Thread::Current()->zone()->PrintToString("v%" Pd,
+                                                      def->ssa_temp_index());
     }
   }
 
@@ -402,8 +389,7 @@
       case kField: {
         const char* field_name = String::Handle(field().name()).ToCString();
         if (field().is_static()) {
-          return Thread::Current()->zone()->PrintToString(
-              "<%s>", field_name);
+          return Thread::Current()->zone()->PrintToString("<%s>", field_name);
         } else {
           return Thread::Current()->zone()->PrintToString(
               "<%s.%s>", DefinitionName(instance()), field_name);
@@ -412,28 +398,20 @@
 
       case kVMField:
         return Thread::Current()->zone()->PrintToString(
-            "<%s.@%" Pd ">",
-            DefinitionName(instance()),
-            offset_in_bytes());
+            "<%s.@%" Pd ">", DefinitionName(instance()), offset_in_bytes());
 
       case kIndexed:
         return Thread::Current()->zone()->PrintToString(
-            "<%s[%s]>",
-            DefinitionName(instance()),
-            DefinitionName(index()));
+            "<%s[%s]>", DefinitionName(instance()), DefinitionName(index()));
 
       case kConstantIndexed:
         if (element_size() == kNoSize) {
           return Thread::Current()->zone()->PrintToString(
-              "<%s[%" Pd "]>",
-              DefinitionName(instance()),
-              index_constant());
+              "<%s[%" Pd "]>", DefinitionName(instance()), index_constant());
         } else {
           return Thread::Current()->zone()->PrintToString(
-              "<%s[%" Pd "|%" Pd "]>",
-              DefinitionName(instance()),
-              index_constant(),
-              ElementSizeMultiplier(element_size()));
+              "<%s[%" Pd "|%" Pd "]>", DefinitionName(instance()),
+              index_constant(), ElementSizeMultiplier(element_size()));
         }
     }
     UNREACHABLE();
@@ -444,20 +422,18 @@
   // Handle static finals as non-final with precompilation because
   // they may be reset to uninitialized after compilation.
   bool IsImmutableField() const {
-    return (kind() == kField)
-        && field().is_final()
-        && (!field().is_static() || !FLAG_fields_may_be_reset);
+    return (kind() == kField) && field().is_final() &&
+           (!field().is_static() || !FLAG_fields_may_be_reset);
   }
 
   intptr_t Hashcode() const {
     return (flags_ * 63 + reinterpret_cast<intptr_t>(instance_)) * 31 +
-        FieldHashcode();
+           FieldHashcode();
   }
 
   bool Equals(const Place* other) const {
-    return (flags_ == other->flags_) &&
-        (instance_ == other->instance_) &&
-        SameField(other);
+    return (flags_ == other->flags_) && (instance_ == other->instance_) &&
+           SameField(other);
   }
 
   // Create a zone allocated copy of this place and assign given id to it.
@@ -465,25 +441,20 @@
 
   static bool IsAllocation(Definition* defn) {
     return (defn != NULL) &&
-        (defn->IsAllocateObject() ||
-         defn->IsCreateArray() ||
-         defn->IsAllocateUninitializedContext() ||
-         (defn->IsStaticCall() &&
-          defn->AsStaticCall()->IsRecognizedFactory()));
+           (defn->IsAllocateObject() || defn->IsCreateArray() ||
+            defn->IsAllocateUninitializedContext() ||
+            (defn->IsStaticCall() &&
+             defn->AsStaticCall()->IsRecognizedFactory()));
   }
 
  private:
   Place(uword flags, Definition* instance, intptr_t selector)
-      : flags_(flags),
-        instance_(instance),
-        raw_selector_(selector),
-        id_(0) {
-  }
+      : flags_(flags), instance_(instance), raw_selector_(selector), id_(0) {}
 
   bool SameField(const Place* other) const {
-    return (kind() == kField) ?
-        (field().Original() == other->field().Original()) :
-        (offset_in_bytes_ == other->offset_in_bytes_);
+    return (kind() == kField)
+               ? (field().Original() == other->field().Original())
+               : (offset_in_bytes_ == other->offset_in_bytes_);
   }
 
   intptr_t FieldHashcode() const {
@@ -495,9 +466,7 @@
     flags_ = RepresentationBits::update(rep, flags_);
   }
 
-  void set_kind(Kind kind) {
-    flags_ = KindBits::update(kind, flags_);
-  }
+  void set_kind(Kind kind) { flags_ = KindBits::update(kind, flags_); }
 
   void set_element_size(ElementSize scale) {
     flags_ = ElementSizeBits::update(scale, flags_);
@@ -539,9 +508,8 @@
 
   static uword EncodeFlags(Kind kind, Representation rep, ElementSize scale) {
     ASSERT((kind == kConstantIndexed) || (scale == kNoSize));
-    return KindBits::encode(kind) |
-        RepresentationBits::encode(rep) |
-        ElementSizeBits::encode(scale);
+    return KindBits::encode(kind) | RepresentationBits::encode(rep) |
+           ElementSizeBits::encode(scale);
   }
 
   static ElementSize ElementSizeFor(intptr_t class_id) {
@@ -597,10 +565,10 @@
   }
 
   class KindBits : public BitField<uword, Kind, 0, 3> {};
-  class RepresentationBits :
-      public BitField<uword, Representation, KindBits::kNextBit, 11> {};
-  class ElementSizeBits :
-      public BitField<uword, ElementSize, RepresentationBits::kNextBit, 3> {};
+  class RepresentationBits
+      : public BitField<uword, Representation, KindBits::kNextBit, 11> {};
+  class ElementSizeBits
+      : public BitField<uword, ElementSize, RepresentationBits::kNextBit, 3> {};
 
   uword flags_;
   Definition* instance_;
@@ -618,7 +586,7 @@
 
 class ZonePlace : public ZoneAllocated {
  public:
-  explicit ZonePlace(const Place& place) : place_(place) { }
+  explicit ZonePlace(const Place& place) : place_(place) {}
 
   Place* place() { return &place_; }
 
@@ -628,7 +596,7 @@
 
 
 Place* Place::Wrap(Zone* zone, const Place& place, intptr_t id) {
-  Place* wrapped = (new(zone) ZonePlace(place))->place();
+  Place* wrapped = (new (zone) ZonePlace(place))->place();
   wrapped->id_ = id;
   return wrapped;
 }
@@ -641,14 +609,16 @@
   // Record a move from the place with id |from| to the place with id |to| at
   // the given block.
   void CreateOutgoingMove(Zone* zone,
-                          BlockEntryInstr* block, intptr_t from, intptr_t to) {
+                          BlockEntryInstr* block,
+                          intptr_t from,
+                          intptr_t to) {
     const intptr_t block_num = block->preorder_number();
     while (moves_.length() <= block_num) {
       moves_.Add(NULL);
     }
 
     if (moves_[block_num] == NULL) {
-      moves_[block_num] = new(zone) ZoneGrowableArray<Move>(5);
+      moves_[block_num] = new (zone) ZoneGrowableArray<Move>(5);
     }
 
     moves_[block_num]->Add(Move(from, to));
@@ -656,7 +626,7 @@
 
   class Move {
    public:
-    Move(intptr_t from, intptr_t to) : from_(from), to_(to) { }
+    Move(intptr_t from, intptr_t to) : from_(from), to_(to) {}
 
     intptr_t from() const { return from_; }
     intptr_t to() const { return to_; }
@@ -670,12 +640,11 @@
 
   MovesList GetOutgoingMoves(BlockEntryInstr* block) const {
     const intptr_t block_num = block->preorder_number();
-    return (block_num < moves_.length()) ?
-        moves_[block_num] : NULL;
+    return (block_num < moves_.length()) ? moves_[block_num] : NULL;
   }
 
  private:
-  GrowableArray<ZoneGrowableArray<Move>* > moves_;
+  GrowableArray<ZoneGrowableArray<Move>*> moves_;
 };
 
 
@@ -697,9 +666,9 @@
         typed_data_access_sizes_(),
         representatives_(),
         killed_(),
-        aliased_by_effects_(new(zone) BitVector(zone, places->length())) {
-    InsertAlias(Place::CreateAnyInstanceAnyIndexAlias(zone_,
-        kAnyInstanceAnyIndexAlias));
+        aliased_by_effects_(new (zone) BitVector(zone, places->length())) {
+    InsertAlias(Place::CreateAnyInstanceAnyIndexAlias(
+        zone_, kAnyInstanceAnyIndexAlias));
     for (intptr_t i = 0; i < places_.length(); i++) {
       AddRepresentative(places_[i]);
     }
@@ -720,9 +689,7 @@
 
   BitVector* aliased_by_effects() const { return aliased_by_effects_; }
 
-  const ZoneGrowableArray<Place*>& places() const {
-    return places_;
-  }
+  const ZoneGrowableArray<Place*>& places() const { return places_; }
 
   Place* LookupCanonical(Place* place) const {
     return places_map_->LookupValue(place);
@@ -730,9 +697,7 @@
 
   void PrintSet(BitVector* set) {
     bool comma = false;
-    for (BitVector::Iterator it(set);
-         !it.Done();
-         it.Advance()) {
+    for (BitVector::Iterator it(set); !it.Done(); it.Advance()) {
       if (comma) {
         THR_Print(", ");
       }
@@ -763,9 +728,7 @@
     return !alloc->Identity().IsNotAliased();
   }
 
-  enum {
-    kNoAlias = 0
-  };
+  enum { kNoAlias = 0 };
 
  private:
   enum {
@@ -795,13 +758,13 @@
       // killed sets computation.
       if (alias->kind() == Place::kConstantIndexed) {
         if (CanBeAliased(alias->instance())) {
-          EnsureSet(&representatives_, kAnyConstantIndexedAlias)->
-              Add(place->id());
+          EnsureSet(&representatives_, kAnyConstantIndexedAlias)
+              ->Add(place->id());
         }
 
         if (alias->instance() == NULL) {
-          EnsureSet(&representatives_, kUnknownInstanceConstantIndexedAlias)->
-              Add(place->id());
+          EnsureSet(&representatives_, kUnknownInstanceConstantIndexedAlias)
+              ->Add(place->id());
         }
 
         // Collect all element sizes used to access TypedData arrays in
@@ -812,8 +775,8 @@
         }
       } else if ((alias->kind() == Place::kIndexed) &&
                  CanBeAliased(place->instance())) {
-        EnsureSet(&representatives_, kAnyAllocationIndexedAlias)->
-            Add(place->id());
+        EnsureSet(&representatives_, kAnyAllocationIndexedAlias)
+            ->Add(place->id());
       }
 
       if (!IsIndependentFromEffects(place)) {
@@ -853,8 +816,7 @@
   const Place* CanonicalizeAlias(const Place& alias) {
     const Place* canonical = aliases_map_.LookupValue(&alias);
     if (canonical == NULL) {
-      canonical = Place::Wrap(zone_,
-                              alias,
+      canonical = Place::Wrap(zone_, alias,
                               kAnyInstanceAnyIndexAlias + aliases_.length());
       InsertAlias(canonical);
     }
@@ -866,15 +828,14 @@
     return (alias < representatives_.length()) ? representatives_[alias] : NULL;
   }
 
-  BitVector* EnsureSet(GrowableArray<BitVector*>* sets,
-                       intptr_t alias) {
+  BitVector* EnsureSet(GrowableArray<BitVector*>* sets, intptr_t alias) {
     while (sets->length() <= alias) {
       sets->Add(NULL);
     }
 
     BitVector* set = (*sets)[alias];
     if (set == NULL) {
-      (*sets)[alias] = set = new(zone_) BitVector(zone_, max_place_id());
+      (*sets)[alias] = set = new (zone_) BitVector(zone_, max_place_id());
     }
     return set;
   }
@@ -941,8 +902,7 @@
           // (if there are any) would update kill set for this alias when they
           // are visited.
           for (intptr_t i = static_cast<intptr_t>(alias->element_size()) + 1;
-               i <= Place::kLargestElementSize;
-               i++) {
+               i <= Place::kLargestElementSize; i++) {
             // Skip element sizes that a guaranteed to have no representatives.
             if (!typed_data_access_sizes_.Contains(alias->element_size())) {
               continue;
@@ -1010,8 +970,8 @@
     }
 
     return ((place->kind() == Place::kField) ||
-         (place->kind() == Place::kVMField)) &&
-        !CanBeAliased(place->instance());
+            (place->kind() == Place::kVMField)) &&
+           !CanBeAliased(place->instance());
   }
 
   // Returns true if there are direct loads from the given place.
@@ -1019,12 +979,10 @@
     ASSERT((place->kind() == Place::kField) ||
            (place->kind() == Place::kVMField));
 
-    for (Value* use = defn->input_use_list();
-         use != NULL;
+    for (Value* use = defn->input_use_list(); use != NULL;
          use = use->next_use()) {
       Instruction* instr = use->instruction();
-      if ((instr->IsRedefinition() ||
-           instr->IsAssertAssignable()) &&
+      if ((instr->IsRedefinition() || instr->IsAssertAssignable()) &&
           HasLoadsFromPlace(instr->AsDefinition(), place)) {
         return true;
       }
@@ -1042,21 +1000,21 @@
   // Check if any use of the definition can create an alias.
   // Can add more objects into aliasing_worklist_.
   bool AnyUseCreatesAlias(Definition* defn) {
-    for (Value* use = defn->input_use_list();
-         use != NULL;
+    for (Value* use = defn->input_use_list(); use != NULL;
          use = use->next_use()) {
       Instruction* instr = use->instruction();
-      if (instr->IsPushArgument() ||
-          (instr->IsStoreIndexed()
-           && (use->use_index() == StoreIndexedInstr::kValuePos)) ||
-          instr->IsStoreStaticField() ||
-          instr->IsPhi()) {
+      if (instr->IsPushArgument() || instr->IsCheckedSmiOp() ||
+          instr->IsCheckedSmiComparison() ||
+          (instr->IsStoreIndexed() &&
+           (use->use_index() == StoreIndexedInstr::kValuePos)) ||
+          instr->IsStoreStaticField() || instr->IsPhi()) {
         return true;
       } else if ((instr->IsAssertAssignable() || instr->IsRedefinition()) &&
                  AnyUseCreatesAlias(instr->AsDefinition())) {
         return true;
-      } else if ((instr->IsStoreInstanceField()
-           && (use->use_index() != StoreInstanceFieldInstr::kInstancePos))) {
+      } else if ((instr->IsStoreInstanceField() &&
+                  (use->use_index() !=
+                   StoreInstanceFieldInstr::kInstancePos))) {
         ASSERT(use->use_index() == StoreInstanceFieldInstr::kValuePos);
         // If we store this value into an object that is not aliased itself
         // and we never load again then the store does not create an alias.
@@ -1088,8 +1046,7 @@
   // Mark any value stored into the given object as potentially aliased.
   void MarkStoredValuesEscaping(Definition* defn) {
     // Find all stores into this object.
-    for (Value* use = defn->input_use_list();
-         use != NULL;
+    for (Value* use = defn->input_use_list(); use != NULL;
          use = use->next_use()) {
       if (use->instruction()->IsRedefinition() ||
           use->instruction()->IsAssertAssignable()) {
@@ -1203,8 +1160,7 @@
 static bool IsPhiDependentPlace(Place* place) {
   return ((place->kind() == Place::kField) ||
           (place->kind() == Place::kVMField)) &&
-        (place->instance() != NULL) &&
-        place->instance()->IsPhi();
+         (place->instance() != NULL) && place->instance()->IsPhi();
 }
 
 
@@ -1217,7 +1173,7 @@
     ZoneGrowableArray<Place*>* places) {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
-  PhiPlaceMoves* phi_moves = new(zone) PhiPlaceMoves();
+  PhiPlaceMoves* phi_moves = new (zone) PhiPlaceMoves();
 
   for (intptr_t i = 0; i < places->length(); i++) {
     Place* place = (*places)[i];
@@ -1240,15 +1196,12 @@
           map->Insert(result);
           places->Add(result);
           if (FLAG_trace_optimization) {
-            THR_Print("  adding place %s as %" Pd "\n",
-                      result->ToCString(),
+            THR_Print("  adding place %s as %" Pd "\n", result->ToCString(),
                       result->id());
           }
         }
-        phi_moves->CreateOutgoingMove(zone,
-                                      block->PredecessorAt(j),
-                                      result->id(),
-                                      place->id());
+        phi_moves->CreateOutgoingMove(zone, block->PredecessorAt(j),
+                                      result->id(), place->id());
       }
     }
   }
@@ -1257,10 +1210,7 @@
 }
 
 
-enum CSEMode {
-  kOptimizeLoads,
-  kOptimizeStores
-};
+enum CSEMode { kOptimizeLoads, kOptimizeStores };
 
 
 static AliasedSet* NumberPlaces(
@@ -1270,18 +1220,15 @@
   // Loads representing different expression ids will be collected and
   // used to build per offset kill sets.
   Zone* zone = graph->zone();
-  ZoneGrowableArray<Place*>* places =
-      new(zone) ZoneGrowableArray<Place*>(10);
+  ZoneGrowableArray<Place*>* places = new (zone) ZoneGrowableArray<Place*>(10);
 
   bool has_loads = false;
   bool has_stores = false;
-  for (BlockIterator it = graph->reverse_postorder_iterator();
-       !it.Done();
+  for (BlockIterator it = graph->reverse_postorder_iterator(); !it.Done();
        it.Advance()) {
     BlockEntryInstr* block = it.Current();
 
-    for (ForwardInstructionIterator instr_it(block);
-         !instr_it.Done();
+    for (ForwardInstructionIterator instr_it(block); !instr_it.Done();
          instr_it.Advance()) {
       Instruction* instr = instr_it.Current();
       Place place(instr, &has_loads, &has_stores);
@@ -1296,8 +1243,7 @@
         places->Add(result);
 
         if (FLAG_trace_optimization) {
-          THR_Print("numbering %s as %" Pd "\n",
-                    result->ToCString(),
+          THR_Print("numbering %s as %" Pd "\n", result->ToCString(),
                     result->id());
         }
       }
@@ -1316,26 +1262,23 @@
   PhiPlaceMoves* phi_moves = ComputePhiMoves(map, places);
 
   // Build aliasing sets mapping aliases to loads.
-  return new(zone) AliasedSet(zone, map, places, phi_moves);
+  return new (zone) AliasedSet(zone, map, places, phi_moves);
 }
 
 
 // Load instructions handled by load elimination.
 static bool IsLoadEliminationCandidate(Instruction* instr) {
-  return instr->IsLoadField()
-      || instr->IsLoadIndexed()
-      || instr->IsLoadStaticField();
+  return instr->IsLoadField() || instr->IsLoadIndexed() ||
+         instr->IsLoadStaticField();
 }
 
 
 static bool IsLoopInvariantLoad(ZoneGrowableArray<BitVector*>* sets,
                                 intptr_t loop_header_index,
                                 Instruction* instr) {
-  return IsLoadEliminationCandidate(instr) &&
-      (sets != NULL) &&
-      instr->HasPlaceId() &&
-      ((*sets)[loop_header_index] != NULL) &&
-      (*sets)[loop_header_index]->Contains(instr->place_id());
+  return IsLoadEliminationCandidate(instr) && (sets != NULL) &&
+         instr->HasPlaceId() && ((*sets)[loop_header_index] != NULL) &&
+         (*sets)[loop_header_index]->Contains(instr->place_id());
 }
 
 
@@ -1360,10 +1303,8 @@
   }
   if (FLAG_trace_optimization) {
     THR_Print("Hoisting instruction %s:%" Pd " from B%" Pd " to B%" Pd "\n",
-              current->DebugName(),
-              current->GetDeoptId(),
-              current->GetBlock()->block_id(),
-              pre_header->block_id());
+              current->DebugName(), current->GetDeoptId(),
+              current->GetBlock()->block_id(), pre_header->block_id());
   }
   // Move the instruction out of the loop.
   current->RemoveEnvironment();
@@ -1410,8 +1351,7 @@
   }
 
   CheckSmiInstr* check = NULL;
-  for (Value* use = phi->input_use_list();
-       (use != NULL) && (check == NULL);
+  for (Value* use = phi->input_use_list(); (use != NULL) && (check == NULL);
        use = use->next_use()) {
     check = use->instruction()->AsCheckSmi();
   }
@@ -1475,13 +1415,10 @@
     BlockEntryInstr* pre_header = header->ImmediateDominator();
     if (pre_header == NULL) continue;
 
-    for (BitVector::Iterator loop_it(header->loop_info());
-         !loop_it.Done();
+    for (BitVector::Iterator loop_it(header->loop_info()); !loop_it.Done();
          loop_it.Advance()) {
       BlockEntryInstr* block = flow_graph()->preorder()[loop_it.Current()];
-      for (ForwardInstructionIterator it(block);
-           !it.Done();
-           it.Advance()) {
+      for (ForwardInstructionIterator it(block); !it.Done(); it.Advance()) {
         Instruction* current = it.Current();
         if ((current->AllowsCSE() &&
              block_effects->CanBeMovedTo(current, pre_header)) ||
@@ -1494,8 +1431,7 @@
               break;
             }
           }
-          if (inputs_loop_invariant &&
-              !current->IsAssertAssignable() &&
+          if (inputs_loop_invariant && !current->IsAssertAssignable() &&
               !current->IsAssertBoolean()) {
             // TODO(fschneider): Enable hoisting of Assert-instructions
             // if it safe to do.
@@ -1527,18 +1463,16 @@
     const intptr_t num_blocks = graph_->preorder().length();
     for (intptr_t i = 0; i < num_blocks; i++) {
       out_.Add(NULL);
-      gen_.Add(new(Z) BitVector(Z, aliased_set_->max_place_id()));
-      kill_.Add(new(Z) BitVector(Z, aliased_set_->max_place_id()));
-      in_.Add(new(Z) BitVector(Z, aliased_set_->max_place_id()));
+      gen_.Add(new (Z) BitVector(Z, aliased_set_->max_place_id()));
+      kill_.Add(new (Z) BitVector(Z, aliased_set_->max_place_id()));
+      in_.Add(new (Z) BitVector(Z, aliased_set_->max_place_id()));
 
       exposed_values_.Add(NULL);
       out_values_.Add(NULL);
     }
   }
 
-  ~LoadOptimizer() {
-    aliased_set_->RollbackAliasedIdentites();
-  }
+  ~LoadOptimizer() { aliased_set_->RollbackAliasedIdentites(); }
 
   Isolate* isolate() const { return graph_->isolate(); }
   Zone* zone() const { return graph_->zone(); }
@@ -1551,9 +1485,8 @@
 
     // For now, bail out for large functions to avoid OOM situations.
     // TODO(fschneider): Fix the memory consumption issue.
-    intptr_t function_length =
-        graph->function().end_token_pos().Pos() -
-        graph->function().token_pos().Pos();
+    intptr_t function_length = graph->function().end_token_pos().Pos() -
+                               graph->function().token_pos().Pos();
     if (function_length >= FLAG_huge_method_cutoff_in_tokens) {
       return false;
     }
@@ -1599,8 +1532,7 @@
   // instructions.
   void ComputeInitialSets() {
     for (BlockIterator block_it = graph_->reverse_postorder_iterator();
-         !block_it.Done();
-         block_it.Advance()) {
+         !block_it.Done(); block_it.Advance()) {
       BlockEntryInstr* block = block_it.Current();
       const intptr_t preorder_number = block->preorder_number();
 
@@ -1610,8 +1542,7 @@
       ZoneGrowableArray<Definition*>* exposed_values = NULL;
       ZoneGrowableArray<Definition*>* out_values = NULL;
 
-      for (ForwardInstructionIterator instr_it(block);
-           !instr_it.Done();
+      for (ForwardInstructionIterator instr_it(block); !instr_it.Done();
            instr_it.Advance()) {
         Instruction* instr = instr_it.Current();
 
@@ -1659,8 +1590,7 @@
           // to loads because other array stores (intXX/uintXX/float32)
           // may implicitly convert the value stored.
           StoreIndexedInstr* array_store = instr->AsStoreIndexed();
-          if ((array_store == NULL) ||
-              (array_store->class_id() == kArrayCid) ||
+          if ((array_store == NULL) || (array_store->class_id() == kArrayCid) ||
               (array_store->class_id() == kTypedDataFloat64ArrayCid) ||
               (array_store->class_id() == kTypedDataFloat32ArrayCid) ||
               (array_store->class_id() == kTypedDataFloat32x4ArrayCid)) {
@@ -1682,7 +1612,7 @@
           // load forwarding.
           const Place* canonical = aliased_set_->LookupCanonical(&place);
           if ((canonical != NULL) &&
-            (canonical->id() != instr->AsDefinition()->place_id())) {
+              (canonical->id() != instr->AsDefinition()->place_id())) {
             instr->AsDefinition()->set_place_id(canonical->id());
           }
         }
@@ -1712,8 +1642,7 @@
         // constructor invocation.
         AllocateObjectInstr* alloc = instr->AsAllocateObject();
         if ((alloc != NULL)) {
-          for (Value* use = alloc->input_use_list();
-               use != NULL;
+          for (Value* use = alloc->input_use_list(); use != NULL;
                use = use->next_use()) {
             // Look for all immediate loads from this object.
             if (use->use_index() != 0) {
@@ -1728,8 +1657,7 @@
               // Forward for all fields for non-escaping objects and only
               // non-final fields and type arguments for escaping ones.
               if (aliased_set_->CanBeAliased(alloc) &&
-                  (load->field() != NULL) &&
-                  load->field()->is_final()) {
+                  (load->field() != NULL) && load->field()->is_final()) {
                 continue;
               }
 
@@ -1763,8 +1691,7 @@
           graph_->EnsureSSATempIndex(defn, replacement);
           if (FLAG_trace_optimization) {
             THR_Print("Replacing load v%" Pd " with v%" Pd "\n",
-                      defn->ssa_temp_index(),
-                      replacement->ssa_temp_index());
+                      defn->ssa_temp_index(), replacement->ssa_temp_index());
           }
 
           defn->ReplaceUsesWith(replacement);
@@ -1777,7 +1704,7 @@
           // the block entry.
           if (exposed_values == NULL) {
             static const intptr_t kMaxExposedValuesInitialSize = 5;
-            exposed_values = new(Z) ZoneGrowableArray<Definition*>(
+            exposed_values = new (Z) ZoneGrowableArray<Definition*>(
                 Utils::Minimum(kMaxExposedValuesInitialSize,
                                aliased_set_->max_place_id()));
           }
@@ -1825,18 +1752,17 @@
   // Compute OUT sets by propagating them iteratively until fix point
   // is reached.
   void ComputeOutSets() {
-    BitVector* temp = new(Z) BitVector(Z, aliased_set_->max_place_id());
+    BitVector* temp = new (Z) BitVector(Z, aliased_set_->max_place_id());
     BitVector* forwarded_loads =
-        new(Z) BitVector(Z, aliased_set_->max_place_id());
-    BitVector* temp_out = new(Z) BitVector(Z, aliased_set_->max_place_id());
+        new (Z) BitVector(Z, aliased_set_->max_place_id());
+    BitVector* temp_out = new (Z) BitVector(Z, aliased_set_->max_place_id());
 
     bool changed = true;
     while (changed) {
       changed = false;
 
       for (BlockIterator block_it = graph_->reverse_postorder_iterator();
-           !block_it.Done();
-           block_it.Advance()) {
+           !block_it.Done(); block_it.Advance()) {
         BlockEntryInstr* block = block_it.Current();
 
         const intptr_t preorder_number = block->preorder_number();
@@ -1880,7 +1806,7 @@
           if ((block_out == NULL) || !block_out->Equals(*temp)) {
             if (block_out == NULL) {
               block_out = out_[preorder_number] =
-                  new(Z) BitVector(Z, aliased_set_->max_place_id());
+                  new (Z) BitVector(Z, aliased_set_->max_place_id());
             }
             block_out->CopyFrom(temp);
             changed = true;
@@ -1903,8 +1829,7 @@
     ZoneGrowableArray<Definition*>* temp_forwarded_values = NULL;
 
     for (BlockIterator block_it = graph_->reverse_postorder_iterator();
-         !block_it.Done();
-         block_it.Advance()) {
+         !block_it.Done(); block_it.Advance()) {
       BlockEntryInstr* block = block_it.Current();
 
       const bool can_merge_eagerly = CanMergeEagerly(block);
@@ -1917,8 +1842,7 @@
 
       // If OUT set has changed then we have new values available out of
       // the block. Compute these values creating phi where necessary.
-      for (BitVector::Iterator it(out_[preorder_number]);
-           !it.Done();
+      for (BitVector::Iterator it(out_[preorder_number]); !it.Done();
            it.Advance()) {
         const intptr_t place_id = it.Current();
 
@@ -1929,12 +1853,12 @@
 
         if ((*block_out_values)[place_id] == NULL) {
           ASSERT(block->PredecessorCount() > 0);
-          Definition* in_value = can_merge_eagerly ?
-              MergeIncomingValues(block, place_id) : NULL;
+          Definition* in_value =
+              can_merge_eagerly ? MergeIncomingValues(block, place_id) : NULL;
           if ((in_value == NULL) &&
               (in_[preorder_number]->Contains(place_id))) {
-            PhiInstr* phi = new(Z) PhiInstr(block->AsJoinEntry(),
-                                            block->PredecessorCount());
+            PhiInstr* phi = new (Z)
+                PhiInstr(block->AsJoinEntry(), block->PredecessorCount());
             phi->set_place_id(place_id);
             pending_phis.Add(phi);
             in_value = phi;
@@ -2007,7 +1931,7 @@
         graph_->LoopHeaders();
 
     ZoneGrowableArray<BitVector*>* invariant_loads =
-        new(Z) ZoneGrowableArray<BitVector*>(loop_headers.length());
+        new (Z) ZoneGrowableArray<BitVector*>(loop_headers.length());
 
     for (intptr_t i = 0; i < loop_headers.length(); i++) {
       BlockEntryInstr* header = loop_headers[i];
@@ -2017,16 +1941,14 @@
         continue;
       }
 
-      BitVector* loop_gen = new(Z) BitVector(Z, aliased_set_->max_place_id());
-      for (BitVector::Iterator loop_it(header->loop_info());
-           !loop_it.Done();
+      BitVector* loop_gen = new (Z) BitVector(Z, aliased_set_->max_place_id());
+      for (BitVector::Iterator loop_it(header->loop_info()); !loop_it.Done();
            loop_it.Advance()) {
         const intptr_t preorder_number = loop_it.Current();
         loop_gen->AddAll(gen_[preorder_number]);
       }
 
-      for (BitVector::Iterator loop_it(header->loop_info());
-           !loop_it.Done();
+      for (BitVector::Iterator loop_it(header->loop_info()); !loop_it.Done();
            loop_it.Advance()) {
         const intptr_t preorder_number = loop_it.Current();
         loop_gen->RemoveAll(kill_[preorder_number]);
@@ -2073,8 +1995,8 @@
     }
 
     // Incoming values are different. Phi is required to merge.
-    PhiInstr* phi = new(Z) PhiInstr(
-        block->AsJoinEntry(), block->PredecessorCount());
+    PhiInstr* phi =
+        new (Z) PhiInstr(block->AsJoinEntry(), block->PredecessorCount());
     phi->set_place_id(place_id);
     FillPhiInputs(phi);
     return phi;
@@ -2096,7 +2018,7 @@
       // To prevent using them we additionally mark definitions themselves
       // as replaced and store a pointer to the replacement.
       Definition* replacement = (*pred_out_values)[place_id]->Replacement();
-      Value* input = new(Z) Value(replacement);
+      Value* input = new (Z) Value(replacement);
       phi->SetInputAt(i, input);
       replacement->AddInputUse(input);
     }
@@ -2105,8 +2027,7 @@
     phis_.Add(phi);  // Postpone phi insertion until after load forwarding.
 
     if (FLAG_support_il_printer && FLAG_trace_load_optimization) {
-      THR_Print("created pending phi %s for %s at B%" Pd "\n",
-                phi->ToCString(),
+      THR_Print("created pending phi %s for %s at B%" Pd "\n", phi->ToCString(),
                 aliased_set_->places()[place_id]->ToCString(),
                 block->block_id());
     }
@@ -2116,8 +2037,7 @@
   // values.
   void ForwardLoads() {
     for (BlockIterator block_it = graph_->reverse_postorder_iterator();
-         !block_it.Done();
-         block_it.Advance()) {
+         !block_it.Done(); block_it.Advance()) {
       BlockEntryInstr* block = block_it.Current();
 
       ZoneGrowableArray<Definition*>* loads =
@@ -2145,8 +2065,7 @@
 
           if (FLAG_trace_optimization) {
             THR_Print("Replacing load v%" Pd " with v%" Pd "\n",
-                      load->ssa_temp_index(),
-                      replacement->ssa_temp_index());
+                      load->ssa_temp_index(), replacement->ssa_temp_index());
           }
 
           load->ReplaceUsesWith(replacement);
@@ -2169,7 +2088,7 @@
 
     worklist_.Clear();
     if (in_worklist_ == NULL) {
-      in_worklist_ = new(Z) BitVector(Z, graph_->current_ssa_temp_index());
+      in_worklist_ = new (Z) BitVector(Z, graph_->current_ssa_temp_index());
     } else {
       in_worklist_->Clear();
     }
@@ -2215,9 +2134,9 @@
   // are congruent.
   bool CanBeCongruent(Definition* a, Definition* b) {
     return (a->tag() == b->tag()) &&
-       ((a->IsPhi() && (a->GetBlock() == b->GetBlock())) ||
-        (a->AllowsCSE() && a->Dependencies().IsNone() &&
-         a->AttributesEqual(b)));
+           ((a->IsPhi() && (a->GetBlock() == b->GetBlock())) ||
+            (a->AllowsCSE() && a->Dependencies().IsNone() &&
+             a->AttributesEqual(b)));
   }
 
   // Given two definitions check if they are congruent under assumption that
@@ -2271,8 +2190,7 @@
     BlockEntryInstr* other_block = other->GetBlock();
 
     if (dom_block == other_block) {
-      for (Instruction* current = dom->next();
-           current != NULL;
+      for (Instruction* current = dom->next(); current != NULL;
            current = current->next()) {
         if (current == other) {
           return true;
@@ -2292,7 +2210,7 @@
 
     congruency_worklist_.Clear();
     if (in_worklist_ == NULL) {
-      in_worklist_ = new(Z) BitVector(Z, graph_->current_ssa_temp_index());
+      in_worklist_ = new (Z) BitVector(Z, graph_->current_ssa_temp_index());
     } else {
       in_worklist_->Clear();
     }
@@ -2333,8 +2251,7 @@
       }
 
       if (FLAG_support_il_printer && FLAG_trace_load_optimization) {
-        THR_Print("Replacing %s with congruent %s\n",
-                  a->ToCString(),
+        THR_Print("Replacing %s with congruent %s\n", a->ToCString(),
                   b->ToCString());
       }
 
@@ -2397,7 +2314,7 @@
 
   ZoneGrowableArray<Definition*>* CreateBlockOutValues() {
     ZoneGrowableArray<Definition*>* out =
-        new(Z) ZoneGrowableArray<Definition*>(aliased_set_->max_place_id());
+        new (Z) ZoneGrowableArray<Definition*>(aliased_set_->max_place_id());
     for (intptr_t i = 0; i < aliased_set_->max_place_id(); i++) {
       out->Add(NULL);
     }
@@ -2456,10 +2373,9 @@
 }
 
 
-bool DominatorBasedCSE::OptimizeRecursive(
-    FlowGraph* graph,
-    BlockEntryInstr* block,
-    CSEInstructionMap* map) {
+bool DominatorBasedCSE::OptimizeRecursive(FlowGraph* graph,
+                                          BlockEntryInstr* block,
+                                          CSEInstructionMap* map) {
   bool changed = false;
   for (ForwardInstructionIterator it(block); !it.Done(); it.Advance()) {
     Instruction* current = it.Current();
@@ -2488,7 +2404,7 @@
   intptr_t num_children = block->dominated_blocks().length();
   for (intptr_t i = 0; i < num_children; ++i) {
     BlockEntryInstr* child = block->dominated_blocks()[i];
-    if (i  < num_children - 1) {
+    if (i < num_children - 1) {
       // Copy map.
       CSEInstructionMap child_map(*map);
       changed = OptimizeRecursive(graph, child, &child_map) || changed;
@@ -2525,9 +2441,8 @@
 
     // For now, bail out for large functions to avoid OOM situations.
     // TODO(fschneider): Fix the memory consumption issue.
-    intptr_t function_length =
-        graph->function().end_token_pos().Pos() -
-        graph->function().token_pos().Pos();
+    intptr_t function_length = graph->function().end_token_pos().Pos() -
+                               graph->function().token_pos().Pos();
     if (function_length >= FLAG_huge_method_cutoff_in_tokens) {
       return;
     }
@@ -2570,12 +2485,11 @@
 
   virtual void ComputeInitialSets() {
     Zone* zone = graph_->zone();
-    BitVector* all_places = new(zone) BitVector(zone,
-        aliased_set_->max_place_id());
+    BitVector* all_places =
+        new (zone) BitVector(zone, aliased_set_->max_place_id());
     all_places->SetAll();
     for (BlockIterator block_it = graph_->postorder_iterator();
-         !block_it.Done();
-         block_it.Advance()) {
+         !block_it.Done(); block_it.Advance()) {
       BlockEntryInstr* block = block_it.Current();
       const intptr_t postorder_number = block->postorder_number();
 
@@ -2586,8 +2500,7 @@
       ZoneGrowableArray<Instruction*>* exposed_stores = NULL;
 
       // Iterate backwards starting at the last instruction.
-      for (BackwardInstructionIterator instr_it(block);
-           !instr_it.Done();
+      for (BackwardInstructionIterator instr_it(block); !instr_it.Done();
            instr_it.Advance()) {
         Instruction* instr = instr_it.Current();
 
@@ -2605,9 +2518,9 @@
             if (!live_in->Contains(instr->place_id()) &&
                 CanEliminateStore(instr)) {
               if (FLAG_trace_optimization) {
-                THR_Print(
-                    "Removing dead store to place %" Pd " in block B%" Pd "\n",
-                    instr->place_id(), block->block_id());
+                THR_Print("Removing dead store to place %" Pd " in block B%" Pd
+                          "\n",
+                          instr->place_id(), block->block_id());
               }
               instr_it.RemoveCurrentFromGraph();
             }
@@ -2616,7 +2529,7 @@
             // candidates for the global store elimination.
             if (exposed_stores == NULL) {
               const intptr_t kMaxExposedStoresInitialSize = 5;
-              exposed_stores = new(zone) ZoneGrowableArray<Instruction*>(
+              exposed_stores = new (zone) ZoneGrowableArray<Instruction*>(
                   Utils::Minimum(kMaxExposedStoresInitialSize,
                                  aliased_set_->max_place_id()));
             }
@@ -2629,11 +2542,8 @@
         }
 
         // Handle side effects, deoptimization and function return.
-        if (!instr->Effects().IsNone() ||
-            instr->CanDeoptimize() ||
-            instr->IsThrow() ||
-            instr->IsReThrow() ||
-            instr->IsReturn()) {
+        if (!instr->Effects().IsNone() || instr->CanDeoptimize() ||
+            instr->IsThrow() || instr->IsReThrow() || instr->IsReturn()) {
           // Instructions that return from the function, instructions with side
           // effects and instructions that can deoptimize are considered as
           // loads from all places.
@@ -2665,15 +2575,14 @@
   void EliminateDeadStores() {
     // Iteration order does not matter here.
     for (BlockIterator block_it = graph_->postorder_iterator();
-         !block_it.Done();
-         block_it.Advance()) {
+         !block_it.Done(); block_it.Advance()) {
       BlockEntryInstr* block = block_it.Current();
       const intptr_t postorder_number = block->postorder_number();
 
       BitVector* live_out = live_out_[postorder_number];
 
       ZoneGrowableArray<Instruction*>* exposed_stores =
-        exposed_stores_[postorder_number];
+          exposed_stores_[postorder_number];
       if (exposed_stores == NULL) continue;  // No exposed stores.
 
       // Iterate over candidate stores.
@@ -2754,8 +2663,8 @@
     if (use == store->value()) {
       Definition* instance = store->instance()->definition();
       return instance->IsAllocateObject() &&
-          ((check_type == kOptimisticCheck) ||
-           instance->Identity().IsAllocationSinkingCandidate());
+             ((check_type == kOptimisticCheck) ||
+              instance->Identity().IsAllocationSinkingCandidate());
     }
     return true;
   }
@@ -2770,14 +2679,12 @@
 // We do not support materialization of the object that has type arguments.
 static bool IsAllocationSinkingCandidate(Definition* alloc,
                                          SafeUseCheck check_type) {
-  for (Value* use = alloc->input_use_list();
-       use != NULL;
+  for (Value* use = alloc->input_use_list(); use != NULL;
        use = use->next_use()) {
     if (!IsSafeUse(use, check_type)) {
       if (FLAG_support_il_printer && FLAG_trace_optimization) {
         THR_Print("use of %s at %s is unsafe for allocation sinking\n",
-                  alloc->ToCString(),
-                  use->instruction()->ToCString());
+                  alloc->ToCString(), use->instruction()->ToCString());
       }
       return false;
     }
@@ -2811,18 +2718,15 @@
 
   // As an allocation sinking candidate it is only used in stores to its own
   // fields. Remove these stores.
-  for (Value* use = alloc->input_use_list();
-       use != NULL;
+  for (Value* use = alloc->input_use_list(); use != NULL;
        use = alloc->input_use_list()) {
     use->instruction()->RemoveFromGraph();
   }
 
-  // There should be no environment uses. The pass replaced them with
-  // MaterializeObject instructions.
+// There should be no environment uses. The pass replaced them with
+// MaterializeObject instructions.
 #ifdef DEBUG
-  for (Value* use = alloc->env_use_list();
-       use != NULL;
-       use = use->next_use()) {
+  for (Value* use = alloc->env_use_list(); use != NULL; use = use->next_use()) {
     ASSERT(use->instruction()->IsMaterializeObject());
   }
 #endif
@@ -2843,18 +2747,19 @@
 void AllocationSinking::CollectCandidates() {
   // Optimistically collect all potential candidates.
   for (BlockIterator block_it = flow_graph_->reverse_postorder_iterator();
-       !block_it.Done();
-       block_it.Advance()) {
+       !block_it.Done(); block_it.Advance()) {
     BlockEntryInstr* block = block_it.Current();
     for (ForwardInstructionIterator it(block); !it.Done(); it.Advance()) {
-      { AllocateObjectInstr* alloc = it.Current()->AsAllocateObject();
+      {
+        AllocateObjectInstr* alloc = it.Current()->AsAllocateObject();
         if ((alloc != NULL) &&
             IsAllocationSinkingCandidate(alloc, kOptimisticCheck)) {
           alloc->SetIdentity(AliasIdentity::AllocationSinkingCandidate());
           candidates_.Add(alloc);
         }
       }
-      { AllocateUninitializedContextInstr* alloc =
+      {
+        AllocateUninitializedContextInstr* alloc =
             it.Current()->AsAllocateUninitializedContext();
         if ((alloc != NULL) &&
             IsAllocationSinkingCandidate(alloc, kOptimisticCheck)) {
@@ -2908,9 +2813,7 @@
     Definition* alloc = candidates_[i];
 
     Value* next_use;
-    for (Value* use = alloc->input_use_list();
-         use != NULL;
-         use = next_use) {
+    for (Value* use = alloc->input_use_list(); use != NULL; use = next_use) {
       next_use = use->next_use();
       if (use->instruction()->IsMaterializeObject()) {
         use->BindTo(MaterializationFor(alloc, use->instruction()));
@@ -2986,8 +2889,7 @@
       }
 
 #ifdef DEBUG
-      for (Value* use = alloc->env_use_list();
-           use != NULL;
+      for (Value* use = alloc->env_use_list(); use != NULL;
            use = use->next_use()) {
         ASSERT(use->instruction()->IsMaterializeObject());
       }
@@ -2998,8 +2900,7 @@
       // use list: we will reconstruct it when we start removing
       // materializations.
       alloc->set_env_use_list(NULL);
-      for (Value* use = alloc->input_use_list();
-           use != NULL;
+      for (Value* use = alloc->input_use_list(); use != NULL;
            use = use->next_use()) {
         if (use->instruction()->IsLoadField()) {
           LoadFieldInstr* load = use->instruction()->AsLoadField();
@@ -3143,14 +3044,14 @@
 // Given the allocation and deoptimization exit try to find MaterializeObject
 // instruction corresponding to this allocation at this exit.
 MaterializeObjectInstr* AllocationSinking::MaterializationFor(
-    Definition* alloc, Instruction* exit) {
+    Definition* alloc,
+    Instruction* exit) {
   if (exit->IsMaterializeObject()) {
     exit = ExitForMaterialization(exit->AsMaterializeObject());
   }
 
   for (MaterializeObjectInstr* mat = exit->previous()->AsMaterializeObject();
-       mat != NULL;
-       mat = mat->previous()->AsMaterializeObject()) {
+       mat != NULL; mat = mat->previous()->AsMaterializeObject()) {
     if (mat->allocation() == alloc) {
       return mat;
     }
@@ -3167,7 +3068,7 @@
     Definition* alloc,
     const ZoneGrowableArray<const Object*>& slots) {
   ZoneGrowableArray<Value*>* values =
-      new(Z) ZoneGrowableArray<Value*>(slots.length());
+      new (Z) ZoneGrowableArray<Value*>(slots.length());
 
   // All loads should be inserted before the first materialization so that
   // IR follows the following pattern: loads, materializations, deoptimizing
@@ -3176,29 +3077,25 @@
 
   // Insert load instruction for every field.
   for (intptr_t i = 0; i < slots.length(); i++) {
-    LoadFieldInstr* load = slots[i]->IsField()
-        ? new(Z) LoadFieldInstr(
-            new(Z) Value(alloc),
-            &Field::Cast(*slots[i]),
-            AbstractType::ZoneHandle(Z),
-            alloc->token_pos())
-        : new(Z) LoadFieldInstr(
-            new(Z) Value(alloc),
-            Smi::Cast(*slots[i]).Value(),
-            AbstractType::ZoneHandle(Z),
-            alloc->token_pos());
-    flow_graph_->InsertBefore(
-        load_point, load, NULL, FlowGraph::kValue);
-    values->Add(new(Z) Value(load));
+    LoadFieldInstr* load =
+        slots[i]->IsField()
+            ? new (Z) LoadFieldInstr(
+                  new (Z) Value(alloc), &Field::Cast(*slots[i]),
+                  AbstractType::ZoneHandle(Z), alloc->token_pos())
+            : new (Z) LoadFieldInstr(
+                  new (Z) Value(alloc), Smi::Cast(*slots[i]).Value(),
+                  AbstractType::ZoneHandle(Z), alloc->token_pos());
+    flow_graph_->InsertBefore(load_point, load, NULL, FlowGraph::kValue);
+    values->Add(new (Z) Value(load));
   }
 
   MaterializeObjectInstr* mat = NULL;
   if (alloc->IsAllocateObject()) {
-    mat = new(Z) MaterializeObjectInstr(
-        alloc->AsAllocateObject(), slots, values);
+    mat = new (Z)
+        MaterializeObjectInstr(alloc->AsAllocateObject(), slots, values);
   } else {
     ASSERT(alloc->IsAllocateUninitializedContext());
-    mat = new(Z) MaterializeObjectInstr(
+    mat = new (Z) MaterializeObjectInstr(
         alloc->AsAllocateUninitializedContext(), slots, values);
   }
 
@@ -3208,8 +3105,7 @@
   // MaterializeObject instruction.
   // We must preserve the identity: all mentions are replaced by the same
   // materialization.
-  for (Environment::DeepIterator env_it(exit->env());
-       !env_it.Done();
+  for (Environment::DeepIterator env_it(exit->env()); !env_it.Done();
        env_it.Advance()) {
     Value* use = env_it.CurrentValue();
     if (use->definition() == alloc) {
@@ -3222,7 +3118,7 @@
   // Mark MaterializeObject as an environment use of this allocation.
   // This will allow us to discover it when we are looking for deoptimization
   // exits for another allocation that potentially flows into this one.
-  Value* val = new(Z) Value(alloc);
+  Value* val = new (Z) Value(alloc);
   val->set_instruction(mat);
   alloc->AddEnvUse(val);
 
@@ -3233,7 +3129,7 @@
 
 // Add given instruction to the list of the instructions if it is not yet
 // present there.
-template<typename T>
+template <typename T>
 void AddInstruction(GrowableArray<T*>* list, T* value) {
   ASSERT(!value->IsGraphEntry());
   for (intptr_t i = 0; i < list->length(); i++) {
@@ -3251,12 +3147,10 @@
 // dematerialized and that are referenced by deopt environments that
 // don't contain this allocation explicitly.
 void AllocationSinking::ExitsCollector::Collect(Definition* alloc) {
-  for (Value* use = alloc->env_use_list();
-       use != NULL;
-       use = use->next_use()) {
+  for (Value* use = alloc->env_use_list(); use != NULL; use = use->next_use()) {
     if (use->instruction()->IsMaterializeObject()) {
       AddInstruction(&exits_, ExitForMaterialization(
-          use->instruction()->AsMaterializeObject()));
+                                  use->instruction()->AsMaterializeObject()));
     } else {
       AddInstruction(&exits_, use->instruction());
     }
@@ -3266,8 +3160,7 @@
   // candidate and put it on worklist so that we conservatively collect all
   // exits for that candidate as well because they potentially might see
   // this object.
-  for (Value* use = alloc->input_use_list();
-       use != NULL;
+  for (Value* use = alloc->input_use_list(); use != NULL;
        use = use->next_use()) {
     Definition* obj = StoreInto(use);
     if ((obj != NULL) && (obj != alloc)) {
@@ -3297,10 +3190,9 @@
 void AllocationSinking::InsertMaterializations(Definition* alloc) {
   // Collect all fields that are written for this instance.
   ZoneGrowableArray<const Object*>* slots =
-      new(Z) ZoneGrowableArray<const Object*>(5);
+      new (Z) ZoneGrowableArray<const Object*>(5);
 
-  for (Value* use = alloc->input_use_list();
-       use != NULL;
+  for (Value* use = alloc->input_use_list(); use != NULL;
        use = use->next_use()) {
     StoreInstanceFieldInstr* store = use->instruction()->AsStoreInstanceField();
     if ((store != NULL) && (store->instance()->definition() == alloc)) {
@@ -3325,8 +3217,7 @@
 
   // Insert materializations at environment uses.
   for (intptr_t i = 0; i < exits_collector_.exits().length(); i++) {
-    CreateMaterializationAt(
-        exits_collector_.exits()[i], alloc, *slots);
+    CreateMaterializationAt(exits_collector_.exits()[i], alloc, *slots);
   }
 }
 
@@ -3339,8 +3230,7 @@
   const GrowableArray<CatchBlockEntryInstr*>& catch_entries =
       flow_graph->graph_entry()->catch_entries();
   intptr_t base = kFirstLocalSlotFromFp + flow_graph->num_non_copied_params();
-  for (intptr_t catch_idx = 0;
-       catch_idx < catch_entries.length();
+  for (intptr_t catch_idx = 0; catch_idx < catch_entries.length();
        ++catch_idx) {
     CatchBlockEntryInstr* catch_entry = catch_entries[catch_idx];
 
@@ -3364,20 +3254,17 @@
     }
 
     for (BlockIterator block_it = flow_graph->reverse_postorder_iterator();
-         !block_it.Done();
-         block_it.Advance()) {
+         !block_it.Done(); block_it.Advance()) {
       BlockEntryInstr* block = block_it.Current();
       if (block->try_index() == catch_entry->catch_try_index()) {
-        for (ForwardInstructionIterator instr_it(block);
-             !instr_it.Done();
+        for (ForwardInstructionIterator instr_it(block); !instr_it.Done();
              instr_it.Advance()) {
           Instruction* current = instr_it.Current();
           if (current->MayThrow()) {
             Environment* env = current->env()->Outermost();
             ASSERT(env != NULL);
             for (intptr_t env_idx = 0; env_idx < cdefs.length(); ++env_idx) {
-              if (cdefs[env_idx] != NULL &&
-                  !cdefs[env_idx]->IsConstant() &&
+              if (cdefs[env_idx] != NULL && !cdefs[env_idx]->IsConstant() &&
                   env->ValueAt(env_idx)->BindsToConstant()) {
                 // If the recorded definition is not a constant, record this
                 // definition as the current constant definition.
@@ -3398,7 +3285,7 @@
         Definition* old = (*idefs)[j];
         ConstantInstr* orig = cdefs[j]->AsConstant();
         ConstantInstr* copy =
-            new(flow_graph->zone()) ConstantInstr(orig->value());
+            new (flow_graph->zone()) ConstantInstr(orig->value());
         copy->set_ssa_temp_index(flow_graph->alloc_ssa_temp_index());
         old->ReplaceUsesWith(copy);
         (*idefs)[j] = copy;
@@ -3413,9 +3300,7 @@
   // Environment uses are real (non-phi) uses.
   if (def->env_use_list() != NULL) return true;
 
-  for (Value::Iterator it(def->input_use_list());
-       !it.Done();
-       it.Advance()) {
+  for (Value::Iterator it(def->input_use_list()); !it.Done(); it.Advance()) {
     if (!it.Current()->instruction()->IsPhi()) return true;
   }
   return false;
@@ -3424,8 +3309,7 @@
 
 void DeadCodeElimination::EliminateDeadPhis(FlowGraph* flow_graph) {
   GrowableArray<PhiInstr*> live_phis;
-  for (BlockIterator b = flow_graph->postorder_iterator();
-       !b.Done();
+  for (BlockIterator b = flow_graph->postorder_iterator(); !b.Done();
        b.Advance()) {
     JoinEntryInstr* join = b.Current()->AsJoinEntry();
     if (join != NULL) {
@@ -3455,8 +3339,7 @@
     }
   }
 
-  for (BlockIterator it(flow_graph->postorder_iterator());
-       !it.Done();
+  for (BlockIterator it(flow_graph->postorder_iterator()); !it.Done();
        it.Advance()) {
     JoinEntryInstr* join = it.Current()->AsJoinEntry();
     if (join != NULL) {
@@ -3480,7 +3363,7 @@
             (*join->phis_)[i] = NULL;
             if (FLAG_trace_optimization) {
               THR_Print("Removing redundant phi v%" Pd "\n",
-                         phi->ssa_temp_index());
+                        phi->ssa_temp_index());
             }
           } else {
             (*join->phis_)[to_index++] = phi;
diff --git a/runtime/vm/redundancy_elimination.h b/runtime/vm/redundancy_elimination.h
index 8fc6dc4..47afe21 100644
--- a/runtime/vm/redundancy_elimination.h
+++ b/runtime/vm/redundancy_elimination.h
@@ -15,13 +15,9 @@
 class AllocationSinking : public ZoneAllocated {
  public:
   explicit AllocationSinking(FlowGraph* flow_graph)
-      : flow_graph_(flow_graph),
-        candidates_(5),
-        materializations_(5) { }
+      : flow_graph_(flow_graph), candidates_(5), materializations_(5) {}
 
-  const GrowableArray<Definition*>& candidates() const {
-    return candidates_;
-  }
+  const GrowableArray<Definition*>& candidates() const { return candidates_; }
 
   // Find the materialization insterted for the given allocation
   // at the given exit.
@@ -40,7 +36,7 @@
   // this object.
   class ExitsCollector : public ValueObject {
    public:
-    ExitsCollector() : exits_(10), worklist_(3) { }
+    ExitsCollector() : exits_(10), worklist_(3) {}
 
     const GrowableArray<Instruction*>& exits() const { return exits_; }
 
@@ -66,10 +62,9 @@
 
   void InsertMaterializations(Definition* alloc);
 
-  void CreateMaterializationAt(
-      Instruction* exit,
-      Definition* alloc,
-      const ZoneGrowableArray<const Object*>& fields);
+  void CreateMaterializationAt(Instruction* exit,
+                               Definition* alloc,
+                               const ZoneGrowableArray<const Object*>& fields);
 
   void EliminateAllocation(Definition* alloc);
 
@@ -94,10 +89,9 @@
   static bool Optimize(FlowGraph* graph);
 
  private:
-  static bool OptimizeRecursive(
-      FlowGraph* graph,
-      BlockEntryInstr* entry,
-      CSEInstructionMap* map);
+  static bool OptimizeRecursive(FlowGraph* graph,
+                                BlockEntryInstr* entry,
+                                CSEInstructionMap* map);
 };
 
 
diff --git a/runtime/vm/regexp.cc b/runtime/vm/regexp.cc
index 2b9df95..19b88c5 100644
--- a/runtime/vm/regexp.cc
+++ b/runtime/vm/regexp.cc
@@ -270,9 +270,9 @@
  private:
   class CharacterFrequency {
    public:
-    CharacterFrequency() : counter_(0), character_(-1) { }
+    CharacterFrequency() : counter_(0), character_(-1) {}
     explicit CharacterFrequency(intptr_t character)
-        : counter_(0), character_(character) { }
+        : counter_(0), character_(character) {}
 
     void Increment() { counter_++; }
     intptr_t counter() { return counter_; }
@@ -294,19 +294,14 @@
 
 class RegExpCompiler : public ValueObject {
  public:
-  RegExpCompiler(intptr_t capture_count,
-                 bool ignore_case,
-                 bool is_one_byte);
+  RegExpCompiler(intptr_t capture_count, bool ignore_case, bool is_one_byte);
 
-  intptr_t AllocateRegister() {
-    return next_register_++;
-  }
+  intptr_t AllocateRegister() { return next_register_++; }
 
-  RegExpEngine::CompilationResult Assemble(
-      IRRegExpMacroAssembler* assembler,
-      RegExpNode* start,
-      intptr_t capture_count,
-      const String& pattern);
+  RegExpEngine::CompilationResult Assemble(IRRegExpMacroAssembler* assembler,
+                                           RegExpNode* start,
+                                           intptr_t capture_count,
+                                           const String& pattern);
 
   RegExpEngine::CompilationResult Assemble(
       BytecodeRegExpMacroAssembler* assembler,
@@ -364,6 +359,7 @@
     compiler->IncrementRecursionDepth();
   }
   ~RecursionCheck() { compiler_->DecrementRecursionDepth(); }
+
  private:
   RegExpCompiler* compiler_;
 };
@@ -387,7 +383,7 @@
       reg_exp_too_big_(false),
       current_expansion_factor_(1),
       zone_(Thread::Current()->zone()) {
-  accept_ = new(Z) EndNode(EndNode::ACCEPT, Z);
+  accept_ = new (Z) EndNode(EndNode::ACCEPT, Z);
 }
 
 
@@ -415,11 +411,10 @@
   macro_assembler->GenerateBacktrackBlock();
   macro_assembler->FinalizeRegistersArray();
 
-  return RegExpEngine::CompilationResult(macro_assembler->backtrack_goto(),
-                                         macro_assembler->graph_entry(),
-                                         macro_assembler->num_blocks(),
-                                         macro_assembler->num_stack_locals(),
-                                         next_register_);
+  return RegExpEngine::CompilationResult(
+      macro_assembler->backtrack_goto(), macro_assembler->graph_entry(),
+      macro_assembler->num_blocks(), macro_assembler->num_stack_locals(),
+      next_register_);
 }
 
 
@@ -460,11 +455,9 @@
 
 
 bool Trace::mentions_reg(intptr_t reg) {
-  for (DeferredAction* action = actions_;
-       action != NULL;
+  for (DeferredAction* action = actions_; action != NULL;
        action = action->next()) {
-    if (action->Mentions(reg))
-      return true;
+    if (action->Mentions(reg)) return true;
   }
   return false;
 }
@@ -472,8 +465,7 @@
 
 bool Trace::GetStoredPosition(intptr_t reg, intptr_t* cp_offset) {
   ASSERT(*cp_offset == 0);
-  for (DeferredAction* action = actions_;
-       action != NULL;
+  for (DeferredAction* action = actions_; action != NULL;
        action = action->next()) {
     if (action->Mentions(reg)) {
       if (action->action_type() == ActionNode::STORE_POSITION) {
@@ -491,11 +483,9 @@
 // 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.
-intptr_t Trace::FindAffectedRegisters(OutSet* affected_registers,
-                                      Zone* zone) {
+intptr_t Trace::FindAffectedRegisters(OutSet* affected_registers, Zone* zone) {
   intptr_t max_register = RegExpCompiler::kNoRegister;
-  for (DeferredAction* action = actions_;
-       action != NULL;
+  for (DeferredAction* action = actions_; action != NULL;
        action = action->next()) {
     if (action->action_type() == ActionNode::CLEAR_CAPTURES) {
       Interval range = static_cast<DeferredClearCaptures*>(action)->range();
@@ -552,8 +542,7 @@
     intptr_t 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;
+    for (DeferredAction* action = actions_; action != NULL;
          action = action->next()) {
       if (action->Mentions(reg)) {
         switch (action->action_type()) {
@@ -677,12 +666,8 @@
   intptr_t max_register = FindAffectedRegisters(&affected_registers, zone);
   OutSet registers_to_pop;
   OutSet registers_to_clear;
-  PerformDeferredActions(assembler,
-                         max_register,
-                         affected_registers,
-                         &registers_to_pop,
-                         &registers_to_clear,
-                         zone);
+  PerformDeferredActions(assembler, max_register, affected_registers,
+                         &registers_to_pop, &registers_to_clear, zone);
   if (cp_offset_ != 0) {
     assembler->AdvanceCurrentPosition(cp_offset_);
   }
@@ -695,9 +680,7 @@
 
   // On backtrack we need to restore state.
   assembler->BindBlock(&undo);
-  RestoreAffectedRegisters(assembler,
-                           max_register,
-                           registers_to_pop,
+  RestoreAffectedRegisters(assembler, max_register, registers_to_pop,
                            registers_to_clear);
   if (backtrack() == NULL) {
     assembler->Backtrack();
@@ -760,8 +743,7 @@
 
 
 void GuardedAlternative::AddGuard(Guard* guard, Zone* zone) {
-  if (guards_ == NULL)
-    guards_ = new(zone) ZoneGrowableArray<Guard*>(1);
+  if (guards_ == NULL) guards_ = new (zone) ZoneGrowableArray<Guard*>(1);
   guards_->Add(guard);
 }
 
@@ -770,7 +752,7 @@
                                     intptr_t val,
                                     RegExpNode* on_success) {
   ActionNode* result =
-      new(on_success->zone()) ActionNode(SET_REGISTER, on_success);
+      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;
@@ -780,7 +762,7 @@
 ActionNode* ActionNode::IncrementRegister(intptr_t reg,
                                           RegExpNode* on_success) {
   ActionNode* result =
-      new(on_success->zone()) ActionNode(INCREMENT_REGISTER, on_success);
+      new (on_success->zone()) ActionNode(INCREMENT_REGISTER, on_success);
   result->data_.u_increment_register.reg = reg;
   return result;
 }
@@ -790,17 +772,16 @@
                                       bool is_capture,
                                       RegExpNode* on_success) {
   ActionNode* result =
-      new(on_success->zone()) ActionNode(STORE_POSITION, on_success);
+      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* ActionNode::ClearCaptures(Interval range, RegExpNode* on_success) {
   ActionNode* result =
-      new(on_success->zone()) ActionNode(CLEAR_CAPTURES, on_success);
+      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;
@@ -811,7 +792,7 @@
                                       intptr_t position_reg,
                                       RegExpNode* on_success) {
   ActionNode* result =
-      new(on_success->zone()) ActionNode(BEGIN_SUBMATCH, on_success);
+      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;
@@ -823,9 +804,8 @@
                                                 intptr_t clear_register_count,
                                                 intptr_t clear_register_from,
                                                 RegExpNode* on_success) {
-  ActionNode* result =
-      new(on_success->zone()) ActionNode(POSITIVE_SUBMATCH_SUCCESS,
-                                            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;
@@ -839,7 +819,7 @@
                                         intptr_t repetition_limit,
                                         RegExpNode* on_success) {
   ActionNode* result =
-      new(on_success->zone()) ActionNode(EMPTY_MATCH_CHECK, on_success);
+      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;
@@ -847,10 +827,8 @@
 }
 
 
-#define DEFINE_ACCEPT(Type)                                          \
-  void Type##Node::Accept(NodeVisitor* visitor) {                    \
-    visitor->Visit##Type(this);                                      \
-  }
+#define DEFINE_ACCEPT(Type)                                                    \
+  void Type##Node::Accept(NodeVisitor* visitor) { visitor->Visit##Type(this); }
 FOR_EACH_NODE_TYPE(DEFINE_ACCEPT)
 #undef DEFINE_ACCEPT
 
@@ -870,14 +848,12 @@
   switch (guard->op()) {
     case Guard::LT:
       ASSERT(!trace->mentions_reg(guard->reg()));
-      macro_assembler->IfRegisterGE(guard->reg(),
-                                    guard->value(),
+      macro_assembler->IfRegisterGE(guard->reg(), guard->value(),
                                     trace->backtrack());
       break;
     case Guard::GEQ:
       ASSERT(!trace->mentions_reg(guard->reg()));
-      macro_assembler->IfRegisterLT(guard->reg(),
-                                    guard->value(),
+      macro_assembler->IfRegisterLT(guard->reg(), guard->value(),
                                     trace->backtrack());
       break;
   }
@@ -919,10 +895,7 @@
   RegExpMacroAssembler* assembler = compiler->macro_assembler();
   bool bound_checked = false;
   if (!preloaded) {
-    assembler->LoadCurrentCharacter(
-        cp_offset,
-        on_failure,
-        check);
+    assembler->LoadCurrentCharacter(cp_offset, on_failure, check);
     bound_checked = true;
   }
   assembler->CheckNotCharacter(c, on_failure);
@@ -995,9 +968,7 @@
     // trick.  We avoid the theoretical case where negative numbers are
     // involved in order to simplify code generation.
     uint16_t mask = char_mask ^ diff;
-    macro_assembler->CheckNotCharacterAfterMinusAnd(c1 - diff,
-                                                    diff,
-                                                    mask,
+    macro_assembler->CheckNotCharacterAfterMinusAnd(c1 - diff, diff, mask,
                                                     on_failure);
     return true;
   }
@@ -1036,11 +1007,8 @@
   ASSERT(unibrow::Ecma262UnCanonicalize::kMaxWidth == 4);
   switch (length) {
     case 2: {
-      if (ShortCutEmitCharacterPair(macro_assembler,
-                                    one_byte,
-                                    chars[0],
-                                    chars[1],
-                                    on_failure)) {
+      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);
@@ -1050,7 +1018,7 @@
     }
     case 4:
       macro_assembler->CheckCharacter(chars[3], &ok);
-      // Fall through!
+    // Fall through!
     case 3:
       macro_assembler->CheckCharacter(chars[0], &ok);
       macro_assembler->CheckCharacter(chars[1], &ok);
@@ -1104,15 +1072,14 @@
 
 // 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,
-    ZoneGrowableArray<int>* ranges,
-    intptr_t start_index,
-    intptr_t end_index,
-    intptr_t min_char,
-    BlockLabel* fall_through,
-    BlockLabel* even_label,
-    BlockLabel* odd_label) {
+static void EmitUseLookupTable(RegExpMacroAssembler* masm,
+                               ZoneGrowableArray<int>* ranges,
+                               intptr_t start_index,
+                               intptr_t end_index,
+                               intptr_t min_char,
+                               BlockLabel* fall_through,
+                               BlockLabel* even_label,
+                               BlockLabel* odd_label) {
   static const intptr_t kSize = RegExpMacroAssembler::kTableSize;
   static const intptr_t kMask = RegExpMacroAssembler::kTableMask;
 
@@ -1154,8 +1121,7 @@
   }
   // TODO(erikcorry): Cache these.
   const TypedData& ba = TypedData::ZoneHandle(
-        masm->zone(),
-        TypedData::New(kTypedDataUint8ArrayCid, kSize, Heap::kOld));
+      masm->zone(), TypedData::New(kTypedDataUint8ArrayCid, kSize, Heap::kOld));
   for (intptr_t i = 0; i < kSize; i++) {
     ba.SetUint8(i, templ[i]);
   }
@@ -1174,11 +1140,8 @@
   bool odd = (((cut_index - start_index) & 1) == 1);
   BlockLabel* in_range_label = odd ? odd_label : even_label;
   BlockLabel dummy;
-  EmitDoubleBoundaryTest(masm,
-                         ranges->At(cut_index),
-                         ranges->At(cut_index + 1) - 1,
-                         &dummy,
-                         in_range_label,
+  EmitDoubleBoundaryTest(masm, ranges->At(cut_index),
+                         ranges->At(cut_index + 1) - 1, &dummy, in_range_label,
                          &dummy);
   ASSERT(!dummy.IsLinked());
   // Cut out the single range by rewriting the array.  This creates a new
@@ -1231,8 +1194,7 @@
   // punctuation).
   if (*border - 1 > Symbols::kMaxOneCharCodeSymbol &&  // Latin1 case.
       end_index - start_index > (*new_start_index - start_index) * 2 &&
-      last - first > kSize * 2 &&
-      binary_chop_index > *new_start_index &&
+      last - first > kSize * 2 && binary_chop_index > *new_start_index &&
       ranges->At(binary_chop_index) >= first + 2 * kSize) {
     intptr_t scan_forward_for_section_border = binary_chop_index;
     intptr_t new_border = (ranges->At(binary_chop_index) | kMask) + 1;
@@ -1290,8 +1252,8 @@
   // 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);
+    EmitDoubleBoundaryTest(masm, first, last, fall_through, even_label,
+                           odd_label);
     return;
   }
 
@@ -1309,18 +1271,11 @@
       }
     }
     if (cut == kNoCutIndex) cut = start_index;
-    CutOutRange(
-        masm, ranges, start_index, end_index, cut, even_label, odd_label);
+    CutOutRange(masm, ranges, start_index, end_index, cut, even_label,
+                odd_label);
     ASSERT(end_index - start_index >= 2);
-    GenerateBranches(masm,
-                     ranges,
-                     start_index + 1,
-                     end_index - 1,
-                     min_char,
-                     max_char,
-                     fall_through,
-                     even_label,
-                     odd_label);
+    GenerateBranches(masm, ranges, start_index + 1, end_index - 1, min_char,
+                     max_char, fall_through, even_label, odd_label);
     return;
   }
 
@@ -1329,28 +1284,15 @@
   static const intptr_t 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);
+    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);
+    GenerateBranches(masm, ranges, start_index + 1, end_index, first, max_char,
+                     fall_through, odd_label, even_label);
     return;
   }
 
@@ -1358,12 +1300,8 @@
   intptr_t new_end_index = 0;
   intptr_t border = 0;
 
-  SplitSearchSpace(ranges,
-                   start_index,
-                   end_index,
-                   &new_start_index,
-                   &new_end_index,
-                   &border);
+  SplitSearchSpace(ranges, start_index, end_index, &new_start_index,
+                   &new_end_index, &border);
 
   BlockLabel handle_rest;
   BlockLabel* above = &handle_rest;
@@ -1386,34 +1324,20 @@
   ASSERT(ranges->At(new_end_index) < border);
   ASSERT(border < ranges->At(new_start_index) ||
          (border == ranges->At(new_start_index) &&
-          new_start_index == end_index &&
-          new_end_index == end_index - 1 &&
+          new_start_index == end_index && new_end_index == end_index - 1 &&
           border == last + 1));
   ASSERT(new_start_index == 0 || border >= ranges->At(new_start_index - 1));
 
   masm->CheckCharacterGT(border - 1, above);
   BlockLabel dummy;
-  GenerateBranches(masm,
-                   ranges,
-                   start_index,
-                   new_end_index,
-                   min_char,
-                   border - 1,
-                   &dummy,
-                   even_label,
-                   odd_label);
+  GenerateBranches(masm, ranges, start_index, new_end_index, min_char,
+                   border - 1, &dummy, even_label, odd_label);
 
   if (handle_rest.IsLinked()) {
     masm->BindBlock(&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,
+    GenerateBranches(masm, ranges, new_start_index, end_index, border, max_char,
+                     &dummy, flip ? odd_label : even_label,
                      flip ? even_label : odd_label);
   }
 }
@@ -1460,8 +1384,7 @@
     return;
   }
 
-  if (last_valid_range == 0 &&
-      ranges->At(0).IsEverything(max_char)) {
+  if (last_valid_range == 0 && ranges->At(0).IsEverything(max_char)) {
     if (cc->is_negated()) {
       macro_assembler->GoTo(on_failure);
     } else {
@@ -1472,8 +1395,7 @@
     }
     return;
   }
-  if (last_valid_range == 0 &&
-      !cc->is_negated() &&
+  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) {
@@ -1487,9 +1409,9 @@
   }
 
   if (cc->is_standard() &&
-        macro_assembler->CheckSpecialCharacterClass(cc->standard_type(),
-                                                    on_failure)) {
-      return;
+      macro_assembler->CheckSpecialCharacterClass(cc->standard_type(),
+                                                  on_failure)) {
+    return;
   }
 
 
@@ -1500,7 +1422,7 @@
   // was already one there we fall through for success on that entry.
   // Subsequent entries have alternating meaning (success/failure).
   ZoneGrowableArray<int>* range_boundaries =
-      new(zone) ZoneGrowableArray<int>(last_valid_range);
+      new (zone) ZoneGrowableArray<int>(last_valid_range);
 
   bool zeroth_entry_is_failure = !cc->is_negated();
 
@@ -1520,21 +1442,18 @@
   }
 
   BlockLabel fall_through;
-  GenerateBranches(macro_assembler,
-                   range_boundaries,
+  GenerateBranches(macro_assembler, range_boundaries,
                    0,  // start_index.
                    end_index,
                    0,  // min_char.
-                   max_char,
-                   &fall_through,
+                   max_char, &fall_through,
                    zeroth_entry_is_failure ? &fall_through : on_failure,
                    zeroth_entry_is_failure ? on_failure : &fall_through);
   macro_assembler->BindBlock(&fall_through);
 }
 
 
-RegExpNode::~RegExpNode() {
-}
+RegExpNode::~RegExpNode() {}
 
 
 RegExpNode::LimitResult RegExpNode::LimitVersions(RegExpCompiler* compiler,
@@ -1567,8 +1486,7 @@
   // 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 (kRegexpOptimization &&
-      trace_count_ < kMaxCopiesCodeGenerated &&
+  if (kRegexpOptimization && trace_count_ < kMaxCopiesCodeGenerated &&
       compiler->recursion_depth() <= RegExpCompiler::kMaxRecursion) {
     return CONTINUE;
   }
@@ -1586,9 +1504,7 @@
                                  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);
+  return on_success()->EatsAtLeast(still_to_find, budget - 1, not_at_start);
 }
 
 
@@ -1615,9 +1531,7 @@
   // 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);
+  return on_success()->EatsAtLeast(still_to_find, budget - 1, not_at_start);
 }
 
 
@@ -1636,9 +1550,7 @@
                                         intptr_t budget,
                                         bool not_at_start) {
   if (budget <= 0) return 0;
-  return on_success()->EatsAtLeast(still_to_find,
-                                   budget - 1,
-                                   not_at_start);
+  return on_success()->EatsAtLeast(still_to_find, budget - 1, not_at_start);
 }
 
 
@@ -1649,9 +1561,8 @@
   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);
+  return answer +
+         on_success()->EatsAtLeast(still_to_find - answer, budget - 1, true);
 }
 
 
@@ -1701,20 +1612,14 @@
 intptr_t LoopChoiceNode::EatsAtLeast(intptr_t still_to_find,
                                      intptr_t budget,
                                      bool not_at_start) {
-  return EatsAtLeastHelper(still_to_find,
-                           budget - 1,
-                           loop_node_,
-                           not_at_start);
+  return EatsAtLeastHelper(still_to_find, budget - 1, loop_node_, not_at_start);
 }
 
 
 intptr_t ChoiceNode::EatsAtLeast(intptr_t still_to_find,
                                  intptr_t budget,
                                  bool not_at_start) {
-  return EatsAtLeastHelper(still_to_find,
-                           budget,
-                           NULL,
-                           not_at_start);
+  return EatsAtLeastHelper(still_to_find, budget, NULL, not_at_start);
 }
 
 
@@ -1761,8 +1666,8 @@
                                 QuickCheckDetails* details,
                                 bool fall_through_on_failure) {
   if (details->characters() == 0) return false;
-  GetQuickCheckDetails(
-      details, compiler, 0, trace->at_start() == Trace::FALSE_VALUE);
+  GetQuickCheckDetails(details, compiler, 0,
+                       trace->at_start() == Trace::FALSE_VALUE);
   if (details->cannot_match()) return false;
   if (!details->Rationalize(compiler->one_byte())) return false;
   ASSERT(details->characters() == 1 ||
@@ -1778,10 +1683,9 @@
     // 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());
+    assembler->LoadCurrentCharacter(
+        trace->cp_offset(), bounds_check_trace->backtrack(),
+        !preload_has_checked_bounds, details->characters());
   }
 
 
@@ -1948,7 +1852,7 @@
         // 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) {
+            from + differing_bits == to) {
           pos->determines_perfectly = true;
         }
         uint32_t common_bits = ~SmearBitsRight(differing_bits);
@@ -1985,10 +1889,8 @@
   }
   ASSERT(characters_filled_in != details->characters());
   if (!details->cannot_match()) {
-    on_success()-> GetQuickCheckDetails(details,
-                                        compiler,
-                                        characters_filled_in,
-                                        true);
+    on_success()->GetQuickCheckDetails(details, compiler, characters_filled_in,
+                                       true);
   }
 }
 
@@ -2036,8 +1938,7 @@
   for (intptr_t 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 ||
+    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.
@@ -2059,9 +1960,8 @@
     ASSERT(!info->visited);
     info->visited = true;
   }
-  ~VisitMarker() {
-    info_->visited = false;
-  }
+  ~VisitMarker() { info_->visited = false; }
+
  private:
   NodeInfo* info_;
 };
@@ -2087,8 +1987,8 @@
 // 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);
+  return range.Contains(0x39c) || range.Contains(0x3bc) ||
+         range.Contains(0x178);
 }
 
 
@@ -2150,8 +2050,7 @@
       // Now they are in order so we only need to look at the first.
       intptr_t range_count = ranges->length();
       if (cc->is_negated()) {
-        if (range_count != 0 &&
-            ranges->At(0).from() == 0 &&
+        if (range_count != 0 && ranges->At(0).from() == 0 &&
             ranges->At(0).to() >= Symbols::kMaxOneCharCodeSymbol) {
           // This will be handled in a later filter.
           if (ignore_case && RangesContainLatin1Equivalents(ranges)) continue;
@@ -2226,7 +2125,7 @@
   // Only some of the nodes survived the filtering.  We need to rebuild the
   // alternatives list.
   ZoneGrowableArray<GuardedAlternative>* new_alternatives =
-      new(Z) ZoneGrowableArray<GuardedAlternative>(surviving);
+      new (Z) ZoneGrowableArray<GuardedAlternative>(surviving);
   for (intptr_t i = 0; i < choice_count; i++) {
     RegExpNode* replacement =
         (*alternatives_)[i].node()->FilterOneByte(depth - 1, ignore_case);
@@ -2269,10 +2168,8 @@
                                           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);
+  return ChoiceNode::GetQuickCheckDetails(details, compiler,
+                                          characters_filled_in, not_at_start);
 }
 
 
@@ -2297,15 +2194,12 @@
   not_at_start = (not_at_start || not_at_start_);
   intptr_t choice_count = alternatives_->length();
   ASSERT(choice_count > 0);
-  (*alternatives_)[0].node()->GetQuickCheckDetails(details,
-                                                    compiler,
-                                                    characters_filled_in,
-                                                    not_at_start);
+  (*alternatives_)[0].node()->GetQuickCheckDetails(
+      details, compiler, characters_filled_in, not_at_start);
   for (intptr_t i = 1; i < choice_count; i++) {
     QuickCheckDetails new_details(details->characters());
     RegExpNode* node = (*alternatives_)[i].node();
-    node->GetQuickCheckDetails(&new_details, compiler,
-                               characters_filled_in,
+    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);
@@ -2357,11 +2251,9 @@
   }
   // 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())) {
+  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);
@@ -2383,22 +2275,19 @@
   if (lookahead == NULL) {
     intptr_t eats_at_least =
         Utils::Minimum(kMaxLookaheadForBoyerMoore,
-                       EatsAtLeast(kMaxLookaheadForBoyerMoore,
-                                   kRecursionBudget,
+                       EatsAtLeast(kMaxLookaheadForBoyerMoore, kRecursionBudget,
                                    not_at_start));
     if (eats_at_least >= 1) {
       BoyerMooreLookahead* bm =
-          new(Z) BoyerMooreLookahead(eats_at_least, compiler, Z);
+          new (Z) BoyerMooreLookahead(eats_at_least, compiler, Z);
       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_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;
+    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) {
@@ -2442,12 +2331,12 @@
 
   BlockLabel fall_through, dummy;
 
-  BlockLabel* non_word = backtrack_if_previous == kIsNonWord ?
-                         new_trace.backtrack() :
-                         &fall_through;
-  BlockLabel* word = backtrack_if_previous == kIsNonWord ?
-                     &fall_through :
-                     new_trace.backtrack();
+  BlockLabel* non_word = backtrack_if_previous == kIsNonWord
+                             ? new_trace.backtrack()
+                             : &fall_through;
+  BlockLabel* 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
@@ -2472,9 +2361,7 @@
     details->set_cannot_match();
     return;
   }
-  return on_success()->GetQuickCheckDetails(details,
-                                            compiler,
-                                            filled_in,
+  return on_success()->GetQuickCheckDetails(details, compiler, filled_in,
                                             not_at_start);
 }
 
@@ -2501,8 +2388,7 @@
         on_success()->Emit(compiler, &at_start_trace);
         return;
       }
-    }
-    break;
+    } break;
     case AFTER_NEWLINE:
       EmitHat(compiler, on_success(), trace);
       return;
@@ -2600,13 +2486,9 @@
             break;
         }
         if (emit_function != NULL) {
-          bool bound_checked = emit_function(Z,
-                                             compiler,
-                                             quarks->At(j),
-                                             backtrack,
-                                             cp_offset + j,
-                                             *checked_up_to < cp_offset + j,
-                                             preloaded);
+          bool bound_checked = emit_function(
+              Z, compiler, quarks->At(j), backtrack, cp_offset + j,
+              *checked_up_to < cp_offset + j, preloaded);
           if (bound_checked) UpdateBoundsCheck(cp_offset + j, checked_up_to);
         }
       }
@@ -2616,14 +2498,8 @@
         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,
-                      Z);
+        EmitCharClass(assembler, cc, one_byte, backtrack, cp_offset,
+                      *checked_up_to < cp_offset, preloaded, Z);
         UpdateBoundsCheck(cp_offset, checked_up_to);
       }
     }
@@ -2678,12 +2554,8 @@
   if (trace->characters_preloaded() == 1) {
     for (intptr_t pass = kFirstRealPass; pass <= kLastPass; pass++) {
       if (!SkipPass(pass, compiler->ignore_case())) {
-        TextEmitPass(compiler,
-                     static_cast<TextEmitPassType>(pass),
-                     true,
-                     trace,
-                     false,
-                     &bound_checked_to);
+        TextEmitPass(compiler, static_cast<TextEmitPassType>(pass), true, trace,
+                     false, &bound_checked_to);
       }
     }
     first_elt_done = true;
@@ -2691,12 +2563,8 @@
 
   for (intptr_t 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);
+      TextEmitPass(compiler, static_cast<TextEmitPassType>(pass), false, trace,
+                   first_elt_done, &bound_checked_to);
     }
   }
 
@@ -2729,8 +2597,8 @@
     compiler->SetRegExpTooBig();
     cp_offset_ = 0;
   }
-  bound_checked_up_to_ = Utils::Maximum(static_cast<intptr_t>(0),
-                                        bound_checked_up_to_ - by);
+  bound_checked_up_to_ =
+      Utils::Maximum(static_cast<intptr_t>(0), bound_checked_up_to_ - by);
 }
 
 
@@ -2849,8 +2717,8 @@
 
 intptr_t ChoiceNode::CalculatePreloadCharacters(RegExpCompiler* compiler,
                                                 intptr_t eats_at_least) {
-  intptr_t preload_characters = Utils::Minimum(static_cast<intptr_t>(4),
-                                               eats_at_least);
+  intptr_t preload_characters =
+      Utils::Minimum(static_cast<intptr_t>(4), eats_at_least);
   if (compiler->macro_assembler()->CanReadUnaligned()) {
     bool one_byte = compiler->one_byte();
     if (one_byte) {
@@ -2876,7 +2744,7 @@
       : possible_success(),
         expects_preload(false),
         after(),
-        quick_check_details() { }
+        quick_check_details() {}
   BlockLabel possible_success;
   bool expects_preload;
   BlockLabel after;
@@ -2888,8 +2756,7 @@
 // size then it is on the stack, otherwise the excess is on the heap.
 class AlternativeGenerationList {
  public:
-  explicit AlternativeGenerationList(intptr_t count)
-      : alt_gens_(count) {
+  explicit AlternativeGenerationList(intptr_t count) : alt_gens_(count) {
     for (intptr_t i = 0; i < count && i < kAFew; i++) {
       alt_gens_.Add(a_few_alt_gens_ + i);
     }
@@ -2904,9 +2771,7 @@
     }
   }
 
-  AlternativeGeneration* at(intptr_t i) {
-    return alt_gens_[i];
-  }
+  AlternativeGeneration* at(intptr_t i) { return alt_gens_[i]; }
 
  private:
   static const intptr_t kAFew = 10;
@@ -2920,20 +2785,20 @@
 // The '2' variant is 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 intptr_t 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 intptr_t 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 intptr_t kSpaceRangeCount = ARRAY_SIZE(kSpaceRanges);
-static const intptr_t kWordRanges[] = {
-    '0', '9' + 1, 'A', 'Z' + 1, '_', '_' + 1, 'a', 'z' + 1, 0x10000 };
+static const intptr_t kWordRanges[] = {'0',     '9' + 1, 'A',     'Z' + 1, '_',
+                                       '_' + 1, 'a',     'z' + 1, 0x10000};
 static const intptr_t kWordRangeCount = ARRAY_SIZE(kWordRanges);
-static const intptr_t kDigitRanges[] = { '0', '9' + 1, 0x10000 };
+static const intptr_t kDigitRanges[] = {'0', '9' + 1, 0x10000};
 static const intptr_t kDigitRangeCount = ARRAY_SIZE(kDigitRanges);
-static const intptr_t kSurrogateRanges[] = { 0xd800, 0xe000, 0x10000 };
+static const intptr_t kSurrogateRanges[] = {0xd800, 0xe000, 0x10000};
 static const intptr_t kSurrogateRangeCount = ARRAY_SIZE(kSurrogateRanges);
-static const intptr_t kLineTerminatorRanges[] = {
-    0x000A, 0x000B, 0x000D, 0x000E, 0x2028, 0x202A, 0x10000 };
+static const intptr_t kLineTerminatorRanges[] = {0x000A, 0x000B, 0x000D, 0x000E,
+                                                 0x2028, 0x202A, 0x10000};
 static const intptr_t kLineTerminatorRangeCount =
     ARRAY_SIZE(kLineTerminatorRanges);
 
@@ -2952,7 +2817,8 @@
   if (interval.to() - interval.from() >= kMapSize - 1) {
     if (map_count_ != kMapSize) {
       map_count_ = kMapSize;
-      for (intptr_t i = 0; i < kMapSize; i++) (*map_)[i] = true;
+      for (intptr_t i = 0; i < kMapSize; i++)
+        (*map_)[i] = true;
     }
     return;
   }
@@ -2971,23 +2837,24 @@
   s_ = w_ = d_ = kLatticeUnknown;
   if (map_count_ != kMapSize) {
     map_count_ = kMapSize;
-    for (intptr_t i = 0; i < kMapSize; i++) (*map_)[i] = true;
+    for (intptr_t i = 0; i < kMapSize; i++)
+      (*map_)[i] = true;
   }
 }
 
 
-BoyerMooreLookahead::BoyerMooreLookahead(
-    intptr_t length, RegExpCompiler* compiler, Zone* zone)
-    : length_(length),
-      compiler_(compiler) {
+BoyerMooreLookahead::BoyerMooreLookahead(intptr_t length,
+                                         RegExpCompiler* compiler,
+                                         Zone* zone)
+    : length_(length), compiler_(compiler) {
   if (compiler->one_byte()) {
     max_char_ = Symbols::kMaxOneCharCodeSymbol;
   } else {
     max_char_ = Utf16::kMaxCodeUnit;
   }
-  bitmaps_ = new(zone) ZoneGrowableArray<BoyerMoorePositionInfo*>(length);
+  bitmaps_ = new (zone) ZoneGrowableArray<BoyerMoorePositionInfo*>(length);
   for (intptr_t i = 0; i < length; i++) {
-    bitmaps_->Add(new(zone) BoyerMoorePositionInfo(zone));
+    bitmaps_->Add(new (zone) BoyerMoorePositionInfo(zone));
   }
 }
 
@@ -3000,8 +2867,7 @@
   // 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 intptr_t kMaxMax = 32;
-  for (intptr_t max_number_of_chars = 4;
-       max_number_of_chars < kMaxMax;
+  for (intptr_t 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);
@@ -3017,22 +2883,24 @@
 // 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.
-intptr_t BoyerMooreLookahead::FindBestInterval(
-    intptr_t max_number_of_chars,
-    intptr_t old_biggest_points,
-    intptr_t* from,
-    intptr_t* to) {
+intptr_t BoyerMooreLookahead::FindBestInterval(intptr_t max_number_of_chars,
+                                               intptr_t old_biggest_points,
+                                               intptr_t* from,
+                                               intptr_t* to) {
   intptr_t biggest_points = old_biggest_points;
   static const intptr_t kSize = RegExpMacroAssembler::kTableSize;
-  for (intptr_t i = 0; i < length_; ) {
-    while (i < length_ && Count(i) > max_number_of_chars) i++;
+  for (intptr_t i = 0; i < length_;) {
+    while (i < length_ && Count(i) > max_number_of_chars)
+      i++;
     if (i == length_) break;
     intptr_t remembered_from = i;
     bool union_map[kSize];
-    for (intptr_t j = 0; j < kSize; j++) union_map[j] = false;
+    for (intptr_t j = 0; j < kSize; j++)
+      union_map[j] = false;
     while (i < length_ && Count(i) <= max_number_of_chars) {
       BoyerMoorePositionInfo* map = bitmaps_->At(i);
-      for (intptr_t j = 0; j < kSize; j++) union_map[j] |= map->at(j);
+      for (intptr_t j = 0; j < kSize; j++)
+        union_map[j] |= map->at(j);
       i++;
     }
     intptr_t frequency = 0;
@@ -3051,8 +2919,9 @@
     // 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));
+    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.
     intptr_t probability =
@@ -3140,8 +3009,7 @@
     masm->LoadCurrentCharacter(max_lookahead, &cont, true);
     if (max_char_ > kSize) {
       masm->CheckCharacterAfterAnd(single_character,
-                                   RegExpMacroAssembler::kTableMask,
-                                   &cont);
+                                   RegExpMacroAssembler::kTableMask, &cont);
     } else {
       masm->CheckCharacter(single_character, &cont);
     }
@@ -3152,10 +3020,10 @@
   }
 
   const TypedData& boolean_skip_table = TypedData::ZoneHandle(
-        compiler_->zone(),
-        TypedData::New(kTypedDataUint8ArrayCid, kSize, Heap::kOld));
-  intptr_t skip_distance = GetSkipTable(
-      min_lookahead, max_lookahead, boolean_skip_table);
+      compiler_->zone(),
+      TypedData::New(kTypedDataUint8ArrayCid, kSize, Heap::kOld));
+  intptr_t skip_distance =
+      GetSkipTable(min_lookahead, max_lookahead, boolean_skip_table);
   ASSERT(skip_distance != 0);
 
   BlockLabel cont, again;
@@ -3269,18 +3137,18 @@
 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_);
+  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_;
+  state->preload_is_current_ =
+      (current_trace->characters_preloaded() == state->preload_characters_);
+  state->preload_has_checked_bounds_ = state->preload_is_current_;
 }
 
 
@@ -3311,12 +3179,8 @@
   AlternativeGenerationList alt_gens(choice_count);
 
   if (choice_count > 1 && text_length != kNodeIsTooComplexForGreedyLoops) {
-    trace = EmitGreedyLoop(compiler,
-                           trace,
-                           &alt_gens,
-                           &preload,
-                           &greedy_loop_state,
-                           text_length);
+    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.
@@ -3325,11 +3189,7 @@
 
     preload.eats_at_least_ = EmitOptimizedUnanchoredSearch(compiler, trace);
 
-    EmitChoices(compiler,
-                &alt_gens,
-                0,
-                trace,
-                &preload);
+    EmitChoices(compiler, &alt_gens, 0, trace, &preload);
   }
 
   // At this point we need to generate slow checks for the alternatives where
@@ -3347,11 +3207,8 @@
     }
     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_,
+    EmitOutOfLineContinuation(compiler, &new_trace, alternatives_->At(i),
+                              alt_gen, preload.preload_characters_,
                               next_expects_preload);
   }
 }
@@ -3388,11 +3245,7 @@
 
   Trace* new_trace = greedy_loop_state->counter_backtrack_trace();
 
-  EmitChoices(compiler,
-              alt_gens,
-              1,
-              new_trace,
-              preload);
+  EmitChoices(compiler, alt_gens, 1, new_trace, preload);
 
   macro_assembler->BindBlock(greedy_loop_state->label());
   // If we have unwound to the bottom then backtrack.
@@ -3436,12 +3289,11 @@
   // small alternation.
   BoyerMooreLookahead* bm = bm_info(false);
   if (bm == NULL) {
-    eats_at_least = Utils::Minimum(kMaxLookaheadForBoyerMoore,
-                        EatsAtLeast(kMaxLookaheadForBoyerMoore,
-                                    kRecursionBudget,
-                                    false));
+    eats_at_least = Utils::Minimum(
+        kMaxLookaheadForBoyerMoore,
+        EatsAtLeast(kMaxLookaheadForBoyerMoore, kRecursionBudget, false));
     if (eats_at_least >= 1) {
-      bm = new(Z) BoyerMooreLookahead(eats_at_least, compiler, Z);
+      bm = new (Z) BoyerMooreLookahead(eats_at_least, compiler, Z);
       GuardedAlternative alt0 = alternatives_->At(0);
       alt0.node()->FillInBMInfo(0, kRecursionBudget, bm, false);
     }
@@ -3476,9 +3328,8 @@
     ZoneGrowableArray<Guard*>* guards = alternative.guards();
     intptr_t guard_count = (guards == NULL) ? 0 : guards->length();
     Trace new_trace(*trace);
-    new_trace.set_characters_preloaded(preload->preload_is_current_ ?
-                                         preload->preload_characters_ :
-                                         0);
+    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_);
     }
@@ -3491,13 +3342,10 @@
     bool generate_full_check_inline = false;
     if (kRegexpOptimization &&
         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)) {
+        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;
@@ -3569,9 +3417,7 @@
     // 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,
+    macro_assembler->LoadCurrentCharacter(trace->cp_offset(), NULL, false,
                                           preload_characters);
     macro_assembler->GoTo(&(alt_gen->after));
   } else {
@@ -3594,35 +3440,33 @@
 
   switch (action_type_) {
     case STORE_POSITION: {
-      Trace::DeferredCapture
-          new_capture(data_.u_position_register.reg,
-                      data_.u_position_register.is_capture,
-                      trace);
+      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::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::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::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);
@@ -3722,8 +3566,7 @@
 
   ASSERT(start_reg_ + 1 == end_reg_);
   if (compiler->ignore_case()) {
-    assembler->CheckNotBackReferenceIgnoreCase(start_reg_,
-                                               trace->backtrack());
+    assembler->CheckNotBackReferenceIgnoreCase(start_reg_, trace->backtrack());
   } else {
     assembler->CheckNotBackReference(start_reg_, trace->backtrack());
   }
@@ -3738,16 +3581,15 @@
 #ifdef DEBUG
 
 
-class DotPrinter: public NodeVisitor {
+class DotPrinter : public NodeVisitor {
  public:
   explicit DotPrinter(bool 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)
+#define DECLARE_VISIT(Type) virtual void Visit##Type(Type##Node* that);
+  FOR_EACH_NODE_TYPE(DECLARE_VISIT)
 #undef DECLARE_VISIT
 };
 
@@ -3813,19 +3655,21 @@
 
 
 void DotPrinter::PrintAttributes(RegExpNode* that) {
-  OS::Print("  a%p [shape=Mrecord, color=grey, fontcolor=grey, "
-            "margin=0.1, fontsize=10, label=\"{", that);
+  OS::Print(
+      "  a%p [shape=Mrecord, color=grey, fontcolor=grey, "
+      "margin=0.1, fontsize=10, label=\"{",
+      that);
   AttributePrinter printer;
   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);
   BlockLabel* label = that->label();
-  if (label->IsBound())
-    printer.PrintPositive("@", label->Position());
-  OS::Print("}\"];\n"
-            "  a%p -> n%p [style=dashed, color=grey, arrowhead=none];\n",
-            that, that);
+  if (label->IsBound()) printer.PrintPositive("@", label->Position());
+  OS::Print(
+      "}\"];\n"
+      "  a%p -> n%p [style=dashed, color=grey, arrowhead=none];\n",
+      that, that);
 }
 
 
@@ -3985,20 +3829,20 @@
 RegExpNode* RegExpAtom::ToNode(RegExpCompiler* compiler,
                                RegExpNode* on_success) {
   ZoneGrowableArray<TextElement>* elms =
-      new(OZ) ZoneGrowableArray<TextElement>(1);
+      new (OZ) ZoneGrowableArray<TextElement>(1);
   elms->Add(TextElement::Atom(this));
-  return new(OZ) TextNode(elms, on_success);
+  return new (OZ) TextNode(elms, on_success);
 }
 
 
 RegExpNode* RegExpText::ToNode(RegExpCompiler* compiler,
                                RegExpNode* on_success) {
   ZoneGrowableArray<TextElement>* elms =
-      new(OZ) ZoneGrowableArray<TextElement>(1);
-  for (intptr_t  i = 0; i < elements()->length(); i++) {
+      new (OZ) ZoneGrowableArray<TextElement>(1);
+  for (intptr_t i = 0; i < elements()->length(); i++) {
     elms->Add(elements()->At(i));
   }
-  return new(OZ) TextNode(elms, on_success);
+  return new (OZ) TextNode(elms, on_success);
 }
 
 
@@ -4022,7 +3866,7 @@
       return false;
     }
     range = ranges->At((i >> 1) + 1);
-    if (special_class[i+1] != range.from()) {
+    if (special_class[i + 1] != range.from()) {
       return false;
     }
   }
@@ -4069,14 +3913,12 @@
     set_.set_standard_set_type('S');
     return true;
   }
-  if (CompareInverseRanges(set_.ranges(),
-                           kLineTerminatorRanges,
+  if (CompareInverseRanges(set_.ranges(), kLineTerminatorRanges,
                            kLineTerminatorRangeCount)) {
     set_.set_standard_set_type('.');
     return true;
   }
-  if (CompareRanges(set_.ranges(),
-                    kLineTerminatorRanges,
+  if (CompareRanges(set_.ranges(), kLineTerminatorRanges,
                     kLineTerminatorRangeCount)) {
     set_.set_standard_set_type('n');
     return true;
@@ -4095,7 +3937,7 @@
 
 RegExpNode* RegExpCharacterClass::ToNode(RegExpCompiler* compiler,
                                          RegExpNode* on_success) {
-  return new(OZ) TextNode(this, on_success);
+  return new (OZ) TextNode(this, on_success);
 }
 
 
@@ -4103,11 +3945,10 @@
                                       RegExpNode* on_success) {
   ZoneGrowableArray<RegExpTree*>* alternatives = this->alternatives();
   intptr_t length = alternatives->length();
-  ChoiceNode* result =
-      new(OZ) ChoiceNode(length, OZ);
+  ChoiceNode* result = new (OZ) ChoiceNode(length, OZ);
   for (intptr_t i = 0; i < length; i++) {
-    GuardedAlternative alternative(alternatives->At(i)->ToNode(compiler,
-                                                               on_success));
+    GuardedAlternative alternative(
+        alternatives->At(i)->ToNode(compiler, on_success));
     result->AddAlternative(alternative);
   }
   return result;
@@ -4116,12 +3957,7 @@
 
 RegExpNode* RegExpQuantifier::ToNode(RegExpCompiler* compiler,
                                      RegExpNode* on_success) {
-  return ToNode(min(),
-                max(),
-                is_greedy(),
-                body(),
-                compiler,
-                on_success);
+  return ToNode(min(), max(), is_greedy(), body(), compiler, on_success);
 }
 
 
@@ -4207,14 +4043,13 @@
     // Only unroll if there are no captures and the body can't be
     // empty.
     {
-      RegExpExpansionLimiter limiter(
-          compiler, min + ((max != min) ? 1 : 0));
+      RegExpExpansionLimiter limiter(compiler, min + ((max != min) ? 1 : 0));
       if (min > 0 && min <= kMaxUnrolledMinMatches && limiter.ok_to_expand()) {
         intptr_t 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);
+        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.
@@ -4231,7 +4066,7 @@
         // Unroll the optional matches up to max.
         RegExpNode* answer = on_success;
         for (intptr_t i = 0; i < max; i++) {
-          ChoiceNode* alternation = new(zone) ChoiceNode(2, zone);
+          ChoiceNode* alternation = new (zone) ChoiceNode(2, zone);
           if (is_greedy) {
             alternation->AddAlternative(
                 GuardedAlternative(body->ToNode(compiler, answer)));
@@ -4251,22 +4086,20 @@
   bool has_min = min > 0;
   bool has_max = max < RegExpTree::kInfinity;
   bool needs_counter = has_min || has_max;
-  intptr_t reg_ctr = needs_counter
-      ? compiler->AllocateRegister()
-      : RegExpCompiler::kNoRegister;
-  LoopChoiceNode* center = new(zone) LoopChoiceNode(body->min_match() == 0,
-                                                       zone);
+  intptr_t 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);
+  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);
+    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) {
@@ -4280,13 +4113,12 @@
   }
   GuardedAlternative body_alt(body_node);
   if (has_max) {
-    Guard* body_guard =
-        new(zone) Guard(reg_ctr, Guard::LT, 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(zone) Guard(reg_ctr, Guard::GEQ, min);
+    Guard* rest_guard = new (zone) Guard(reg_ctr, Guard::GEQ, min);
     rest_alt.AddGuard(rest_guard, zone);
   }
   if (is_greedy) {
@@ -4331,17 +4163,14 @@
       CharacterRange::AddClassEscape('n', newline_ranges);
       RegExpCharacterClass* newline_atom = new RegExpCharacterClass('n');
       TextNode* newline_matcher = new TextNode(
-         newline_atom,
-         ActionNode::PositiveSubmatchSuccess(stack_pointer_register,
-                                             position_register,
-                                             0,  // No captures inside.
-                                             -1,  // Ignored if no captures.
-                                             on_success));
+          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);
+          stack_pointer_register, position_register, newline_matcher);
       // Add the two alternatives to the ChoiceNode.
       GuardedAlternative eol_alternative(end_of_line);
       result->AddAlternative(eol_alternative);
@@ -4358,10 +4187,9 @@
 
 RegExpNode* RegExpBackReference::ToNode(RegExpCompiler* compiler,
                                         RegExpNode* on_success) {
-  return new(OZ)
+  return new (OZ)
       BackReferenceNode(RegExpCapture::StartRegister(index()),
-                        RegExpCapture::EndRegister(index()),
-                        on_success);
+                        RegExpCapture::EndRegister(index()), on_success);
 }
 
 
@@ -4380,20 +4208,16 @@
   const intptr_t register_of_first_capture = 2;
   intptr_t register_count = capture_count_ * registers_per_capture;
   intptr_t register_start =
-    register_of_first_capture + capture_from_ * registers_per_capture;
+      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)));
+        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
@@ -4408,19 +4232,12 @@
     // checks.
 
     GuardedAlternative body_alt(
-        body()->ToNode(
-            compiler,
-            success = new(OZ) NegativeSubmatchSuccess(stack_pointer_register,
-                                                      position_register,
-                                                      register_count,
-                                                      register_start,
-                                                      OZ)));
-    ChoiceNode* choice_node =
-        new(OZ) NegativeLookaheadChoiceNode(body_alt,
-                                            GuardedAlternative(on_success),
-                                            OZ);
-    return ActionNode::BeginSubmatch(stack_pointer_register,
-                                     position_register,
+        body()->ToNode(compiler, success = new (OZ) NegativeSubmatchSuccess(
+                                     stack_pointer_register, position_register,
+                                     register_count, register_start, OZ)));
+    ChoiceNode* choice_node = new (OZ) NegativeLookaheadChoiceNode(
+        body_alt, GuardedAlternative(on_success), OZ);
+    return ActionNode::BeginSubmatch(stack_pointer_register, position_register,
                                      choice_node);
   }
 }
@@ -4467,13 +4284,13 @@
 }
 
 
-static void AddClassNegated(const intptr_t *elmv,
+static void AddClassNegated(const intptr_t* elmv,
                             intptr_t elmc,
                             ZoneGrowableArray<CharacterRange>* ranges) {
   elmc--;
   ASSERT(elmv[elmc] == 0x10000);
   ASSERT(elmv[0] != 0x0000);
-  ASSERT(elmv[elmc-1] != Utf16::kMaxCodeUnit);
+  ASSERT(elmv[elmc - 1] != Utf16::kMaxCodeUnit);
   uint16_t last = 0x0000;
   for (intptr_t i = 0; i < elmc; i += 2) {
     ASSERT(last <= elmv[i] - 1);
@@ -4507,9 +4324,7 @@
       AddClassNegated(kDigitRanges, kDigitRangeCount, ranges);
       break;
     case '.':
-      AddClassNegated(kLineTerminatorRanges,
-                      kLineTerminatorRangeCount,
-                      ranges);
+      AddClassNegated(kLineTerminatorRanges, kLineTerminatorRangeCount, ranges);
       break;
     // This is not a character range as defined by the spec but a
     // convenient shorthand for a character class that matches any
@@ -4520,9 +4335,7 @@
     // This is the set of characters matched by the $ and ^ symbols
     // in multiline mode.
     case 'n':
-      AddClass(kLineTerminatorRanges,
-               kLineTerminatorRangeCount,
-               ranges);
+      AddClass(kLineTerminatorRanges, kLineTerminatorRangeCount, ranges);
       break;
     default:
       UNREACHABLE();
@@ -4531,9 +4344,9 @@
 
 
 void CharacterRange::AddCaseEquivalents(
-                        ZoneGrowableArray<CharacterRange>* ranges,
-                        bool is_one_byte,
-                        Zone* zone) {
+    ZoneGrowableArray<CharacterRange>* ranges,
+    bool is_one_byte,
+    Zone* zone) {
   uint16_t bottom = from();
   uint16_t top = to();
   if (is_one_byte && !RangeContainsLatin1Equivalents(*this)) {
@@ -4548,7 +4361,8 @@
   int32_t chars[unibrow::Ecma262UnCanonicalize::kMaxWidth];
   if (top == bottom) {
     // If this is a singleton we just expand the one character.
-    intptr_t length = jsregexp_uncanonicalize.get(bottom, '\0', chars); // NOLINT
+    intptr_t length =
+        jsregexp_uncanonicalize.get(bottom, '\0', chars);  // NOLINT
     for (intptr_t i = 0; i < length; i++) {
       uint32_t chr = chars[i];
       if (chr != bottom) {
@@ -4586,7 +4400,7 @@
         block_end = range[0];
       }
       intptr_t end = (block_end > top) ? top : block_end;
-      length = jsregexp_uncanonicalize.get(block_end, '\0', range); // NOLINT
+      length = jsregexp_uncanonicalize.get(block_end, '\0', range);  // NOLINT
       for (intptr_t i = 0; i < length; i++) {
         uint32_t c = range[i];
         uint16_t range_from = c - (block_end - pos);
@@ -4644,9 +4458,9 @@
 
 
 static intptr_t InsertRangeInCanonicalList(
-                    ZoneGrowableArray<CharacterRange>* list,
-                    intptr_t count,
-                    CharacterRange insert) {
+    ZoneGrowableArray<CharacterRange>* list,
+    intptr_t 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
@@ -4734,11 +4548,10 @@
   // 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.
-  intptr_t read = i;  // Range to insert.
+  intptr_t read = i;           // Range to insert.
   intptr_t num_canonical = i;  // Length of canonicalized part of list.
   do {
-    num_canonical = InsertRangeInCanonicalList(character_ranges,
-                                               num_canonical,
+    num_canonical = InsertRangeInCanonicalList(character_ranges, num_canonical,
                                                character_ranges->At(read));
     read++;
   } while (read < n);
@@ -4776,8 +4589,7 @@
 
 
 // Workaround for the fact that ZoneGrowableArray does not have contains().
-static bool ArrayContains(ZoneGrowableArray<unsigned>* array,
-                          unsigned value) {
+static bool ArrayContains(ZoneGrowableArray<unsigned>* array, unsigned value) {
   for (intptr_t i = 0; i < array->length(); i++) {
     if (array->At(i) == value) {
       return true;
@@ -4792,7 +4604,7 @@
     first_ |= (1 << value);
   } else {
     if (remaining_ == NULL)
-      remaining_ = new(zone) ZoneGrowableArray<unsigned>(1);
+      remaining_ = new (zone) ZoneGrowableArray<unsigned>(1);
 
     bool remaining_contains_value = ArrayContains(remaining_, value);
     if (remaining_->is_empty() || !remaining_contains_value) {
@@ -4818,8 +4630,7 @@
 
 
 void Analysis::EnsureAnalyzed(RegExpNode* that) {
-  if (that->info()->been_analyzed || that->info()->being_analyzed)
-    return;
+  if (that->info()->been_analyzed || that->info()->being_analyzed) return;
   that->info()->being_analyzed = true;
   that->Accept(this);
   that->info()->being_analyzed = false;
@@ -4967,8 +4778,7 @@
         if (bm->compiler()->ignore_case()) {
           int32_t chars[unibrow::Ecma262UnCanonicalize::kMaxWidth];
           intptr_t length = GetCaseIndependentLetters(
-              character,
-              bm->max_char() == Symbols::kMaxOneCharCodeSymbol,
+              character, bm->max_char() == Symbols::kMaxOneCharCodeSymbol,
               chars);
           for (intptr_t j = 0; j < length; j++) {
             bm->Set(offset, chars[j]);
@@ -4987,8 +4797,8 @@
         for (intptr_t k = 0; k < ranges->length(); k++) {
           CharacterRange& range = (*ranges)[k];
           if (range.from() > max_char) continue;
-          intptr_t to = Utils::Minimum(max_char,
-                                       static_cast<intptr_t>(range.to()));
+          intptr_t to =
+              Utils::Minimum(max_char, static_cast<intptr_t>(range.to()));
           bm->SetInterval(offset, Interval(range.from(), to));
         }
       }
@@ -4999,9 +4809,7 @@
     if (initial_offset == 0) set_bm_info(not_at_start, bm);
     return;
   }
-  on_success()->FillInBMInfo(offset,
-                             budget - 1,
-                             bm,
+  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);
 }
@@ -5039,10 +4847,8 @@
   // I'm not sure the performance gains are relevant enough.
 
   // Wrap the body of the regexp in capture #0.
-  RegExpNode* captured_body = RegExpCapture::ToNode(data->tree,
-                                                    0,
-                                                    &compiler,
-                                                    compiler.accept());
+  RegExpNode* captured_body =
+      RegExpCapture::ToNode(data->tree, 0, &compiler, compiler.accept());
 
   RegExpNode* node = captured_body;
   bool is_end_anchored = data->tree->IsAnchoredAtEnd();
@@ -5051,23 +4857,17 @@
   if (!is_start_anchored) {
     // Add a .*? at the beginning, outside the body capture, unless
     // this expression is anchored at the beginning.
-    RegExpNode* loop_node =
-        RegExpQuantifier::ToNode(0,
-                                 RegExpTree::kInfinity,
-                                 false,
-                                 new(zone) RegExpCharacterClass('*'),
-                                 &compiler,
-                                 captured_body,
-                                 data->contains_anchor);
+    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);
+      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)));
+      first_step_node->AddAlternative(GuardedAlternative(new (zone) TextNode(
+          new (zone) RegExpCharacterClass('*'), loop_node)));
       node = first_step_node;
     } else {
       node = loop_node;
@@ -5082,7 +4882,7 @@
     }
   }
 
-  if (node == NULL) node = new(zone) EndNode(EndNode::BACKTRACK, zone);
+  if (node == NULL) node = new (zone) EndNode(EndNode::BACKTRACK, zone);
   data->node = node;
   Analysis analysis(ignore_case, is_one_byte);
   analysis.EnsureAnalyzed(node);
@@ -5094,17 +4894,13 @@
   // Native regexp implementation.
 
   IRRegExpMacroAssembler* macro_assembler =
-      new(zone) IRRegExpMacroAssembler(specialization_cid,
-                                       data->capture_count,
-                                       parsed_function,
-                                       ic_data_array,
-                                       zone);
+      new (zone) IRRegExpMacroAssembler(specialization_cid, data->capture_count,
+                                        parsed_function, ic_data_array, zone);
 
   // Inserted here, instead of in Assembler, because it depends on information
   // in the AST that isn't replicated in the Node structure.
   static const intptr_t kMaxBacksearchLimit = 1024;
-  if (is_end_anchored &&
-      !is_start_anchored &&
+  if (is_end_anchored && !is_start_anchored &&
       max_length < kMaxBacksearchLimit) {
     macro_assembler->SetCurrentPositionFromEnd(max_length);
   }
@@ -5117,10 +4913,7 @@
   }
 
   RegExpEngine::CompilationResult result =
-      compiler.Assemble(macro_assembler,
-                        node,
-                        data->capture_count,
-                        pattern);
+      compiler.Assemble(macro_assembler, node, data->capture_count, pattern);
 
   if (FLAG_trace_irregexp) {
     macro_assembler->PrintBlocks();
@@ -5156,10 +4949,8 @@
   // I'm not sure the performance gains are relevant enough.
 
   // Wrap the body of the regexp in capture #0.
-  RegExpNode* captured_body = RegExpCapture::ToNode(data->tree,
-                                                    0,
-                                                    &compiler,
-                                                    compiler.accept());
+  RegExpNode* captured_body =
+      RegExpCapture::ToNode(data->tree, 0, &compiler, compiler.accept());
 
   RegExpNode* node = captured_body;
   bool is_end_anchored = data->tree->IsAnchoredAtEnd();
@@ -5168,23 +4959,17 @@
   if (!is_start_anchored) {
     // Add a .*? at the beginning, outside the body capture, unless
     // this expression is anchored at the beginning.
-    RegExpNode* loop_node =
-        RegExpQuantifier::ToNode(0,
-                                 RegExpTree::kInfinity,
-                                 false,
-                                 new(zone) RegExpCharacterClass('*'),
-                                 &compiler,
-                                 captured_body,
-                                 data->contains_anchor);
+    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);
+      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)));
+      first_step_node->AddAlternative(GuardedAlternative(new (zone) TextNode(
+          new (zone) RegExpCharacterClass('*'), loop_node)));
       node = first_step_node;
     } else {
       node = loop_node;
@@ -5199,7 +4984,7 @@
     }
   }
 
-  if (node == NULL) node = new(zone) EndNode(EndNode::BACKTRACK, zone);
+  if (node == NULL) node = new (zone) EndNode(EndNode::BACKTRACK, zone);
   data->node = node;
   Analysis analysis(ignore_case, is_one_byte);
   analysis.EnsureAnalyzed(node);
@@ -5212,13 +4997,12 @@
 
   ZoneGrowableArray<uint8_t> buffer(zone, 1024);
   BytecodeRegExpMacroAssembler* macro_assembler =
-      new(zone) BytecodeRegExpMacroAssembler(&buffer, zone);
+      new (zone) BytecodeRegExpMacroAssembler(&buffer, zone);
 
   // Inserted here, instead of in Assembler, because it depends on information
   // in the AST that isn't replicated in the Node structure.
   static const intptr_t kMaxBacksearchLimit = 1024;
-  if (is_end_anchored &&
-      !is_start_anchored &&
+  if (is_end_anchored && !is_start_anchored &&
       max_length < kMaxBacksearchLimit) {
     macro_assembler->SetCurrentPositionFromEnd(max_length);
   }
@@ -5231,10 +5015,7 @@
   }
 
   RegExpEngine::CompilationResult result =
-      compiler.Assemble(macro_assembler,
-                        node,
-                        data->capture_count,
-                        pattern);
+      compiler.Assemble(macro_assembler, node, data->capture_count, pattern);
 
   if (FLAG_trace_irregexp) {
     macro_assembler->PrintBlocks();
@@ -5244,29 +5025,29 @@
 }
 
 
-static void CreateSpecializedFunction(Thread* thread, Zone* zone,
+static void CreateSpecializedFunction(Thread* thread,
+                                      Zone* zone,
                                       const RegExp& regexp,
                                       intptr_t specialization_cid,
                                       const Object& owner) {
   const intptr_t kParamCount = RegExpMacroAssembler::kParamCount;
 
-  Function& fn = Function::Handle(zone, Function::New(
-      Symbols::ColonMatcher(),
-      RawFunction::kIrregexpFunction,
-      true,  // Static.
-      false,  // Not const.
-      false,  // Not abstract.
-      false,  // Not external.
-      false,  // Not native.
-      owner,
-      TokenPosition::kMinSource));
+  Function& fn =
+      Function::Handle(zone, Function::New(Symbols::ColonMatcher(),
+                                           RawFunction::kIrregexpFunction,
+                                           true,   // Static.
+                                           false,  // Not const.
+                                           false,  // Not abstract.
+                                           false,  // Not external.
+                                           false,  // Not native.
+                                           owner, TokenPosition::kMinSource));
 
   // TODO(zerny): Share these arrays between all irregexp functions.
   fn.set_num_fixed_parameters(kParamCount);
-  fn.set_parameter_types(Array::Handle(zone, Array::New(kParamCount,
-                                                        Heap::kOld)));
-  fn.set_parameter_names(Array::Handle(zone, Array::New(kParamCount,
-                                                        Heap::kOld)));
+  fn.set_parameter_types(
+      Array::Handle(zone, Array::New(kParamCount, Heap::kOld)));
+  fn.set_parameter_names(
+      Array::Handle(zone, Array::New(kParamCount, Heap::kOld)));
   fn.SetParameterTypeAt(RegExpMacroAssembler::kParamRegExpIndex,
                         Object::dynamic_type());
   fn.SetParameterNameAt(RegExpMacroAssembler::kParamRegExpIndex,
@@ -5310,19 +5091,19 @@
   // TODO(zerny): We might want to use normal string searching algorithms
   // for simple patterns.
   regexp.set_is_complex();
-  regexp.set_is_global();   // All dart regexps are global.
+  regexp.set_is_global();  // All dart regexps are global.
 
   if (!FLAG_interpret_irregexp) {
     const Library& lib = Library::Handle(zone, Library::CoreLibrary());
-    const Class& owner = Class::Handle(zone,
-                                       lib.LookupClass(Symbols::RegExp()));
+    const Class& owner =
+        Class::Handle(zone, lib.LookupClass(Symbols::RegExp()));
 
     CreateSpecializedFunction(thread, zone, regexp, kOneByteStringCid, owner);
     CreateSpecializedFunction(thread, zone, regexp, kTwoByteStringCid, owner);
-    CreateSpecializedFunction(thread, zone,
-                              regexp, kExternalOneByteStringCid, owner);
-    CreateSpecializedFunction(thread, zone,
-                              regexp, kExternalTwoByteStringCid, owner);
+    CreateSpecializedFunction(thread, zone, regexp, kExternalOneByteStringCid,
+                              owner);
+    CreateSpecializedFunction(thread, zone, regexp, kExternalTwoByteStringCid,
+                              owner);
   }
 
   return regexp.raw();
diff --git a/runtime/vm/regexp.h b/runtime/vm/regexp.h
index bf457be..e026073 100644
--- a/runtime/vm/regexp.h
+++ b/runtime/vm/regexp.h
@@ -25,8 +25,8 @@
 // inclusive.
 class CharacterRange {
  public:
-  CharacterRange() : from_(0), to_(0) { }
-  CharacterRange(uint16_t from, uint16_t to) : from_(from), to_(to) { }
+  CharacterRange() : from_(0), to_(0) {}
+  CharacterRange(uint16_t from, uint16_t to) : from_(from), to_(to) {}
 
   static void AddClassEscape(uint16_t type,
                              ZoneGrowableArray<CharacterRange>* ranges);
@@ -81,9 +81,9 @@
 
 // A set of unsigned integers that behaves especially well on small
 // integers (< 32).  May do zone-allocation.
-class OutSet: public ZoneAllocated {
+class OutSet : public ZoneAllocated {
  public:
-  OutSet() : first_(0), remaining_(NULL), successors_(NULL) { }
+  OutSet() : first_(0), remaining_(NULL), successors_(NULL) {}
   OutSet* Extend(unsigned value, Zone* zone);
   bool Get(unsigned value) const;
   static const unsigned kFirstLimit = 32;
@@ -100,7 +100,7 @@
   ZoneGrowableArray<OutSet*>* successors() { return successors_; }
 
   OutSet(uint32_t first, ZoneGrowableArray<unsigned>* remaining)
-      : first_(first), remaining_(remaining), successors_(NULL) { }
+      : first_(first), remaining_(remaining), successors_(NULL) {}
   uint32_t first_;
   ZoneGrowableArray<unsigned>* remaining_;
   ZoneGrowableArray<OutSet*>* successors_;
@@ -108,26 +108,26 @@
 };
 
 
-#define FOR_EACH_NODE_TYPE(VISIT)                                    \
-  VISIT(End)                                                         \
-  VISIT(Action)                                                      \
-  VISIT(Choice)                                                      \
-  VISIT(BackReference)                                               \
-  VISIT(Assertion)                                                   \
+#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)                                                       \
+#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)
 
 
@@ -138,10 +138,7 @@
 
 class TextElement {
  public:
-  enum TextType {
-    ATOM,
-    CHAR_CLASS
-  };
+  enum TextType { ATOM, CHAR_CLASS };
 
   static TextElement Atom(RegExpAtom* atom);
   static TextElement CharClass(RegExpCharacterClass* char_class);
@@ -190,7 +187,7 @@
         follows_start_interest(false),
         at_end(false),
         visited(false),
-        replacement_calculated(false) { }
+        replacement_calculated(false) {}
 
   // Returns true if the interests and assumptions of this node
   // matches the given one.
@@ -211,8 +208,7 @@
   }
 
   bool HasLookbehind() {
-    return follows_word_interest ||
-           follows_newline_interest ||
+    return follows_word_interest || follows_newline_interest ||
            follows_start_interest;
   }
 
@@ -229,18 +225,18 @@
     been_analyzed = false;
   }
 
-  bool being_analyzed: 1;
-  bool been_analyzed: 1;
+  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 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;
+  bool at_end : 1;
+  bool visited : 1;
+  bool replacement_calculated : 1;
 };
 
 
@@ -249,15 +245,9 @@
 class QuickCheckDetails {
  public:
   QuickCheckDetails()
-      : characters_(0),
-        mask_(0),
-        value_(0),
-        cannot_match_(false) { }
+      : characters_(0), mask_(0), value_(0), cannot_match_(false) {}
   explicit QuickCheckDetails(intptr_t characters)
-      : characters_(characters),
-        mask_(0),
-        value_(0),
-        cannot_match_(false) { }
+      : 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, intptr_t from_index);
@@ -267,7 +257,7 @@
   bool cannot_match() { return cannot_match_; }
   void set_cannot_match() { cannot_match_ = true; }
   struct Position {
-    Position() : mask(0), value(0), determines_perfectly(false) { }
+    Position() : mask(0), value(0), determines_perfectly(false) {}
     uint16_t mask;
     uint16_t value;
     bool determines_perfectly;
@@ -298,10 +288,10 @@
 };
 
 
-class RegExpNode: public ZoneAllocated {
+class RegExpNode : public ZoneAllocated {
  public:
   explicit RegExpNode(Zone* zone)
-  : replacement_(NULL), trace_count_(0), zone_(zone) {
+      : replacement_(NULL), trace_count_(0), zone_(zone) {
     bm_info_[0] = bm_info_[1] = NULL;
   }
   virtual ~RegExpNode();
@@ -315,7 +305,8 @@
   // 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 intptr_t EatsAtLeast(intptr_t still_to_find, intptr_t budget,
+  virtual intptr_t EatsAtLeast(intptr_t still_to_find,
+                               intptr_t 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.
@@ -372,7 +363,7 @@
   }
   RegExpNode* set_replacement(RegExpNode* replacement) {
     info()->replacement_calculated = true;
-    replacement_ =  replacement;
+    replacement_ = replacement;
     return replacement;  // For convenience.
   }
 
@@ -428,8 +419,8 @@
 // A simple closed interval.
 class Interval {
  public:
-  Interval() : from_(kNone), to_(kNone) { }
-  Interval(intptr_t from, intptr_t to) : from_(from), to_(to) { }
+  Interval() : from_(kNone), to_(kNone) {}
+  Interval(intptr_t from, intptr_t to) : from_(from), to_(to) {}
 
   Interval Union(Interval that) {
     if (that.from_ == kNone)
@@ -457,10 +448,10 @@
 };
 
 
-class SeqRegExpNode: public RegExpNode {
+class SeqRegExpNode : public RegExpNode {
  public:
   explicit SeqRegExpNode(RegExpNode* on_success)
-      : RegExpNode(on_success->zone()), on_success_(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(intptr_t depth, bool ignore_case);
@@ -480,7 +471,7 @@
 };
 
 
-class ActionNode: public SeqRegExpNode {
+class ActionNode : public SeqRegExpNode {
  public:
   enum ActionType {
     SET_REGISTER,
@@ -491,7 +482,8 @@
     EMPTY_MATCH_CHECK,
     CLEAR_CAPTURES
   };
-  static ActionNode* SetRegister(intptr_t reg, intptr_t val,
+  static ActionNode* SetRegister(intptr_t reg,
+                                 intptr_t val,
                                  RegExpNode* on_success);
   static ActionNode* IncrementRegister(intptr_t reg, RegExpNode* on_success);
   static ActionNode* StorePosition(intptr_t reg,
@@ -512,14 +504,15 @@
                                      RegExpNode* on_success);
   virtual void Accept(NodeVisitor* visitor);
   virtual void Emit(RegExpCompiler* compiler, Trace* trace);
-  virtual intptr_t EatsAtLeast(intptr_t still_to_find, intptr_t budget,
+  virtual intptr_t EatsAtLeast(intptr_t still_to_find,
+                               intptr_t budget,
                                bool not_at_start);
   virtual void GetQuickCheckDetails(QuickCheckDetails* details,
                                     RegExpCompiler* compiler,
                                     intptr_t filled_in,
                                     bool not_at_start) {
-    return on_success()->GetQuickCheckDetails(
-        details, compiler, filled_in, not_at_start);
+    return on_success()->GetQuickCheckDetails(details, compiler, filled_in,
+                                              not_at_start);
   }
   virtual void FillInBMInfo(intptr_t offset,
                             intptr_t budget,
@@ -561,28 +554,25 @@
     } u_clear_captures;
   } data_;
   ActionNode(ActionType action_type, RegExpNode* on_success)
-      : SeqRegExpNode(on_success),
-        action_type_(action_type) { }
+      : SeqRegExpNode(on_success), action_type_(action_type) {}
   ActionType action_type_;
   friend class DotPrinter;
 };
 
 
-class TextNode: public SeqRegExpNode {
+class TextNode : public SeqRegExpNode {
  public:
-  TextNode(ZoneGrowableArray<TextElement>* elms,
-           RegExpNode* on_success)
+  TextNode(ZoneGrowableArray<TextElement>* elms, RegExpNode* on_success)
+      : SeqRegExpNode(on_success), elms_(elms) {}
+  TextNode(RegExpCharacterClass* that, RegExpNode* on_success)
       : SeqRegExpNode(on_success),
-        elms_(elms) { }
-  TextNode(RegExpCharacterClass* that,
-           RegExpNode* on_success)
-      : SeqRegExpNode(on_success),
-        elms_(new(zone()) ZoneGrowableArray<TextElement>(1)) {
+        elms_(new (zone()) ZoneGrowableArray<TextElement>(1)) {
     elms_->Add(TextElement::CharClass(that));
   }
   virtual void Accept(NodeVisitor* visitor);
   virtual void Emit(RegExpCompiler* compiler, Trace* trace);
-  virtual intptr_t EatsAtLeast(intptr_t still_to_find, intptr_t budget,
+  virtual intptr_t EatsAtLeast(intptr_t still_to_find,
+                               intptr_t budget,
                                bool not_at_start);
   virtual void GetQuickCheckDetails(QuickCheckDetails* details,
                                     RegExpCompiler* compiler,
@@ -622,7 +612,7 @@
 };
 
 
-class AssertionNode: public SeqRegExpNode {
+class AssertionNode : public SeqRegExpNode {
  public:
   enum AssertionType {
     AT_END,
@@ -632,24 +622,24 @@
     AFTER_NEWLINE
   };
   static AssertionNode* AtEnd(RegExpNode* on_success) {
-    return new(on_success->zone()) AssertionNode(AT_END, 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);
+    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);
+    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);
+    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);
+    return new (on_success->zone()) AssertionNode(AFTER_NEWLINE, on_success);
   }
   virtual void Accept(NodeVisitor* visitor);
   virtual void Emit(RegExpCompiler* compiler, Trace* trace);
-  virtual intptr_t EatsAtLeast(intptr_t still_to_find, intptr_t budget,
+  virtual intptr_t EatsAtLeast(intptr_t still_to_find,
+                               intptr_t budget,
                                bool not_at_start);
   virtual void GetQuickCheckDetails(QuickCheckDetails* details,
                                     RegExpCompiler* compiler,
@@ -668,19 +658,17 @@
                            Trace* trace,
                            IfPrevious backtrack_if_previous);
   AssertionNode(AssertionType t, RegExpNode* on_success)
-      : SeqRegExpNode(on_success), assertion_type_(t) { }
+      : SeqRegExpNode(on_success), assertion_type_(t) {}
   AssertionType assertion_type_;
 };
 
 
-class BackReferenceNode: public SeqRegExpNode {
+class BackReferenceNode : public SeqRegExpNode {
  public:
   BackReferenceNode(intptr_t start_reg,
                     intptr_t end_reg,
                     RegExpNode* on_success)
-      : SeqRegExpNode(on_success),
-        start_reg_(start_reg),
-        end_reg_(end_reg) { }
+      : SeqRegExpNode(on_success), start_reg_(start_reg), end_reg_(end_reg) {}
   virtual void Accept(NodeVisitor* visitor);
   intptr_t start_register() { return start_reg_; }
   intptr_t end_register() { return end_reg_; }
@@ -705,16 +693,18 @@
 };
 
 
-class EndNode: public RegExpNode {
+class EndNode : public RegExpNode {
  public:
   enum Action { ACCEPT, BACKTRACK, NEGATIVE_SUBMATCH_SUCCESS };
   explicit EndNode(Action action, Zone* zone)
-      : RegExpNode(zone), action_(action) { }
+      : RegExpNode(zone), action_(action) {}
   virtual void Accept(NodeVisitor* visitor);
   virtual void Emit(RegExpCompiler* compiler, Trace* trace);
   virtual intptr_t EatsAtLeast(intptr_t still_to_find,
-                          intptr_t recursion_depth,
-                          bool not_at_start) { return 0; }
+                               intptr_t recursion_depth,
+                               bool not_at_start) {
+    return 0;
+  }
   virtual void GetQuickCheckDetails(QuickCheckDetails* details,
                                     RegExpCompiler* compiler,
                                     intptr_t characters_filled_in,
@@ -735,7 +725,7 @@
 };
 
 
-class NegativeSubmatchSuccess: public EndNode {
+class NegativeSubmatchSuccess : public EndNode {
  public:
   NegativeSubmatchSuccess(intptr_t stack_pointer_reg,
                           intptr_t position_reg,
@@ -746,7 +736,7 @@
         stack_pointer_register_(stack_pointer_reg),
         current_position_register_(position_reg),
         clear_capture_count_(clear_capture_count),
-        clear_capture_start_(clear_capture_start) { }
+        clear_capture_start_(clear_capture_start) {}
   virtual void Emit(RegExpCompiler* compiler, Trace* trace);
 
  private:
@@ -757,13 +747,11 @@
 };
 
 
-class Guard: public ZoneAllocated {
+class Guard : public ZoneAllocated {
  public:
   enum Relation { LT, GEQ };
   Guard(intptr_t reg, Relation op, intptr_t value)
-      : reg_(reg),
-        op_(op),
-        value_(value) { }
+      : reg_(reg), op_(op), value_(value) {}
   intptr_t reg() { return reg_; }
   Relation op() { return op_; }
   intptr_t value() { return value_; }
@@ -777,7 +765,7 @@
 
 class GuardedAlternative {
  public:
-  explicit GuardedAlternative(RegExpNode* node) : node_(node), guards_(NULL) { }
+  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; }
@@ -794,23 +782,22 @@
 struct AlternativeGeneration;
 
 
-class ChoiceNode: public RegExpNode {
+class ChoiceNode : public RegExpNode {
  public:
   explicit ChoiceNode(intptr_t expected_size, Zone* zone)
       : RegExpNode(zone),
-        alternatives_(new(zone)
-                      ZoneGrowableArray<GuardedAlternative>(expected_size)),
+        alternatives_(new (zone)
+                          ZoneGrowableArray<GuardedAlternative>(expected_size)),
         not_at_start_(false),
-        being_calculated_(false) { }
+        being_calculated_(false) {}
   virtual void Accept(NodeVisitor* visitor);
-  void AddAlternative(GuardedAlternative node) {
-    alternatives()->Add(node);
-  }
+  void AddAlternative(GuardedAlternative node) { alternatives()->Add(node); }
   ZoneGrowableArray<GuardedAlternative>* alternatives() {
     return alternatives_;
   }
   virtual void Emit(RegExpCompiler* compiler, Trace* trace);
-  virtual intptr_t EatsAtLeast(intptr_t still_to_find, intptr_t budget,
+  virtual intptr_t EatsAtLeast(intptr_t still_to_find,
+                               intptr_t budget,
                                bool not_at_start);
   intptr_t EatsAtLeastHelper(intptr_t still_to_find,
                              intptr_t budget,
@@ -875,7 +862,7 @@
 };
 
 
-class NegativeLookaheadChoiceNode: public ChoiceNode {
+class NegativeLookaheadChoiceNode : public ChoiceNode {
  public:
   explicit NegativeLookaheadChoiceNode(GuardedAlternative this_must_fail,
                                        GuardedAlternative then_do_this,
@@ -884,7 +871,8 @@
     AddAlternative(this_must_fail);
     AddAlternative(then_do_this);
   }
-  virtual intptr_t EatsAtLeast(intptr_t still_to_find, intptr_t budget,
+  virtual intptr_t EatsAtLeast(intptr_t still_to_find,
+                               intptr_t budget,
                                bool not_at_start);
   virtual void GetQuickCheckDetails(QuickCheckDetails* details,
                                     RegExpCompiler* compiler,
@@ -894,8 +882,8 @@
                             intptr_t budget,
                             BoyerMooreLookahead* bm,
                             bool not_at_start) {
-    (*alternatives_)[1].node()->FillInBMInfo(
-        offset, budget - 1, bm, not_at_start);
+    (*alternatives_)[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
@@ -910,17 +898,18 @@
 };
 
 
-class LoopChoiceNode: public ChoiceNode {
+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) { }
+        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 intptr_t EatsAtLeast(intptr_t still_to_find,  intptr_t budget,
+  virtual intptr_t EatsAtLeast(intptr_t still_to_find,
+                               intptr_t budget,
                                bool not_at_start);
   virtual void GetQuickCheckDetails(QuickCheckDetails* details,
                                     RegExpCompiler* compiler,
@@ -997,15 +986,15 @@
 class BoyerMoorePositionInfo : public ZoneAllocated {
  public:
   explicit BoyerMoorePositionInfo(Zone* zone)
-      : map_(new(zone) ZoneGrowableArray<bool>(kMapSize)),
+      : map_(new (zone) ZoneGrowableArray<bool>(kMapSize)),
         map_count_(0),
         w_(kNotYet),
         s_(kNotYet),
         d_(kNotYet),
         surrogate_(kNotYet) {
-     for (intptr_t i = 0; i < kMapSize; i++) {
-       map_->Add(false);
-     }
+    for (intptr_t i = 0; i < kMapSize; i++) {
+      map_->Add(false);
+    }
   }
 
   bool& at(intptr_t i) { return (*map_)[i]; }
@@ -1023,18 +1012,17 @@
 
  private:
   ZoneGrowableArray<bool>* map_;
-  intptr_t 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.
+  intptr_t 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 ZoneAllocated{
+class BoyerMooreLookahead : public ZoneAllocated {
  public:
-  BoyerMooreLookahead(intptr_t length, RegExpCompiler* compiler,
-                      Zone* Zone);
+  BoyerMooreLookahead(intptr_t length, RegExpCompiler* compiler, Zone* Zone);
 
   intptr_t length() { return length_; }
   intptr_t max_char() { return max_char_; }
@@ -1062,12 +1050,11 @@
     }
   }
 
-  void SetAll(intptr_t map_number) {
-    bitmaps_->At(map_number)->SetAll();
-  }
+  void SetAll(intptr_t map_number) { bitmaps_->At(map_number)->SetAll(); }
 
   void SetRest(intptr_t from_map) {
-    for (intptr_t i = from_map; i < length_; i++) SetAll(i);
+    for (intptr_t i = from_map; i < length_; i++)
+      SetAll(i);
   }
   void EmitSkipInstructions(RegExpMacroAssembler* masm);
 
@@ -1086,10 +1073,10 @@
                         intptr_t max_lookahead,
                         const TypedData& boolean_skip_table);
   bool FindWorthwhileInterval(intptr_t* from, intptr_t* to);
-  intptr_t FindBestInterval(
-      intptr_t max_number_of_chars,
-      intptr_t old_biggest_points,
-      intptr_t* from, intptr_t* to);
+  intptr_t FindBestInterval(intptr_t max_number_of_chars,
+                            intptr_t old_biggest_points,
+                            intptr_t* from,
+                            intptr_t* to);
 };
 
 
@@ -1108,18 +1095,17 @@
  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
-  };
+  enum TriBool { UNKNOWN = -1, FALSE_VALUE = 0, TRUE_VALUE = 1 };
 
   class DeferredAction {
    public:
     DeferredAction(ActionNode::ActionType action_type, intptr_t reg)
-        : action_type_(action_type), reg_(reg), next_(NULL) { }
+        : action_type_(action_type), reg_(reg), next_(NULL) {}
     DeferredAction* next() { return next_; }
     bool Mentions(intptr_t reg);
     intptr_t reg() { return reg_; }
     ActionNode::ActionType action_type() { return action_type_; }
+
    private:
     ActionNode::ActionType action_type_;
     intptr_t reg_;
@@ -1134,9 +1120,10 @@
     DeferredCapture(intptr_t reg, bool is_capture, Trace* trace)
         : DeferredAction(ActionNode::STORE_POSITION, reg),
           cp_offset_(trace->cp_offset()),
-          is_capture_(is_capture) { }
+          is_capture_(is_capture) {}
     intptr_t cp_offset() { return cp_offset_; }
     bool is_capture() { return is_capture_; }
+
    private:
     intptr_t cp_offset_;
     bool is_capture_;
@@ -1146,9 +1133,9 @@
   class DeferredSetRegister : public DeferredAction {
    public:
     DeferredSetRegister(intptr_t reg, intptr_t value)
-        : DeferredAction(ActionNode::SET_REGISTER, reg),
-          value_(value) { }
+        : DeferredAction(ActionNode::SET_REGISTER, reg), value_(value) {}
     intptr_t value() { return value_; }
+
    private:
     intptr_t value_;
   };
@@ -1156,9 +1143,9 @@
   class DeferredClearCaptures : public DeferredAction {
    public:
     explicit DeferredClearCaptures(Interval range)
-        : DeferredAction(ActionNode::CLEAR_CAPTURES, -1),
-          range_(range) { }
+        : DeferredAction(ActionNode::CLEAR_CAPTURES, -1), range_(range) {}
     Interval range() { return range_; }
+
    private:
     Interval range_;
   };
@@ -1166,7 +1153,7 @@
   class DeferredIncrementRegister : public DeferredAction {
    public:
     explicit DeferredIncrementRegister(intptr_t reg)
-        : DeferredAction(ActionNode::INCREMENT_REGISTER, reg) { }
+        : DeferredAction(ActionNode::INCREMENT_REGISTER, reg) {}
   };
 
   Trace()
@@ -1178,7 +1165,7 @@
         characters_preloaded_(0),
         bound_checked_up_to_(0),
         flush_budget_(100),
-        at_start_(UNKNOWN) { }
+        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
@@ -1198,13 +1185,9 @@
   // 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;
+    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) {
@@ -1289,9 +1272,7 @@
   bool preload_has_checked_bounds_;
   intptr_t preload_characters_;
   intptr_t eats_at_least_;
-  void init() {
-    eats_at_least_ = kEatsAtLeastNotYetInitialized;
-  }
+  void init() { eats_at_least_ = kEatsAtLeastNotYetInitialized; }
 
   DISALLOW_ALLOCATION();
 };
@@ -1299,10 +1280,9 @@
 
 class NodeVisitor : public ValueObject {
  public:
-  virtual ~NodeVisitor() { }
-#define DECLARE_VISIT(Type)                                          \
-  virtual void Visit##Type(Type##Node* that) = 0;
-FOR_EACH_NODE_TYPE(DECLARE_VISIT)
+  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); }
 };
@@ -1320,17 +1300,16 @@
 //   +-------+  --->  +------------+
 //   | word? |        | check word |
 //   +-------+        +------------+
-class Analysis: public NodeVisitor {
+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) { }
+        error_message_(NULL) {}
   void EnsureAnalyzed(RegExpNode* node);
 
-#define DECLARE_VISIT(Type)                                          \
-  virtual void Visit##Type(Type##Node* that);
-FOR_EACH_NODE_TYPE(DECLARE_VISIT)
+#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);
 
@@ -1339,9 +1318,7 @@
     ASSERT(error_message_ != NULL);
     return error_message_;
   }
-  void fail(const char* error_message) {
-    error_message_ = error_message;
-  }
+  void fail(const char* error_message) { error_message_ = error_message; }
 
  private:
   bool ignore_case_;
@@ -1354,12 +1331,12 @@
 
 struct RegExpCompileData : public ZoneAllocated {
   RegExpCompileData()
-    : tree(NULL),
-      node(NULL),
-      simple(true),
-      contains_anchor(false),
-      error(String::Handle(String::null())),
-      capture_count(0) { }
+      : tree(NULL),
+        node(NULL),
+        simple(true),
+        contains_anchor(false),
+        error(String::Handle(String::null())),
+        capture_count(0) {}
   RegExpTree* tree;
   RegExpNode* node;
   bool simple;
@@ -1369,7 +1346,7 @@
 };
 
 
-class RegExpEngine: public AllStatic {
+class RegExpEngine : public AllStatic {
  public:
   struct CompilationResult {
     explicit CompilationResult(const char* error_message)
@@ -1395,12 +1372,12 @@
                       intptr_t num_blocks,
                       intptr_t num_stack_locals,
                       intptr_t num_registers)
-      : backtrack_goto(backtrack_goto),
-        graph_entry(graph_entry),
-        num_blocks(num_blocks),
-        num_stack_locals(num_stack_locals),
-        error_message(NULL),
-        bytecode(NULL) {}
+        : backtrack_goto(backtrack_goto),
+          graph_entry(graph_entry),
+          num_blocks(num_blocks),
+          num_stack_locals(num_stack_locals),
+          error_message(NULL),
+          bytecode(NULL) {}
 
     IndirectGotoInstr* backtrack_goto;
     GraphEntryInstr* graph_entry;
@@ -1418,17 +1395,15 @@
       const ParsedFunction* parsed_function,
       const ZoneGrowableArray<const ICData*>& ic_data_array);
 
-  static CompilationResult CompileBytecode(
-      RegExpCompileData* data,
-      const RegExp& regexp,
-      bool is_one_byte,
-      Zone* zone);
+  static CompilationResult CompileBytecode(RegExpCompileData* data,
+                                           const RegExp& regexp,
+                                           bool is_one_byte,
+                                           Zone* zone);
 
-  static RawRegExp* CreateRegExp(
-      Thread* thread,
-      const String& pattern,
-      bool multi_line,
-      bool ignore_case);
+  static RawRegExp* CreateRegExp(Thread* thread,
+                                 const String& pattern,
+                                 bool multi_line,
+                                 bool ignore_case);
 
   static void DotPrint(const char* label, RegExpNode* node, bool ignore_case);
 };
diff --git a/runtime/vm/regexp_assembler.cc b/runtime/vm/regexp_assembler.cc
index c916c70..df8a650 100644
--- a/runtime/vm/regexp_assembler.cc
+++ b/runtime/vm/regexp_assembler.cc
@@ -10,10 +10,7 @@
 namespace dart {
 
 BlockLabel::BlockLabel()
-    : block_(NULL),
-      is_bound_(false),
-      is_linked_(false),
-      pos_(-1) {
+    : block_(NULL), is_bound_(false), is_linked_(false), pos_(-1) {
   if (!FLAG_interpret_irregexp) {
     // Only needed by the compiled IR backend.
     block_ = new JoinEntryInstr(-1, -1);
@@ -22,13 +19,9 @@
 
 
 RegExpMacroAssembler::RegExpMacroAssembler(Zone* zone)
-  : slow_safe_compiler_(false),
-    global_mode_(NOT_GLOBAL),
-    zone_(zone) {
-}
+    : slow_safe_compiler_(false), global_mode_(NOT_GLOBAL), zone_(zone) {}
 
 
-RegExpMacroAssembler::~RegExpMacroAssembler() {
-}
+RegExpMacroAssembler::~RegExpMacroAssembler() {}
 
 }  // namespace dart
diff --git a/runtime/vm/regexp_assembler.h b/runtime/vm/regexp_assembler.h
index 399ae7f..1a12789 100644
--- a/runtime/vm/regexp_assembler.h
+++ b/runtime/vm/regexp_assembler.h
@@ -31,9 +31,7 @@
   }
 
   bool IsLinked() const { return !is_bound_ && is_linked_; }
-  void SetLinked() {
-    is_linked_ = true;
-  }
+  void SetLinked() { is_linked_ = true; }
 
   intptr_t Position() const {
     ASSERT(IsBound());
@@ -48,13 +46,9 @@
 
   // Used by the bytecode assembler.
  public:
-  ~BlockLabel() {
-    ASSERT(!is_linked());
-  }
+  ~BlockLabel() { ASSERT(!is_linked()); }
 
-  intptr_t pos() const {
-    return pos_;
-  }
+  intptr_t pos() const { return pos_; }
   bool is_bound() const { return IsBound(); }
   bool is_linked() const { return IsLinked(); }
 
@@ -101,10 +95,7 @@
     kParamCount
   };
 
-  enum IrregexpImplementation {
-    kBytecodeImplementation,
-    kIRImplementation
-  };
+  enum IrregexpImplementation { kBytecodeImplementation, kIRImplementation };
 
   explicit RegExpMacroAssembler(Zone* zone);
   virtual ~RegExpMacroAssembler();
@@ -132,8 +123,8 @@
   virtual void CheckCharacterLT(uint16_t limit, BlockLabel* on_less) = 0;
   virtual void CheckGreedyLoop(BlockLabel* on_tos_equals_current_position) = 0;
   virtual void CheckNotAtStart(BlockLabel* on_not_at_start) = 0;
-  virtual void CheckNotBackReference(
-      intptr_t start_reg, BlockLabel* on_no_match) = 0;
+  virtual void CheckNotBackReference(intptr_t start_reg,
+                                     BlockLabel* on_no_match) = 0;
   virtual void CheckNotBackReferenceIgnoreCase(intptr_t start_reg,
                                                BlockLabel* on_no_match) = 0;
   // Check the current character for a match with a literal character.  If we
@@ -178,12 +169,14 @@
   virtual void Fail() = 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(
-      intptr_t reg, intptr_t comparand, BlockLabel* if_ge) = 0;
+  virtual void IfRegisterGE(intptr_t reg,
+                            intptr_t comparand,
+                            BlockLabel* 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(
-      intptr_t reg, intptr_t comparand, BlockLabel* if_lt) = 0;
+  virtual void IfRegisterLT(intptr_t reg,
+                            intptr_t comparand,
+                            BlockLabel* if_lt) = 0;
   // Check whether a register is == to the current position and go to a
   // label if it is.
   virtual void IfRegisterEqPos(intptr_t reg, BlockLabel* if_eq) = 0;
@@ -213,8 +206,8 @@
   virtual void SetRegister(intptr_t register_index, intptr_t to) = 0;
   // Return whether the matching (with a global regexp) will be restarted.
   virtual bool Succeed() = 0;
-  virtual void WriteCurrentPositionToRegister(
-      intptr_t reg, intptr_t cp_offset) = 0;
+  virtual void WriteCurrentPositionToRegister(intptr_t reg,
+                                              intptr_t cp_offset) = 0;
   virtual void ClearRegisters(intptr_t reg_from, intptr_t reg_to) = 0;
   virtual void WriteStackPointerToRegister(intptr_t reg) = 0;
 
@@ -227,9 +220,7 @@
   // 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;
-  }
+  inline bool global_with_zero_length_check() { return global_mode_ == GLOBAL; }
 
   Zone* zone() const { return zone_; }
 
diff --git a/runtime/vm/regexp_assembler_bytecode.cc b/runtime/vm/regexp_assembler_bytecode.cc
index 986c0e3..a67c37b 100644
--- a/runtime/vm/regexp_assembler_bytecode.cc
+++ b/runtime/vm/regexp_assembler_bytecode.cc
@@ -22,7 +22,7 @@
     : RegExpMacroAssembler(zone),
       buffer_(buffer),
       pc_(0),
-      advance_current_end_(kInvalidPC) { }
+      advance_current_end_(kInvalidPC) {}
 
 
 BytecodeRegExpMacroAssembler::~BytecodeRegExpMacroAssembler() {
@@ -81,7 +81,8 @@
 
 
 void BytecodeRegExpMacroAssembler::WriteCurrentPositionToRegister(
-    intptr_t register_index, intptr_t cp_offset) {
+    intptr_t register_index,
+    intptr_t cp_offset) {
   ASSERT(register_index >= 0);
   ASSERT(register_index <= kMaxRegister);
   Emit(BC_SET_REGISTER_TO_CP, register_index);
@@ -204,7 +205,7 @@
 
 
 void BytecodeRegExpMacroAssembler::CheckGreedyLoop(
-      BlockLabel* on_tos_equals_current_position) {
+    BlockLabel* on_tos_equals_current_position) {
   Emit(BC_CHECK_GREEDY, 0);
   EmitOrLink(on_tos_equals_current_position);
 }
@@ -356,8 +357,8 @@
 }
 
 
-void BytecodeRegExpMacroAssembler::CheckBitInTable(
-    const TypedData& table, BlockLabel* on_bit_set) {
+void BytecodeRegExpMacroAssembler::CheckBitInTable(const TypedData& table,
+                                                   BlockLabel* on_bit_set) {
   Emit(BC_CHECK_BIT_IN_TABLE, 0);
   EmitOrLink(on_bit_set);
   for (int i = 0; i < kTableSize; i += kBitsPerByte) {
@@ -449,28 +450,30 @@
   buffer_->Add(0);
   buffer_->Add(0);
   intptr_t x = buffer_->length();
-  for (intptr_t i = 0; i < x; i++) buffer_->Add(0);
+  for (intptr_t i = 0; i < x; i++)
+    buffer_->Add(0);
 }
 
 
 static intptr_t Prepare(const RegExp& regexp,
                         const String& subject,
                         Zone* zone) {
-  bool is_one_byte = subject.IsOneByteString() ||
-                     subject.IsExternalOneByteString();
+  bool is_one_byte =
+      subject.IsOneByteString() || subject.IsExternalOneByteString();
 
   if (regexp.bytecode(is_one_byte) == TypedData::null()) {
     const String& pattern = String::Handle(zone, regexp.pattern());
-    NOT_IN_PRODUCT(TimelineDurationScope tds(Thread::Current(),
-                                             Timeline::GetCompilerStream(),
-                                             "CompileIrregexpBytecode");
+#if !defined(PRODUCT)
+    TimelineDurationScope tds(Thread::Current(), Timeline::GetCompilerStream(),
+                              "CompileIrregexpBytecode");
     if (tds.enabled()) {
       tds.SetNumArguments(1);
       tds.CopyArgument(0, "pattern", pattern.ToCString());
-    });  // !PRODUCT
+    }
+#endif  // !defined(PRODUCT)
 
     const bool multiline = regexp.is_multi_line();
-    RegExpCompileData* compile_data = new(zone) RegExpCompileData();
+    RegExpCompileData* compile_data = new (zone) RegExpCompileData();
     if (!RegExpParser::ParseRegExp(pattern, multiline, compile_data)) {
       // Parsing failures are handled in the RegExp factory constructor.
       UNREACHABLE();
@@ -505,15 +508,15 @@
                                                    int32_t* output,
                                                    intptr_t output_size,
                                                    Zone* zone) {
-  bool is_one_byte = subject.IsOneByteString() ||
-                     subject.IsExternalOneByteString();
+  bool is_one_byte =
+      subject.IsOneByteString() || subject.IsExternalOneByteString();
 
   ASSERT(regexp.num_bracket_expressions() != Smi::null());
 
   // We must have done EnsureCompiledIrregexp, so we can get the number of
   // registers.
   int number_of_capture_registers =
-     (Smi::Value(regexp.num_bracket_expressions()) + 1) * 2;
+      (Smi::Value(regexp.num_bracket_expressions()) + 1) * 2;
   int32_t* raw_output = &output[number_of_capture_registers];
 
   // We do not touch the actual capture result registers until we know there
@@ -558,21 +561,17 @@
   // V8 uses a shared copy on the isolate when smaller than some threshold.
   int32_t* output_registers = zone->Alloc<int32_t>(required_registers);
 
-  IrregexpInterpreter::IrregexpResult result = ExecRaw(regexp,
-                                                       subject,
-                                                       start_index.Value(),
-                                                       output_registers,
-                                                       required_registers,
-                                                       zone);
+  IrregexpInterpreter::IrregexpResult result =
+      ExecRaw(regexp, subject, start_index.Value(), output_registers,
+              required_registers, zone);
 
   if (result == IrregexpInterpreter::RE_SUCCESS) {
     intptr_t capture_count = Smi::Value(regexp.num_bracket_expressions());
     intptr_t capture_register_count = (capture_count + 1) * 2;
     ASSERT(required_registers >= capture_register_count);
 
-    const TypedData& result =
-        TypedData::Handle(TypedData::New(kTypedDataInt32ArrayCid,
-                                         capture_register_count));
+    const TypedData& result = TypedData::Handle(
+        TypedData::New(kTypedDataInt32ArrayCid, capture_register_count));
     {
 #ifdef DEBUG
       // These indices will be used with substring operations that don't check
@@ -584,8 +583,7 @@
 #endif
 
       NoSafepointScope no_safepoint;
-      memmove(result.DataAddr(0),
-              output_registers,
+      memmove(result.DataAddr(0), output_registers,
               capture_register_count * sizeof(int32_t));
     }
 
diff --git a/runtime/vm/regexp_assembler_bytecode.h b/runtime/vm/regexp_assembler_bytecode.h
index eec47a4..e8d6174 100644
--- a/runtime/vm/regexp_assembler_bytecode.h
+++ b/runtime/vm/regexp_assembler_bytecode.h
@@ -10,7 +10,7 @@
 
 namespace dart {
 
-class BytecodeRegExpMacroAssembler: public RegExpMacroAssembler {
+class BytecodeRegExpMacroAssembler : public RegExpMacroAssembler {
  public:
   // Create an assembler. Instructions and relocation information are emitted
   // into a buffer, with the instructions starting from the beginning and the
@@ -25,8 +25,7 @@
   // for code generation and assumes its size to be buffer_size. If the buffer
   // is too small, a fatal error occurs. No deallocation of the buffer is done
   // upon destruction of the assembler.
-  BytecodeRegExpMacroAssembler(ZoneGrowableArray<uint8_t>* buffer,
-                               Zone* zone);
+  BytecodeRegExpMacroAssembler(ZoneGrowableArray<uint8_t>* buffer, Zone* zone);
   virtual ~BytecodeRegExpMacroAssembler();
 
   // The byte-code interpreter checks on each push anyway.
@@ -101,7 +100,7 @@
     // extra goto.
     return true;
   }
-  virtual void Print(const char* str)  { UNIMPLEMENTED(); }
+  virtual void Print(const char* str) { UNIMPLEMENTED(); }
   virtual void PrintBlocks() { UNIMPLEMENTED(); }
   /////
 
diff --git a/runtime/vm/regexp_assembler_bytecode_inl.h b/runtime/vm/regexp_assembler_bytecode_inl.h
index d3855c7..d2fe476 100644
--- a/runtime/vm/regexp_assembler_bytecode_inl.h
+++ b/runtime/vm/regexp_assembler_bytecode_inl.h
@@ -15,7 +15,7 @@
                                         uint32_t twenty_four_bits) {
   uint32_t word = ((twenty_four_bits << BYTECODE_SHIFT) | byte);
   ASSERT(pc_ <= buffer_->length());
-  if (pc_  + 3 >= buffer_->length()) {
+  if (pc_ + 3 >= buffer_->length()) {
     Expand();
   }
   *reinterpret_cast<uint32_t*>(buffer_->data() + pc_) = word;
diff --git a/runtime/vm/regexp_assembler_ir.cc b/runtime/vm/regexp_assembler_ir.cc
index 24a1468..efb9d64 100644
--- a/runtime/vm/regexp_assembler_ir.cc
+++ b/runtime/vm/regexp_assembler_ir.cc
@@ -21,14 +21,20 @@
 
 // Debugging output macros. TAG() is called at the head of each interesting
 // function and prints its name during execution if irregexp tracing is enabled.
-#define TAG() if (FLAG_trace_irregexp) { TAG_(); }
-#define TAG_() \
-  Print(PushArgument( \
-    Bind(new(Z) ConstantInstr(String::ZoneHandle(Z, String::Concat( \
-        String::Handle(String::New("TAG: ")), \
-        String::Handle(String::New(__FUNCTION__)), Heap::kOld))))));
+#define TAG()                                                                  \
+  if (FLAG_trace_irregexp) {                                                   \
+    TAG_();                                                                    \
+  }
+#define TAG_()                                                                 \
+  Print(PushArgument(Bind(new (Z) ConstantInstr(String::ZoneHandle(            \
+      Z, String::Concat(String::Handle(String::New("TAG: ")),                  \
+                        String::Handle(String::New(__FUNCTION__)),             \
+                        Heap::kOld))))));
 
-#define PRINT(arg) if (FLAG_trace_irregexp) { Print(arg); }
+#define PRINT(arg)                                                             \
+  if (FLAG_trace_irregexp) {                                                   \
+    Print(arg);                                                                \
+  }
 
 namespace dart {
 
@@ -40,8 +46,8 @@
 
 
 void PrintUtf16(uint16_t c) {
-  const char* format = (0x20 <= c && c <= 0x7F) ?
-        "%c" : (c <= 0xff) ? "\\x%02x" : "\\u%04x";
+  const char* format =
+      (0x20 <= c && c <= 0x7F) ? "%c" : (c <= 0xff) ? "\\x%02x" : "\\u%04x";
   OS::Print(format, c);
 }
 
@@ -92,10 +98,15 @@
       registers_array_(TypedData::ZoneHandle(zone, TypedData::null())) {
   switch (specialization_cid) {
     case kOneByteStringCid:
-    case kExternalOneByteStringCid: mode_ = ASCII; break;
+    case kExternalOneByteStringCid:
+      mode_ = ASCII;
+      break;
     case kTwoByteStringCid:
-    case kExternalTwoByteStringCid: mode_ = UC16; break;
-    default: UNREACHABLE();
+    case kExternalTwoByteStringCid:
+      mode_ = UC16;
+      break;
+    default:
+      UNREACHABLE();
   }
 
   InitializeLocals();
@@ -103,23 +114,22 @@
   // Allocate an initial stack backing of the minimum stack size. The stack
   // backing is indirectly referred to so we can reuse it on subsequent matches
   // even in the case where the backing has been enlarged and thus reallocated.
-  stack_array_cell_.SetAt(0, TypedData::Handle(zone,
-    TypedData::New(kTypedDataInt32ArrayCid, kMinStackSize / 4, Heap::kOld)));
+  stack_array_cell_.SetAt(
+      0,
+      TypedData::Handle(zone, TypedData::New(kTypedDataInt32ArrayCid,
+                                             kMinStackSize / 4, Heap::kOld)));
 
   // Create and generate all preset blocks.
-  entry_block_ =
-      new(zone) GraphEntryInstr(
-        *parsed_function_,
-        new(zone) TargetEntryInstr(block_id_.Alloc(), kInvalidTryIndex),
-        Compiler::kNoOSRDeoptId);
-  start_block_ =
-      new(zone) JoinEntryInstr(block_id_.Alloc(), kInvalidTryIndex);
+  entry_block_ = new (zone) GraphEntryInstr(
+      *parsed_function_,
+      new (zone) TargetEntryInstr(block_id_.Alloc(), kInvalidTryIndex),
+      Compiler::kNoOSRDeoptId);
+  start_block_ = new (zone) JoinEntryInstr(block_id_.Alloc(), kInvalidTryIndex);
   success_block_ =
-      new(zone) JoinEntryInstr(block_id_.Alloc(), kInvalidTryIndex);
+      new (zone) JoinEntryInstr(block_id_.Alloc(), kInvalidTryIndex);
   backtrack_block_ =
-      new(zone) JoinEntryInstr(block_id_.Alloc(), kInvalidTryIndex);
-  exit_block_ =
-      new(zone) JoinEntryInstr(block_id_.Alloc(), kInvalidTryIndex);
+      new (zone) JoinEntryInstr(block_id_.Alloc(), kInvalidTryIndex);
+  exit_block_ = new (zone) JoinEntryInstr(block_id_.Alloc(), kInvalidTryIndex);
 
   GenerateEntryBlock();
   GenerateSuccessBlock();
@@ -137,7 +147,7 @@
 }
 
 
-IRRegExpMacroAssembler::~IRRegExpMacroAssembler() { }
+IRRegExpMacroAssembler::~IRRegExpMacroAssembler() {}
 
 
 void IRRegExpMacroAssembler::InitializeLocals() {
@@ -175,12 +185,10 @@
   // Store string.length.
   PushArgumentInstr* string_push = PushLocal(string_param_);
 
-  StoreLocal(
-      string_param_length_,
-      Bind(InstanceCall(
-          InstanceCallDescriptor(
-              String::ZoneHandle(Field::GetterSymbol(Symbols::Length()))),
-          string_push)));
+  StoreLocal(string_param_length_,
+             Bind(InstanceCall(InstanceCallDescriptor(String::ZoneHandle(
+                                   Field::GetterSymbol(Symbols::Length()))),
+                               string_push)));
 
   // Store (start_index - string.length) as the current position (since it's a
   // negative offset from the end of the string).
@@ -191,16 +199,16 @@
 
   // Generate a local list variable to represent "registers" and
   // initialize capture registers (others remain garbage).
-  StoreLocal(registers_, Bind(new(Z) ConstantInstr(registers_array_)));
+  StoreLocal(registers_, Bind(new (Z) ConstantInstr(registers_array_)));
   ClearRegisters(0, saved_registers_count_ - 1);
 
   // Generate a local list variable to represent the backtracking stack.
   PushArgumentInstr* stack_cell_push =
-      PushArgument(Bind(new(Z) ConstantInstr(stack_array_cell_)));
-  StoreLocal(stack_, Bind(InstanceCall(
-      InstanceCallDescriptor::FromToken(Token::kINDEX),
-      stack_cell_push,
-      PushArgument(Bind(Uint64Constant(0))))));
+      PushArgument(Bind(new (Z) ConstantInstr(stack_array_cell_)));
+  StoreLocal(stack_,
+             Bind(InstanceCall(InstanceCallDescriptor::FromToken(Token::kINDEX),
+                               stack_cell_push,
+                               PushArgument(Bind(Uint64Constant(0))))));
   StoreLocal(stack_pointer_, Bind(Int64Constant(-1)));
 
   // Jump to the start block.
@@ -215,19 +223,18 @@
 
   const intptr_t entries_count = entry_block_->indirect_entries().length();
 
-  TypedData& offsets = TypedData::ZoneHandle(Z,
-      TypedData::New(kTypedDataInt32ArrayCid, entries_count, Heap::kOld));
+  TypedData& offsets = TypedData::ZoneHandle(
+      Z, TypedData::New(kTypedDataInt32ArrayCid, entries_count, Heap::kOld));
 
   PushArgumentInstr* block_offsets_push =
-      PushArgument(Bind(new(Z) ConstantInstr(offsets)));
+      PushArgument(Bind(new (Z) ConstantInstr(offsets)));
   PushArgumentInstr* block_id_push = PushArgument(Bind(PopStack()));
 
   Value* offset_value =
       Bind(InstanceCall(InstanceCallDescriptor::FromToken(Token::kINDEX),
-                        block_offsets_push,
-                        block_id_push));
+                        block_offsets_push, block_id_push));
 
-  backtrack_goto_ = new(Z) IndirectGotoInstr(&offsets, offset_value);
+  backtrack_goto_ = new (Z) IndirectGotoInstr(&offsets, offset_value);
   CloseBlockWith(backtrack_goto_);
 
   // Add an edge from the "indirect" goto to each of the targets.
@@ -242,11 +249,11 @@
   set_current_instruction(success_block_);
   TAG();
 
-  Value* type = Bind(new(Z) ConstantInstr(
+  Value* type = Bind(new (Z) ConstantInstr(
       TypeArguments::ZoneHandle(Z, TypeArguments::null())));
   Value* length = Bind(Uint64Constant(saved_registers_count_));
-  Value* array = Bind(new(Z) CreateArrayInstr(
-      TokenPosition::kNoSource, type, length));
+  Value* array =
+      Bind(new (Z) CreateArrayInstr(TokenPosition::kNoSource, type, length));
   StoreLocal(result_, array);
 
   // Store captured offsets in the `matches` parameter.
@@ -262,17 +269,15 @@
         PushArgument(Bind(Add(offset_push, len_push)));
 
     Do(InstanceCall(InstanceCallDescriptor::FromToken(Token::kASSIGN_INDEX),
-                    matches_push,
-                    index_push,
-                    value_push));
+                    matches_push, index_push, value_push));
   }
 
   // Print the result if tracing.
   PRINT(PushLocal(result_));
 
   // Return true on success.
-  AppendInstruction(new(Z) ReturnInstr(
-      TokenPosition::kNoSource, Bind(LoadLocal(result_))));
+  AppendInstruction(
+      new (Z) ReturnInstr(TokenPosition::kNoSource, Bind(LoadLocal(result_))));
 }
 
 
@@ -281,8 +286,8 @@
   TAG();
 
   // Return false on failure.
-  AppendInstruction(new(Z) ReturnInstr(
-      TokenPosition::kNoSource, Bind(LoadLocal(result_))));
+  AppendInstruction(
+      new (Z) ReturnInstr(TokenPosition::kNoSource, Bind(LoadLocal(result_))));
 }
 
 
@@ -293,8 +298,7 @@
 }
 
 
-#if defined(TARGET_ARCH_ARM64) ||                                              \
-    defined(TARGET_ARCH_ARM) ||                                                \
+#if defined(TARGET_ARCH_ARM64) || defined(TARGET_ARCH_ARM) ||                  \
     defined(TARGET_ARCH_MIPS)
 // Disabling unaligned accesses forces the regexp engine to load characters one
 // by one instead of up to 4 at once, along with the associated performance hit.
@@ -310,11 +314,10 @@
 }
 
 
-RawArray* IRRegExpMacroAssembler::Execute(
-    const RegExp& regexp,
-    const String& input,
-    const Smi& start_offset,
-    Zone* zone) {
+RawArray* IRRegExpMacroAssembler::Execute(const RegExp& regexp,
+                                          const String& input,
+                                          const Smi& start_offset,
+                                          Zone* zone) {
   const intptr_t cid = input.GetClassId();
   const Function& fun = Function::Handle(regexp.function(cid));
   ASSERT(!fun.IsNull());
@@ -362,10 +365,10 @@
     int32_t c1 = str.CharAt(lhs_index.Value() + i);
     int32_t c2 = str.CharAt(rhs_index.Value() + i);
     if (c1 != c2) {
-      int32_t s1[1] = { c1 };
+      int32_t s1[1] = {c1};
       canonicalize.get(c1, '\0', s1);
       if (s1[0] != c2) {
-        int32_t s2[1] = { c2 };
+        int32_t s2[1] = {c2};
         canonicalize.get(c2, '\0', s2);
         if (s1[0] != s2[0]) {
           return Bool::False().raw();
@@ -378,17 +381,17 @@
 
 
 DEFINE_RAW_LEAF_RUNTIME_ENTRY(
-    CaseInsensitiveCompareUC16, 4, false /* is_float */,
+    CaseInsensitiveCompareUC16,
+    4,
+    false /* is_float */,
     reinterpret_cast<RuntimeFunction>(&CaseInsensitiveCompareUC16));
 
 
 LocalVariable* IRRegExpMacroAssembler::Parameter(const String& name,
                                                  intptr_t index) const {
-  LocalVariable* local = new(Z) LocalVariable(
-      TokenPosition::kNoSource,
-      TokenPosition::kNoSource,
-      name,
-      Object::dynamic_type());
+  LocalVariable* local =
+      new (Z) LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
+                            name, Object::dynamic_type());
 
   intptr_t param_frame_index = kParamEndSlotFromFp + kParamCount - index;
   local->set_index(param_frame_index);
@@ -398,11 +401,9 @@
 
 
 LocalVariable* IRRegExpMacroAssembler::Local(const String& name) {
-  LocalVariable* local = new(Z) LocalVariable(
-      TokenPosition::kNoSource,
-      TokenPosition::kNoSource,
-      name,
-      Object::dynamic_type());
+  LocalVariable* local =
+      new (Z) LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
+                            name, Object::dynamic_type());
   local->set_index(GetNextLocalIndex());
 
   return local;
@@ -410,33 +411,34 @@
 
 
 ConstantInstr* IRRegExpMacroAssembler::Int64Constant(int64_t value) const {
-  return new(Z) ConstantInstr(
-        Integer::ZoneHandle(Z, Integer::New(value, Heap::kOld)));
+  return new (Z)
+      ConstantInstr(Integer::ZoneHandle(Z, Integer::New(value, Heap::kOld)));
 }
 
 
 ConstantInstr* IRRegExpMacroAssembler::Uint64Constant(uint64_t value) const {
-  return new(Z) ConstantInstr(
-        Integer::ZoneHandle(Z, Integer::NewFromUint64(value, Heap::kOld)));
+  return new (Z) ConstantInstr(
+      Integer::ZoneHandle(Z, Integer::NewFromUint64(value, Heap::kOld)));
 }
 
 
 ConstantInstr* IRRegExpMacroAssembler::BoolConstant(bool value) const {
-  return new(Z) ConstantInstr(value ? Bool::True() : Bool::False());
+  return new (Z) ConstantInstr(value ? Bool::True() : Bool::False());
 }
 
 
 ConstantInstr* IRRegExpMacroAssembler::StringConstant(const char* value) const {
-  return new(Z) ConstantInstr(
-        String::ZoneHandle(Z, String::New(value, Heap::kOld)));
+  return new (Z)
+      ConstantInstr(String::ZoneHandle(Z, String::New(value, Heap::kOld)));
 }
 
 
 ConstantInstr* IRRegExpMacroAssembler::WordCharacterMapConstant() const {
   const Library& lib = Library::Handle(Z, Library::CoreLibrary());
-  const Class& regexp_class = Class::Handle(Z,
-        lib.LookupClassAllowPrivate(Symbols::_RegExp()));
-  const Field& word_character_field = Field::ZoneHandle(Z,
+  const Class& regexp_class =
+      Class::Handle(Z, lib.LookupClassAllowPrivate(Symbols::_RegExp()));
+  const Field& word_character_field = Field::ZoneHandle(
+      Z,
       regexp_class.LookupStaticFieldAllowPrivate(Symbols::_wordCharacterMap()));
   ASSERT(!word_character_field.IsNull());
 
@@ -446,54 +448,53 @@
   }
   ASSERT(!word_character_field.IsUninitialized());
 
-  return new(Z) ConstantInstr(
-        Instance::ZoneHandle(Z, word_character_field.StaticValue()));
+  return new (Z) ConstantInstr(
+      Instance::ZoneHandle(Z, word_character_field.StaticValue()));
 }
 
 
-ComparisonInstr* IRRegExpMacroAssembler::Comparison(
-    ComparisonKind kind, PushArgumentInstr* lhs, PushArgumentInstr* rhs) {
+ComparisonInstr* IRRegExpMacroAssembler::Comparison(ComparisonKind kind,
+                                                    PushArgumentInstr* lhs,
+                                                    PushArgumentInstr* rhs) {
   Token::Kind strict_comparison = Token::kEQ_STRICT;
   Token::Kind intermediate_operator = Token::kILLEGAL;
   switch (kind) {
-  case kEQ:
-    intermediate_operator = Token::kEQ;
-    break;
-  case kNE:
-    intermediate_operator = Token::kEQ;
-    strict_comparison = Token::kNE_STRICT;
-    break;
-  case kLT:
-    intermediate_operator = Token::kLT;
-    break;
-  case kGT:
-    intermediate_operator = Token::kGT;
-    break;
-  case kLTE:
-    intermediate_operator = Token::kLTE;
-    break;
-  case kGTE:
-    intermediate_operator = Token::kGTE;
-    break;
-  default:
-    UNREACHABLE();
+    case kEQ:
+      intermediate_operator = Token::kEQ;
+      break;
+    case kNE:
+      intermediate_operator = Token::kEQ;
+      strict_comparison = Token::kNE_STRICT;
+      break;
+    case kLT:
+      intermediate_operator = Token::kLT;
+      break;
+    case kGT:
+      intermediate_operator = Token::kGT;
+      break;
+    case kLTE:
+      intermediate_operator = Token::kLTE;
+      break;
+    case kGTE:
+      intermediate_operator = Token::kGTE;
+      break;
+    default:
+      UNREACHABLE();
   }
 
   ASSERT(intermediate_operator != Token::kILLEGAL);
 
-  Value* lhs_value =
-      Bind(InstanceCall(
-             InstanceCallDescriptor::FromToken(intermediate_operator),
-             lhs,
-             rhs));
+  Value* lhs_value = Bind(InstanceCall(
+      InstanceCallDescriptor::FromToken(intermediate_operator), lhs, rhs));
   Value* rhs_value = Bind(BoolConstant(true));
 
-  return new(Z) StrictCompareInstr(
-      TokenPosition::kNoSource, strict_comparison, lhs_value, rhs_value, true);
+  return new (Z) StrictCompareInstr(TokenPosition::kNoSource, strict_comparison,
+                                    lhs_value, rhs_value, true);
 }
 
-ComparisonInstr* IRRegExpMacroAssembler::Comparison(
-    ComparisonKind kind, Definition* lhs, Definition* rhs) {
+ComparisonInstr* IRRegExpMacroAssembler::Comparison(ComparisonKind kind,
+                                                    Definition* lhs,
+                                                    Definition* rhs) {
   PushArgumentInstr* lhs_push = PushArgument(Bind(lhs));
   PushArgumentInstr* rhs_push = PushArgument(Bind(rhs));
   return Comparison(kind, lhs_push, rhs_push);
@@ -503,7 +504,7 @@
 StaticCallInstr* IRRegExpMacroAssembler::StaticCall(
     const Function& function) const {
   ZoneGrowableArray<PushArgumentInstr*>* arguments =
-      new(Z) ZoneGrowableArray<PushArgumentInstr*>(0);
+      new (Z) ZoneGrowableArray<PushArgumentInstr*>(0);
   return StaticCall(function, arguments);
 }
 
@@ -512,7 +513,7 @@
     const Function& function,
     PushArgumentInstr* arg1) const {
   ZoneGrowableArray<PushArgumentInstr*>* arguments =
-      new(Z) ZoneGrowableArray<PushArgumentInstr*>(1);
+      new (Z) ZoneGrowableArray<PushArgumentInstr*>(1);
   arguments->Add(arg1);
 
   return StaticCall(function, arguments);
@@ -524,7 +525,7 @@
     PushArgumentInstr* arg1,
     PushArgumentInstr* arg2) const {
   ZoneGrowableArray<PushArgumentInstr*>* arguments =
-      new(Z) ZoneGrowableArray<PushArgumentInstr*>(2);
+      new (Z) ZoneGrowableArray<PushArgumentInstr*>(2);
   arguments->Add(arg1);
   arguments->Add(arg2);
 
@@ -535,11 +536,9 @@
 StaticCallInstr* IRRegExpMacroAssembler::StaticCall(
     const Function& function,
     ZoneGrowableArray<PushArgumentInstr*>* arguments) const {
-  return new(Z) StaticCallInstr(TokenPosition::kNoSource,
-                                function,
-                                Object::null_array(),
-                                arguments,
-                                ic_data_array_);
+  return new (Z)
+      StaticCallInstr(TokenPosition::kNoSource, function, Object::null_array(),
+                      arguments, ic_data_array_);
 }
 
 
@@ -547,7 +546,7 @@
     const InstanceCallDescriptor& desc,
     PushArgumentInstr* arg1) const {
   ZoneGrowableArray<PushArgumentInstr*>* arguments =
-      new(Z) ZoneGrowableArray<PushArgumentInstr*>(1);
+      new (Z) ZoneGrowableArray<PushArgumentInstr*>(1);
   arguments->Add(arg1);
 
   return InstanceCall(desc, arguments);
@@ -559,7 +558,7 @@
     PushArgumentInstr* arg1,
     PushArgumentInstr* arg2) const {
   ZoneGrowableArray<PushArgumentInstr*>* arguments =
-      new(Z) ZoneGrowableArray<PushArgumentInstr*>(2);
+      new (Z) ZoneGrowableArray<PushArgumentInstr*>(2);
   arguments->Add(arg1);
   arguments->Add(arg2);
 
@@ -573,7 +572,7 @@
     PushArgumentInstr* arg2,
     PushArgumentInstr* arg3) const {
   ZoneGrowableArray<PushArgumentInstr*>* arguments =
-      new(Z) ZoneGrowableArray<PushArgumentInstr*>(3);
+      new (Z) ZoneGrowableArray<PushArgumentInstr*>(3);
   arguments->Add(arg1);
   arguments->Add(arg2);
   arguments->Add(arg3);
@@ -584,26 +583,20 @@
 
 InstanceCallInstr* IRRegExpMacroAssembler::InstanceCall(
     const InstanceCallDescriptor& desc,
-    ZoneGrowableArray<PushArgumentInstr*> *arguments) const {
-  return
-    new(Z) InstanceCallInstr(TokenPosition::kNoSource,
-                             desc.name,
-                             desc.token_kind,
-                             arguments,
-                             Object::null_array(),
-                             desc.checked_argument_count,
-                             ic_data_array_);
+    ZoneGrowableArray<PushArgumentInstr*>* arguments) const {
+  return new (Z) InstanceCallInstr(
+      TokenPosition::kNoSource, desc.name, desc.token_kind, arguments,
+      Object::null_array(), desc.checked_argument_count, ic_data_array_);
 }
 
 
 LoadLocalInstr* IRRegExpMacroAssembler::LoadLocal(LocalVariable* local) const {
-  return new(Z) LoadLocalInstr(*local, TokenPosition::kNoSource);
+  return new (Z) LoadLocalInstr(*local, TokenPosition::kNoSource);
 }
 
 
-void IRRegExpMacroAssembler::StoreLocal(LocalVariable* local,
-                                        Value* value) {
-  Do(new(Z) StoreLocalInstr(*local, value, TokenPosition::kNoSource));
+void IRRegExpMacroAssembler::StoreLocal(LocalVariable* local, Value* value) {
+  Do(new (Z) StoreLocalInstr(*local, value, TokenPosition::kNoSource));
 }
 
 
@@ -616,7 +609,7 @@
   AppendInstruction(definition);
   definition->set_temp_index(temp_id_.Alloc());
 
-  return new(Z) Value(definition);
+  return new (Z) Value(definition);
 }
 
 
@@ -627,10 +620,10 @@
 
 Value* IRRegExpMacroAssembler::BindLoadLocal(const LocalVariable& local) {
   if (local.IsConst()) {
-    return Bind(new(Z) ConstantInstr(*local.ConstValue()));
+    return Bind(new (Z) ConstantInstr(*local.ConstValue()));
   }
   ASSERT(!local.is_captured());
-  return Bind(new(Z) LoadLocalInstr(local, TokenPosition::kNoSource));
+  return Bind(new (Z) LoadLocalInstr(local, TokenPosition::kNoSource));
 }
 
 
@@ -638,15 +631,16 @@
 // a jmp not followed by a bind. We cannot do the same, since it is impossible
 // to append to a block following a jmp. In such cases, assume that we are doing
 // the correct thing, but output a warning when tracing.
-#define HANDLE_DEAD_CODE_EMISSION() \
-  if (current_instruction_ == NULL) { \
-    if (FLAG_trace_irregexp) { \
-      OS::Print("WARNING: Attempting to append to a closed assembler. " \
-                "This could be either a bug or generation of dead code " \
-                "inherited from V8.\n"); \
-    } \
-    BlockLabel dummy; \
-    BindBlock(&dummy); \
+#define HANDLE_DEAD_CODE_EMISSION()                                            \
+  if (current_instruction_ == NULL) {                                          \
+    if (FLAG_trace_irregexp) {                                                 \
+      OS::Print(                                                               \
+          "WARNING: Attempting to append to a closed assembler. "              \
+          "This could be either a bug or generation of dead code "             \
+          "inherited from V8.\n");                                             \
+    }                                                                          \
+    BlockLabel dummy;                                                          \
+    BindBlock(&dummy);                                                         \
   }
 
 void IRRegExpMacroAssembler::AppendInstruction(Instruction* instruction) {
@@ -701,7 +695,7 @@
 
 PushArgumentInstr* IRRegExpMacroAssembler::PushArgument(Value* value) {
   arg_id_.Alloc();
-  PushArgumentInstr* push = new(Z) PushArgumentInstr(value);
+  PushArgumentInstr* push = new (Z) PushArgumentInstr(value);
   // Do *not* use Do() for push argument instructions.
   AppendInstruction(push);
   return push;
@@ -714,16 +708,15 @@
 
 
 void IRRegExpMacroAssembler::Print(const char* str) {
-  Print(PushArgument(
-    Bind(new(Z) ConstantInstr(
-           String::ZoneHandle(Z, String::New(str, Heap::kOld))))));
+  Print(PushArgument(Bind(new (Z) ConstantInstr(
+      String::ZoneHandle(Z, String::New(str, Heap::kOld))))));
 }
 
 
 void IRRegExpMacroAssembler::Print(PushArgumentInstr* argument) {
   const Library& lib = Library::Handle(Library::CoreLibrary());
-  const Function& print_fn = Function::ZoneHandle(
-        Z, lib.LookupFunctionAllowPrivate(Symbols::print()));
+  const Function& print_fn =
+      Function::ZoneHandle(Z, lib.LookupFunctionAllowPrivate(Symbols::print()));
   Do(StaticCall(print_fn, argument));
 }
 
@@ -735,7 +728,7 @@
 }
 
 
-intptr_t IRRegExpMacroAssembler::stack_limit_slack()  {
+intptr_t IRRegExpMacroAssembler::stack_limit_slack() {
   return 32;
 }
 
@@ -804,8 +797,7 @@
   PushArgumentInstr* registers_push = PushLocal(registers_);
   PushArgumentInstr* index_push = PushRegisterIndex(index);
   return Bind(InstanceCall(InstanceCallDescriptor::FromToken(Token::kINDEX),
-                           registers_push,
-                           index_push));
+                           registers_push, index_push));
 }
 
 void IRRegExpMacroAssembler::StoreRegister(intptr_t index, intptr_t value) {
@@ -821,9 +813,7 @@
                                            PushArgumentInstr* value) {
   TAG();
   Do(InstanceCall(InstanceCallDescriptor::FromToken(Token::kASSIGN_INDEX),
-                  registers,
-                  index,
-                  value));
+                  registers, index, value));
 }
 
 PushArgumentInstr* IRRegExpMacroAssembler::PushRegisterIndex(intptr_t index) {
@@ -846,10 +836,9 @@
 void IRRegExpMacroAssembler::CheckCharacterGT(uint16_t limit,
                                               BlockLabel* on_greater) {
   TAG();
-  BranchOrBacktrack(Comparison(kGT,
-                               LoadLocal(current_character_),
-                               Uint64Constant(limit)),
-                    on_greater);
+  BranchOrBacktrack(
+      Comparison(kGT, LoadLocal(current_character_), Uint64Constant(limit)),
+      on_greater);
 }
 
 
@@ -859,10 +848,9 @@
   BlockLabel not_at_start;
 
   // Did we start the match at the start of the string at all?
-  BranchOrBacktrack(Comparison(kNE,
-                               LoadLocal(start_index_param_),
-                               Uint64Constant(0)),
-                    &not_at_start);
+  BranchOrBacktrack(
+      Comparison(kNE, LoadLocal(start_index_param_), Uint64Constant(0)),
+      &not_at_start);
 
   // If we did, are we still at the start of the input, i.e. is
   // (offset == string_length * -1)?
@@ -870,8 +858,7 @@
       InstanceCall(InstanceCallDescriptor::FromToken(Token::kNEGATE),
                    PushLocal(string_param_length_));
   Definition* offset_def = LoadLocal(current_position_);
-  BranchOrBacktrack(Comparison(kEQ, neg_len_def, offset_def),
-                    on_at_start);
+  BranchOrBacktrack(Comparison(kEQ, neg_len_def, offset_def), on_at_start);
 
   BindBlock(&not_at_start);
 }
@@ -881,10 +868,9 @@
   TAG();
 
   // Did we start the match at the start of the string at all?
-  BranchOrBacktrack(Comparison(kNE,
-                               LoadLocal(start_index_param_),
-                               Uint64Constant(0)),
-                    on_not_at_start);
+  BranchOrBacktrack(
+      Comparison(kNE, LoadLocal(start_index_param_), Uint64Constant(0)),
+      on_not_at_start);
 
   // If we did, are we still at the start of the input, i.e. is
   // (offset == string_length * -1)?
@@ -892,18 +878,16 @@
       InstanceCall(InstanceCallDescriptor::FromToken(Token::kNEGATE),
                    PushLocal(string_param_length_));
   Definition* offset_def = LoadLocal(current_position_);
-  BranchOrBacktrack(Comparison(kNE, neg_len_def, offset_def),
-                    on_not_at_start);
+  BranchOrBacktrack(Comparison(kNE, neg_len_def, offset_def), on_not_at_start);
 }
 
 
 void IRRegExpMacroAssembler::CheckCharacterLT(uint16_t limit,
                                               BlockLabel* on_less) {
   TAG();
-  BranchOrBacktrack(Comparison(kLT,
-                               LoadLocal(current_character_),
-                               Uint64Constant(limit)),
-                    on_less);
+  BranchOrBacktrack(
+      Comparison(kLT, LoadLocal(current_character_), Uint64Constant(limit)),
+      on_less);
 }
 
 
@@ -914,8 +898,7 @@
 
   Definition* head = PeekStack();
   Definition* cur_pos_def = LoadLocal(current_position_);
-  BranchOrBacktrack(Comparison(kNE, head, cur_pos_def),
-                    &fallthrough);
+  BranchOrBacktrack(Comparison(kNE, head, cur_pos_def), &fallthrough);
 
   // Pop, throwing away the value.
   Do(PopStack());
@@ -943,29 +926,26 @@
   // the start of the capture.
   // BranchOrBacktrack(less, on_no_match);
 
-  BranchOrBacktrack(Comparison(kLT,
-                               LoadLocal(capture_length_),
-                               Uint64Constant(0)),
-                    on_no_match);
+  BranchOrBacktrack(
+      Comparison(kLT, LoadLocal(capture_length_), Uint64Constant(0)),
+      on_no_match);
 
   // If length is zero, either the capture is empty or it is completely
   // uncaptured. In either case succeed immediately.
-  BranchOrBacktrack(Comparison(kEQ,
-                               LoadLocal(capture_length_),
-                               Uint64Constant(0)),
-                    &fallthrough);
+  BranchOrBacktrack(
+      Comparison(kEQ, LoadLocal(capture_length_), Uint64Constant(0)),
+      &fallthrough);
 
 
   // Check that there are sufficient characters left in the input.
   PushArgumentInstr* pos_push = PushLocal(current_position_);
   PushArgumentInstr* len_push = PushLocal(capture_length_);
   BranchOrBacktrack(
-        Comparison(kGT,
-                   InstanceCall(InstanceCallDescriptor::FromToken(Token::kADD),
-                                pos_push,
-                                len_push),
-                   Uint64Constant(0)),
-        on_no_match);
+      Comparison(kGT,
+                 InstanceCall(InstanceCallDescriptor::FromToken(Token::kADD),
+                              pos_push, len_push),
+                 Uint64Constant(0)),
+      on_no_match);
 
   pos_push = PushLocal(current_position_);
   len_push = PushLocal(string_param_length_);
@@ -988,63 +968,54 @@
     StoreLocal(char_in_capture_, CharacterAt(capture_start_index_));
     StoreLocal(char_in_match_, CharacterAt(match_start_index_));
 
-    BranchOrBacktrack(Comparison(kEQ,
-                                 LoadLocal(char_in_capture_),
-                                 LoadLocal(char_in_match_)),
-                      &loop_increment);
+    BranchOrBacktrack(
+        Comparison(kEQ, LoadLocal(char_in_capture_), LoadLocal(char_in_match_)),
+        &loop_increment);
 
     // Mismatch, try case-insensitive match (converting letters to lower-case).
     PushArgumentInstr* match_char_push = PushLocal(char_in_match_);
     PushArgumentInstr* mask_push = PushArgument(Bind(Uint64Constant(0x20)));
-    StoreLocal(char_in_match_,
-               Bind(InstanceCall(
-                      InstanceCallDescriptor::FromToken(Token::kBIT_OR),
-                      match_char_push,
-                      mask_push)));
+    StoreLocal(
+        char_in_match_,
+        Bind(InstanceCall(InstanceCallDescriptor::FromToken(Token::kBIT_OR),
+                          match_char_push, mask_push)));
 
     BlockLabel convert_capture;
     BlockLabel on_not_in_range;
-    BranchOrBacktrack(Comparison(kLT,
-                                 LoadLocal(char_in_match_),
-                                 Uint64Constant('a')),
-                      &on_not_in_range);
-    BranchOrBacktrack(Comparison(kGT,
-                                 LoadLocal(char_in_match_),
-                                 Uint64Constant('z')),
-                      &on_not_in_range);
+    BranchOrBacktrack(
+        Comparison(kLT, LoadLocal(char_in_match_), Uint64Constant('a')),
+        &on_not_in_range);
+    BranchOrBacktrack(
+        Comparison(kGT, LoadLocal(char_in_match_), Uint64Constant('z')),
+        &on_not_in_range);
     GoTo(&convert_capture);
     BindBlock(&on_not_in_range);
 
     // Latin-1: Check for values in range [224,254] but not 247.
-    BranchOrBacktrack(Comparison(kLT,
-                                 LoadLocal(char_in_match_),
-                                 Uint64Constant(224)),
-                      on_no_match);
-    BranchOrBacktrack(Comparison(kGT,
-                                 LoadLocal(char_in_match_),
-                                 Uint64Constant(254)),
-                      on_no_match);
+    BranchOrBacktrack(
+        Comparison(kLT, LoadLocal(char_in_match_), Uint64Constant(224)),
+        on_no_match);
+    BranchOrBacktrack(
+        Comparison(kGT, LoadLocal(char_in_match_), Uint64Constant(254)),
+        on_no_match);
 
-    BranchOrBacktrack(Comparison(kEQ,
-                                 LoadLocal(char_in_match_),
-                                 Uint64Constant(247)),
-                      on_no_match);
+    BranchOrBacktrack(
+        Comparison(kEQ, LoadLocal(char_in_match_), Uint64Constant(247)),
+        on_no_match);
 
     // Also convert capture character.
     BindBlock(&convert_capture);
 
     PushArgumentInstr* capture_char_push = PushLocal(char_in_capture_);
     mask_push = PushArgument(Bind(Uint64Constant(0x20)));
-    StoreLocal(char_in_capture_,
-               Bind(InstanceCall(
-                      InstanceCallDescriptor::FromToken(Token::kBIT_OR),
-                      capture_char_push,
-                      mask_push)));
+    StoreLocal(
+        char_in_capture_,
+        Bind(InstanceCall(InstanceCallDescriptor::FromToken(Token::kBIT_OR),
+                          capture_char_push, mask_push)));
 
-    BranchOrBacktrack(Comparison(kNE,
-                                 LoadLocal(char_in_match_),
-                                 LoadLocal(char_in_capture_)),
-                      on_no_match);
+    BranchOrBacktrack(
+        Comparison(kNE, LoadLocal(char_in_match_), LoadLocal(char_in_capture_)),
+        on_no_match);
 
     BindBlock(&loop_increment);
 
@@ -1058,8 +1029,7 @@
     StoreLocal(match_start_index_, Bind(Add(index_push, inc_push)));
 
     // Compare to end of match, and loop if not done.
-    BranchOrBacktrack(Comparison(kLT,
-                                 LoadLocal(match_start_index_),
+    BranchOrBacktrack(Comparison(kLT, LoadLocal(match_start_index_),
                                  LoadLocal(match_end_index_)),
                       &loop);
   } else {
@@ -1070,13 +1040,9 @@
     Value* rhs_index_value = Bind(LoadLocal(capture_start_index_));
     Value* length_value = Bind(LoadLocal(capture_length_));
 
-    Definition* is_match_def =
-        new(Z) CaseInsensitiveCompareUC16Instr(
-                            string_value,
-                            lhs_index_value,
-                            rhs_index_value,
-                            length_value,
-                            specialization_cid_);
+    Definition* is_match_def = new (Z) CaseInsensitiveCompareUC16Instr(
+        string_value, lhs_index_value, rhs_index_value, length_value,
+        specialization_cid_);
 
     BranchOrBacktrack(Comparison(kNE, is_match_def, BoolConstant(true)),
                       on_no_match);
@@ -1093,9 +1059,8 @@
 }
 
 
-void IRRegExpMacroAssembler::CheckNotBackReference(
-    intptr_t start_reg,
-    BlockLabel* on_no_match) {
+void IRRegExpMacroAssembler::CheckNotBackReference(intptr_t start_reg,
+                                                   BlockLabel* on_no_match) {
   TAG();
   ASSERT(start_reg + 1 <= registers_count_);
 
@@ -1108,27 +1073,24 @@
   StoreLocal(capture_length_, Bind(Sub(end_push, start_push)));
 
   // Fail on partial or illegal capture (start of capture after end of capture).
-  BranchOrBacktrack(Comparison(kLT,
-                               LoadLocal(capture_length_),
-                               Uint64Constant(0)),
-                    on_no_match);
+  BranchOrBacktrack(
+      Comparison(kLT, LoadLocal(capture_length_), Uint64Constant(0)),
+      on_no_match);
 
   // Succeed on empty capture (including no capture)
-  BranchOrBacktrack(Comparison(kEQ,
-                               LoadLocal(capture_length_),
-                               Uint64Constant(0)),
-                    &fallthrough);
+  BranchOrBacktrack(
+      Comparison(kEQ, LoadLocal(capture_length_), Uint64Constant(0)),
+      &fallthrough);
 
   // Check that there are sufficient characters left in the input.
   PushArgumentInstr* pos_push = PushLocal(current_position_);
   PushArgumentInstr* len_push = PushLocal(capture_length_);
   BranchOrBacktrack(
-        Comparison(kGT,
-                   InstanceCall(InstanceCallDescriptor::FromToken(Token::kADD),
-                                pos_push,
-                                len_push),
-                   Uint64Constant(0)),
-        on_no_match);
+      Comparison(kGT,
+                 InstanceCall(InstanceCallDescriptor::FromToken(Token::kADD),
+                              pos_push, len_push),
+                 Uint64Constant(0)),
+      on_no_match);
 
   // Compute pointers to match string and capture string.
   pos_push = PushLocal(current_position_);
@@ -1149,10 +1111,9 @@
   StoreLocal(char_in_capture_, CharacterAt(capture_start_index_));
   StoreLocal(char_in_match_, CharacterAt(match_start_index_));
 
-  BranchOrBacktrack(Comparison(kNE,
-                               LoadLocal(char_in_capture_),
-                               LoadLocal(char_in_match_)),
-                    on_no_match);
+  BranchOrBacktrack(
+      Comparison(kNE, LoadLocal(char_in_capture_), LoadLocal(char_in_match_)),
+      on_no_match);
 
   // Increment indexes into capture and match strings.
   PushArgumentInstr* index_push = PushLocal(capture_start_index_);
@@ -1164,8 +1125,7 @@
   StoreLocal(match_start_index_, Bind(Add(index_push, inc_push)));
 
   // Check if we have reached end of match area.
-  BranchOrBacktrack(Comparison(kLT,
-                               LoadLocal(match_start_index_),
+  BranchOrBacktrack(Comparison(kLT, LoadLocal(match_start_index_),
                                LoadLocal(match_end_index_)),
                     &loop);
 
@@ -1183,10 +1143,9 @@
 void IRRegExpMacroAssembler::CheckNotCharacter(uint32_t c,
                                                BlockLabel* on_not_equal) {
   TAG();
-  BranchOrBacktrack(Comparison(kNE,
-                               LoadLocal(current_character_),
-                               Uint64Constant(c)),
-                    on_not_equal);
+  BranchOrBacktrack(
+      Comparison(kNE, LoadLocal(current_character_), Uint64Constant(c)),
+      on_not_equal);
 }
 
 
@@ -1201,8 +1160,7 @@
   PushArgumentInstr* actual_push = PushArgument(Bind(actual_def));
   PushArgumentInstr* mask_push = PushArgument(Bind(Uint64Constant(mask)));
   actual_def = InstanceCall(InstanceCallDescriptor::FromToken(Token::kBIT_AND),
-                            actual_push,
-                            mask_push);
+                            actual_push, mask_push);
 
   BranchOrBacktrack(Comparison(kEQ, actual_def, expected_def), on_equal);
 }
@@ -1220,8 +1178,7 @@
   PushArgumentInstr* actual_push = PushArgument(Bind(actual_def));
   PushArgumentInstr* mask_push = PushArgument(Bind(Uint64Constant(mask)));
   actual_def = InstanceCall(InstanceCallDescriptor::FromToken(Token::kBIT_AND),
-                            actual_push,
-                            mask_push);
+                            actual_push, mask_push);
 
   BranchOrBacktrack(Comparison(kNE, actual_def, expected_def), on_not_equal);
 }
@@ -1244,17 +1201,15 @@
   actual_push = PushArgument(Bind(Sub(actual_push, minus_push)));
   PushArgumentInstr* mask_push = PushArgument(Bind(Uint64Constant(mask)));
   actual_def = InstanceCall(InstanceCallDescriptor::FromToken(Token::kBIT_AND),
-                            actual_push,
-                            mask_push);
+                            actual_push, mask_push);
 
   BranchOrBacktrack(Comparison(kNE, actual_def, expected_def), on_not_equal);
 }
 
 
-void IRRegExpMacroAssembler::CheckCharacterInRange(
-    uint16_t from,
-    uint16_t to,
-    BlockLabel* on_in_range) {
+void IRRegExpMacroAssembler::CheckCharacterInRange(uint16_t from,
+                                                   uint16_t to,
+                                                   BlockLabel* on_in_range) {
   TAG();
   ASSERT(from <= to);
 
@@ -1262,14 +1217,12 @@
   // compares. This pattern repeats in various places.
 
   BlockLabel on_not_in_range;
-  BranchOrBacktrack(Comparison(kLT,
-                               LoadLocal(current_character_),
-                               Uint64Constant(from)),
-                    &on_not_in_range);
-  BranchOrBacktrack(Comparison(kGT,
-                               LoadLocal(current_character_),
-                               Uint64Constant(to)),
-                    &on_not_in_range);
+  BranchOrBacktrack(
+      Comparison(kLT, LoadLocal(current_character_), Uint64Constant(from)),
+      &on_not_in_range);
+  BranchOrBacktrack(
+      Comparison(kGT, LoadLocal(current_character_), Uint64Constant(to)),
+      &on_not_in_range);
   BranchOrBacktrack(NULL, on_in_range);
 
   BindBlock(&on_not_in_range);
@@ -1283,40 +1236,34 @@
   TAG();
   ASSERT(from <= to);
 
-  BranchOrBacktrack(Comparison(kLT,
-                               LoadLocal(current_character_),
-                               Uint64Constant(from)),
-                    on_not_in_range);
+  BranchOrBacktrack(
+      Comparison(kLT, LoadLocal(current_character_), Uint64Constant(from)),
+      on_not_in_range);
 
-  BranchOrBacktrack(Comparison(kGT,
-                               LoadLocal(current_character_),
-                               Uint64Constant(to)),
-                    on_not_in_range);
+  BranchOrBacktrack(
+      Comparison(kGT, LoadLocal(current_character_), Uint64Constant(to)),
+      on_not_in_range);
 }
 
 
-void IRRegExpMacroAssembler::CheckBitInTable(
-    const TypedData& table,
-    BlockLabel* on_bit_set) {
+void IRRegExpMacroAssembler::CheckBitInTable(const TypedData& table,
+                                             BlockLabel* on_bit_set) {
   TAG();
 
   PushArgumentInstr* table_push =
-      PushArgument(Bind(new(Z) ConstantInstr(table)));
+      PushArgument(Bind(new (Z) ConstantInstr(table)));
   PushArgumentInstr* index_push = PushLocal(current_character_);
 
   if (mode_ != ASCII || kTableMask != Symbols::kMaxOneCharCodeSymbol) {
     PushArgumentInstr* mask_push =
         PushArgument(Bind(Uint64Constant(kTableSize - 1)));
     index_push = PushArgument(
-          Bind(InstanceCall(InstanceCallDescriptor::FromToken(Token::kBIT_AND),
-                            index_push,
-                            mask_push)));
+        Bind(InstanceCall(InstanceCallDescriptor::FromToken(Token::kBIT_AND),
+                          index_push, mask_push)));
   }
 
-  Definition* byte_def =
-      InstanceCall(InstanceCallDescriptor::FromToken(Token::kINDEX),
-                   table_push,
-                   index_push);
+  Definition* byte_def = InstanceCall(
+      InstanceCallDescriptor::FromToken(Token::kINDEX), table_push, index_push);
   Definition* zero_def = Int64Constant(0);
 
   BranchOrBacktrack(Comparison(kNE, byte_def, zero_def), on_bit_set);
@@ -1331,145 +1278,131 @@
   // Range checks (c in min..max) are generally implemented by an unsigned
   // (c - min) <= (max - min) check
   switch (type) {
-  case 's':
-    // Match space-characters
-    if (mode_ == ASCII) {
-      // One byte space characters are '\t'..'\r', ' ' and \u00a0.
+    case 's':
+      // Match space-characters
+      if (mode_ == ASCII) {
+        // One byte space characters are '\t'..'\r', ' ' and \u00a0.
+        BlockLabel success;
+        // Space (' ').
+        BranchOrBacktrack(
+            Comparison(kEQ, LoadLocal(current_character_), Uint64Constant(' ')),
+            &success);
+        // Check range 0x09..0x0d.
+        CheckCharacterInRange('\t', '\r', &success);
+        // \u00a0 (NBSP).
+        BranchOrBacktrack(Comparison(kNE, LoadLocal(current_character_),
+                                     Uint64Constant(0x00a0)),
+                          on_no_match);
+        BindBlock(&success);
+        return true;
+      }
+      return false;
+    case 'S':
+      // The emitted code for generic character classes is good enough.
+      return false;
+    case 'd':
+      // Match ASCII digits ('0'..'9')
+      CheckCharacterNotInRange('0', '9', on_no_match);
+      return true;
+    case 'D':
+      // Match non ASCII-digits
+      CheckCharacterInRange('0', '9', on_no_match);
+      return true;
+    case '.': {
+      // Match non-newlines (not 0x0a('\n'), 0x0d('\r'), 0x2028 and 0x2029)
+      BranchOrBacktrack(
+          Comparison(kEQ, LoadLocal(current_character_), Uint64Constant('\n')),
+          on_no_match);
+      BranchOrBacktrack(
+          Comparison(kEQ, LoadLocal(current_character_), Uint64Constant('\r')),
+          on_no_match);
+      if (mode_ == UC16) {
+        BranchOrBacktrack(Comparison(kEQ, LoadLocal(current_character_),
+                                     Uint64Constant(0x2028)),
+                          on_no_match);
+        BranchOrBacktrack(Comparison(kEQ, LoadLocal(current_character_),
+                                     Uint64Constant(0x2029)),
+                          on_no_match);
+      }
+      return true;
+    }
+    case 'w': {
+      if (mode_ != ASCII) {
+        // Table is 128 entries, so all ASCII characters can be tested.
+        BranchOrBacktrack(
+            Comparison(kGT, LoadLocal(current_character_), Uint64Constant('z')),
+            on_no_match);
+      }
+
+      PushArgumentInstr* table_push =
+          PushArgument(Bind(WordCharacterMapConstant()));
+      PushArgumentInstr* index_push = PushLocal(current_character_);
+
+      Definition* byte_def =
+          InstanceCall(InstanceCallDescriptor::FromToken(Token::kINDEX),
+                       table_push, index_push);
+      Definition* zero_def = Int64Constant(0);
+
+      BranchOrBacktrack(Comparison(kEQ, byte_def, zero_def), on_no_match);
+
+      return true;
+    }
+    case 'W': {
+      BlockLabel done;
+      if (mode_ != ASCII) {
+        // Table is 128 entries, so all ASCII characters can be tested.
+        BranchOrBacktrack(
+            Comparison(kGT, LoadLocal(current_character_), Uint64Constant('z')),
+            &done);
+      }
+
+      // TODO(zerny): Refactor to use CheckBitInTable if possible.
+
+      PushArgumentInstr* table_push =
+          PushArgument(Bind(WordCharacterMapConstant()));
+      PushArgumentInstr* index_push = PushLocal(current_character_);
+
+      Definition* byte_def =
+          InstanceCall(InstanceCallDescriptor::FromToken(Token::kINDEX),
+                       table_push, index_push);
+      Definition* zero_def = Int64Constant(0);
+
+      BranchOrBacktrack(Comparison(kNE, byte_def, zero_def), on_no_match);
+
+      if (mode_ != ASCII) {
+        BindBlock(&done);
+      }
+      return true;
+    }
+    // Non-standard classes (with no syntactic shorthand) used internally.
+    case '*':
+      // Match any character.
+      return true;
+    case 'n': {
+      // Match newlines (0x0a('\n'), 0x0d('\r'), 0x2028 or 0x2029).
+      // The opposite of '.'.
       BlockLabel success;
-      // Space (' ').
-      BranchOrBacktrack(Comparison(kEQ,
-                                   LoadLocal(current_character_),
-                                   Uint64Constant(' ')),
-                        &success);
-      // Check range 0x09..0x0d.
-      CheckCharacterInRange('\t', '\r', &success);
-      // \u00a0 (NBSP).
-      BranchOrBacktrack(Comparison(kNE,
-                                   LoadLocal(current_character_),
-                                   Uint64Constant(0x00a0)),
-                        on_no_match);
+      BranchOrBacktrack(
+          Comparison(kEQ, LoadLocal(current_character_), Uint64Constant('\n')),
+          &success);
+      BranchOrBacktrack(
+          Comparison(kEQ, LoadLocal(current_character_), Uint64Constant('\r')),
+          &success);
+      if (mode_ == UC16) {
+        BranchOrBacktrack(Comparison(kEQ, LoadLocal(current_character_),
+                                     Uint64Constant(0x2028)),
+                          &success);
+        BranchOrBacktrack(Comparison(kEQ, LoadLocal(current_character_),
+                                     Uint64Constant(0x2029)),
+                          &success);
+      }
+      BranchOrBacktrack(NULL, on_no_match);
       BindBlock(&success);
       return true;
     }
-    return false;
-  case 'S':
-    // The emitted code for generic character classes is good enough.
-    return false;
-  case 'd':
-    // Match ASCII digits ('0'..'9')
-    CheckCharacterNotInRange('0', '9', on_no_match);
-    return true;
-  case 'D':
-    // Match non ASCII-digits
-    CheckCharacterInRange('0', '9', on_no_match);
-    return true;
-  case '.': {
-    // Match non-newlines (not 0x0a('\n'), 0x0d('\r'), 0x2028 and 0x2029)
-    BranchOrBacktrack(Comparison(kEQ,
-                                 LoadLocal(current_character_),
-                                 Uint64Constant('\n')),
-                      on_no_match);
-    BranchOrBacktrack(Comparison(kEQ,
-                                 LoadLocal(current_character_),
-                                 Uint64Constant('\r')),
-                      on_no_match);
-    if (mode_ == UC16) {
-      BranchOrBacktrack(Comparison(kEQ,
-                                   LoadLocal(current_character_),
-                                   Uint64Constant(0x2028)),
-                        on_no_match);
-      BranchOrBacktrack(Comparison(kEQ,
-                                   LoadLocal(current_character_),
-                                   Uint64Constant(0x2029)),
-                        on_no_match);
-    }
-    return true;
-  }
-  case 'w': {
-    if (mode_ != ASCII) {
-      // Table is 128 entries, so all ASCII characters can be tested.
-      BranchOrBacktrack(Comparison(kGT,
-                                   LoadLocal(current_character_),
-                                   Uint64Constant('z')),
-                        on_no_match);
-    }
-
-    PushArgumentInstr* table_push =
-        PushArgument(Bind(WordCharacterMapConstant()));
-    PushArgumentInstr* index_push = PushLocal(current_character_);
-
-    Definition* byte_def =
-        InstanceCall(InstanceCallDescriptor::FromToken(Token::kINDEX),
-                     table_push,
-                     index_push);
-    Definition* zero_def = Int64Constant(0);
-
-    BranchOrBacktrack(Comparison(kEQ, byte_def, zero_def), on_no_match);
-
-    return true;
-  }
-  case 'W': {
-    BlockLabel done;
-    if (mode_ != ASCII) {
-      // Table is 128 entries, so all ASCII characters can be tested.
-      BranchOrBacktrack(Comparison(kGT,
-                                   LoadLocal(current_character_),
-                                   Uint64Constant('z')),
-                        &done);
-    }
-
-    // TODO(zerny): Refactor to use CheckBitInTable if possible.
-
-    PushArgumentInstr* table_push =
-        PushArgument(Bind(WordCharacterMapConstant()));
-    PushArgumentInstr* index_push = PushLocal(current_character_);
-
-    Definition* byte_def =
-        InstanceCall(InstanceCallDescriptor::FromToken(Token::kINDEX),
-                     table_push,
-                     index_push);
-    Definition* zero_def = Int64Constant(0);
-
-    BranchOrBacktrack(Comparison(kNE, byte_def, zero_def), on_no_match);
-
-    if (mode_ != ASCII) {
-      BindBlock(&done);
-    }
-    return true;
-  }
-  // Non-standard classes (with no syntactic shorthand) used internally.
-  case '*':
-    // Match any character.
-    return true;
-  case 'n': {
-    // Match newlines (0x0a('\n'), 0x0d('\r'), 0x2028 or 0x2029).
-    // The opposite of '.'.
-    BlockLabel success;
-    BranchOrBacktrack(Comparison(kEQ,
-                                 LoadLocal(current_character_),
-                                 Uint64Constant('\n')),
-                      &success);
-    BranchOrBacktrack(Comparison(kEQ,
-                                 LoadLocal(current_character_),
-                                 Uint64Constant('\r')),
-                      &success);
-    if (mode_ == UC16) {
-      BranchOrBacktrack(Comparison(kEQ,
-                                   LoadLocal(current_character_),
-                                   Uint64Constant(0x2028)),
-                        &success);
-      BranchOrBacktrack(Comparison(kEQ,
-                                   LoadLocal(current_character_),
-                                   Uint64Constant(0x2029)),
-                        &success);
-    }
-    BranchOrBacktrack(NULL, on_no_match);
-    BindBlock(&success);
-    return true;
-  }
-  // No custom implementation (yet): s(uint16_t), S(uint16_t).
-  default:
-    return false;
+    // No custom implementation (yet): s(uint16_t), S(uint16_t).
+    default:
+      return false;
   }
 }
 
@@ -1504,8 +1437,7 @@
 }
 
 
-void IRRegExpMacroAssembler::IfRegisterEqPos(intptr_t reg,
-                                             BlockLabel* if_eq) {
+void IRRegExpMacroAssembler::IfRegisterEqPos(intptr_t reg, BlockLabel* if_eq) {
   TAG();
   PushArgumentInstr* reg_push = PushArgument(LoadRegister(reg));
   PushArgumentInstr* pos = PushArgument(Bind(LoadLocal(current_position_)));
@@ -1514,7 +1446,7 @@
 
 
 RegExpMacroAssembler::IrregexpImplementation
-    IRRegExpMacroAssembler::Implementation() {
+IRRegExpMacroAssembler::Implementation() {
   return kIRImplementation;
 }
 
@@ -1524,8 +1456,8 @@
                                                   bool check_bounds,
                                                   intptr_t characters) {
   TAG();
-  ASSERT(cp_offset >= -1);      // ^ and \b can look behind one character.
-  ASSERT(cp_offset < (1<<30));  // Be sane! (And ensure negation works)
+  ASSERT(cp_offset >= -1);        // ^ and \b can look behind one character.
+  ASSERT(cp_offset < (1 << 30));  // Be sane! (And ensure negation works)
   if (check_bounds) {
     CheckPosition(cp_offset + characters - 1, on_end_of_input);
   }
@@ -1549,19 +1481,16 @@
 }
 
 
-void IRRegExpMacroAssembler::PushStack(Definition *definition) {
+void IRRegExpMacroAssembler::PushStack(Definition* definition) {
   PushArgumentInstr* stack_push = PushLocal(stack_);
   PushArgumentInstr* stack_pointer_push = PushLocal(stack_pointer_);
-  StoreLocal(stack_pointer_,
-             Bind(Add(stack_pointer_push,
-                      PushArgument(Bind(Uint64Constant(1))))));
+  StoreLocal(stack_pointer_, Bind(Add(stack_pointer_push,
+                                      PushArgument(Bind(Uint64Constant(1))))));
   stack_pointer_push = PushLocal(stack_pointer_);
   // TODO(zerny): bind value and push could break stack discipline.
   PushArgumentInstr* value_push = PushArgument(Bind(definition));
   Do(InstanceCall(InstanceCallDescriptor::FromToken(Token::kASSIGN_INDEX),
-                  stack_push,
-                  stack_pointer_push,
-                  value_push));
+                  stack_push, stack_pointer_push, value_push));
 }
 
 
@@ -1569,12 +1498,10 @@
   PushArgumentInstr* stack_push = PushLocal(stack_);
   PushArgumentInstr* stack_pointer_push1 = PushLocal(stack_pointer_);
   PushArgumentInstr* stack_pointer_push2 = PushLocal(stack_pointer_);
-  StoreLocal(stack_pointer_,
-             Bind(Sub(stack_pointer_push2,
-                      PushArgument(Bind(Uint64Constant(1))))));
+  StoreLocal(stack_pointer_, Bind(Sub(stack_pointer_push2,
+                                      PushArgument(Bind(Uint64Constant(1))))));
   return InstanceCall(InstanceCallDescriptor::FromToken(Token::kINDEX),
-                      stack_push,
-                      stack_pointer_push1);
+                      stack_push, stack_pointer_push1);
 }
 
 
@@ -1582,8 +1509,7 @@
   PushArgumentInstr* stack_push = PushLocal(stack_);
   PushArgumentInstr* stack_pointer_push = PushLocal(stack_pointer_);
   return InstanceCall(InstanceCallDescriptor::FromToken(Token::kINDEX),
-                      stack_push,
-                      stack_pointer_push);
+                      stack_push, stack_pointer_push);
 }
 
 
@@ -1616,16 +1542,13 @@
   // TODO(zerny): Refactor PushStack so it can be reused here.
   PushArgumentInstr* stack_push = PushLocal(stack_);
   PushArgumentInstr* stack_pointer_push = PushLocal(stack_pointer_);
-  StoreLocal(stack_pointer_,
-             Bind(Add(stack_pointer_push,
-                      PushArgument(Bind(Uint64Constant(1))))));
+  StoreLocal(stack_pointer_, Bind(Add(stack_pointer_push,
+                                      PushArgument(Bind(Uint64Constant(1))))));
   stack_pointer_push = PushLocal(stack_pointer_);
   // TODO(zerny): bind value and push could break stack discipline.
   PushArgumentInstr* value_push = PushArgument(LoadRegister(reg));
   Do(InstanceCall(InstanceCallDescriptor::FromToken(Token::kASSIGN_INDEX),
-                  stack_push,
-                  stack_pointer_push,
-                  value_push));
+                  stack_push, stack_pointer_push, value_push));
   CheckStackLimit();
 }
 
@@ -1637,24 +1560,21 @@
 void IRRegExpMacroAssembler::CheckStackLimit() {
   TAG();
   PushArgumentInstr* stack_push = PushLocal(stack_);
-  PushArgumentInstr* length_push = PushArgument(Bind(InstanceCall(
-      InstanceCallDescriptor(
-          String::ZoneHandle(Field::GetterSymbol(Symbols::Length()))),
-      stack_push)));
+  PushArgumentInstr* length_push = PushArgument(
+      Bind(InstanceCall(InstanceCallDescriptor(String::ZoneHandle(
+                            Field::GetterSymbol(Symbols::Length()))),
+                        stack_push)));
   PushArgumentInstr* capacity_push = PushArgument(Bind(Sub(
-      length_push,
-      PushArgument(Bind(Uint64Constant(stack_limit_slack()))))));
+      length_push, PushArgument(Bind(Uint64Constant(stack_limit_slack()))))));
   PushArgumentInstr* stack_pointer_push = PushLocal(stack_pointer_);
-  BranchInstr* branch = new(Z) BranchInstr(
-      Comparison(kGT, capacity_push, stack_pointer_push));
+  BranchInstr* branch =
+      new (Z) BranchInstr(Comparison(kGT, capacity_push, stack_pointer_push));
   CloseBlockWith(branch);
 
   BlockLabel grow_stack;
   BlockLabel fallthrough;
-  *branch->true_successor_address() =
-      TargetWithJoinGoto(fallthrough.block());
-  *branch->false_successor_address() =
-      TargetWithJoinGoto(grow_stack.block());
+  *branch->true_successor_address() = TargetWithJoinGoto(fallthrough.block());
+  *branch->false_successor_address() = TargetWithJoinGoto(grow_stack.block());
 
   BindBlock(&grow_stack);
   GrowStack();
@@ -1665,8 +1585,8 @@
 
 void IRRegExpMacroAssembler::GrowStack() {
   TAG();
-  Value* cell = Bind(new(Z) ConstantInstr(stack_array_cell_));
-  StoreLocal(stack_, Bind(new(Z) GrowRegExpStackInstr(cell)));
+  Value* cell = Bind(new (Z) ConstantInstr(stack_array_cell_));
+  StoreLocal(stack_, Bind(new (Z) GrowRegExpStackInstr(cell)));
 }
 
 
@@ -1682,7 +1602,7 @@
   StoreLocal(stack_pointer_, LoadRegister(reg));
 }
 
-void IRRegExpMacroAssembler::SetCurrentPositionFromEnd(intptr_t by)  {
+void IRRegExpMacroAssembler::SetCurrentPositionFromEnd(intptr_t by) {
   TAG();
 
   BlockLabel after_position;
@@ -1720,7 +1640,8 @@
 
 
 void IRRegExpMacroAssembler::WriteCurrentPositionToRegister(
-    intptr_t reg, intptr_t cp_offset) {
+    intptr_t reg,
+    intptr_t cp_offset) {
   TAG();
 
   PushArgumentInstr* registers_push = PushLocal(registers_);
@@ -1734,8 +1655,8 @@
 }
 
 
-void IRRegExpMacroAssembler::ClearRegisters(
-    intptr_t reg_from, intptr_t reg_to) {
+void IRRegExpMacroAssembler::ClearRegisters(intptr_t reg_from,
+                                            intptr_t reg_to) {
   TAG();
 
   ASSERT(reg_from <= reg_to);
@@ -1746,8 +1667,7 @@
   for (intptr_t reg = reg_from; reg <= reg_to; reg++) {
     PushArgumentInstr* registers_push = PushLocal(registers_);
     PushArgumentInstr* index_push = PushRegisterIndex(reg);
-    PushArgumentInstr* minus_one_push =
-        PushArgument(Bind(Int64Constant(-1)));
+    PushArgumentInstr* minus_one_push = PushArgument(Bind(Int64Constant(-1)));
     PushArgumentInstr* length_push = PushLocal(string_param_length_);
     PushArgumentInstr* value_push =
         PushArgument(Bind(Sub(minus_one_push, length_push)));
@@ -1778,14 +1698,12 @@
   // If (current_position_ < -cp_offset), we are in bounds.
   // Remember, current_position_ is a negative offset from the string end.
 
-  BranchOrBacktrack(Comparison(kGTE, curpos_def, cp_off_def),
-                    on_outside_input);
+  BranchOrBacktrack(Comparison(kGTE, curpos_def, cp_off_def), on_outside_input);
 }
 
 
-void IRRegExpMacroAssembler::BranchOrBacktrack(
-    ComparisonInstr* comparison,
-    BlockLabel* true_successor) {
+void IRRegExpMacroAssembler::BranchOrBacktrack(ComparisonInstr* comparison,
+                                               BlockLabel* true_successor) {
   if (comparison == NULL) {  // No condition
     if (true_successor == NULL) {
       Backtrack();
@@ -1806,11 +1724,9 @@
   // If the condition is not true, fall through to a new block.
   BlockLabel fallthrough;
 
-  BranchInstr* branch = new(Z) BranchInstr(comparison);
-  *branch->true_successor_address() =
-      TargetWithJoinGoto(true_successor_block);
-  *branch->false_successor_address() =
-      TargetWithJoinGoto(fallthrough.block());
+  BranchInstr* branch = new (Z) BranchInstr(comparison);
+  *branch->true_successor_address() = TargetWithJoinGoto(true_successor_block);
+  *branch->false_successor_address() = TargetWithJoinGoto(fallthrough.block());
 
   CloseBlockWith(branch);
   BindBlock(&fallthrough);
@@ -1819,11 +1735,11 @@
 
 TargetEntryInstr* IRRegExpMacroAssembler::TargetWithJoinGoto(
     JoinEntryInstr* dst) {
-  TargetEntryInstr* target = new(Z) TargetEntryInstr(
-          block_id_.Alloc(), kInvalidTryIndex);
+  TargetEntryInstr* target =
+      new (Z) TargetEntryInstr(block_id_.Alloc(), kInvalidTryIndex);
   blocks_.Add(target);
 
-  target->AppendInstruction(new(Z) GotoInstr(dst));
+  target->AppendInstruction(new (Z) GotoInstr(dst));
 
   return target;
 }
@@ -1831,11 +1747,11 @@
 
 IndirectEntryInstr* IRRegExpMacroAssembler::IndirectWithJoinGoto(
     JoinEntryInstr* dst) {
-  IndirectEntryInstr* target = new(Z) IndirectEntryInstr(
-          block_id_.Alloc(), indirect_id_.Alloc(), kInvalidTryIndex);
+  IndirectEntryInstr* target = new (Z) IndirectEntryInstr(
+      block_id_.Alloc(), indirect_id_.Alloc(), kInvalidTryIndex);
   blocks_.Add(target);
 
-  target->AppendInstruction(new(Z) GotoInstr(dst));
+  target->AppendInstruction(new (Z) GotoInstr(dst));
 
   return target;
 }
@@ -1843,27 +1759,26 @@
 
 void IRRegExpMacroAssembler::CheckPreemption() {
   TAG();
-  AppendInstruction(new(Z) CheckStackOverflowInstr(
-      TokenPosition::kNoSource, 0));
+  AppendInstruction(new (Z)
+                        CheckStackOverflowInstr(TokenPosition::kNoSource, 0));
 }
 
 
-Definition* IRRegExpMacroAssembler::Add(
-    PushArgumentInstr* lhs,
-    PushArgumentInstr* rhs) {
+Definition* IRRegExpMacroAssembler::Add(PushArgumentInstr* lhs,
+                                        PushArgumentInstr* rhs) {
   return InstanceCall(InstanceCallDescriptor::FromToken(Token::kADD), lhs, rhs);
 }
 
 
-Definition* IRRegExpMacroAssembler::Sub(
-    PushArgumentInstr* lhs,
-    PushArgumentInstr* rhs) {
+Definition* IRRegExpMacroAssembler::Sub(PushArgumentInstr* lhs,
+                                        PushArgumentInstr* rhs) {
   return InstanceCall(InstanceCallDescriptor::FromToken(Token::kSUB), lhs, rhs);
 }
 
 
 void IRRegExpMacroAssembler::LoadCurrentCharacterUnchecked(
-    intptr_t cp_offset, intptr_t characters) {
+    intptr_t cp_offset,
+    intptr_t characters) {
   TAG();
 
   ASSERT(characters == 1 || CanReadUnaligned());
@@ -1877,12 +1792,9 @@
   // Calculate the addressed string index as:
   //    cp_offset + current_position_ + string_param_length_
   // TODO(zerny): Avoid generating 'add' instance-calls here.
-  PushArgumentInstr* off_arg =
-      PushArgument(Bind(Int64Constant(cp_offset)));
-  PushArgumentInstr* pos_arg =
-      PushArgument(BindLoadLocal(*current_position_));
-  PushArgumentInstr* off_pos_arg =
-      PushArgument(Bind(Add(off_arg, pos_arg)));
+  PushArgumentInstr* off_arg = PushArgument(Bind(Int64Constant(cp_offset)));
+  PushArgumentInstr* pos_arg = PushArgument(BindLoadLocal(*current_position_));
+  PushArgumentInstr* off_pos_arg = PushArgument(Bind(Add(off_arg, pos_arg)));
   PushArgumentInstr* len_arg =
       PushArgument(BindLoadLocal(*string_param_length_));
   // Index is stored in a temporary local so that we can later load it safely.
@@ -1921,20 +1833,16 @@
     // the first value is consumed to obtain the second value which is consumed
     // by LoadCodeUnitsAtInstr below.
     Value* external_val =
-        Bind(new(Z) LoadUntaggedInstr(pattern_val, external_offset));
-    pattern_val =
-        Bind(new(Z) LoadUntaggedInstr(external_val, data_offset));
+        Bind(new (Z) LoadUntaggedInstr(pattern_val, external_offset));
+    pattern_val = Bind(new (Z) LoadUntaggedInstr(external_val, data_offset));
   }
 
   // Here pattern_val might be untagged so this must not trigger a GC.
   Value* index_val = BindLoadLocal(*index);
 
-  return Bind(new(Z) LoadCodeUnitsInstr(
-      pattern_val,
-      index_val,
-      characters,
-      specialization_cid_,
-      TokenPosition::kNoSource));
+  return Bind(new (Z) LoadCodeUnitsInstr(pattern_val, index_val, characters,
+                                         specialization_cid_,
+                                         TokenPosition::kNoSource));
 }
 
 
diff --git a/runtime/vm/regexp_assembler_ir.h b/runtime/vm/regexp_assembler_ir.h
index 8aae558..a08e05f 100644
--- a/runtime/vm/regexp_assembler_ir.h
+++ b/runtime/vm/regexp_assembler_ir.h
@@ -83,13 +83,15 @@
   // Checks whether the given offset from the current position is before
   // the end of the string.
   virtual void CheckPosition(intptr_t cp_offset, BlockLabel* on_outside_input);
-  virtual bool CheckSpecialCharacterClass(
-      uint16_t type, BlockLabel* on_no_match);
+  virtual bool CheckSpecialCharacterClass(uint16_t type,
+                                          BlockLabel* on_no_match);
   virtual void Fail();
   virtual void IfRegisterGE(intptr_t reg,
-                            intptr_t comparand, BlockLabel* if_ge);
+                            intptr_t comparand,
+                            BlockLabel* if_ge);
   virtual void IfRegisterLT(intptr_t reg,
-                            intptr_t comparand, BlockLabel* if_lt);
+                            intptr_t comparand,
+                            BlockLabel* if_lt);
   virtual void IfRegisterEqPos(intptr_t reg, BlockLabel* if_eq);
   virtual IrregexpImplementation Implementation();
   virtual void GoTo(BlockLabel* to);
@@ -149,44 +151,48 @@
   struct InstanceCallDescriptor {
     // Standard (i.e. most non-Smi) functions.
     explicit InstanceCallDescriptor(const String& name)
-      : name(name),
-        token_kind(Token::kILLEGAL),
-        checked_argument_count(1) { }
+        : name(name), token_kind(Token::kILLEGAL), checked_argument_count(1) {}
 
     InstanceCallDescriptor(const String& name,
                            Token::Kind token_kind,
                            intptr_t checked_argument_count)
-      : name(name),
-        token_kind(token_kind),
-        checked_argument_count(checked_argument_count) { }
+        : name(name),
+          token_kind(token_kind),
+          checked_argument_count(checked_argument_count) {}
 
     // Special cases for Smi and indexing functions.
     static InstanceCallDescriptor FromToken(Token::Kind token_kind) {
       switch (token_kind) {
-        case Token::kEQ: return InstanceCallDescriptor(
-                  Symbols::EqualOperator(), token_kind, 2);
-        case Token::kADD: return InstanceCallDescriptor(
-                Symbols::Plus(), token_kind, 2);
-        case Token::kSUB: return InstanceCallDescriptor(
-                Symbols::Minus(), token_kind, 2);
-        case Token::kBIT_OR: return InstanceCallDescriptor(
-                Symbols::BitOr(), token_kind, 2);
-        case Token::kBIT_AND: return InstanceCallDescriptor(
-                Symbols::BitAnd(), token_kind, 2);
-        case Token::kLT: return InstanceCallDescriptor(
-                Symbols::LAngleBracket(), token_kind, 2);
-        case Token::kLTE: return InstanceCallDescriptor(
-                Symbols::LessEqualOperator(), token_kind, 2);
-        case Token::kGT: return InstanceCallDescriptor(
-                Symbols::RAngleBracket(), token_kind, 2);
-        case Token::kGTE: return InstanceCallDescriptor(
-                Symbols::GreaterEqualOperator(), token_kind, 2);
-        case Token::kNEGATE: return InstanceCallDescriptor(
-                Symbols::UnaryMinus(), token_kind, 1);
-        case Token::kINDEX: return InstanceCallDescriptor(
-                Symbols::IndexToken(), token_kind, 2);
-        case Token::kASSIGN_INDEX: return InstanceCallDescriptor(
-                Symbols::AssignIndexToken(), token_kind, 2);
+        case Token::kEQ:
+          return InstanceCallDescriptor(Symbols::EqualOperator(), token_kind,
+                                        2);
+        case Token::kADD:
+          return InstanceCallDescriptor(Symbols::Plus(), token_kind, 2);
+        case Token::kSUB:
+          return InstanceCallDescriptor(Symbols::Minus(), token_kind, 2);
+        case Token::kBIT_OR:
+          return InstanceCallDescriptor(Symbols::BitOr(), token_kind, 2);
+        case Token::kBIT_AND:
+          return InstanceCallDescriptor(Symbols::BitAnd(), token_kind, 2);
+        case Token::kLT:
+          return InstanceCallDescriptor(Symbols::LAngleBracket(), token_kind,
+                                        2);
+        case Token::kLTE:
+          return InstanceCallDescriptor(Symbols::LessEqualOperator(),
+                                        token_kind, 2);
+        case Token::kGT:
+          return InstanceCallDescriptor(Symbols::RAngleBracket(), token_kind,
+                                        2);
+        case Token::kGTE:
+          return InstanceCallDescriptor(Symbols::GreaterEqualOperator(),
+                                        token_kind, 2);
+        case Token::kNEGATE:
+          return InstanceCallDescriptor(Symbols::UnaryMinus(), token_kind, 1);
+        case Token::kINDEX:
+          return InstanceCallDescriptor(Symbols::IndexToken(), token_kind, 2);
+        case Token::kASSIGN_INDEX:
+          return InstanceCallDescriptor(Symbols::AssignIndexToken(), token_kind,
+                                        2);
         default:
           UNREACHABLE();
       }
@@ -294,9 +300,7 @@
   intptr_t GetNextLocalIndex();
 
   // We never have any copied parameters.
-  intptr_t num_copied_params() const {
-    return 0;
-  }
+  intptr_t num_copied_params() const { return 0; }
 
   // Return the position register at the specified index, creating it if
   // necessary. Note that the number of such registers can exceed the amount
@@ -336,7 +340,7 @@
   // A utility class tracking ids of various objects such as blocks, temps, etc.
   class IdAllocator : public ValueObject {
    public:
-    IdAllocator() : next_id(0) { }
+    IdAllocator() : next_id(0) {}
 
     intptr_t Count() const { return next_id; }
     intptr_t Alloc(intptr_t count = 1) {
diff --git a/runtime/vm/regexp_ast.cc b/runtime/vm/regexp_ast.cc
index 9296170..7e0cbc7 100644
--- a/runtime/vm/regexp_ast.cc
+++ b/runtime/vm/regexp_ast.cc
@@ -9,25 +9,21 @@
 
 namespace dart {
 
-#define MAKE_ACCEPT(Name)                                            \
-  void* RegExp##Name::Accept(RegExpVisitor* visitor, void* data) {   \
-    return visitor->Visit##Name(this, data);                         \
+#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;                                                     \
-  }                                                                  \
+#define MAKE_TYPE_CASE(Name)                                                   \
+  RegExp##Name* RegExpTree::As##Name() { return NULL; }                        \
   bool RegExpTree::Is##Name() const { 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;                                                    \
-  }                                                                 \
+#define MAKE_TYPE_CASE(Name)                                                   \
+  RegExp##Name* RegExp##Name::As##Name() { return this; }                      \
   bool RegExp##Name::Is##Name() const { return true; }
 FOR_EACH_REG_EXP_TREE_TYPE(MAKE_TYPE_CASE)
 #undef MAKE_TYPE_CASE
@@ -81,8 +77,12 @@
   ZoneGrowableArray<RegExpTree*>* nodes = this->nodes();
   for (intptr_t i = 0; i < nodes->length(); i++) {
     RegExpTree* node = nodes->At(i);
-    if (node->IsAnchoredAtStart()) { return true; }
-    if (node->max_match() > 0) { return false; }
+    if (node->IsAnchoredAtStart()) {
+      return true;
+    }
+    if (node->max_match() > 0) {
+      return false;
+    }
   }
   return false;
 }
@@ -92,8 +92,12 @@
   ZoneGrowableArray<RegExpTree*>* nodes = this->nodes();
   for (intptr_t i = nodes->length() - 1; i >= 0; i--) {
     RegExpTree* node = nodes->At(i);
-    if (node->IsAnchoredAtEnd()) { return true; }
-    if (node->max_match() > 0) { return false; }
+    if (node->IsAnchoredAtEnd()) {
+      return true;
+    }
+    if (node->max_match() > 0) {
+      return false;
+    }
   }
   return false;
 }
@@ -102,8 +106,7 @@
 bool RegExpDisjunction::IsAnchoredAtStart() const {
   ZoneGrowableArray<RegExpTree*>* alternatives = this->alternatives();
   for (intptr_t i = 0; i < alternatives->length(); i++) {
-    if (!alternatives->At(i)->IsAnchoredAtStart())
-      return false;
+    if (!alternatives->At(i)->IsAnchoredAtStart()) return false;
   }
   return true;
 }
@@ -112,8 +115,7 @@
 bool RegExpDisjunction::IsAnchoredAtEnd() const {
   ZoneGrowableArray<RegExpTree*>* alternatives = this->alternatives();
   for (intptr_t i = 0; i < alternatives->length(); i++) {
-    if (!alternatives->At(i)->IsAnchoredAtEnd())
-      return false;
+    if (!alternatives->At(i)->IsAnchoredAtEnd()) return false;
   }
   return true;
 }
@@ -142,8 +144,7 @@
 class RegExpUnparser : public RegExpVisitor {
  public:
   void VisitCharacterRange(CharacterRange that);
-#define MAKE_CASE(Name) virtual void* Visit##Name(RegExp##Name*,          \
-                                                  void* data);
+#define MAKE_CASE(Name) virtual void* Visit##Name(RegExp##Name*, void* data);
   FOR_EACH_REG_EXP_TREE_TYPE(MAKE_CASE)
 #undef MAKE_CASE
 };
@@ -151,7 +152,7 @@
 
 void* RegExpUnparser::VisitDisjunction(RegExpDisjunction* that, void* data) {
   OS::Print("(|");
-  for (intptr_t i = 0; i <  that->alternatives()->length(); i++) {
+  for (intptr_t i = 0; i < that->alternatives()->length(); i++) {
     OS::Print(" ");
     (*that->alternatives())[i]->Accept(this, data);
   }
@@ -180,7 +181,6 @@
 }
 
 
-
 void* RegExpUnparser::VisitCharacterClass(RegExpCharacterClass* that,
                                           void* data) {
   if (that->is_negated()) OS::Print("^");
@@ -207,7 +207,7 @@
       break;
     case RegExpAssertion::END_OF_LINE:
       OS::Print("@$l");
-       break;
+      break;
     case RegExpAssertion::BOUNDARY:
       OS::Print("@b");
       break;
@@ -275,8 +275,7 @@
 }
 
 
-void* RegExpUnparser::VisitBackReference(RegExpBackReference* that,
-                                         void*) {
+void* RegExpUnparser::VisitBackReference(RegExpBackReference* that, void*) {
   OS::Print("(<- %" Pd ")", that->index());
   return NULL;
 }
diff --git a/runtime/vm/regexp_ast.h b/runtime/vm/regexp_ast.h
index 1eca49b..3d5601a 100644
--- a/runtime/vm/regexp_ast.h
+++ b/runtime/vm/regexp_ast.h
@@ -28,8 +28,8 @@
 
 class RegExpVisitor : public ValueObject {
  public:
-  virtual ~RegExpVisitor() { }
-#define MAKE_CASE(Name)                                              \
+  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
@@ -53,8 +53,8 @@
   virtual Interval CaptureRegisters() const { return Interval::Empty(); }
   virtual void AppendToText(RegExpText* text);
   void Print();
-#define MAKE_ASTYPE(Name)                                                  \
-  virtual RegExp##Name* As##Name();                                        \
+#define MAKE_ASTYPE(Name)                                                      \
+  virtual RegExp##Name* As##Name();                                            \
   virtual bool Is##Name() const;
   FOR_EACH_REG_EXP_TREE_TYPE(MAKE_ASTYPE)
 #undef MAKE_ASTYPE
@@ -65,8 +65,7 @@
  public:
   explicit RegExpDisjunction(ZoneGrowableArray<RegExpTree*>* alternatives);
   virtual void* Accept(RegExpVisitor* visitor, void* data);
-  virtual RegExpNode* ToNode(RegExpCompiler* compiler,
-                             RegExpNode* on_success);
+  virtual RegExpNode* ToNode(RegExpCompiler* compiler, RegExpNode* on_success);
   virtual RegExpDisjunction* AsDisjunction();
   virtual Interval CaptureRegisters() const;
   virtual bool IsDisjunction() const;
@@ -75,6 +74,7 @@
   virtual intptr_t min_match() const { return min_match_; }
   virtual intptr_t max_match() const { return max_match_; }
   ZoneGrowableArray<RegExpTree*>* alternatives() const { return alternatives_; }
+
  private:
   ZoneGrowableArray<RegExpTree*>* alternatives_;
   intptr_t min_match_;
@@ -86,8 +86,7 @@
  public:
   explicit RegExpAlternative(ZoneGrowableArray<RegExpTree*>* nodes);
   virtual void* Accept(RegExpVisitor* visitor, void* data);
-  virtual RegExpNode* ToNode(RegExpCompiler* compiler,
-                             RegExpNode* on_success);
+  virtual RegExpNode* ToNode(RegExpCompiler* compiler, RegExpNode* on_success);
   virtual RegExpAlternative* AsAlternative();
   virtual Interval CaptureRegisters() const;
   virtual bool IsAlternative() const;
@@ -96,6 +95,7 @@
   virtual intptr_t min_match() const { return min_match_; }
   virtual intptr_t max_match() const { return max_match_; }
   ZoneGrowableArray<RegExpTree*>* nodes() const { return nodes_; }
+
  private:
   ZoneGrowableArray<RegExpTree*>* nodes_;
   intptr_t min_match_;
@@ -113,10 +113,9 @@
     BOUNDARY,
     NON_BOUNDARY
   };
-  explicit RegExpAssertion(AssertionType type) : assertion_type_(type) { }
+  explicit RegExpAssertion(AssertionType type) : assertion_type_(type) {}
   virtual void* Accept(RegExpVisitor* visitor, void* data);
-  virtual RegExpNode* ToNode(RegExpCompiler* compiler,
-                             RegExpNode* on_success);
+  virtual RegExpNode* ToNode(RegExpCompiler* compiler, RegExpNode* on_success);
   virtual RegExpAssertion* AsAssertion();
   virtual bool IsAssertion() const;
   virtual bool IsAnchoredAtStart() const;
@@ -124,6 +123,7 @@
   virtual intptr_t min_match() const { return 0; }
   virtual intptr_t max_match() const { return 0; }
   AssertionType assertion_type() const { return assertion_type_; }
+
  private:
   AssertionType assertion_type_;
 };
@@ -132,11 +132,9 @@
 class CharacterSet : public ValueObject {
  public:
   explicit CharacterSet(uint16_t standard_set_type)
-      : ranges_(NULL),
-        standard_set_type_(standard_set_type) {}
+      : ranges_(NULL), standard_set_type_(standard_set_type) {}
   explicit CharacterSet(ZoneGrowableArray<CharacterRange>* ranges)
-      : ranges_(ranges),
-        standard_set_type_(0) {}
+      : ranges_(ranges), standard_set_type_(0) {}
   CharacterSet(const CharacterSet& that)
       : ValueObject(),
         ranges_(that.ranges_),
@@ -148,6 +146,7 @@
   }
   bool is_standard() { return standard_set_type_ != 0; }
   void Canonicalize();
+
  private:
   ZoneGrowableArray<CharacterRange>* ranges_;
   // If non-zero, the value represents a standard set (e.g., all whitespace
@@ -160,14 +159,11 @@
  public:
   RegExpCharacterClass(ZoneGrowableArray<CharacterRange>* ranges,
                        bool is_negated)
-      : set_(ranges),
-        is_negated_(is_negated) { }
+      : set_(ranges), is_negated_(is_negated) {}
   explicit RegExpCharacterClass(uint16_t type)
-      : set_(type),
-        is_negated_(false) { }
+      : set_(type), is_negated_(false) {}
   virtual void* Accept(RegExpVisitor* visitor, void* data);
-  virtual RegExpNode* ToNode(RegExpCompiler* compiler,
-                             RegExpNode* on_success);
+  virtual RegExpNode* ToNode(RegExpCompiler* compiler, RegExpNode* on_success);
   virtual RegExpCharacterClass* AsCharacterClass();
   virtual bool IsCharacterClass() const;
   virtual bool IsTextElement() const { return true; }
@@ -190,9 +186,7 @@
   // . : non-unicode non-newline
   // * : All characters
   uint16_t standard_type() const { return set_.standard_set_type(); }
-  ZoneGrowableArray<CharacterRange>* ranges() {
-    return set_.ranges();
-  }
+  ZoneGrowableArray<CharacterRange>* ranges() { return set_.ranges(); }
   bool is_negated() const { return is_negated_; }
 
  private:
@@ -203,10 +197,9 @@
 
 class RegExpAtom : public RegExpTree {
  public:
-  explicit RegExpAtom(ZoneGrowableArray<uint16_t>* data) : data_(data) { }
+  explicit RegExpAtom(ZoneGrowableArray<uint16_t>* data) : data_(data) {}
   virtual void* Accept(RegExpVisitor* visitor, void* data);
-  virtual RegExpNode* ToNode(RegExpCompiler* compiler,
-                             RegExpNode* on_success);
+  virtual RegExpNode* ToNode(RegExpCompiler* compiler, RegExpNode* on_success);
   virtual RegExpAtom* AsAtom();
   virtual bool IsAtom() const;
   virtual bool IsTextElement() const { return true; }
@@ -215,6 +208,7 @@
   virtual void AppendToText(RegExpText* text);
   ZoneGrowableArray<uint16_t>* data() const { return data_; }
   intptr_t length() const { return data_->length(); }
+
  private:
   ZoneGrowableArray<uint16_t>* data_;
 };
@@ -224,19 +218,19 @@
  public:
   RegExpText() : elements_(2), length_(0) {}
   virtual void* Accept(RegExpVisitor* visitor, void* data);
-  virtual RegExpNode* ToNode(RegExpCompiler* compiler,
-                             RegExpNode* on_success);
+  virtual RegExpNode* ToNode(RegExpCompiler* compiler, RegExpNode* on_success);
   virtual RegExpText* AsText();
   virtual bool IsText() const;
   virtual bool IsTextElement() const { return true; }
   virtual intptr_t min_match() const { return length_; }
   virtual intptr_t max_match() const { return length_; }
   virtual void AppendToText(RegExpText* text);
-  void AddElement(TextElement elm)  {
+  void AddElement(TextElement elm) {
     elements_.Add(elm);
     length_ += elm.length();
   }
   GrowableArray<TextElement>* elements() { return &elements_; }
+
  private:
   GrowableArray<TextElement> elements_;
   intptr_t length_;
@@ -246,8 +240,10 @@
 class RegExpQuantifier : public RegExpTree {
  public:
   enum QuantifierType { GREEDY, NON_GREEDY, POSSESSIVE };
-  RegExpQuantifier(intptr_t min, intptr_t max,
-                   QuantifierType type, RegExpTree* body)
+  RegExpQuantifier(intptr_t min,
+                   intptr_t max,
+                   QuantifierType type,
+                   RegExpTree* body)
       : body_(body),
         min_(min),
         max_(max),
@@ -260,8 +256,7 @@
     }
   }
   virtual void* Accept(RegExpVisitor* visitor, void* data);
-  virtual RegExpNode* ToNode(RegExpCompiler* compiler,
-                             RegExpNode* on_success);
+  virtual RegExpNode* ToNode(RegExpCompiler* compiler, RegExpNode* on_success);
   static RegExpNode* ToNode(intptr_t min,
                             intptr_t max,
                             bool is_greedy,
@@ -294,10 +289,9 @@
 class RegExpCapture : public RegExpTree {
  public:
   explicit RegExpCapture(RegExpTree* body, intptr_t index)
-      : body_(body), index_(index) { }
+      : body_(body), index_(index) {}
   virtual void* Accept(RegExpVisitor* visitor, void* data);
-  virtual RegExpNode* ToNode(RegExpCompiler* compiler,
-                             RegExpNode* on_success);
+  virtual RegExpNode* ToNode(RegExpCompiler* compiler, RegExpNode* on_success);
   static RegExpNode* ToNode(RegExpTree* body,
                             intptr_t index,
                             RegExpCompiler* compiler,
@@ -329,11 +323,10 @@
       : body_(body),
         is_positive_(is_positive),
         capture_count_(capture_count),
-        capture_from_(capture_from) { }
+        capture_from_(capture_from) {}
 
   virtual void* Accept(RegExpVisitor* visitor, void* data);
-  virtual RegExpNode* ToNode(RegExpCompiler* compiler,
-                             RegExpNode* on_success);
+  virtual RegExpNode* ToNode(RegExpCompiler* compiler, RegExpNode* on_success);
   virtual RegExpLookahead* AsLookahead();
   virtual Interval CaptureRegisters() const;
   virtual bool IsLookahead() const;
@@ -355,17 +348,16 @@
 
 class RegExpBackReference : public RegExpTree {
  public:
-  explicit RegExpBackReference(RegExpCapture* capture)
-      : capture_(capture) { }
+  explicit RegExpBackReference(RegExpCapture* capture) : capture_(capture) {}
   virtual void* Accept(RegExpVisitor* visitor, void* data);
-  virtual RegExpNode* ToNode(RegExpCompiler* compiler,
-                             RegExpNode* on_success);
+  virtual RegExpNode* ToNode(RegExpCompiler* compiler, RegExpNode* on_success);
   virtual RegExpBackReference* AsBackReference();
   virtual bool IsBackReference() const;
   virtual intptr_t min_match() const { return 0; }
   virtual intptr_t max_match() const { return capture_->max_match(); }
   intptr_t index() const { return capture_->index(); }
   RegExpCapture* capture() const { return capture_; }
+
  private:
   RegExpCapture* capture_;
 };
@@ -373,10 +365,9 @@
 
 class RegExpEmpty : public RegExpTree {
  public:
-  RegExpEmpty() { }
+  RegExpEmpty() {}
   virtual void* Accept(RegExpVisitor* visitor, void* data);
-  virtual RegExpNode* ToNode(RegExpCompiler* compiler,
-                             RegExpNode* on_success);
+  virtual RegExpNode* ToNode(RegExpCompiler* compiler, RegExpNode* on_success);
   virtual RegExpEmpty* AsEmpty();
   virtual bool IsEmpty() const;
   virtual intptr_t min_match() const { return 0; }
diff --git a/runtime/vm/regexp_bytecodes.h b/runtime/vm/regexp_bytecodes.h
index 67d26dc..c2ef82b 100644
--- a/runtime/vm/regexp_bytecodes.h
+++ b/runtime/vm/regexp_bytecodes.h
@@ -14,6 +14,7 @@
 const unsigned int MAX_FIRST_ARG = 0x7fffffu;
 const int BYTECODE_SHIFT = 8;
 
+// clang-format off
 #define BYTECODE_ITERATOR(V)                                                   \
 V(BREAK,              0, 4)   /* bc8                                        */ \
 V(PUSH_CP,            1, 4)   /* bc8 pad24                                  */ \
@@ -64,12 +65,13 @@
 V(ADVANCE_CP_AND_GOTO, 46, 8) /* bc8 offset24 addr32                        */ \
 V(SET_CURRENT_POSITION_FROM_END, 47, 4) /* bc8 idx24                        */
 
-#define DECLARE_BYTECODES(name, code, length) \
-  static const int BC_##name = code;
+// clang-format on
+
+#define DECLARE_BYTECODES(name, code, length) static const int BC_##name = code;
 BYTECODE_ITERATOR(DECLARE_BYTECODES)
 #undef DECLARE_BYTECODES
 
-#define DECLARE_BYTECODE_LENGTH(name, code, length) \
+#define DECLARE_BYTECODE_LENGTH(name, code, length)                            \
   static const int BC_##name##_LENGTH = length;
 BYTECODE_ITERATOR(DECLARE_BYTECODE_LENGTH)
 #undef DECLARE_BYTECODE_LENGTH
diff --git a/runtime/vm/regexp_interpreter.cc b/runtime/vm/regexp_interpreter.cc
index b036ec8..956d4ba 100644
--- a/runtime/vm/regexp_interpreter.cc
+++ b/runtime/vm/regexp_interpreter.cc
@@ -19,7 +19,7 @@
 
 typedef unibrow::Mapping<unibrow::Ecma262Canonicalize> Canonicalize;
 
-template<typename Char>
+template <typename Char>
 static bool BackRefMatchesNoCase(Canonicalize* interp_canonicalize,
                                  intptr_t from,
                                  intptr_t current,
@@ -36,8 +36,8 @@
     int32_t old_char = subject.CharAt(from++);
     int32_t new_char = subject.CharAt(current++);
     if (old_char == new_char) continue;
-    int32_t old_string[1] = { old_char };
-    int32_t new_string[1] = { new_char };
+    int32_t old_string[1] = {old_char};
+    int32_t new_string[1] = {new_char};
     interp_canonicalize->get(old_char, '\0', old_string);
     interp_canonicalize->get(new_char, '\0', new_string);
     if (old_string[0] != new_string[0]) {
@@ -82,16 +82,11 @@
   if (FLAG_trace_regexp_bytecodes) {
     bool printable = (current_char < 127 && current_char >= 32);
     const char* format =
-        printable ?
-        "pc = %02x, sp = %d, curpos = %d, curchar = %08x (%c), bc = %s" :
-        "pc = %02x, sp = %d, curpos = %d, curchar = %08x .%c., bc = %s";
-    OS::Print(format,
-              pc - code_base,
-              stack_depth,
-              current_position,
-              current_char,
-              printable ? current_char : '.',
-              bytecode_name);
+        printable
+            ? "pc = %02x, sp = %d, curpos = %d, curchar = %08x (%c), bc = %s"
+            : "pc = %02x, sp = %d, curpos = %d, curchar = %08x .%c., bc = %s";
+    OS::Print(format, pc - code_base, stack_depth, current_position,
+              current_char, printable ? current_char : '.', bytecode_name);
     for (int i = 0; i < bytecode_length; i++) {
       OS::Print(", %02x", pc[i]);
     }
@@ -109,30 +104,25 @@
 }
 
 
-#define BYTECODE(name)                                                      \
-  case BC_##name:                                                           \
-    TraceInterpreter(code_base,                                             \
-                     pc,                                                    \
-                     static_cast<int>(backtrack_sp - backtrack_stack_base), \
-                     current,                                               \
-                     current_char,                                          \
-                     BC_##name##_LENGTH,                                    \
-                     #name);
+#define BYTECODE(name)                                                         \
+  case BC_##name:                                                              \
+    TraceInterpreter(code_base, pc,                                            \
+                     static_cast<int>(backtrack_sp - backtrack_stack_base),    \
+                     current, current_char, BC_##name##_LENGTH, #name);
 #else
-#define BYTECODE(name)                                                      \
-  case BC_##name:
+#define BYTECODE(name) case BC_##name:
 #endif
 
 
 static int32_t Load32Aligned(const uint8_t* pc) {
   ASSERT((reinterpret_cast<intptr_t>(pc) & 3) == 0);
-  return *reinterpret_cast<const int32_t *>(pc);
+  return *reinterpret_cast<const int32_t*>(pc);
 }
 
 
 static int32_t Load16Aligned(const uint8_t* pc) {
   ASSERT((reinterpret_cast<intptr_t>(pc) & 1) == 0);
-  return *reinterpret_cast<const uint16_t *>(pc);
+  return *reinterpret_cast<const uint16_t*>(pc);
 }
 
 
@@ -190,97 +180,98 @@
     int32_t insn = Load32Aligned(pc);
     switch (insn & BYTECODE_MASK) {
       BYTECODE(BREAK)
-        UNREACHABLE();
-        return IrregexpInterpreter::RE_FAILURE;
+      UNREACHABLE();
+      return IrregexpInterpreter::RE_FAILURE;
       BYTECODE(PUSH_CP)
-        if (--backtrack_stack_space < 0) {
-          return IrregexpInterpreter::RE_EXCEPTION;
-        }
-        *backtrack_sp++ = current;
-        pc += BC_PUSH_CP_LENGTH;
-        break;
+      if (--backtrack_stack_space < 0) {
+        return IrregexpInterpreter::RE_EXCEPTION;
+      }
+      *backtrack_sp++ = current;
+      pc += BC_PUSH_CP_LENGTH;
+      break;
       BYTECODE(PUSH_BT)
-        if (--backtrack_stack_space < 0) {
-          return IrregexpInterpreter::RE_EXCEPTION;
-        }
-        *backtrack_sp++ = Load32Aligned(pc + 4);
-        pc += BC_PUSH_BT_LENGTH;
-        break;
+      if (--backtrack_stack_space < 0) {
+        return IrregexpInterpreter::RE_EXCEPTION;
+      }
+      *backtrack_sp++ = Load32Aligned(pc + 4);
+      pc += BC_PUSH_BT_LENGTH;
+      break;
       BYTECODE(PUSH_REGISTER)
-        if (--backtrack_stack_space < 0) {
-          return IrregexpInterpreter::RE_EXCEPTION;
-        }
-        *backtrack_sp++ = registers[insn >> BYTECODE_SHIFT];
-        pc += BC_PUSH_REGISTER_LENGTH;
-        break;
+      if (--backtrack_stack_space < 0) {
+        return IrregexpInterpreter::RE_EXCEPTION;
+      }
+      *backtrack_sp++ = registers[insn >> BYTECODE_SHIFT];
+      pc += BC_PUSH_REGISTER_LENGTH;
+      break;
       BYTECODE(SET_REGISTER)
-        registers[insn >> BYTECODE_SHIFT] = Load32Aligned(pc + 4);
-        pc += BC_SET_REGISTER_LENGTH;
-        break;
+      registers[insn >> BYTECODE_SHIFT] = Load32Aligned(pc + 4);
+      pc += BC_SET_REGISTER_LENGTH;
+      break;
       BYTECODE(ADVANCE_REGISTER)
-        registers[insn >> BYTECODE_SHIFT] += Load32Aligned(pc + 4);
-        pc += BC_ADVANCE_REGISTER_LENGTH;
-        break;
+      registers[insn >> BYTECODE_SHIFT] += Load32Aligned(pc + 4);
+      pc += BC_ADVANCE_REGISTER_LENGTH;
+      break;
       BYTECODE(SET_REGISTER_TO_CP)
-        registers[insn >> BYTECODE_SHIFT] = current + Load32Aligned(pc + 4);
-        pc += BC_SET_REGISTER_TO_CP_LENGTH;
-        break;
+      registers[insn >> BYTECODE_SHIFT] = current + Load32Aligned(pc + 4);
+      pc += BC_SET_REGISTER_TO_CP_LENGTH;
+      break;
       BYTECODE(SET_CP_TO_REGISTER)
-        current = registers[insn >> BYTECODE_SHIFT];
-        pc += BC_SET_CP_TO_REGISTER_LENGTH;
-        break;
+      current = registers[insn >> BYTECODE_SHIFT];
+      pc += BC_SET_CP_TO_REGISTER_LENGTH;
+      break;
       BYTECODE(SET_REGISTER_TO_SP)
-        registers[insn >> BYTECODE_SHIFT] =
-            static_cast<int>(backtrack_sp - backtrack_stack_base);
-        pc += BC_SET_REGISTER_TO_SP_LENGTH;
-        break;
+      registers[insn >> BYTECODE_SHIFT] =
+          static_cast<int>(backtrack_sp - backtrack_stack_base);
+      pc += BC_SET_REGISTER_TO_SP_LENGTH;
+      break;
       BYTECODE(SET_SP_TO_REGISTER)
-        backtrack_sp = backtrack_stack_base + registers[insn >> BYTECODE_SHIFT];
-        backtrack_stack_space = backtrack_stack.max_size() -
-            static_cast<int>(backtrack_sp - backtrack_stack_base);
-        pc += BC_SET_SP_TO_REGISTER_LENGTH;
-        break;
+      backtrack_sp = backtrack_stack_base + registers[insn >> BYTECODE_SHIFT];
+      backtrack_stack_space =
+          backtrack_stack.max_size() -
+          static_cast<int>(backtrack_sp - backtrack_stack_base);
+      pc += BC_SET_SP_TO_REGISTER_LENGTH;
+      break;
       BYTECODE(POP_CP)
-        backtrack_stack_space++;
-        --backtrack_sp;
-        current = *backtrack_sp;
-        pc += BC_POP_CP_LENGTH;
-        break;
+      backtrack_stack_space++;
+      --backtrack_sp;
+      current = *backtrack_sp;
+      pc += BC_POP_CP_LENGTH;
+      break;
       BYTECODE(POP_BT)
-        backtrack_stack_space++;
-        --backtrack_sp;
-        pc = code_base + *backtrack_sp;
-        break;
+      backtrack_stack_space++;
+      --backtrack_sp;
+      pc = code_base + *backtrack_sp;
+      break;
       BYTECODE(POP_REGISTER)
-        backtrack_stack_space++;
-        --backtrack_sp;
-        registers[insn >> BYTECODE_SHIFT] = *backtrack_sp;
-        pc += BC_POP_REGISTER_LENGTH;
-        break;
+      backtrack_stack_space++;
+      --backtrack_sp;
+      registers[insn >> BYTECODE_SHIFT] = *backtrack_sp;
+      pc += BC_POP_REGISTER_LENGTH;
+      break;
       BYTECODE(FAIL)
-        return IrregexpInterpreter::RE_FAILURE;
+      return IrregexpInterpreter::RE_FAILURE;
       BYTECODE(SUCCEED)
-        return IrregexpInterpreter::RE_SUCCESS;
+      return IrregexpInterpreter::RE_SUCCESS;
       BYTECODE(ADVANCE_CP)
-        current += insn >> BYTECODE_SHIFT;
-        pc += BC_ADVANCE_CP_LENGTH;
-        break;
+      current += insn >> BYTECODE_SHIFT;
+      pc += BC_ADVANCE_CP_LENGTH;
+      break;
       BYTECODE(GOTO)
-        pc = code_base + Load32Aligned(pc + 4);
-        break;
+      pc = code_base + Load32Aligned(pc + 4);
+      break;
       BYTECODE(ADVANCE_CP_AND_GOTO)
-        current += insn >> BYTECODE_SHIFT;
-        pc = code_base + Load32Aligned(pc + 4);
-        break;
+      current += insn >> BYTECODE_SHIFT;
+      pc = code_base + Load32Aligned(pc + 4);
+      break;
       BYTECODE(CHECK_GREEDY)
-        if (current == backtrack_sp[-1]) {
-          backtrack_sp--;
-          backtrack_stack_space++;
-          pc = code_base + Load32Aligned(pc + 4);
-        } else {
-          pc += BC_CHECK_GREEDY_LENGTH;
-        }
-        break;
+      if (current == backtrack_sp[-1]) {
+        backtrack_sp--;
+        backtrack_stack_space++;
+        pc = code_base + Load32Aligned(pc + 4);
+      } else {
+        pc += BC_CHECK_GREEDY_LENGTH;
+      }
+      break;
       BYTECODE(LOAD_CURRENT_CHAR) {
         int pos = current + (insn >> BYTECODE_SHIFT);
         if (pos >= subject_length) {
@@ -303,8 +294,8 @@
           pc = code_base + Load32Aligned(pc + 4);
         } else {
           Char next = subject.CharAt(pos + 1);
-          current_char = subject.CharAt(pos) |
-                         (next << (kBitsPerByte * sizeof(Char)));
+          current_char =
+              subject.CharAt(pos) | (next << (kBitsPerByte * sizeof(Char)));
           pc += BC_LOAD_2_CURRENT_CHARS_LENGTH;
         }
         break;
@@ -312,8 +303,8 @@
       BYTECODE(LOAD_2_CURRENT_CHARS_UNCHECKED) {
         int pos = current + (insn >> BYTECODE_SHIFT);
         Char next = subject.CharAt(pos + 1);
-        current_char = subject.CharAt(pos) |
-                       (next << (kBitsPerByte * sizeof(Char)));
+        current_char =
+            subject.CharAt(pos) | (next << (kBitsPerByte * sizeof(Char)));
         pc += BC_LOAD_2_CURRENT_CHARS_UNCHECKED_LENGTH;
         break;
       }
@@ -326,9 +317,7 @@
           Char next1 = subject.CharAt(pos + 1);
           Char next2 = subject.CharAt(pos + 2);
           Char next3 = subject.CharAt(pos + 3);
-          current_char = (subject.CharAt(pos) |
-                          (next1 << 8) |
-                          (next2 << 16) |
+          current_char = (subject.CharAt(pos) | (next1 << 8) | (next2 << 16) |
                           (next3 << 24));
           pc += BC_LOAD_4_CURRENT_CHARS_LENGTH;
         }
@@ -340,9 +329,7 @@
         Char next1 = subject.CharAt(pos + 1);
         Char next2 = subject.CharAt(pos + 2);
         Char next3 = subject.CharAt(pos + 3);
-        current_char = (subject.CharAt(pos) |
-                        (next1 << 8) |
-                        (next2 << 16) |
+        current_char = (subject.CharAt(pos) | (next1 << 8) | (next2 << 16) |
                         (next3 << 24));
         pc += BC_LOAD_4_CURRENT_CHARS_UNCHECKED_LENGTH;
         break;
@@ -480,34 +467,34 @@
         break;
       }
       BYTECODE(CHECK_REGISTER_LT)
-        if (registers[insn >> BYTECODE_SHIFT] < Load32Aligned(pc + 4)) {
-          pc = code_base + Load32Aligned(pc + 8);
-        } else {
-          pc += BC_CHECK_REGISTER_LT_LENGTH;
-        }
-        break;
+      if (registers[insn >> BYTECODE_SHIFT] < Load32Aligned(pc + 4)) {
+        pc = code_base + Load32Aligned(pc + 8);
+      } else {
+        pc += BC_CHECK_REGISTER_LT_LENGTH;
+      }
+      break;
       BYTECODE(CHECK_REGISTER_GE)
-        if (registers[insn >> BYTECODE_SHIFT] >= Load32Aligned(pc + 4)) {
-          pc = code_base + Load32Aligned(pc + 8);
-        } else {
-          pc += BC_CHECK_REGISTER_GE_LENGTH;
-        }
-        break;
+      if (registers[insn >> BYTECODE_SHIFT] >= Load32Aligned(pc + 4)) {
+        pc = code_base + Load32Aligned(pc + 8);
+      } else {
+        pc += BC_CHECK_REGISTER_GE_LENGTH;
+      }
+      break;
       BYTECODE(CHECK_REGISTER_EQ_POS)
-        if (registers[insn >> BYTECODE_SHIFT] == current) {
-          pc = code_base + Load32Aligned(pc + 4);
-        } else {
-          pc += BC_CHECK_REGISTER_EQ_POS_LENGTH;
-        }
-        break;
+      if (registers[insn >> BYTECODE_SHIFT] == current) {
+        pc = code_base + Load32Aligned(pc + 4);
+      } else {
+        pc += BC_CHECK_REGISTER_EQ_POS_LENGTH;
+      }
+      break;
       BYTECODE(CHECK_NOT_REGS_EQUAL)
-        if (registers[insn >> BYTECODE_SHIFT] ==
-            registers[Load32Aligned(pc + 4)]) {
-          pc += BC_CHECK_NOT_REGS_EQUAL_LENGTH;
-        } else {
-          pc = code_base + Load32Aligned(pc + 8);
-        }
-        break;
+      if (registers[insn >> BYTECODE_SHIFT] ==
+          registers[Load32Aligned(pc + 4)]) {
+        pc += BC_CHECK_NOT_REGS_EQUAL_LENGTH;
+      } else {
+        pc = code_base + Load32Aligned(pc + 8);
+      }
+      break;
       BYTECODE(CHECK_NOT_BACK_REF) {
         int from = registers[insn >> BYTECODE_SHIFT];
         int len = registers[(insn >> BYTECODE_SHIFT) + 1] - from;
@@ -543,8 +530,8 @@
           pc = code_base + Load32Aligned(pc + 4);
           break;
         } else {
-          if (BackRefMatchesNoCase<Char>(&canonicalize,
-                                         from, current, len, subject)) {
+          if (BackRefMatchesNoCase<Char>(&canonicalize, from, current, len,
+                                         subject)) {
             current += len;
             pc += BC_CHECK_NOT_BACK_REF_NO_CASE_LENGTH;
           } else {
@@ -554,19 +541,19 @@
         break;
       }
       BYTECODE(CHECK_AT_START)
-        if (current == 0) {
-          pc = code_base + Load32Aligned(pc + 4);
-        } else {
-          pc += BC_CHECK_AT_START_LENGTH;
-        }
-        break;
+      if (current == 0) {
+        pc = code_base + Load32Aligned(pc + 4);
+      } else {
+        pc += BC_CHECK_AT_START_LENGTH;
+      }
+      break;
       BYTECODE(CHECK_NOT_AT_START)
-        if (current == 0) {
-          pc += BC_CHECK_NOT_AT_START_LENGTH;
-        } else {
-          pc = code_base + Load32Aligned(pc + 4);
-        }
-        break;
+      if (current == 0) {
+        pc += BC_CHECK_NOT_AT_START_LENGTH;
+      } else {
+        pc = code_base + Load32Aligned(pc + 4);
+      }
+      break;
       BYTECODE(SET_CURRENT_POSITION_FROM_END) {
         int by = static_cast<uint32_t>(insn) >> BYTECODE_SHIFT;
         if (subject_length - current > by) {
@@ -599,19 +586,11 @@
   }
 
   if (subject.IsOneByteString() || subject.IsExternalOneByteString()) {
-    return RawMatch<uint8_t>(code_base,
-                             subject,
-                             registers,
-                             start_position,
-                             previous_char,
-                             zone);
+    return RawMatch<uint8_t>(code_base, subject, registers, start_position,
+                             previous_char, zone);
   } else if (subject.IsTwoByteString() || subject.IsExternalTwoByteString()) {
-    return RawMatch<uint16_t>(code_base,
-                              subject,
-                              registers,
-                              start_position,
-                              previous_char,
-                              zone);
+    return RawMatch<uint16_t>(code_base, subject, registers, start_position,
+                              previous_char, zone);
   } else {
     UNREACHABLE();
     return IrregexpInterpreter::RE_FAILURE;
diff --git a/runtime/vm/regexp_interpreter.h b/runtime/vm/regexp_interpreter.h
index e6b1898..9e4e567 100644
--- a/runtime/vm/regexp_interpreter.h
+++ b/runtime/vm/regexp_interpreter.h
@@ -15,11 +15,7 @@
 
 class IrregexpInterpreter : public AllStatic {
  public:
-  enum IrregexpResult {
-    RE_FAILURE = 0,
-    RE_SUCCESS = 1,
-    RE_EXCEPTION = -1
-  };
+  enum IrregexpResult { RE_FAILURE = 0, RE_SUCCESS = 1, RE_EXCEPTION = -1 };
 
   static IrregexpResult Match(const TypedData& bytecode,
                               const String& subject,
diff --git a/runtime/vm/regexp_parser.cc b/runtime/vm/regexp_parser.cc
index c4d471a..f75b30f 100644
--- a/runtime/vm/regexp_parser.cc
+++ b/runtime/vm/regexp_parser.cc
@@ -21,15 +21,17 @@
       text_(),
       alternatives_()
 #ifdef DEBUG
-    , last_added_(ADD_NONE)
+      ,
+      last_added_(ADD_NONE)
 #endif
-  {}
+{
+}
 
 
 void RegExpBuilder::FlushCharacters() {
   pending_empty_ = false;
   if (characters_ != NULL) {
-    RegExpTree* atom = new(Z) RegExpAtom(characters_);
+    RegExpTree* atom = new (Z) RegExpAtom(characters_);
     characters_ = NULL;
     text_.Add(atom);
     LAST(ADD_ATOM);
@@ -45,7 +47,7 @@
   } else if (num_text == 1) {
     terms_.Add(text_.Last());
   } else {
-    RegExpText* text = new(Z) RegExpText();
+    RegExpText* text = new (Z) RegExpText();
     for (intptr_t i = 0; i < num_text; i++)
       text_[i]->AppendToText(text);
     terms_.Add(text);
@@ -57,7 +59,7 @@
 void RegExpBuilder::AddCharacter(uint16_t c) {
   pending_empty_ = false;
   if (characters_ == NULL) {
-    characters_ = new(Z) ZoneGrowableArray<uint16_t>(4);
+    characters_ = new (Z) ZoneGrowableArray<uint16_t>(4);
   }
   characters_->Add(c);
   LAST(ADD_CHAR);
@@ -107,11 +109,11 @@
     alternative = terms_.Last();
   } else {
     ZoneGrowableArray<RegExpTree*>* terms =
-        new(Z) ZoneGrowableArray<RegExpTree*>();
+        new (Z) ZoneGrowableArray<RegExpTree*>();
     for (intptr_t i = 0; i < terms_.length(); i++) {
       terms->Add(terms_[i]);
     }
-    alternative = new(Z) RegExpAlternative(terms);
+    alternative = new (Z) RegExpAlternative(terms);
   }
   alternatives_.Add(alternative);
   terms_.Clear();
@@ -129,11 +131,11 @@
     return alternatives_.Last();
   }
   ZoneGrowableArray<RegExpTree*>* alternatives =
-      new(Z) ZoneGrowableArray<RegExpTree*>();
+      new (Z) ZoneGrowableArray<RegExpTree*>();
   for (intptr_t i = 0; i < alternatives_.length(); i++) {
     alternatives->Add(alternatives_[i]);
   }
-  return new(Z) RegExpDisjunction(alternatives);
+  return new (Z) RegExpDisjunction(alternatives);
 }
 
 
@@ -150,23 +152,23 @@
     DEBUG_ASSERT(last_added_ == ADD_CHAR);
     // Last atom was character.
 
-    ZoneGrowableArray<uint16_t> *char_vector =
-        new(Z) ZoneGrowableArray<uint16_t>();
+    ZoneGrowableArray<uint16_t>* char_vector =
+        new (Z) ZoneGrowableArray<uint16_t>();
     char_vector->AddArray(*characters_);
     intptr_t num_chars = char_vector->length();
     if (num_chars > 1) {
-      ZoneGrowableArray<uint16_t> *prefix =
-          new(Z) ZoneGrowableArray<uint16_t>();
+      ZoneGrowableArray<uint16_t>* prefix =
+          new (Z) ZoneGrowableArray<uint16_t>();
       for (intptr_t i = 0; i < num_chars - 1; i++) {
         prefix->Add(char_vector->At(i));
       }
-      text_.Add(new(Z) RegExpAtom(prefix));
-      ZoneGrowableArray<uint16_t> *tail = new(Z) ZoneGrowableArray<uint16_t>();
+      text_.Add(new (Z) RegExpAtom(prefix));
+      ZoneGrowableArray<uint16_t>* tail = new (Z) ZoneGrowableArray<uint16_t>();
       tail->Add(char_vector->At(num_chars - 1));
       char_vector = tail;
     }
     characters_ = NULL;
-    atom = new(Z) RegExpAtom(char_vector);
+    atom = new (Z) RegExpAtom(char_vector);
     FlushText();
   } else if (text_.length() > 0) {
     DEBUG_ASSERT(last_added_ == ADD_ATOM);
@@ -189,16 +191,14 @@
     UNREACHABLE();
     return;
   }
-  terms_.Add(new(Z) RegExpQuantifier(min, max, quantifier_type, atom));
+  terms_.Add(new (Z) RegExpQuantifier(min, max, quantifier_type, atom));
   LAST(ADD_TERM);
 }
 
 // ----------------------------------------------------------------------------
 // Implementation of Parser
 
-RegExpParser::RegExpParser(const String& in,
-                           String* error,
-                           bool multiline)
+RegExpParser::RegExpParser(const String& in, String* error, bool multiline)
     : zone_(Thread::Current()->zone()),
       error_(error),
       captures_(NULL),
@@ -216,7 +216,7 @@
 }
 
 
-bool RegExpParser::ParseFunction(ParsedFunction *parsed_function) {
+bool RegExpParser::ParseFunction(ParsedFunction* parsed_function) {
   VMTagScope tagScope(parsed_function->thread(),
                       VMTag::kCompileParseRegExpTagId);
   Zone* zone = parsed_function->zone();
@@ -225,7 +225,7 @@
   const String& pattern = String::Handle(regexp.pattern());
   const bool multiline = regexp.is_multi_line();
 
-  RegExpCompileData* compile_data = new(zone) RegExpCompileData();
+  RegExpCompileData* compile_data = new (zone) RegExpCompileData();
   if (!RegExpParser::ParseRegExp(pattern, multiline, compile_data)) {
     // Parsing failures are handled in the RegExp factory constructor.
     UNREACHABLE();
@@ -327,314 +327,325 @@
   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("Unterminated group");
-        UNREACHABLE();
-      }
-      ASSERT(INITIAL == stored_state->group_type());
-      // Parsing completed successfully.
-      return builder->ToRegExp();
-    case ')': {
-      if (!stored_state->IsSubexpression()) {
-        ReportError("Unmatched ')'");
-        UNREACHABLE();
-      }
-      ASSERT(INITIAL != stored_state->group_type());
-
-      Advance();
-      // End disjunction parsing and convert builder content to new single
-      // regexp atom.
-      RegExpTree* body = builder->ToRegExp();
-
-      intptr_t end_capture_index = captures_started();
-
-      intptr_t 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(Z) RegExpCapture(body, capture_index);
-        (*captures_)[capture_index - 1] = capture;
-        body = capture;
-      } else if (group_type != GROUPING) {
-        ASSERT(group_type == POSITIVE_LOOKAHEAD ||
-               group_type == NEGATIVE_LOOKAHEAD);
-        bool is_positive = (group_type == POSITIVE_LOOKAHEAD);
-        body = new(Z) RegExpLookahead(body,
-                                      is_positive,
-                                      end_capture_index - capture_index,
-                                      capture_index);
-      }
-      builder->AddAtom(body);
-      // For compatibility with JSC and ES3, we allow quantifiers after
-      // lookaheads, and break in all cases.
-      break;
-    }
-    case '|': {
-      Advance();
-      builder->NewAlternative();
-      continue;
-    }
-    case '*':
-    case '+':
-    case '?':
-      ReportError("Nothing to repeat");
-      UNREACHABLE();
-    case '^': {
-      Advance();
-      if (multiline_) {
-        builder->AddAssertion(
-            new(Z) RegExpAssertion(RegExpAssertion::START_OF_LINE));
-      } else {
-        builder->AddAssertion(
-            new(Z) 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 RegExpAssertion(assertion_type));
-      continue;
-    }
-    case '.': {
-      Advance();
-      // everything except \x0a, \x0d, \u2028 and \u2029
-      ZoneGrowableArray<CharacterRange>* ranges =
-          new ZoneGrowableArray<CharacterRange>(2);
-      CharacterRange::AddClassEscape('.', ranges);
-      RegExpTree* atom = new 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("Invalid group");
-            UNREACHABLE();
-        }
-        Advance(2);
-      } else {
-        if (captures_ == NULL) {
-          captures_ = new ZoneGrowableArray<RegExpCapture*>(2);
-        }
-        if (captures_started() >= kMaxCaptures) {
-          ReportError("Too many captures");
+      case kEndMarker:
+        if (stored_state->IsSubexpression()) {
+          // Inside a parenthesized group when hitting end of input.
+          ReportError("Unterminated group");
           UNREACHABLE();
         }
-        captures_->Add(NULL);
+        ASSERT(INITIAL == stored_state->group_type());
+        // Parsing completed successfully.
+        return builder->ToRegExp();
+      case ')': {
+        if (!stored_state->IsSubexpression()) {
+          ReportError("Unmatched ')'");
+          UNREACHABLE();
+        }
+        ASSERT(INITIAL != stored_state->group_type());
+
+        Advance();
+        // End disjunction parsing and convert builder content to new single
+        // regexp atom.
+        RegExpTree* body = builder->ToRegExp();
+
+        intptr_t end_capture_index = captures_started();
+
+        intptr_t 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 (Z) RegExpCapture(body, capture_index);
+          (*captures_)[capture_index - 1] = capture;
+          body = capture;
+        } else if (group_type != GROUPING) {
+          ASSERT(group_type == POSITIVE_LOOKAHEAD ||
+                 group_type == NEGATIVE_LOOKAHEAD);
+          bool is_positive = (group_type == POSITIVE_LOOKAHEAD);
+          body = new (Z)
+              RegExpLookahead(body, is_positive,
+                              end_capture_index - capture_index, capture_index);
+        }
+        builder->AddAtom(body);
+        // For compatibility with JSC and ES3, we allow quantifiers after
+        // lookaheads, and break in all cases.
+        break;
       }
-      // Store current state and begin new disjunction parsing.
-      stored_state = new RegExpParserState(stored_state, subexpr_type,
-                                           captures_started(), Z);
-      builder = stored_state->builder();
-      continue;
-    }
-    case '[': {
-      RegExpTree* atom = ParseCharacterClass();
-      builder->AddAtom(atom);
-      break;
-    }
-    // Atom ::
-    //   \ AtomEscape
-    case '\\':
-      switch (Next()) {
-      case kEndMarker:
-        ReportError("\\ at end of pattern");
+      case '|': {
+        Advance();
+        builder->NewAlternative();
+        continue;
+      }
+      case '*':
+      case '+':
+      case '?':
+        ReportError("Nothing to repeat");
         UNREACHABLE();
-      case 'b':
-        Advance(2);
-        builder->AddAssertion(
-            new RegExpAssertion(RegExpAssertion::BOUNDARY));
+      case '^': {
+        Advance();
+        if (multiline_) {
+          builder->AddAssertion(
+              new (Z) RegExpAssertion(RegExpAssertion::START_OF_LINE));
+        } else {
+          builder->AddAssertion(
+              new (Z) RegExpAssertion(RegExpAssertion::START_OF_INPUT));
+          set_contains_anchor();
+        }
         continue;
-      case 'B':
-        Advance(2);
-        builder->AddAssertion(
-            new RegExpAssertion(RegExpAssertion::NON_BOUNDARY));
+      }
+      case '$': {
+        Advance();
+        RegExpAssertion::AssertionType assertion_type =
+            multiline_ ? RegExpAssertion::END_OF_LINE
+                       : RegExpAssertion::END_OF_INPUT;
+        builder->AddAssertion(new RegExpAssertion(assertion_type));
         continue;
-      // AtomEscape ::
-      //   CharacterClassEscape
-      //
-      // CharacterClassEscape :: one of
-      //   d D s S w W
-      case 'd': case 'D': case 's': case 'S': case 'w': case 'W': {
-        uint32_t c = Next();
-        Advance(2);
+      }
+      case '.': {
+        Advance();
+        // everything except \x0a, \x0d, \u2028 and \u2029
         ZoneGrowableArray<CharacterRange>* ranges =
             new ZoneGrowableArray<CharacterRange>(2);
-        CharacterRange::AddClassEscape(c, ranges);
+        CharacterRange::AddClassEscape('.', ranges);
         RegExpTree* atom = new 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': {
-        intptr_t index = 0;
-        if (ParseBackReferenceIndex(&index)) {
-          RegExpCapture* capture = NULL;
-          if (captures_ != NULL && index <= captures_->length()) {
-            capture = captures_->At(index - 1);
+      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("Invalid group");
+              UNREACHABLE();
           }
-          if (capture == NULL) {
-            builder->AddEmpty();
+          Advance(2);
+        } else {
+          if (captures_ == NULL) {
+            captures_ = new ZoneGrowableArray<RegExpCapture*>(2);
+          }
+          if (captures_started() >= kMaxCaptures) {
+            ReportError("Too many captures");
+            UNREACHABLE();
+          }
+          captures_->Add(NULL);
+        }
+        // Store current state and begin new disjunction parsing.
+        stored_state = new RegExpParserState(stored_state, subexpr_type,
+                                             captures_started(), Z);
+        builder = stored_state->builder();
+        continue;
+      }
+      case '[': {
+        RegExpTree* atom = ParseCharacterClass();
+        builder->AddAtom(atom);
+        break;
+      }
+      // Atom ::
+      //   \ AtomEscape
+      case '\\':
+        switch (Next()) {
+          case kEndMarker:
+            ReportError("\\ at end of pattern");
+            UNREACHABLE();
+          case 'b':
+            Advance(2);
+            builder->AddAssertion(
+                new RegExpAssertion(RegExpAssertion::BOUNDARY));
+            continue;
+          case 'B':
+            Advance(2);
+            builder->AddAssertion(
+                new 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': {
+            uint32_t c = Next();
+            Advance(2);
+            ZoneGrowableArray<CharacterRange>* ranges =
+                new ZoneGrowableArray<CharacterRange>(2);
+            CharacterRange::AddClassEscape(c, ranges);
+            RegExpTree* atom = new RegExpCharacterClass(ranges, false);
+            builder->AddAtom(atom);
             break;
           }
-          RegExpTree* atom = new RegExpBackReference(capture);
-          builder->AddAtom(atom);
-          break;
-        }
-        uint32_t 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();
-        uint32_t 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();
-        uint32_t controlLetter = Next();
-        // Special case if it is an ASCII letter.
-        // Convert lower case letters to uppercase.
-        uint32_t 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);
+          case '1':
+          case '2':
+          case '3':
+          case '4':
+          case '5':
+          case '6':
+          case '7':
+          case '8':
+          case '9': {
+            intptr_t 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 RegExpBackReference(capture);
+              builder->AddAtom(atom);
+              break;
+            }
+            uint32_t 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();
+            uint32_t 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();
+            uint32_t controlLetter = Next();
+            // Special case if it is an ASCII letter.
+            // Convert lower case letters to uppercase.
+            uint32_t 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);
+            uint32_t value;
+            if (ParseHexEscape(2, &value)) {
+              builder->AddCharacter(value);
+            } else {
+              builder->AddCharacter('x');
+            }
+            break;
+          }
+          case 'u': {
+            Advance(2);
+            uint32_t value;
+            if (ParseHexEscape(4, &value)) {
+              builder->AddCharacter(value);
+            } else {
+              builder->AddCharacter('u');
+            }
+            break;
+          }
+          default:
+            // Identity escape.
+            builder->AddCharacter(Next());
+            Advance(2);
+            break;
         }
         break;
-      }
-      case 'x': {
-        Advance(2);
-        uint32_t value;
-        if (ParseHexEscape(2, &value)) {
-          builder->AddCharacter(value);
-        } else {
-          builder->AddCharacter('x');
+      case '{': {
+        intptr_t dummy;
+        if (ParseIntervalQuantifier(&dummy, &dummy)) {
+          ReportError("Nothing to repeat");
+          UNREACHABLE();
         }
-        break;
-      }
-      case 'u': {
-        Advance(2);
-        uint32_t value;
-        if (ParseHexEscape(4, &value)) {
-          builder->AddCharacter(value);
-        } else {
-          builder->AddCharacter('u');
-        }
-        break;
+        // fallthrough
       }
       default:
-        // Identity escape.
-        builder->AddCharacter(Next());
-        Advance(2);
+        builder->AddCharacter(current());
+        Advance();
         break;
-      }
-      break;
-    case '{': {
-      intptr_t dummy;
-      if (ParseIntervalQuantifier(&dummy, &dummy)) {
-        ReportError("Nothing to repeat");
-        UNREACHABLE();
-      }
-      // fallthrough
-    }
-    default:
-      builder->AddCharacter(current());
-      Advance();
-      break;
     }  // end switch(current())
 
     intptr_t min;
     intptr_t 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("numbers out of order in {} quantifier.");
-          UNREACHABLE();
-        }
+      // QuantifierPrefix ::
+      //   *
+      //   +
+      //   ?
+      //   {
+      case '*':
+        min = 0;
+        max = RegExpTree::kInfinity;
+        Advance();
         break;
-      } else {
+      case '+':
+        min = 1;
+        max = RegExpTree::kInfinity;
+        Advance();
+        break;
+      case '?':
+        min = 0;
+        max = 1;
+        Advance();
+        break;
+      case '{':
+        if (ParseIntervalQuantifier(&min, &max)) {
+          if (max < min) {
+            ReportError("numbers out of order in {} quantifier.");
+            UNREACHABLE();
+          }
+          break;
+        } else {
+          continue;
+        }
+      default:
         continue;
-      }
-    default:
-      continue;
     }
     RegExpQuantifier::QuantifierType quantifier_type = RegExpQuantifier::GREEDY;
     if (current() == '?') {
@@ -654,9 +665,12 @@
 // Currently only used in an ASSERT.
 static bool IsSpecialClassEscape(uint32_t c) {
   switch (c) {
-    case 'd': case 'D':
-    case 's': case 'S':
-    case 'w': case 'W':
+    case 'd':
+    case 'D':
+    case 's':
+    case 'S':
+    case 'w':
+    case 'W':
       return true;
     default:
       return false;
@@ -843,7 +857,7 @@
 }
 
 
-bool RegExpParser::ParseHexEscape(intptr_t length, uint32_t *value) {
+bool RegExpParser::ParseHexEscape(intptr_t length, uint32_t* value) {
   intptr_t start = position();
   uint32_t val = 0;
   bool done = false;
@@ -896,8 +910,7 @@
       // 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')) {
+          controlLetter == '_' || (letter >= 'A' && letter <= 'Z')) {
         Advance(2);
         // Control letters mapped to ASCII control characters in the range
         // 0x00-0x1f.
@@ -907,8 +920,14 @@
       // character instead of as starting an escape.
       return '\\';
     }
-    case '0': case '1': case '2': case '3': case '4': case '5':
-    case '6': case '7':
+    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.
@@ -951,7 +970,12 @@
   uint32_t first = current();
   if (first == '\\') {
     switch (Next()) {
-      case 'w': case 'W': case 'd': case 'D': case 's': case 'S': {
+      case 'w':
+      case 'W':
+      case 'd':
+      case 'D':
+      case 's':
+      case 'S': {
         *char_class = Next();
         Advance(2);
         return CharacterRange::Singleton(0);  // Return dummy value.
@@ -998,7 +1022,7 @@
     Advance();
   }
   ZoneGrowableArray<CharacterRange>* ranges =
-      new(Z) ZoneGrowableArray<CharacterRange>(2);
+      new (Z) ZoneGrowableArray<CharacterRange>(2);
   while (has_more() && current() != ']') {
     uint16_t char_class = kNoCharClass;
     CharacterRange first = ParseClassAtom(&char_class);
@@ -1040,7 +1064,7 @@
     ranges->Add(CharacterRange::Everything());
     is_negated = !is_negated;
   }
-  return new(Z) RegExpCharacterClass(ranges, is_negated);
+  return new (Z) RegExpCharacterClass(ranges, is_negated);
 }
 
 
@@ -1067,8 +1091,8 @@
     Thread::Current()->clear_sticky_error();
 
     // Throw a FormatException on parsing failures.
-    const String& message = String::Handle(
-          String::Concat(result->error, input));
+    const String& message =
+        String::Handle(String::Concat(result->error, input));
     const Array& args = Array::Handle(Array::New(1));
     args.SetAt(0, message);
 
diff --git a/runtime/vm/regexp_parser.h b/runtime/vm/regexp_parser.h
index 5108e93..7ebfcd1 100644
--- a/runtime/vm/regexp_parser.h
+++ b/runtime/vm/regexp_parser.h
@@ -12,7 +12,7 @@
 namespace dart {
 
 // Accumulates RegExp atoms and assertions into lists of terms and alternatives.
-class RegExpBuilder: public ZoneAllocated {
+class RegExpBuilder : public ZoneAllocated {
  public:
   RegExpBuilder();
 
@@ -23,8 +23,9 @@
   void AddAtom(RegExpTree* tree);
   void AddAssertion(RegExpTree* tree);
   void NewAlternative();  // '|'
-  void AddQuantifierToAtom(
-      intptr_t min, intptr_t max, RegExpQuantifier::QuantifierType type);
+  void AddQuantifierToAtom(intptr_t min,
+                           intptr_t max,
+                           RegExpQuantifier::QuantifierType type);
   RegExpTree* ToRegExp();
 
  private:
@@ -41,7 +42,7 @@
   GrowableArray<RegExpTree*> text_;
   GrowableArray<RegExpTree*> alternatives_;
 #ifdef DEBUG
-  enum {ADD_NONE, ADD_CHAR, ADD_TERM, ADD_ASSERT, ADD_ATOM} last_added_;
+  enum { ADD_NONE, ADD_CHAR, ADD_TERM, ADD_ASSERT, ADD_ATOM } last_added_;
 #define LAST(x) last_added_ = x;
 #else
 #define LAST(x)
@@ -50,9 +51,7 @@
 
 class RegExpParser : public ValueObject {
  public:
-  RegExpParser(const String& in,
-               String* error,
-               bool multiline_mode);
+  RegExpParser(const String& in, String* error, bool multiline_mode);
 
   static bool ParseFunction(ParsedFunction* parsed_function);
 
@@ -96,8 +95,9 @@
   bool simple();
   bool contains_anchor() { return contains_anchor_; }
   void set_contains_anchor() { contains_anchor_ = true; }
-  intptr_t captures_started() { return captures_ == NULL ?
-          0 : captures_->length(); }
+  intptr_t captures_started() {
+    return captures_ == NULL ? 0 : captures_->length();
+  }
   intptr_t position() { return next_pos_ - 1; }
   bool failed() { return failed_; }
 
@@ -118,9 +118,9 @@
     RegExpParserState(RegExpParserState* previous_state,
                       SubexpressionType group_type,
                       intptr_t disjunction_capture_index,
-                      Zone *zone)
+                      Zone* zone)
         : previous_state_(previous_state),
-          builder_(new(zone) RegExpBuilder()),
+          builder_(new (zone) RegExpBuilder()),
           group_type_(group_type),
           disjunction_capture_index_(disjunction_capture_index) {}
     // Parser state of containing expression, if any.
diff --git a/runtime/vm/regexp_test.cc b/runtime/vm/regexp_test.cc
index 3948f64..b7f5a77 100644
--- a/runtime/vm/regexp_test.cc
+++ b/runtime/vm/regexp_test.cc
@@ -15,17 +15,17 @@
 static RawArray* Match(const String& pat, const String& str) {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
-  const RegExp& regexp = RegExp::Handle(
-      RegExpEngine::CreateRegExp(thread, pat, false, false));
+  const RegExp& regexp =
+      RegExp::Handle(RegExpEngine::CreateRegExp(thread, pat, false, false));
   const Smi& idx = Smi::Handle(Smi::New(0));
   return IRRegExpMacroAssembler::Execute(regexp, str, idx, zone);
 }
 
 TEST_CASE(RegExp_OneByteString) {
-  uint8_t chars[] = { 'a', 'b', 'c', 'b', 'a' };
+  uint8_t chars[] = {'a', 'b', 'c', 'b', 'a'};
   intptr_t len = ARRAY_SIZE(chars);
-  const String& str = String::Handle(
-      OneByteString::New(chars, len, Heap::kNew));
+  const String& str =
+      String::Handle(OneByteString::New(chars, len, Heap::kNew));
 
   const String& pat = String::Handle(String::New("bc"));
   const Array& res = Array::Handle(Match(pat, str));
@@ -43,10 +43,10 @@
 }
 
 TEST_CASE(RegExp_TwoByteString) {
-  uint16_t chars[] = { 'a', 'b', 'c', 'b', 'a' };
+  uint16_t chars[] = {'a', 'b', 'c', 'b', 'a'};
   intptr_t len = ARRAY_SIZE(chars);
-  const String& str = String::Handle(
-      TwoByteString::New(chars, len, Heap::kNew));
+  const String& str =
+      String::Handle(TwoByteString::New(chars, len, Heap::kNew));
 
   const String& pat = String::Handle(String::New("bc"));
   const Array& res = Array::Handle(Match(pat, str));
@@ -64,7 +64,7 @@
 }
 
 TEST_CASE(RegExp_ExternalOneByteString) {
-  uint8_t chars[] = { 'a', 'b', 'c', 'b', 'a' };
+  uint8_t chars[] = {'a', 'b', 'c', 'b', 'a'};
   intptr_t len = ARRAY_SIZE(chars);
   const String& str = String::Handle(
       ExternalOneByteString::New(chars, len, NULL, NULL, Heap::kNew));
@@ -85,7 +85,7 @@
 }
 
 TEST_CASE(RegExp_ExternalTwoByteString) {
-  uint16_t chars[] = { 'a', 'b', 'c', 'b', 'a' };
+  uint16_t chars[] = {'a', 'b', 'c', 'b', 'a'};
   intptr_t len = ARRAY_SIZE(chars);
   const String& str = String::Handle(
       ExternalTwoByteString::New(chars, len, NULL, NULL, Heap::kNew));
diff --git a/runtime/vm/report.cc b/runtime/vm/report.cc
index b53c494..ba87b5e 100644
--- a/runtime/vm/report.cc
+++ b/runtime/vm/report.cc
@@ -24,12 +24,24 @@
                                   const String& message) {
   const char* message_header;
   switch (kind) {
-    case kWarning: message_header = "warning"; break;
-    case kError: message_header = "error"; break;
-    case kMalformedType: message_header = "malformed type"; break;
-    case kMalboundedType: message_header = "malbounded type"; break;
-    case kBailout: message_header = "bailout"; break;
-    default: message_header = ""; UNREACHABLE();
+    case kWarning:
+      message_header = "warning";
+      break;
+    case kError:
+      message_header = "error";
+      break;
+    case kMalformedType:
+      message_header = "malformed type";
+      break;
+    case kMalboundedType:
+      message_header = "malbounded type";
+      break;
+    case kBailout:
+      message_header = "bailout";
+      break;
+    default:
+      message_header = "";
+      UNREACHABLE();
   }
   String& result = String::Handle();
   if (!script.IsNull()) {
@@ -47,42 +59,34 @@
       // optimizing compilation. Those strings are created rarely and should not
       // polute old space.
       if (script.HasSource()) {
-        result = String::NewFormatted(Heap::kOld,
-                                      "'%s': %s: line %" Pd " pos %" Pd ": ",
-                                      script_url.ToCString(),
-                                      message_header,
-                                      line,
-                                      column);
+        result = String::NewFormatted(
+            Heap::kOld, "'%s': %s: line %" Pd " pos %" Pd ": ",
+            script_url.ToCString(), message_header, line, column);
       } else {
-        result = String::NewFormatted(Heap::kOld,
-                                      "'%s': %s: line %" Pd ": ",
-                                      script_url.ToCString(),
-                                      message_header,
-                                      line);
+        result =
+            String::NewFormatted(Heap::kOld, "'%s': %s: line %" Pd ": ",
+                                 script_url.ToCString(), message_header, line);
       }
       // Append the formatted error or warning message.
-      const Array& strs = Array::Handle(
-          Array::New(6, Heap::kOld));
+      const Array& strs = Array::Handle(Array::New(6, Heap::kOld));
       strs.SetAt(0, result);
       strs.SetAt(1, message);
       // Append the source line.
-      const String& script_line = String::Handle(
-          script.GetLine(line, Heap::kOld));
+      const String& script_line =
+          String::Handle(script.GetLine(line, Heap::kOld));
       ASSERT(!script_line.IsNull());
       strs.SetAt(2, Symbols::NewLine());
       strs.SetAt(3, script_line);
       strs.SetAt(4, Symbols::NewLine());
       // Append the column marker.
-      const String& column_line = String::Handle(
-          String::NewFormatted(Heap::kOld,
-                               "%*s\n", static_cast<int>(column), "^"));
+      const String& column_line = String::Handle(String::NewFormatted(
+          Heap::kOld, "%*s\n", static_cast<int>(column), "^"));
       strs.SetAt(5, column_line);
       result = String::ConcatAll(strs, Heap::kOld);
     } else {
       // Token position is unknown.
       result = String::NewFormatted(Heap::kOld, "'%s': %s: ",
-                                    script_url.ToCString(),
-                                    message_header);
+                                    script_url.ToCString(), message_header);
       result = String::Concat(result, message, Heap::kOld);
     }
   } else {
@@ -102,8 +106,10 @@
 
 
 void Report::LongJumpF(const Error& prev_error,
-                       const Script& script, TokenPosition token_pos,
-                       const char* format, ...) {
+                       const Script& script,
+                       TokenPosition token_pos,
+                       const char* format,
+                       ...) {
   va_list args;
   va_start(args, format);
   LongJumpV(prev_error, script, token_pos, format, args);
@@ -113,11 +119,12 @@
 
 
 void Report::LongJumpV(const Error& prev_error,
-                       const Script& script, TokenPosition token_pos,
-                       const char* format, va_list args) {
+                       const Script& script,
+                       TokenPosition token_pos,
+                       const char* format,
+                       va_list args) {
   const Error& error = Error::Handle(LanguageError::NewFormattedV(
-      prev_error, script, token_pos, Report::AtLocation,
-      kError, Heap::kOld,
+      prev_error, script, token_pos, Report::AtLocation, kError, Heap::kOld,
       format, args));
   LongJump(error);
   UNREACHABLE();
@@ -128,7 +135,8 @@
                       const Script& script,
                       TokenPosition token_pos,
                       bool report_after_token,
-                      const char* format, ...) {
+                      const char* format,
+                      ...) {
   va_list args;
   va_start(args, format);
   MessageV(kind, script, token_pos, report_after_token, format, args);
@@ -140,7 +148,8 @@
                       const Script& script,
                       TokenPosition token_pos,
                       bool report_after_token,
-                      const char* format, va_list args) {
+                      const char* format,
+                      va_list args) {
   if (kind < kError) {
     // Reporting a warning.
     if (FLAG_silent_warnings) {
@@ -155,14 +164,11 @@
     }
   }
   // Reporting an error (or a warning as error).
-  const Error& error = Error::Handle(
-      LanguageError::NewFormattedV(Error::Handle(),  // No previous error.
-                                   script, token_pos, report_after_token,
-                                   kind, Heap::kOld,
-                                   format, args));
+  const Error& error = Error::Handle(LanguageError::NewFormattedV(
+      Error::Handle(),  // No previous error.
+      script, token_pos, report_after_token, kind, Heap::kOld, format, args));
   LongJump(error);
   UNREACHABLE();
 }
 
 }  // namespace dart
-
diff --git a/runtime/vm/report.h b/runtime/vm/report.h
index e2efa54..00d45bd 100644
--- a/runtime/vm/report.h
+++ b/runtime/vm/report.h
@@ -36,23 +36,29 @@
 
   // Concatenate and report an already formatted error and a new error message.
   static void LongJumpF(const Error& prev_error,
-                        const Script& script, TokenPosition token_pos,
-                        const char* format, ...) PRINTF_ATTRIBUTE(4, 5);
+                        const Script& script,
+                        TokenPosition token_pos,
+                        const char* format,
+                        ...) PRINTF_ATTRIBUTE(4, 5);
   static void LongJumpV(const Error& prev_error,
-                        const Script& script, TokenPosition token_pos,
-                        const char* format, va_list args);
+                        const Script& script,
+                        TokenPosition token_pos,
+                        const char* format,
+                        va_list args);
 
   // Report a warning/jswarning/error/bailout message.
   static void MessageF(Kind kind,
                        const Script& script,
                        TokenPosition token_pos,
                        bool report_after_token,
-                       const char* format, ...) PRINTF_ATTRIBUTE(5, 6);
+                       const char* format,
+                       ...) PRINTF_ATTRIBUTE(5, 6);
   static void MessageV(Kind kind,
                        const Script& script,
                        TokenPosition token_pos,
                        bool report_after_token,
-                       const char* format, va_list args);
+                       const char* format,
+                       va_list args);
 
   // Prepend a source snippet to the message.
   // A null script means no source and a negative token_pos means no position.
@@ -69,4 +75,3 @@
 }  // namespace dart
 
 #endif  // RUNTIME_VM_REPORT_H_
-
diff --git a/runtime/vm/resolver.cc b/runtime/vm/resolver.cc
index 95f8c62..41169e4 100644
--- a/runtime/vm/resolver.cc
+++ b/runtime/vm/resolver.cc
@@ -39,11 +39,11 @@
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
 
-  Function& function = Function::Handle(zone,
+  Function& function = Function::Handle(
+      zone,
       ResolveDynamicAnyArgs(zone, receiver_class, function_name, allow_add));
 
-  if (function.IsNull() ||
-      !function.AreValidArguments(args_desc, NULL)) {
+  if (function.IsNull() || !function.AreValidArguments(args_desc, NULL)) {
     // Return a null function to signal to the upper levels to dispatch to
     // "noSuchMethod" function.
     if (FLAG_trace_resolving) {
@@ -53,8 +53,7 @@
         // Obtain more detailed error message.
         function.AreValidArguments(args_desc, &error_message);
       }
-      THR_Print("ResolveDynamic error '%s': %s.\n",
-                function_name.ToCString(),
+      THR_Print("ResolveDynamic error '%s': %s.\n", function_name.ToCString(),
                 error_message.ToCString());
     }
     return Function::null();
@@ -63,15 +62,13 @@
 }
 
 
-RawFunction* Resolver::ResolveDynamicAnyArgs(
-    Zone* zone,
-    const Class& receiver_class,
-    const String& function_name,
-    bool allow_add) {
+RawFunction* Resolver::ResolveDynamicAnyArgs(Zone* zone,
+                                             const Class& receiver_class,
+                                             const String& function_name,
+                                             bool allow_add) {
   Class& cls = Class::Handle(zone, receiver_class.raw());
   if (FLAG_trace_resolving) {
-    THR_Print("ResolveDynamic '%s' for class %s\n",
-              function_name.ToCString(),
+    THR_Print("ResolveDynamic '%s' for class %s\n", function_name.ToCString(),
               String::Handle(zone, cls.Name()).ToCString());
   }
 
@@ -162,12 +159,10 @@
         if (FLAG_trace_resolving) {
           String& error_message = String::Handle();
           // Obtain more detailed error message.
-          function.AreValidArguments(num_arguments,
-                                     argument_names,
+          function.AreValidArguments(num_arguments, argument_names,
                                      &error_message);
           THR_Print("ResolveStatic error '%s': %s.\n",
-                    function_name.ToCString(),
-                    error_message.ToCString());
+                    function_name.ToCString(), error_message.ToCString());
         }
         function = Function::null();
       }
@@ -183,22 +178,19 @@
     // ResolveStatic will return a NULL function object.
     const Class& cls = Class::Handle(library.LookupClass(class_name));
     if (!cls.IsNull()) {
-      function = ResolveStatic(cls,
-                               function_name,
-                               num_arguments,
-                               argument_names);
+      function =
+          ResolveStatic(cls, function_name, num_arguments, argument_names);
     }
     if (FLAG_trace_resolving && function.IsNull()) {
       THR_Print("ResolveStatic error: function '%s.%s' not found.\n",
-                class_name.ToCString(),
-                function_name.ToCString());
+                class_name.ToCString(), function_name.ToCString());
     }
   }
   return function.raw();
 }
 
 
-RawFunction* Resolver::ResolveStatic(const Class&  cls,
+RawFunction* Resolver::ResolveStatic(const Class& cls,
                                      const String& function_name,
                                      intptr_t num_arguments,
                                      const Array& argument_names) {
@@ -216,12 +208,10 @@
       String& error_message = String::Handle(String::New("function not found"));
       if (!function.IsNull()) {
         // Obtain more detailed error message.
-        function.AreValidArguments(num_arguments,
-                                   argument_names,
+        function.AreValidArguments(num_arguments, argument_names,
                                    &error_message);
       }
-      THR_Print("ResolveStatic error '%s': %s.\n",
-                function_name.ToCString(),
+      THR_Print("ResolveStatic error '%s': %s.\n", function_name.ToCString(),
                 error_message.ToCString());
     }
     return Function::null();
@@ -230,7 +220,7 @@
 }
 
 
-RawFunction* Resolver::ResolveStaticAllowPrivate(const Class&  cls,
+RawFunction* Resolver::ResolveStaticAllowPrivate(const Class& cls,
                                                  const String& function_name,
                                                  intptr_t num_arguments,
                                                  const Array& argument_names) {
@@ -248,13 +238,11 @@
       String& error_message = String::Handle(String::New("function not found"));
       if (!function.IsNull()) {
         // Obtain more detailed error message.
-        function.AreValidArguments(num_arguments,
-                                   argument_names,
+        function.AreValidArguments(num_arguments, argument_names,
                                    &error_message);
       }
       THR_Print("ResolveStaticAllowPrivate error '%s': %s.\n",
-                function_name.ToCString(),
-                error_message.ToCString());
+                function_name.ToCString(), error_message.ToCString());
     }
     return Function::null();
   }
diff --git a/runtime/vm/resolver.h b/runtime/vm/resolver.h
index 620bb52..8ce80c7 100644
--- a/runtime/vm/resolver.h
+++ b/runtime/vm/resolver.h
@@ -36,11 +36,10 @@
       bool allow_add = true);
 
   // If 'allow_add' is true we may add a function to the class during lookup.
-  static RawFunction* ResolveDynamicAnyArgs(
-      Zone* zone,
-      const Class& receiver_class,
-      const String& function_name,
-      bool allow_add = true);
+  static RawFunction* ResolveDynamicAnyArgs(Zone* zone,
+                                            const Class& receiver_class,
+                                            const String& function_name,
+                                            bool allow_add = true);
 
   // Resolve specified dart static function. If library.IsNull, use
   // either application library or core library if no application library
@@ -56,14 +55,14 @@
 
   // Resolve specified dart static function with specified arity. Only resolves
   // public functions.
-  static RawFunction* ResolveStatic(const Class&  cls,
+  static RawFunction* ResolveStatic(const Class& cls,
                                     const String& function_name,
                                     intptr_t num_arguments,
                                     const Array& argument_names);
 
   // Resolve specified dart static function with specified arity. Resolves both
   // public and private functions.
-  static RawFunction* ResolveStaticAllowPrivate(const Class&  cls,
+  static RawFunction* ResolveStaticAllowPrivate(const Class& cls,
                                                 const String& function_name,
                                                 intptr_t num_arguments,
                                                 const Array& argument_names);
diff --git a/runtime/vm/resolver_test.cc b/runtime/vm/resolver_test.cc
index 2252e23..b5a25aa 100644
--- a/runtime/vm/resolver_test.cc
+++ b/runtime/vm/resolver_test.cc
@@ -24,8 +24,7 @@
 
   // Setup a dart class and function.
   char script_chars[1024];
-  OS::SNPrint(script_chars,
-              sizeof(script_chars),
+  OS::SNPrint(script_chars, sizeof(script_chars),
               "class Base {\n"
               "  dynCall() { return 3; }\n"
               "  static statCall() { return 4; }\n"
@@ -34,17 +33,15 @@
               "class %s extends Base {\n"
               "  %s %s(String s, int i) { return i; }\n"
               "}\n",
-              test_class_name,
-              is_static ? "static" : "",
+              test_class_name, is_static ? "static" : "",
               test_static_function_name);
 
-  String& url = String::Handle(zone,
-      is_static ?
-          String::New("dart-test:DartStaticResolve") :
-          String::New("dart-test:DartDynamicResolve"));
+  String& url = String::Handle(
+      zone, is_static ? String::New("dart-test:DartStaticResolve")
+                      : String::New("dart-test:DartDynamicResolve"));
   String& source = String::Handle(zone, String::New(script_chars));
-  Script& script = Script::Handle(zone,
-      Script::New(url, source, RawScript::kScriptTag));
+  Script& script =
+      Script::Handle(zone, Script::New(url, source, RawScript::kScriptTag));
   const String& lib_name = String::Handle(zone, String::New(test_library_name));
   Library& lib = Library::Handle(zone, Library::New(lib_name));
   lib.Register(thread);
@@ -58,9 +55,7 @@
                                 const char* test_class_name,
                                 const char* test_static_function_name) {
   // Setup a static dart class and function.
-  SetupFunction(test_library_name,
-                test_class_name,
-                test_static_function_name,
+  SetupFunction(test_library_name, test_class_name, test_static_function_name,
                 true);
 }
 
@@ -70,10 +65,7 @@
                                   const char* test_class_name,
                                   const char* test_function_name) {
   // Setup a static dart class and function.
-  SetupFunction(test_library_name,
-                test_class_name,
-                test_function_name,
-                false);
+  SetupFunction(test_library_name, test_class_name, test_function_name, false);
 }
 
 
@@ -84,8 +76,7 @@
   const int kTestValue = 42;
 
   // Setup a static function which can be invoked.
-  SetupStaticFunction(test_library_name,
-                      test_class_name,
+  SetupStaticFunction(test_library_name, test_class_name,
                       test_static_function_name);
 
   const String& library_name = String::Handle(String::New(test_library_name));
@@ -99,11 +90,8 @@
   {
     const int kNumArguments = 2;
     const Function& function = Function::Handle(
-        Resolver::ResolveStatic(library,
-                                class_name,
-                                static_function_name,
-                                kNumArguments,
-                                Object::empty_array()));
+        Resolver::ResolveStatic(library, class_name, static_function_name,
+                                kNumArguments, Object::empty_array()));
     EXPECT(!function.IsNull());  // No ambiguity error expected.
     const Array& args = Array::Handle(Array::New(kNumArguments));
     const String& arg0 = String::Handle(String::New("junk"));
@@ -119,11 +107,8 @@
   {
     const int kNumArguments = 1;
     const Function& bad_function = Function::Handle(
-        Resolver::ResolveStatic(library,
-                                class_name,
-                                static_function_name,
-                                kNumArguments,
-                                Object::empty_array()));
+        Resolver::ResolveStatic(library, class_name, static_function_name,
+                                kNumArguments, Object::empty_array()));
     EXPECT(bad_function.IsNull());  // No ambiguity error expected.
   }
 
@@ -133,12 +118,9 @@
         String::Handle(String::New("statCall"));
     const String& super_class_name = String::Handle(String::New("Base"));
     const int kNumArguments = 0;
-    const Function& super_function = Function::Handle(
-        Resolver::ResolveStatic(library,
-                                super_class_name,
-                                super_static_function_name,
-                                kNumArguments,
-                                Object::empty_array()));
+    const Function& super_function = Function::Handle(Resolver::ResolveStatic(
+        library, super_class_name, super_static_function_name, kNumArguments,
+        Object::empty_array()));
     EXPECT(!super_function.IsNull());  // No ambiguity error expected.
   }
 }
@@ -151,18 +133,16 @@
   const int kTestValue = 42;
 
   // Setup a function which can be invoked.
-  SetupInstanceFunction(test_library_name,
-                        test_class_name,
-                        test_function_name);
+  SetupInstanceFunction(test_library_name, test_class_name, test_function_name);
 
   // Now create an instance object of the class and try to
   // resolve a function in it.
   const String& lib_name = String::Handle(String::New(test_library_name));
-  const Library& lib = Library::Handle(Library::LookupLibrary(thread,
-                                                              lib_name));
+  const Library& lib =
+      Library::Handle(Library::LookupLibrary(thread, lib_name));
   ASSERT(!lib.IsNull());
-  const Class& cls = Class::Handle(lib.LookupClass(
-      String::Handle(Symbols::New(thread, test_class_name))));
+  const Class& cls = Class::Handle(
+      lib.LookupClass(String::Handle(Symbols::New(thread, test_class_name))));
   EXPECT(!cls.IsNull());  // No ambiguity error expected.
 
   Instance& receiver = Instance::Handle(Instance::New(cls));
@@ -174,9 +154,7 @@
     ArgumentsDescriptor args_desc(
         Array::Handle(ArgumentsDescriptor::New(kNumArguments)));
     const Function& function = Function::Handle(
-        Resolver::ResolveDynamic(receiver,
-                                 function_name,
-                                 args_desc));
+        Resolver::ResolveDynamic(receiver, function_name, args_desc));
     EXPECT(!function.IsNull());
     const Array& args = Array::Handle(Array::New(kNumArguments));
     args.SetAt(0, receiver);
@@ -195,9 +173,7 @@
     ArgumentsDescriptor args_desc(
         Array::Handle(ArgumentsDescriptor::New(kNumArguments)));
     const Function& bad_function = Function::Handle(
-        Resolver::ResolveDynamic(receiver,
-                                 function_name,
-                                 args_desc));
+        Resolver::ResolveDynamic(receiver, function_name, args_desc));
     EXPECT(bad_function.IsNull());
   }
 
@@ -206,12 +182,9 @@
     const int kNumArguments = 1;
     ArgumentsDescriptor args_desc(
         Array::Handle(ArgumentsDescriptor::New(kNumArguments)));
-    const String& super_function_name =
-        String::Handle(String::New("dynCall"));
+    const String& super_function_name = String::Handle(String::New("dynCall"));
     const Function& super_function = Function::Handle(
-        Resolver::ResolveDynamic(receiver,
-                                 super_function_name,
-                                 args_desc));
+        Resolver::ResolveDynamic(receiver, super_function_name, args_desc));
     EXPECT(!super_function.IsNull());
   }
 }
diff --git a/runtime/vm/reusable_handles.h b/runtime/vm/reusable_handles.h
index 83855d6..11178d8 100644
--- a/runtime/vm/reusable_handles.h
+++ b/runtime/vm/reusable_handles.h
@@ -35,8 +35,7 @@
 #define REUSABLE_SCOPE(name)                                                   \
   class Reusable##name##HandleScope : public ValueObject {                     \
    public:                                                                     \
-    explicit Reusable##name##HandleScope(Thread* thread)                       \
-        : thread_(thread) {                                                    \
+    explicit Reusable##name##HandleScope(Thread* thread) : thread_(thread) {   \
       ASSERT(!thread->reusable_##name##_handle_scope_active());                \
       thread->set_reusable_##name##_handle_scope_active(true);                 \
     }                                                                          \
@@ -53,6 +52,7 @@
       ASSERT(thread_->name##_handle_ != NULL);                                 \
       return *thread_->name##_handle_;                                         \
     }                                                                          \
+                                                                               \
    private:                                                                    \
     Thread* thread_;                                                           \
     DISALLOW_COPY_AND_ASSIGN(Reusable##name##HandleScope);                     \
@@ -62,18 +62,15 @@
   class Reusable##name##HandleScope : public ValueObject {                     \
    public:                                                                     \
     explicit Reusable##name##HandleScope(Thread* thread)                       \
-        : handle_(thread->name##_handle_) {                                    \
-    }                                                                          \
+        : handle_(thread->name##_handle_) {}                                   \
     Reusable##name##HandleScope()                                              \
-        : handle_(Thread::Current()->name##_handle_) {                         \
-    }                                                                          \
-    ~Reusable##name##HandleScope() {                                           \
-      handle_->raw_ = name::null();                                            \
-    }                                                                          \
+        : handle_(Thread::Current()->name##_handle_) {}                        \
+    ~Reusable##name##HandleScope() { handle_->raw_ = name::null(); }           \
     name& Handle() const {                                                     \
       ASSERT(handle_ != NULL);                                                 \
       return *handle_;                                                         \
     }                                                                          \
+                                                                               \
    private:                                                                    \
     name* handle_;                                                             \
     DISALLOW_COPY_AND_ASSIGN(Reusable##name##HandleScope);                     \
@@ -93,15 +90,14 @@
 #define REUSABLE_ERROR_HANDLESCOPE(thread)                                     \
   ReusableErrorHandleScope reused_error_handle(thread);
 #define REUSABLE_EXCEPTION_HANDLERS_HANDLESCOPE(thread)                        \
-  ReusableExceptionHandlersHandleScope                                         \
-      reused_exception_handlers_handle(thread);
+  ReusableExceptionHandlersHandleScope reused_exception_handlers_handle(thread);
 #define REUSABLE_FIELD_HANDLESCOPE(thread)                                     \
   ReusableFieldHandleScope reused_field_handle(thread);
 #define REUSABLE_FUNCTION_HANDLESCOPE(thread)                                  \
   ReusableFunctionHandleScope reused_function_handle(thread);
 #define REUSABLE_GROWABLE_OBJECT_ARRAY_HANDLESCOPE(thread)                     \
-  ReusableGrowableObjectArrayHandleScope                                       \
-      reused_growable_object_array_handle(thread)
+  ReusableGrowableObjectArrayHandleScope reused_growable_object_array_handle(  \
+      thread)
 #define REUSABLE_INSTANCE_HANDLESCOPE(thread)                                  \
   ReusableInstanceHandleScope reused_instance_handle(thread);
 #define REUSABLE_LIBRARY_HANDLESCOPE(thread)                                   \
diff --git a/runtime/vm/ring_buffer.h b/runtime/vm/ring_buffer.h
index 77f6314..a8079b5 100644
--- a/runtime/vm/ring_buffer.h
+++ b/runtime/vm/ring_buffer.h
@@ -11,14 +11,12 @@
 namespace dart {
 
 // Fixed-capacity ring buffer.
-template<typename T, int N>
+template <typename T, int N>
 class RingBuffer {
  public:
-  RingBuffer() : count_(0) { }
+  RingBuffer() : count_(0) {}
 
-  void Add(const T& t) {
-    data_[count_++ & kMask] = t;
-  }
+  void Add(const T& t) { data_[count_++ & kMask] = t; }
 
   // Returns the i'th most recently added element. Requires 0 <= i < Size().
   const T& Get(int i) const {
diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc
index 68b2fd7..b0cd46e 100644
--- a/runtime/vm/runtime_entry.cc
+++ b/runtime/vm/runtime_entry.cc
@@ -29,20 +29,12 @@
   const String& class_name = String::Handle(Symbols::New(thread, "ownerClass"));
   const Script& script = Script::Handle();
   const Library& lib = Library::Handle(Library::CoreLibrary());
-  const Class& owner_class =
-      Class::Handle(Class::New(lib, class_name, script,
-                               TokenPosition::kNoSource));
+  const Class& owner_class = Class::Handle(
+      Class::New(lib, class_name, script, TokenPosition::kNoSource));
   const String& function_name = String::ZoneHandle(Symbols::New(thread, name));
-  const Function& function = Function::ZoneHandle(
-      Function::New(function_name,
-                    RawFunction::kRegularFunction,
-                    true,
-                    false,
-                    false,
-                    false,
-                    false,
-                    owner_class,
-                    TokenPosition::kMinSource));
+  const Function& function = Function::ZoneHandle(Function::New(
+      function_name, RawFunction::kRegularFunction, true, false, false, false,
+      false, owner_class, TokenPosition::kMinSource));
   const Array& functions = Array::Handle(Array::New(1));
   functions.SetAt(0, function);
   owner_class.SetFunctions(functions);
diff --git a/runtime/vm/runtime_entry.h b/runtime/vm/runtime_entry.h
index 93f4048..c9e7bd3 100644
--- a/runtime/vm/runtime_entry.h
+++ b/runtime/vm/runtime_entry.h
@@ -22,14 +22,12 @@
 
 enum RuntimeFunctionId {
   kNoRuntimeFunctionId = -1,
-#define DECLARE_ENUM_VALUE(name) \
-  k##name##Id,
+#define DECLARE_ENUM_VALUE(name) k##name##Id,
   RUNTIME_ENTRY_LIST(DECLARE_ENUM_VALUE)
 #undef DECLARE_ENUM_VALUE
 
-#define DECLARE_LEAF_ENUM_VALUE(type, name, ...) \
-  k##name##Id,
-  LEAF_RUNTIME_ENTRY_LIST(DECLARE_LEAF_ENUM_VALUE)
+#define DECLARE_LEAF_ENUM_VALUE(type, name, ...) k##name##Id,
+      LEAF_RUNTIME_ENTRY_LIST(DECLARE_LEAF_ENUM_VALUE)
 #undef DECLARE_LEAF_ENUM_VALUE
 };
 
@@ -38,8 +36,11 @@
 // by the function.
 class RuntimeEntry : public ValueObject {
  public:
-  RuntimeEntry(const char* name, RuntimeFunction function,
-               intptr_t argument_count, bool is_leaf, bool is_float)
+  RuntimeEntry(const char* name,
+               RuntimeFunction function,
+               intptr_t argument_count,
+               bool is_leaf,
+               bool is_float)
       : name_(name),
         function_(function),
         argument_count_(argument_count),
@@ -83,7 +84,8 @@
   }
 #else
 #define TRACE_RUNTIME_CALL(format, name)                                       \
-  do { } while (0)
+  do {                                                                         \
+  } while (0)
 #endif
 
 // Helper macros for declaring and defining runtime entries.
@@ -91,16 +93,14 @@
 #define DEFINE_RUNTIME_ENTRY(name, argument_count)                             \
   extern void DRT_##name(NativeArguments arguments);                           \
   extern const RuntimeEntry k##name##RuntimeEntry(                             \
-      "DRT_"#name, &DRT_##name, argument_count, false, false);                 \
-  static void DRT_Helper##name(Isolate* isolate,                               \
-                               Thread* thread,                                 \
-                               Zone* zone,                                     \
+      "DRT_" #name, &DRT_##name, argument_count, false, false);                \
+  static void DRT_Helper##name(Isolate* isolate, Thread* thread, Zone* zone,   \
                                NativeArguments arguments);                     \
   void DRT_##name(NativeArguments arguments) {                                 \
     CHECK_STACK_ALIGNMENT;                                                     \
     VERIFY_ON_TRANSITION;                                                      \
     ASSERT(arguments.ArgCount() == argument_count);                            \
-    TRACE_RUNTIME_CALL("%s", ""#name);                                         \
+    TRACE_RUNTIME_CALL("%s", "" #name);                                        \
     {                                                                          \
       Thread* thread = arguments.thread();                                     \
       ASSERT(thread == Thread::Current());                                     \
@@ -112,23 +112,21 @@
     }                                                                          \
     VERIFY_ON_TRANSITION;                                                      \
   }                                                                            \
-  static void DRT_Helper##name(Isolate* isolate,                               \
-                               Thread* thread,                                 \
-                               Zone* zone,                                     \
+  static void DRT_Helper##name(Isolate* isolate, Thread* thread, Zone* zone,   \
                                NativeArguments arguments)
 
 #define DECLARE_RUNTIME_ENTRY(name)                                            \
   extern const RuntimeEntry k##name##RuntimeEntry;                             \
-  extern void DRT_##name(NativeArguments arguments);                           \
+  extern void DRT_##name(NativeArguments arguments);
 
 #define DEFINE_LEAF_RUNTIME_ENTRY(type, name, argument_count, ...)             \
   extern "C" type DLRT_##name(__VA_ARGS__);                                    \
   extern const RuntimeEntry k##name##RuntimeEntry(                             \
-      "DLRT_"#name, reinterpret_cast<RuntimeFunction>(&DLRT_##name),           \
+      "DLRT_" #name, reinterpret_cast<RuntimeFunction>(&DLRT_##name),          \
       argument_count, true, false);                                            \
   type DLRT_##name(__VA_ARGS__) {                                              \
     CHECK_STACK_ALIGNMENT;                                                     \
-    NoSafepointScope no_safepoint_scope;                                       \
+    NoSafepointScope no_safepoint_scope;
 
 #define END_LEAF_RUNTIME_ENTRY }
 
@@ -136,11 +134,11 @@
 // DEFINE_LEAF_RUNTIME_ENTRY instead.
 #define DEFINE_RAW_LEAF_RUNTIME_ENTRY(name, argument_count, is_float, func)    \
   extern const RuntimeEntry k##name##RuntimeEntry(                             \
-      "DFLRT_"#name, func, argument_count, true, is_float)                     \
+      "DFLRT_" #name, func, argument_count, true, is_float)
 
 #define DECLARE_LEAF_RUNTIME_ENTRY(type, name, ...)                            \
   extern const RuntimeEntry k##name##RuntimeEntry;                             \
-  extern "C" type DLRT_##name(__VA_ARGS__);                                    \
+  extern "C" type DLRT_##name(__VA_ARGS__);
 
 
 // Declare all runtime functions here.
@@ -154,14 +152,16 @@
 
 
 uword RuntimeEntry::AddressFromId(RuntimeFunctionId id) {
-    switch (id) {
+  switch (id) {
 #define DEFINE_RUNTIME_CASE(name)                                              \
-    case k##name##Id: return k##name##RuntimeEntry.GetEntryPoint();
+  case k##name##Id:                                                            \
+    return k##name##RuntimeEntry.GetEntryPoint();
     RUNTIME_ENTRY_LIST(DEFINE_RUNTIME_CASE)
 #undef DEFINE_RUNTIME_CASE
 
 #define DEFINE_LEAF_RUNTIME_CASE(type, name, ...)                              \
-    case k##name##Id: return k##name##RuntimeEntry.GetEntryPoint();
+  case k##name##Id:                                                            \
+    return k##name##RuntimeEntry.GetEntryPoint();
     LEAF_RUNTIME_ENTRY_LIST(DEFINE_LEAF_RUNTIME_CASE)
 #undef DEFINE_LEAF_RUNTIME_CASE
     default:
diff --git a/runtime/vm/runtime_entry_arm.cc b/runtime/vm/runtime_entry_arm.cc
index a0bb2e9..846b91b 100644
--- a/runtime/vm/runtime_entry_arm.cc
+++ b/runtime/vm/runtime_entry_arm.cc
@@ -25,8 +25,7 @@
   // Redirection to leaf runtime calls supports a maximum of 4 arguments passed
   // in registers (maximum 2 double arguments for leaf float runtime calls).
   ASSERT(argument_count() >= 0);
-  ASSERT(!is_leaf() ||
-         (!is_float() && (argument_count() <= 4)) ||
+  ASSERT(!is_leaf() || (!is_float() && (argument_count() <= 4)) ||
          (argument_count() <= 2));
   Simulator::CallKind call_kind =
       is_leaf() ? (is_float() ? Simulator::kLeafFloatRuntimeCall
diff --git a/runtime/vm/runtime_entry_arm64.cc b/runtime/vm/runtime_entry_arm64.cc
index f3e98bc..2186fc3 100644
--- a/runtime/vm/runtime_entry_arm64.cc
+++ b/runtime/vm/runtime_entry_arm64.cc
@@ -25,8 +25,7 @@
   // Redirection to leaf runtime calls supports a maximum of 4 arguments passed
   // in registers (maximum 2 double arguments for leaf float runtime calls).
   ASSERT(argument_count() >= 0);
-  ASSERT(!is_leaf() ||
-         (!is_float() && (argument_count() <= 4)) ||
+  ASSERT(!is_leaf() || (!is_float() && (argument_count() <= 4)) ||
          (argument_count() <= 2));
   Simulator::CallKind call_kind =
       is_leaf() ? (is_float() ? Simulator::kLeafFloatRuntimeCall
diff --git a/runtime/vm/runtime_entry_list.h b/runtime/vm/runtime_entry_list.h
index 835cf3c..d450ee4 100644
--- a/runtime/vm/runtime_entry_list.h
+++ b/runtime/vm/runtime_entry_list.h
@@ -46,7 +46,7 @@
   V(CompileFunction)                                                           \
   V(MonomorphicMiss)                                                           \
   V(SingleTargetMiss)                                                          \
-  V(UnlinkedCall)                                                              \
+  V(UnlinkedCall)
 
 #define LEAF_RUNTIME_ENTRY_LIST(V)                                             \
   V(void, PrintStopMessage, const char*)                                       \
@@ -67,8 +67,7 @@
   V(double, LibcAsin, double)                                                  \
   V(double, LibcAtan, double)                                                  \
   V(double, LibcAtan2, double, double)                                         \
-  V(RawBool*, CaseInsensitiveCompareUC16,                                      \
-    RawString*, RawSmi*, RawSmi*, RawSmi*)                                     \
+  V(RawBool*, CaseInsensitiveCompareUC16, RawString*, RawSmi*, RawSmi*, RawSmi*)
 
 }  // namespace dart
 
diff --git a/runtime/vm/runtime_entry_mips.cc b/runtime/vm/runtime_entry_mips.cc
index b310556..b89781f 100644
--- a/runtime/vm/runtime_entry_mips.cc
+++ b/runtime/vm/runtime_entry_mips.cc
@@ -25,8 +25,7 @@
   // Redirection to leaf runtime calls supports a maximum of 4 arguments passed
   // in registers (maximum 2 double arguments for leaf float runtime calls).
   ASSERT(argument_count() >= 0);
-  ASSERT(!is_leaf() ||
-         (!is_float() && (argument_count() <= 4)) ||
+  ASSERT(!is_leaf() || (!is_float() && (argument_count() <= 4)) ||
          (argument_count() <= 2));
   Simulator::CallKind call_kind =
       is_leaf() ? (is_float() ? Simulator::kLeafFloatRuntimeCall
diff --git a/runtime/vm/safepoint.cc b/runtime/vm/safepoint.cc
index 7f5d92d..a554a9a 100644
--- a/runtime/vm/safepoint.cc
+++ b/runtime/vm/safepoint.cc
@@ -42,8 +42,7 @@
       safepoint_lock_(new Monitor()),
       number_threads_not_at_safepoint_(0),
       safepoint_operation_count_(0),
-      owner_(NULL) {
-}
+      owner_(NULL) {}
 
 
 SafepointHandler::~SafepointHandler() {
@@ -114,8 +113,7 @@
           // We have been waiting too long, start logging this as we might
           // have an issue where a thread is not checking in for a safepoint.
           OS::Print("Attempt:%" Pd " waiting for %d threads to check in\n",
-                    num_attempts,
-                    number_threads_not_at_safepoint_);
+                    num_attempts, number_threads_not_at_safepoint_);
         }
       }
     }
diff --git a/runtime/vm/safepoint.h b/runtime/vm/safepoint.h
index 8a48f29..5547ce7 100644
--- a/runtime/vm/safepoint.h
+++ b/runtime/vm/safepoint.h
@@ -320,8 +320,7 @@
 class TransitionToGenerated : public TransitionSafepointState {
  public:
   explicit TransitionToGenerated(Thread* T)
-      : TransitionSafepointState(T),
-        execution_state_(T->execution_state()) {
+      : TransitionSafepointState(T), execution_state_(T->execution_state()) {
     ASSERT(T == Thread::Current());
     ASSERT((execution_state_ == Thread::kThreadInVM) ||
            (execution_state_ == Thread::kThreadInNative));
@@ -357,8 +356,8 @@
 // transition set up.
 class TransitionToVM : public TransitionSafepointState {
  public:
-  explicit TransitionToVM(Thread* T) : TransitionSafepointState(T),
-                                       execution_state_(T->execution_state()) {
+  explicit TransitionToVM(Thread* T)
+      : TransitionSafepointState(T), execution_state_(T->execution_state()) {
     ASSERT(T == Thread::Current());
     ASSERT((execution_state_ == Thread::kThreadInVM) ||
            (execution_state_ == Thread::kThreadInNative));
diff --git a/runtime/vm/scanner.cc b/runtime/vm/scanner.cc
index cd8abf5..a34439b 100644
--- a/runtime/vm/scanner.cc
+++ b/runtime/vm/scanner.cc
@@ -23,10 +23,10 @@
 class ScanContext : public ZoneAllocated {
  public:
   explicit ScanContext(Scanner* scanner)
-      :  next_(scanner->saved_context_),
-         string_delimiter_(scanner->string_delimiter_),
-         string_is_multiline_(scanner->string_is_multiline_),
-         brace_level_(scanner->brace_level_) {}
+      : next_(scanner->saved_context_),
+        string_delimiter_(scanner->string_delimiter_),
+        string_is_multiline_(scanner->string_is_multiline_),
+        brace_level_(scanner->brace_level_) {}
 
   void CopyTo(Scanner* scanner) {
     scanner->string_delimiter_ = string_delimiter_;
@@ -100,7 +100,7 @@
 
 
 void Scanner::PushContext() {
-  ScanContext* ctx = new(Z) ScanContext(this);
+  ScanContext* ctx = new (Z) ScanContext(this);
   saved_context_ = ctx;
   string_delimiter_ = '\0';
   string_is_multiline_ = false;
@@ -146,9 +146,8 @@
 
 
 bool Scanner::IsHexDigit(int32_t c) {
-  return IsDecimalDigit(c)
-         || (('A' <= c) && (c <= 'F'))
-         || (('a' <= c) && (c <= 'f'));
+  return IsDecimalDigit(c) || (('A' <= c) && (c <= 'F')) ||
+         (('a' <= c) && (c <= 'f'));
 }
 
 
@@ -169,7 +168,7 @@
   if (str.Length() == 0 || !IsIdentStartChar(CallCharAt()(str, 0))) {
     return false;
   }
-  for (int i =  1; i < str.Length(); i++) {
+  for (int i = 1; i < str.Length(); i++) {
     if (!IsIdentChar(CallCharAt()(str, i))) {
       return false;
     }
@@ -192,16 +191,13 @@
   s.Scan();
   tokens[2] = s.current_token();
 
-  if ((tokens[0].kind == Token::kINTEGER) &&
-      (tokens[1].kind == Token::kEOS)) {
+  if ((tokens[0].kind == Token::kINTEGER) && (tokens[1].kind == Token::kEOS)) {
     *is_positive = true;
     *value = tokens[0].literal;
     return true;
   }
-  if (((tokens[0].kind == Token::kADD) ||
-       (tokens[0].kind == Token::kSUB)) &&
-      (tokens[1].kind == Token::kINTEGER) &&
-      (tokens[2].kind == Token::kEOS)) {
+  if (((tokens[0].kind == Token::kADD) || (tokens[0].kind == Token::kSUB)) &&
+      (tokens[1].kind == Token::kINTEGER) && (tokens[2].kind == Token::kEOS)) {
     // Check there is no space between "+/-" and number.
     if ((tokens[0].offset + 1) != tokens[1].offset) {
       return false;
@@ -291,7 +287,7 @@
     }
   }
   current_token_.kind =
-    (nesting_level == 0) ? Token::kWHITESP : Token::kILLEGAL;
+      (nesting_level == 0) ? Token::kWHITESP : Token::kILLEGAL;
 }
 
 
@@ -317,7 +313,7 @@
         int char_pos = 1;
         while ((char_pos < ident_length) &&
                (keyword[char_pos] ==
-                   CallCharAt()(source_, ident_pos + char_pos))) {
+                CallCharAt()(source_, ident_pos + char_pos))) {
           char_pos++;
         }
         if (char_pos == ident_length) {
@@ -374,8 +370,7 @@
       }
     }
     if (((c0_ == 'e') || (c0_ == 'E')) &&
-        (IsDecimalDigit(LookaheadChar(1)) ||
-         (LookaheadChar(1) == '-') ||
+        (IsDecimalDigit(LookaheadChar(1)) || (LookaheadChar(1) == '-') ||
          (LookaheadChar(1) == '+'))) {
       Recognize(Token::kDOUBLE);
       if ((c0_ == '-') || (c0_ == '+')) {
@@ -544,8 +539,8 @@
       // Scanned a string piece.
       ASSERT(string_chars.data() != NULL);
       // Strings are canonicalized: Allocate a symbol.
-      current_token_.literal = &String::ZoneHandle(Z,
-          Symbols::FromUTF32(T, string_chars.data(), string_chars.length()));
+      current_token_.literal = &String::ZoneHandle(
+          Z, Symbols::FromUTF32(T, string_chars.data(), string_chars.length()));
       // Preserve error tokens.
       if (current_token_.kind != Token::kERROR) {
         current_token_.kind = Token::kSTRING;
@@ -553,9 +548,8 @@
       return;
     } else if (c0_ == string_delimiter_) {
       // Check if we are at the end of the string literal.
-      if (!string_is_multiline_ ||
-          ((LookaheadChar(1) == string_delimiter_) &&
-           (LookaheadChar(2) == string_delimiter_))) {
+      if (!string_is_multiline_ || ((LookaheadChar(1) == string_delimiter_) &&
+                                    (LookaheadChar(2) == string_delimiter_))) {
         if (string_is_multiline_) {
           ReadChar();  // Skip two string delimiters.
           ReadChar();
@@ -567,9 +561,9 @@
           Recognize(Token::kSTRING);
           ASSERT(string_chars.data() != NULL);
           // Strings are canonicalized: Allocate a symbol.
-          current_token_.literal = &String::ZoneHandle(Z,
-              Symbols::FromUTF32(T,
-                                 string_chars.data(), string_chars.length()));
+          current_token_.literal =
+              &String::ZoneHandle(Z, Symbols::FromUTF32(T, string_chars.data(),
+                                                        string_chars.length()));
         }
         EndStringLiteral();
         return;
@@ -877,8 +871,8 @@
           char utf8_char[5];
           int len = Utf8::Encode(c0_, utf8_char);
           utf8_char[len] = '\0';
-          OS::SNPrint(msg, sizeof(msg),
-                      "unexpected character: '%s' (U+%04X)\n", utf8_char, c0_);
+          OS::SNPrint(msg, sizeof(msg), "unexpected character: '%s' (U+%04X)\n",
+                      utf8_char, c0_);
           ErrorMsg(msg);
           ReadChar();
         }
@@ -893,8 +887,7 @@
     Scan();
     bool inserted_new_lines = false;
     for (intptr_t diff = current_token_.position.line - prev_token_line_;
-         diff > 0;
-         diff--) {
+         diff > 0; diff--) {
       newline_token_.position.line = current_token_.position.line - diff;
       collector->AddToken(newline_token_);
       inserted_new_lines = true;
@@ -902,11 +895,11 @@
     if (inserted_new_lines &&
         ((current_token_.kind == Token::kINTERPOL_VAR) ||
          (current_token_.kind == Token::kINTERPOL_START))) {
-          // NOTE: If this changes, be sure to update
-          // Script::GenerateLineNumberArray to stay in sync.
-          empty_string_token_.position.line = current_token_.position.line;
-          collector->AddToken(empty_string_token_);
-        }
+      // NOTE: If this changes, be sure to update
+      // Script::GenerateLineNumberArray to stay in sync.
+      empty_string_token_.position.line = current_token_.position.line;
+      collector->AddToken(empty_string_token_);
+    }
     collector->AddToken(current_token_);
     prev_token_line_ = current_token_.position.line;
   } while (current_token_.kind != Token::kEOS);
@@ -921,8 +914,7 @@
     Scan();
     bool inserted_new_lines = false;
     for (intptr_t diff = current_token_.position.line - prev_token_line_;
-         diff > 0;
-         diff--) {
+         diff > 0; diff--) {
       // Advance the index to account for tokens added in ScanAll.
       index++;
       inserted_new_lines = true;
@@ -930,8 +922,8 @@
     if (inserted_new_lines &&
         ((current_token_.kind == Token::kINTERPOL_VAR) ||
          (current_token_.kind == Token::kINTERPOL_START))) {
-          // Advance the index to account for tokens added in ScanAll.
-          index++;
+      // Advance the index to account for tokens added in ScanAll.
+      index++;
     }
     index++;
     prev_token_line_ = current_token_.position.line;
diff --git a/runtime/vm/scanner.h b/runtime/vm/scanner.h
index aff5b3a..d26b989 100644
--- a/runtime/vm/scanner.h
+++ b/runtime/vm/scanner.h
@@ -46,9 +46,10 @@
 
   class TokenCollector : public ValueObject {
    public:
-    TokenCollector() { }
-    virtual ~TokenCollector() { }
-    virtual void AddToken(const TokenDescriptor& token) { }
+    TokenCollector() {}
+    virtual ~TokenCollector() {}
+    virtual void AddToken(const TokenDescriptor& token) {}
+
    private:
     DISALLOW_COPY_AND_ASSIGN(TokenCollector);
   };
@@ -166,12 +167,8 @@
 
   // Reads identifier.
   void ScanIdentChars(bool allow_dollar);
-  void ScanIdent() {
-    ScanIdentChars(true);
-  }
-  void ScanIdentNoDollar() {
-    ScanIdentChars(false);
-  }
+  void ScanIdent() { ScanIdentChars(true); }
+  void ScanIdentNoDollar() { ScanIdentChars(false); }
 
   // Reads a number literal.
   void ScanNumber(bool dec_point_seen);
@@ -183,17 +180,17 @@
   Thread* thread() const { return thread_; }
   Zone* zone() const { return zone_; }
 
-  TokenDescriptor current_token_;  // Current token.
-  TokenDescriptor newline_token_;  // Newline token.
+  TokenDescriptor current_token_;       // Current token.
+  TokenDescriptor newline_token_;       // Newline token.
   TokenDescriptor empty_string_token_;  // Token for "".
-  const String& source_;           // The source text being tokenized.
-  intptr_t source_length_;         // The length of the source text.
-  intptr_t lookahead_pos_;         // Position of lookahead character
-                                   // within source_.
-  intptr_t token_start_;           // Begin of current token in src_.
-  int32_t c0_;                     // Lookahead character.
-  bool newline_seen_;              // Newline before current token.
-  intptr_t prev_token_line_;       // Line number of the previous token.
+  const String& source_;                // The source text being tokenized.
+  intptr_t source_length_;              // The length of the source text.
+  intptr_t lookahead_pos_;              // Position of lookahead character
+                                        // within source_.
+  intptr_t token_start_;                // Begin of current token in src_.
+  int32_t c0_;                          // Lookahead character.
+  bool newline_seen_;                   // Newline before current token.
+  intptr_t prev_token_line_;            // Line number of the previous token.
 
   // The following fields keep track whether we are scanning a string literal
   // and its interpolated expressions.
@@ -204,7 +201,7 @@
 
   const String& private_key_;
 
-  SourcePosition c0_pos_;      // Source position of lookahead character c0_.
+  SourcePosition c0_pos_;  // Source position of lookahead character c0_.
 
   const CharAtFunc char_at_func_;
 
diff --git a/runtime/vm/scanner_test.cc b/runtime/vm/scanner_test.cc
index b6d4d23..f934c54 100644
--- a/runtime/vm/scanner_test.cc
+++ b/runtime/vm/scanner_test.cc
@@ -15,9 +15,8 @@
 
 
 static void LogTokenDesc(Scanner::TokenDescriptor token) {
-  OS::Print("pos %2d:%d-%d token %s  ",
-            token.position.line, token.position.column,
-            token.position.column,
+  OS::Print("pos %2d:%d-%d token %s  ", token.position.line,
+            token.position.column, token.position.column,
             Token::Name(token.kind));
   if (token.literal != NULL) {
     OS::Print("%s", token.literal->ToCString());
@@ -39,73 +38,73 @@
 }
 
 
-static void CheckKind(const GrowableTokenStream &token_stream,
-               int index,
-               Token::Kind kind) {
+static void CheckKind(const GrowableTokenStream& token_stream,
+                      int index,
+                      Token::Kind kind) {
   if (token_stream[index].kind != kind) {
     OS::PrintErr("Token %d: expected kind %s but got %s\n", index,
-        Token::Name(kind), Token::Name(token_stream[index].kind));
+                 Token::Name(kind), Token::Name(token_stream[index].kind));
   }
   EXPECT_EQ(kind, token_stream[index].kind);
 }
 
 
 static void CheckLiteral(const GrowableTokenStream& token_stream,
-                 int index,
-                 const char* literal) {
+                         int index,
+                         const char* literal) {
   if (token_stream[index].literal == NULL) {
-    OS::PrintErr("Token %d: expected literal \"%s\" but got nothing\n",
-                 index, literal);
+    OS::PrintErr("Token %d: expected literal \"%s\" but got nothing\n", index,
+                 literal);
   } else if (strcmp(literal, token_stream[index].literal->ToCString())) {
-    OS::PrintErr("Token %d: expected literal \"%s\" but got \"%s\"\n",
-                 index, literal, token_stream[index].literal->ToCString());
+    OS::PrintErr("Token %d: expected literal \"%s\" but got \"%s\"\n", index,
+                 literal, token_stream[index].literal->ToCString());
   }
 }
 
 
 static void CheckIdent(const GrowableTokenStream& token_stream,
-               int index,
-               const char* literal) {
+                       int index,
+                       const char* literal) {
   CheckKind(token_stream, index, Token::kIDENT);
   CheckLiteral(token_stream, index, literal);
 }
 
 
 static void CheckInteger(const GrowableTokenStream& token_stream,
-                 int index,
-                 const char* literal) {
+                         int index,
+                         const char* literal) {
   CheckKind(token_stream, index, Token::kINTEGER);
   CheckLiteral(token_stream, index, literal);
 }
 
 
 static void CheckLineNumber(const GrowableTokenStream& token_stream,
-                     int index,
-                     int line_number) {
+                            int index,
+                            int line_number) {
   if (token_stream[index].position.line != line_number) {
-    OS::PrintErr("Token %d: expected line number %d but got %d\n",
-        index, line_number, token_stream[index].position.line);
+    OS::PrintErr("Token %d: expected line number %d but got %d\n", index,
+                 line_number, token_stream[index].position.line);
   }
 }
 
 
-static void CheckNumTokens(const GrowableTokenStream& token_stream,
-                    int index) {
+static void CheckNumTokens(const GrowableTokenStream& token_stream, int index) {
   if (token_stream.length() != index) {
-    OS::PrintErr("Expected %d tokens but got only %" Pd ".\n",
-        index, token_stream.length());
+    OS::PrintErr("Expected %d tokens but got only %" Pd ".\n", index,
+                 token_stream.length());
   }
 }
 
 
 class Collector : public Scanner::TokenCollector {
  public:
-  explicit Collector(GrowableTokenStream* ts) : ts_(ts) { }
-  virtual ~Collector() { }
+  explicit Collector(GrowableTokenStream* ts) : ts_(ts) {}
+  virtual ~Collector() {}
 
   virtual void AddToken(const Scanner::TokenDescriptor& token) {
     ts_->Add(token);
   }
+
  private:
   GrowableTokenStream* ts_;
 };
@@ -138,9 +137,9 @@
 
 
 static void CommentTest() {
-  const GrowableTokenStream& tokens =
-      Scan("Foo( /*block \n"
-           "comment*/ 0xff) // line comment;");
+  const GrowableTokenStream& tokens = Scan(
+      "Foo( /*block \n"
+      "comment*/ 0xff) // line comment;");
 
   CheckNumTokens(tokens, 6);
   CheckIdent(tokens, 0, "Foo");
@@ -192,15 +191,13 @@
 
 
 static void InvalidStringEscapes() {
-  const GrowableTokenStream& out_of_range_low =
-      Scan("\"\\u{110000}\"");
+  const GrowableTokenStream& out_of_range_low = Scan("\"\\u{110000}\"");
   EXPECT_EQ(2, out_of_range_low.length());
   CheckKind(out_of_range_low, 0, Token::kERROR);
   EXPECT(out_of_range_low[0].literal->Equals("invalid code point"));
   CheckKind(out_of_range_low, 1, Token::kEOS);
 
-  const GrowableTokenStream& out_of_range_high =
-      Scan("\"\\u{FFFFFF}\"");
+  const GrowableTokenStream& out_of_range_high = Scan("\"\\u{FFFFFF}\"");
   EXPECT_EQ(2, out_of_range_high.length());
   CheckKind(out_of_range_high, 0, Token::kERROR);
   EXPECT(out_of_range_high[0].literal->Equals("invalid code point"));
@@ -223,7 +220,7 @@
 
   EXPECT_EQ('\\', litchars[0]);
   EXPECT_EQ('\'', litchars[1]);
-  EXPECT_EQ(' ',  litchars[2]);
+  EXPECT_EQ(' ', litchars[2]);
   EXPECT_EQ('\\', litchars[3]);
   EXPECT_EQ('\\', litchars[4]);
 }
@@ -248,12 +245,12 @@
   const char* litchars = (tokens)[2].literal->ToCString();
   EXPECT_EQ(6, (tokens)[2].literal->Length());
 
-  EXPECT_EQ('1',  litchars[0]);  // First newline is dropped.
+  EXPECT_EQ('1', litchars[0]);  // First newline is dropped.
   EXPECT_EQ('\'', litchars[1]);
-  EXPECT_EQ(' ',  litchars[2]);
-  EXPECT_EQ('x',  litchars[3]);
+  EXPECT_EQ(' ', litchars[2]);
+  EXPECT_EQ('x', litchars[3]);
   EXPECT_EQ('\n', litchars[4]);
-  EXPECT_EQ('2',  litchars[5]);
+  EXPECT_EQ('2', litchars[5]);
 }
 
 
@@ -285,8 +282,7 @@
 
 
 static void NumberLiteral() {
-  const GrowableTokenStream& tokens =
-      Scan("5 0x5d 0.3 0.33 1E+12 .42 +5");
+  const GrowableTokenStream& tokens = Scan("5 0x5d 0.3 0.33 1E+12 .42 +5");
 
   CheckKind(tokens, 0, Token::kINTEGER);
   CheckKind(tokens, 1, Token::kINTEGER);
@@ -365,8 +361,7 @@
 
 
 void InvalidText() {
-  const GrowableTokenStream& tokens =
-      Scan("\\");
+  const GrowableTokenStream& tokens = Scan("\\");
 
   EXPECT_EQ(2, tokens.length());
   CheckKind(tokens, 0, Token::kERROR);
@@ -400,9 +395,9 @@
 
   EXPECT_EQ(4, (tokens)[5].literal->Length());
   const char* litchars = (tokens)[5].literal->ToCString();
-  EXPECT_EQ('c',  litchars[0]);  // First newline is dropped.
+  EXPECT_EQ('c', litchars[0]);  // First newline is dropped.
   EXPECT_EQ('\n', litchars[1]);
-  EXPECT_EQ('d',  litchars[2]);
+  EXPECT_EQ('d', litchars[2]);
   EXPECT_EQ('\n', litchars[3]);
 }
 
diff --git a/runtime/vm/scavenger.cc b/runtime/vm/scavenger.cc
index e5e21e1..69d09cb 100644
--- a/runtime/vm/scavenger.cc
+++ b/runtime/vm/scavenger.cc
@@ -22,10 +22,14 @@
 
 namespace dart {
 
-DEFINE_FLAG(int, early_tenuring_threshold, 66,
+DEFINE_FLAG(int,
+            early_tenuring_threshold,
+            66,
             "When more than this percentage of promotion candidates survive, "
             "promote all survivors of next scavenge.");
-DEFINE_FLAG(int, new_gen_garbage_threshold, 90,
+DEFINE_FLAG(int,
+            new_gen_garbage_threshold,
+            90,
             "Grow new gen when less than this percentage is garbage.");
 DEFINE_FLAG(int, new_gen_growth_factor, 4, "Grow new gen by this factor.");
 
@@ -72,7 +76,7 @@
         vm_heap_(Dart::vm_isolate()->heap()),
         page_space_(scavenger->heap_->old_space()),
         bytes_promoted_(0),
-        visiting_old_object_(NULL) { }
+        visiting_old_object_(NULL) {}
 
   void VisitPointers(RawObject** first, RawObject** last) {
     ASSERT((visiting_old_object_ != NULL) ||
@@ -159,8 +163,7 @@
       ASSERT(new_addr != 0);
       // Copy the object to the new location.
       memmove(reinterpret_cast<void*>(new_addr),
-              reinterpret_cast<void*>(raw_addr),
-              size);
+              reinterpret_cast<void*>(raw_addr), size);
       // Remember forwarding address.
       ForwardTo(raw_addr, new_addr);
     }
@@ -193,16 +196,16 @@
  public:
   ScavengerWeakVisitor(Thread* thread,
                        Scavenger* scavenger,
-                       FinalizationQueue* finalization_queue) :
-      HandleVisitor(thread),
-      scavenger_(scavenger),
-      queue_(finalization_queue) {
+                       FinalizationQueue* finalization_queue)
+      : HandleVisitor(thread),
+        scavenger_(scavenger),
+        queue_(finalization_queue) {
     ASSERT(scavenger->heap_->isolate() == thread->isolate());
   }
 
   void VisitHandle(uword addr) {
     FinalizablePersistentHandle* handle =
-      reinterpret_cast<FinalizablePersistentHandle*>(addr);
+        reinterpret_cast<FinalizablePersistentHandle*>(addr);
     RawObject** p = handle->raw_addr();
     if (scavenger_->IsUnreachable(p)) {
       handle->UpdateUnreachable(thread()->isolate(), queue_);
@@ -223,8 +226,7 @@
 // StoreBuffers.
 class VerifyStoreBufferPointerVisitor : public ObjectPointerVisitor {
  public:
-  VerifyStoreBufferPointerVisitor(Isolate* isolate,
-                                  const SemiSpace* to)
+  VerifyStoreBufferPointerVisitor(Isolate* isolate, const SemiSpace* to)
       : ObjectPointerVisitor(isolate), to_(to) {}
 
   void VisitPointers(RawObject** first, RawObject** last) {
@@ -254,8 +256,8 @@
 SemiSpace::~SemiSpace() {
   if (reserved_ != NULL) {
 #if defined(DEBUG)
-    memset(reserved_->address(), Heap::kZapByte,
-           size_in_words() << kWordSizeLog2);
+    memset(reserved_->address(), Heap::kZapByte, size_in_words()
+                                                     << kWordSizeLog2);
 #endif  // defined(DEBUG)
     delete reserved_;
   }
@@ -320,8 +322,8 @@
 
 void SemiSpace::WriteProtect(bool read_only) {
   if (reserved_ != NULL) {
-    bool success = reserved_->Protect(
-        read_only ? VirtualMemory::kReadOnly : VirtualMemory::kReadWrite);
+    bool success = reserved_->Protect(read_only ? VirtualMemory::kReadOnly
+                                                : VirtualMemory::kReadWrite);
     ASSERT(success);
   }
 }
@@ -343,7 +345,8 @@
   ASSERT(Object::tags_offset() == 0);
 
   // Set initial size resulting in a total of three different levels.
-  const intptr_t initial_semi_capacity_in_words = max_semi_capacity_in_words /
+  const intptr_t initial_semi_capacity_in_words =
+      max_semi_capacity_in_words /
       (FLAG_new_gen_growth_factor * FLAG_new_gen_growth_factor);
   to_ = SemiSpace::New(initial_semi_capacity_in_words);
   if (to_ == NULL) {
@@ -543,8 +546,7 @@
 
 void Scavenger::ProcessToSpace(ScavengerVisitor* visitor) {
   // Iterate until all work has been drained.
-  while ((resolved_top_ < top_) ||
-         PromotedStackHasMore()) {
+  while ((resolved_top_ < top_) || PromotedStackHasMore()) {
     while (resolved_top_ < top_) {
       RawObject* raw_obj = RawObject::FromAddr(resolved_top_);
       intptr_t class_id = raw_obj->GetClassId();
@@ -613,8 +615,8 @@
   ASSERT(heap_ != NULL);
   Isolate* isolate = heap_->isolate();
   ASSERT(isolate != NULL);
-  isolate->GetHeapNewCapacityMaxMetric()->SetValue(
-      to_->size_in_words() * kWordSize);
+  isolate->GetHeapNewCapacityMaxMetric()->SetValue(to_->size_in_words() *
+                                                   kWordSize);
 }
 
 
@@ -635,11 +637,11 @@
   ASSERT(raw_weak->IsHeapObject());
   ASSERT(raw_weak->IsNewObject());
   ASSERT(raw_weak->IsWeakProperty());
-  DEBUG_ONLY(
-      uword raw_addr = RawObject::ToAddr(raw_weak);
-      uword header = *reinterpret_cast<uword*>(raw_addr);
-      ASSERT(!IsForwarding(header));
-  )
+#if defined(DEBUG)
+  uword raw_addr = RawObject::ToAddr(raw_weak);
+  uword header = *reinterpret_cast<uword*>(raw_addr);
+  ASSERT(!IsForwarding(header));
+#endif  // defined(DEBUG)
   ASSERT(raw_weak->ptr()->next_ == 0);
   raw_weak->ptr()->next_ = reinterpret_cast<uword>(delayed_weak_properties_);
   delayed_weak_properties_ = raw_weak;
@@ -666,13 +668,10 @@
 
 void Scavenger::ProcessWeakReferences() {
   // Rehash the weak tables now that we know which objects survive this cycle.
-  for (int sel = 0;
-       sel < Heap::kNumWeakSelectors;
-       sel++) {
-    WeakTable* table = heap_->GetWeakTable(
-        Heap::kNew, static_cast<Heap::WeakSelector>(sel));
-    heap_->SetWeakTable(Heap::kNew,
-                        static_cast<Heap::WeakSelector>(sel),
+  for (int sel = 0; sel < Heap::kNumWeakSelectors; sel++) {
+    WeakTable* table =
+        heap_->GetWeakTable(Heap::kNew, static_cast<Heap::WeakSelector>(sel));
+    heap_->SetWeakTable(Heap::kNew, static_cast<Heap::WeakSelector>(sel),
                         WeakTable::NewFrom(table));
     intptr_t size = table->size();
     for (intptr_t i = 0; i < size; i++) {
@@ -685,8 +684,7 @@
           // The object has survived.  Preserve its record.
           uword new_addr = ForwardedAddr(header);
           raw_obj = RawObject::FromAddr(new_addr);
-          heap_->SetWeakEntry(raw_obj,
-                              static_cast<Heap::WeakSelector>(sel),
+          heap_->SetWeakEntry(raw_obj, static_cast<Heap::WeakSelector>(sel),
                               table->ValueAt(i));
         }
       }
@@ -706,14 +704,14 @@
       // Reset the next pointer in the weak property.
       cur_weak->ptr()->next_ = 0;
 
-      DEBUG_ONLY(
-          RawObject* raw_key = cur_weak->ptr()->key_;
-          uword raw_addr = RawObject::ToAddr(raw_key);
-          uword header = *reinterpret_cast<uword*>(raw_addr);
-          ASSERT(!IsForwarding(header));
-          ASSERT(raw_key->IsHeapObject());
-          ASSERT(raw_key->IsNewObject());  // Key still points into from space.
-      )
+#if defined(DEBUG)
+      RawObject* raw_key = cur_weak->ptr()->key_;
+      uword raw_addr = RawObject::ToAddr(raw_key);
+      uword header = *reinterpret_cast<uword*>(raw_addr);
+      ASSERT(!IsForwarding(header));
+      ASSERT(raw_key->IsHeapObject());
+      ASSERT(raw_key->IsNewObject());  // Key still points into from space.
+#endif                                 // defined(DEBUG)
 
       WeakProperty::Clear(cur_weak);
 
@@ -836,11 +834,9 @@
     int64_t end = OS::GetCurrentTimeMicros();
     heap_->RecordTime(kProcessToSpace, middle - start);
     heap_->RecordTime(kIterateWeaks, end - middle);
-    stats_history_.Add(
-        ScavengeStats(start, end,
-                      usage_before, GetCurrentUsage(),
-                      promo_candidate_words,
-                      visitor.bytes_promoted() >> kWordSizeLog2));
+    stats_history_.Add(ScavengeStats(
+        start, end, usage_before, GetCurrentUsage(), promo_candidate_words,
+        visitor.bytes_promoted() >> kWordSizeLog2));
   }
   Epilogue(isolate, from, invoke_api_callbacks);
 
diff --git a/runtime/vm/scavenger.h b/runtime/vm/scavenger.h
index caa2daf..ee64a06 100644
--- a/runtime/vm/scavenger.h
+++ b/runtime/vm/scavenger.h
@@ -71,13 +71,13 @@
                 SpaceUsage before,
                 SpaceUsage after,
                 intptr_t promo_candidates_in_words,
-                intptr_t promoted_in_words) :
-      start_micros_(start_micros),
-      end_micros_(end_micros),
-      before_(before),
-      after_(after),
-      promo_candidates_in_words_(promo_candidates_in_words),
-      promoted_in_words_(promoted_in_words) {}
+                intptr_t promoted_in_words)
+      : start_micros_(start_micros),
+        end_micros_(end_micros),
+        before_(before),
+        after_(after),
+        promo_candidates_in_words_(promo_candidates_in_words),
+        promoted_in_words_(promoted_in_words) {}
 
   // Of all data before scavenge, what fraction was found to be garbage?
   double GarbageFraction() const {
@@ -88,14 +88,13 @@
   // Fraction of promotion candidates that survived and was thereby promoted.
   // Returns zero if there were no promotion candidates.
   double PromoCandidatesSuccessFraction() const {
-    return promo_candidates_in_words_ > 0 ?
-        promoted_in_words_ / static_cast<double>(promo_candidates_in_words_) :
-        0.0;
+    return promo_candidates_in_words_ > 0
+               ? promoted_in_words_ /
+                     static_cast<double>(promo_candidates_in_words_)
+               : 0.0;
   }
 
-  int64_t DurationMicros() const {
-    return end_micros_ - start_micros_;
-  }
+  int64_t DurationMicros() const { return end_micros_ - start_micros_; }
 
  private:
   int64_t start_micros_;
@@ -118,9 +117,7 @@
   // During scavenging both the to and from spaces contain "legal" objects.
   // During a scavenge this function only returns true for addresses that will
   // be part of the surviving objects.
-  bool Contains(uword addr) const {
-    return to_->Contains(addr);
-  }
+  bool Contains(uword addr) const { return to_->Contains(addr); }
 
   RawObject* FindObject(FindObjectVisitor* visitor) const;
 
@@ -165,12 +162,8 @@
   int64_t UsedInWords() const {
     return (top_ - FirstObjectStart()) >> kWordSizeLog2;
   }
-  int64_t CapacityInWords() const {
-    return to_->size_in_words();
-  }
-  int64_t ExternalInWords() const {
-    return external_size_ >> kWordSizeLog2;
-  }
+  int64_t CapacityInWords() const { return to_->size_in_words(); }
+  int64_t ExternalInWords() const { return external_size_ >> kWordSizeLog2; }
   SpaceUsage GetCurrentUsage() const {
     SpaceUsage usage;
     usage.used_in_words = UsedInWords();
@@ -186,21 +179,13 @@
 
   void WriteProtect(bool read_only);
 
-  void AddGCTime(int64_t micros) {
-    gc_time_micros_ += micros;
-  }
+  void AddGCTime(int64_t micros) { gc_time_micros_ += micros; }
 
-  int64_t gc_time_micros() const {
-    return gc_time_micros_;
-  }
+  int64_t gc_time_micros() const { return gc_time_micros_; }
 
-  void IncrementCollections() {
-    collections_++;
-  }
+  void IncrementCollections() { collections_++; }
 
-  intptr_t collections() const {
-    return collections_;
-  }
+  intptr_t collections() const { return collections_; }
 
 #ifndef PRODUCT
   void PrintToJSONObject(JSONObject* object) const;
diff --git a/runtime/vm/scavenger_test.cc b/runtime/vm/scavenger_test.cc
index 9776cca..cd8d610 100644
--- a/runtime/vm/scavenger_test.cc
+++ b/runtime/vm/scavenger_test.cc
@@ -12,10 +12,8 @@
 // Expects to visit no objects (since the space should be empty).
 class FailingObjectVisitor : public ObjectVisitor {
  public:
-  FailingObjectVisitor() { }
-  virtual void VisitObject(RawObject* obj) {
-    EXPECT(false);
-  }
+  FailingObjectVisitor() {}
+  virtual void VisitObject(RawObject* obj) { EXPECT(false); }
 };
 
 // Expects to visit no objects (since the space should be empty).
@@ -30,7 +28,7 @@
 // Expects to visit no objects (since the space should be empty).
 class FailingFindObjectVisitor : public FindObjectVisitor {
  public:
-  FailingFindObjectVisitor() { }
+  FailingFindObjectVisitor() {}
   virtual bool FindObject(RawObject* obj) const {
     EXPECT(false);
     return false;
diff --git a/runtime/vm/scope_timer.h b/runtime/vm/scope_timer.h
index f45854e..1266f29 100644
--- a/runtime/vm/scope_timer.h
+++ b/runtime/vm/scope_timer.h
@@ -13,10 +13,8 @@
 class ScopeTimer : public ValueObject {
  public:
   explicit ScopeTimer(const char* name, bool enabled = true)
-      : enabled_(enabled),
-        name_(name),
-        start_(0) {
-    if (!enabled_)     {
+      : enabled_(enabled), name_(name), start_(0) {
+    if (!enabled_) {
       return;
     }
     start_ = OS::GetCurrentTimeMicros();
diff --git a/runtime/vm/scopes.cc b/runtime/vm/scopes.cc
index 834ad1b..75f5d68 100644
--- a/runtime/vm/scopes.cc
+++ b/runtime/vm/scopes.cc
@@ -10,7 +10,9 @@
 
 namespace dart {
 
-DEFINE_FLAG(bool, share_enclosing_context, true,
+DEFINE_FLAG(bool,
+            share_enclosing_context,
+            true,
             "Allocate captured variables in the existing context of an "
             "enclosing scope (up to innermost loop) and spare the allocation "
             "of a local context.");
@@ -201,7 +203,7 @@
   ASSERT(num_parameters >= 0);
   // Parameters must be listed first and must all appear in the top scope.
   ASSERT(num_parameters <= num_variables());
-  int pos = 0;  // Current variable position.
+  int pos = 0;                              // Current variable position.
   int frame_index = first_parameter_index;  // Current free frame index.
   while (pos < num_parameters) {
     LocalVariable* parameter = VariableAt(pos);
@@ -241,13 +243,11 @@
   int min_frame_index = frame_index;  // Frame index decreases with allocations.
   LocalScope* child = this->child();
   while (child != NULL) {
-    int const dummy_parameter_index = 0;  // Ignored, since no parameters.
+    int const dummy_parameter_index = 0;    // Ignored, since no parameters.
     int const num_parameters_in_child = 0;  // No parameters in children scopes.
-    int child_frame_index = child->AllocateVariables(dummy_parameter_index,
-                                                     num_parameters_in_child,
-                                                     frame_index,
-                                                     context_owner,
-                                                     found_captured_variables);
+    int child_frame_index = child->AllocateVariables(
+        dummy_parameter_index, num_parameters_in_child, frame_index,
+        context_owner, found_captured_variables);
     if (child_frame_index < min_frame_index) {
       min_frame_index = child_frame_index;
     }
@@ -462,7 +462,7 @@
           (label->kind() == SourceLabel::kFor) ||
           (label->kind() == SourceLabel::kDoWhile) ||
           ((jump_kind == Token::kBREAK) &&
-              (label->kind() == SourceLabel::kSwitch))) {
+           (label->kind() == SourceLabel::kSwitch))) {
         return label;
       }
     }
@@ -533,8 +533,8 @@
 }
 
 
-RawContextScope* LocalScope::PreserveOuterScope(int current_context_level)
-    const {
+RawContextScope* LocalScope::PreserveOuterScope(
+    int current_context_level) const {
   // Since code generation for nested functions is postponed until first
   // invocation, the function level of the closure scope can only be 1.
   ASSERT(function_level() == 1);
@@ -587,19 +587,18 @@
   for (int i = 0; i < context_scope.num_variables(); i++) {
     LocalVariable* variable;
     if (context_scope.IsConstAt(i)) {
-      variable = new LocalVariable(
-          context_scope.DeclarationTokenIndexAt(i),
-          context_scope.TokenIndexAt(i),
-          String::ZoneHandle(context_scope.NameAt(i)),
-          Object::dynamic_type());
+      variable = new LocalVariable(context_scope.DeclarationTokenIndexAt(i),
+                                   context_scope.TokenIndexAt(i),
+                                   String::ZoneHandle(context_scope.NameAt(i)),
+                                   Object::dynamic_type());
       variable->SetConstValue(
           Instance::ZoneHandle(context_scope.ConstValueAt(i)));
     } else {
-      variable = new LocalVariable(
-          context_scope.DeclarationTokenIndexAt(i),
-          context_scope.TokenIndexAt(i),
-          String::ZoneHandle(context_scope.NameAt(i)),
-          AbstractType::ZoneHandle(context_scope.TypeAt(i)));
+      variable =
+          new LocalVariable(context_scope.DeclarationTokenIndexAt(i),
+                            context_scope.TokenIndexAt(i),
+                            String::ZoneHandle(context_scope.NameAt(i)),
+                            AbstractType::ZoneHandle(context_scope.TypeAt(i)));
     }
     variable->set_is_captured();
     variable->set_index(context_scope.ContextIndexAt(i));
diff --git a/runtime/vm/scopes.h b/runtime/vm/scopes.h
index 69551d0..688050a 100644
--- a/runtime/vm/scopes.h
+++ b/runtime/vm/scopes.h
@@ -25,18 +25,18 @@
                 TokenPosition token_pos,
                 const String& name,
                 const AbstractType& type)
-    : declaration_pos_(declaration_pos),
-      token_pos_(token_pos),
-      name_(name),
-      owner_(NULL),
-      type_(type),
-      const_value_(NULL),
-      is_final_(false),
-      is_captured_(false),
-      is_invisible_(false),
-      is_captured_parameter_(false),
-      is_forced_stack_(false),
-      index_(LocalVariable::kUninitializedIndex) {
+      : declaration_pos_(declaration_pos),
+        token_pos_(token_pos),
+        name_(name),
+        owner_(NULL),
+        type_(type),
+        const_value_(NULL),
+        is_final_(false),
+        is_captured_(false),
+        is_invisible_(false),
+        is_captured_parameter_(false),
+        is_forced_stack_(false),
+        index_(LocalVariable::kUninitializedIndex) {
     ASSERT(type.IsZoneHandle() || type.IsReadOnlyHandle());
     ASSERT(type.IsFinalized());
     ASSERT(name.IsSymbol());
@@ -66,9 +66,7 @@
   bool is_forced_stack() const { return is_forced_stack_; }
   void set_is_forced_stack() { is_forced_stack_ = true; }
 
-  bool HasIndex() const {
-    return index_ != kUninitializedIndex;
-  }
+  bool HasIndex() const { return index_ != kUninitializedIndex; }
   int index() const {
     ASSERT(HasIndex());
     return index_;
@@ -80,24 +78,16 @@
     index_ = index;
   }
 
-  void set_invisible(bool value) {
-    is_invisible_ = value;
-  }
+  void set_invisible(bool value) { is_invisible_ = value; }
   bool is_invisible() const { return is_invisible_; }
 
   bool is_captured_parameter() const { return is_captured_parameter_; }
-  void set_is_captured_parameter(bool value) {
-    is_captured_parameter_ = value;
-  }
+  void set_is_captured_parameter(bool value) { is_captured_parameter_ = value; }
 
   // By convention, internal variables start with a colon.
-  bool IsInternal() const {
-    return name_.CharAt(0) == ':';
-  }
+  bool IsInternal() const { return name_.CharAt(0) == ':'; }
 
-  bool IsConst() const {
-    return const_value_ != NULL;
-  }
+  bool IsConst() const { return const_value_ != NULL; }
 
   void SetConstValue(const Instance& value) {
     ASSERT(value.IsZoneHandle() || value.IsReadOnlyHandle());
@@ -127,9 +117,9 @@
 
   const AbstractType& type_;  // Declaration type of local variable.
 
-  const Instance* const_value_;   // NULL or compile-time const value.
+  const Instance* const_value_;  // NULL or compile-time const value.
 
-  bool is_final_;  // If true, this variable is readonly.
+  bool is_final_;     // If true, this variable is readonly.
   bool is_captured_;  // If true, this variable lives in the context, otherwise
                       // in the stack frame.
   bool is_invisible_;
@@ -146,13 +136,13 @@
 class NameReference : public ZoneAllocated {
  public:
   NameReference(TokenPosition token_pos, const String& name)
-    : token_pos_(token_pos),
-      name_(name) {
+      : token_pos_(token_pos), name_(name) {
     ASSERT(name.IsSymbol());
   }
   const String& name() const { return name_; }
   TokenPosition token_pos() const { return token_pos_; }
   void set_token_pos(TokenPosition value) { token_pos_ = value; }
+
  private:
   TokenPosition token_pos_;
   const String& name_;
@@ -174,10 +164,7 @@
   };
 
   SourceLabel(TokenPosition token_pos, const String& name, Kind kind)
-    : token_pos_(token_pos),
-      name_(name),
-      owner_(NULL),
-      kind_(kind) {
+      : token_pos_(token_pos), name_(name), owner_(NULL), kind_(kind) {
     ASSERT(name.IsSymbol());
   }
 
@@ -185,18 +172,14 @@
     if (name != NULL) {
       return new SourceLabel(token_pos, *name, kind);
     } else {
-      return new SourceLabel(token_pos,
-                             Symbols::DefaultLabel(),
-                             kind);
+      return new SourceLabel(token_pos, Symbols::DefaultLabel(), kind);
     }
   }
 
   TokenPosition token_pos() const { return token_pos_; }
   const String& name() const { return name_; }
   LocalScope* owner() const { return owner_; }
-  void set_owner(LocalScope* owner) {
-    owner_ = owner;
-  }
+  void set_owner(LocalScope* owner) { owner_ = owner; }
 
   Kind kind() const { return kind_; }
 
@@ -379,10 +362,10 @@
   LocalScope* parent_;
   LocalScope* child_;
   LocalScope* sibling_;
-  int function_level_;  // Reflects the nesting level of local functions.
-  int loop_level_;      // Reflects the loop nesting level.
-  int context_level_;   // Reflects the level of the runtime context.
-  int num_context_variables_;   // Only set if this scope is a context owner.
+  int function_level_;         // Reflects the nesting level of local functions.
+  int loop_level_;             // Reflects the loop nesting level.
+  int context_level_;          // Reflects the level of the runtime context.
+  int num_context_variables_;  // Only set if this scope is a context owner.
   TokenPosition begin_token_pos_;  // Token index of beginning of scope.
   TokenPosition end_token_pos_;    // Token index of end of scope.
   GrowableArray<LocalVariable*> variables_;
diff --git a/runtime/vm/scopes_test.cc b/runtime/vm/scopes_test.cc
index fb6e438..f2171a5 100644
--- a/runtime/vm/scopes_test.cc
+++ b/runtime/vm/scopes_test.cc
@@ -13,20 +13,16 @@
   // Allocate a couple of local variables first.
   const Type& dynamic_type = Type::ZoneHandle(Type::DynamicType());
   const String& a = String::ZoneHandle(Symbols::New(thread, "a"));
-  LocalVariable* var_a =
-      new LocalVariable(TokenPosition::kNoSource,
-                        TokenPosition::kNoSource, a, dynamic_type);
-  LocalVariable* inner_var_a =
-      new LocalVariable(TokenPosition::kNoSource,
-                        TokenPosition::kNoSource, a, dynamic_type);
+  LocalVariable* var_a = new LocalVariable(
+      TokenPosition::kNoSource, TokenPosition::kNoSource, a, dynamic_type);
+  LocalVariable* inner_var_a = new LocalVariable(
+      TokenPosition::kNoSource, TokenPosition::kNoSource, a, dynamic_type);
   const String& b = String::ZoneHandle(Symbols::New(thread, "b"));
-  LocalVariable* var_b =
-      new LocalVariable(TokenPosition::kNoSource,
-                        TokenPosition::kNoSource, b, dynamic_type);
+  LocalVariable* var_b = new LocalVariable(
+      TokenPosition::kNoSource, TokenPosition::kNoSource, b, dynamic_type);
   const String& c = String::ZoneHandle(Symbols::New(thread, "c"));
-  LocalVariable* var_c =
-      new LocalVariable(TokenPosition::kNoSource,
-                        TokenPosition::kNoSource, c, dynamic_type);
+  LocalVariable* var_c = new LocalVariable(
+      TokenPosition::kNoSource, TokenPosition::kNoSource, c, dynamic_type);
   const String& L = String::ZoneHandle(Symbols::New(thread, "L"));
   SourceLabel* label_L =
       new SourceLabel(TokenPosition::kNoSource, L, SourceLabel::kFor);
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index bb9ada1..1c05a5c 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -48,11 +48,15 @@
 DECLARE_FLAG(bool, trace_service);
 DECLARE_FLAG(bool, trace_service_pause_events);
 DECLARE_FLAG(bool, profile_vm);
-DEFINE_FLAG(charp, vm_name, "vm",
+DEFINE_FLAG(charp,
+            vm_name,
+            "vm",
             "The default name of this vm as reported by the VM service "
             "protocol");
 
-DEFINE_FLAG(bool, warn_on_pause_with_no_debugger, false,
+DEFINE_FLAG(bool,
+            warn_on_pause_with_no_debugger,
+            false,
             "Print a message when an isolate is paused but there is no "
             "debugger attached.");
 
@@ -69,26 +73,21 @@
 }
 
 
-ServiceIdZone::ServiceIdZone() {
-}
+ServiceIdZone::ServiceIdZone() {}
 
 
-ServiceIdZone::~ServiceIdZone() {
-}
+ServiceIdZone::~ServiceIdZone() {}
 
 
 RingServiceIdZone::RingServiceIdZone()
-    : ring_(NULL),
-      policy_(ObjectIdRing::kAllocateId) {
-}
+    : ring_(NULL), policy_(ObjectIdRing::kAllocateId) {}
 
 
-RingServiceIdZone::~RingServiceIdZone() {
-}
+RingServiceIdZone::~RingServiceIdZone() {}
 
 
-void RingServiceIdZone::Init(
-    ObjectIdRing* ring, ObjectIdRing::IdPolicy policy) {
+void RingServiceIdZone::Init(ObjectIdRing* ring,
+                             ObjectIdRing::IdPolicy policy) {
   ring_ = ring;
   policy_ = policy;
 }
@@ -128,25 +127,19 @@
 StreamInfo Service::timeline_stream("Timeline");
 
 static StreamInfo* streams_[] = {
-  &Service::vm_stream,
-  &Service::isolate_stream,
-  &Service::debug_stream,
-  &Service::gc_stream,
-  &Service::echo_stream,
-  &Service::graph_stream,
-  &Service::logging_stream,
-  &Service::extension_stream,
-  &Service::timeline_stream,
+    &Service::vm_stream,       &Service::isolate_stream,
+    &Service::debug_stream,    &Service::gc_stream,
+    &Service::echo_stream,     &Service::graph_stream,
+    &Service::logging_stream,  &Service::extension_stream,
+    &Service::timeline_stream,
 };
 
 
 bool Service::ListenStream(const char* stream_id) {
   if (FLAG_trace_service) {
-    OS::Print("vm-service: starting stream '%s'\n",
-              stream_id);
+    OS::Print("vm-service: starting stream '%s'\n", stream_id);
   }
-  intptr_t num_streams = sizeof(streams_) /
-                         sizeof(streams_[0]);
+  intptr_t num_streams = sizeof(streams_) / sizeof(streams_[0]);
   for (intptr_t i = 0; i < num_streams; i++) {
     if (strcmp(stream_id, streams_[i]->id()) == 0) {
       streams_[i]->set_enabled(true);
@@ -164,11 +157,9 @@
 
 void Service::CancelStream(const char* stream_id) {
   if (FLAG_trace_service) {
-    OS::Print("vm-service: stopping stream '%s'\n",
-              stream_id);
+    OS::Print("vm-service: stopping stream '%s'\n", stream_id);
   }
-  intptr_t num_streams = sizeof(streams_) /
-                         sizeof(streams_[0]);
+  intptr_t num_streams = sizeof(streams_) / sizeof(streams_[0]);
   for (intptr_t i = 0; i < num_streams; i++) {
     if (strcmp(stream_id, streams_[i]->id()) == 0) {
       streams_[i]->set_enabled(false);
@@ -198,20 +189,18 @@
     return Object::null();
   }
   if (!object.IsTypedData()) {
-    const String& error_message =
-        String::Handle(
-            String::New("An implementation of Dart_GetVMServiceAssetsArchive "
-                        "should return a Uint8Array or null."));
+    const String& error_message = String::Handle(
+        String::New("An implementation of Dart_GetVMServiceAssetsArchive "
+                    "should return a Uint8Array or null."));
     const Error& error = Error::Handle(ApiError::New(error_message));
     Exceptions::PropagateError(error);
     return Object::null();
   }
   const TypedData& typed_data = TypedData::Cast(object);
   if (typed_data.ElementSizeInBytes() != 1) {
-    const String& error_message =
-        String::Handle(
-            String::New("An implementation of Dart_GetVMServiceAssetsArchive "
-                        "should return a Uint8Array or null."));
+    const String& error_message = String::Handle(
+        String::New("An implementation of Dart_GetVMServiceAssetsArchive "
+                    "should return a Uint8Array or null."));
     const Error& error = Error::Handle(ApiError::New(error_message));
     Exceptions::PropagateError(error);
     return Object::null();
@@ -229,26 +218,21 @@
 }
 
 
-static void PrintMissingParamError(JSONStream* js,
-                                   const char* param) {
-  js->PrintError(kInvalidParams,
-                 "%s expects the '%s' parameter", js->method(), param);
+static void PrintMissingParamError(JSONStream* js, const char* param) {
+  js->PrintError(kInvalidParams, "%s expects the '%s' parameter", js->method(),
+                 param);
 }
 
 
-static void PrintInvalidParamError(JSONStream* js,
-                                   const char* param) {
-  js->PrintError(kInvalidParams,
-                 "%s: invalid '%s' parameter: %s",
-                 js->method(), param, js->LookupParam(param));
+static void PrintInvalidParamError(JSONStream* js, const char* param) {
+  js->PrintError(kInvalidParams, "%s: invalid '%s' parameter: %s", js->method(),
+                 param, js->LookupParam(param));
 }
 
 
-static void PrintIllegalParamError(JSONStream* js,
-                                   const char* param) {
-  js->PrintError(kInvalidParams,
-                 "%s: illegal '%s' parameter: %s",
-                 js->method(), param, js->LookupParam(param));
+static void PrintIllegalParamError(JSONStream* js, const char* param) {
+  js->PrintError(kInvalidParams, "%s: illegal '%s' parameter: %s", js->method(),
+                 param, js->LookupParam(param));
 }
 
 
@@ -416,26 +400,17 @@
 class MethodParameter {
  public:
   MethodParameter(const char* name, bool required)
-      : name_(name), required_(required) {
-  }
+      : name_(name), required_(required) {}
 
-  virtual ~MethodParameter() { }
+  virtual ~MethodParameter() {}
 
-  virtual bool Validate(const char* value) const {
-    return true;
-  }
+  virtual bool Validate(const char* value) const { return true; }
 
-  virtual bool ValidateObject(const Object& value) const {
-    return true;
-  }
+  virtual bool ValidateObject(const Object& value) const { return true; }
 
-  const char* name() const {
-    return name_;
-  }
+  const char* name() const { return name_; }
 
-  bool required() const {
-    return required_;
-  }
+  bool required() const { return required_; }
 
   virtual void PrintError(const char* name,
                           const char* value,
@@ -458,8 +433,7 @@
 class DartStringParameter : public MethodParameter {
  public:
   DartStringParameter(const char* name, bool required)
-      : MethodParameter(name, required) {
-  }
+      : MethodParameter(name, required) {}
 
   virtual bool ValidateObject(const Object& value) const {
     return value.IsString();
@@ -470,8 +444,7 @@
 class DartListParameter : public MethodParameter {
  public:
   DartListParameter(const char* name, bool required)
-      : MethodParameter(name, required) {
-  }
+      : MethodParameter(name, required) {}
 
   virtual bool ValidateObject(const Object& value) const {
     return value.IsArray() || value.IsGrowableObjectArray();
@@ -481,13 +454,9 @@
 
 class NoSuchParameter : public MethodParameter {
  public:
-  explicit NoSuchParameter(const char* name)
-    : MethodParameter(name, false) {
-  }
+  explicit NoSuchParameter(const char* name) : MethodParameter(name, false) {}
 
-  virtual bool Validate(const char* value) const {
-    return (value == NULL);
-  }
+  virtual bool Validate(const char* value) const { return (value == NULL); }
 
   virtual bool ValidateObject(const Object& value) const {
     return value.IsNull();
@@ -498,8 +467,7 @@
 class BoolParameter : public MethodParameter {
  public:
   BoolParameter(const char* name, bool required)
-      : MethodParameter(name, required) {
-  }
+      : MethodParameter(name, required) {}
 
   virtual bool Validate(const char* value) const {
     if (value == NULL) {
@@ -520,8 +488,7 @@
 class UIntParameter : public MethodParameter {
  public:
   UIntParameter(const char* name, bool required)
-      : MethodParameter(name, required) {
-  }
+      : MethodParameter(name, required) {}
 
   virtual bool Validate(const char* value) const {
     if (value == NULL) {
@@ -550,8 +517,7 @@
 class Int64Parameter : public MethodParameter {
  public:
   Int64Parameter(const char* name, bool required)
-      : MethodParameter(name, required) {
-  }
+      : MethodParameter(name, required) {}
 
   virtual bool Validate(const char* value) const {
     if (value == NULL) {
@@ -580,20 +546,16 @@
 class IdParameter : public MethodParameter {
  public:
   IdParameter(const char* name, bool required)
-      : MethodParameter(name, required) {
-  }
+      : MethodParameter(name, required) {}
 
-  virtual bool Validate(const char* value) const {
-    return (value != NULL);
-  }
+  virtual bool Validate(const char* value) const { return (value != NULL); }
 };
 
 
 class RunnableIsolateParameter : public MethodParameter {
  public:
   explicit RunnableIsolateParameter(const char* name)
-      : MethodParameter(name, true) {
-  }
+      : MethodParameter(name, true) {}
 
   virtual bool Validate(const char* value) const {
     Isolate* isolate = Isolate::Current();
@@ -616,9 +578,7 @@
 class EnumParameter : public MethodParameter {
  public:
   EnumParameter(const char* name, bool required, const char* const* enums)
-      : MethodParameter(name, required),
-        enums_(enums) {
-  }
+      : MethodParameter(name, required), enums_(enums) {}
 
   virtual bool Validate(const char* value) const {
     if (value == NULL) {
@@ -639,7 +599,7 @@
 
 // If the key is not found, this function returns the last element in the
 // values array. This can be used to encode the default value.
-template<typename T>
+template <typename T>
 T EnumMapper(const char* value, const char* const* enums, T* values) {
   ASSERT(value != NULL);
   intptr_t i = 0;
@@ -656,9 +616,7 @@
 class EnumListParameter : public MethodParameter {
  public:
   EnumListParameter(const char* name, bool required, const char* const* enums)
-      : MethodParameter(name, required),
-        enums_(enums) {
-  }
+      : MethodParameter(name, required), enums_(enums) {}
 
   virtual bool Validate(const char* value) const {
     return ElementCount(value) >= 0;
@@ -695,8 +653,7 @@
  private:
   // For now observatory enums are ascii letters plus underscore.
   static bool IsEnumChar(char c) {
-    return (((c >= 'a') && (c <= 'z')) ||
-            ((c >= 'A') && (c <= 'Z')) ||
+    return (((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')) ||
             (c == '_'));
   }
 
@@ -777,13 +734,13 @@
 struct ServiceMethodDescriptor {
   const char* name;
   const ServiceMethodEntry entry;
-  const MethodParameter* const * parameters;
+  const MethodParameter* const* parameters;
 };
 
 
 // TODO(johnmccutchan): Do we reject unexpected parameters?
 static bool ValidateParameters(const MethodParameter* const* parameters,
-                              JSONStream* js) {
+                               JSONStream* js) {
   if (parameters == NULL) {
     return true;
   }
@@ -835,11 +792,10 @@
   StackZone zone(T);
   HANDLESCOPE(T);
   JSONStream js;
-  js.Setup(zone.GetZone(), SendPort::Cast(reply_port).Id(),
-           id, method_name, parameter_keys, parameter_values);
-  js.PrintError(kExtensionError,
-                "Error in extension `%s`: %s",
-                js.method(), error.ToErrorCString());
+  js.Setup(zone.GetZone(), SendPort::Cast(reply_port).Id(), id, method_name,
+           parameter_keys, parameter_values);
+  js.PrintError(kExtensionError, "Error in extension `%s`: %s", js.method(),
+                error.ToErrorCString());
   js.PostReply();
 }
 
@@ -880,12 +836,8 @@
     }
 
     JSONStream js;
-    js.Setup(zone.GetZone(), SendPort::Cast(reply_port).Id(),
-             seq,
-             method_name,
-             param_keys,
-             param_values,
-             parameters_are_dart_objects);
+    js.Setup(zone.GetZone(), SendPort::Cast(reply_port).Id(), seq, method_name,
+             param_keys, param_values, parameters_are_dart_objects);
 
     // RPC came in with a custom service id zone.
     const char* id_zone_param = js.LookupParam("_idZone");
@@ -938,15 +890,11 @@
       return;
     }
 
-    const Instance& extension_handler = Instance::Handle(Z,
-        I->LookupServiceExtensionHandler(method_name));
+    const Instance& extension_handler =
+        Instance::Handle(Z, I->LookupServiceExtensionHandler(method_name));
     if (!extension_handler.IsNull()) {
-      ScheduleExtensionHandler(extension_handler,
-                               method_name,
-                               param_keys,
-                               param_values,
-                               reply_port,
-                               seq);
+      ScheduleExtensionHandler(extension_handler, method_name, param_keys,
+                               param_values, reply_port, seq);
       // Schedule was successful. Extension code will post a reply
       // asynchronously.
       return;
@@ -995,9 +943,10 @@
   ASSERT(!ServiceIsolate::IsServiceIsolateDescendant(isolate));
 
   if (FLAG_trace_service) {
-    OS::Print("vm-service: Pushing ServiceEvent(isolate='%s', kind='%s',"
-              " len=%" Pd ") to stream %s\n",
-              isolate->name(), event_type, bytes_length, stream_id);
+    OS::Print(
+        "vm-service: Pushing ServiceEvent(isolate='%s', kind='%s',"
+        " len=%" Pd ") to stream %s\n",
+        isolate->name(), event_type, bytes_length, stream_id);
   }
 
   bool result;
@@ -1066,26 +1015,30 @@
 
 static void ReportPauseOnConsole(ServiceEvent* event) {
   const char* name = event->isolate()->debugger_name();
-  switch (event->kind())  {
+  switch (event->kind()) {
     case ServiceEvent::kPauseStart:
       OS::PrintErr(
           "vm-service: isolate '%s' has no debugger attached and is paused at "
-          "start.", name);
+          "start.",
+          name);
       break;
     case ServiceEvent::kPauseExit:
       OS::PrintErr(
           "vm-service: isolate '%s' has no debugger attached and is paused at "
-          "exit.", name);
+          "exit.",
+          name);
       break;
     case ServiceEvent::kPauseException:
       OS::PrintErr(
           "vm-service: isolate '%s' has no debugger attached and is paused due "
-          "to exception.", name);
+          "to exception.",
+          name);
       break;
     case ServiceEvent::kPauseInterrupted:
       OS::PrintErr(
           "vm-service: isolate '%s' has no debugger attached and is paused due "
-          "to interrupt.", name);
+          "to interrupt.",
+          name);
       break;
     case ServiceEvent::kPauseBreakpoint:
       OS::PrintErr(
@@ -1095,7 +1048,8 @@
     case ServiceEvent::kPausePostRequest:
       OS::PrintErr(
           "vm-service: isolate '%s' has no debugger attached and is paused "
-          "post reload.", name);
+          "post reload.",
+          name);
       break;
     default:
       UNREACHABLE();
@@ -1117,10 +1071,8 @@
 
 
 void Service::HandleEvent(ServiceEvent* event) {
-  if (event->stream_info() != NULL &&
-      !event->stream_info()->enabled()) {
-    if (FLAG_warn_on_pause_with_no_debugger &&
-        event->IsPause()) {
+  if (event->stream_info() != NULL && !event->stream_info()->enabled()) {
+    if (FLAG_warn_on_pause_with_no_debugger && event->IsPause()) {
       // If we are about to pause a running program which has no
       // debugger connected, tell the user about it.
       ReportPauseOnConsole(event);
@@ -1180,9 +1132,10 @@
     if (isolate != NULL) {
       isolate_name = isolate->name();
     }
-    OS::Print("vm-service: Pushing ServiceEvent(isolate='%s', kind='%s') "
-              "to stream %s\n",
-              isolate_name, kind, stream_id);
+    OS::Print(
+        "vm-service: Pushing ServiceEvent(isolate='%s', kind='%s') "
+        "to stream %s\n",
+        isolate_name, kind, stream_id);
   }
 
   Dart_PostCObject(ServiceIsolate::Port(), &list_cobj);
@@ -1191,17 +1144,13 @@
 
 class EmbedderServiceHandler {
  public:
-  explicit EmbedderServiceHandler(const char* name) : name_(NULL),
-                                                      callback_(NULL),
-                                                      user_data_(NULL),
-                                                      next_(NULL) {
+  explicit EmbedderServiceHandler(const char* name)
+      : name_(NULL), callback_(NULL), user_data_(NULL), next_(NULL) {
     ASSERT(name != NULL);
     name_ = strdup(name);
   }
 
-  ~EmbedderServiceHandler() {
-    free(name_);
-  }
+  ~EmbedderServiceHandler() { free(name_); }
 
   const char* name() const { return name_; }
 
@@ -1211,14 +1160,10 @@
   }
 
   void* user_data() const { return user_data_; }
-  void set_user_data(void* user_data) {
-    user_data_ = user_data;
-  }
+  void set_user_data(void* user_data) { user_data_ = user_data; }
 
   EmbedderServiceHandler* next() const { return next_; }
-  void set_next(EmbedderServiceHandler* next) {
-    next_ = next;
-  }
+  void set_next(EmbedderServiceHandler* next) { next_ = next; }
 
  private:
   char* name_;
@@ -1275,8 +1220,7 @@
 }
 
 
-EmbedderServiceHandler* Service::FindIsolateEmbedderHandler(
-    const char* name) {
+EmbedderServiceHandler* Service::FindIsolateEmbedderHandler(const char* name) {
   EmbedderServiceHandler* current = isolate_service_handler_head_;
   while (current != NULL) {
     if (strcmp(name, current->name()) == 0) {
@@ -1288,10 +1232,9 @@
 }
 
 
-void Service::RegisterRootEmbedderCallback(
-    const char* name,
-    Dart_ServiceRequestCallback callback,
-    void* user_data) {
+void Service::RegisterRootEmbedderCallback(const char* name,
+                                           Dart_ServiceRequestCallback callback,
+                                           void* user_data) {
   if (name == NULL) {
     return;
   }
@@ -1327,8 +1270,7 @@
 }
 
 
-EmbedderServiceHandler* Service::FindRootEmbedderHandler(
-    const char* name) {
+EmbedderServiceHandler* Service::FindRootEmbedderHandler(const char* name) {
   EmbedderServiceHandler* current = root_service_handler_head_;
   while (current != NULL) {
     if (strcmp(name, current->name()) == 0) {
@@ -1353,18 +1295,13 @@
   ASSERT(!reply_port.IsNull());
   Isolate* isolate = Isolate::Current();
   ASSERT(isolate != NULL);
-  isolate->AppendServiceExtensionCall(handler,
-                                      method_name,
-                                      parameter_keys,
-                                      parameter_values,
-                                      reply_port,
-                                      id);
+  isolate->AppendServiceExtensionCall(handler, method_name, parameter_keys,
+                                      parameter_values, reply_port, id);
 }
 
 
 static const MethodParameter* get_isolate_params[] = {
-  ISOLATE_PARAMETER,
-  NULL,
+    ISOLATE_PARAMETER, NULL,
 };
 
 
@@ -1375,9 +1312,7 @@
 
 
 static const MethodParameter* get_stack_params[] = {
-  RUNNABLE_ISOLATE_PARAMETER,
-  new BoolParameter("_full", false),
-  NULL,
+    RUNNABLE_ISOLATE_PARAMETER, new BoolParameter("_full", false), NULL,
 };
 
 
@@ -1447,9 +1382,8 @@
     }
   }
   uint8_t data[] = {0, 128, 255};
-  SendEventWithData(echo_stream.id(), "_Echo",
-                    js.buffer()->buf(), js.buffer()->length(),
-                    data, sizeof(data));
+  SendEventWithData(echo_stream.id(), "_Echo", js.buffer()->buf(),
+                    js.buffer()->length(), data, sizeof(data));
 }
 
 
@@ -1517,13 +1451,12 @@
   if (strncmp(arg, "int-", 4) == 0) {
     arg += 4;
     int64_t value = 0;
-    if (!OS::StringToInt64(arg, &value) ||
-        !Smi::IsValid(value)) {
+    if (!OS::StringToInt64(arg, &value) || !Smi::IsValid(value)) {
       *kind = ObjectIdRing::kInvalid;
       return Object::null();
     }
-    const Integer& obj = Integer::Handle(thread->zone(),
-        Smi::New(static_cast<intptr_t>(value)));
+    const Integer& obj =
+        Integer::Handle(thread->zone(), Smi::New(static_cast<intptr_t>(value)));
     return obj.raw();
   } else if (strcmp(arg, "bool-true") == 0) {
     return Bool::True().raw();
@@ -1545,7 +1478,8 @@
 
 
 static RawObject* LookupHeapObjectLibraries(Isolate* isolate,
-                                            char** parts, int num_parts) {
+                                            char** parts,
+                                            int num_parts) {
   // Library ids look like "libraries/35"
   if (num_parts < 2) {
     return Object::sentinel().raw();
@@ -1603,7 +1537,8 @@
 }
 
 static RawObject* LookupHeapObjectClasses(Thread* thread,
-                                          char** parts, int num_parts) {
+                                          char** parts,
+                                          int num_parts) {
   // Class ids look like: "classes/17"
   if (num_parts < 2) {
     return Object::sentinel().raw();
@@ -1612,8 +1547,7 @@
   Zone* zone = thread->zone();
   ClassTable* table = isolate->class_table();
   intptr_t id;
-  if (!GetIntegerId(parts[1], &id) ||
-      !table->IsValidIndex(id)) {
+  if (!GetIntegerId(parts[1], &id) || !table->IsValidIndex(id)) {
     return Object::sentinel().raw();
   }
   Class& cls = Class::Handle(zone, table->At(id));
@@ -1726,7 +1660,8 @@
 
 
 static RawObject* LookupHeapObjectTypeArguments(Thread* thread,
-                                                char** parts, int num_parts) {
+                                                char** parts,
+                                                int num_parts) {
   Isolate* isolate = thread->isolate();
   // TypeArguments ids look like: "typearguments/17"
   if (num_parts < 2) {
@@ -1737,8 +1672,8 @@
     return Object::sentinel().raw();
   }
   ObjectStore* object_store = isolate->object_store();
-  const Array& table = Array::Handle(thread->zone(),
-                                     object_store->canonical_type_arguments());
+  const Array& table =
+      Array::Handle(thread->zone(), object_store->canonical_type_arguments());
   ASSERT(table.Length() > 0);
   const intptr_t table_size = table.Length() - 1;
   if ((id < 0) || (id >= table_size) || (table.At(id) == Object::null())) {
@@ -1749,7 +1684,8 @@
 
 
 static RawObject* LookupHeapObjectCode(Isolate* isolate,
-                                       char** parts, int num_parts) {
+                                       char** parts,
+                                       int num_parts) {
   if (num_parts != 2) {
     return Object::sentinel().raw();
   }
@@ -1797,7 +1733,8 @@
 
 
 static RawObject* LookupHeapObjectMessage(Thread* thread,
-                                          char** parts, int num_parts) {
+                                          char** parts,
+                                          int num_parts) {
   if (num_parts != 2) {
     return Object::sentinel().raw();
   }
@@ -1812,9 +1749,7 @@
     return Object::sentinel().raw();
   }
   if (message->len() > 0) {
-    MessageSnapshotReader reader(message->data(),
-                                 message->len(),
-                                 thread);
+    MessageSnapshotReader reader(message->data(), message->len(), thread);
     return reader.ReadObject();
   } else {
     return message->raw_obj();
@@ -1966,8 +1901,8 @@
 
       jselement.AddProperty("source", source);
       if (source.IsArray()) {
-        intptr_t element_index = slot_offset.Value() -
-            (Array::element_offset(0) >> kWordSizeLog2);
+        intptr_t element_index =
+            slot_offset.Value() - (Array::element_offset(0) >> kWordSizeLog2);
         jselement.AddProperty("parentListIndex", element_index);
       } else if (source.IsInstance()) {
         source_class ^= source.clazz();
@@ -1996,8 +1931,7 @@
 
 
 static const MethodParameter* get_inbound_references_params[] = {
-  RUNNABLE_ISOLATE_PARAMETER,
-  NULL,
+    RUNNABLE_ISOLATE_PARAMETER, NULL,
 };
 
 
@@ -2067,14 +2001,14 @@
       slot_offset ^= path.At((i * 2) - 1);
       jselement.AddProperty("offset", slot_offset.Value());
       if (element.IsArray() || element.IsGrowableObjectArray()) {
-        intptr_t element_index = slot_offset.Value() -
-            (Array::element_offset(0) >> kWordSizeLog2);
+        intptr_t element_index =
+            slot_offset.Value() - (Array::element_offset(0) >> kWordSizeLog2);
         jselement.AddProperty("parentListIndex", element_index);
       } else if (element.IsLinkedHashMap()) {
         map = static_cast<RawLinkedHashMap*>(path.At(i * 2));
         map_data = map.data();
-        intptr_t element_index = slot_offset.Value() -
-            (Array::element_offset(0) >> kWordSizeLog2);
+        intptr_t element_index =
+            slot_offset.Value() - (Array::element_offset(0) >> kWordSizeLog2);
         LinkedHashMap::Iterator iterator(map);
         while (iterator.MoveNext()) {
           if (iterator.CurrentKey() == map_data.At(element_index) ||
@@ -2111,8 +2045,7 @@
 
 
 static const MethodParameter* get_retaining_path_params[] = {
-  RUNNABLE_ISOLATE_PARAMETER,
-  NULL,
+    RUNNABLE_ISOLATE_PARAMETER, NULL,
 };
 
 
@@ -2154,9 +2087,7 @@
 
 
 static const MethodParameter* get_retained_size_params[] = {
-  RUNNABLE_ISOLATE_PARAMETER,
-  new IdParameter("targetId", true),
-  NULL,
+    RUNNABLE_ISOLATE_PARAMETER, new IdParameter("targetId", true), NULL,
 };
 
 
@@ -2164,8 +2095,8 @@
   const char* target_id = js->LookupParam("targetId");
   ASSERT(target_id != NULL);
   ObjectIdRing::LookupResult lookup_result;
-  Object& obj = Object::Handle(LookupHeapObject(thread, target_id,
-                                                &lookup_result));
+  Object& obj =
+      Object::Handle(LookupHeapObject(thread, target_id, &lookup_result));
   if (obj.raw() == Object::sentinel().raw()) {
     if (lookup_result == ObjectIdRing::kCollected) {
       PrintSentinel(js, kCollectedSentinel);
@@ -2196,9 +2127,7 @@
 
 
 static const MethodParameter* get_reachable_size_params[] = {
-  RUNNABLE_ISOLATE_PARAMETER,
-  new IdParameter("targetId", true),
-  NULL,
+    RUNNABLE_ISOLATE_PARAMETER, new IdParameter("targetId", true), NULL,
 };
 
 
@@ -2206,8 +2135,8 @@
   const char* target_id = js->LookupParam("targetId");
   ASSERT(target_id != NULL);
   ObjectIdRing::LookupResult lookup_result;
-  Object& obj = Object::Handle(LookupHeapObject(thread, target_id,
-                                                &lookup_result));
+  Object& obj =
+      Object::Handle(LookupHeapObject(thread, target_id, &lookup_result));
   if (obj.raw() == Object::sentinel().raw()) {
     if (lookup_result == ObjectIdRing::kCollected) {
       PrintSentinel(js, kCollectedSentinel);
@@ -2238,8 +2167,7 @@
 
 
 static const MethodParameter* evaluate_params[] = {
-  RUNNABLE_ISOLATE_PARAMETER,
-  NULL,
+    RUNNABLE_ISOLATE_PARAMETER, NULL,
 };
 
 
@@ -2262,8 +2190,8 @@
   Zone* zone = thread->zone();
   const String& expr_str = String::Handle(zone, String::New(expr));
   ObjectIdRing::LookupResult lookup_result;
-  Object& obj = Object::Handle(zone, LookupHeapObject(thread, target_id,
-                                                      &lookup_result));
+  Object& obj =
+      Object::Handle(zone, LookupHeapObject(thread, target_id, &lookup_result));
   if (obj.raw() == Object::sentinel().raw()) {
     if (lookup_result == ObjectIdRing::kCollected) {
       PrintSentinel(js, kCollectedSentinel);
@@ -2276,44 +2204,42 @@
   }
   if (obj.IsLibrary()) {
     const Library& lib = Library::Cast(obj);
-    const Object& result = Object::Handle(zone,
+    const Object& result = Object::Handle(
+        zone,
         lib.Evaluate(expr_str, Array::empty_array(), Array::empty_array()));
     result.PrintJSON(js, true);
     return true;
   }
   if (obj.IsClass()) {
     const Class& cls = Class::Cast(obj);
-    const Object& result = Object::Handle(zone,
+    const Object& result = Object::Handle(
+        zone,
         cls.Evaluate(expr_str, Array::empty_array(), Array::empty_array()));
     result.PrintJSON(js, true);
     return true;
   }
-  if ((obj.IsInstance() || obj.IsNull()) &&
-      !ContainsNonInstance(obj)) {
+  if ((obj.IsInstance() || obj.IsNull()) && !ContainsNonInstance(obj)) {
     // We don't use Instance::Cast here because it doesn't allow null.
     Instance& instance = Instance::Handle(zone);
     instance ^= obj.raw();
     const Class& receiver_cls = Class::Handle(zone, instance.clazz());
-    const Object& result =
-        Object::Handle(zone, instance.Evaluate(receiver_cls,
-                                               expr_str,
-                                               Array::empty_array(),
-                                               Array::empty_array()));
+    const Object& result = Object::Handle(
+        zone, instance.Evaluate(receiver_cls, expr_str, Array::empty_array(),
+                                Array::empty_array()));
     result.PrintJSON(js, true);
     return true;
   }
   js->PrintError(kInvalidParams,
                  "%s: invalid 'targetId' parameter: "
-                 "Cannot evaluate against a VM-internal object", js->method());
+                 "Cannot evaluate against a VM-internal object",
+                 js->method());
   return true;
 }
 
 
 static const MethodParameter* evaluate_in_frame_params[] = {
-  RUNNABLE_ISOLATE_PARAMETER,
-  new UIntParameter("frameIndex", true),
-  new MethodParameter("expression", true),
-  NULL,
+    RUNNABLE_ISOLATE_PARAMETER, new UIntParameter("frameIndex", true),
+    new MethodParameter("expression", true), NULL,
 };
 
 
@@ -2375,8 +2301,7 @@
 
 
 static const MethodParameter* get_instances_params[] = {
-  RUNNABLE_ISOLATE_PARAMETER,
-  NULL,
+    RUNNABLE_ISOLATE_PARAMETER, NULL,
 };
 
 
@@ -2396,10 +2321,8 @@
     PrintInvalidParamError(js, "limit");
     return true;
   }
-  const Object& obj =
-      Object::Handle(LookupHeapObject(thread, target_id, NULL));
-  if (obj.raw() == Object::sentinel().raw() ||
-      !obj.IsClass()) {
+  const Object& obj = Object::Handle(LookupHeapObject(thread, target_id, NULL));
+  if (obj.raw() == Object::sentinel().raw() || !obj.IsClass()) {
     PrintInvalidParamError(js, "classId");
     return true;
   }
@@ -2432,28 +2355,29 @@
 
 
 static const char* const report_enum_names[] = {
-  SourceReport::kCallSitesStr,
-  SourceReport::kCoverageStr,
-  SourceReport::kPossibleBreakpointsStr,
-  SourceReport::kProfileStr,
-  NULL,
+    SourceReport::kCallSitesStr,
+    SourceReport::kCoverageStr,
+    SourceReport::kPossibleBreakpointsStr,
+    SourceReport::kProfileStr,
+    NULL,
 };
 
 
 static const MethodParameter* get_source_report_params[] = {
-  RUNNABLE_ISOLATE_PARAMETER,
-  new EnumListParameter("reports", true, report_enum_names),
-  new IdParameter("scriptId", false),
-  new UIntParameter("tokenPos", false),
-  new UIntParameter("endTokenPos", false),
-  new BoolParameter("forceCompile", false),
-  NULL,
+    RUNNABLE_ISOLATE_PARAMETER,
+    new EnumListParameter("reports", true, report_enum_names),
+    new IdParameter("scriptId", false),
+    new UIntParameter("tokenPos", false),
+    new UIntParameter("endTokenPos", false),
+    new BoolParameter("forceCompile", false),
+    NULL,
 };
 
 
 static bool GetSourceReport(Thread* thread, JSONStream* js) {
   if (!thread->isolate()->compilation_allowed()) {
-    js->PrintError(kFeatureDisabled,
+    js->PrintError(
+        kFeatureDisabled,
         "Cannot get source report when running a precompiled program.");
     return true;
   }
@@ -2511,19 +2435,15 @@
     }
   }
   SourceReport report(report_set, compile_mode);
-  report.PrintJSON(js,
-                   script,
-                   TokenPosition(start_pos),
+  report.PrintJSON(js, script, TokenPosition(start_pos),
                    TokenPosition(end_pos));
   return true;
 }
 
 
 static const MethodParameter* reload_sources_params[] = {
-  RUNNABLE_ISOLATE_PARAMETER,
-  new BoolParameter("force", false),
-  new BoolParameter("pause", false),
-  NULL,
+    RUNNABLE_ISOLATE_PARAMETER, new BoolParameter("force", false),
+    new BoolParameter("pause", false), NULL,
 };
 
 
@@ -2531,12 +2451,12 @@
   Isolate* isolate = thread->isolate();
   if (!isolate->compilation_allowed()) {
     js->PrintError(kFeatureDisabled,
-        "Cannot reload source when running a precompiled program.");
+                   "Cannot reload source when running a precompiled program.");
     return true;
   }
   if (Dart::snapshot_kind() == Snapshot::kAppWithJIT) {
     js->PrintError(kFeatureDisabled,
-        "Cannot reload source when running an app snapshot.");
+                   "Cannot reload source when running an app snapshot.");
     return true;
   }
   Dart_LibraryTagHandler handler = isolate->library_tag_handler();
@@ -2553,8 +2473,7 @@
     return true;
   }
   if (isolate->IsReloading()) {
-    js->PrintError(kIsolateIsReloading,
-                   "This isolate is being reloaded.");
+    js->PrintError(kIsolateIsReloading, "This isolate is being reloaded.");
     return true;
   }
   if (!isolate->CanReload()) {
@@ -2595,7 +2514,8 @@
                                 JSONStream* js,
                                 const String& script_uri) {
   if (!thread->isolate()->compilation_allowed()) {
-    js->PrintError(kFeatureDisabled,
+    js->PrintError(
+        kFeatureDisabled,
         "Cannot use breakpoints when running a precompiled program.");
     return true;
   }
@@ -2613,12 +2533,12 @@
   }
   ASSERT(!script_uri.IsNull());
   Breakpoint* bpt = NULL;
-  bpt = thread->isolate()->debugger()->
-      SetBreakpointAtLineCol(script_uri, line, col);
+  bpt = thread->isolate()->debugger()->SetBreakpointAtLineCol(script_uri, line,
+                                                              col);
   if (bpt == NULL) {
     js->PrintError(kCannotAddBreakpoint,
-                   "%s: Cannot add breakpoint at line '%s'",
-                   js->method(), line_param);
+                   "%s: Cannot add breakpoint at line '%s'", js->method(),
+                   line_param);
     return true;
   }
   bpt->PrintJSON(js);
@@ -2627,17 +2547,18 @@
 
 
 static const MethodParameter* add_breakpoint_params[] = {
-  RUNNABLE_ISOLATE_PARAMETER,
-  new IdParameter("scriptId", true),
-  new UIntParameter("line", true),
-  new UIntParameter("column", false),
-  NULL,
+    RUNNABLE_ISOLATE_PARAMETER,
+    new IdParameter("scriptId", true),
+    new UIntParameter("line", true),
+    new UIntParameter("column", false),
+    NULL,
 };
 
 
 static bool AddBreakpoint(Thread* thread, JSONStream* js) {
   if (!thread->isolate()->compilation_allowed()) {
-    js->PrintError(kFeatureDisabled,
+    js->PrintError(
+        kFeatureDisabled,
         "Cannot use breakpoints when running a precompiled program.");
     return true;
   }
@@ -2655,17 +2576,18 @@
 
 
 static const MethodParameter* add_breakpoint_with_script_uri_params[] = {
-  RUNNABLE_ISOLATE_PARAMETER,
-  new IdParameter("scriptUri", true),
-  new UIntParameter("line", true),
-  new UIntParameter("column", false),
-  NULL,
+    RUNNABLE_ISOLATE_PARAMETER,
+    new IdParameter("scriptUri", true),
+    new UIntParameter("line", true),
+    new UIntParameter("column", false),
+    NULL,
 };
 
 
 static bool AddBreakpointWithScriptUri(Thread* thread, JSONStream* js) {
   if (!thread->isolate()->compilation_allowed()) {
-    js->PrintError(kFeatureDisabled,
+    js->PrintError(
+        kFeatureDisabled,
         "Cannot use breakpoints when running a precompiled program.");
     return true;
   }
@@ -2676,15 +2598,14 @@
 
 
 static const MethodParameter* add_breakpoint_at_entry_params[] = {
-  RUNNABLE_ISOLATE_PARAMETER,
-  new IdParameter("functionId", true),
-  NULL,
+    RUNNABLE_ISOLATE_PARAMETER, new IdParameter("functionId", true), NULL,
 };
 
 
 static bool AddBreakpointAtEntry(Thread* thread, JSONStream* js) {
   if (!thread->isolate()->compilation_allowed()) {
-    js->PrintError(kFeatureDisabled,
+    js->PrintError(
+        kFeatureDisabled,
         "Cannot use breakpoints when running a precompiled program.");
     return true;
   }
@@ -2699,8 +2620,8 @@
       thread->isolate()->debugger()->SetBreakpointAtEntry(function, false);
   if (bpt == NULL) {
     js->PrintError(kCannotAddBreakpoint,
-                   "%s: Cannot add breakpoint at function '%s'",
-                   js->method(), function.ToCString());
+                   "%s: Cannot add breakpoint at function '%s'", js->method(),
+                   function.ToCString());
     return true;
   }
   bpt->PrintJSON(js);
@@ -2709,15 +2630,14 @@
 
 
 static const MethodParameter* add_breakpoint_at_activation_params[] = {
-  RUNNABLE_ISOLATE_PARAMETER,
-  new IdParameter("objectId", true),
-  NULL,
+    RUNNABLE_ISOLATE_PARAMETER, new IdParameter("objectId", true), NULL,
 };
 
 
 static bool AddBreakpointAtActivation(Thread* thread, JSONStream* js) {
   if (!thread->isolate()->compilation_allowed()) {
-    js->PrintError(kFeatureDisabled,
+    js->PrintError(
+        kFeatureDisabled,
         "Cannot use breakpoints when running a precompiled program.");
     return true;
   }
@@ -2732,8 +2652,7 @@
       thread->isolate()->debugger()->SetBreakpointAtActivation(closure, false);
   if (bpt == NULL) {
     js->PrintError(kCannotAddBreakpoint,
-                   "%s: Cannot add breakpoint at activation",
-                   js->method());
+                   "%s: Cannot add breakpoint at activation", js->method());
     return true;
   }
   bpt->PrintJSON(js);
@@ -2742,14 +2661,14 @@
 
 
 static const MethodParameter* remove_breakpoint_params[] = {
-  RUNNABLE_ISOLATE_PARAMETER,
-  NULL,
+    RUNNABLE_ISOLATE_PARAMETER, NULL,
 };
 
 
 static bool RemoveBreakpoint(Thread* thread, JSONStream* js) {
   if (!thread->isolate()->compilation_allowed()) {
-    js->PrintError(kFeatureDisabled,
+    js->PrintError(
+        kFeatureDisabled,
         "Cannot use breakpoints when running a precompiled program.");
     return true;
   }
@@ -2775,11 +2694,9 @@
 
 static RawClass* GetMetricsClass(Thread* thread) {
   Zone* zone = thread->zone();
-  const Library& prof_lib =
-      Library::Handle(zone, Library::DeveloperLibrary());
+  const Library& prof_lib = Library::Handle(zone, Library::DeveloperLibrary());
   ASSERT(!prof_lib.IsNull());
-  const String& metrics_cls_name =
-      String::Handle(zone, String::New("Metrics"));
+  const String& metrics_cls_name = String::Handle(zone, String::New("Metrics"));
   ASSERT(!metrics_cls_name.IsNull());
   const Class& metrics_cls =
       Class::Handle(zone, prof_lib.LookupClass(metrics_cls_name));
@@ -2788,7 +2705,6 @@
 }
 
 
-
 static bool HandleNativeMetricsList(Thread* thread, JSONStream* js) {
   JSONObject obj(js);
   obj.AddProperty("type", "MetricList");
@@ -2822,14 +2738,12 @@
 
 static bool HandleDartMetricsList(Thread* thread, JSONStream* js) {
   Zone* zone = thread->zone();
-  const Class& metrics_cls =
-      Class::Handle(zone, GetMetricsClass(thread));
+  const Class& metrics_cls = Class::Handle(zone, GetMetricsClass(thread));
   const String& print_metrics_name =
       String::Handle(String::New("_printMetrics"));
   ASSERT(!print_metrics_name.IsNull());
   const Function& print_metrics = Function::Handle(
-      zone,
-      metrics_cls.LookupStaticFunctionAllowPrivate(print_metrics_name));
+      zone, metrics_cls.LookupStaticFunctionAllowPrivate(print_metrics_name));
   ASSERT(!print_metrics.IsNull());
   const Array& args = Object::empty_array();
   const Object& result =
@@ -2844,14 +2758,11 @@
 
 static bool HandleDartMetric(Thread* thread, JSONStream* js, const char* id) {
   Zone* zone = thread->zone();
-  const Class& metrics_cls =
-      Class::Handle(zone, GetMetricsClass(thread));
-  const String& print_metric_name =
-      String::Handle(String::New("_printMetric"));
+  const Class& metrics_cls = Class::Handle(zone, GetMetricsClass(thread));
+  const String& print_metric_name = String::Handle(String::New("_printMetric"));
   ASSERT(!print_metric_name.IsNull());
   const Function& print_metric = Function::Handle(
-      zone,
-      metrics_cls.LookupStaticFunctionAllowPrivate(print_metric_name));
+      zone, metrics_cls.LookupStaticFunctionAllowPrivate(print_metric_name));
   ASSERT(!print_metric.IsNull());
   const String& arg0 = String::Handle(String::New(id));
   ASSERT(!arg0.IsNull());
@@ -2872,8 +2783,7 @@
 
 
 static const MethodParameter* get_isolate_metric_list_params[] = {
-  RUNNABLE_ISOLATE_PARAMETER,
-  NULL,
+    RUNNABLE_ISOLATE_PARAMETER, NULL,
 };
 
 
@@ -2900,8 +2810,7 @@
 
 
 static const MethodParameter* get_isolate_metric_params[] = {
-  RUNNABLE_ISOLATE_PARAMETER,
-  NULL,
+    RUNNABLE_ISOLATE_PARAMETER, NULL,
 };
 
 
@@ -2933,8 +2842,7 @@
 
 
 static const MethodParameter* get_vm_metric_list_params[] = {
-  NO_ISOLATE_PARAMETER,
-  NULL,
+    NO_ISOLATE_PARAMETER, NULL,
 };
 
 
@@ -2944,8 +2852,7 @@
 
 
 static const MethodParameter* get_vm_metric_params[] = {
-  NO_ISOLATE_PARAMETER,
-  NULL,
+    NO_ISOLATE_PARAMETER, NULL,
 };
 
 
@@ -2958,20 +2865,17 @@
 }
 
 static const char* const timeline_streams_enum_names[] = {
-  "all",
-#define DEFINE_NAME(name, unused)                                              \
-  #name,
-TIMELINE_STREAM_LIST(DEFINE_NAME)
+    "all",
+#define DEFINE_NAME(name, unused) #name,
+    TIMELINE_STREAM_LIST(DEFINE_NAME)
 #undef DEFINE_NAME
-  NULL
-};
+        NULL};
 
 static const MethodParameter* set_vm_timeline_flags_params[] = {
-  NO_ISOLATE_PARAMETER,
-  new EnumListParameter("recordedStreams",
-                        false,
-                        timeline_streams_enum_names),
-  NULL,
+    NO_ISOLATE_PARAMETER, new EnumListParameter("recordedStreams",
+                                                false,
+                                                timeline_streams_enum_names),
+    NULL,
 };
 
 
@@ -3005,7 +2909,7 @@
 
 #define SET_ENABLE_STREAM(name, unused)                                        \
   Timeline::SetStream##name##Enabled(HasStream(recorded_streams, #name));
-TIMELINE_STREAM_LIST(SET_ENABLE_STREAM);
+  TIMELINE_STREAM_LIST(SET_ENABLE_STREAM);
 #undef SET_ENABLE_STREAM
 
   PrintSuccess(js);
@@ -3015,8 +2919,7 @@
 
 
 static const MethodParameter* get_vm_timeline_flags_params[] = {
-  NO_ISOLATE_PARAMETER,
-  NULL,
+    NO_ISOLATE_PARAMETER, NULL,
 };
 
 
@@ -3035,8 +2938,7 @@
 
 
 static const MethodParameter* clear_vm_timeline_params[] = {
-  NO_ISOLATE_PARAMETER,
-  NULL,
+    NO_ISOLATE_PARAMETER, NULL,
 };
 
 
@@ -3054,10 +2956,8 @@
 
 
 static const MethodParameter* get_vm_timeline_params[] = {
-  NO_ISOLATE_PARAMETER,
-  new Int64Parameter("timeOriginMicros", false),
-  new Int64Parameter("timeExtentMicros", false),
-  NULL,
+    NO_ISOLATE_PARAMETER, new Int64Parameter("timeOriginMicros", false),
+    new Int64Parameter("timeExtentMicros", false), NULL,
 };
 
 
@@ -3080,8 +2980,7 @@
 
 
 static const MethodParameter* resume_params[] = {
-  RUNNABLE_ISOLATE_PARAMETER,
-  NULL,
+    RUNNABLE_ISOLATE_PARAMETER, NULL,
 };
 
 
@@ -3150,8 +3049,7 @@
 
 
 static const MethodParameter* pause_params[] = {
-  RUNNABLE_ISOLATE_PARAMETER,
-  NULL,
+    RUNNABLE_ISOLATE_PARAMETER, NULL,
 };
 
 
@@ -3169,8 +3067,7 @@
 
 
 static const MethodParameter* get_tag_profile_params[] = {
-  RUNNABLE_ISOLATE_PARAMETER,
-  NULL,
+    RUNNABLE_ISOLATE_PARAMETER, NULL,
 };
 
 
@@ -3183,32 +3080,24 @@
 
 
 static const char* const tags_enum_names[] = {
-  "None",
-  "UserVM",
-  "UserOnly",
-  "VMUser",
-  "VMOnly",
-  NULL,
+    "None", "UserVM", "UserOnly", "VMUser", "VMOnly", NULL,
 };
 
 
 static const Profile::TagOrder tags_enum_values[] = {
-  Profile::kNoTags,
-  Profile::kUserVM,
-  Profile::kUser,
-  Profile::kVMUser,
-  Profile::kVM,
-  Profile::kNoTags,  // Default value.
+    Profile::kNoTags, Profile::kUserVM, Profile::kUser,
+    Profile::kVMUser, Profile::kVM,
+    Profile::kNoTags,  // Default value.
 };
 
 
 static const MethodParameter* get_cpu_profile_params[] = {
-  RUNNABLE_ISOLATE_PARAMETER,
-  new EnumParameter("tags", true, tags_enum_names),
-  new BoolParameter("_codeTransitionTags", false),
-  new Int64Parameter("timeOriginMicros", false),
-  new Int64Parameter("timeExtentMicros", false),
-  NULL,
+    RUNNABLE_ISOLATE_PARAMETER,
+    new EnumParameter("tags", true, tags_enum_names),
+    new BoolParameter("_codeTransitionTags", false),
+    new Int64Parameter("timeOriginMicros", false),
+    new Int64Parameter("timeExtentMicros", false),
+    NULL,
 };
 
 
@@ -3224,21 +3113,18 @@
       Int64Parameter::Parse(js->LookupParam("timeOriginMicros"));
   int64_t time_extent_micros =
       Int64Parameter::Parse(js->LookupParam("timeExtentMicros"));
-  ProfilerService::PrintJSON(js,
-                             tag_order,
-                             extra_tags,
-                             time_origin_micros,
+  ProfilerService::PrintJSON(js, tag_order, extra_tags, time_origin_micros,
                              time_extent_micros);
   return true;
 }
 
 
 static const MethodParameter* get_cpu_profile_timeline_params[] = {
-  RUNNABLE_ISOLATE_PARAMETER,
-  new EnumParameter("tags", true, tags_enum_names),
-  new Int64Parameter("timeOriginMicros", false),
-  new Int64Parameter("timeExtentMicros", false),
-  NULL,
+    RUNNABLE_ISOLATE_PARAMETER,
+    new EnumParameter("tags", true, tags_enum_names),
+    new Int64Parameter("timeOriginMicros", false),
+    new Int64Parameter("timeExtentMicros", false),
+    NULL,
 };
 
 
@@ -3249,21 +3135,19 @@
       UIntParameter::Parse(js->LookupParam("timeOriginMicros"));
   int64_t time_extent_micros =
       UIntParameter::Parse(js->LookupParam("timeExtentMicros"));
-  ProfilerService::PrintTimelineJSON(js,
-                                     tag_order,
-                                     time_origin_micros,
+  ProfilerService::PrintTimelineJSON(js, tag_order, time_origin_micros,
                                      time_extent_micros);
   return true;
 }
 
 
 static const MethodParameter* get_allocation_samples_params[] = {
-  RUNNABLE_ISOLATE_PARAMETER,
-  new EnumParameter("tags", true, tags_enum_names),
-  new IdParameter("classId", false),
-  new Int64Parameter("timeOriginMicros", false),
-  new Int64Parameter("timeExtentMicros", false),
-  NULL,
+    RUNNABLE_ISOLATE_PARAMETER,
+    new EnumParameter("tags", true, tags_enum_names),
+    new IdParameter("classId", false),
+    new Int64Parameter("timeOriginMicros", false),
+    new Int64Parameter("timeExtentMicros", false),
+    NULL,
 };
 
 
@@ -3280,10 +3164,7 @@
   Isolate* isolate = thread->isolate();
   if (IsValidClassId(isolate, cid)) {
     const Class& cls = Class::Handle(GetClassForId(isolate, cid));
-    ProfilerService::PrintAllocationJSON(js,
-                                         tag_order,
-                                         cls,
-                                         time_origin_micros,
+    ProfilerService::PrintAllocationJSON(js, tag_order, cls, time_origin_micros,
                                          time_extent_micros);
   } else {
     PrintInvalidParamError(js, "classId");
@@ -3293,8 +3174,7 @@
 
 
 static const MethodParameter* clear_cpu_profile_params[] = {
-  RUNNABLE_ISOLATE_PARAMETER,
-  NULL,
+    RUNNABLE_ISOLATE_PARAMETER, NULL,
 };
 
 
@@ -3306,8 +3186,7 @@
 
 
 static const MethodParameter* get_allocation_profile_params[] = {
-  RUNNABLE_ISOLATE_PARAMETER,
-  NULL,
+    RUNNABLE_ISOLATE_PARAMETER, NULL,
 };
 
 
@@ -3345,8 +3224,7 @@
 
 
 static const MethodParameter* get_heap_map_params[] = {
-  RUNNABLE_ISOLATE_PARAMETER,
-  NULL,
+    RUNNABLE_ISOLATE_PARAMETER, NULL,
 };
 
 
@@ -3358,9 +3236,8 @@
 
 
 static const MethodParameter* request_heap_snapshot_params[] = {
-  RUNNABLE_ISOLATE_PARAMETER,
-  new BoolParameter("collectGarbage", false /* not required */),
-  NULL,
+    RUNNABLE_ISOLATE_PARAMETER,
+    new BoolParameter("collectGarbage", false /* not required */), NULL,
 };
 
 
@@ -3413,12 +3290,11 @@
 
     uint8_t* chunk_start = buffer + (i * kChunkSize);
     intptr_t chunk_size = (i + 1 == num_chunks)
-        ? stream.bytes_written() - (i * kChunkSize)
-        : kChunkSize;
+                              ? stream.bytes_written() - (i * kChunkSize)
+                              : kChunkSize;
 
-    SendEventWithData(graph_stream.id(), "_Graph",
-                      js.buffer()->buf(), js.buffer()->length(),
-                      chunk_start, chunk_size);
+    SendEventWithData(graph_stream.id(), "_Graph", js.buffer()->buf(),
+                      js.buffer()->length(), chunk_start, chunk_size);
   }
 }
 
@@ -3493,8 +3369,8 @@
 
 class ContainsAddressVisitor : public FindObjectVisitor {
  public:
-  explicit ContainsAddressVisitor(uword addr) : addr_(addr) { }
-  virtual ~ContainsAddressVisitor() { }
+  explicit ContainsAddressVisitor(uword addr) : addr_(addr) {}
+  virtual ~ContainsAddressVisitor() {}
 
   virtual uword filter_addr() const { return addr_; }
 
@@ -3506,14 +3382,14 @@
     uword obj_end = obj_begin + obj->Size();
     return obj_begin <= addr_ && addr_ < obj_end;
   }
+
  private:
   uword addr_;
 };
 
 
 static const MethodParameter* get_object_by_address_params[] = {
-  RUNNABLE_ISOLATE_PARAMETER,
-  NULL,
+    RUNNABLE_ISOLATE_PARAMETER, NULL,
 };
 
 
@@ -3555,8 +3431,8 @@
     return true;
   }
   bool ref = js->HasParam("ref") && js->ParamIs("ref", "true");
-  const Object& obj = Object::Handle(thread->zone(),
-      GetObjectHelper(thread, addr));
+  const Object& obj =
+      Object::Handle(thread->zone(), GetObjectHelper(thread, addr));
   if (obj.IsNull()) {
     PrintSentinel(js, kFreeSentinel);
   } else {
@@ -3567,17 +3443,15 @@
 
 
 static const MethodParameter* get_persistent_handles_params[] = {
-  ISOLATE_PARAMETER,
-  NULL,
+    ISOLATE_PARAMETER, NULL,
 };
 
 
-template<typename T>
+template <typename T>
 class PersistentHandleVisitor : public HandleVisitor {
  public:
   PersistentHandleVisitor(Thread* thread, JSONArray* handles)
-      : HandleVisitor(thread),
-        handles_(handles) {
+      : HandleVisitor(thread), handles_(handles) {
     ASSERT(handles_ != NULL);
   }
 
@@ -3595,28 +3469,21 @@
 
     JSONObject obj(handles_);
     obj.AddProperty("type", "_WeakPersistentHandle");
-    const Object& object =
-        Object::Handle(weak_persistent_handle->raw());
+    const Object& object = Object::Handle(weak_persistent_handle->raw());
     obj.AddProperty("object", object);
+    obj.AddPropertyF("peer", "0x%" Px "", reinterpret_cast<uintptr_t>(
+                                              weak_persistent_handle->peer()));
     obj.AddPropertyF(
-        "peer",
-        "0x%" Px "",
-        reinterpret_cast<uintptr_t>(weak_persistent_handle->peer()));
-    obj.AddPropertyF(
-        "callbackAddress",
-        "0x%" Px "",
+        "callbackAddress", "0x%" Px "",
         reinterpret_cast<uintptr_t>(weak_persistent_handle->callback()));
     // Attempt to include a native symbol name.
     char* name = NativeSymbolResolver::LookupSymbolName(
-        reinterpret_cast<uintptr_t>(weak_persistent_handle->callback()),
-        NULL);
-    obj.AddProperty("callbackSymbolName",
-                    (name == NULL) ? "" : name);
+        reinterpret_cast<uintptr_t>(weak_persistent_handle->callback()), NULL);
+    obj.AddProperty("callbackSymbolName", (name == NULL) ? "" : name);
     if (name != NULL) {
       NativeSymbolResolver::FreeSymbolName(name);
     }
-    obj.AddPropertyF("externalSize",
-                     "%" Pd "",
+    obj.AddPropertyF("externalSize", "%" Pd "",
                      weak_persistent_handle->external_size());
   }
 
@@ -3644,8 +3511,8 @@
     {
       JSONArray persistent_handles(&obj, "persistentHandles");
       PersistentHandles& handles = api_state->persistent_handles();
-      PersistentHandleVisitor<PersistentHandle> visitor(
-          thread, &persistent_handles);
+      PersistentHandleVisitor<PersistentHandle> visitor(thread,
+                                                        &persistent_handles);
       handles.Visit(&visitor);
     }
     // Weak persistent handles.
@@ -3664,8 +3531,7 @@
 
 
 static const MethodParameter* get_ports_params[] = {
-  RUNNABLE_ISOLATE_PARAMETER,
-  NULL,
+    RUNNABLE_ISOLATE_PARAMETER, NULL,
 };
 
 
@@ -3697,10 +3563,8 @@
 
 
 static const MethodParameter* get_object_params[] = {
-  RUNNABLE_ISOLATE_PARAMETER,
-  new UIntParameter("offset", false),
-  new UIntParameter("count", false),
-  NULL,
+    RUNNABLE_ISOLATE_PARAMETER, new UIntParameter("offset", false),
+    new UIntParameter("count", false), NULL,
 };
 
 
@@ -3759,8 +3623,7 @@
 
 
 static const MethodParameter* get_object_store_params[] = {
-  RUNNABLE_ISOLATE_PARAMETER,
-  NULL,
+    RUNNABLE_ISOLATE_PARAMETER, NULL,
 };
 
 
@@ -3772,8 +3635,7 @@
 
 
 static const MethodParameter* get_class_list_params[] = {
-  RUNNABLE_ISOLATE_PARAMETER,
-  NULL,
+    RUNNABLE_ISOLATE_PARAMETER, NULL,
 };
 
 
@@ -3786,8 +3648,7 @@
 
 
 static const MethodParameter* get_type_arguments_list_params[] = {
-  RUNNABLE_ISOLATE_PARAMETER,
-  NULL,
+    RUNNABLE_ISOLATE_PARAMETER, NULL,
 };
 
 
@@ -3802,8 +3663,8 @@
       zone, object_store->canonical_type_arguments());
   const intptr_t table_size = typeargs_table.NumEntries();
   const intptr_t table_used = typeargs_table.NumOccupied();
-  const Array& typeargs_array = Array::Handle(
-      zone, HashTables::ToArray(typeargs_table, false));
+  const Array& typeargs_array =
+      Array::Handle(zone, HashTables::ToArray(typeargs_table, false));
   ASSERT(typeargs_array.Length() == table_used);
   TypeArguments& typeargs = TypeArguments::Handle(zone);
   JSONObject jsobj(js);
@@ -3825,8 +3686,7 @@
 
 
 static const MethodParameter* get_version_params[] = {
-  NO_ISOLATE_PARAMETER,
-  NULL,
+    NO_ISOLATE_PARAMETER, NULL,
 };
 
 
@@ -3845,9 +3705,7 @@
 
 class ServiceIsolateVisitor : public IsolateVisitor {
  public:
-  explicit ServiceIsolateVisitor(JSONArray* jsarr)
-      : jsarr_(jsarr) {
-  }
+  explicit ServiceIsolateVisitor(JSONArray* jsarr) : jsarr_(jsarr) {}
 
   virtual ~ServiceIsolateVisitor() {}
 
@@ -3864,8 +3722,7 @@
 
 
 static const MethodParameter* get_vm_params[] = {
-  NO_ISOLATE_PARAMETER,
-  NULL,
+    NO_ISOLATE_PARAMETER, NULL,
 };
 
 
@@ -3884,8 +3741,8 @@
   jsobj.AddProperty("_profilerMode", FLAG_profile_vm ? "VM" : "Dart");
   jsobj.AddProperty64("pid", OS::ProcessId());
   jsobj.AddProperty64("_maxRSS", OS::MaxRSS());
-  int64_t start_time_millis = (vm_isolate->start_time() /
-                               kMicrosecondsPerMillisecond);
+  int64_t start_time_millis =
+      (vm_isolate->start_time() / kMicrosecondsPerMillisecond);
   jsobj.AddPropertyTimeMillis("startTime", start_time_millis);
   // Construct the isolate list.
   {
@@ -3903,8 +3760,7 @@
 
 
 static const MethodParameter* restart_vm_params[] = {
-  NO_ISOLATE_PARAMETER,
-  NULL,
+    NO_ISOLATE_PARAMETER, NULL,
 };
 
 
@@ -3916,25 +3772,19 @@
 
 
 static const char* exception_pause_mode_names[] = {
-  "All",
-  "None",
-  "Unhandled",
-  NULL,
+    "All", "None", "Unhandled", NULL,
 };
 
 
 static Dart_ExceptionPauseInfo exception_pause_mode_values[] = {
-  kPauseOnAllExceptions,
-  kNoPauseOnExceptions,
-  kPauseOnUnhandledExceptions,
-  kInvalidExceptionPauseInfo,
+    kPauseOnAllExceptions, kNoPauseOnExceptions, kPauseOnUnhandledExceptions,
+    kInvalidExceptionPauseInfo,
 };
 
 
 static const MethodParameter* set_exception_pause_mode_params[] = {
-  ISOLATE_PARAMETER,
-  new EnumParameter("mode", true, exception_pause_mode_names),
-  NULL,
+    ISOLATE_PARAMETER,
+    new EnumParameter("mode", true, exception_pause_mode_names), NULL,
 };
 
 
@@ -3962,8 +3812,7 @@
 
 
 static const MethodParameter* get_flag_list_params[] = {
-  NO_ISOLATE_PARAMETER,
-  NULL,
+    NO_ISOLATE_PARAMETER, NULL,
 };
 
 
@@ -3974,8 +3823,7 @@
 
 
 static const MethodParameter* set_flags_params[] = {
-  NO_ISOLATE_PARAMETER,
-  NULL,
+    NO_ISOLATE_PARAMETER, NULL,
 };
 
 
@@ -4004,18 +3852,16 @@
 
 
 static const MethodParameter* set_library_debuggable_params[] = {
-  RUNNABLE_ISOLATE_PARAMETER,
-  new IdParameter("libraryId", true),
-  new BoolParameter("isDebuggable", true),
-  NULL,
+    RUNNABLE_ISOLATE_PARAMETER, new IdParameter("libraryId", true),
+    new BoolParameter("isDebuggable", true), NULL,
 };
 
 
 static bool SetLibraryDebuggable(Thread* thread, JSONStream* js) {
   const char* lib_id = js->LookupParam("libraryId");
   ObjectIdRing::LookupResult lookup_result;
-  Object& obj = Object::Handle(LookupHeapObject(thread, lib_id,
-                                                &lookup_result));
+  Object& obj =
+      Object::Handle(LookupHeapObject(thread, lib_id, &lookup_result));
   const bool is_debuggable =
       BoolParameter::Parse(js->LookupParam("isDebuggable"), false);
   if (obj.IsLibrary()) {
@@ -4037,9 +3883,7 @@
 
 
 static const MethodParameter* set_name_params[] = {
-  ISOLATE_PARAMETER,
-  new MethodParameter("name", true),
-  NULL,
+    ISOLATE_PARAMETER, new MethodParameter("name", true), NULL,
 };
 
 
@@ -4056,9 +3900,7 @@
 
 
 static const MethodParameter* set_vm_name_params[] = {
-  NO_ISOLATE_PARAMETER,
-  new MethodParameter("name", true),
-  NULL,
+    NO_ISOLATE_PARAMETER, new MethodParameter("name", true), NULL,
 };
 
 
@@ -4076,16 +3918,15 @@
 
 
 static const MethodParameter* set_trace_class_allocation_params[] = {
-  RUNNABLE_ISOLATE_PARAMETER,
-  new IdParameter("classId", true),
-  new BoolParameter("enable", true),
-  NULL,
+    RUNNABLE_ISOLATE_PARAMETER, new IdParameter("classId", true),
+    new BoolParameter("enable", true), NULL,
 };
 
 
 static bool SetTraceClassAllocation(Thread* thread, JSONStream* js) {
   if (!thread->isolate()->compilation_allowed()) {
-    js->PrintError(kFeatureDisabled,
+    js->PrintError(
+        kFeatureDisabled,
         "Cannot trace allocation when running a precompiled program.");
     return true;
   }
@@ -4106,6 +3947,7 @@
 }
 
 
+// clang-format off
 static const ServiceMethodDescriptor service_methods_[] = {
   { "_dumpIdZone", DumpIdZone, NULL },
   { "_echo", Echo,
@@ -4221,11 +4063,10 @@
   { "_setVMTimelineFlags", SetVMTimelineFlags,
     set_vm_timeline_flags_params },
 };
-
+// clang-format on
 
 const ServiceMethodDescriptor* FindMethod(const char* method_name) {
-  intptr_t num_methods = sizeof(service_methods_) /
-                         sizeof(service_methods_[0]);
+  intptr_t num_methods = sizeof(service_methods_) / sizeof(service_methods_[0]);
   for (intptr_t i = 0; i < num_methods; i++) {
     const ServiceMethodDescriptor& method = service_methods_[i];
     if (strcmp(method_name, method.name) == 0) {
diff --git a/runtime/vm/service.h b/runtime/vm/service.h
index 830d2ee..a47fdbe 100644
--- a/runtime/vm/service.h
+++ b/runtime/vm/service.h
@@ -51,13 +51,9 @@
   // Returned string will be zone allocated.
   virtual char* GetServiceId(const Object& obj);
 
-  void set_policy(ObjectIdRing::IdPolicy policy) {
-    policy_ = policy;
-  }
+  void set_policy(ObjectIdRing::IdPolicy policy) { policy_ = policy; }
 
-  ObjectIdRing::IdPolicy policy() const {
-    return policy_;
-  }
+  ObjectIdRing::IdPolicy policy() const { return policy_; }
 
  private:
   ObjectIdRing* ring_;
@@ -99,10 +95,9 @@
       Dart_ServiceRequestCallback callback,
       void* user_data);
 
-  static void RegisterRootEmbedderCallback(
-      const char* name,
-      Dart_ServiceRequestCallback callback,
-      void* user_data);
+  static void RegisterRootEmbedderCallback(const char* name,
+                                           Dart_ServiceRequestCallback callback,
+                                           void* user_data);
 
   static void SetEmbedderStreamCallbacks(
       Dart_ServiceStreamListenCallback listen_callback,
diff --git a/runtime/vm/service_event.h b/runtime/vm/service_event.h
index ff90328..d0db082 100644
--- a/runtime/vm/service_event.h
+++ b/runtime/vm/service_event.h
@@ -22,7 +22,7 @@
 class ServiceEvent {
  public:
   enum EventKind {
-    kVMUpdate,           // VM identity information has changed
+    kVMUpdate,  // VM identity information has changed
 
     kIsolateStart,           // New isolate has started
     kIsolateRunnable,        // Isolate is ready to run
@@ -32,13 +32,13 @@
     kIsolateSpawn,           // Result of an isolate spawn request
     kServiceExtensionAdded,  // A service extension was registered
 
-    kPauseStart,         // --pause-isolates-on-start
-    kPauseExit,          // --pause-isolates-on-exit
+    kPauseStart,  // --pause-isolates-on-start
+    kPauseExit,   // --pause-isolates-on-exit
     kPauseBreakpoint,
     kPauseInterrupted,
     kPauseException,
-    kPausePostRequest,    // isolate is paused after a service request.
-    kNone,                // isolate has not been made runnable yet.
+    kPausePostRequest,  // isolate is paused after a service request.
+    kNone,              // isolate has not been made runnable yet.
     kResume,
     kBreakpointAdded,
     kBreakpointResolved,
@@ -80,14 +80,12 @@
   Isolate* isolate() const { return isolate_; }
 
   // Used by the C embedding api.
-  Dart_Port isolate_id() const {
-    return isolate_->main_port();
-  }
+  Dart_Port isolate_id() const { return isolate_->main_port(); }
 
   EventKind kind() const { return kind_; }
 
   bool IsPause() const {
-    switch (kind())  {
+    switch (kind()) {
       case kPauseStart:
       case kPauseExit:
       case kPauseBreakpoint:
@@ -115,39 +113,27 @@
     embedder_stream_id_ = stream_id;
   }
 
-  Breakpoint* breakpoint() const {
-    return breakpoint_;
-  }
+  Breakpoint* breakpoint() const { return breakpoint_; }
   void set_breakpoint(Breakpoint* bpt) {
-    ASSERT(kind() == kPauseBreakpoint ||
-           kind() == kBreakpointAdded ||
-           kind() == kBreakpointResolved ||
-           kind() == kBreakpointRemoved);
+    ASSERT(kind() == kPauseBreakpoint || kind() == kBreakpointAdded ||
+           kind() == kBreakpointResolved || kind() == kBreakpointRemoved);
     breakpoint_ = bpt;
   }
 
-  ActivationFrame* top_frame() const {
-    return top_frame_;
-  }
+  ActivationFrame* top_frame() const { return top_frame_; }
   void set_top_frame(ActivationFrame* frame) {
-    ASSERT(kind() == kPauseBreakpoint ||
-           kind() == kPauseInterrupted ||
-           kind() == kPauseException ||
-           kind() == kPausePostRequest ||
+    ASSERT(kind() == kPauseBreakpoint || kind() == kPauseInterrupted ||
+           kind() == kPauseException || kind() == kPausePostRequest ||
            kind() == kResume);
     top_frame_ = frame;
   }
 
-  const String* extension_rpc() const {
-    return extension_rpc_;
-  }
+  const String* extension_rpc() const { return extension_rpc_; }
   void set_extension_rpc(const String* extension_rpc) {
     extension_rpc_ = extension_rpc;
   }
 
-  const Object* exception() const {
-    return exception_;
-  }
+  const Object* exception() const { return exception_; }
   void set_exception(const Object* exception) {
     ASSERT(kind_ == kPauseException);
     exception_ = exception;
@@ -180,45 +166,29 @@
     spawn_error_ = error;
   }
 
-  bool at_async_jump() const {
-    return at_async_jump_;
-  }
-  void set_at_async_jump(bool value) {
-    at_async_jump_ = value;
-  }
+  bool at_async_jump() const { return at_async_jump_; }
+  void set_at_async_jump(bool value) { at_async_jump_ = value; }
 
-  const Object* inspectee() const {
-    return inspectee_;
-  }
+  const Object* inspectee() const { return inspectee_; }
   void set_inspectee(const Object* inspectee) {
     ASSERT(kind_ == kInspect);
     inspectee_ = inspectee;
   }
 
-  const Heap::GCStats* gc_stats() const {
-    return gc_stats_;
-  }
+  const Heap::GCStats* gc_stats() const { return gc_stats_; }
 
-  void set_gc_stats(const Heap::GCStats* gc_stats) {
-    gc_stats_ = gc_stats;
-  }
+  void set_gc_stats(const Heap::GCStats* gc_stats) { gc_stats_ = gc_stats; }
 
-  const uint8_t* bytes() const {
-    return bytes_;
-  }
+  const uint8_t* bytes() const { return bytes_; }
 
-  intptr_t bytes_length() const {
-    return bytes_length_;
-  }
+  intptr_t bytes_length() const { return bytes_length_; }
 
   void set_bytes(const uint8_t* bytes, intptr_t bytes_length) {
     bytes_ = bytes;
     bytes_length_ = bytes_length;
   }
 
-  void set_log_record(const LogRecord& log_record) {
-    log_record_ = log_record;
-  }
+  void set_log_record(const LogRecord& log_record) { log_record_ = log_record; }
 
   void set_extension_event(const ExtensionEvent& extension_event) {
     extension_event_ = extension_event;
@@ -226,9 +196,7 @@
 
   void UpdateTimestamp();
 
-  int64_t timestamp() const {
-    return timestamp_;
-  }
+  int64_t timestamp() const { return timestamp_; }
 
   const TimelineEventBlock* timeline_event_block() const {
     return timeline_event_block_;
diff --git a/runtime/vm/service_isolate.cc b/runtime/vm/service_isolate.cc
index 5a3b1d4..75342b5 100644
--- a/runtime/vm/service_isolate.cc
+++ b/runtime/vm/service_isolate.cc
@@ -27,9 +27,13 @@
 
 
 DEFINE_FLAG(bool, trace_service, false, "Trace VM service requests.");
-DEFINE_FLAG(bool, trace_service_pause_events, false,
+DEFINE_FLAG(bool,
+            trace_service_pause_events,
+            false,
             "Trace VM service isolate pause events.");
-DEFINE_FLAG(bool, trace_service_verbose, false,
+DEFINE_FLAG(bool,
+            trace_service_verbose,
+            false,
             "Provide extra service tracing information.");
 
 static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) {
@@ -46,7 +50,8 @@
 #define VM_SERVICE_WEB_SERVER_CONTROL_MESSAGE_ID 3
 #define VM_SERVICE_SERVER_INFO_MESSAGE_ID 4
 
-static RawArray* MakeServiceControlMessage(Dart_Port port_id, intptr_t code,
+static RawArray* MakeServiceControlMessage(Dart_Port port_id,
+                                           intptr_t code,
                                            const String& name) {
   const Array& list = Array::Handle(Array::New(4));
   ASSERT(!list.IsNull());
@@ -97,11 +102,8 @@
 char* ServiceIsolate::server_address_ = NULL;
 
 void ServiceIsolate::RequestServerInfo(const SendPort& sp) {
-  const Array& message =
-      Array::Handle(
-          MakeServerControlMessage(sp,
-                                   VM_SERVICE_SERVER_INFO_MESSAGE_ID,
-                                   false /* ignored */));
+  const Array& message = Array::Handle(MakeServerControlMessage(
+      sp, VM_SERVICE_SERVER_INFO_MESSAGE_ID, false /* ignored */));
   ASSERT(!message.IsNull());
   uint8_t* data = NULL;
   MessageWriter writer(&data, &allocator, false);
@@ -112,11 +114,8 @@
 
 
 void ServiceIsolate::ControlWebServer(const SendPort& sp, bool enable) {
-  const Array& message =
-      Array::Handle(
-          MakeServerControlMessage(sp,
-                                   VM_SERVICE_WEB_SERVER_CONTROL_MESSAGE_ID,
-                                   enable));
+  const Array& message = Array::Handle(MakeServerControlMessage(
+      sp, VM_SERVICE_WEB_SERVER_CONTROL_MESSAGE_ID, enable));
   ASSERT(!message.IsNull());
   uint8_t* data = NULL;
   MessageWriter writer(&data, &allocator, false);
@@ -204,10 +203,8 @@
   HANDLESCOPE(thread);
   const String& name = String::Handle(String::New(isolate->name()));
   ASSERT(!name.IsNull());
-  const Array& list = Array::Handle(
-      MakeServiceControlMessage(Dart_GetMainPortId(),
-                                VM_SERVICE_ISOLATE_STARTUP_MESSAGE_ID,
-                                name));
+  const Array& list = Array::Handle(MakeServiceControlMessage(
+      Dart_GetMainPortId(), VM_SERVICE_ISOLATE_STARTUP_MESSAGE_ID, name));
   ASSERT(!list.IsNull());
   uint8_t* data = NULL;
   MessageWriter writer(&data, &allocator, false);
@@ -215,8 +212,7 @@
   intptr_t len = writer.BytesWritten();
   if (FLAG_trace_service) {
     OS::Print("vm-service: Isolate %s %" Pd64 " registered.\n",
-              name.ToCString(),
-              Dart_GetMainPortId());
+              name.ToCString(), Dart_GetMainPortId());
   }
   return PortMap::PostMessage(
       new Message(port_, data, len, Message::kNormalPriority));
@@ -236,10 +232,8 @@
   HANDLESCOPE(thread);
   const String& name = String::Handle(String::New(isolate->name()));
   ASSERT(!name.IsNull());
-  const Array& list = Array::Handle(
-      MakeServiceControlMessage(Dart_GetMainPortId(),
-                                VM_SERVICE_ISOLATE_SHUTDOWN_MESSAGE_ID,
-                                name));
+  const Array& list = Array::Handle(MakeServiceControlMessage(
+      Dart_GetMainPortId(), VM_SERVICE_ISOLATE_SHUTDOWN_MESSAGE_ID, name));
   ASSERT(!list.IsNull());
   uint8_t* data = NULL;
   MessageWriter writer(&data, &allocator, false);
@@ -247,8 +241,7 @@
   intptr_t len = writer.BytesWritten();
   if (FLAG_trace_service) {
     OS::Print("vm-service: Isolate %s %" Pd64 " deregistered.\n",
-              name.ToCString(),
-              Dart_GetMainPortId());
+              name.ToCString(), Dart_GetMainPortId());
   }
   return PortMap::PostMessage(
       new Message(port_, data, len, Message::kNormalPriority));
@@ -265,9 +258,7 @@
   if (FLAG_trace_service) {
     OS::Print("vm-service: sending service exit message.\n");
   }
-  PortMap::PostMessage(new Message(port_,
-                                   exit_message_,
-                                   exit_message_length_,
+  PortMap::PostMessage(new Message(port_, exit_message_, exit_message_length_,
                                    Message::kNormalPriority));
 }
 
@@ -349,8 +340,7 @@
   virtual void Run() {
     ASSERT(Isolate::Current() == NULL);
 #ifndef PRODUCT
-    TimelineDurationScope tds(Timeline::GetVMStream(),
-                              "ServiceIsolateStartup");
+    TimelineDurationScope tds(Timeline::GetVMStream(), "ServiceIsolateStartup");
 #endif  // !PRODUCT
     char* error = NULL;
     Isolate* isolate = NULL;
@@ -367,14 +357,8 @@
     Dart_IsolateFlags api_flags;
     Isolate::FlagsInitialize(&api_flags);
 
-    isolate =
-        reinterpret_cast<Isolate*>(create_callback(ServiceIsolate::kName,
-                                                   NULL,
-                                                   NULL,
-                                                   NULL,
-                                                   &api_flags,
-                                                   NULL,
-                                                   &error));
+    isolate = reinterpret_cast<Isolate*>(create_callback(
+        ServiceIsolate::kName, NULL, NULL, NULL, &api_flags, NULL, &error));
     if (isolate == NULL) {
       if (FLAG_trace_service) {
         OS::PrintErr("vm-service: Isolate creation error: %s\n", error);
@@ -400,9 +384,7 @@
 
     ServiceIsolate::FinishedInitializing();
 
-    isolate->message_handler()->Run(Dart::thread_pool(),
-                                    NULL,
-                                    ShutdownIsolate,
+    isolate->message_handler()->Run(Dart::thread_pool(), NULL, ShutdownIsolate,
                                     reinterpret_cast<uword>(isolate));
   }
 
@@ -450,8 +432,8 @@
     StackZone zone(T);
     HANDLESCOPE(T);
     // Invoke main which will return the loadScriptPort.
-    const Library& root_library = Library::Handle(Z,
-        I->object_store()->root_library());
+    const Library& root_library =
+        Library::Handle(Z, I->object_store()->root_library());
     if (root_library.IsNull()) {
       if (FLAG_trace_service) {
         OS::Print("vm-service: Embedder did not install a script.");
@@ -462,8 +444,8 @@
     ASSERT(!root_library.IsNull());
     const String& entry_name = String::Handle(Z, String::New("main"));
     ASSERT(!entry_name.IsNull());
-    const Function& entry = Function::Handle(Z,
-        root_library.LookupFunctionAllowPrivate(entry_name));
+    const Function& entry = Function::Handle(
+        Z, root_library.LookupFunctionAllowPrivate(entry_name));
     if (entry.IsNull()) {
       // Service isolate is not supported by embedder.
       if (FLAG_trace_service) {
@@ -472,8 +454,8 @@
       return false;
     }
     ASSERT(!entry.IsNull());
-    const Object& result = Object::Handle(Z,
-        DartEntry::InvokeFunction(entry, Object::empty_array()));
+    const Object& result = Object::Handle(
+        Z, DartEntry::InvokeFunction(entry, Object::empty_array()));
     ASSERT(!result.IsNull());
     if (result.IsError()) {
       // Service isolate did not initialize properly.
@@ -556,13 +538,11 @@
       Library::Handle(Library::LookupLibrary(thread, Symbols::DartVMService()));
   ASSERT(!vmservice_library.IsNull());
   const String& boot_function_name = String::Handle(String::New("boot"));
-  const Function& boot_function =
-      Function::Handle(
-          vmservice_library.LookupFunctionAllowPrivate(boot_function_name));
+  const Function& boot_function = Function::Handle(
+      vmservice_library.LookupFunctionAllowPrivate(boot_function_name));
   ASSERT(!boot_function.IsNull());
-  const Object& result =
-      Object::Handle(
-          DartEntry::InvokeFunction(boot_function, Object::empty_array()));
+  const Object& result = Object::Handle(
+      DartEntry::InvokeFunction(boot_function, Object::empty_array()));
   ASSERT(!result.IsNull());
   Dart_Port port = ILLEGAL_PORT;
   if (result.IsReceivePort()) {
@@ -573,7 +553,6 @@
 }
 
 
-void ServiceIsolate::VisitObjectPointers(ObjectPointerVisitor* visitor) {
-}
+void ServiceIsolate::VisitObjectPointers(ObjectPointerVisitor* visitor) {}
 
 }  // namespace dart
diff --git a/runtime/vm/service_isolate.h b/runtime/vm/service_isolate.h
index fdcb26c..9060301 100644
--- a/runtime/vm/service_isolate.h
+++ b/runtime/vm/service_isolate.h
@@ -43,9 +43,7 @@
   static void SetServerAddress(const char* address);
 
   // Returns the server's web address or NULL if none is running.
-  static const char* server_address() {
-    return server_address_;
-  }
+  static const char* server_address() { return server_address_; }
 
   static void VisitObjectPointers(ObjectPointerVisitor* visitor);
 
diff --git a/runtime/vm/service_test.cc b/runtime/vm/service_test.cc
index 378b65b..0bbed74 100644
--- a/runtime/vm/service_test.cc
+++ b/runtime/vm/service_test.cc
@@ -28,9 +28,7 @@
  public:
   ServiceTestMessageHandler() : _msg(NULL) {}
 
-  ~ServiceTestMessageHandler() {
-    free(_msg);
-  }
+  ~ServiceTestMessageHandler() { free(_msg); }
 
   MessageStatus HandleMessage(Message* message) {
     if (_msg != NULL) {
@@ -112,8 +110,8 @@
 
 
 static RawFunction* GetFunction(const Class& cls, const char* name) {
-  const Function& result = Function::Handle(cls.LookupDynamicFunction(
-      String::Handle(String::New(name))));
+  const Function& result = Function::Handle(
+      cls.LookupDynamicFunction(String::Handle(String::New(name))));
   EXPECT(!result.IsNull());
   return result.raw();
 }
@@ -140,8 +138,7 @@
 
 
 TEST_CASE(Service_IsolateStickyError) {
-  const char* kScript =
-      "main() => throw 'HI THERE STICKY';\n";
+  const char* kScript = "main() => throw 'HI THERE STICKY';\n";
 
   Isolate* isolate = thread->isolate();
   isolate->set_is_runnable(true);
@@ -276,10 +273,10 @@
 
   // The following test checks that a code object can be found only
   // at compile_timestamp()-code.EntryPoint().
-  service_msg = EvalF(lib, "[0, port, '0', 'getObject', "
-                      "['objectId'], ['code/%" Px64"-%" Px "']]",
-                      compile_timestamp,
-                      entry);
+  service_msg = EvalF(lib,
+                      "[0, port, '0', 'getObject', "
+                      "['objectId'], ['code/%" Px64 "-%" Px "']]",
+                      compile_timestamp, entry);
   HandleIsolateMessage(isolate, service_msg);
   EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage());
   EXPECT_SUBSTRING("\"type\":\"Code\"", handler.msg());
@@ -287,20 +284,19 @@
     // Only perform a partial match.
     const intptr_t kBufferSize = 512;
     char buffer[kBufferSize];
-    OS::SNPrint(buffer, kBufferSize-1,
+    OS::SNPrint(buffer, kBufferSize - 1,
                 "\"fixedId\":true,\"id\":\"code\\/%" Px64 "-%" Px "\",",
-                compile_timestamp,
-                entry);
+                compile_timestamp, entry);
     EXPECT_SUBSTRING(buffer, handler.msg());
   }
 
   // Request code object at compile_timestamp-code.EntryPoint() + 16
   // Expect this to fail because the address is not the entry point.
   uintptr_t address = entry + 16;
-  service_msg = EvalF(lib, "[0, port, '0', 'getObject', "
-                      "['objectId'], ['code/%" Px64"-%" Px "']]",
-                      compile_timestamp,
-                      address);
+  service_msg = EvalF(lib,
+                      "[0, port, '0', 'getObject', "
+                      "['objectId'], ['code/%" Px64 "-%" Px "']]",
+                      compile_timestamp, address);
   HandleIsolateMessage(isolate, service_msg);
   EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage());
   EXPECT_SUBSTRING("\"error\"", handler.msg());
@@ -308,27 +304,28 @@
   // Request code object at (compile_timestamp - 1)-code.EntryPoint()
   // Expect this to fail because the timestamp is wrong.
   address = entry;
-  service_msg = EvalF(lib, "[0, port, '0', 'getObject', "
-                      "['objectId'], ['code/%" Px64"-%" Px "']]",
-                      compile_timestamp - 1,
-                      address);
+  service_msg = EvalF(lib,
+                      "[0, port, '0', 'getObject', "
+                      "['objectId'], ['code/%" Px64 "-%" Px "']]",
+                      compile_timestamp - 1, address);
   HandleIsolateMessage(isolate, service_msg);
   EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage());
   EXPECT_SUBSTRING("\"error\"", handler.msg());
 
   // Request native code at address. Expect the null code object back.
   address = last;
-  service_msg = EvalF(lib, "[0, port, '0', 'getObject', "
+  service_msg = EvalF(lib,
+                      "[0, port, '0', 'getObject', "
                       "['objectId'], ['code/native-%" Px "']]",
                       address);
   HandleIsolateMessage(isolate, service_msg);
   EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage());
   // TODO(turnidge): It is pretty broken to return an Instance here.  Fix.
-  EXPECT_SUBSTRING("\"kind\":\"Null\"",
-                   handler.msg());
+  EXPECT_SUBSTRING("\"kind\":\"Null\"", handler.msg());
 
   // Request malformed native code.
-  service_msg = EvalF(lib, "[0, port, '0', 'getObject', ['objectId'], "
+  service_msg = EvalF(lib,
+                      "[0, port, '0', 'getObject', ['objectId'], "
                       "['code/native%" Px "']]",
                       address);
   HandleIsolateMessage(isolate, service_msg);
@@ -372,8 +369,10 @@
   Array& service_msg = Array::Handle();
 
   // Fetch object.
-  service_msg = EvalF(lib, "[0, port, '0', 'getObject', "
-                      "['objectId'], ['objects/%" Pd "']]", id);
+  service_msg = EvalF(lib,
+                      "[0, port, '0', 'getObject', "
+                      "['objectId'], ['objects/%" Pd "']]",
+                      id);
   HandleIsolateMessage(isolate, service_msg);
   EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage());
 
@@ -387,21 +386,21 @@
 
 TEST_CASE(Service_PcDescriptors) {
   const char* kScript =
-    "var port;\n"  // Set to our mock port by C++.
-    "\n"
-    "class A {\n"
-    "  var a;\n"
-    "  dynamic b() {}\n"
-    "  dynamic c() {\n"
-    "    var d = () { b(); };\n"
-    "    return d;\n"
-    "  }\n"
-    "}\n"
-    "main() {\n"
-    "  var z = new A();\n"
-    "  var x = z.c();\n"
-    "  x();\n"
-    "}";
+      "var port;\n"  // Set to our mock port by C++.
+      "\n"
+      "class A {\n"
+      "  var a;\n"
+      "  dynamic b() {}\n"
+      "  dynamic c() {\n"
+      "    var d = () { b(); };\n"
+      "    return d;\n"
+      "  }\n"
+      "}\n"
+      "main() {\n"
+      "  var z = new A();\n"
+      "  var x = z.c();\n"
+      "  x();\n"
+      "}";
 
   Isolate* isolate = thread->isolate();
   isolate->set_is_runnable(true);
@@ -435,8 +434,10 @@
   Array& service_msg = Array::Handle();
 
   // Fetch object.
-  service_msg = EvalF(lib, "[0, port, '0', 'getObject', "
-                      "['objectId'], ['objects/%" Pd "']]", id);
+  service_msg = EvalF(lib,
+                      "[0, port, '0', 'getObject', "
+                      "['objectId'], ['objects/%" Pd "']]",
+                      id);
   HandleIsolateMessage(isolate, service_msg);
   EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage());
   // Check type.
@@ -449,21 +450,21 @@
 
 TEST_CASE(Service_LocalVarDescriptors) {
   const char* kScript =
-    "var port;\n"  // Set to our mock port by C++.
-    "\n"
-    "class A {\n"
-    "  var a;\n"
-    "  dynamic b() {}\n"
-    "  dynamic c() {\n"
-    "    var d = () { b(); };\n"
-    "    return d;\n"
-    "  }\n"
-    "}\n"
-    "main() {\n"
-    "  var z = new A();\n"
-    "  var x = z.c();\n"
-    "  x();\n"
-    "}";
+      "var port;\n"  // Set to our mock port by C++.
+      "\n"
+      "class A {\n"
+      "  var a;\n"
+      "  dynamic b() {}\n"
+      "  dynamic c() {\n"
+      "    var d = () { b(); };\n"
+      "    return d;\n"
+      "  }\n"
+      "}\n"
+      "main() {\n"
+      "  var z = new A();\n"
+      "  var x = z.c();\n"
+      "  x();\n"
+      "}";
 
   Isolate* isolate = thread->isolate();
   isolate->set_is_runnable(true);
@@ -497,8 +498,10 @@
   Array& service_msg = Array::Handle();
 
   // Fetch object.
-  service_msg = EvalF(lib, "[0, port, '0', 'getObject', "
-                      "['objectId'], ['objects/%" Pd "']]", id);
+  service_msg = EvalF(lib,
+                      "[0, port, '0', 'getObject', "
+                      "['objectId'], ['objects/%" Pd "']]",
+                      id);
   HandleIsolateMessage(isolate, service_msg);
   EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage());
   // Check type.
@@ -509,24 +512,22 @@
 }
 
 
-
 static void WeakHandleFinalizer(void* isolate_callback_data,
                                 Dart_WeakPersistentHandle handle,
-                                void* peer) {
-}
+                                void* peer) {}
 
 
 TEST_CASE(Service_PersistentHandles) {
   const char* kScript =
-    "var port;\n"  // Set to our mock port by C++.
-    "\n"
-    "class A {\n"
-    "  var a;\n"
-    "}\n"
-    "var global = new A();\n"
-    "main() {\n"
-    "  return global;\n"
-    "}";
+      "var port;\n"  // Set to our mock port by C++.
+      "\n"
+      "class A {\n"
+      "  var a;\n"
+      "}\n"
+      "var global = new A();\n"
+      "main() {\n"
+      "  return global;\n"
+      "}";
 
   Isolate* isolate = thread->isolate();
   isolate->set_is_runnable(true);
@@ -543,10 +544,8 @@
 
   // Create a weak persistent handle to global.
   Dart_WeakPersistentHandle weak_persistent_handle =
-      Dart_NewWeakPersistentHandle(result,
-                                   reinterpret_cast<void*>(0xdeadbeef),
-                                   128,
-                                   WeakHandleFinalizer);
+      Dart_NewWeakPersistentHandle(result, reinterpret_cast<void*>(0xdeadbeef),
+                                   128, WeakHandleFinalizer);
 
   // Build a mock message handler and wrap it in a dart port.
   ServiceTestMessageHandler handler;
@@ -613,52 +612,50 @@
     char buf[1024];
     bool ref = offset % 2 == 0;
     OS::SNPrint(buf, sizeof(buf),
-                (ref
-                 ? "[0, port, '0', '_getObjectByAddress', "
-                   "['address', 'ref'], ['%" Px "', 'true']]"
-                 : "[0, port, '0', '_getObjectByAddress', "
-                   "['address'], ['%" Px "']]"),
+                (ref ? "[0, port, '0', '_getObjectByAddress', "
+                       "['address', 'ref'], ['%" Px "', 'true']]"
+                     : "[0, port, '0', '_getObjectByAddress', "
+                       "['address'], ['%" Px "']]"),
                 addr);
     service_msg = Eval(lib, buf);
     HandleIsolateMessage(isolate, service_msg);
     EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage());
-    EXPECT_SUBSTRING(ref ? "\"type\":\"@Instance\"" :
-                           "\"type\":\"Instance\"",
+    EXPECT_SUBSTRING(ref ? "\"type\":\"@Instance\"" : "\"type\":\"Instance\"",
                      handler.msg());
     EXPECT_SUBSTRING("\"kind\":\"String\"", handler.msg());
     EXPECT_SUBSTRING("foobar", handler.msg());
   }
   // Expect null when no object is found.
-  service_msg = Eval(lib, "[0, port, '0', '_getObjectByAddress', "
+  service_msg = Eval(lib,
+                     "[0, port, '0', '_getObjectByAddress', "
                      "['address'], ['7']]");
   HandleIsolateMessage(isolate, service_msg);
   EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage());
   // TODO(turnidge): Should this be a ServiceException instead?
-  EXPECT_SUBSTRING("{\"type\":\"Sentinel\",\"kind\":\"Free\","
-                   "\"valueAsString\":\"<free>\"",
-               handler.msg());
+  EXPECT_SUBSTRING(
+      "{\"type\":\"Sentinel\",\"kind\":\"Free\","
+      "\"valueAsString\":\"<free>\"",
+      handler.msg());
 }
 
 
-static bool alpha_callback(
-    const char* name,
-    const char** option_keys,
-    const char** option_values,
-    intptr_t num_options,
-    void* user_data,
-    const char** result) {
+static bool alpha_callback(const char* name,
+                           const char** option_keys,
+                           const char** option_values,
+                           intptr_t num_options,
+                           void* user_data,
+                           const char** result) {
   *result = strdup("alpha");
   return true;
 }
 
 
-static bool beta_callback(
-    const char* name,
-    const char** option_keys,
-    const char** option_values,
-    intptr_t num_options,
-    void* user_data,
-    const char** result) {
+static bool beta_callback(const char* name,
+                          const char** option_keys,
+                          const char** option_values,
+                          intptr_t num_options,
+                          void* user_data,
+                          const char** result) {
   *result = strdup("beta");
   return false;
 }
@@ -666,13 +663,13 @@
 
 TEST_CASE(Service_EmbedderRootHandler) {
   const char* kScript =
-    "var port;\n"  // Set to our mock port by C++.
-    "\n"
-    "var x = 7;\n"
-    "main() {\n"
-    "  x = x * x;\n"
-    "  x = x / 13;\n"
-    "}";
+      "var port;\n"  // Set to our mock port by C++.
+      "\n"
+      "var x = 7;\n"
+      "main() {\n"
+      "  x = x * x;\n"
+      "  x = x / 13;\n"
+      "}";
 
   Dart_RegisterRootServiceRequestCallback("alpha", alpha_callback, NULL);
   Dart_RegisterRootServiceRequestCallback("beta", beta_callback, NULL);
@@ -699,20 +696,19 @@
   service_msg = Eval(lib, "[0, port, 1, 'beta', [], []]");
   HandleRootMessage(service_msg);
   EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage());
-  EXPECT_STREQ("{\"jsonrpc\":\"2.0\", \"error\":beta,\"id\":1}",
-               handler.msg());
+  EXPECT_STREQ("{\"jsonrpc\":\"2.0\", \"error\":beta,\"id\":1}", handler.msg());
 }
 
 
 TEST_CASE(Service_EmbedderIsolateHandler) {
   const char* kScript =
-    "var port;\n"  // Set to our mock port by C++.
-    "\n"
-    "var x = 7;\n"
-    "main() {\n"
-    "  x = x * x;\n"
-    "  x = x / 13;\n"
-    "}";
+      "var port;\n"  // Set to our mock port by C++.
+      "\n"
+      "var x = 7;\n"
+      "main() {\n"
+      "  x = x * x;\n"
+      "  x = x / 13;\n"
+      "}";
 
   Dart_RegisterIsolateServiceRequestCallback("alpha", alpha_callback, NULL);
   Dart_RegisterIsolateServiceRequestCallback("beta", beta_callback, NULL);
diff --git a/runtime/vm/signal_handler.h b/runtime/vm/signal_handler.h
index 654087d..734db06 100644
--- a/runtime/vm/signal_handler.h
+++ b/runtime/vm/signal_handler.h
@@ -9,7 +9,7 @@
 #include "vm/globals.h"
 
 #if defined(TARGET_OS_LINUX)
-#include <signal.h>  // NOLINT
+#include <signal.h>    // NOLINT
 #include <ucontext.h>  // NOLINT
 #elif defined(TARGET_OS_ANDROID)
 #include <signal.h>  // NOLINT
@@ -19,23 +19,22 @@
 typedef struct sigcontext mcontext_t;
 typedef struct ucontext {
   uint32_t uc_flags;
-  struct ucontext *uc_link;
+  struct ucontext* uc_link;
   stack_t uc_stack;
   struct sigcontext uc_mcontext;
   uint32_t uc_sigmask;
 } ucontext_t;
-#endif  // !defined(__BIONIC_HAVE_UCONTEXT_T)
+#endif                       // !defined(__BIONIC_HAVE_UCONTEXT_T)
 #elif defined(TARGET_OS_MACOS)
-#include <signal.h>  // NOLINT
+#include <signal.h>        // NOLINT
 #include <sys/ucontext.h>  // NOLINT
 #elif defined(TARGET_OS_WINDOWS)
 // Stub out for windows.
 struct siginfo_t;
 struct mcontext_t;
-struct sigset_t {
-};
+struct sigset_t {};
 #elif defined(TARGET_OS_FUCHSIA)
-#include <signal.h>  // NOLINT
+#include <signal.h>    // NOLINT
 #include <ucontext.h>  // NOLINT
 #endif
 
@@ -43,8 +42,8 @@
 // Old linux kernels on ARM might require a trampoline to
 // work around incorrect Thumb -> ARM transitions. See SignalHandlerTrampoline
 // below for more details.
-#if defined(HOST_ARCH_ARM) && \
-    (defined(TARGET_OS_LINUX) || defined(TARGET_OS_ANDROID)) && \
+#if defined(HOST_ARCH_ARM) &&                                                  \
+    (defined(TARGET_OS_LINUX) || defined(TARGET_OS_ANDROID)) &&                \
     !defined(__thumb__)
 #define USE_SIGNAL_HANDLER_TRAMPOLINE
 #endif
@@ -52,12 +51,11 @@
 
 namespace dart {
 
-typedef void (*SignalAction)(int signal, siginfo_t* info,
-                             void* context);
+typedef void (*SignalAction)(int signal, siginfo_t* info, void* context);
 
 class SignalHandler : public AllStatic {
  public:
-  template<SignalAction action>
+  template <SignalAction action>
   static void Install() {
 #if defined(USE_SIGNAL_HANDLER_TRAMPOLINE)
     InstallImpl(SignalHandlerTrampoline<action>);
@@ -108,10 +106,9 @@
     register siginfo_t* arg1 asm("r1") = info;
     register void* arg2 asm("r2") = context_;
     asm volatile("bx %3"
-                  :
-                  : "r"(arg0), "r"(arg1), "r"(arg2),
-                    "r"(action)
-                  : "memory");
+                 :
+                 : "r"(arg0), "r"(arg1), "r"(arg2), "r"(action)
+                 : "memory");
   }
 #endif  // defined(USE_SIGNAL_HANDLER_TRAMPOLINE)
 };
diff --git a/runtime/vm/simulator_arm.cc b/runtime/vm/simulator_arm.cc
index 9c3e3cf..232b1a4 100644
--- a/runtime/vm/simulator_arm.cc
+++ b/runtime/vm/simulator_arm.cc
@@ -24,9 +24,13 @@
 
 namespace dart {
 
-DEFINE_FLAG(uint64_t, trace_sim_after, ULLONG_MAX,
+DEFINE_FLAG(uint64_t,
+            trace_sim_after,
+            ULLONG_MAX,
             "Trace simulator execution after instruction count reached.");
-DEFINE_FLAG(uint64_t, stop_sim_at, ULLONG_MAX,
+DEFINE_FLAG(uint64_t,
+            stop_sim_at,
+            ULLONG_MAX,
             "Instruction address or instruction count to stop simulator at.");
 
 
@@ -96,7 +100,9 @@
 
   static TokenPosition GetApproximateTokenIndex(const Code& code, uword pc);
 
-  static void PrintDartFrame(uword pc, uword fp, uword sp,
+  static void PrintDartFrame(uword pc,
+                             uword fp,
+                             uword sp,
                              const Function& function,
                              TokenPosition token_pos,
                              bool is_optimized,
@@ -119,8 +125,7 @@
 }
 
 
-SimulatorDebugger::~SimulatorDebugger() {
-}
+SimulatorDebugger::~SimulatorDebugger() {}
 
 
 void SimulatorDebugger::Stop(Instr* instr, const char* message) {
@@ -130,22 +135,13 @@
 
 
 static Register LookupCpuRegisterByName(const char* name) {
-  static const char* kNames[] = {
-      "r0",  "r1",  "r2",  "r3",
-      "r4",  "r5",  "r6",  "r7",
-      "r8",  "r9",  "r10", "r11",
-      "r12", "r13", "r14", "r15",
-      "pc",  "lr",  "sp",  "ip",
-      "fp",  "pp",  "ctx"
-  };
-  static const Register kRegisters[] = {
-      R0,  R1,  R2,  R3,
-      R4,  R5,  R6,  R7,
-      R8,  R9,  R10, R11,
-      R12, R13, R14, R15,
-      PC,  LR,  SP,  IP,
-      FP,  PP,  CTX
-  };
+  static const char* kNames[] = {"r0",  "r1",  "r2",  "r3",  "r4",  "r5",
+                                 "r6",  "r7",  "r8",  "r9",  "r10", "r11",
+                                 "r12", "r13", "r14", "r15", "pc",  "lr",
+                                 "sp",  "ip",  "fp",  "pp",  "ctx"};
+  static const Register kRegisters[] = {R0, R1, R2,  R3,  R4,  R5,  R6,  R7,
+                                        R8, R9, R10, R11, R12, R13, R14, R15,
+                                        PC, LR, SP,  IP,  FP,  PP,  CTX};
   ASSERT(ARRAY_SIZE(kNames) == ARRAY_SIZE(kRegisters));
   for (unsigned i = 0; i < ARRAY_SIZE(kNames); i++) {
     if (strcmp(kNames[i], name) == 0) {
@@ -245,7 +241,7 @@
 
 
 TokenPosition SimulatorDebugger::GetApproximateTokenIndex(const Code& code,
-                                                            uword pc) {
+                                                          uword pc) {
   TokenPosition token_pos = TokenPosition::kNoSource;
   uword pc_offset = pc - code.PayloadStart();
   const PcDescriptors& descriptors =
@@ -262,7 +258,9 @@
 }
 
 
-void SimulatorDebugger::PrintDartFrame(uword pc, uword fp, uword sp,
+void SimulatorDebugger::PrintDartFrame(uword pc,
+                                       uword fp,
+                                       uword sp,
                                        const Function& function,
                                        TokenPosition token_pos,
                                        bool is_optimized,
@@ -275,19 +273,15 @@
   if (token_pos.IsReal()) {
     script.GetTokenLocation(token_pos, &line, &column);
   }
-  OS::Print("pc=0x%" Px " fp=0x%" Px " sp=0x%" Px " %s%s (%s:%" Pd
-            ":%" Pd ")\n",
-            pc, fp, sp,
-            is_optimized ? (is_inlined ? "inlined " : "optimized ") : "",
-            func_name.ToCString(),
-            url.ToCString(),
-            line, column);
+  OS::Print(
+      "pc=0x%" Px " fp=0x%" Px " sp=0x%" Px " %s%s (%s:%" Pd ":%" Pd ")\n", pc,
+      fp, sp, is_optimized ? (is_inlined ? "inlined " : "optimized ") : "",
+      func_name.ToCString(), url.ToCString(), line, column);
 }
 
 
 void SimulatorDebugger::PrintBacktrace() {
-  StackFrameIterator frames(sim_->get_register(FP),
-                            sim_->get_register(SP),
+  StackFrameIterator frames(sim_->get_register(FP), sim_->get_register(SP),
                             sim_->get_pc(),
                             StackFrameIterator::kDontValidateFrames);
   StackFrame* frame = frames.NextFrame();
@@ -312,25 +306,25 @@
           uword unoptimized_pc = it.pc();
           it.Advance();
           if (!it.Done()) {
-            PrintDartFrame(unoptimized_pc, frame->fp(), frame->sp(),
-                           inlined_function,
-                           GetApproximateTokenIndex(unoptimized_code,
-                                                    unoptimized_pc),
-                           true, true);
+            PrintDartFrame(
+                unoptimized_pc, frame->fp(), frame->sp(), inlined_function,
+                GetApproximateTokenIndex(unoptimized_code, unoptimized_pc),
+                true, true);
           }
         }
         // Print the optimized inlining frame below.
       }
-      PrintDartFrame(frame->pc(), frame->fp(), frame->sp(),
-                     function,
+      PrintDartFrame(frame->pc(), frame->fp(), frame->sp(), function,
                      GetApproximateTokenIndex(code, frame->pc()),
                      code.is_optimized(), false);
     } else {
       OS::Print("pc=0x%" Px " fp=0x%" Px " sp=0x%" Px " %s frame\n",
                 frame->pc(), frame->fp(), frame->sp(),
-                frame->IsEntryFrame() ? "entry" :
-                    frame->IsExitFrame() ? "exit" :
-                        frame->IsStubFrame() ? "stub" : "invalid");
+                frame->IsEntryFrame()
+                    ? "entry"
+                    : frame->IsExitFrame()
+                          ? "exit"
+                          : frame->IsStubFrame() ? "stub" : "invalid");
     }
     frame = frames.NextFrame();
   }
@@ -425,26 +419,27 @@
                         "%" XSTR(ARG_SIZE) "s",
                         cmd, arg1, arg2);
       if ((strcmp(cmd, "h") == 0) || (strcmp(cmd, "help") == 0)) {
-        OS::Print("c/cont -- continue execution\n"
-                  "disasm -- disassemble instrs at current pc location\n"
-                  "  other variants are:\n"
-                  "    disasm <address>\n"
-                  "    disasm <address> <number_of_instructions>\n"
-                  "  by default 10 instrs are disassembled\n"
-                  "del -- delete breakpoints\n"
-                  "flags -- print flag values\n"
-                  "gdb -- transfer control to gdb\n"
-                  "h/help -- print this help string\n"
-                  "break <address> -- set break point at specified address\n"
-                  "p/print <reg or icount or value or *addr> -- print integer\n"
-                  "ps/printsingle <sreg or *addr> -- print float value\n"
-                  "pd/printdouble <dreg or *addr> -- print double value\n"
-                  "po/printobject <*reg or *addr> -- print object\n"
-                  "si/stepi -- single step an instruction\n"
-                  "trace -- toggle execution tracing mode\n"
-                  "bt -- print backtrace\n"
-                  "unstop -- if current pc is a stop instr make it a nop\n"
-                  "q/quit -- Quit the debugger and exit the program\n");
+        OS::Print(
+            "c/cont -- continue execution\n"
+            "disasm -- disassemble instrs at current pc location\n"
+            "  other variants are:\n"
+            "    disasm <address>\n"
+            "    disasm <address> <number_of_instructions>\n"
+            "  by default 10 instrs are disassembled\n"
+            "del -- delete breakpoints\n"
+            "flags -- print flag values\n"
+            "gdb -- transfer control to gdb\n"
+            "h/help -- print this help string\n"
+            "break <address> -- set break point at specified address\n"
+            "p/print <reg or icount or value or *addr> -- print integer\n"
+            "ps/printsingle <sreg or *addr> -- print float value\n"
+            "pd/printdouble <dreg or *addr> -- print double value\n"
+            "po/printobject <*reg or *addr> -- print object\n"
+            "si/stepi -- single step an instruction\n"
+            "trace -- toggle execution tracing mode\n"
+            "bt -- print backtrace\n"
+            "unstop -- if current pc is a stop instr make it a nop\n"
+            "q/quit -- Quit the debugger and exit the program\n");
       } else if ((strcmp(cmd, "quit") == 0) || (strcmp(cmd, "q") == 0)) {
         OS::Print("Quitting\n");
         OS::Exit(0);
@@ -488,8 +483,8 @@
           double dvalue;
           if (GetDValue(arg1, &dvalue)) {
             uint64_t long_value = bit_cast<uint64_t, double>(dvalue);
-            OS::Print("%s: %llu 0x%llx %.8g\n",
-                arg1, long_value, long_value, dvalue);
+            OS::Print("%s: %llu 0x%llx %.8g\n", arg1, long_value, long_value,
+                      dvalue);
           } else {
             OS::Print("%s unrecognized\n", arg1);
           }
@@ -506,8 +501,8 @@
             if (Isolate::Current()->heap()->Contains(value)) {
               OS::Print("%s: \n", arg1);
 #if defined(DEBUG)
-              const Object& obj = Object::Handle(
-                  reinterpret_cast<RawObject*>(value));
+              const Object& obj =
+                  Object::Handle(reinterpret_cast<RawObject*>(value));
               obj.Print();
 #endif  // defined(DEBUG)
             } else {
@@ -641,9 +636,7 @@
       return NULL;
     }
     intptr_t len = strlen(line_buf);
-    if (len > 1 &&
-        line_buf[len - 2] == '\\' &&
-        line_buf[len - 1] == '\n') {
+    if (len > 1 && line_buf[len - 2] == '\\' && line_buf[len - 1] == '\n') {
       // When we read a line that ends with a "\" we remove the escape and
       // append the remainder.
       line_buf[len - 2] = '\n';
@@ -689,8 +682,8 @@
 
 // Synchronization primitives support.
 Mutex* Simulator::exclusive_access_lock_ = NULL;
-Simulator::AddressTag Simulator::exclusive_access_state_[kNumAddressTags] =
-    {{NULL, 0}};
+Simulator::AddressTag Simulator::exclusive_access_state_[kNumAddressTags] = {
+    {NULL, 0}};
 int Simulator::next_address_tag_ = 0;
 
 
@@ -707,9 +700,9 @@
   // the size specified by the user and the buffer space needed for
   // handling stack overflow exceptions. To be safe in potential
   // stack underflows we also add some underflow buffer space.
-  stack_ = new char[(OSThread::GetSpecifiedStackSize() +
-                     OSThread::kStackSizeBuffer +
-                     kSimulatorStackUnderflowSize)];
+  stack_ =
+      new char[(OSThread::GetSpecifiedStackSize() + OSThread::kStackSizeBuffer +
+                kSimulatorStackUnderflowSize)];
   pc_modified_ = false;
   icount_ = 0;
   break_pc_ = NULL;
@@ -741,7 +734,7 @@
   }
   // Since VFP registers are overlapping, single-precision registers should
   // already be initialized.
-  ASSERT(2*kNumberOfDRegisters >= kNumberOfSRegisters);
+  ASSERT(2 * kNumberOfDRegisters >= kNumberOfSRegisters);
   for (int i = 0; i < kNumberOfSRegisters; i++) {
     ASSERT(sregisters_[i] == 0.0);
   }
@@ -820,10 +813,9 @@
     Redirection* list_head = list_;
     do {
       next_ = list_head;
-      list_head = reinterpret_cast<Redirection*>(
-          AtomicOperations::CompareAndSwapWord(
-              reinterpret_cast<uword*>(&list_),
-              reinterpret_cast<uword>(next_),
+      list_head =
+          reinterpret_cast<Redirection*>(AtomicOperations::CompareAndSwapWord(
+              reinterpret_cast<uword*>(&list_), reinterpret_cast<uword>(next_),
               reinterpret_cast<uword>(this)));
     } while (list_head != next_);
   }
@@ -980,8 +972,8 @@
   // it will be possible to disassemble the code and inspect registers.
   char buffer[128];
   snprintf(buffer, sizeof(buffer),
-           "illegal memory access at 0x%" Px ", pc=0x%" Px "\n",
-           addr, fault_pc);
+           "illegal memory access at 0x%" Px ", pc=0x%" Px "\n", addr,
+           fault_pc);
   SimulatorDebugger dbg(this);
   dbg.Stop(instr, buffer);
   // The debugger will return control in non-interactive mode.
@@ -1001,8 +993,8 @@
   // The debugger will not be able to single step past this instruction, but
   // it will be possible to disassemble the code and inspect registers.
   char buffer[64];
-  snprintf(buffer, sizeof(buffer),
-           "unaligned %s at 0x%" Px ", pc=%p\n", msg, addr, instr);
+  snprintf(buffer, sizeof(buffer), "unaligned %s at 0x%" Px ", pc=%p\n", msg,
+           addr, instr);
   SimulatorDebugger dbg(this);
   dbg.Stop(instr, buffer);
   // The debugger will return control in non-interactive mode.
@@ -1194,7 +1186,7 @@
   // To be safe in potential stack underflows we leave some buffer above and
   // set the stack top.
   return StackBase() +
-      (OSThread::GetSpecifiedStackSize() + OSThread::kStackSizeBuffer);
+         (OSThread::GetSpecifiedStackSize() + OSThread::kStackSizeBuffer);
 }
 
 
@@ -1205,8 +1197,7 @@
 
 // Unsupported instructions use Format to print an error and stop execution.
 void Simulator::Format(Instr* instr, const char* format) {
-  OS::Print("Simulator found unsupported instruction:\n 0x%p: %s\n",
-            instr,
+  OS::Print("Simulator found unsupported instruction:\n 0x%p: %s\n", instr,
             format);
   UNIMPLEMENTED();
 }
@@ -1216,22 +1207,38 @@
 // condition bits.
 bool Simulator::ConditionallyExecute(Instr* instr) {
   switch (instr->ConditionField()) {
-    case EQ: return z_flag_;
-    case NE: return !z_flag_;
-    case CS: return c_flag_;
-    case CC: return !c_flag_;
-    case MI: return n_flag_;
-    case PL: return !n_flag_;
-    case VS: return v_flag_;
-    case VC: return !v_flag_;
-    case HI: return c_flag_ && !z_flag_;
-    case LS: return !c_flag_ || z_flag_;
-    case GE: return n_flag_ == v_flag_;
-    case LT: return n_flag_ != v_flag_;
-    case GT: return !z_flag_ && (n_flag_ == v_flag_);
-    case LE: return z_flag_ || (n_flag_ != v_flag_);
-    case AL: return true;
-    default: UNREACHABLE();
+    case EQ:
+      return z_flag_;
+    case NE:
+      return !z_flag_;
+    case CS:
+      return c_flag_;
+    case CC:
+      return !c_flag_;
+    case MI:
+      return n_flag_;
+    case PL:
+      return !n_flag_;
+    case VS:
+      return v_flag_;
+    case VC:
+      return !v_flag_;
+    case HI:
+      return c_flag_ && !z_flag_;
+    case LS:
+      return !c_flag_ || z_flag_;
+    case GE:
+      return n_flag_ == v_flag_;
+    case LT:
+      return n_flag_ != v_flag_;
+    case GT:
+      return !z_flag_ && (n_flag_ == v_flag_);
+    case LE:
+      return z_flag_ || (n_flag_ != v_flag_);
+    case AL:
+      return true;
+    default:
+      UNREACHABLE();
   }
   return false;
 }
@@ -1341,7 +1348,7 @@
   } else {
     // by register
     Register rs = instr->RsField();
-    shift_amount = get_register(rs) &0xff;
+    shift_amount = get_register(rs) & 0xff;
     switch (shift) {
       case ASR: {
         if (shift_amount == 0) {
@@ -1509,8 +1516,10 @@
 typedef void (*SimulatorRuntimeCall)(NativeArguments arguments);
 
 // Calls to leaf Dart runtime functions are based on this interface.
-typedef int32_t (*SimulatorLeafRuntimeCall)(
-    int32_t r0, int32_t r1, int32_t r2, int32_t r3);
+typedef int32_t (*SimulatorLeafRuntimeCall)(int32_t r0,
+                                            int32_t r1,
+                                            int32_t r2,
+                                            int32_t r3);
 
 // Calls to leaf float Dart runtime functions are based on this interface.
 typedef double (*SimulatorLeafFloatRuntimeCall)(double d0, double d1);
@@ -1542,7 +1551,7 @@
         }
         if (redirection->call_kind() == kRuntimeCall) {
           NativeArguments arguments;
-          ASSERT(sizeof(NativeArguments) == 4*kWordSize);
+          ASSERT(sizeof(NativeArguments) == 4 * kWordSize);
           arguments.thread_ = reinterpret_cast<Thread*>(get_register(R0));
           arguments.argc_tag_ = get_register(R1);
           arguments.argv_ = reinterpret_cast<RawObject**>(get_register(R2));
@@ -1562,7 +1571,7 @@
           SimulatorLeafRuntimeCall target =
               reinterpret_cast<SimulatorLeafRuntimeCall>(external);
           r0 = target(r0, r1, r2, r3);
-          set_register(R0, r0);  // Set returned result from function.
+          set_register(R0, r0);       // Set returned result from function.
           set_register(R1, icount_);  // Zap unused result register.
         } else if (redirection->call_kind() == kLeafFloatRuntimeCall) {
           ASSERT((0 <= redirection->argument_count()) &&
@@ -1627,8 +1636,8 @@
           for (int i = D1; i <= D7; i++) {
             set_dregister(static_cast<DRegister>(i), zap_dvalue);
           }
-          // The above loop also zaps overlapping registers S2-S15.
-          // Registers D8-D15 (overlapping with S16-S31) are preserved.
+// The above loop also zaps overlapping registers S2-S15.
+// Registers D8-D15 (overlapping with S16-S31) are preserved.
 #if defined(VFPv3_D32)
           for (int i = D16; i <= D31; i++) {
             set_dregister(static_cast<DRegister>(i), zap_dvalue);
@@ -1719,7 +1728,7 @@
               dbg.Stop(instr, buffer);
             }
           } else {
-             // Format(instr, "smc'cond");
+            // Format(instr, "smc'cond");
             UnimplementedInstruction(instr);
           }
           break;
@@ -1741,8 +1750,8 @@
         int32_t rd_val = 0;
         switch (instr->Bits(21, 3)) {
           case 1:
-            // Registers rd, rn, rm, ra are encoded as rn, rm, rs, rd.
-            // Format(instr, "mla'cond's 'rn, 'rm, 'rs, 'rd");
+          // Registers rd, rn, rm, ra are encoded as rn, rm, rs, rd.
+          // Format(instr, "mla'cond's 'rn, 'rm, 'rs, 'rd");
           case 3: {
             // Registers rd, rn, rm, ra are encoded as rn, rm, rs, rd.
             // Format(instr, "mls'cond's 'rn, 'rm, 'rs, 'rd");
@@ -1768,18 +1777,18 @@
             break;
           }
           case 4:
-            // Registers rd_lo, rd_hi, rn, rm are encoded as rd, rn, rm, rs.
-            // Format(instr, "umull'cond's 'rd, 'rn, 'rm, 'rs");
+          // Registers rd_lo, rd_hi, rn, rm are encoded as rd, rn, rm, rs.
+          // Format(instr, "umull'cond's 'rd, 'rn, 'rm, 'rs");
           case 6: {
             // Registers rd_lo, rd_hi, rn, rm are encoded as rd, rn, rm, rs.
             // Format(instr, "smull'cond's 'rd, 'rn, 'rm, 'rs");
             int64_t result;
             if (instr->Bits(21, 3) == 4) {  // umull
-              uint64_t left_op  = static_cast<uint32_t>(rm_val);
+              uint64_t left_op = static_cast<uint32_t>(rm_val);
               uint64_t right_op = static_cast<uint32_t>(rs_val);
               result = left_op * right_op;  // Unsigned multiplication.
-            } else {  // smull
-              int64_t left_op  = static_cast<int32_t>(rm_val);
+            } else {                        // smull
+              int64_t left_op = static_cast<int32_t>(rm_val);
               int64_t right_op = static_cast<int32_t>(rs_val);
               result = left_op * right_op;  // Signed multiplication.
             }
@@ -1792,7 +1801,7 @@
                 // Collapse bits 0..31 into bit 32 so that 32-bit Z check works.
                 hi_res |= 1;
               }
-              ASSERT((result == 0) == (hi_res == 0));  // Z bit
+              ASSERT((result == 0) == (hi_res == 0));                 // Z bit
               ASSERT(((result & (1LL << 63)) != 0) == (hi_res < 0));  // N bit
               SetNZFlags(hi_res);
             }
@@ -1806,8 +1815,8 @@
               UnimplementedInstruction(instr);
             }
           case 5:
-            // Registers rd_lo, rd_hi, rn, rm are encoded as rd, rn, rm, rs.
-            // Format(instr, "umlal'cond's 'rd, 'rn, 'rm, 'rs");
+          // Registers rd_lo, rd_hi, rn, rm are encoded as rd, rn, rm, rs.
+          // Format(instr, "umlal'cond's 'rd, 'rn, 'rm, 'rs");
           case 7: {
             // Registers rd_lo, rd_hi, rn, rm are encoded as rd, rn, rm, rs.
             // Format(instr, "smlal'cond's 'rd, 'rn, 'rm, 'rs");
@@ -1818,21 +1827,21 @@
             int64_t accum = Utils::LowHighTo64Bits(accum_lo, accum_hi);
             int64_t result;
             if (instr->Bits(21, 3) == 5) {  // umlal
-              uint64_t left_op  = static_cast<uint32_t>(rm_val);
+              uint64_t left_op = static_cast<uint32_t>(rm_val);
               uint64_t right_op = static_cast<uint32_t>(rs_val);
               result = accum + left_op * right_op;  // Unsigned multiplication.
-            } else if (instr->Bits(21, 3) == 7) {  // smlal
-              int64_t left_op  = static_cast<int32_t>(rm_val);
+            } else if (instr->Bits(21, 3) == 7) {   // smlal
+              int64_t left_op = static_cast<int32_t>(rm_val);
               int64_t right_op = static_cast<int32_t>(rs_val);
               result = accum + left_op * right_op;  // Signed multiplication.
             } else {
               ASSERT(instr->Bits(21, 3) == 2);  // umaal
               ASSERT(!instr->HasS());
-              uint64_t left_op  = static_cast<uint32_t>(rm_val);
+              uint64_t left_op = static_cast<uint32_t>(rm_val);
               uint64_t right_op = static_cast<uint32_t>(rs_val);
               result = left_op * right_op +  // Unsigned multiplication.
-                  static_cast<uint32_t>(rd_lo_val) +
-                  static_cast<uint32_t>(rd_hi_val);
+                       static_cast<uint32_t>(rd_lo_val) +
+                       static_cast<uint32_t>(rd_hi_val);
             }
             int32_t hi_res = Utils::High32Bits(result);
             int32_t lo_res = Utils::Low32Bits(result);
@@ -1843,7 +1852,7 @@
                 // Collapse bits 0..31 into bit 32 so that 32-bit Z check works.
                 hi_res |= 1;
               }
-              ASSERT((result == 0) == (hi_res == 0));  // Z bit
+              ASSERT((result == 0) == (hi_res == 0));                 // Z bit
               ASSERT(((result & (1LL << 63)) != 0) == (hi_res < 0));  // N bit
               SetNZFlags(hi_res);
             }
@@ -2484,7 +2493,7 @@
   if (instr->HasLink()) {
     set_register(LR, pc + Instr::kInstrSize);
   }
-  set_pc(pc+off);
+  set_pc(pc + off);
 }
 
 
@@ -2514,12 +2523,12 @@
         set_register(rn, Utils::High32Bits(dm_val));
       } else {
         // Format(instr, "vmovdrr'cond 'dm, 'rd, 'rn");
-        int64_t dm_val = Utils::LowHighTo64Bits(get_register(rd),
-                                                get_register(rn));
+        int64_t dm_val =
+            Utils::LowHighTo64Bits(get_register(rd), get_register(rn));
         set_dregister_bits(dm, dm_val);
       }
     }
-  } else if (instr-> IsVFPLoadStore()) {
+  } else if (instr->IsVFPLoadStore()) {
     Register rn = instr->RnField();
     int32_t addr = get_register(rn);
     int32_t imm_val = instr->Bits(0, 8) << 2;
@@ -2718,7 +2727,7 @@
           }
           break;
         }
-        case 0xb: {  // Other VFP data-processing instructions
+        case 0xb: {                  // Other VFP data-processing instructions
           if (instr->Bit(6) == 0) {  // vmov immediate
             if (instr->Bit(8) == 0) {
               // Format(instr, "vmovs'cond 'sd, #'immf");
@@ -2788,8 +2797,8 @@
               }
               break;
             }
-            case 4:  // vcmp, vcmpe
-            case 5: {  // vcmp #0.0, vcmpe #0.0
+            case 4:                      // vcmp, vcmpe
+            case 5: {                    // vcmp #0.0, vcmpe #0.0
               if (instr->Bit(7) == 1) {  // vcmpe
                 UnimplementedInstruction(instr);
               } else {
@@ -2952,9 +2961,9 @@
               set_sregister_bits(sd, sd_val);
               break;
             }
-            case 2:  // vcvtb, vcvtt
-            case 3:  // vcvtb, vcvtt
-            case 9:  // undefined
+            case 2:   // vcvtb, vcvtt
+            case 3:   // vcvtb, vcvtt
+            case 9:   // undefined
             case 10:  // vcvt between floating-point and fixed-point
             case 11:  // vcvt between floating-point and fixed-point
             case 14:  // vcvt between floating-point and fixed-point
@@ -2964,8 +2973,7 @@
               break;
             }
           }
-        }
-        break;
+        } break;
       }
     } else {
       // 8, 16, or 32-bit Transfer between ARM Core and VFP
@@ -3019,9 +3027,12 @@
 
 static float arm_reciprocal_sqrt_estimate(float a) {
   // From the ARM Architecture Reference Manual A2-87.
-  if (isinf(a) || (fabs(a) >= exp2f(126))) return 0.0;
-  else if (a == 0.0) return kPosInfinity;
-  else if (isnan(a)) return a;
+  if (isinf(a) || (fabs(a) >= exp2f(126)))
+    return 0.0;
+  else if (a == 0.0)
+    return kPosInfinity;
+  else if (isnan(a))
+    return a;
 
   uint32_t a_bits = bit_cast<uint32_t, float>(a);
   uint64_t scaled;
@@ -3059,10 +3070,11 @@
   // r in units of 1/256 rounded to nearest.
   int32_t s = static_cast<int>(256.0 * r + 0.5);
   double estimate = static_cast<double>(s) / 256.0;
-  ASSERT((estimate >= 1.0) && (estimate <= (511.0/256.0)));
+  ASSERT((estimate >= 1.0) && (estimate <= (511.0 / 256.0)));
 
   // result = 0 : result_exp<7:0> : estimate<51:29>
-  int32_t result_bits = ((result_exp & 0xff) << 23) |
+  int32_t result_bits =
+      ((result_exp & 0xff) << 23) |
       ((bit_cast<uint64_t, double>(estimate) >> 29) & 0x7fffff);
   return bit_cast<float, int32_t>(result_bits);
 }
@@ -3070,9 +3082,12 @@
 
 static float arm_recip_estimate(float a) {
   // From the ARM Architecture Reference Manual A2-85.
-  if (isinf(a) || (fabs(a) >= exp2f(126))) return 0.0;
-  else if (a == 0.0) return kPosInfinity;
-  else if (isnan(a)) return a;
+  if (isinf(a) || (fabs(a) >= exp2f(126)))
+    return 0.0;
+  else if (a == 0.0)
+    return kPosInfinity;
+  else if (isnan(a))
+    return a;
 
   uint32_t a_bits = bit_cast<uint32_t, float>(a);
   // scaled = '0011 1111 1110' : a<22:0> : Zeros(29)
@@ -3092,7 +3107,7 @@
   // r in units of 1/256 rounded to nearest.
   int32_t s = static_cast<int32_t>(256.0 * r + 0.5);
   double estimate = static_cast<double>(s) / 256.0;
-  ASSERT((estimate >= 1.0) && (estimate <= (511.0/256.0)));
+  ASSERT((estimate >= 1.0) && (estimate <= (511.0 / 256.0)));
 
   // result = sign : result_exp<7:0> : estimate<51:29>
   int32_t result_bits =
@@ -3102,8 +3117,10 @@
 }
 
 
-static void simd_value_swap(simd_value_t* s1, int i1,
-                            simd_value_t* s2, int i2) {
+static void simd_value_swap(simd_value_t* s1,
+                            int i1,
+                            simd_value_t* s2,
+                            int i2) {
   uint32_t tmp;
   tmp = s1->data_[i1].u;
   s1->data_[i1].u = s2->data_[i2].u;
@@ -3344,7 +3361,7 @@
       // Format(instr, "vmaxqs 'qd, 'qn, 'qm");
       for (int i = 0; i < 4; i++) {
         s8d.data_[i].f =
-          s8n.data_[i].f >= s8m.data_[i].f ? s8n.data_[i].f : s8m.data_[i].f;
+            s8n.data_[i].f >= s8m.data_[i].f ? s8n.data_[i].f : s8m.data_[i].f;
       }
     } else if ((instr->Bits(8, 4) == 7) && (instr->Bit(4) == 0) &&
                (instr->Bits(20, 2) == 3) && (instr->Bits(23, 2) == 3) &&
@@ -3907,10 +3924,10 @@
   set_register(kExceptionObjectReg, bit_cast<int32_t>(raw_exception));
   set_register(kStackTraceObjectReg, bit_cast<int32_t>(raw_stacktrace));
   // Restore pool pointer.
-  int32_t code = *reinterpret_cast<int32_t*>(
-      fp + kPcMarkerSlotFromFp * kWordSize);
-  int32_t pp = *reinterpret_cast<int32_t*>(
-      code + Code::object_pool_offset() - kHeapObjectTag);
+  int32_t code =
+      *reinterpret_cast<int32_t*>(fp + kPcMarkerSlotFromFp * kWordSize);
+  int32_t pp = *reinterpret_cast<int32_t*>(code + Code::object_pool_offset() -
+                                           kHeapObjectTag);
   set_register(CODE_REG, code);
   set_register(PP, pp);
   buf->Longjmp();
diff --git a/runtime/vm/simulator_arm.h b/runtime/vm/simulator_arm.h
index 2a505cc..605ccec 100644
--- a/runtime/vm/simulator_arm.h
+++ b/runtime/vm/simulator_arm.h
@@ -52,9 +52,7 @@
   void set_register(Register reg, int32_t value);
   int32_t get_register(Register reg) const;
 
-  int32_t get_sp() const {
-    return get_register(SPREG);
-  }
+  int32_t get_sp() const { return get_register(SPREG); }
 
   // Special case of set_register and get_register to access the raw PC value.
   void set_pc(int32_t value);
@@ -177,9 +175,7 @@
   int32_t break_instr_;
 
   // Illegal memory access support.
-  static bool IsIllegalAddress(uword addr) {
-    return addr < 64*1024;
-  }
+  static bool IsIllegalAddress(uword addr) { return addr < 64 * 1024; }
   void HandleIllegalAccess(uword addr, Instr* instr);
 
   // Handles a legal instruction that the simulator does not implement.
@@ -273,9 +269,7 @@
   bool IsTracingExecution() const;
 
   // Longjmp support for exceptions.
-  SimulatorSetjmpBuffer* last_setjmp_buffer() {
-    return last_setjmp_buffer_;
-  }
+  SimulatorSetjmpBuffer* last_setjmp_buffer() { return last_setjmp_buffer_; }
   void set_last_setjmp_buffer(SimulatorSetjmpBuffer* buffer) {
     last_setjmp_buffer_ = buffer;
   }
diff --git a/runtime/vm/simulator_arm64.cc b/runtime/vm/simulator_arm64.cc
index 0cfcb2a..a055567 100644
--- a/runtime/vm/simulator_arm64.cc
+++ b/runtime/vm/simulator_arm64.cc
@@ -23,9 +23,13 @@
 
 namespace dart {
 
-DEFINE_FLAG(uint64_t, trace_sim_after, ULLONG_MAX,
+DEFINE_FLAG(uint64_t,
+            trace_sim_after,
+            ULLONG_MAX,
             "Trace simulator execution after instruction count reached.");
-DEFINE_FLAG(uint64_t, stop_sim_at, ULLONG_MAX,
+DEFINE_FLAG(uint64_t,
+            stop_sim_at,
+            ULLONG_MAX,
             "Instruction address or instruction count to stop simulator at.");
 
 
@@ -96,7 +100,9 @@
 
   static TokenPosition GetApproximateTokenIndex(const Code& code, uword pc);
 
-  static void PrintDartFrame(uword pc, uword fp, uword sp,
+  static void PrintDartFrame(uword pc,
+                             uword fp,
+                             uword sp,
                              const Function& function,
                              TokenPosition token_pos,
                              bool is_optimized,
@@ -119,8 +125,7 @@
 }
 
 
-SimulatorDebugger::~SimulatorDebugger() {
-}
+SimulatorDebugger::~SimulatorDebugger() {}
 
 
 void SimulatorDebugger::Stop(Instr* instr, const char* message) {
@@ -131,24 +136,19 @@
 
 static Register LookupCpuRegisterByName(const char* name) {
   static const char* kNames[] = {
-      "r0",  "r1",  "r2",  "r3",
-      "r4",  "r5",  "r6",  "r7",
-      "r8",  "r9",  "r10", "r11",
-      "r12", "r13", "r14", "r15",
-      "r16", "r17", "r18", "r19",
-      "r20", "r21", "r22", "r23",
-      "r24", "r25", "r26", "r27",
-      "r28", "r29", "r30",
+      "r0",  "r1",  "r2",  "r3",  "r4",  "r5",  "r6",  "r7",
+      "r8",  "r9",  "r10", "r11", "r12", "r13", "r14", "r15",
+      "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
+      "r24", "r25", "r26", "r27", "r28", "r29", "r30",
 
-      "ip0", "ip1", "pp",  "ctx", "fp",  "lr",  "sp", "zr",
+      "ip0", "ip1", "pp",  "ctx", "fp",  "lr",  "sp",  "zr",
   };
   static const Register kRegisters[] = {
-      R0,  R1,  R2,  R3,  R4,  R5,  R6,  R7,
-      R8,  R9,  R10, R11, R12, R13, R14, R15,
-      R16, R17, R18, R19, R20, R21, R22, R23,
-      R24, R25, R26, R27, R28, R29, R30,
+      R0,  R1,  R2,  R3,  R4,  R5,  R6,  R7,  R8,  R9,  R10,
+      R11, R12, R13, R14, R15, R16, R17, R18, R19, R20, R21,
+      R22, R23, R24, R25, R26, R27, R28, R29, R30,
 
-      IP0, IP1, PP, CTX, FP, LR, R31, ZR,
+      IP0, IP1, PP,  CTX, FP,  LR,  R31, ZR,
   };
   ASSERT(ARRAY_SIZE(kNames) == ARRAY_SIZE(kRegisters));
   for (unsigned i = 0; i < ARRAY_SIZE(kNames); i++) {
@@ -263,7 +263,7 @@
 
 
 TokenPosition SimulatorDebugger::GetApproximateTokenIndex(const Code& code,
-                                                            uword pc) {
+                                                          uword pc) {
   TokenPosition token_pos = TokenPosition::kNoSource;
   uword pc_offset = pc - code.PayloadStart();
   const PcDescriptors& descriptors =
@@ -280,7 +280,9 @@
 }
 
 
-void SimulatorDebugger::PrintDartFrame(uword pc, uword fp, uword sp,
+void SimulatorDebugger::PrintDartFrame(uword pc,
+                                       uword fp,
+                                       uword sp,
                                        const Function& function,
                                        TokenPosition token_pos,
                                        bool is_optimized,
@@ -293,19 +295,15 @@
   if (token_pos.IsReal()) {
     script.GetTokenLocation(token_pos, &line, &column);
   }
-  OS::Print("pc=0x%" Px " fp=0x%" Px " sp=0x%" Px " %s%s (%s:%" Pd
-            ":%" Pd ")\n",
-            pc, fp, sp,
-            is_optimized ? (is_inlined ? "inlined " : "optimized ") : "",
-            func_name.ToCString(),
-            url.ToCString(),
-            line, column);
+  OS::Print(
+      "pc=0x%" Px " fp=0x%" Px " sp=0x%" Px " %s%s (%s:%" Pd ":%" Pd ")\n", pc,
+      fp, sp, is_optimized ? (is_inlined ? "inlined " : "optimized ") : "",
+      func_name.ToCString(), url.ToCString(), line, column);
 }
 
 
 void SimulatorDebugger::PrintBacktrace() {
-  StackFrameIterator frames(sim_->get_register(FP),
-                            sim_->get_register(SP),
+  StackFrameIterator frames(sim_->get_register(FP), sim_->get_register(SP),
                             sim_->get_pc(),
                             StackFrameIterator::kDontValidateFrames);
   StackFrame* frame = frames.NextFrame();
@@ -330,25 +328,25 @@
           uword unoptimized_pc = it.pc();
           it.Advance();
           if (!it.Done()) {
-            PrintDartFrame(unoptimized_pc, frame->fp(), frame->sp(),
-                           inlined_function,
-                           GetApproximateTokenIndex(unoptimized_code,
-                                                    unoptimized_pc),
-                           true, true);
+            PrintDartFrame(
+                unoptimized_pc, frame->fp(), frame->sp(), inlined_function,
+                GetApproximateTokenIndex(unoptimized_code, unoptimized_pc),
+                true, true);
           }
         }
         // Print the optimized inlining frame below.
       }
-      PrintDartFrame(frame->pc(), frame->fp(), frame->sp(),
-                     function,
+      PrintDartFrame(frame->pc(), frame->fp(), frame->sp(), function,
                      GetApproximateTokenIndex(code, frame->pc()),
                      code.is_optimized(), false);
     } else {
       OS::Print("pc=0x%" Px " fp=0x%" Px " sp=0x%" Px " %s frame\n",
                 frame->pc(), frame->fp(), frame->sp(),
-                frame->IsEntryFrame() ? "entry" :
-                    frame->IsExitFrame() ? "exit" :
-                        frame->IsStubFrame() ? "stub" : "invalid");
+                frame->IsEntryFrame()
+                    ? "entry"
+                    : frame->IsExitFrame()
+                          ? "exit"
+                          : frame->IsStubFrame() ? "stub" : "invalid");
     }
     frame = frames.NextFrame();
   }
@@ -443,27 +441,28 @@
                         "%" XSTR(ARG_SIZE) "s",
                         cmd, arg1, arg2);
       if ((strcmp(cmd, "h") == 0) || (strcmp(cmd, "help") == 0)) {
-        OS::Print("c/cont -- continue execution\n"
-                  "disasm -- disassemble instrs at current pc location\n"
-                  "  other variants are:\n"
-                  "    disasm <address>\n"
-                  "    disasm <address> <number_of_instructions>\n"
-                  "  by default 10 instrs are disassembled\n"
-                  "del -- delete breakpoints\n"
-                  "flags -- print flag values\n"
-                  "gdb -- transfer control to gdb\n"
-                  "h/help -- print this help string\n"
-                  "break <address> -- set break point at specified address\n"
-                  "p/print <reg or icount or value or *addr> -- print integer\n"
-                  "pf/printfloat <vreg or *addr> --print float value\n"
-                  "pd/printdouble <vreg or *addr> -- print double value\n"
-                  "pq/printquad <vreg or *addr> -- print vector register\n"
-                  "po/printobject <*reg or *addr> -- print object\n"
-                  "si/stepi -- single step an instruction\n"
-                  "trace -- toggle execution tracing mode\n"
-                  "bt -- print backtrace\n"
-                  "unstop -- if current pc is a stop instr make it a nop\n"
-                  "q/quit -- Quit the debugger and exit the program\n");
+        OS::Print(
+            "c/cont -- continue execution\n"
+            "disasm -- disassemble instrs at current pc location\n"
+            "  other variants are:\n"
+            "    disasm <address>\n"
+            "    disasm <address> <number_of_instructions>\n"
+            "  by default 10 instrs are disassembled\n"
+            "del -- delete breakpoints\n"
+            "flags -- print flag values\n"
+            "gdb -- transfer control to gdb\n"
+            "h/help -- print this help string\n"
+            "break <address> -- set break point at specified address\n"
+            "p/print <reg or icount or value or *addr> -- print integer\n"
+            "pf/printfloat <vreg or *addr> --print float value\n"
+            "pd/printdouble <vreg or *addr> -- print double value\n"
+            "pq/printquad <vreg or *addr> -- print vector register\n"
+            "po/printobject <*reg or *addr> -- print object\n"
+            "si/stepi -- single step an instruction\n"
+            "trace -- toggle execution tracing mode\n"
+            "bt -- print backtrace\n"
+            "unstop -- if current pc is a stop instr make it a nop\n"
+            "q/quit -- Quit the debugger and exit the program\n");
       } else if ((strcmp(cmd, "quit") == 0) || (strcmp(cmd, "q") == 0)) {
         OS::Print("Quitting\n");
         OS::Exit(0);
@@ -488,14 +487,12 @@
         } else {
           OS::Print("print <reg or icount or value or *addr>\n");
         }
-      } else if ((strcmp(cmd, "pf") == 0) ||
-                 (strcmp(cmd, "printfloat") == 0)) {
+      } else if ((strcmp(cmd, "pf") == 0) || (strcmp(cmd, "printfloat") == 0)) {
         if (args == 2) {
           uint32_t value;
           if (GetSValue(arg1, &value)) {
             float svalue = bit_cast<float, uint32_t>(value);
-            OS::Print("%s: %d 0x%x %.8g\n",
-                arg1, value, value, svalue);
+            OS::Print("%s: %d 0x%x %.8g\n", arg1, value, value, svalue);
           } else {
             OS::Print("%s unrecognized\n", arg1);
           }
@@ -508,16 +505,15 @@
           uint64_t long_value;
           if (GetDValue(arg1, &long_value)) {
             double dvalue = bit_cast<double, uint64_t>(long_value);
-            OS::Print("%s: %" Pu64 " 0x%" Px64 " %.8g\n",
-                arg1, long_value, long_value, dvalue);
+            OS::Print("%s: %" Pu64 " 0x%" Px64 " %.8g\n", arg1, long_value,
+                      long_value, dvalue);
           } else {
             OS::Print("%s unrecognized\n", arg1);
           }
         } else {
           OS::Print("printdouble <vreg or *addr>\n");
         }
-      } else if ((strcmp(cmd, "pq") == 0) ||
-                 (strcmp(cmd, "printquad") == 0)) {
+      } else if ((strcmp(cmd, "pq") == 0) || (strcmp(cmd, "printquad") == 0)) {
         if (args == 2) {
           simd_value_t quad_value;
           if (GetQValue(arg1, &quad_value)) {
@@ -555,8 +551,8 @@
             if (Isolate::Current()->heap()->Contains(value)) {
               OS::Print("%s: \n", arg1);
 #if defined(DEBUG)
-              const Object& obj = Object::Handle(
-                  reinterpret_cast<RawObject*>(value));
+              const Object& obj =
+                  Object::Handle(reinterpret_cast<RawObject*>(value));
               obj.Print();
 #endif  // defined(DEBUG)
             } else {
@@ -687,9 +683,7 @@
       return NULL;
     }
     intptr_t len = strlen(line_buf);
-    if (len > 1 &&
-        line_buf[len - 2] == '\\' &&
-        line_buf[len - 1] == '\n') {
+    if (len > 1 && line_buf[len - 2] == '\\' && line_buf[len - 1] == '\n') {
       // When we read a line that ends with a "\" we remove the escape and
       // append the remainder.
       line_buf[len - 2] = '\n';
@@ -735,8 +729,8 @@
 
 // Synchronization primitives support.
 Mutex* Simulator::exclusive_access_lock_ = NULL;
-Simulator::AddressTag Simulator::exclusive_access_state_[kNumAddressTags] =
-    {{NULL, 0}};
+Simulator::AddressTag Simulator::exclusive_access_state_[kNumAddressTags] = {
+    {NULL, 0}};
 int Simulator::next_address_tag_ = 0;
 
 
@@ -753,9 +747,9 @@
   // the size specified by the user and the buffer space needed for
   // handling stack overflow exceptions. To be safe in potential
   // stack underflows we also add some underflow buffer space.
-  stack_ = new char[(OSThread::GetSpecifiedStackSize() +
-                     OSThread::kStackSizeBuffer +
-                     kSimulatorStackUnderflowSize)];
+  stack_ =
+      new char[(OSThread::GetSpecifiedStackSize() + OSThread::kStackSizeBuffer +
+                kSimulatorStackUnderflowSize)];
   pc_modified_ = false;
   icount_ = 0;
   break_pc_ = NULL;
@@ -857,10 +851,9 @@
     Redirection* list_head = list_;
     do {
       next_ = list_head;
-      list_head = reinterpret_cast<Redirection*>(
-          AtomicOperations::CompareAndSwapWord(
-              reinterpret_cast<uword*>(&list_),
-              reinterpret_cast<uword>(next_),
+      list_head =
+          reinterpret_cast<Redirection*>(AtomicOperations::CompareAndSwapWord(
+              reinterpret_cast<uword*>(&list_), reinterpret_cast<uword>(next_),
               reinterpret_cast<uword>(this)));
     } while (list_head != next_);
   }
@@ -903,8 +896,10 @@
 
 
 // Sets the register in the architecture state.
-void Simulator::set_register(
-    Instr* instr, Register reg, int64_t value, R31Type r31t) {
+void Simulator::set_register(Instr* instr,
+                             Register reg,
+                             int64_t value,
+                             R31Type r31t) {
   // Register is in range.
   ASSERT((reg >= 0) && (reg < kNumberOfCpuRegisters));
   ASSERT(instr == NULL || reg != R18);  // R18 is globally reserved on iOS.
@@ -1020,9 +1015,9 @@
   uword fault_pc = get_pc();
   uword last_pc = get_last_pc();
   char buffer[128];
-  snprintf(buffer, sizeof(buffer),
-      "illegal memory access at 0x%" Px ", pc=0x%" Px ", last_pc=0x%" Px"\n",
-      addr, fault_pc, last_pc);
+  snprintf(buffer, sizeof(buffer), "illegal memory access at 0x%" Px
+                                   ", pc=0x%" Px ", last_pc=0x%" Px "\n",
+           addr, fault_pc, last_pc);
   SimulatorDebugger dbg(this);
   dbg.Stop(instr, buffer);
   // The debugger will return control in non-interactive mode.
@@ -1035,8 +1030,8 @@
 // so let's just not generate any.
 void Simulator::UnalignedAccess(const char* msg, uword addr, Instr* instr) {
   char buffer[128];
-  snprintf(buffer, sizeof(buffer),
-           "unaligned %s at 0x%" Px ", pc=%p\n", msg, addr, instr);
+  snprintf(buffer, sizeof(buffer), "unaligned %s at 0x%" Px ", pc=%p\n", msg,
+           addr, instr);
   SimulatorDebugger dbg(this);
   dbg.Stop(instr, buffer);
   // The debugger will not be able to single step past this instruction, but
@@ -1048,8 +1043,8 @@
 void Simulator::UnimplementedInstruction(Instr* instr) {
   char buffer[128];
   snprintf(buffer, sizeof(buffer),
-      "Unimplemented instruction: at %p, last_pc=0x%" Px64 "\n",
-      instr, get_last_pc());
+           "Unimplemented instruction: at %p, last_pc=0x%" Px64 "\n", instr,
+           get_last_pc());
   SimulatorDebugger dbg(this);
   dbg.Stop(instr, buffer);
   FATAL("Cannot continue execution after unimplemented instruction.");
@@ -1062,7 +1057,7 @@
   // To be safe in potential stack underflows we leave some buffer above and
   // set the stack top.
   return StackBase() +
-      (OSThread::GetSpecifiedStackSize() + OSThread::kStackSizeBuffer);
+         (OSThread::GetSpecifiedStackSize() + OSThread::kStackSizeBuffer);
 }
 
 
@@ -1282,8 +1277,7 @@
 
 // Unsupported instructions use Format to print an error and stop execution.
 void Simulator::Format(Instr* instr, const char* format) {
-  OS::Print("Simulator found unsupported instruction:\n 0x%p: %s\n",
-            instr,
+  OS::Print("Simulator found unsupported instruction:\n 0x%p: %s\n", instr,
             format);
   UNIMPLEMENTED();
 }
@@ -1321,7 +1315,9 @@
 
 // Calculate C flag value for additions and subtractions.
 bool Simulator::CarryFromX(int64_t alu_out,
-                           int64_t left, int64_t right, bool addition) {
+                           int64_t left,
+                           int64_t right,
+                           bool addition) {
   if (addition) {
     return (((left & right) | ((left | right) & ~alu_out)) >> 63) != 0;
   } else {
@@ -1332,7 +1328,9 @@
 
 // Calculate V flag value for additions and subtractions.
 bool Simulator::OverflowFromX(int64_t alu_out,
-                              int64_t left, int64_t right, bool addition) {
+                              int64_t left,
+                              int64_t right,
+                              bool addition) {
   if (addition) {
     return (((alu_out ^ left) & (alu_out ^ right)) >> 63) != 0;
   } else {
@@ -1357,8 +1355,8 @@
   const Register rd = instr->RdField();
   const int hw = instr->HWField();
   const int64_t shift = hw << 4;
-  const int64_t shifted_imm =
-      static_cast<int64_t>(instr->Imm16Field()) << shift;
+  const int64_t shifted_imm = static_cast<int64_t>(instr->Imm16Field())
+                              << shift;
 
   if (instr->SFField()) {
     if (instr->Bits(29, 2) == 0) {
@@ -1378,7 +1376,7 @@
   } else if ((hw & 0x2) == 0) {
     if (instr->Bits(29, 2) == 0) {
       // Format(instr, "movn'sf 'rd, 'imm16 'hw");
-      set_wregister(rd, ~shifted_imm & kWRegMask,  instr->RdMode());
+      set_wregister(rd, ~shifted_imm & kWRegMask, instr->RdMode());
     } else if (instr->Bits(29, 2) == 2) {
       // Format(instr, "movz'sf 'rd, 'imm16 'hw");
       set_wregister(rd, shifted_imm & kWRegMask, instr->RdMode());
@@ -1438,7 +1436,8 @@
   const int op = instr->Bits(29, 2);
   const bool set_flags = op == 3;
   const int out_size = ((instr->SFField() == 0) && (instr->NField() == 0))
-                       ? kWRegSizeInBits : kXRegSizeInBits;
+                           ? kWRegSizeInBits
+                           : kXRegSizeInBits;
   const Register rn = instr->RnField();
   const Register rd = instr->RdField();
   const int64_t rn_val = get_register(rn, instr->RnMode());
@@ -1544,22 +1543,38 @@
     cond = instr->ConditionField();
   }
   switch (cond) {
-    case EQ: return z_flag_;
-    case NE: return !z_flag_;
-    case CS: return c_flag_;
-    case CC: return !c_flag_;
-    case MI: return n_flag_;
-    case PL: return !n_flag_;
-    case VS: return v_flag_;
-    case VC: return !v_flag_;
-    case HI: return c_flag_ && !z_flag_;
-    case LS: return !c_flag_ || z_flag_;
-    case GE: return n_flag_ == v_flag_;
-    case LT: return n_flag_ != v_flag_;
-    case GT: return !z_flag_ && (n_flag_ == v_flag_);
-    case LE: return z_flag_ || (n_flag_ != v_flag_);
-    case AL: return true;
-    default: UNREACHABLE();
+    case EQ:
+      return z_flag_;
+    case NE:
+      return !z_flag_;
+    case CS:
+      return c_flag_;
+    case CC:
+      return !c_flag_;
+    case MI:
+      return n_flag_;
+    case PL:
+      return !n_flag_;
+    case VS:
+      return v_flag_;
+    case VC:
+      return !v_flag_;
+    case HI:
+      return c_flag_ && !z_flag_;
+    case LS:
+      return !c_flag_ || z_flag_;
+    case GE:
+      return n_flag_ == v_flag_;
+    case LT:
+      return n_flag_ != v_flag_;
+    case GT:
+      return !z_flag_ && (n_flag_ == v_flag_);
+    case LE:
+      return z_flag_ || (n_flag_ != v_flag_);
+    case AL:
+      return true;
+    default:
+      UNREACHABLE();
   }
   return false;
 }
@@ -1582,14 +1597,24 @@
 typedef void (*SimulatorRuntimeCall)(NativeArguments arguments);
 
 // Calls to leaf Dart runtime functions are based on this interface.
-typedef int64_t (*SimulatorLeafRuntimeCall)(
-    int64_t r0, int64_t r1, int64_t r2, int64_t r3,
-    int64_t r4, int64_t r5, int64_t r6, int64_t r7);
+typedef int64_t (*SimulatorLeafRuntimeCall)(int64_t r0,
+                                            int64_t r1,
+                                            int64_t r2,
+                                            int64_t r3,
+                                            int64_t r4,
+                                            int64_t r5,
+                                            int64_t r6,
+                                            int64_t r7);
 
 // Calls to leaf float Dart runtime functions are based on this interface.
-typedef double (*SimulatorLeafFloatRuntimeCall)(
-    double d0, double d1, double d2, double d3,
-    double d4, double d5, double d6, double d7);
+typedef double (*SimulatorLeafFloatRuntimeCall)(double d0,
+                                                double d1,
+                                                double d2,
+                                                double d3,
+                                                double d4,
+                                                double d5,
+                                                double d6,
+                                                double d7);
 
 // Calls to native Dart functions are based on this interface.
 typedef void (*SimulatorBootstrapNativeCall)(NativeArguments* arguments);
@@ -1635,7 +1660,7 @@
       const int64_t r6 = get_register(R6);
       const int64_t r7 = get_register(R7);
       const int64_t res = target(r0, r1, r2, r3, r4, r5, r6, r7);
-      set_register(instr, R0, res);  // Set returned result from function.
+      set_register(instr, R0, res);      // Set returned result from function.
       set_register(instr, R1, icount_);  // Zap unused result register.
     } else if (redirection->call_kind() == kLeafFloatRuntimeCall) {
       ASSERT((0 <= redirection->argument_count()) &&
@@ -1865,8 +1890,8 @@
   const Register rt = instr->RtField();
   const VRegister vt = instr->VtField();
   const int64_t rn_val = get_register(rn, R31IsSP);
-  const uint32_t size =
-      (instr->Bit(26) == 1) ? ((instr->Bit(23) << 2) | instr->SzField())
+  const uint32_t size = (instr->Bit(26) == 1)
+                            ? ((instr->Bit(23) << 2) | instr->SzField())
                             : instr->SzField();
   uword address = 0;
   uword wb_address = 0;
@@ -1876,7 +1901,7 @@
     const uint32_t imm12 = static_cast<uint32_t>(instr->Imm12Field());
     const uint32_t offset = imm12 << size;
     address = rn_val + offset;
-  }  else if (instr->Bits(10, 2) == 0) {
+  } else if (instr->Bits(10, 2) == 0) {
     // addr = rn + signed 9-bit immediate offset.
     wb = false;
     const int64_t offset = static_cast<int64_t>(instr->SImm9Field());
@@ -1899,8 +1924,7 @@
     // addr = rn + (rm EXT optionally scaled by operand instruction size).
     const Register rm = instr->RmField();
     const Extend ext = instr->ExtendTypeField();
-    const uint8_t scale =
-        (ext == UXTX) && (instr->Bit(12) == 1) ? size : 0;
+    const uint8_t scale = (ext == UXTX) && (instr->Bit(12) == 1) ? size : 0;
     const int64_t rm_val = get_register(rm, R31IsZR);
     const int64_t offset = ExtendOperand(kXRegSizeInBits, rm_val, ext, scale);
     address = rn_val + offset;
@@ -2170,9 +2194,7 @@
 
 
 void Simulator::DecodeLoadStoreExclusive(Instr* instr) {
-  if ((instr->Bit(23) != 0) ||
-      (instr->Bit(21) != 0) ||
-      (instr->Bit(15) != 0)) {
+  if ((instr->Bit(23) != 0) || (instr->Bit(21) != 0) || (instr->Bit(15) != 0)) {
     UNIMPLEMENTED();
   }
   const int32_t size = instr->Bits(30, 2);
@@ -2773,7 +2795,7 @@
       // Format(instr, "vmovrd 'rd, 'vn'idx5");
       set_register(instr, rd, get_vregisterd(vn, idx5), R31IsZR);
     }
-  } else if ((Q == 1)  && (op == 0) && (imm4 == 0)) {
+  } else if ((Q == 1) && (op == 0) && (imm4 == 0)) {
     // Format(instr, "vdup'csz 'vd, 'vn'idx5");
     if (element_bytes == 4) {
       for (int i = 0; i < 4; i++) {
@@ -2984,9 +3006,12 @@
 
 static float arm_reciprocal_sqrt_estimate(float a) {
   // From the ARM Architecture Reference Manual A2-87.
-  if (isinf(a) || (fabs(a) >= exp2f(126))) return 0.0;
-  else if (a == 0.0) return kPosInfinity;
-  else if (isnan(a)) return a;
+  if (isinf(a) || (fabs(a) >= exp2f(126)))
+    return 0.0;
+  else if (a == 0.0)
+    return kPosInfinity;
+  else if (isnan(a))
+    return a;
 
   uint32_t a_bits = bit_cast<uint32_t, float>(a);
   uint64_t scaled;
@@ -3024,10 +3049,11 @@
   // r in units of 1/256 rounded to nearest.
   int32_t s = static_cast<int>(256.0 * r + 0.5);
   double estimate = static_cast<double>(s) / 256.0;
-  ASSERT((estimate >= 1.0) && (estimate <= (511.0/256.0)));
+  ASSERT((estimate >= 1.0) && (estimate <= (511.0 / 256.0)));
 
   // result = 0 : result_exp<7:0> : estimate<51:29>
-  int32_t result_bits = ((result_exp & 0xff) << 23) |
+  int32_t result_bits =
+      ((result_exp & 0xff) << 23) |
       ((bit_cast<uint64_t, double>(estimate) >> 29) & 0x7fffff);
   return bit_cast<float, int32_t>(result_bits);
 }
@@ -3035,9 +3061,12 @@
 
 static float arm_recip_estimate(float a) {
   // From the ARM Architecture Reference Manual A2-85.
-  if (isinf(a) || (fabs(a) >= exp2f(126))) return 0.0;
-  else if (a == 0.0) return kPosInfinity;
-  else if (isnan(a)) return a;
+  if (isinf(a) || (fabs(a) >= exp2f(126)))
+    return 0.0;
+  else if (a == 0.0)
+    return kPosInfinity;
+  else if (isnan(a))
+    return a;
 
   uint32_t a_bits = bit_cast<uint32_t, float>(a);
   // scaled = '0011 1111 1110' : a<22:0> : Zeros(29)
@@ -3057,7 +3086,7 @@
   // r in units of 1/256 rounded to nearest.
   int32_t s = static_cast<int32_t>(256.0 * r + 0.5);
   double estimate = static_cast<double>(s) / 256.0;
-  ASSERT((estimate >= 1.0) && (estimate <= (511.0/256.0)));
+  ASSERT((estimate >= 1.0) && (estimate <= (511.0 / 256.0)));
 
   // result = sign : result_exp<7:0> : estimate<51:29>
   int32_t result_bits =
@@ -3217,8 +3246,9 @@
     // Format(instr, "scvtfd'sf 'vd, 'rn");
     const int64_t rn_val64 = get_register(rn, instr->RnMode());
     const int32_t rn_val32 = get_wregister(rn, instr->RnMode());
-    const double vn_dbl = (instr->SFField() == 1) ?
-        static_cast<double>(rn_val64) : static_cast<double>(rn_val32);
+    const double vn_dbl = (instr->SFField() == 1)
+                              ? static_cast<double>(rn_val64)
+                              : static_cast<double>(rn_val32);
     set_vregisterd(vd, 0, bit_cast<int64_t, double>(vn_dbl));
     set_vregisterd(vd, 1, 0);
   } else if (instr->Bits(16, 5) == 6) {
@@ -3605,10 +3635,10 @@
   set_register(NULL, kExceptionObjectReg, bit_cast<int64_t>(raw_exception));
   set_register(NULL, kStackTraceObjectReg, bit_cast<int64_t>(raw_stacktrace));
   // Restore pool pointer.
-  int64_t code = *reinterpret_cast<int64_t*>(
-      fp + kPcMarkerSlotFromFp * kWordSize);
-  int64_t pp = *reinterpret_cast<int64_t*>(
-      code + Code::object_pool_offset() - kHeapObjectTag);
+  int64_t code =
+      *reinterpret_cast<int64_t*>(fp + kPcMarkerSlotFromFp * kWordSize);
+  int64_t pp = *reinterpret_cast<int64_t*>(code + Code::object_pool_offset() -
+                                           kHeapObjectTag);
   pp -= kHeapObjectTag;  // In the PP register, the pool pointer is untagged.
   set_register(NULL, CODE_REG, code);
   set_register(NULL, PP, pp);
diff --git a/runtime/vm/simulator_arm64.h b/runtime/vm/simulator_arm64.h
index 406976a..79f9ced 100644
--- a/runtime/vm/simulator_arm64.h
+++ b/runtime/vm/simulator_arm64.h
@@ -50,8 +50,10 @@
   // specifying the type. We also can't translate a dummy value for SPREG into
   // a real value because the architecture independent code expects SPREG to
   // be a real register value.
-  void set_register(
-      Instr* instr, Register reg, int64_t value, R31Type r31t = R31IsSP);
+  void set_register(Instr* instr,
+                    Register reg,
+                    int64_t value,
+                    R31Type r31t = R31IsSP);
   int64_t get_register(Register reg, R31Type r31t = R31IsSP) const;
   void set_wregister(Register reg, int32_t value, R31Type r31t = R31IsSP);
   int32_t get_wregister(Register reg, R31Type r31t = R31IsSP) const;
@@ -65,9 +67,7 @@
   void get_vregister(VRegister reg, simd_value_t* value) const;
   void set_vregister(VRegister reg, const simd_value_t& value);
 
-  int64_t get_sp() const {
-    return get_register(SPREG);
-  }
+  int64_t get_sp() const { return get_register(SPREG); }
 
   int64_t get_pc() const;
   int64_t get_last_pc() const;
@@ -165,9 +165,7 @@
   int64_t break_instr_;
 
   // Illegal memory access support.
-  static bool IsIllegalAddress(uword addr) {
-    return addr < 64*1024;
-  }
+  static bool IsIllegalAddress(uword addr) { return addr < 64 * 1024; }
   void HandleIllegalAccess(uword addr, Instr* instr);
 
   // Handles an unaligned memory access.
@@ -232,8 +230,10 @@
 
   void SetNZFlagsX(int64_t val);
   bool CarryFromX(int64_t alu_out, int64_t left, int64_t right, bool addition);
-  bool OverflowFromX(
-      int64_t alu_out, int64_t left, int64_t right, bool addition);
+  bool OverflowFromX(int64_t alu_out,
+                     int64_t left,
+                     int64_t right,
+                     bool addition);
 
   void SetCFlag(bool val);
   void SetVFlag(bool val);
@@ -256,10 +256,9 @@
 
   // Decode instructions.
   void InstructionDecode(Instr* instr);
-  #define DECODE_OP(op)                                                        \
-    void Decode##op(Instr* instr);
+#define DECODE_OP(op) void Decode##op(Instr* instr);
   APPLY_OP_LIST(DECODE_OP)
-  #undef DECODE_OP
+#undef DECODE_OP
 
   // Executes ARM64 instructions until the PC reaches kEndSimulatingPC.
   void Execute();
@@ -268,9 +267,7 @@
   bool IsTracingExecution() const;
 
   // Longjmp support for exceptions.
-  SimulatorSetjmpBuffer* last_setjmp_buffer() {
-    return last_setjmp_buffer_;
-  }
+  SimulatorSetjmpBuffer* last_setjmp_buffer() { return last_setjmp_buffer_; }
   void set_last_setjmp_buffer(SimulatorSetjmpBuffer* buffer) {
     last_setjmp_buffer_ = buffer;
   }
diff --git a/runtime/vm/simulator_dbc.cc b/runtime/vm/simulator_dbc.cc
index a34d93b..0ac2ae9 100644
--- a/runtime/vm/simulator_dbc.cc
+++ b/runtime/vm/simulator_dbc.cc
@@ -32,9 +32,13 @@
 
 namespace dart {
 
-DEFINE_FLAG(uint64_t, trace_sim_after, ULLONG_MAX,
+DEFINE_FLAG(uint64_t,
+            trace_sim_after,
+            ULLONG_MAX,
             "Trace simulator execution after instruction count reached.");
-DEFINE_FLAG(uint64_t, stop_sim_at, ULLONG_MAX,
+DEFINE_FLAG(uint64_t,
+            stop_sim_at,
+            ULLONG_MAX,
             "Instruction address or instruction count to stop simulator at.");
 
 #define LIKELY(cond) __builtin_expect((cond), 1)
@@ -97,17 +101,17 @@
 }
 
 
-#define RAW_CAST(Type, val)  (SimulatorHelpers::CastTo##Type(val))
+#define RAW_CAST(Type, val) (SimulatorHelpers::CastTo##Type(val))
 
 
 class SimulatorHelpers {
  public:
-#define DEFINE_CASTS(Type)                                              \
-    DART_FORCE_INLINE static Raw##Type* CastTo##Type(RawObject* obj) {  \
-      ASSERT((k##Type##Cid == kSmiCid) ? !obj->IsHeapObject()           \
-                                       : obj->Is##Type());              \
-      return reinterpret_cast<Raw##Type*>(obj);                         \
-    }
+#define DEFINE_CASTS(Type)                                                     \
+  DART_FORCE_INLINE static Raw##Type* CastTo##Type(RawObject* obj) {           \
+    ASSERT((k##Type##Cid == kSmiCid) ? !obj->IsHeapObject()                    \
+                                     : obj->Is##Type());                       \
+    return reinterpret_cast<Raw##Type*>(obj);                                  \
+  }
   CLASS_LIST(DEFINE_CASTS)
 #undef DEFINE_CASTS
 
@@ -132,8 +136,7 @@
     const intptr_t raw_smi_old =
         reinterpret_cast<intptr_t>(entries[offset + count_offset]);
     const intptr_t raw_smi_new = raw_smi_old + Smi::RawValue(1);
-    *reinterpret_cast<intptr_t*>(&entries[offset + count_offset]) =
-        raw_smi_new;
+    *reinterpret_cast<intptr_t*>(&entries[offset + count_offset]) = raw_smi_new;
   }
 
   DART_FORCE_INLINE static bool IsStrictEqualWithNumberCheck(RawObject* lhs,
@@ -173,10 +176,9 @@
   }
 
   DART_FORCE_INLINE static bool CheckIndex(RawSmi* index, RawSmi* length) {
-    return !index->IsHeapObject() &&
-           (reinterpret_cast<intptr_t>(index) >= 0) &&
+    return !index->IsHeapObject() && (reinterpret_cast<intptr_t>(index) >= 0) &&
            (reinterpret_cast<intptr_t>(index) <
-                reinterpret_cast<intptr_t>(length));
+            reinterpret_cast<intptr_t>(length));
   }
 
   static bool ObjectArraySetIndexed(Thread* thread,
@@ -247,9 +249,8 @@
                               RawObject** result) {
     RawObject** args = FrameArguments(FP, 1);
     RawDouble* d = static_cast<RawDouble*>(args[0]);
-    *result = isnan(d->ptr()->value_)
-            ? Bool::True().raw()
-            : Bool::False().raw();
+    *result =
+        isnan(d->ptr()->value_) ? Bool::True().raw() : Bool::False().raw();
     return true;
   }
 
@@ -258,15 +259,12 @@
                                    RawObject** result) {
     RawObject** args = FrameArguments(FP, 1);
     RawDouble* d = static_cast<RawDouble*>(args[0]);
-    *result = isinf(d->ptr()->value_)
-            ? Bool::True().raw()
-            : Bool::False().raw();
+    *result =
+        isinf(d->ptr()->value_) ? Bool::True().raw() : Bool::False().raw();
     return true;
   }
 
-  static bool ObjectEquals(Thread* thread,
-                           RawObject** FP,
-                           RawObject** result) {
+  static bool ObjectEquals(Thread* thread, RawObject** FP, RawObject** result) {
     RawObject** args = FrameArguments(FP, 2);
     *result = args[0] == args[1] ? Bool::True().raw() : Bool::False().raw();
     return true;
@@ -307,8 +305,8 @@
   static bool GetDoubleOperands(RawObject** args, double* d1, double* d2) {
     RawObject* obj2 = args[1];
     if (!obj2->IsHeapObject()) {
-      *d2 = static_cast<double>(
-          reinterpret_cast<intptr_t>(obj2) >> kSmiTagSize);
+      *d2 =
+          static_cast<double>(reinterpret_cast<intptr_t>(obj2) >> kSmiTagSize);
     } else if (obj2->GetClassId() == kDoubleCid) {
       RawDouble* obj2d = static_cast<RawDouble*>(obj2);
       *d2 = obj2d->ptr()->value_;
@@ -322,8 +320,7 @@
 
   static RawObject* AllocateDouble(Thread* thread, double value) {
     const intptr_t instance_size = Double::InstanceSize();
-    const uword start =
-        thread->heap()->new_space()->TryAllocate(instance_size);
+    const uword start = thread->heap()->new_space()->TryAllocate(instance_size);
     if (LIKELY(start != 0)) {
       uword tags = 0;
       tags = RawObject::ClassIdTag::update(kDoubleCid, tags);
@@ -335,9 +332,7 @@
     return NULL;
   }
 
-  static bool Double_add(Thread* thread,
-                         RawObject** FP,
-                         RawObject** result) {
+  static bool Double_add(Thread* thread, RawObject** FP, RawObject** result) {
     double d1, d2;
     if (!GetDoubleOperands(FrameArguments(FP, 2), &d1, &d2)) {
       return false;
@@ -350,9 +345,7 @@
     return false;
   }
 
-  static bool Double_mul(Thread* thread,
-                         RawObject** FP,
-                         RawObject** result) {
+  static bool Double_mul(Thread* thread, RawObject** FP, RawObject** result) {
     double d1, d2;
     if (!GetDoubleOperands(FrameArguments(FP, 2), &d1, &d2)) {
       return false;
@@ -365,9 +358,7 @@
     return false;
   }
 
-  static bool Double_sub(Thread* thread,
-                         RawObject** FP,
-                         RawObject** result) {
+  static bool Double_sub(Thread* thread, RawObject** FP, RawObject** result) {
     double d1, d2;
     if (!GetDoubleOperands(FrameArguments(FP, 2), &d1, &d2)) {
       return false;
@@ -380,9 +371,7 @@
     return false;
   }
 
-  static bool Double_div(Thread* thread,
-                         RawObject** FP,
-                         RawObject** result) {
+  static bool Double_div(Thread* thread, RawObject** FP, RawObject** result) {
     double d1, d2;
     if (!GetDoubleOperands(FrameArguments(FP, 2), &d1, &d2)) {
       return false;
@@ -407,8 +396,8 @@
   }
 
   static bool Double_greaterEqualThan(Thread* thread,
-                                 RawObject** FP,
-                                 RawObject** result) {
+                                      RawObject** FP,
+                                      RawObject** result) {
     double d1, d2;
     if (!GetDoubleOperands(FrameArguments(FP, 2), &d1, &d2)) {
       return false;
@@ -418,8 +407,8 @@
   }
 
   static bool Double_lessThan(Thread* thread,
-                                 RawObject** FP,
-                                 RawObject** result) {
+                              RawObject** FP,
+                              RawObject** result) {
     double d1, d2;
     if (!GetDoubleOperands(FrameArguments(FP, 2), &d1, &d2)) {
       return false;
@@ -428,9 +417,7 @@
     return true;
   }
 
-  static bool Double_equal(Thread* thread,
-                                 RawObject** FP,
-                                 RawObject** result) {
+  static bool Double_equal(Thread* thread, RawObject** FP, RawObject** result) {
     double d1, d2;
     if (!GetDoubleOperands(FrameArguments(FP, 2), &d1, &d2)) {
       return false;
@@ -440,8 +427,8 @@
   }
 
   static bool Double_lessEqualThan(Thread* thread,
-                                 RawObject** FP,
-                                 RawObject** result) {
+                                   RawObject** FP,
+                                   RawObject** result) {
     double d1, d2;
     if (!GetDoubleOperands(FrameArguments(FP, 2), &d1, &d2)) {
       return false;
@@ -461,8 +448,8 @@
     FP[kPcMarkerSlotFromFp] = code;
   }
 
-  DART_FORCE_INLINE static uint8_t* GetTypedData(
-      RawObject* obj, RawObject* index) {
+  DART_FORCE_INLINE static uint8_t* GetTypedData(RawObject* obj,
+                                                 RawObject* index) {
     ASSERT(RawObject::IsTypedDataClassId(obj->GetClassId()));
     RawTypedData* array = reinterpret_cast<RawTypedData*>(obj);
     const intptr_t byte_offset = Smi::Value(RAW_CAST(Smi, index));
@@ -501,40 +488,29 @@
       SimulatorHelpers::GrowableArraySetIndexed;
   intrinsics_[kGrowableArrayGetIndexedIntrinsic] =
       SimulatorHelpers::GrowableArrayGetIndexed;
-  intrinsics_[kObjectEqualsIntrinsic] =
-      SimulatorHelpers::ObjectEquals;
+  intrinsics_[kObjectEqualsIntrinsic] = SimulatorHelpers::ObjectEquals;
   intrinsics_[kObjectRuntimeTypeIntrinsic] =
       SimulatorHelpers::ObjectRuntimeType;
 
-  intrinsics_[kDouble_getIsNaNIntrinsic] =
-      SimulatorHelpers::Double_getIsNan;
+  intrinsics_[kDouble_getIsNaNIntrinsic] = SimulatorHelpers::Double_getIsNan;
   intrinsics_[kDouble_getIsInfiniteIntrinsic] =
       SimulatorHelpers::Double_getIsInfinite;
-  intrinsics_[kDouble_addIntrinsic] =
-      SimulatorHelpers::Double_add;
-  intrinsics_[kDouble_mulIntrinsic] =
-      SimulatorHelpers::Double_mul;
-  intrinsics_[kDouble_subIntrinsic] =
-      SimulatorHelpers::Double_sub;
-  intrinsics_[kDouble_divIntrinsic] =
-      SimulatorHelpers::Double_div;
+  intrinsics_[kDouble_addIntrinsic] = SimulatorHelpers::Double_add;
+  intrinsics_[kDouble_mulIntrinsic] = SimulatorHelpers::Double_mul;
+  intrinsics_[kDouble_subIntrinsic] = SimulatorHelpers::Double_sub;
+  intrinsics_[kDouble_divIntrinsic] = SimulatorHelpers::Double_div;
   intrinsics_[kDouble_greaterThanIntrinsic] =
       SimulatorHelpers::Double_greaterThan;
   intrinsics_[kDouble_greaterEqualThanIntrinsic] =
       SimulatorHelpers::Double_greaterEqualThan;
-  intrinsics_[kDouble_lessThanIntrinsic] =
-      SimulatorHelpers::Double_lessThan;
-  intrinsics_[kDouble_equalIntrinsic] =
-      SimulatorHelpers::Double_equal;
+  intrinsics_[kDouble_lessThanIntrinsic] = SimulatorHelpers::Double_lessThan;
+  intrinsics_[kDouble_equalIntrinsic] = SimulatorHelpers::Double_equal;
   intrinsics_[kDouble_lessEqualThanIntrinsic] =
       SimulatorHelpers::Double_lessEqualThan;
 }
 
 
-Simulator::Simulator()
-    : stack_(NULL),
-      fp_(NULL),
-      sp_(NULL) {
+Simulator::Simulator() : stack_(NULL), fp_(NULL), sp_(NULL) {
   // Setup simulator support first. Some of this information is needed to
   // setup the architecture state.
   // We allocate the stack here, the size is computed as the sum of
@@ -726,7 +702,7 @@
 
 
 #define SMI_MUL(lhs, rhs, pres) SignedMulWithOverflow((lhs), (rhs) >> 1, pres)
-#define SMI_COND(cond, lhs, rhs, pres) \
+#define SMI_COND(cond, lhs, rhs, pres)                                         \
   ((*(pres) = ((lhs cond rhs) ? true_value : false_value)), false)
 #define SMI_EQ(lhs, rhs, pres) SMI_COND(==, lhs, rhs, pres)
 #define SMI_LT(lhs, rhs, pres) SMI_COND(<, lhs, rhs, pres)
@@ -825,14 +801,8 @@
   // Handler arguments: arguments to check and an ICData object.
   const intptr_t miss_handler_argc = checked_args + 1;
   RawObject** exit_frame = miss_handler_args + miss_handler_argc;
-  CallRuntime(thread,
-              FP,
-              exit_frame,
-              pc,
-              miss_handler_argc,
-              miss_handler_args,
-              result,
-              reinterpret_cast<uword>(handler));
+  CallRuntime(thread, FP, exit_frame, pc, miss_handler_argc, miss_handler_args,
+              result, reinterpret_cast<uword>(handler));
 }
 
 
@@ -857,8 +827,7 @@
   bool found = false;
   const intptr_t length = Smi::Value(cache->length_);
   intptr_t i;
-  for (i = 0;
-       i < (length - (kCheckedArgs + 2)); i += (kCheckedArgs + 2)) {
+  for (i = 0; i < (length - (kCheckedArgs + 2)); i += (kCheckedArgs + 2)) {
     if (cache->data()[i + 0] == receiver_cid) {
       top[0] = cache->data()[i + kCheckedArgs];
       found = true;
@@ -871,8 +840,8 @@
       SimulatorHelpers::IncrementICUsageCount(cache->data(), i, kCheckedArgs);
     }
   } else {
-    InlineCacheMiss(
-        kCheckedArgs, thread, icdata, call_base, top, *pc, *FP, *SP);
+    InlineCacheMiss(kCheckedArgs, thread, icdata, call_base, top, *pc, *FP,
+                    *SP);
   }
 
   *argdesc = icdata->ptr()->args_descriptor_;
@@ -902,8 +871,7 @@
   bool found = false;
   const intptr_t length = Smi::Value(cache->length_);
   intptr_t i;
-  for (i = 0;
-       i < (length - (kCheckedArgs + 2)); i += (kCheckedArgs + 2)) {
+  for (i = 0; i < (length - (kCheckedArgs + 2)); i += (kCheckedArgs + 2)) {
     if ((cache->data()[i + 0] == receiver_cid) &&
         (cache->data()[i + 1] == arg0_cid)) {
       top[0] = cache->data()[i + kCheckedArgs];
@@ -917,8 +885,8 @@
       SimulatorHelpers::IncrementICUsageCount(cache->data(), i, kCheckedArgs);
     }
   } else {
-    InlineCacheMiss(
-        kCheckedArgs, thread, icdata, call_base, top, *pc, *FP, *SP);
+    InlineCacheMiss(kCheckedArgs, thread, icdata, call_base, top, *pc, *FP,
+                    *SP);
   }
 
   *argdesc = icdata->ptr()->args_descriptor_;
@@ -929,11 +897,10 @@
 // Note: functions below are marked DART_NOINLINE to recover performance on
 // ARM where inlining these functions into the interpreter loop seemed to cause
 // some code quality issues.
-static DART_NOINLINE bool InvokeRuntime(
-    Thread* thread,
-    Simulator* sim,
-    RuntimeFunction drt,
-    const NativeArguments& args) {
+static DART_NOINLINE bool InvokeRuntime(Thread* thread,
+                                        Simulator* sim,
+                                        RuntimeFunction drt,
+                                        const NativeArguments& args) {
   SimulatorSetjmpBuffer buffer(sim);
   if (!setjmp(buffer.buffer_)) {
     thread->set_vm_tag(reinterpret_cast<uword>(drt));
@@ -947,11 +914,10 @@
 }
 
 
-static DART_NOINLINE bool InvokeNative(
-    Thread* thread,
-    Simulator* sim,
-    SimulatorBootstrapNativeCall f,
-    NativeArguments* args) {
+static DART_NOINLINE bool InvokeNative(Thread* thread,
+                                       Simulator* sim,
+                                       SimulatorBootstrapNativeCall f,
+                                       NativeArguments* args) {
   SimulatorSetjmpBuffer buffer(sim);
   if (!setjmp(buffer.buffer_)) {
     thread->set_vm_tag(reinterpret_cast<uword>(f));
@@ -965,11 +931,10 @@
 }
 
 
-static DART_NOINLINE bool InvokeNativeWrapper(
-    Thread* thread,
-    Simulator* sim,
-    Dart_NativeFunction f,
-    NativeArguments* args) {
+static DART_NOINLINE bool InvokeNativeWrapper(Thread* thread,
+                                              Simulator* sim,
+                                              Dart_NativeFunction f,
+                                              NativeArguments* args) {
   SimulatorSetjmpBuffer buffer(sim);
   if (!setjmp(buffer.buffer_)) {
     thread->set_vm_tag(reinterpret_cast<uword>(f));
@@ -987,29 +952,32 @@
 
 // Decode opcode and A part of the given value and dispatch to the
 // corresponding bytecode handler.
-#define DISPATCH_OP(val)         \
-  do {                           \
-    op = (val);                \
-    rA = ((op >> 8) & 0xFF);   \
-    goto* dispatch[op & 0xFF]; \
+#define DISPATCH_OP(val)                                                       \
+  do {                                                                         \
+    op = (val);                                                                \
+    rA = ((op >> 8) & 0xFF);                                                   \
+    goto* dispatch[op & 0xFF];                                                 \
   } while (0)
 
 // Fetch next operation from PC, increment program counter and dispatch.
 #define DISPATCH() DISPATCH_OP(*pc++)
 
 // Define entry point that handles bytecode Name with the given operand format.
-#define BYTECODE(Name, Operands) \
+#define BYTECODE(Name, Operands)                                               \
   BYTECODE_HEADER(Name, DECLARE_##Operands, DECODE_##Operands)
 
-#define BYTECODE_HEADER(Name, Declare, Decode) \
-  Declare;                                     \
-  bc##Name : Decode                            \
+#define BYTECODE_HEADER(Name, Declare, Decode)                                 \
+  Declare;                                                                     \
+  bc##Name : Decode
 
 // Helpers to decode common instruction formats. Used in conjunction with
 // BYTECODE() macro.
-#define DECLARE_A_B_C uint16_t rB, rC; USE(rB); USE(rC)
-#define DECODE_A_B_C \
-  rB = ((op >> Bytecode::kBShift) & Bytecode::kBMask);    \
+#define DECLARE_A_B_C                                                          \
+  uint16_t rB, rC;                                                             \
+  USE(rB);                                                                     \
+  USE(rC)
+#define DECODE_A_B_C                                                           \
+  rB = ((op >> Bytecode::kBShift) & Bytecode::kBMask);                         \
   rC = ((op >> Bytecode::kCShift) & Bytecode::kCMask);
 
 #define DECLARE_0
@@ -1018,13 +986,17 @@
 #define DECLARE_A
 #define DECODE_A
 
-#define DECLARE___D uint32_t rD; USE(rD)
+#define DECLARE___D                                                            \
+  uint32_t rD;                                                                 \
+  USE(rD)
 #define DECODE___D rD = (op >> Bytecode::kDShift);
 
 #define DECLARE_A_D DECLARE___D
 #define DECODE_A_D DECODE___D
 
-#define DECLARE_A_X int32_t rD; USE(rD)
+#define DECLARE_A_X                                                            \
+  int32_t rD;                                                                  \
+  USE(rD)
 #define DECODE_A_X rD = (static_cast<int32_t>(op) >> Bytecode::kDShift);
 
 
@@ -1035,7 +1007,7 @@
     const RawICData* icdata = RAW_CAST(ICData, LOAD_CONSTANT(kidx));           \
     RawObject** entries = icdata->ptr()->ic_data_->ptr()->data();              \
     SimulatorHelpers::IncrementICUsageCount(entries, 0, 2);                    \
-  } while (0);                                                                 \
+  } while (0);
 
 // Declare bytecode handler for a smi operation (e.g. AddTOS) with the
 // given result type and the given behavior specified as a function
@@ -1047,8 +1019,7 @@
     const intptr_t rhs = reinterpret_cast<intptr_t>(SP[-0]);                   \
     ResultT* slot = reinterpret_cast<ResultT*>(SP - 1);                        \
     if (LIKELY(!thread->isolate()->single_step()) &&                           \
-        LIKELY(AreBothSmis(lhs, rhs) &&                                        \
-        !Func(lhs, rhs, slot))) {                                              \
+        LIKELY(AreBothSmis(lhs, rhs) && !Func(lhs, rhs, slot))) {              \
       SMI_FASTPATH_ICDATA_INC;                                                 \
       /* Fast path succeeded. Skip the generic call that follows. */           \
       pc++;                                                                    \
@@ -1076,7 +1047,7 @@
     const intptr_t rhs = reinterpret_cast<intptr_t>(FP[rC]);                   \
     ResultT* slot = reinterpret_cast<ResultT*>(&FP[rA]);                       \
     Func(lhs, rhs, slot);                                                      \
-  }                                                                            \
+  }
 
 
 // Exception handling helper. Gets handler FP and PC from the Simulator where
@@ -1088,7 +1059,7 @@
   do {                                                                         \
     FP = reinterpret_cast<RawObject**>(fp_);                                   \
     pc = reinterpret_cast<uint32_t*>(pc_);                                     \
-    if ((reinterpret_cast<uword>(pc) & 2) != 0) {  /* Entry frame? */          \
+    if ((reinterpret_cast<uword>(pc) & 2) != 0) { /* Entry frame? */           \
       fp_ = sp_ = reinterpret_cast<RawObject**>(fp_[0]);                       \
       thread->set_top_exit_frame_info(reinterpret_cast<uword>(sp_));           \
       thread->set_top_resource(top_resource);                                  \
@@ -1097,23 +1068,23 @@
     }                                                                          \
     pp = SimulatorHelpers::FrameCode(FP)->ptr()->object_pool_->ptr();          \
     goto DispatchAfterException;                                               \
-  } while (0)                                                                  \
+  } while (0)
 
 // Runtime call helpers: handle invocation and potential exception after return.
-#define INVOKE_RUNTIME(Func, Args)                \
-  if (!InvokeRuntime(thread, this, Func, Args)) { \
-    HANDLE_EXCEPTION;                             \
-  }                                               \
+#define INVOKE_RUNTIME(Func, Args)                                             \
+  if (!InvokeRuntime(thread, this, Func, Args)) {                              \
+    HANDLE_EXCEPTION;                                                          \
+  }
 
-#define INVOKE_NATIVE(Func, Args)                 \
-  if (!InvokeNative(thread, this, Func, &Args)) { \
-    HANDLE_EXCEPTION;                             \
-  }                                               \
+#define INVOKE_NATIVE(Func, Args)                                              \
+  if (!InvokeNative(thread, this, Func, &Args)) {                              \
+    HANDLE_EXCEPTION;                                                          \
+  }
 
-#define INVOKE_NATIVE_WRAPPER(Func, Args)                \
-  if (!InvokeNativeWrapper(thread, this, Func, &Args)) { \
-    HANDLE_EXCEPTION;                                    \
-  }                                                      \
+#define INVOKE_NATIVE_WRAPPER(Func, Args)                                      \
+  if (!InvokeNativeWrapper(thread, this, Func, &Args)) {                       \
+    HANDLE_EXCEPTION;                                                          \
+  }
 
 #define LOAD_CONSTANT(index) (pp->data()[(index)].raw_obj_)
 
@@ -1130,10 +1101,10 @@
   };
 
   // Interpreter state (see constants_dbc.h for high-level overview).
-  uint32_t* pc;  // Program Counter: points to the next op to execute.
+  uint32_t* pc;       // Program Counter: points to the next op to execute.
   RawObjectPool* pp;  // Pool Pointer.
-  RawObject** FP;  // Frame Pointer.
-  RawObject** SP;  // Stack Pointer.
+  RawObject** FP;     // Frame Pointer.
+  RawObject** SP;     // Stack Pointer.
 
   RawArray* argdesc;  // Arguments Descriptor: used to pass information between
                       // call instruction and the function entry.
@@ -1301,7 +1272,7 @@
       // descriptor.
       RawObject** argdesc_data = argdesc->ptr()->data();
 
-      intptr_t i = named_count - 1;  // argument position
+      intptr_t i = named_count - 1;           // argument position
       intptr_t j = num_opt_named_params - 1;  // parameter position
       while ((j >= 0) && (i >= 0)) {
         // Fetch formal parameter information: name, default value, target slot.
@@ -1365,8 +1336,7 @@
       // Process the list of default values encoded as a sequence of
       // LoadConstant instructions after EntryOpt bytecode.
       // Execute only those that correspond to parameters the were not passed.
-      for (intptr_t i = pos_count - num_fixed_params;
-           i < num_opt_pos_params;
+      for (intptr_t i = pos_count - num_fixed_params; i < num_opt_pos_params;
            i++) {
         const uint32_t load_value = pc[i];
         ASSERT(Bytecode::DecodeOpcode(load_value) == Bytecode::kLoadConstant);
@@ -1428,7 +1398,7 @@
     BYTECODE(HotCheck, A_D);
     const uint8_t increment = rA;
     const uint16_t threshold = rD;
-    RawFunction* f =  FrameFunction(FP);
+    RawFunction* f = FrameFunction(FP);
     int32_t counter = f->ptr()->usage_counter_;
     // Note: we don't increment usage counter in the prologue of optimized
     // functions.
@@ -1673,8 +1643,7 @@
       RawICData* ic_data = RAW_CAST(ICData, ic_data_obj);
       RawObject** data = ic_data->ptr()->ic_data_->ptr()->data();
       SimulatorHelpers::IncrementICUsageCount(data, 0, 0);
-      SP[0] = data[ICData::TargetIndexFor(
-          ic_data->ptr()->state_bits_ & 0x3)];
+      SP[0] = data[ICData::TargetIndexFor(ic_data->ptr()->state_bits_ & 0x3)];
       RawObject** call_base = SP - argc;
       RawObject** call_top = SP;  // *SP contains function
       argdesc = static_cast<RawArray*>(LOAD_CONSTANT(rD));
@@ -1714,9 +1683,8 @@
       RawICData* icdata = RAW_CAST(ICData, LOAD_CONSTANT(kidx));
       SimulatorHelpers::IncrementUsageCounter(
           RAW_CAST(Function, icdata->ptr()->owner_));
-      InstanceCall1(thread, icdata, call_base, call_top,
-                    &argdesc, &pp, &pc, &FP, &SP,
-                    false /* optimized */);
+      InstanceCall1(thread, icdata, call_base, call_top, &argdesc, &pp, &pc,
+                    &FP, &SP, false /* optimized */);
     }
 
     DISPATCH();
@@ -1740,9 +1708,8 @@
       RawICData* icdata = RAW_CAST(ICData, LOAD_CONSTANT(kidx));
       SimulatorHelpers::IncrementUsageCounter(
           RAW_CAST(Function, icdata->ptr()->owner_));
-      InstanceCall2(thread, icdata, call_base, call_top,
-                    &argdesc, &pp, &pc, &FP, &SP,
-                    false /* optimized */);
+      InstanceCall2(thread, icdata, call_base, call_top, &argdesc, &pp, &pc,
+                    &FP, &SP, false /* optimized */);
     }
 
     DISPATCH();
@@ -1760,9 +1727,8 @@
 
       RawICData* icdata = RAW_CAST(ICData, LOAD_CONSTANT(kidx));
       SimulatorHelpers::IncrementUsageCounter(FrameFunction(FP));
-      InstanceCall1(thread, icdata, call_base, call_top,
-                    &argdesc, &pp, &pc, &FP, &SP,
-                    true /* optimized */);
+      InstanceCall1(thread, icdata, call_base, call_top, &argdesc, &pp, &pc,
+                    &FP, &SP, true /* optimized */);
     }
 
     DISPATCH();
@@ -1780,9 +1746,8 @@
 
       RawICData* icdata = RAW_CAST(ICData, LOAD_CONSTANT(kidx));
       SimulatorHelpers::IncrementUsageCounter(FrameFunction(FP));
-      InstanceCall2(thread, icdata, call_base, call_top,
-                    &argdesc, &pp, &pc, &FP, &SP,
-                    true /* optimized */);
+      InstanceCall2(thread, icdata, call_base, call_top, &argdesc, &pp, &pc,
+                    &FP, &SP, true /* optimized */);
     }
 
     DISPATCH();
@@ -1794,7 +1759,7 @@
     const intptr_t cids_length = rD;
     RawObject** args = SP - argc + 1;
     const intptr_t receiver_cid = SimulatorHelpers::GetClassId(args[0]);
-    for (intptr_t i = 0; i < 2*cids_length; i+=2) {
+    for (intptr_t i = 0; i < 2 * cids_length; i += 2) {
       const intptr_t icdata_cid = Bytecode::DecodeD(*(pc + i));
       if (receiver_cid == icdata_cid) {
         RawFunction* target =
@@ -1980,8 +1945,8 @@
     const intptr_t rhs = reinterpret_cast<intptr_t>(FP[rC]);
     if (rhs != 0) {
       const intptr_t lhs = reinterpret_cast<intptr_t>(FP[rB]);
-      const intptr_t res =
-          ((lhs >> kSmiTagSize) % (rhs >> kSmiTagSize)) << kSmiTagSize;
+      const intptr_t res = ((lhs >> kSmiTagSize) % (rhs >> kSmiTagSize))
+                           << kSmiTagSize;
       *reinterpret_cast<intptr_t*>(&FP[rA]) =
           (res < 0) ? ((rhs < 0) ? (res - rhs) : (res + rhs)) : res;
       pc++;
@@ -2010,8 +1975,8 @@
       const intptr_t shift_amount =
           (rhs >= kBitsPerWord) ? (kBitsPerWord - 1) : rhs;
       const intptr_t lhs = reinterpret_cast<intptr_t>(FP[rB]) >> kSmiTagSize;
-      *reinterpret_cast<intptr_t*>(&FP[rA]) =
-          (lhs >> shift_amount) << kSmiTagSize;
+      *reinterpret_cast<intptr_t*>(&FP[rA]) = (lhs >> shift_amount)
+                                              << kSmiTagSize;
       pc++;
     }
     DISPATCH();
@@ -2365,7 +2330,7 @@
     FP[rA] = Smi::New(static_cast<intptr_t>(value32));
     DISPATCH();
   }
-#else  // defined(ARCH_IS_64_BIT)
+#else   // defined(ARCH_IS_64_BIT)
   {
     BYTECODE(WriteIntoDouble, A_D);
     UNIMPLEMENTED();
@@ -2590,7 +2555,7 @@
 
     BYTECODE(ReturnTOS, 0);
     result = *SP;
-    // Fall through to the ReturnImpl.
+  // Fall through to the ReturnImpl.
 
   ReturnImpl:
     // Restore caller PC.
@@ -2732,8 +2697,7 @@
     BYTECODE(AllocateUninitializedContext, A_D);
     const uint16_t num_context_variables = rD;
     const intptr_t instance_size = Context::InstanceSize(num_context_variables);
-    const uword start =
-        thread->heap()->new_space()->TryAllocate(instance_size);
+    const uword start = thread->heap()->new_space()->TryAllocate(instance_size);
     if (LIKELY(start != 0)) {
       uword tags = 0;
       tags = RawObject::ClassIdTag::update(kContextCid, tags);
@@ -2780,8 +2744,7 @@
     if (LIKELY(start != 0)) {
       *reinterpret_cast<uword*>(start + Instance::tags_offset()) = tags;
       for (intptr_t current_offset = sizeof(RawInstance);
-           current_offset < instance_size;
-           current_offset += kWordSize) {
+           current_offset < instance_size; current_offset += kWordSize) {
         *reinterpret_cast<RawObject**>(start + current_offset) = null_value;
       }
       FP[rA] = reinterpret_cast<RawObject*>(start + kHeapObjectTag);
@@ -2792,9 +2755,9 @@
 
   {
     BYTECODE(Allocate, A_D);
-    SP[1] = 0;  // Space for the result.
+    SP[1] = 0;                  // Space for the result.
     SP[2] = LOAD_CONSTANT(rD);  // Class object.
-    SP[3] = null_value;  // Type arguments.
+    SP[3] = null_value;         // Type arguments.
     Exit(thread, FP, SP + 4, pc);
     NativeArguments args(thread, 2, SP + 2, SP + 1);
     INVOKE_RUNTIME(DRT_AllocateObject, args);
@@ -2812,8 +2775,7 @@
       const intptr_t type_args_offset = Bytecode::DecodeD(*pc);
       *reinterpret_cast<uword*>(start + Instance::tags_offset()) = tags;
       for (intptr_t current_offset = sizeof(RawInstance);
-           current_offset < instance_size;
-           current_offset += kWordSize) {
+           current_offset < instance_size; current_offset += kWordSize) {
         *reinterpret_cast<RawObject**>(start + current_offset) = null_value;
       }
       *reinterpret_cast<RawObject**>(start + type_args_offset) = type_args;
@@ -2838,10 +2800,10 @@
   {
     BYTECODE(CreateArrayOpt, A_B_C);
     const intptr_t length = Smi::Value(RAW_CAST(Smi, FP[rB]));
-    if (LIKELY(length <= Array::kMaxElements)) {
+    if (LIKELY(static_cast<uintptr_t>(length) <= Array::kMaxElements)) {
       const intptr_t fixed_size = sizeof(RawArray) + kObjectAlignment - 1;
       const intptr_t instance_size =
-          (fixed_size + length*kWordSize) & ~(kObjectAlignment - 1);
+          (fixed_size + length * kWordSize) & ~(kObjectAlignment - 1);
       const uword start =
           thread->heap()->new_space()->TryAllocate(instance_size);
       if (LIKELY(start != 0)) {
@@ -2899,15 +2861,13 @@
       } else {
         instance_cid_or_function = Smi::New(cid);
 
-        RawClass* instance_class =
-            thread->isolate()->class_table()->At(cid);
+        RawClass* instance_class = thread->isolate()->class_table()->At(cid);
         if (instance_class->ptr()->num_type_arguments_ < 0) {
           goto InstanceOfCallRuntime;
         } else if (instance_class->ptr()->num_type_arguments_ > 0) {
           instance_type_arguments = reinterpret_cast<RawTypeArguments**>(
-              instance
-                  ->ptr())[instance_class->ptr()
-                               ->type_arguments_field_offset_in_words_];
+              instance->ptr())[instance_class->ptr()
+                                   ->type_arguments_field_offset_in_words_];
         }
       }
 
@@ -2915,17 +2875,18 @@
            entries[0] != null_value;
            entries += SubtypeTestCache::kTestEntryLength) {
         if ((entries[SubtypeTestCache::kInstanceClassIdOrFunction] ==
-                instance_cid_or_function) &&
+             instance_cid_or_function) &&
             (entries[SubtypeTestCache::kInstanceTypeArguments] ==
-                instance_type_arguments) &&
+             instance_type_arguments) &&
             (entries[SubtypeTestCache::kInstantiatorTypeArguments] ==
-                instantiator_type_arguments)) {
+             instantiator_type_arguments)) {
           SP[-3] = entries[SubtypeTestCache::kTestResult];
           goto InstanceOfOk;
         }
       }
     }
 
+  // clang-format off
   InstanceOfCallRuntime:
     {
       SP[1] = instance;
@@ -2936,6 +2897,7 @@
       NativeArguments native_args(thread, 4, SP + 1, SP - 3);
       INVOKE_RUNTIME(DRT_Instanceof, native_args);
     }
+  // clang-format on
 
   InstanceOfOk:
     SP -= 3;
@@ -2988,15 +2950,13 @@
         } else {
           instance_cid_or_function = Smi::New(cid);
 
-          RawClass* instance_class =
-              thread->isolate()->class_table()->At(cid);
+          RawClass* instance_class = thread->isolate()->class_table()->At(cid);
           if (instance_class->ptr()->num_type_arguments_ < 0) {
             goto AssertAssignableCallRuntime;
           } else if (instance_class->ptr()->num_type_arguments_ > 0) {
             instance_type_arguments = reinterpret_cast<RawTypeArguments**>(
-                instance
-                    ->ptr())[instance_class->ptr()
-                                 ->type_arguments_field_offset_in_words_];
+                instance->ptr())[instance_class->ptr()
+                                     ->type_arguments_field_offset_in_words_];
           }
         }
 
@@ -3004,11 +2964,11 @@
              entries[0] != null_value;
              entries += SubtypeTestCache::kTestEntryLength) {
           if ((entries[SubtypeTestCache::kInstanceClassIdOrFunction] ==
-                  instance_cid_or_function) &&
+               instance_cid_or_function) &&
               (entries[SubtypeTestCache::kInstanceTypeArguments] ==
-                  instance_type_arguments) &&
+               instance_type_arguments) &&
               (entries[SubtypeTestCache::kInstantiatorTypeArguments] ==
-                  instantiator_type_arguments)) {
+               instantiator_type_arguments)) {
             if (true_value == entries[SubtypeTestCache::kTestResult]) {
               goto AssertAssignableOk;
             } else {
@@ -3360,7 +3320,7 @@
     pc += (lhs > rhs) ? 0 : 1;
     DISPATCH();
   }
-#else  // defined(ARCH_IS_64_BIT)
+#else   // defined(ARCH_IS_64_BIT)
   {
     BYTECODE(IfDEq, A_D);
     UNREACHABLE();
@@ -3677,9 +3637,8 @@
     pc = SavedCallerPC(FP);
 
     const bool has_dart_caller = (reinterpret_cast<uword>(pc) & 2) == 0;
-    const intptr_t argc = has_dart_caller
-                              ? Bytecode::DecodeArgc(pc[-1])
-                              : (reinterpret_cast<uword>(pc) >> 2);
+    const intptr_t argc = has_dart_caller ? Bytecode::DecodeArgc(pc[-1])
+                                          : (reinterpret_cast<uword>(pc) >> 2);
 
     SP = FrameArguments(FP, 0);
     RawObject** args = SP - argc;
diff --git a/runtime/vm/simulator_dbc.h b/runtime/vm/simulator_dbc.h
index 4e2f649..8acdbce 100644
--- a/runtime/vm/simulator_dbc.h
+++ b/runtime/vm/simulator_dbc.h
@@ -76,12 +76,11 @@
   uword get_pc() const { return reinterpret_cast<uword>(pc_); }
 
   enum IntrinsicId {
-#define V(test_class_name, test_function_name, enum_name, type, fp) \
-    k##enum_name##Intrinsic,
-  ALL_INTRINSICS_LIST(V)
-  GRAPH_INTRINSICS_LIST(V)
+#define V(test_class_name, test_function_name, enum_name, type, fp)            \
+  k##enum_name##Intrinsic,
+    ALL_INTRINSICS_LIST(V) GRAPH_INTRINSICS_LIST(V)
 #undef V
-    kIntrinsicCount,
+        kIntrinsicCount,
   };
 
   static bool IsSupportedIntrinsic(IntrinsicId id) {
@@ -136,7 +135,8 @@
                        RawObject** call_base,
                        RawObject** top,
                        uint32_t* pc,
-                       RawObject** FP, RawObject** SP);
+                       RawObject** FP,
+                       RawObject** SP);
 
   void InstanceCall1(Thread* thread,
                      RawICData* icdata,
@@ -145,7 +145,8 @@
                      RawArray** argdesc,
                      RawObjectPool** pp,
                      uint32_t** pc,
-                     RawObject*** FP, RawObject*** SP,
+                     RawObject*** FP,
+                     RawObject*** SP,
                      bool optimized);
 
   void InstanceCall2(Thread* thread,
@@ -155,13 +156,12 @@
                      RawArray** argdesc,
                      RawObjectPool** pp,
                      uint32_t** pc,
-                     RawObject*** FP, RawObject*** SP,
+                     RawObject*** FP,
+                     RawObject*** SP,
                      bool optimized);
 
   // Longjmp support for exceptions.
-  SimulatorSetjmpBuffer* last_setjmp_buffer() {
-    return last_setjmp_buffer_;
-  }
+  SimulatorSetjmpBuffer* last_setjmp_buffer() { return last_setjmp_buffer_; }
   void set_last_setjmp_buffer(SimulatorSetjmpBuffer* buffer) {
     last_setjmp_buffer_ = buffer;
   }
diff --git a/runtime/vm/simulator_mips.cc b/runtime/vm/simulator_mips.cc
index f42b3fa..f65b9ed 100644
--- a/runtime/vm/simulator_mips.cc
+++ b/runtime/vm/simulator_mips.cc
@@ -23,9 +23,13 @@
 
 namespace dart {
 
-DEFINE_FLAG(uint64_t, trace_sim_after, ULLONG_MAX,
+DEFINE_FLAG(uint64_t,
+            trace_sim_after,
+            ULLONG_MAX,
             "Trace simulator execution after instruction count reached.");
-DEFINE_FLAG(uint64_t, stop_sim_at, ULLONG_MAX,
+DEFINE_FLAG(uint64_t,
+            stop_sim_at,
+            ULLONG_MAX,
             "Instruction address or instruction count to stop simulator at.");
 
 
@@ -95,7 +99,9 @@
 
   static TokenPosition GetApproximateTokenIndex(const Code& code, uword pc);
 
-  static void PrintDartFrame(uword pc, uword fp, uword sp,
+  static void PrintDartFrame(uword pc,
+                             uword fp,
+                             uword sp,
                              const Function& function,
                              TokenPosition token_pos,
                              bool is_optimized,
@@ -118,8 +124,7 @@
 }
 
 
-SimulatorDebugger::~SimulatorDebugger() {
-}
+SimulatorDebugger::~SimulatorDebugger() {}
 
 
 void SimulatorDebugger::Stop(Instr* instr, const char* message) {
@@ -130,43 +135,23 @@
 
 static Register LookupCpuRegisterByName(const char* name) {
   static const char* kNames[] = {
-      "r0",  "r1",  "r2",  "r3",
-      "r4",  "r5",  "r6",  "r7",
-      "r8",  "r9",  "r10", "r11",
-      "r12", "r13", "r14", "r15",
-      "r16", "r17", "r18", "r19",
-      "r20", "r21", "r22", "r23",
-      "r24", "r25", "r26", "r27",
-      "r28", "r29", "r30", "r31",
+      "r0",  "r1",  "r2",  "r3",  "r4",  "r5",  "r6",  "r7",
+      "r8",  "r9",  "r10", "r11", "r12", "r13", "r14", "r15",
+      "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
+      "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
 
-      "zr",  "at",  "v0",  "v1",
-      "a0",  "a1",  "a2",  "a3",
-      "t0",  "t1",  "t2",  "t3",
-      "t4",  "t5",  "t6",  "t7",
-      "s0",  "s1",  "s2",  "s3",
-      "s4",  "s5",  "s6",  "s7",
-      "t8",  "t9",  "k0",  "k1",
-      "gp",  "sp",  "fp",  "ra"
-  };
+      "zr",  "at",  "v0",  "v1",  "a0",  "a1",  "a2",  "a3",
+      "t0",  "t1",  "t2",  "t3",  "t4",  "t5",  "t6",  "t7",
+      "s0",  "s1",  "s2",  "s3",  "s4",  "s5",  "s6",  "s7",
+      "t8",  "t9",  "k0",  "k1",  "gp",  "sp",  "fp",  "ra"};
   static const Register kRegisters[] = {
-      R0,  R1,  R2,  R3,
-      R4,  R5,  R6,  R7,
-      R8,  R9,  R10, R11,
-      R12, R13, R14, R15,
-      R16, R17, R18, R19,
-      R20, R21, R22, R23,
-      R24, R25, R26, R27,
-      R28, R29, R30, R31,
+      R0,  R1,  R2,  R3,  R4,  R5,  R6,  R7,  R8,  R9,  R10,
+      R11, R12, R13, R14, R15, R16, R17, R18, R19, R20, R21,
+      R22, R23, R24, R25, R26, R27, R28, R29, R30, R31,
 
-      ZR,  AT,  V0,  V1,
-      A0,  A1,  A2,  A3,
-      T0,  T1,  T2,  T3,
-      T4,  T5,  T6,  T7,
-      S0,  S1,  S2,  S3,
-      S4,  S5,  S6,  S7,
-      T8,  T9,  K0,  K1,
-      GP,  SP,  FP,  RA
-  };
+      ZR,  AT,  V0,  V1,  A0,  A1,  A2,  A3,  T0,  T1,  T2,
+      T3,  T4,  T5,  T6,  T7,  S0,  S1,  S2,  S3,  S4,  S5,
+      S6,  S7,  T8,  T9,  K0,  K1,  GP,  SP,  FP,  RA};
   ASSERT(ARRAY_SIZE(kNames) == ARRAY_SIZE(kRegisters));
   for (unsigned i = 0; i < ARRAY_SIZE(kNames); i++) {
     if (strcmp(kNames[i], name) == 0) {
@@ -256,7 +241,7 @@
 
 
 TokenPosition SimulatorDebugger::GetApproximateTokenIndex(const Code& code,
-                                                     uword pc) {
+                                                          uword pc) {
   TokenPosition token_pos = TokenPosition::kNoSource;
   uword pc_offset = pc - code.PayloadStart();
   const PcDescriptors& descriptors =
@@ -273,7 +258,9 @@
 }
 
 
-void SimulatorDebugger::PrintDartFrame(uword pc, uword fp, uword sp,
+void SimulatorDebugger::PrintDartFrame(uword pc,
+                                       uword fp,
+                                       uword sp,
                                        const Function& function,
                                        TokenPosition token_pos,
                                        bool is_optimized,
@@ -286,19 +273,15 @@
   if (token_pos.IsReal()) {
     script.GetTokenLocation(token_pos, &line, &column);
   }
-  OS::Print("pc=0x%" Px " fp=0x%" Px " sp=0x%" Px " %s%s (%s:%" Pd
-            ":%" Pd ")\n",
-            pc, fp, sp,
-            is_optimized ? (is_inlined ? "inlined " : "optimized ") : "",
-            func_name.ToCString(),
-            url.ToCString(),
-            line, column);
+  OS::Print(
+      "pc=0x%" Px " fp=0x%" Px " sp=0x%" Px " %s%s (%s:%" Pd ":%" Pd ")\n", pc,
+      fp, sp, is_optimized ? (is_inlined ? "inlined " : "optimized ") : "",
+      func_name.ToCString(), url.ToCString(), line, column);
 }
 
 
 void SimulatorDebugger::PrintBacktrace() {
-  StackFrameIterator frames(sim_->get_register(FP),
-                            sim_->get_register(SP),
+  StackFrameIterator frames(sim_->get_register(FP), sim_->get_register(SP),
                             sim_->get_pc(),
                             StackFrameIterator::kDontValidateFrames);
   StackFrame* frame = frames.NextFrame();
@@ -323,25 +306,25 @@
           uword unoptimized_pc = it.pc();
           it.Advance();
           if (!it.Done()) {
-            PrintDartFrame(unoptimized_pc, frame->fp(), frame->sp(),
-                           inlined_function,
-                           GetApproximateTokenIndex(unoptimized_code,
-                                                    unoptimized_pc),
-                           true, true);
+            PrintDartFrame(
+                unoptimized_pc, frame->fp(), frame->sp(), inlined_function,
+                GetApproximateTokenIndex(unoptimized_code, unoptimized_pc),
+                true, true);
           }
         }
         // Print the optimized inlining frame below.
       }
-      PrintDartFrame(frame->pc(), frame->fp(), frame->sp(),
-                     function,
+      PrintDartFrame(frame->pc(), frame->fp(), frame->sp(), function,
                      GetApproximateTokenIndex(code, frame->pc()),
                      code.is_optimized(), false);
     } else {
       OS::Print("pc=0x%" Px " fp=0x%" Px " sp=0x%" Px " %s frame\n",
                 frame->pc(), frame->fp(), frame->sp(),
-                frame->IsEntryFrame() ? "entry" :
-                    frame->IsExitFrame() ? "exit" :
-                        frame->IsStubFrame() ? "stub" : "invalid");
+                frame->IsEntryFrame()
+                    ? "entry"
+                    : frame->IsExitFrame()
+                          ? "exit"
+                          : frame->IsStubFrame() ? "stub" : "invalid");
     }
     frame = frames.NextFrame();
   }
@@ -436,24 +419,25 @@
                         "%" XSTR(ARG_SIZE) "s",
                         cmd, arg1, arg2);
       if ((strcmp(cmd, "h") == 0) || (strcmp(cmd, "help") == 0)) {
-        OS::Print("c/cont -- continue execution\n"
-                  "disasm -- disassemble instrs at current pc location\n"
-                  "  other variants are:\n"
-                  "    disasm <address>\n"
-                  "    disasm <address> <number_of_instructions>\n"
-                  "  by default 10 instrs are disassembled\n"
-                  "del -- delete breakpoints\n"
-                  "gdb -- transfer control to gdb\n"
-                  "h/help -- print this help string\n"
-                  "break <address> -- set break point at specified address\n"
-                  "p/print <reg or icount or value or *addr> -- print integer\n"
-                  "pf/printfloat <freg or *addr> -- print float value\n"
-                  "po/printobject <*reg or *addr> -- print object\n"
-                  "si/stepi -- single step an instruction\n"
-                  "trace -- toggle execution tracing mode\n"
-                  "bt -- print backtrace\n"
-                  "unstop -- if current pc is a stop instr make it a nop\n"
-                  "q/quit -- Quit the debugger and exit the program\n");
+        OS::Print(
+            "c/cont -- continue execution\n"
+            "disasm -- disassemble instrs at current pc location\n"
+            "  other variants are:\n"
+            "    disasm <address>\n"
+            "    disasm <address> <number_of_instructions>\n"
+            "  by default 10 instrs are disassembled\n"
+            "del -- delete breakpoints\n"
+            "gdb -- transfer control to gdb\n"
+            "h/help -- print this help string\n"
+            "break <address> -- set break point at specified address\n"
+            "p/print <reg or icount or value or *addr> -- print integer\n"
+            "pf/printfloat <freg or *addr> -- print float value\n"
+            "po/printobject <*reg or *addr> -- print object\n"
+            "si/stepi -- single step an instruction\n"
+            "trace -- toggle execution tracing mode\n"
+            "bt -- print backtrace\n"
+            "unstop -- if current pc is a stop instr make it a nop\n"
+            "q/quit -- Quit the debugger and exit the program\n");
       } else if ((strcmp(cmd, "quit") == 0) || (strcmp(cmd, "q") == 0)) {
         OS::Print("Quitting\n");
         OS::Exit(0);
@@ -478,14 +462,13 @@
         } else {
           OS::Print("print <reg or icount or value or *addr>\n");
         }
-      } else if ((strcmp(cmd, "pf") == 0) ||
-                 (strcmp(cmd, "printfloat") == 0)) {
+      } else if ((strcmp(cmd, "pf") == 0) || (strcmp(cmd, "printfloat") == 0)) {
         if (args == 2) {
           double dvalue;
           if (GetFValue(arg1, &dvalue)) {
             uint64_t long_value = bit_cast<uint64_t, double>(dvalue);
-            OS::Print("%s: %llu 0x%llx %.8g\n",
-                arg1, long_value, long_value, dvalue);
+            OS::Print("%s: %llu 0x%llx %.8g\n", arg1, long_value, long_value,
+                      dvalue);
           } else {
             OS::Print("%s unrecognized\n", arg1);
           }
@@ -498,8 +481,8 @@
           double dvalue;
           if (GetDValue(arg1, &dvalue)) {
             uint64_t long_value = bit_cast<uint64_t, double>(dvalue);
-            OS::Print("%s: %llu 0x%llx %.8g\n",
-                arg1, long_value, long_value, dvalue);
+            OS::Print("%s: %llu 0x%llx %.8g\n", arg1, long_value, long_value,
+                      dvalue);
           } else {
             OS::Print("%s unrecognized\n", arg1);
           }
@@ -516,8 +499,8 @@
             if (Isolate::Current()->heap()->Contains(value)) {
               OS::Print("%s: \n", arg1);
 #if defined(DEBUG)
-              const Object& obj = Object::Handle(
-                  reinterpret_cast<RawObject*>(value));
+              const Object& obj =
+                  Object::Handle(reinterpret_cast<RawObject*>(value));
               obj.Print();
 #endif  // defined(DEBUG)
             } else {
@@ -640,9 +623,7 @@
       return NULL;
     }
     intptr_t len = strlen(line_buf);
-    if (len > 1 &&
-        line_buf[len - 2] == '\\' &&
-        line_buf[len - 1] == '\n') {
+    if (len > 1 && line_buf[len - 2] == '\\' && line_buf[len - 1] == '\n') {
       // When we read a line that ends with a "\" we remove the escape and
       // append the remainder.
       line_buf[len - 2] = '\n';
@@ -688,8 +669,8 @@
 
 // Synchronization primitives support.
 Mutex* Simulator::exclusive_access_lock_ = NULL;
-Simulator::AddressTag Simulator::exclusive_access_state_[kNumAddressTags] =
-    {{NULL, 0}};
+Simulator::AddressTag Simulator::exclusive_access_state_[kNumAddressTags] = {
+    {NULL, 0}};
 int Simulator::next_address_tag_ = 0;
 
 
@@ -706,9 +687,9 @@
   // the size specified by the user and the buffer space needed for
   // handling stack overflow exceptions. To be safe in potential
   // stack underflows we also add some underflow buffer space.
-  stack_ = new char[(OSThread::GetSpecifiedStackSize() +
-                     OSThread::kStackSizeBuffer +
-                     kSimulatorStackUnderflowSize)];
+  stack_ =
+      new char[(OSThread::GetSpecifiedStackSize() + OSThread::kStackSizeBuffer +
+                kSimulatorStackUnderflowSize)];
   icount_ = 0;
   delay_slot_ = false;
   break_pc_ = NULL;
@@ -803,10 +784,9 @@
     Redirection* list_head = list_;
     do {
       next_ = list_head;
-      list_head = reinterpret_cast<Redirection*>(
-          AtomicOperations::CompareAndSwapWord(
-              reinterpret_cast<uword*>(&list_),
-              reinterpret_cast<uword>(next_),
+      list_head =
+          reinterpret_cast<Redirection*>(AtomicOperations::CompareAndSwapWord(
+              reinterpret_cast<uword*>(&list_), reinterpret_cast<uword>(next_),
               reinterpret_cast<uword>(this)));
     } while (list_head != next_);
   }
@@ -976,8 +956,8 @@
   // it will be possible to disassemble the code and inspect registers.
   char buffer[128];
   snprintf(buffer, sizeof(buffer),
-           "illegal memory access at 0x%" Px ", pc=0x%" Px "\n",
-           addr, fault_pc);
+           "illegal memory access at 0x%" Px ", pc=0x%" Px "\n", addr,
+           fault_pc);
   SimulatorDebugger dbg(this);
   dbg.Stop(instr, buffer);
   // The debugger will return control in non-interactive mode.
@@ -989,8 +969,8 @@
   // The debugger will not be able to single step past this instruction, but
   // it will be possible to disassemble the code and inspect registers.
   char buffer[128];
-  snprintf(buffer, sizeof(buffer),
-           "pc=%p, unaligned %s at 0x%" Px "\n",  instr, msg, addr);
+  snprintf(buffer, sizeof(buffer), "pc=%p, unaligned %s at 0x%" Px "\n", instr,
+           msg, addr);
   SimulatorDebugger dbg(this);
   dbg.Stop(instr, buffer);
   // The debugger will return control in non-interactive mode.
@@ -1004,7 +984,7 @@
   // To be safe in potential stack underflows we leave some buffer above and
   // set the stack top.
   return StackBase() +
-      (OSThread::GetSpecifiedStackSize() + OSThread::kStackSizeBuffer);
+         (OSThread::GetSpecifiedStackSize() + OSThread::kStackSizeBuffer);
 }
 
 
@@ -1212,8 +1192,10 @@
 typedef void (*SimulatorRuntimeCall)(NativeArguments arguments);
 
 // Calls to leaf Dart runtime functions are based on this interface.
-typedef int32_t (*SimulatorLeafRuntimeCall)(
-    int32_t r0, int32_t r1, int32_t r2, int32_t r3);
+typedef int32_t (*SimulatorLeafRuntimeCall)(int32_t r0,
+                                            int32_t r1,
+                                            int32_t r2,
+                                            int32_t r3);
 
 // Calls to leaf float Dart runtime functions are based on this interface.
 typedef double (*SimulatorLeafFloatRuntimeCall)(double d0, double d1);
@@ -1223,7 +1205,7 @@
 typedef void (*SimulatorNativeCall)(NativeArguments* arguments, uword target);
 
 
-void Simulator::DoBreak(Instr *instr) {
+void Simulator::DoBreak(Instr* instr) {
   ASSERT(instr->OpcodeField() == SPECIAL);
   ASSERT(instr->FunctionField() == BREAK);
   if (instr->BreakCodeField() == Instr::kStopMessageCode) {
@@ -1253,7 +1235,7 @@
       }
       if (redirection->call_kind() == kRuntimeCall) {
         NativeArguments arguments;
-        ASSERT(sizeof(NativeArguments) == 4*kWordSize);
+        ASSERT(sizeof(NativeArguments) == 4 * kWordSize);
         arguments.thread_ = reinterpret_cast<Thread*>(get_register(A0));
         arguments.argc_tag_ = get_register(A1);
         arguments.argv_ = reinterpret_cast<RawObject**>(get_register(A2));
@@ -1271,7 +1253,7 @@
         SimulatorLeafRuntimeCall target =
             reinterpret_cast<SimulatorLeafRuntimeCall>(external);
         a0 = target(a0, a1, a2, a3);
-        set_register(V0, a0);  // Set returned result from function.
+        set_register(V0, a0);       // Set returned result from function.
         set_register(V1, icount_);  // Zap second result register.
       } else if (redirection->call_kind() == kLeafFloatRuntimeCall) {
         ASSERT((0 <= redirection->argument_count()) &&
@@ -1424,7 +1406,7 @@
       ASSERT(instr->RsField() != instr->RdField());
       ASSERT(!delay_slot_);
       // Format(instr, "jalr'hint 'rd, rs");
-      set_register(instr->RdField(), pc_ + 2*Instr::kInstrSize);
+      set_register(instr->RdField(), pc_ + 2 * Instr::kInstrSize);
       uword next_pc = get_register(instr->RsField());
       ExecuteDelaySlot();
       // Set return address to be the instruction after the delay slot.
@@ -1547,8 +1529,7 @@
     }
     case SLL: {
       ASSERT(instr->RsField() == 0);
-      if ((instr->RdField() == R0) &&
-          (instr->RtField() == R0) &&
+      if ((instr->RdField() == R0) && (instr->RtField() == R0) &&
           (instr->SaField() == 0)) {
         // Format(instr, "nop");
         // Nothing to be done for NOP.
@@ -1745,14 +1726,14 @@
     case BGEZAL: {
       int32_t rs_val = get_register(instr->RsField());
       // Return address is one after the delay slot.
-      set_register(RA, pc_ + (2*Instr::kInstrSize));
+      set_register(RA, pc_ + (2 * Instr::kInstrSize));
       DoBranch(instr, rs_val >= 0, false);
       break;
     }
     case BLTZAL: {
       int32_t rs_val = get_register(instr->RsField());
       // Return address is one after the delay slot.
-      set_register(RA, pc_ + (2*Instr::kInstrSize));
+      set_register(RA, pc_ + (2 * Instr::kInstrSize));
       DoBranch(instr, rs_val < 0, false);
       break;
     }
@@ -1858,7 +1839,7 @@
         ASSERT(instr->FormatField() == FMT_D);  // Only D supported.
         ASSERT(instr->FdField() == F0);
         set_fcsr_bit(fcsr_cc,
-            (fs_val == ft_val) || isnan(fs_val) || isnan(ft_val));
+                     (fs_val == ft_val) || isnan(fs_val) || isnan(ft_val));
         break;
       }
       case COP1_C_OLT: {
@@ -1871,7 +1852,7 @@
         ASSERT(instr->FormatField() == FMT_D);  // Only D supported.
         ASSERT(instr->FdField() == F0);
         set_fcsr_bit(fcsr_cc,
-            (fs_val < ft_val) || isnan(fs_val) || isnan(ft_val));
+                     (fs_val < ft_val) || isnan(fs_val) || isnan(ft_val));
         break;
       }
       case COP1_C_OLE: {
@@ -1884,7 +1865,7 @@
         ASSERT(instr->FormatField() == FMT_D);  // Only D supported.
         ASSERT(instr->FdField() == F0);
         set_fcsr_bit(fcsr_cc,
-            (fs_val <= ft_val) || isnan(fs_val) || isnan(ft_val));
+                     (fs_val <= ft_val) || isnan(fs_val) || isnan(ft_val));
         break;
       }
       case COP1_TRUNC_W: {
@@ -2310,7 +2291,7 @@
     }
     default: {
       OS::PrintErr("Undecoded instruction: 0x%x at %p\n",
-                    instr->InstructionBits(), instr);
+                   instr->InstructionBits(), instr);
       UnimplementedInstruction(instr);
       break;
     }
@@ -2531,10 +2512,10 @@
   set_register(kExceptionObjectReg, bit_cast<int32_t>(raw_exception));
   set_register(kStackTraceObjectReg, bit_cast<int32_t>(raw_stacktrace));
   // Restore pool pointer.
-  int32_t code = *reinterpret_cast<int32_t*>(
-      fp + kPcMarkerSlotFromFp * kWordSize);
-  int32_t pp = *reinterpret_cast<int32_t*>(
-      code + Code::object_pool_offset() - kHeapObjectTag);
+  int32_t code =
+      *reinterpret_cast<int32_t*>(fp + kPcMarkerSlotFromFp * kWordSize);
+  int32_t pp = *reinterpret_cast<int32_t*>(code + Code::object_pool_offset() -
+                                           kHeapObjectTag);
   set_register(CODE_REG, code);
   set_register(PP, pp);
   buf->Longjmp();
diff --git a/runtime/vm/simulator_mips.h b/runtime/vm/simulator_mips.h
index 89b7273..d6b5323 100644
--- a/runtime/vm/simulator_mips.h
+++ b/runtime/vm/simulator_mips.h
@@ -58,9 +58,7 @@
   int64_t get_dregister_bits(DRegister freg) const;
   double get_dregister(DRegister freg) const;
 
-  int32_t get_sp() const {
-    return get_register(SPREG);
-  }
+  int32_t get_sp() const { return get_register(SPREG); }
 
   // Accessor for the pc.
   void set_pc(int32_t value) { pc_ = value; }
@@ -88,9 +86,7 @@
     }
   }
 
-  bool test_fcsr_bit(uint32_t cc) {
-    return fcsr_ & (1 << cc);
-  }
+  bool test_fcsr_bit(uint32_t cc) { return fcsr_ & (1 << cc); }
 
   // Accessors to the internal simulator stack base and top.
   uword StackBase() const { return reinterpret_cast<uword>(stack_); }
@@ -178,9 +174,7 @@
   int32_t break_instr_;
 
   // Illegal memory access support.
-  static bool IsIllegalAddress(uword addr) {
-    return addr < 64*1024;
-  }
+  static bool IsIllegalAddress(uword addr) { return addr < 64 * 1024; }
   void HandleIllegalAccess(uword addr, Instr* instr);
 
   // Read and write memory.
@@ -196,7 +190,7 @@
   inline int8_t ReadB(uword addr);
   inline uint8_t ReadBU(uword addr);
   inline int16_t ReadH(uword addr, Instr* instr);
-  inline uint16_t ReadHU(uword addr, Instr *instr);
+  inline uint16_t ReadHU(uword addr, Instr* instr);
   inline intptr_t ReadW(uword addr, Instr* instr);
 
   inline void WriteB(uword addr, uint8_t value);
@@ -238,7 +232,7 @@
   static bool HasExclusiveAccessAndOpen(uword addr);
 
   void DoBranch(Instr* instr, bool taken, bool likely);
-  void DoBreak(Instr *instr);
+  void DoBreak(Instr* instr);
 
   void DecodeSpecial(Instr* instr);
   void DecodeSpecial2(Instr* instr);
@@ -253,9 +247,7 @@
   bool IsTracingExecution() const;
 
   // Longjmp support for exceptions.
-  SimulatorSetjmpBuffer* last_setjmp_buffer() {
-    return last_setjmp_buffer_;
-  }
+  SimulatorSetjmpBuffer* last_setjmp_buffer() { return last_setjmp_buffer_; }
   void set_last_setjmp_buffer(SimulatorSetjmpBuffer* buffer) {
     last_setjmp_buffer_ = buffer;
   }
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc
index 08cf77c..427a196 100644
--- a/runtime/vm/snapshot.cc
+++ b/runtime/vm/snapshot.cc
@@ -22,9 +22,9 @@
 #include "vm/version.h"
 
 // We currently only expect the Dart mutator to read snapshots.
-#define ASSERT_NO_SAFEPOINT_SCOPE()                            \
-    isolate()->AssertCurrentThreadIsMutator();                 \
-    ASSERT(thread()->no_safepoint_scope_depth() != 0)
+#define ASSERT_NO_SAFEPOINT_SCOPE()                                            \
+  isolate()->AssertCurrentThreadIsMutator();                                   \
+  ASSERT(thread()->no_safepoint_scope_depth() != 0)
 
 namespace dart {
 
@@ -60,10 +60,8 @@
   // Return whether this class is serialized in two steps: first a reference,
   // with sufficient information to allocate a correctly sized object, and then
   // later inline with complete contents.
-  return class_id >= kNumPredefinedCids ||
-         class_id == kArrayCid ||
-         class_id == kImmutableArrayCid ||
-         class_id == kObjectPoolCid ||
+  return class_id >= kNumPredefinedCids || class_id == kArrayCid ||
+         class_id == kImmutableArrayCid || class_id == kObjectPoolCid ||
          RawObject::IsImplicitFieldClassId(class_id);
 }
 
@@ -84,26 +82,38 @@
 
 static RawType* GetType(ObjectStore* object_store, intptr_t index) {
   switch (index) {
-    case kObjectType: return object_store->object_type();
-    case kNullType: return object_store->null_type();
-    case kFunctionType: return object_store->function_type();
-    case kNumberType: return object_store->number_type();
-    case kSmiType: return object_store->smi_type();
-    case kMintType: return object_store->mint_type();
-    case kDoubleType: return object_store->double_type();
-    case kIntType: return object_store->int_type();
-    case kBoolType: return object_store->bool_type();
-    case kStringType: return object_store->string_type();
-    case kArrayType: return object_store->array_type();
-    default: break;
+    case kObjectType:
+      return object_store->object_type();
+    case kNullType:
+      return object_store->null_type();
+    case kFunctionType:
+      return object_store->function_type();
+    case kNumberType:
+      return object_store->number_type();
+    case kSmiType:
+      return object_store->smi_type();
+    case kMintType:
+      return object_store->mint_type();
+    case kDoubleType:
+      return object_store->double_type();
+    case kIntType:
+      return object_store->int_type();
+    case kBoolType:
+      return object_store->bool_type();
+    case kStringType:
+      return object_store->string_type();
+    case kArrayType:
+      return object_store->array_type();
+    default:
+      break;
   }
   UNREACHABLE();
   return Type::null();
 }
 
 
-static intptr_t GetTypeIndex(
-    ObjectStore* object_store, const RawType* raw_type) {
+static intptr_t GetTypeIndex(ObjectStore* object_store,
+                             const RawType* raw_type) {
   ASSERT(raw_type->IsHeapObject());
   if (raw_type == object_store->object_type()) {
     return kObjectType;
@@ -132,6 +142,27 @@
 }
 
 
+const char* Snapshot::KindToCString(Kind kind) {
+  switch (kind) {
+    case kCore:
+      return "core";
+    case kScript:
+      return "script";
+    case kMessage:
+      return "message";
+    case kAppWithJIT:
+      return "app-jit";
+    case kAppNoJIT:
+      return "app-aot";
+    case kNone:
+      return "none";
+    case kInvalid:
+    default:
+      return "invalid";
+  }
+}
+
+
 // TODO(5411462): Temporary setup of snapshot for testing purposes,
 // the actual creation of a snapshot maybe done differently.
 const Snapshot* Snapshot::SetupFromBuffer(const void* raw_memory) {
@@ -163,12 +194,11 @@
 }
 
 
-SnapshotReader::SnapshotReader(
-    const uint8_t* buffer,
-    intptr_t size,
-    Snapshot::Kind kind,
-    ZoneGrowableArray<BackRefNode>* backward_refs,
-    Thread* thread)
+SnapshotReader::SnapshotReader(const uint8_t* buffer,
+                               intptr_t size,
+                               Snapshot::Kind kind,
+                               ZoneGrowableArray<BackRefNode>* backward_refs,
+                               Thread* thread)
     : BaseReader(buffer, size),
       kind_(kind),
       thread_(thread),
@@ -191,10 +221,10 @@
       function_(Function::Handle(zone_)),
       error_(UnhandledException::Handle(zone_)),
       max_vm_isolate_object_id_(
-          (Snapshot::IsFull(kind)) ?
-              Object::vm_isolate_snapshot_object_table().Length() : 0),
-      backward_references_(backward_refs) {
-}
+          (Snapshot::IsFull(kind))
+              ? Object::vm_isolate_snapshot_object_table().Length()
+              : 0),
+      backward_references_(backward_refs) {}
 
 
 RawObject* SnapshotReader::ReadObject() {
@@ -327,8 +357,8 @@
 
 
 intptr_t SnapshotReader::NextAvailableObjectId() const {
-  return backward_references_->length() +
-      kMaxPredefinedObjectIds + max_vm_isolate_object_id_;
+  return backward_references_->length() + kMaxPredefinedObjectIds +
+         max_vm_isolate_object_id_;
 }
 
 
@@ -338,10 +368,8 @@
   args.SetAt(0, error_str);
   Object& result = Object::Handle(zone());
   const Library& library = Library::Handle(zone(), Library::CoreLibrary());
-  result = DartLibraryCalls::InstanceCreate(library,
-                                            Symbols::ArgumentError(),
-                                            Symbols::Dot(),
-                                            args);
+  result = DartLibraryCalls::InstanceCreate(library, Symbols::ArgumentError(),
+                                            Symbols::Dot(), args);
   const Stacktrace& stacktrace = Stacktrace::Handle(zone());
   const UnhandledException& error = UnhandledException::Handle(
       zone(), UnhandledException::New(Instance::Cast(result), stacktrace));
@@ -367,10 +395,8 @@
     return NewInteger(header_value);
   }
   ASSERT((header_value <= kIntptrMax) && (header_value >= kIntptrMin));
-  return ReadObjectImpl(static_cast<intptr_t>(header_value),
-                        as_reference,
-                        patch_object_id,
-                        patch_offset);
+  return ReadObjectImpl(static_cast<intptr_t>(header_value), as_reference,
+                        patch_object_id, patch_offset);
 }
 
 
@@ -383,8 +409,7 @@
   }
   if (SerializedHeaderTag::decode(header_value) == kObjectId) {
     return ReadIndexedObject(SerializedHeaderData::decode(header_value),
-                             patch_object_id,
-                             patch_offset);
+                             patch_object_id, patch_offset);
   }
   ASSERT(SerializedHeaderTag::decode(header_value) == kInlined);
   intptr_t object_id = SerializedHeaderData::decode(header_value);
@@ -410,24 +435,22 @@
   intptr_t class_id = LookupInternalClass(class_header);
   switch (class_id) {
 #define SNAPSHOT_READ(clazz)                                                   \
-    case clazz::kClassId: {                                                    \
-      pobj_ = clazz::ReadFrom(this, object_id, tags, kind_, read_as_reference);\
-      break;                                                                   \
-    }
+  case clazz::kClassId: {                                                      \
+    pobj_ = clazz::ReadFrom(this, object_id, tags, kind_, read_as_reference);  \
+    break;                                                                     \
+  }
     CLASS_LIST_NO_OBJECT(SNAPSHOT_READ)
 #undef SNAPSHOT_READ
-#define SNAPSHOT_READ(clazz)                                                   \
-        case kTypedData##clazz##Cid:                                           \
+#define SNAPSHOT_READ(clazz) case kTypedData##clazz##Cid:
 
     CLASS_LIST_TYPED_DATA(SNAPSHOT_READ) {
       tags = RawObject::ClassIdTag::update(class_id, tags);
-      pobj_ = TypedData::ReadFrom(
-          this, object_id, tags, kind_, read_as_reference);
+      pobj_ =
+          TypedData::ReadFrom(this, object_id, tags, kind_, read_as_reference);
       break;
     }
 #undef SNAPSHOT_READ
-#define SNAPSHOT_READ(clazz)                                                   \
-    case kExternalTypedData##clazz##Cid:                                       \
+#define SNAPSHOT_READ(clazz) case kExternalTypedData##clazz##Cid:
 
     CLASS_LIST_TYPED_DATA(SNAPSHOT_READ) {
       tags = RawObject::ClassIdTag::update(class_id, tags);
@@ -435,7 +458,9 @@
       break;
     }
 #undef SNAPSHOT_READ
-    default: UNREACHABLE(); break;
+    default:
+      UNREACHABLE();
+      break;
   }
   if (!read_as_reference) {
     AddPatchRecord(object_id, patch_object_id, patch_offset);
@@ -488,8 +513,7 @@
       pobj_ = ReadObjectImpl(read_as_reference);
       result->SetFieldAtOffset(offset, pobj_);
       if ((offset != type_argument_field_offset) &&
-          (kind_ == Snapshot::kMessage) &&
-          FLAG_use_field_guards) {
+          (kind_ == Snapshot::kMessage) && FLAG_use_field_guards) {
         // TODO(fschneider): Consider hoisting these lookups out of the loop.
         // This would involve creating a handle, since cls_ can't be reused
         // across the call to ReadObjectImpl.
@@ -543,11 +567,9 @@
  public:
   HeapLocker(Thread* thread, PageSpace* page_space)
       : StackResource(thread), page_space_(page_space) {
-        page_space_->AcquireDataLock();
+    page_space_->AcquireDataLock();
   }
-  ~HeapLocker() {
-    page_space_->ReleaseDataLock();
-  }
+  ~HeapLocker() { page_space_->ReleaseDataLock(); }
 
  private:
   PageSpace* page_space_;
@@ -569,8 +591,7 @@
     if (!obj_.IsError()) {
       const intptr_t kMessageBufferSize = 128;
       char message_buffer[kMessageBufferSize];
-      OS::SNPrint(message_buffer,
-                  kMessageBufferSize,
+      OS::SNPrint(message_buffer, kMessageBufferSize,
                   "Invalid object %s found in script snapshot",
                   obj_.ToCString());
       const String& msg = String::Handle(String::New(message_buffer));
@@ -591,8 +612,7 @@
   if (PendingBytes() < version_len) {
     const intptr_t kMessageBufferSize = 128;
     char message_buffer[kMessageBufferSize];
-    OS::SNPrint(message_buffer,
-                kMessageBufferSize,
+    OS::SNPrint(message_buffer, kMessageBufferSize,
                 "No full snapshot version found, expected '%s'",
                 expected_version);
     // This can also fail while bringing up the VM isolate, so make sure to
@@ -607,11 +627,9 @@
     const intptr_t kMessageBufferSize = 256;
     char message_buffer[kMessageBufferSize];
     char* actual_version = OS::StrNDup(version, version_len);
-    OS::SNPrint(message_buffer,
-                kMessageBufferSize,
+    OS::SNPrint(message_buffer, kMessageBufferSize,
                 "Wrong %s snapshot version, expected '%s' found '%s'",
-                (Snapshot::IsFull(kind_)) ? "full" : "script",
-                expected_version,
+                (Snapshot::IsFull(kind_)) ? "full" : "script", expected_version,
                 actual_version);
     free(actual_version);
     // This can also fail while bringing up the VM isolate, so make sure to
@@ -632,13 +650,11 @@
       strncmp(features, expected_features, expected_len)) {
     const intptr_t kMessageBufferSize = 256;
     char message_buffer[kMessageBufferSize];
-    char* actual_features = OS::StrNDup(features, buffer_len < 128 ? buffer_len
-                                                                   : 128);
-    OS::SNPrint(message_buffer,
-                kMessageBufferSize,
+    char* actual_features =
+        OS::StrNDup(features, buffer_len < 128 ? buffer_len : 128);
+    OS::SNPrint(message_buffer, kMessageBufferSize,
                 "Wrong features in snapshot, expected '%s' found '%s'",
-                expected_features,
-                actual_features);
+                expected_features, actual_features);
     free(const_cast<char*>(expected_features));
     free(actual_features);
     // This can also fail while bringing up the VM isolate, so make sure to
@@ -694,8 +710,7 @@
 
 static void EnsureIdentifier(char* label) {
   for (char c = *label; c != '\0'; c = *++label) {
-    if (((c >= 'a') && (c <= 'z')) ||
-        ((c >= 'A') && (c <= 'Z')) ||
+    if (((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')) ||
         ((c >= '0') && (c <= '9'))) {
       continue;
     }
@@ -710,8 +725,8 @@
                                        intptr_t isolate_length) {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
-  NOT_IN_PRODUCT(TimelineDurationScope tds(thread,
-      Timeline::GetIsolateStream(), "WriteInstructions"));
+  NOT_IN_PRODUCT(TimelineDurationScope tds(thread, Timeline::GetIsolateStream(),
+                                           "WriteInstructions"));
 
   // Handlify collected raw pointers as building the names below
   // will allocate on the Dart heap.
@@ -770,8 +785,7 @@
       beginning += sizeof(uword);
 
       for (uword* cursor = reinterpret_cast<uword*>(beginning);
-           cursor < reinterpret_cast<uword*>(entry);
-           cursor++) {
+           cursor < reinterpret_cast<uword*>(entry); cursor++) {
         WriteWordLiteralText(*cursor);
       }
     }
@@ -785,8 +799,8 @@
       str = Class::Cast(owner).Name();
       const char* name = str.ToCString();
       EnsureIdentifier(const_cast<char*>(name));
-      assembly_stream_.Print("Precompiled_AllocationStub_%s_%" Pd ":\n",
-                             name, i);
+      assembly_stream_.Print("Precompiled_AllocationStub_%s_%" Pd ":\n", name,
+                             i);
     } else if (owner.IsFunction()) {
       const char* name = Function::Cast(owner).ToQualifiedCString();
       EnsureIdentifier(const_cast<char*>(name));
@@ -800,7 +814,7 @@
       NoSafepointScope no_safepoint;
       uword beginning = reinterpret_cast<uword>(insns.raw()) - kHeapObjectTag;
       uword entry = beginning + Instructions::HeaderSize();
-      uword payload_size = insns.size();
+      uword payload_size = insns.Size();
       payload_size = Utils::RoundUp(payload_size, OS::PreferredCodeAlignment());
       uword end = entry + payload_size;
 
@@ -809,8 +823,7 @@
       ASSERT(Utils::IsAligned(end, sizeof(uint64_t)));
 
       for (uword* cursor = reinterpret_cast<uword*>(entry);
-           cursor < reinterpret_cast<uword*>(end);
-           cursor++) {
+           cursor < reinterpret_cast<uword*>(end); cursor++) {
         WriteWordLiteralText(*cursor);
       }
     }
@@ -847,8 +860,7 @@
     WriteWordLiteralData(marked_tags);
     start += sizeof(uword);
     for (uword* cursor = reinterpret_cast<uword*>(start);
-         cursor < reinterpret_cast<uword*>(end);
-         cursor++) {
+         cursor < reinterpret_cast<uword*>(end); cursor++) {
       WriteWordLiteralData(*cursor);
     }
   }
@@ -876,8 +888,8 @@
                                    intptr_t isolate_length) {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
-  NOT_IN_PRODUCT(TimelineDurationScope tds(thread,
-      Timeline::GetIsolateStream(), "WriteInstructions"));
+  NOT_IN_PRODUCT(TimelineDurationScope tds(thread, Timeline::GetIsolateStream(),
+                                           "WriteInstructions"));
 
   // Handlify collected raw pointers as building the names below
   // will allocate on the Dart heap.
@@ -923,8 +935,7 @@
       beginning += sizeof(uword);
 
       for (uword* cursor = reinterpret_cast<uword*>(beginning);
-           cursor < reinterpret_cast<uword*>(entry);
-           cursor++) {
+           cursor < reinterpret_cast<uword*>(entry); cursor++) {
         instructions_blob_stream_.WriteWord(*cursor);
       }
     }
@@ -934,7 +945,7 @@
       NoSafepointScope no_safepoint;
       uword beginning = reinterpret_cast<uword>(insns.raw()) - kHeapObjectTag;
       uword entry = beginning + Instructions::HeaderSize();
-      uword payload_size = insns.size();
+      uword payload_size = insns.Size();
       payload_size = Utils::RoundUp(payload_size, OS::PreferredCodeAlignment());
       uword end = entry + payload_size;
 
@@ -943,8 +954,7 @@
       ASSERT(Utils::IsAligned(end, sizeof(uint64_t)));
 
       for (uword* cursor = reinterpret_cast<uword*>(entry);
-           cursor < reinterpret_cast<uword*>(end);
-           cursor++) {
+           cursor < reinterpret_cast<uword*>(end); cursor++) {
         instructions_blob_stream_.WriteWord(*cursor);
       }
     }
@@ -971,8 +981,7 @@
     rodata_blob_stream_.WriteWord(marked_tags);
     start += sizeof(uword);
     for (uword* cursor = reinterpret_cast<uword*>(start);
-         cursor < reinterpret_cast<uword*>(end);
-         cursor++) {
+         cursor < reinterpret_cast<uword*>(end); cursor++) {
       rodata_blob_stream_.WriteWord(*cursor);
     }
   }
@@ -988,9 +997,8 @@
 RawObject* InstructionsReader::GetObjectAt(int32_t offset) {
   ASSERT(Utils::IsAligned(offset, kWordSize));
 
-  RawObject* result =
-      reinterpret_cast<RawObject*>(
-          reinterpret_cast<uword>(data_buffer_) + offset + kHeapObjectTag);
+  RawObject* result = reinterpret_cast<RawObject*>(
+      reinterpret_cast<uword>(data_buffer_) + offset + kHeapObjectTag);
   ASSERT(result->IsMarked());
 
   return result;
@@ -1015,7 +1023,7 @@
 #define READ_VM_SINGLETON_OBJ(id, obj)                                         \
   if (object_id == id) {                                                       \
     return obj;                                                                \
-  }                                                                            \
+  }
 
 RawObject* SnapshotReader::ReadVMIsolateObject(intptr_t header_value) {
   intptr_t object_id = GetVMIsolateObjectId(header_value);
@@ -1134,7 +1142,7 @@
         // First we replace the back ref table with the canonical object.
         *objref = newobj.raw();
         // Now we go over all the patch records and patch the canonical object.
-        for (intptr_t j = 0; j < patches->length(); j+=2) {
+        for (intptr_t j = 0; j < patches->length(); j += 2) {
           NoSafepointScope no_safepoint;
           intptr_t patch_object_id = (*patches)[j];
           intptr_t patch_offset = (*patches)[j + 1];
@@ -1161,18 +1169,16 @@
   // Setup the object fields.
   const intptr_t typeargs_offset =
       GrowableObjectArray::type_arguments_offset() / kWordSize;
-  *TypeArgumentsHandle() ^= ReadObjectImpl(kAsInlinedObject,
-                                           object_id,
-                                           typeargs_offset);
+  *TypeArgumentsHandle() ^=
+      ReadObjectImpl(kAsInlinedObject, object_id, typeargs_offset);
   result.SetTypeArguments(*TypeArgumentsHandle());
 
   bool as_reference = RawObject::IsCanonical(tags) ? false : true;
   intptr_t offset = result.raw_ptr()->data() -
-      reinterpret_cast<RawObject**>(result.raw()->ptr());
+                    reinterpret_cast<RawObject**>(result.raw()->ptr());
   for (intptr_t i = 0; i < len; i++) {
-    *PassiveObjectHandle() = ReadObjectImpl(as_reference,
-                                            object_id,
-                                            (i + offset));
+    *PassiveObjectHandle() =
+        ReadObjectImpl(as_reference, object_id, (i + offset));
     result.SetAt(i, *PassiveObjectHandle());
   }
 }
@@ -1185,8 +1191,7 @@
                      size,
                      Snapshot::kScript,
                      new ZoneGrowableArray<BackRefNode>(kNumInitialReferences),
-                     thread) {
-}
+                     thread) {}
 
 
 ScriptSnapshotReader::~ScriptSnapshotReader() {
@@ -1201,8 +1206,7 @@
                      size,
                      Snapshot::kMessage,
                      new ZoneGrowableArray<BackRefNode>(kNumInitialReferences),
-                     thread) {
-}
+                     thread) {}
 
 
 MessageSnapshotReader::~MessageSnapshotReader() {
@@ -1247,21 +1251,21 @@
   V(Mint)                                                                      \
   V(Bigint)                                                                    \
   V(Double)                                                                    \
-  V(ImmutableArray)                                                            \
+  V(ImmutableArray)
 
 #define VM_OBJECT_WRITE(clazz)                                                 \
   case clazz::kClassId: {                                                      \
     object_id = forward_list_->AddObject(zone(), rawobj, kIsSerialized);       \
     Raw##clazz* raw_obj = reinterpret_cast<Raw##clazz*>(rawobj);               \
-        raw_obj->WriteTo(this, object_id, kind(), false);                      \
+    raw_obj->WriteTo(this, object_id, kind(), false);                          \
     return true;                                                               \
-  }                                                                            \
+  }
 
 #define WRITE_VM_SINGLETON_OBJ(obj, id)                                        \
   if (rawobj == obj) {                                                         \
     WriteVMIsolateObject(id);                                                  \
     return true;                                                               \
-  }                                                                            \
+  }
 
 bool SnapshotWriter::HandleVMIsolateObject(RawObject* rawobj) {
   // Check if it is one of the singleton VM objects.
@@ -1353,15 +1357,13 @@
 // objects and their accompanying token streams.
 class ScriptVisitor : public ObjectVisitor {
  public:
-  explicit ScriptVisitor(Thread* thread) :
-      objHandle_(Object::Handle(thread->zone())),
-      count_(0),
-      scripts_(NULL) {}
+  explicit ScriptVisitor(Thread* thread)
+      : objHandle_(Object::Handle(thread->zone())), count_(0), scripts_(NULL) {}
 
-  ScriptVisitor(Thread* thread, const Array* scripts) :
-      objHandle_(Object::Handle(thread->zone())),
-      count_(0),
-      scripts_(scripts) {}
+  ScriptVisitor(Thread* thread, const Array* scripts)
+      : objHandle_(Object::Handle(thread->zone())),
+        count_(0),
+        scripts_(scripts) {}
 
   void VisitObject(RawObject* obj) {
     if (obj->IsScript()) {
@@ -1533,16 +1535,15 @@
   }
   switch (class_id) {
 #define SNAPSHOT_WRITE(clazz)                                                  \
-    case clazz::kClassId: {                                                    \
-      Raw##clazz* raw_obj = reinterpret_cast<Raw##clazz*>(raw);                \
-          raw_obj->WriteTo(this, object_id, kind_, as_reference);              \
-      return;                                                                  \
-    }                                                                          \
+  case clazz::kClassId: {                                                      \
+    Raw##clazz* raw_obj = reinterpret_cast<Raw##clazz*>(raw);                  \
+    raw_obj->WriteTo(this, object_id, kind_, as_reference);                    \
+    return;                                                                    \
+  }
 
     CLASS_LIST_NO_OBJECT(SNAPSHOT_WRITE)
 #undef SNAPSHOT_WRITE
-#define SNAPSHOT_WRITE(clazz)                                                  \
-    case kTypedData##clazz##Cid:                                               \
+#define SNAPSHOT_WRITE(clazz) case kTypedData##clazz##Cid:
 
     CLASS_LIST_TYPED_DATA(SNAPSHOT_WRITE) {
       RawTypedData* raw_obj = reinterpret_cast<RawTypedData*>(raw);
@@ -1550,17 +1551,17 @@
       return;
     }
 #undef SNAPSHOT_WRITE
-#define SNAPSHOT_WRITE(clazz)                                                  \
-    case kExternalTypedData##clazz##Cid:                                       \
+#define SNAPSHOT_WRITE(clazz) case kExternalTypedData##clazz##Cid:
 
     CLASS_LIST_TYPED_DATA(SNAPSHOT_WRITE) {
       RawExternalTypedData* raw_obj =
-        reinterpret_cast<RawExternalTypedData*>(raw);
+          reinterpret_cast<RawExternalTypedData*>(raw);
       raw_obj->WriteTo(this, object_id, kind_, as_reference);
       return;
     }
 #undef SNAPSHOT_WRITE
-    default: break;
+    default:
+      break;
   }
 
   const Object& obj = Object::Handle(raw);
@@ -1592,18 +1593,17 @@
 
 
 void ForwardList::SerializeAll(ObjectVisitor* writer) {
-  // Write out all objects that were added to the forward list and have
-  // not been serialized yet. These would typically be fields of instance
-  // objects, arrays or immutable arrays (this is done in order to avoid
-  // deep recursive calls to WriteObjectImpl).
-  // NOTE: The forward list might grow as we process the list.
+// Write out all objects that were added to the forward list and have
+// not been serialized yet. These would typically be fields of instance
+// objects, arrays or immutable arrays (this is done in order to avoid
+// deep recursive calls to WriteObjectImpl).
+// NOTE: The forward list might grow as we process the list.
 #ifdef DEBUG
   for (intptr_t i = first_object_id(); i < first_unprocessed_object_id_; ++i) {
     ASSERT(NodeForObjectId(i)->is_serialized());
   }
 #endif  // DEBUG
-  for (intptr_t id = first_unprocessed_object_id_;
-       id < next_object_id();
+  for (intptr_t id = first_unprocessed_object_id_; id < next_object_id();
        ++id) {
     if (!NodeForObjectId(id)->is_serialized()) {
       // Write the object out in the stream.
@@ -1633,10 +1633,11 @@
 
 void SnapshotWriter::WriteFunctionId(RawFunction* func, bool owner_is_class) {
   ASSERT(kind_ == Snapshot::kScript);
-  RawClass* cls = (owner_is_class) ?
-      reinterpret_cast<RawClass*>(func->ptr()->owner_) :
-      reinterpret_cast<RawPatchClass*>(
-          func->ptr()->owner_)->ptr()->patched_class_;
+  RawClass* cls = (owner_is_class)
+                      ? reinterpret_cast<RawClass*>(func->ptr()->owner_)
+                      : reinterpret_cast<RawPatchClass*>(func->ptr()->owner_)
+                            ->ptr()
+                            ->patched_class_;
 
   // Write out the library url and class name.
   RawLibrary* library = cls->ptr()->library_;
@@ -1730,7 +1731,8 @@
   ASSERT(!errorFunc.IsNull());
 
   // All other closures are errors.
-  char* chars = OS::SCreate(thread()->zone(),
+  char* chars = OS::SCreate(
+      thread()->zone(),
       "Illegal argument in isolate message : (object is a closure - %s)",
       errorFunc.ToCString());
   SetWriteException(Exceptions::kArgument, chars);
@@ -1756,9 +1758,9 @@
     HANDLESCOPE(thread());
     const Class& clazz = Class::Handle(zone(), cls);
     char* chars = OS::SCreate(thread()->zone(),
-        "Illegal argument in isolate message"
-        " : (object extends NativeWrapper - %s)",
-        clazz.ToCString());
+                              "Illegal argument in isolate message"
+                              " : (object extends NativeWrapper - %s)",
+                              clazz.ToCString());
     SetWriteException(Exceptions::kArgument, chars);
   }
 }
@@ -1769,8 +1771,7 @@
   set_exception_type(type);
   set_exception_msg(msg);
   // The more specific error is set up in SnapshotWriter::ThrowException().
-  thread()->long_jump_base()->
-      Jump(1, Object::snapshot_writer_error());
+  thread()->long_jump_base()->Jump(1, Object::snapshot_writer_error());
 }
 
 
@@ -1797,8 +1798,8 @@
     // Write out the class information for this object.
     WriteObjectImpl(cls, kAsInlinedObject);
   } else {
-    intptr_t next_field_offset =
-        cls->ptr()->next_field_offset_in_words_ << kWordSizeLog2;
+    intptr_t next_field_offset = cls->ptr()->next_field_offset_in_words_
+                                 << kWordSizeLog2;
     ASSERT(next_field_offset > 0);
 
     // Write out the serialization header value for this object.
@@ -1877,8 +1878,7 @@
 }
 
 
-ScriptSnapshotWriter::ScriptSnapshotWriter(uint8_t** buffer,
-                                           ReAlloc alloc)
+ScriptSnapshotWriter::ScriptSnapshotWriter(uint8_t** buffer, ReAlloc alloc)
     : SnapshotWriter(Thread::Current(),
                      Snapshot::kScript,
                      buffer,
diff --git a/runtime/vm/snapshot.h b/runtime/vm/snapshot.h
index 924f61c..7bc946f 100644
--- a/runtime/vm/snapshot.h
+++ b/runtime/vm/snapshot.h
@@ -109,7 +109,7 @@
 // - Object that is seen for the first time (inlined in the stream):
 //   (a unique id for this object | 0x1)
 enum SerializedHeaderType {
-  kInlined  = 0x1,
+  kInlined = 0x1,
   kObjectId = 0x3,
 };
 static const int8_t kHeaderTagBits = 2;
@@ -120,12 +120,13 @@
 static const intptr_t kInvalidPatchIndex = -1;
 
 
-class SerializedHeaderTag :
-    public BitField<intptr_t, enum SerializedHeaderType, 0, kHeaderTagBits> {};
+class SerializedHeaderTag
+    : public BitField<intptr_t, enum SerializedHeaderType, 0, kHeaderTagBits> {
+};
 
 
-class SerializedHeaderData :
-    public BitField<intptr_t, intptr_t, kHeaderTagBits, kObjectIdBits> {};
+class SerializedHeaderData
+    : public BitField<intptr_t, intptr_t, kHeaderTagBits, kObjectIdBits> {};
 
 
 enum DeserializeState {
@@ -164,6 +165,7 @@
     kNone,        // dart_bootstrap/gen_snapshot
     kInvalid
   };
+  static const char* KindToCString(Kind kind);
 
   static const int kHeaderSize = 2 * sizeof(int64_t);
   static const int kLengthIndex = 0;
@@ -192,9 +194,7 @@
   static intptr_t length_offset() {
     return OFFSET_OF(Snapshot, unaligned_length_);
   }
-  static intptr_t kind_offset() {
-    return OFFSET_OF(Snapshot, unaligned_kind_);
-  }
+  static intptr_t kind_offset() { return OFFSET_OF(Snapshot, unaligned_kind_); }
 
  private:
   // Prevent Snapshot from ever being allocated directly.
@@ -202,7 +202,7 @@
 
   // The following fields are potentially unaligned.
   int64_t unaligned_length_;  // Stream length.
-  int64_t unaligned_kind_;  // Kind of snapshot.
+  int64_t unaligned_kind_;    // Kind of snapshot.
 
   // Variable length data follows here.
 
@@ -213,13 +213,13 @@
 class InstructionsSnapshot : ValueObject {
  public:
   explicit InstructionsSnapshot(const void* raw_memory)
-    : raw_memory_(raw_memory) {
+      : raw_memory_(raw_memory) {
     ASSERT(Utils::IsAligned(raw_memory, OS::kMaxPreferredCodeAlignment));
   }
 
   void* instructions_start() {
-    return reinterpret_cast<void*>(
-        reinterpret_cast<uword>(raw_memory_) + kHeaderSize);
+    return reinterpret_cast<void*>(reinterpret_cast<uword>(raw_memory_) +
+                                   kHeaderSize);
   }
 
   uword instructions_size() {
@@ -238,14 +238,13 @@
 
 class DataSnapshot : ValueObject {
  public:
-  explicit DataSnapshot(const void* raw_memory)
-    : raw_memory_(raw_memory) {
+  explicit DataSnapshot(const void* raw_memory) : raw_memory_(raw_memory) {
     ASSERT(Utils::IsAligned(raw_memory, 2 * kWordSize));  // kObjectAlignment
   }
 
   void* data_start() {
-    return reinterpret_cast<void*>(
-        reinterpret_cast<uword>(raw_memory_) + kHeaderSize);
+    return reinterpret_cast<void*>(reinterpret_cast<uword>(raw_memory_) +
+                                   kHeaderSize);
   }
 
   uword data_size() {
@@ -285,9 +284,7 @@
   }
   COMPILE_ASSERT(sizeof(uint32_t) >= sizeof(classid_t));
 
-  void ReadBytes(uint8_t* addr, intptr_t len) {
-    stream_.ReadBytes(addr, len);
-  }
+  void ReadBytes(uint8_t* addr, intptr_t len) { stream_.ReadBytes(addr, len); }
 
   double ReadDouble() {
     double result;
@@ -304,13 +301,9 @@
     return stream_.AddressOfCurrentPosition();
   }
 
-  void Advance(intptr_t value) {
-    stream_.Advance(value);
-  }
+  void Advance(intptr_t value) { stream_.Advance(value); }
 
-  intptr_t PendingBytes() const {
-    return stream_.PendingBytes();
-  }
+  intptr_t PendingBytes() const { return stream_.PendingBytes(); }
 
   RawSmi* ReadAsSmi();
   intptr_t ReadSmiValue();
@@ -374,8 +367,7 @@
  public:
   InstructionsReader(const uint8_t* instructions_buffer,
                      const uint8_t* data_buffer)
-    : instructions_buffer_(instructions_buffer),
-      data_buffer_(data_buffer) {
+      : instructions_buffer_(instructions_buffer), data_buffer_(data_buffer) {
     ASSERT(instructions_buffer != NULL);
     ASSERT(data_buffer != NULL);
     ASSERT(Utils::IsAligned(reinterpret_cast<uword>(instructions_buffer),
@@ -441,7 +433,7 @@
                  Snapshot::Kind kind,
                  ZoneGrowableArray<BackRefNode>* backward_references,
                  Thread* thread);
-  ~SnapshotReader() { }
+  ~SnapshotReader() {}
 
   ZoneGrowableArray<BackRefNode>* GetBackwardReferenceTable() const {
     return backward_references_;
@@ -464,9 +456,7 @@
                             intptr_t patch_offset);
 
   // Read a Dart Instance object.
-  RawObject* ReadInstance(intptr_t object_id,
-                          intptr_t tags,
-                          bool as_reference);
+  RawObject* ReadInstance(intptr_t object_id, intptr_t tags, bool as_reference);
 
   // Read a VM isolate object that was serialized as an Id.
   RawObject* ReadVMIsolateObject(intptr_t object_id);
@@ -502,26 +492,26 @@
 
   bool is_vm_isolate() const;
 
-  Snapshot::Kind kind_;  // Indicates type of snapshot(full, script, message).
-  Thread* thread_;  // Current thread.
-  Zone* zone_;  // Zone for allocations while reading snapshot.
-  Heap* heap_;  // Heap of the current isolate.
+  Snapshot::Kind kind_;   // Indicates type of snapshot(full, script, message).
+  Thread* thread_;        // Current thread.
+  Zone* zone_;            // Zone for allocations while reading snapshot.
+  Heap* heap_;            // Heap of the current isolate.
   PageSpace* old_space_;  // Old space of the current isolate.
-  Class& cls_;  // Temporary Class handle.
-  Object& obj_;  // Temporary Object handle.
-  PassiveObject& pobj_;  // Temporary PassiveObject handle.
-  Array& array_;  // Temporary Array handle.
-  Field& field_;  // Temporary Field handle.
-  String& str_;  // Temporary String handle.
-  Library& library_;  // Temporary library handle.
-  AbstractType& type_;  // Temporary type handle.
+  Class& cls_;            // Temporary Class handle.
+  Object& obj_;           // Temporary Object handle.
+  PassiveObject& pobj_;   // Temporary PassiveObject handle.
+  Array& array_;          // Temporary Array handle.
+  Field& field_;          // Temporary Field handle.
+  String& str_;           // Temporary String handle.
+  Library& library_;      // Temporary library handle.
+  AbstractType& type_;    // Temporary type handle.
   TypeArguments& type_arguments_;  // Temporary type argument handle.
-  GrowableObjectArray& tokens_;  // Temporary tokens handle.
-  TokenStream& stream_;  // Temporary token stream handle.
-  ExternalTypedData& data_;  // Temporary stream data handle.
-  TypedData& typed_data_;  // Temporary typed data handle.
-  Function& function_;  // Temporary function handle.
-  UnhandledException& error_;  // Error handle.
+  GrowableObjectArray& tokens_;    // Temporary tokens handle.
+  TokenStream& stream_;            // Temporary token stream handle.
+  ExternalTypedData& data_;        // Temporary stream data handle.
+  TypedData& typed_data_;          // Temporary typed data handle.
+  Function& function_;             // Temporary function handle.
+  UnhandledException& error_;      // Error handle.
   intptr_t max_vm_isolate_object_id_;
   ZoneGrowableArray<BackRefNode>* backward_references_;
 
@@ -567,9 +557,7 @@
 
 class ScriptSnapshotReader : public SnapshotReader {
  public:
-  ScriptSnapshotReader(const uint8_t* buffer,
-                       intptr_t size,
-                       Thread* thread);
+  ScriptSnapshotReader(const uint8_t* buffer, intptr_t size, Thread* thread);
   ~ScriptSnapshotReader();
 
  private:
@@ -579,9 +567,7 @@
 
 class MessageSnapshotReader : public SnapshotReader {
  public:
-  MessageSnapshotReader(const uint8_t* buffer,
-                        intptr_t size,
-                        Thread* thread);
+  MessageSnapshotReader(const uint8_t* buffer, intptr_t size, Thread* thread);
   ~MessageSnapshotReader();
 
  private:
@@ -601,13 +587,9 @@
     WriteStream::Raw<sizeof(T), T>::Write(&stream_, value);
   }
 
-  void WriteRawPointerValue(intptr_t value) {
-    Write<int64_t>(value);
-  }
+  void WriteRawPointerValue(intptr_t value) { Write<int64_t>(value); }
 
-  void WriteClassIDValue(classid_t value) {
-    Write<uint32_t>(value);
-  }
+  void WriteClassIDValue(classid_t value) { Write<uint32_t>(value); }
   COMPILE_ASSERT(sizeof(uint32_t) >= sizeof(classid_t));
 
   // Write an object that is serialized as an Id (singleton in object store,
@@ -653,15 +635,12 @@
   }
 
  protected:
-  BaseWriter(uint8_t** buffer,
-             ReAlloc alloc,
-             intptr_t initial_size)
-      : StackResource(Thread::Current()),
-        stream_(buffer, alloc, initial_size) {
+  BaseWriter(uint8_t** buffer, ReAlloc alloc, intptr_t initial_size)
+      : StackResource(Thread::Current()), stream_(buffer, alloc, initial_size) {
     ASSERT(buffer != NULL);
     ASSERT(alloc != NULL);
   }
-  ~BaseWriter() { }
+  ~BaseWriter() {}
 
   void ReserveHeader() {
     // Make room for recording snapshot buffer size.
@@ -739,12 +718,11 @@
 class InstructionsWriter : public ZoneAllocated {
  public:
   InstructionsWriter()
-    : next_offset_(InstructionsSnapshot::kHeaderSize),
-      next_object_offset_(DataSnapshot::kHeaderSize),
-      instructions_(),
-      objects_() {
-  }
-  virtual ~InstructionsWriter() { }
+      : next_offset_(InstructionsSnapshot::kHeaderSize),
+        next_object_offset_(DataSnapshot::kHeaderSize),
+        instructions_(),
+        objects_() {}
+  virtual ~InstructionsWriter() {}
 
   int32_t GetOffsetFor(RawInstructions* instructions, RawCode* code);
 
@@ -762,7 +740,7 @@
     explicit InstructionsData(RawInstructions* insns,
                               RawCode* code,
                               intptr_t offset)
-        : raw_insns_(insns), raw_code_(code), offset_(offset) { }
+        : raw_insns_(insns), raw_code_(code), offset_(offset) {}
 
     union {
       RawInstructions* raw_insns_;
@@ -776,8 +754,7 @@
   };
 
   struct ObjectData {
-    explicit ObjectData(RawObject* raw_obj)
-        : raw_obj_(raw_obj) { }
+    explicit ObjectData(RawObject* raw_obj) : raw_obj_(raw_obj) {}
 
     union {
       RawObject* raw_obj_;
@@ -800,11 +777,10 @@
   AssemblyInstructionsWriter(uint8_t** assembly_buffer,
                              ReAlloc alloc,
                              intptr_t initial_size)
-    : InstructionsWriter(),
-      assembly_stream_(assembly_buffer, alloc, initial_size),
-      text_size_(0),
-      data_size_(0) {
-  }
+      : InstructionsWriter(),
+        assembly_stream_(assembly_buffer, alloc, initial_size),
+        text_size_(0),
+        data_size_(0) {}
 
   virtual void Write(uint8_t* vmisolate_buffer,
                      intptr_t vmisolate_length,
@@ -817,7 +793,7 @@
 
  private:
   void WriteWordLiteralText(uword value) {
-    // Padding is helpful for comparing the .S with --disassemble.
+// Padding is helpful for comparing the .S with --disassemble.
 #if defined(ARCH_IS_64_BIT)
     assembly_stream_.Print(".quad 0x%0.16" Px "\n", value);
 #else
@@ -827,7 +803,7 @@
   }
 
   void WriteWordLiteralData(uword value) {
-    // Padding is helpful for comparing the .S with --disassemble.
+// Padding is helpful for comparing the .S with --disassemble.
 #if defined(ARCH_IS_64_BIT)
     assembly_stream_.Print(".quad 0x%0.16" Px "\n", value);
 #else
@@ -850,10 +826,11 @@
                          uint8_t** rodata_blob_buffer,
                          ReAlloc alloc,
                          intptr_t initial_size)
-    : InstructionsWriter(),
-      instructions_blob_stream_(instructions_blob_buffer, alloc, initial_size),
-      rodata_blob_stream_(rodata_blob_buffer, alloc, initial_size) {
-  }
+      : InstructionsWriter(),
+        instructions_blob_stream_(instructions_blob_buffer,
+                                  alloc,
+                                  initial_size),
+        rodata_blob_stream_(rodata_blob_buffer, alloc, initial_size) {}
 
   virtual void Write(uint8_t* vmisolate_buffer,
                      intptr_t vmisolate_length,
@@ -900,16 +877,12 @@
 
   uword GetObjectTags(RawObject* raw);
 
-  Exceptions::ExceptionType exception_type() const {
-    return exception_type_;
-  }
+  Exceptions::ExceptionType exception_type() const { return exception_type_; }
   void set_exception_type(Exceptions::ExceptionType type) {
     exception_type_ = type;
   }
   const char* exception_msg() const { return exception_msg_; }
-  void set_exception_msg(const char* msg) {
-    exception_msg_ = msg;
-  }
+  void set_exception_msg(const char* msg) { exception_msg_ = msg; }
   bool can_send_any_object() const { return can_send_any_object_; }
   void ThrowException(Exceptions::ExceptionType type, const char* msg);
 
@@ -963,7 +936,7 @@
   ForwardList* forward_list_;
   Exceptions::ExceptionType exception_type_;  // Exception type.
   const char* exception_msg_;  // Message associated with exception.
-  bool can_send_any_object_;  // True if any Dart instance can be sent.
+  bool can_send_any_object_;   // True if any Dart instance can be sent.
 
   friend class RawArray;
   friend class RawClass;
@@ -1002,7 +975,7 @@
  public:
   static const intptr_t kInitialSize = 64 * KB;
   ScriptSnapshotWriter(uint8_t** buffer, ReAlloc alloc);
-  ~ScriptSnapshotWriter() { }
+  ~ScriptSnapshotWriter() {}
 
   // Writes a partial snapshot of the script.
   void WriteScriptSnapshot(const Library& lib);
@@ -1018,7 +991,7 @@
  public:
   static const intptr_t kInitialSize = 512;
   MessageWriter(uint8_t** buffer, ReAlloc alloc, bool can_send_any_object);
-  ~MessageWriter() { }
+  ~MessageWriter() {}
 
   void WriteMessage(const Object& obj);
 
diff --git a/runtime/vm/snapshot_ids.h b/runtime/vm/snapshot_ids.h
index 26ad769..1e01b28 100644
--- a/runtime/vm/snapshot_ids.h
+++ b/runtime/vm/snapshot_ids.h
@@ -53,10 +53,11 @@
   kEmptyExceptionHandlers,
   kCachedArgumentsDescriptor0,
   kCachedArgumentsDescriptorN = (kCachedArgumentsDescriptor0 +
-      ArgumentsDescriptor::kCachedDescriptorCount - 1),
+                                 ArgumentsDescriptor::kCachedDescriptorCount -
+                                 1),
   kCachedICDataArray0,
-  kCachedICDataArrayN = (kCachedICDataArray0 +
-      ICData::kCachedICDataArrayCount - 1),
+  kCachedICDataArrayN =
+      (kCachedICDataArray0 + ICData::kCachedICDataArrayCount - 1),
 
   kInstanceObjectId,
   kStaticImplicitClosureObjectId,
diff --git a/runtime/vm/snapshot_test.cc b/runtime/vm/snapshot_test.cc
index 39450e4..81c4342 100644
--- a/runtime/vm/snapshot_test.cc
+++ b/runtime/vm/snapshot_test.cc
@@ -50,14 +50,16 @@
 }
 
 
-static uint8_t* malloc_allocator(
-    uint8_t* ptr, intptr_t old_size, intptr_t new_size) {
+static uint8_t* malloc_allocator(uint8_t* ptr,
+                                 intptr_t old_size,
+                                 intptr_t new_size) {
   return reinterpret_cast<uint8_t*>(realloc(ptr, new_size));
 }
 
 
-static uint8_t* zone_allocator(
-    uint8_t* ptr, intptr_t old_size, intptr_t new_size) {
+static uint8_t* zone_allocator(uint8_t* ptr,
+                               intptr_t old_size,
+                               intptr_t new_size) {
   Zone* zone = Thread::Current()->zone();
   return zone->Realloc<uint8_t>(ptr, old_size, new_size);
 }
@@ -258,10 +260,10 @@
   Mint& mint = Mint::Handle();
   mint ^= Integer::New(value);
   Dart_CObject* mint_cobject = SerializeAndDeserializeMint(mint);
-  // On 64-bit platforms mints always require 64-bits as the smi range
-  // here covers most of the 64-bit range. On 32-bit platforms the smi
-  // range covers most of the 32-bit range and values outside that
-  // range are also represented as mints.
+// On 64-bit platforms mints always require 64-bits as the smi range
+// here covers most of the 64-bit range. On 32-bit platforms the smi
+// range covers most of the 32-bit range and values outside that
+// range are also represented as mints.
 #if defined(ARCH_IS_64_BIT)
   EXPECT_EQ(Dart_CObject_kInt64, mint_cobject->type);
   EXPECT_EQ(value, mint_cobject->value.as_int64);
@@ -557,12 +559,13 @@
 TEST_CASE(SerializeString) {
   TestString("This string shall be serialized");
   TestString("æøå");  // This file is UTF-8 encoded.
-  const char* data = "\x01"
-                     "\x7F"
-                     "\xC2\x80"       // U+0080
-                     "\xDF\xBF"       // U+07FF
-                     "\xE0\xA0\x80"   // U+0800
-                     "\xEF\xBF\xBF";  // U+FFFF
+  const char* data =
+      "\x01"
+      "\x7F"
+      "\xC2\x80"       // U+0080
+      "\xDF\xBF"       // U+07FF
+      "\xE0\xA0\x80"   // U+0800
+      "\xEF\xBF\xBF";  // U+FFFF
 
   TestString(data);
   // TODO(sgjesse): Add tests with non-BMP characters.
@@ -616,7 +619,7 @@
 TEST_CASE(FailSerializeLargeNestedArray) {
   Dart_CObject parent;
   Dart_CObject child;
-  Dart_CObject* values[1] = { &child };
+  Dart_CObject* values[1] = {&child};
 
   parent.type = Dart_CObject_kArray;
   parent.value.as_array.length = 1;
@@ -733,7 +736,7 @@
     serialized_array ^= reader.ReadObject();                                   \
     for (int i = 0; i < kArrayLength; i++) {                                   \
       EXPECT_EQ(static_cast<ctype>(i),                                         \
-                serialized_array.Get##darttype(i*scale));                      \
+                serialized_array.Get##darttype(i* scale));                     \
     }                                                                          \
   }
 
@@ -741,7 +744,7 @@
 #define TEST_EXTERNAL_TYPED_ARRAY(darttype, ctype)                             \
   {                                                                            \
     StackZone zone(thread);                                                    \
-    ctype data[] = { 0, 11, 22, 33, 44, 55, 66, 77 };                          \
+    ctype data[] = {0, 11, 22, 33, 44, 55, 66, 77};                            \
     intptr_t length = ARRAY_SIZE(data);                                        \
     ExternalTypedData& array = ExternalTypedData::Handle(                      \
         ExternalTypedData::New(kExternalTypedData##darttype##ArrayCid,         \
@@ -756,7 +759,7 @@
     serialized_array ^= reader.ReadObject();                                   \
     for (int i = 0; i < length; i++) {                                         \
       EXPECT_EQ(static_cast<ctype>(data[i]),                                   \
-                serialized_array.Get##darttype(i*scale));                      \
+                serialized_array.Get##darttype(i* scale));                     \
     }                                                                          \
   }
 
@@ -832,12 +835,10 @@
     ASSERT(buffer != NULL);
     ASSERT(alloc != NULL);
   }
-  ~TestSnapshotWriter() { }
+  ~TestSnapshotWriter() {}
 
   // Writes just a script object
-  void WriteScript(const Script& script) {
-    WriteObject(script.raw());
-  }
+  void WriteScript(const Script& script) { WriteObject(script.raw()); }
 
  private:
   ForwardList forward_list_;
@@ -853,23 +854,17 @@
   Zone* zone = Thread::Current()->zone();
   const TokenStream& expected_tokens =
       TokenStream::Handle(zone, script.tokens());
-  TokenStream::Iterator expected_iterator(
-      zone,
-      expected_tokens,
-      TokenPosition::kMinSource,
-      TokenStream::Iterator::kAllTokens);
+  TokenStream::Iterator expected_iterator(zone, expected_tokens,
+                                          TokenPosition::kMinSource,
+                                          TokenStream::Iterator::kAllTokens);
   const String& str = String::Handle(zone, expected_tokens.GenerateSource());
   const String& private_key =
       String::Handle(zone, expected_tokens.PrivateKey());
   const TokenStream& reconstructed_tokens =
-      TokenStream::Handle(zone, TokenStream::New(str,
-                                                 private_key,
-                                                 false));
+      TokenStream::Handle(zone, TokenStream::New(str, private_key, false));
   expected_iterator.SetCurrentPosition(TokenPosition::kMinSource);
   TokenStream::Iterator reconstructed_iterator(
-      zone,
-      reconstructed_tokens,
-      TokenPosition::kMinSource,
+      zone, reconstructed_tokens, TokenPosition::kMinSource,
       TokenStream::Iterator::kAllTokens);
   Token::Kind expected_kind = expected_iterator.CurrentTokenKind();
   Token::Kind reconstructed_kind = reconstructed_iterator.CurrentTokenKind();
@@ -935,9 +930,8 @@
   Zone* zone = thread->zone();
   String& url = String::Handle(zone, String::New("dart-test:SerializeScript"));
   String& source = String::Handle(zone, String::New(kScriptChars));
-  Script& script = Script::Handle(zone, Script::New(url,
-                                                    source,
-                                                    RawScript::kScriptTag));
+  Script& script =
+      Script::Handle(zone, Script::New(url, source, RawScript::kScriptTag));
   const String& lib_url = String::Handle(zone, Symbols::New(thread, "TestLib"));
   Library& lib = Library::Handle(zone, Library::New(lib_url));
   lib.Register(thread);
@@ -969,11 +963,9 @@
   const ExternalTypedData& serialized_data =
       ExternalTypedData::Handle(zone, serialized_tokens.GetStream());
   EXPECT_EQ(expected_data.Length(), serialized_data.Length());
-  TokenStream::Iterator expected_iterator(zone,
-                                          expected_tokens,
+  TokenStream::Iterator expected_iterator(zone, expected_tokens,
                                           TokenPosition::kMinSource);
-  TokenStream::Iterator serialized_iterator(zone,
-                                            serialized_tokens,
+  TokenStream::Iterator serialized_iterator(zone, serialized_tokens,
                                             TokenPosition::kMinSource);
   Token::Kind expected_kind = expected_iterator.CurrentTokenKind();
   Token::Kind serialized_kind = serialized_iterator.CurrentTokenKind();
@@ -1034,10 +1026,8 @@
     Dart_EnterScope();  // Start a Dart API scope for invoking API functions.
 
     // Write out the script snapshot.
-    result = Dart_CreateSnapshot(NULL,
-                                 &vm_isolate_snapshot_size,
-                                 &isolate_snapshot,
-                                 &isolate_snapshot_size);
+    result = Dart_CreateSnapshot(NULL, &vm_isolate_snapshot_size,
+                                 &isolate_snapshot, &isolate_snapshot_size);
     EXPECT_VALID(result);
     full_snapshot = reinterpret_cast<uint8_t*>(malloc(isolate_snapshot_size));
     memmove(full_snapshot, isolate_snapshot, isolate_snapshot_size);
@@ -1122,8 +1112,8 @@
 VM_TEST_CASE(GenerateSource) {
   Zone* zone = thread->zone();
   Isolate* isolate = thread->isolate();
-  const GrowableObjectArray& libs = GrowableObjectArray::Handle(
-      zone, isolate->object_store()->libraries());
+  const GrowableObjectArray& libs =
+      GrowableObjectArray::Handle(zone, isolate->object_store()->libraries());
   Library& lib = Library::Handle();
   String& uri = String::Handle();
   for (intptr_t i = 0; i < libs.Length(); i++) {
@@ -1182,9 +1172,7 @@
 
     // Write snapshot with object content.
     {
-      FullSnapshotWriter writer(Snapshot::kCore,
-                                NULL,
-                                &isolate_snapshot_buffer,
+      FullSnapshotWriter writer(Snapshot::kCore, NULL, &isolate_snapshot_buffer,
                                 &malloc_allocator,
                                 NULL /* instructions_writer */);
       writer.WriteFullSnapshot();
@@ -1202,8 +1190,7 @@
     OS::PrintErr("From Snapshot: %" Pd64 "us\n", timer2.TotalElapsedTime());
 
     // Invoke a function which returns an object.
-    Dart_Handle cls =
-        Dart_GetClass(TestCase::lib(), NewString("FieldsTest"));
+    Dart_Handle cls = Dart_GetClass(TestCase::lib(), NewString("FieldsTest"));
     result = Dart_Invoke(cls, NewString("testMain"), 0, NULL);
     EXPECT_VALID(result);
     Dart_ExitScope();
@@ -1242,9 +1229,7 @@
 
     // Write snapshot with object content.
     {
-      FullSnapshotWriter writer(Snapshot::kCore,
-                                NULL,
-                                &isolate_snapshot_buffer,
+      FullSnapshotWriter writer(Snapshot::kCore, NULL, &isolate_snapshot_buffer,
                                 &malloc_allocator,
                                 NULL /* instructions_writer */);
       writer.WriteFullSnapshot();
@@ -1267,8 +1252,7 @@
     OS::PrintErr("From Snapshot: %" Pd64 "us\n", timer2.TotalElapsedTime());
 
     // Invoke a function which returns an object.
-    Dart_Handle cls = Dart_GetClass(TestCase::lib(),
-                                    NewString("FieldsTest"));
+    Dart_Handle cls = Dart_GetClass(TestCase::lib(), NewString("FieldsTest"));
     Dart_Handle result = Dart_Invoke(cls, NewString("testMain"), 0, NULL);
     if (Dart_IsError(result)) {
       // Print the error.  It is probably an unhandled exception.
@@ -1347,10 +1331,8 @@
     Dart_EnterScope();  // Start a Dart API scope for invoking API functions.
 
     // Write out the script snapshot.
-    result = Dart_CreateSnapshot(NULL,
-                                 &vm_isolate_snapshot_size,
-                                 &isolate_snapshot,
-                                 &isolate_snapshot_size);
+    result = Dart_CreateSnapshot(NULL, &vm_isolate_snapshot_size,
+                                 &isolate_snapshot, &isolate_snapshot_size);
     EXPECT_VALID(result);
     full_snapshot = reinterpret_cast<uint8_t*>(malloc(isolate_snapshot_size));
     memmove(full_snapshot, isolate_snapshot, isolate_snapshot_size);
@@ -1366,18 +1348,16 @@
     Dart_EnterScope();  // Start a Dart API scope for invoking API functions.
 
     // Load the library.
-    Dart_Handle import_lib = Dart_LoadLibrary(NewString("dart_import_lib"),
-                                              Dart_Null(),
-                                              NewString(kLibScriptChars),
-                                              0, 0);
+    Dart_Handle import_lib =
+        Dart_LoadLibrary(NewString("dart_import_lib"), Dart_Null(),
+                         NewString(kLibScriptChars), 0, 0);
     EXPECT_VALID(import_lib);
 
     // Create a test library and Load up a test script in it.
     TestCase::LoadTestScript(kScriptChars, NULL);
 
-    EXPECT_VALID(Dart_LibraryImportLibrary(TestCase::lib(),
-                                           import_lib,
-                                           Dart_Null()));
+    EXPECT_VALID(
+        Dart_LibraryImportLibrary(TestCase::lib(), import_lib, Dart_Null()));
     EXPECT_VALID(Api::CheckAndFinalizePendingClasses(Thread::Current()));
 
     // Get list of library URLs loaded and save the count.
@@ -1429,10 +1409,8 @@
     Dart_EnterScope();  // Start a Dart API scope for invoking API functions.
 
     // Load the library.
-    Dart_Handle lib = Dart_LoadLibrary(NewString("dart_lib"),
-                                       Dart_Null(),
-                                       NewString(kScriptChars),
-                                       0, 0);
+    Dart_Handle lib = Dart_LoadLibrary(NewString("dart_lib"), Dart_Null(),
+                                       NewString(kScriptChars), 0, 0);
     EXPECT_VALID(lib);
 
     // Write out the script snapshot.
@@ -1469,10 +1447,10 @@
 
 UNIT_TEST_CASE(ScriptSnapshot1) {
   const char* kScriptChars =
-    "class _SimpleNumEnumerable<T extends num> {"
+      "class _SimpleNumEnumerable<T extends num> {"
       "final Iterable<T> _source;"
       "const _SimpleNumEnumerable(this._source) : super();"
-    "}";
+      "}";
 
   Dart_Handle result;
   uint8_t* buffer;
@@ -1493,10 +1471,8 @@
     Dart_EnterScope();  // Start a Dart API scope for invoking API functions.
 
     // Write out the script snapshot.
-    result = Dart_CreateSnapshot(NULL,
-                                 &vm_isolate_snapshot_size,
-                                 &isolate_snapshot,
-                                 &isolate_snapshot_size);
+    result = Dart_CreateSnapshot(NULL, &vm_isolate_snapshot_size,
+                                 &isolate_snapshot, &isolate_snapshot_size);
     EXPECT_VALID(result);
     full_snapshot = reinterpret_cast<uint8_t*>(malloc(isolate_snapshot_size));
     memmove(full_snapshot, isolate_snapshot, isolate_snapshot_size);
@@ -1587,10 +1563,8 @@
     Dart_EnterScope();  // Start a Dart API scope for invoking API functions.
 
     // Write out the script snapshot.
-    result = Dart_CreateSnapshot(NULL,
-                                 &vm_isolate_snapshot_size,
-                                 &isolate_snapshot,
-                                 &isolate_snapshot_size);
+    result = Dart_CreateSnapshot(NULL, &vm_isolate_snapshot_size,
+                                 &isolate_snapshot, &isolate_snapshot_size);
     EXPECT_VALID(result);
     full_snapshot = reinterpret_cast<uint8_t*>(malloc(isolate_snapshot_size));
     memmove(full_snapshot, isolate_snapshot, isolate_snapshot_size);
@@ -1605,18 +1579,16 @@
     Dart_EnterScope();  // Start a Dart API scope for invoking API functions.
 
     // Load the library.
-    Dart_Handle import_lib = Dart_LoadLibrary(NewString("dart_import_lib"),
-                                              Dart_Null(),
-                                              NewString(kLibScriptChars),
-                                              0, 0);
+    Dart_Handle import_lib =
+        Dart_LoadLibrary(NewString("dart_import_lib"), Dart_Null(),
+                         NewString(kLibScriptChars), 0, 0);
     EXPECT_VALID(import_lib);
 
     // Create a test library and Load up a test script in it.
     TestCase::LoadTestScript(kScriptChars, NULL);
 
-    EXPECT_VALID(Dart_LibraryImportLibrary(TestCase::lib(),
-                                           import_lib,
-                                           Dart_Null()));
+    EXPECT_VALID(
+        Dart_LibraryImportLibrary(TestCase::lib(), import_lib, Dart_Null()));
     EXPECT_VALID(Api::CheckAndFinalizePendingClasses(Thread::Current()));
 
     // Write out the script snapshot.
@@ -1662,6 +1634,86 @@
 }
 
 
+UNIT_TEST_CASE(MismatchedSnapshotKinds) {
+  const char* kScriptChars = "main() { print('Hello, world!'); }";
+  Dart_Handle result;
+
+  uint8_t* buffer;
+  intptr_t size;
+  intptr_t vm_isolate_snapshot_size;
+  uint8_t* isolate_snapshot = NULL;
+  intptr_t isolate_snapshot_size;
+  uint8_t* full_snapshot = NULL;
+  uint8_t* script_snapshot = NULL;
+
+  bool saved_load_deferred_eagerly_mode = FLAG_load_deferred_eagerly;
+  FLAG_load_deferred_eagerly = true;
+  bool saved_concurrent_sweep_mode = FLAG_concurrent_sweep;
+  FLAG_concurrent_sweep = false;
+  {
+    // Start an Isolate, and create a full snapshot of it.
+    TestIsolateScope __test_isolate__;
+    Dart_EnterScope();  // Start a Dart API scope for invoking API functions.
+
+    // Write out the script snapshot.
+    result = Dart_CreateSnapshot(NULL, &vm_isolate_snapshot_size,
+                                 &isolate_snapshot, &isolate_snapshot_size);
+    EXPECT_VALID(result);
+    full_snapshot = reinterpret_cast<uint8_t*>(malloc(isolate_snapshot_size));
+    memmove(full_snapshot, isolate_snapshot, isolate_snapshot_size);
+    Dart_ExitScope();
+  }
+  FLAG_concurrent_sweep = saved_concurrent_sweep_mode;
+  FLAG_load_deferred_eagerly = saved_load_deferred_eagerly_mode;
+
+  {
+    // Create an Isolate using the full snapshot, load a script and create
+    // a script snapshot of the script.
+    TestCase::CreateTestIsolateFromSnapshot(full_snapshot);
+    Dart_EnterScope();  // Start a Dart API scope for invoking API functions.
+
+    // Create a test library and Load up a test script in it.
+    TestCase::LoadTestScript(kScriptChars, NULL);
+
+    EXPECT_VALID(Api::CheckAndFinalizePendingClasses(Thread::Current()));
+
+    // Write out the script snapshot.
+    result = Dart_CreateScriptSnapshot(&buffer, &size);
+    EXPECT_VALID(result);
+    script_snapshot = reinterpret_cast<uint8_t*>(malloc(size));
+    memmove(script_snapshot, buffer, size);
+    Dart_ExitScope();
+    Dart_ShutdownIsolate();
+  }
+
+  {
+    // Use a script snapshot where a full snapshot is expected.
+    char* error = NULL;
+    Dart_Isolate isolate = Dart_CreateIsolate(
+        "script-uri", "main", script_snapshot, NULL, NULL, &error);
+    EXPECT(isolate == NULL);
+    EXPECT(error != NULL);
+    EXPECT_SUBSTRING("got 'script', expected 'core'", error);
+  }
+
+  {
+    TestCase::CreateTestIsolateFromSnapshot(full_snapshot);
+    Dart_EnterScope();  // Start a Dart API scope for invoking API functions.
+
+    // Use a full snapshot where a script snapshot is expected.
+    Dart_Handle result = Dart_LoadScriptFromSnapshot(full_snapshot, size);
+    EXPECT_ERROR(result,
+                 "Dart_LoadScriptFromSnapshot expects parameter"
+                 " 'buffer' to be a script type snapshot.");
+
+    Dart_ExitScope();
+  }
+  Dart_ShutdownIsolate();
+  free(full_snapshot);
+  free(script_snapshot);
+}
+
+
 #endif  // !PRODUCT
 
 
@@ -1792,8 +1844,7 @@
   EXPECT(isolate != NULL);
   Dart_EnterScope();
 
-  Dart_Handle lib = TestCase::LoadTestScript(kCustomIsolateScriptChars,
-                                             NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(kCustomIsolateScriptChars, NULL);
   EXPECT_VALID(lib);
   Dart_Handle smi_result;
   smi_result = Dart_Invoke(lib, NewString("getSmi"), 0, NULL);
@@ -2685,9 +2736,9 @@
 static void CheckTypedData(Dart_CObject* object,
                            Dart_TypedData_Type typed_data_type,
                            int len) {
-    EXPECT_EQ(Dart_CObject_kTypedData, object->type);
-    EXPECT_EQ(typed_data_type, object->value.as_typed_data.type);
-    EXPECT_EQ(len, object->value.as_typed_data.length);
+  EXPECT_EQ(Dart_CObject_kTypedData, object->type);
+  EXPECT_EQ(typed_data_type, object->value.as_typed_data.type);
+  EXPECT_EQ(len, object->value.as_typed_data.length);
 }
 
 UNIT_TEST_CASE(DartGeneratedListMessagesWithTypedData) {
@@ -2786,23 +2837,16 @@
         Dart_TypedData_Type type;
         int size;
       } expected[] = {
-        { Dart_TypedData_kInt8, 256},
-        { Dart_TypedData_kUint8, 256},
-        { Dart_TypedData_kInt16, 512},
-        { Dart_TypedData_kUint16, 512},
-        { Dart_TypedData_kInt32, 1024},
-        { Dart_TypedData_kUint32, 1024},
-        { Dart_TypedData_kInt64, 2048},
-        { Dart_TypedData_kUint64, 2048},
-        { Dart_TypedData_kFloat32, 1024},
-        { Dart_TypedData_kFloat64, 2048},
-        { Dart_TypedData_kInvalid, -1 }
-      };
+          {Dart_TypedData_kInt8, 256},     {Dart_TypedData_kUint8, 256},
+          {Dart_TypedData_kInt16, 512},    {Dart_TypedData_kUint16, 512},
+          {Dart_TypedData_kInt32, 1024},   {Dart_TypedData_kUint32, 1024},
+          {Dart_TypedData_kInt64, 2048},   {Dart_TypedData_kUint64, 2048},
+          {Dart_TypedData_kFloat32, 1024}, {Dart_TypedData_kFloat64, 2048},
+          {Dart_TypedData_kInvalid, -1}};
 
       int i = 0;
       while (expected[i].type != Dart_TypedData_kInvalid) {
-        CheckTypedData(root->value.as_array.values[i],
-                       expected[i].type,
+        CheckTypedData(root->value.as_array.values[i], expected[i].type,
                        expected[i].size);
         i++;
       }
@@ -2819,46 +2863,29 @@
         Dart_TypedData_Type type;
         int size;
       } expected[] = {
-        { Dart_TypedData_kInt8, 256},
-        { Dart_TypedData_kUint8, 256},
-        { Dart_TypedData_kInt16, 512},
-        { Dart_TypedData_kUint16, 512},
-        { Dart_TypedData_kInt32, 1024},
-        { Dart_TypedData_kUint32, 1024},
-        { Dart_TypedData_kInt64, 2048},
-        { Dart_TypedData_kUint64, 2048},
-        { Dart_TypedData_kFloat32, 1024},
-        { Dart_TypedData_kFloat64, 2048},
+          {Dart_TypedData_kInt8, 256},     {Dart_TypedData_kUint8, 256},
+          {Dart_TypedData_kInt16, 512},    {Dart_TypedData_kUint16, 512},
+          {Dart_TypedData_kInt32, 1024},   {Dart_TypedData_kUint32, 1024},
+          {Dart_TypedData_kInt64, 2048},   {Dart_TypedData_kUint64, 2048},
+          {Dart_TypedData_kFloat32, 1024}, {Dart_TypedData_kFloat64, 2048},
 
-        { Dart_TypedData_kInt8, 512},
-        { Dart_TypedData_kUint8, 512},
-        { Dart_TypedData_kInt8, 1024},
-        { Dart_TypedData_kUint8, 1024},
-        { Dart_TypedData_kInt8, 2048},
-        { Dart_TypedData_kUint8, 2048},
-        { Dart_TypedData_kInt8, 1024},
-        { Dart_TypedData_kUint8, 1024},
-        { Dart_TypedData_kInt8, 2048},
-        { Dart_TypedData_kUint8, 2048},
+          {Dart_TypedData_kInt8, 512},     {Dart_TypedData_kUint8, 512},
+          {Dart_TypedData_kInt8, 1024},    {Dart_TypedData_kUint8, 1024},
+          {Dart_TypedData_kInt8, 2048},    {Dart_TypedData_kUint8, 2048},
+          {Dart_TypedData_kInt8, 1024},    {Dart_TypedData_kUint8, 1024},
+          {Dart_TypedData_kInt8, 2048},    {Dart_TypedData_kUint8, 2048},
 
-        { Dart_TypedData_kInt16, 256},
-        { Dart_TypedData_kUint16, 256},
-        { Dart_TypedData_kInt16, 1024},
-        { Dart_TypedData_kUint16, 1024},
-        { Dart_TypedData_kInt16, 2048},
-        { Dart_TypedData_kUint16, 2048},
-        { Dart_TypedData_kInt16, 1024},
-        { Dart_TypedData_kUint16, 1024},
-        { Dart_TypedData_kInt16, 2048},
-        { Dart_TypedData_kUint16, 2048},
+          {Dart_TypedData_kInt16, 256},    {Dart_TypedData_kUint16, 256},
+          {Dart_TypedData_kInt16, 1024},   {Dart_TypedData_kUint16, 1024},
+          {Dart_TypedData_kInt16, 2048},   {Dart_TypedData_kUint16, 2048},
+          {Dart_TypedData_kInt16, 1024},   {Dart_TypedData_kUint16, 1024},
+          {Dart_TypedData_kInt16, 2048},   {Dart_TypedData_kUint16, 2048},
 
-        { Dart_TypedData_kInvalid, -1 }
-      };
+          {Dart_TypedData_kInvalid, -1}};
 
       int i = 0;
       while (expected[i].type != Dart_TypedData_kInvalid) {
-        CheckTypedData(root->value.as_array.values[i],
-                       expected[i].type,
+        CheckTypedData(root->value.as_array.values[i], expected[i].type,
                        expected[i].size);
         i++;
       }
@@ -2876,23 +2903,16 @@
         Dart_TypedData_Type type;
         int size;
       } expected[] = {
-        { Dart_TypedData_kInt8, 256},
-        { Dart_TypedData_kUint8, 256},
-        { Dart_TypedData_kInt16, 256},
-        { Dart_TypedData_kUint16, 256},
-        { Dart_TypedData_kInt32, 256},
-        { Dart_TypedData_kUint32, 256},
-        { Dart_TypedData_kInt64, 256},
-        { Dart_TypedData_kUint64, 256},
-        { Dart_TypedData_kFloat32, 256},
-        { Dart_TypedData_kFloat64, 256},
-        { Dart_TypedData_kInvalid, -1 }
-      };
+          {Dart_TypedData_kInt8, 256},    {Dart_TypedData_kUint8, 256},
+          {Dart_TypedData_kInt16, 256},   {Dart_TypedData_kUint16, 256},
+          {Dart_TypedData_kInt32, 256},   {Dart_TypedData_kUint32, 256},
+          {Dart_TypedData_kInt64, 256},   {Dart_TypedData_kUint64, 256},
+          {Dart_TypedData_kFloat32, 256}, {Dart_TypedData_kFloat64, 256},
+          {Dart_TypedData_kInvalid, -1}};
 
       int i = 0;
       while (expected[i].type != Dart_TypedData_kInvalid) {
-        CheckTypedData(root->value.as_array.values[i],
-                       expected[i].type,
+        CheckTypedData(root->value.as_array.values[i], expected[i].type,
                        expected[i].size);
 
         // All views point to the same data.
@@ -2980,18 +3000,14 @@
   EXPECT(Dart_PostCObject(port_id, &object));
 
   static const int kArrayLength = 10;
-  Dart_CObject* array =
-      reinterpret_cast<Dart_CObject*>(
-          Dart_ScopeAllocate(
-              sizeof(Dart_CObject) + sizeof(Dart_CObject*) * kArrayLength));  // NOLINT
+  Dart_CObject* array = reinterpret_cast<Dart_CObject*>(Dart_ScopeAllocate(
+      sizeof(Dart_CObject) + sizeof(Dart_CObject*) * kArrayLength));  // NOLINT
   array->type = Dart_CObject_kArray;
   array->value.as_array.length = kArrayLength;
-  array->value.as_array.values =
-      reinterpret_cast<Dart_CObject**>(array + 1);
+  array->value.as_array.values = reinterpret_cast<Dart_CObject**>(array + 1);
   for (int i = 0; i < kArrayLength; i++) {
-    Dart_CObject* element =
-        reinterpret_cast<Dart_CObject*>(
-            Dart_ScopeAllocate(sizeof(Dart_CObject)));
+    Dart_CObject* element = reinterpret_cast<Dart_CObject*>(
+        Dart_ScopeAllocate(sizeof(Dart_CObject)));
     element->type = Dart_CObject_kInt32;
     element->value.as_int32 = i;
     array->value.as_array.values[i] = element;
diff --git a/runtime/vm/source_report.cc b/runtime/vm/source_report.cc
index 26f2cd2..390c0f5 100644
--- a/runtime/vm/source_report.cc
+++ b/runtime/vm/source_report.cc
@@ -26,8 +26,7 @@
       start_pos_(TokenPosition::kNoSource),
       end_pos_(TokenPosition::kNoSource),
       profile_(Isolate::Current()),
-      next_script_index_(0) {
-}
+      next_script_index_(0) {}
 
 
 SourceReport::~SourceReport() {
@@ -57,9 +56,8 @@
   ClearScriptTable();
   if (IsReportRequested(kProfile)) {
     // Build the profile.
-    SampleFilter samplesForIsolate(thread_->isolate(),
-                                   Thread::kMutatorTask,
-                                   -1, -1);
+    SampleFilter samplesForIsolate(thread_->isolate(), Thread::kMutatorTask, -1,
+                                   -1);
     profile_.Build(thread, &samplesForIsolate, Profile::kNoTags);
   }
 }
@@ -95,8 +93,7 @@
     default:
       return true;
   }
-  if (func.is_abstract() ||
-      func.IsImplicitConstructor() ||
+  if (func.is_abstract() || func.IsImplicitConstructor() ||
       func.IsRedirectingFactory()) {
     return true;
   }
@@ -166,10 +163,10 @@
   const TokenPosition end_pos = function.end_token_pos();
 
   ZoneGrowableArray<const ICData*>* ic_data_array =
-      new(zone()) ZoneGrowableArray<const ICData*>();
+      new (zone()) ZoneGrowableArray<const ICData*>();
   function.RestoreICDataMap(ic_data_array, false /* clone ic-data */);
-  const PcDescriptors& descriptors = PcDescriptors::Handle(
-      zone(), code.pc_descriptors());
+  const PcDescriptors& descriptors =
+      PcDescriptors::Handle(zone(), code.pc_descriptors());
 
   JSONArray sites(jsobj, "callSites");
 
@@ -178,7 +175,7 @@
       RawPcDescriptors::kIcCall | RawPcDescriptors::kUnoptStaticCall);
   while (iter.MoveNext()) {
     HANDLESCOPE(thread());
-    // TODO(zra): Remove this bailout once DBC has reliable ICData.
+// TODO(zra): Remove this bailout once DBC has reliable ICData.
 #if defined(TARGET_ARCH_DBC)
     if (iter.DeoptId() >= ic_data_array->length()) {
       continue;
@@ -206,10 +203,10 @@
   const TokenPosition end_pos = function.end_token_pos();
 
   ZoneGrowableArray<const ICData*>* ic_data_array =
-      new(zone()) ZoneGrowableArray<const ICData*>();
+      new (zone()) ZoneGrowableArray<const ICData*>();
   function.RestoreICDataMap(ic_data_array, false /* clone ic-data */);
-  const PcDescriptors& descriptors = PcDescriptors::Handle(
-      zone(), code.pc_descriptors());
+  const PcDescriptors& descriptors =
+      PcDescriptors::Handle(zone(), code.pc_descriptors());
 
   const int kCoverageNone = 0;
   const int kCoverageMiss = 1;
@@ -227,7 +224,7 @@
       RawPcDescriptors::kIcCall | RawPcDescriptors::kUnoptStaticCall);
   while (iter.MoveNext()) {
     HANDLESCOPE(thread());
-    // TODO(zra): Remove this bailout once DBC has reliable ICData.
+// TODO(zra): Remove this bailout once DBC has reliable ICData.
 #if defined(TARGET_ARCH_DBC)
     if (iter.DeoptId() >= ic_data_array->length()) {
       continue;
@@ -279,14 +276,14 @@
 void SourceReport::PrintPossibleBreakpointsData(JSONObject* jsobj,
                                                 const Function& func,
                                                 const Code& code) {
-  const uint8_t kSafepointKind = (RawPcDescriptors::kIcCall |
-                                  RawPcDescriptors::kUnoptStaticCall |
-                                  RawPcDescriptors::kRuntimeCall);
+  const uint8_t kSafepointKind =
+      (RawPcDescriptors::kIcCall | RawPcDescriptors::kUnoptStaticCall |
+       RawPcDescriptors::kRuntimeCall);
   const TokenPosition begin_pos = func.token_pos();
   const TokenPosition end_pos = func.end_token_pos();
 
-  const PcDescriptors& descriptors = PcDescriptors::Handle(
-      zone(), code.pc_descriptors());
+  const PcDescriptors& descriptors =
+      PcDescriptors::Handle(zone(), code.pc_descriptors());
 
   intptr_t func_length = (end_pos.Pos() - begin_pos.Pos()) + 1;
   GrowableArray<char> possible(func_length);
@@ -416,8 +413,7 @@
   // We skip compiled async functions.  Once an async function has
   // been compiled, there is another function with the same range which
   // actually contains the user code.
-  if (func.IsAsyncFunction() ||
-      func.IsAsyncGenerator() ||
+  if (func.IsAsyncFunction() || func.IsAsyncGenerator() ||
       func.IsSyncGenerator()) {
     return;
   }
diff --git a/runtime/vm/source_report.h b/runtime/vm/source_report.h
index 05870f2..8db2418 100644
--- a/runtime/vm/source_report.h
+++ b/runtime/vm/source_report.h
@@ -20,10 +20,10 @@
 class SourceReport {
  public:
   enum ReportKind {
-    kCallSites           = 0x1,
-    kCoverage            = 0x2,
+    kCallSites = 0x1,
+    kCoverage = 0x2,
     kPossibleBreakpoints = 0x4,
-    kProfile             = 0x8,
+    kProfile = 0x8,
   };
 
   static const char* kCallSitesStr;
@@ -31,29 +31,28 @@
   static const char* kPossibleBreakpointsStr;
   static const char* kProfileStr;
 
-  enum CompileMode {
-    kNoCompile,
-    kForceCompile
-  };
+  enum CompileMode { kNoCompile, kForceCompile };
 
   // report_set is a bitvector indicating which reports to generate
   // (e.g. kCallSites | kCoverage).
-  explicit SourceReport(intptr_t report_set,
-                        CompileMode compile = kNoCompile);
+  explicit SourceReport(intptr_t report_set, CompileMode compile = kNoCompile);
   ~SourceReport();
 
   // Generate a source report for (some subrange of) a script.
   //
   // If script is null, then the report is generated for all scripts
   // in the isolate.
-  void PrintJSON(JSONStream* js, const Script& script,
+  void PrintJSON(JSONStream* js,
+                 const Script& script,
                  TokenPosition start_pos = TokenPosition::kNoSource,
                  TokenPosition end_pos = TokenPosition::kNoSource);
 
  private:
   void ClearScriptTable();
-  void Init(Thread* thread, const Script* script,
-            TokenPosition start_pos, TokenPosition end_pos);
+  void Init(Thread* thread,
+            const Script* script,
+            TokenPosition start_pos,
+            TokenPosition end_pos);
 
   Thread* thread() const { return thread_; }
   Zone* zone() const { return thread_->zone(); }
@@ -65,11 +64,14 @@
   bool ScriptIsLoadedByLibrary(const Script& script, const Library& lib);
 
   void PrintCallSitesData(JSONObject* jsobj,
-                          const Function& func, const Code& code);
+                          const Function& func,
+                          const Code& code);
   void PrintCoverageData(JSONObject* jsobj,
-                         const Function& func, const Code& code);
+                         const Function& func,
+                         const Code& code);
   void PrintPossibleBreakpointsData(JSONObject* jsobj,
-                                    const Function& func, const Code& code);
+                                    const Function& func,
+                                    const Code& code);
   void PrintProfileData(JSONObject* jsobj, ProfileFunction* profile_function);
 #if defined(DEBUG)
   void VerifyScriptTable();
@@ -95,17 +97,11 @@
     typedef const String* Key;
     typedef ScriptTableEntry* Pair;
 
-    static Key KeyOf(Pair kv) {
-      return kv->key;
-    }
+    static Key KeyOf(Pair kv) { return kv->key; }
 
-    static Value ValueOf(Pair kv) {
-      return kv;
-    }
+    static Value ValueOf(Pair kv) { return kv; }
 
-    static inline intptr_t Hashcode(Key key) {
-      return key->Hash();
-    }
+    static inline intptr_t Hashcode(Key key) { return key->Hash(); }
 
     static inline bool IsKeyEqual(Pair kv, Key key) {
       return kv->key->Equals(*key);
diff --git a/runtime/vm/source_report_test.cc b/runtime/vm/source_report_test.cc
index 2d3f5bc..1651c4f 100644
--- a/runtime/vm/source_report_test.cc
+++ b/runtime/vm/source_report_test.cc
@@ -31,8 +31,8 @@
   Library& lib = Library::Handle();
   lib ^= ExecuteScript(kScript);
   ASSERT(!lib.IsNull());
-  const Script& script = Script::Handle(lib.LookupScript(
-      String::Handle(String::New("test-lib"))));
+  const Script& script =
+      Script::Handle(lib.LookupScript(String::Handle(String::New("test-lib"))));
 
   SourceReport report(SourceReport::kCoverage);
   JSONStream js;
@@ -68,8 +68,8 @@
   Library& lib = Library::Handle();
   lib ^= ExecuteScript(kScript);
   ASSERT(!lib.IsNull());
-  const Script& script = Script::Handle(lib.LookupScript(
-      String::Handle(String::New("test-lib"))));
+  const Script& script =
+      Script::Handle(lib.LookupScript(String::Handle(String::New("test-lib"))));
 
   SourceReport report(SourceReport::kCoverage);
   JSONStream js;
@@ -113,8 +113,8 @@
   Library& lib = Library::Handle();
   lib ^= ExecuteScript(kScript);
   ASSERT(!lib.IsNull());
-  const Script& script = Script::Handle(lib.LookupScript(
-      String::Handle(String::New("test-lib"))));
+  const Script& script =
+      Script::Handle(lib.LookupScript(String::Handle(String::New("test-lib"))));
 
   SourceReport report(SourceReport::kCoverage, SourceReport::kForceCompile);
   JSONStream js;
@@ -157,8 +157,8 @@
   Library& lib = Library::Handle();
   lib ^= ExecuteScript(kScript);
   ASSERT(!lib.IsNull());
-  const Script& script = Script::Handle(lib.LookupScript(
-      String::Handle(String::New("test-lib"))));
+  const Script& script =
+      Script::Handle(lib.LookupScript(String::Handle(String::New("test-lib"))));
 
   SourceReport report(SourceReport::kCoverage);
   JSONStream js;
@@ -200,8 +200,8 @@
   Library& lib = Library::Handle();
   lib ^= ExecuteScript(kScript);
   ASSERT(!lib.IsNull());
-  const Script& script = Script::Handle(lib.LookupScript(
-      String::Handle(String::New("test-lib"))));
+  const Script& script =
+      Script::Handle(lib.LookupScript(String::Handle(String::New("test-lib"))));
 
   SourceReport report(SourceReport::kCoverage, SourceReport::kForceCompile);
   JSONStream js;
@@ -244,8 +244,8 @@
   Library& lib = Library::Handle();
   lib ^= ExecuteScript(kScript);
   ASSERT(!lib.IsNull());
-  const Script& script = Script::Handle(lib.LookupScript(
-      String::Handle(String::New("test-lib"))));
+  const Script& script =
+      Script::Handle(lib.LookupScript(String::Handle(String::New("test-lib"))));
 
   SourceReport report(SourceReport::kCoverage, SourceReport::kForceCompile);
   JSONStream js;
@@ -297,8 +297,8 @@
   Library& lib = Library::Handle();
   lib ^= ExecuteScript(kScript);
   ASSERT(!lib.IsNull());
-  const Script& script = Script::Handle(lib.LookupScript(
-      String::Handle(String::New("test-lib"))));
+  const Script& script =
+      Script::Handle(lib.LookupScript(String::Handle(String::New("test-lib"))));
 
   SourceReport report(SourceReport::kCoverage);
   JSONStream js;
@@ -353,8 +353,8 @@
   Library& lib = Library::Handle();
   lib ^= ExecuteScript(kScript);
   ASSERT(!lib.IsNull());
-  const Script& script = Script::Handle(lib.LookupScript(
-      String::Handle(String::New("test-lib"))));
+  const Script& script =
+      Script::Handle(lib.LookupScript(String::Handle(String::New("test-lib"))));
   const Function& helper = Function::Handle(
       lib.LookupLocalFunction(String::Handle(String::New("helper0"))));
 
@@ -480,8 +480,8 @@
   Library& lib = Library::Handle();
   lib ^= ExecuteScript(kScript);
   ASSERT(!lib.IsNull());
-  const Script& script = Script::Handle(lib.LookupScript(
-      String::Handle(String::New("test-lib"))));
+  const Script& script =
+      Script::Handle(lib.LookupScript(String::Handle(String::New("test-lib"))));
 
   SourceReport report(SourceReport::kCallSites);
   JSONStream js;
@@ -537,8 +537,8 @@
   Library& lib = Library::Handle();
   lib ^= ExecuteScript(kScript);
   ASSERT(!lib.IsNull());
-  const Script& script = Script::Handle(lib.LookupScript(
-      String::Handle(String::New("test-lib"))));
+  const Script& script =
+      Script::Handle(lib.LookupScript(String::Handle(String::New("test-lib"))));
   const Function& helper = Function::Handle(
       lib.LookupLocalFunction(String::Handle(String::New("helper"))));
 
@@ -601,10 +601,10 @@
   Library& lib = Library::Handle();
   lib ^= ExecuteScript(kScript);
   ASSERT(!lib.IsNull());
-  const Script& script = Script::Handle(lib.LookupScript(
-      String::Handle(String::New("test-lib"))));
+  const Script& script =
+      Script::Handle(lib.LookupScript(String::Handle(String::New("test-lib"))));
 
-  SourceReport report(SourceReport::kCallSites|SourceReport::kCoverage);
+  SourceReport report(SourceReport::kCallSites | SourceReport::kCoverage);
   JSONStream js;
   report.PrintJSON(&js, script);
   ElideJSONSubstring("classes", js.ToCString(), buffer);
@@ -654,8 +654,8 @@
   Library& lib = Library::Handle();
   lib ^= ExecuteScript(kScript);
   ASSERT(!lib.IsNull());
-  const Script& script = Script::Handle(lib.LookupScript(
-      String::Handle(String::New("test-lib"))));
+  const Script& script =
+      Script::Handle(lib.LookupScript(String::Handle(String::New("test-lib"))));
 
   SourceReport report(SourceReport::kPossibleBreakpoints);
   JSONStream js;
diff --git a/runtime/vm/spaces.h b/runtime/vm/spaces.h
index 4b94b481..33e2031 100644
--- a/runtime/vm/spaces.h
+++ b/runtime/vm/spaces.h
@@ -12,10 +12,7 @@
 
 // Usage statistics for a space/generation at a particular moment in time.
 struct SpaceUsage {
-  SpaceUsage()
-    : capacity_in_words(0),
-      used_in_words(0),
-      external_in_words(0) {}
+  SpaceUsage() : capacity_in_words(0), used_in_words(0), external_in_words(0) {}
   intptr_t capacity_in_words;
   intptr_t used_in_words;
   intptr_t external_in_words;
diff --git a/runtime/vm/stack_frame.cc b/runtime/vm/stack_frame.cc
index 6603127..b621047 100644
--- a/runtime/vm/stack_frame.cc
+++ b/runtime/vm/stack_frame.cc
@@ -46,19 +46,17 @@
     if (owner.IsFunction()) {
       const Function& function = Function::Cast(owner);
       return zone->PrintToString(
-          "[%-8s : sp(%#" Px ") fp(%#" Px ") pc(%#" Px ") %s ]",
-          GetName(), sp(), fp(), pc(),
-          function.ToFullyQualifiedCString());
+          "[%-8s : sp(%#" Px ") fp(%#" Px ") pc(%#" Px ") %s ]", GetName(),
+          sp(), fp(), pc(), function.ToFullyQualifiedCString());
     } else {
       return zone->PrintToString(
-          "[%-8s : sp(%#" Px ") fp(%#" Px ") pc(%#" Px ") %s ]",
-          GetName(), sp(), fp(), pc(),
-          owner.ToCString());
+          "[%-8s : sp(%#" Px ") fp(%#" Px ") pc(%#" Px ") %s ]", GetName(),
+          sp(), fp(), pc(), owner.ToCString());
     }
   } else {
-    return zone->PrintToString(
-        "[%-8s : sp(%#" Px ") fp(%#" Px ") pc(%#" Px ")]",
-        GetName(), sp(), fp(), pc());
+    return zone->PrintToString("[%-8s : sp(%#" Px ") fp(%#" Px ") pc(%#" Px
+                               ")]",
+                               GetName(), sp(), fp(), pc());
   }
 }
 
@@ -222,9 +220,9 @@
 
 
 RawCode* StackFrame::LookupDartCode() const {
-  // We add a no gc scope to ensure that the code below does not trigger
-  // a GC as we are handling raw object references here. It is possible
-  // that the code is called while a GC is in progress, that is ok.
+// We add a no gc scope to ensure that the code below does not trigger
+// a GC as we are handling raw object references here. It is possible
+// that the code is called while a GC is in progress, that is ok.
 #if !defined(TARGET_OS_WINDOWS)
   // On Windows, the profiler calls this from a separate thread where
   // Thread::Current() is NULL, so we cannot create a NoSafepointScope.
@@ -353,7 +351,8 @@
 }
 
 
-StackFrameIterator::StackFrameIterator(uword last_fp, bool validate,
+StackFrameIterator::StackFrameIterator(uword last_fp,
+                                       bool validate,
                                        Thread* thread)
     : validate_(validate),
       entry_(thread),
@@ -370,8 +369,11 @@
 
 
 #if !defined(TARGET_ARCH_DBC)
-StackFrameIterator::StackFrameIterator(uword fp, uword sp, uword pc,
-                                       bool validate, Thread* thread)
+StackFrameIterator::StackFrameIterator(uword fp,
+                                       uword sp,
+                                       uword pc,
+                                       bool validate,
+                                       Thread* thread)
     : validate_(validate),
       entry_(thread),
       exit_(thread),
@@ -410,7 +412,8 @@
       // Iteration starts from an exit frame given by its fp.
       current_frame_ = NextExitFrame();
     } else if (*(reinterpret_cast<uword*>(
-        frames_.fp_ + (kSavedCallerFpSlotFromFp * kWordSize))) == 0) {
+                   frames_.fp_ + (kSavedCallerFpSlotFromFp * kWordSize))) ==
+               0) {
       // Iteration starts from an entry frame given by its fp, sp, and pc.
       current_frame_ = NextEntryFrame();
     } else {
@@ -486,15 +489,15 @@
 
 
 InlinedFunctionsIterator::InlinedFunctionsIterator(const Code& code, uword pc)
-  : index_(0),
-    num_materializations_(0),
-    dest_frame_size_(0),
-    code_(Code::Handle(code.raw())),
-    deopt_info_(TypedData::Handle()),
-    function_(Function::Handle()),
-    pc_(pc),
-    deopt_instructions_(),
-    object_table_(ObjectPool::Handle()) {
+    : index_(0),
+      num_materializations_(0),
+      dest_frame_size_(0),
+      code_(Code::Handle(code.raw())),
+      deopt_info_(TypedData::Handle()),
+      function_(Function::Handle()),
+      pc_(pc),
+      deopt_instructions_(),
+      object_table_(ObjectPool::Handle()) {
   ASSERT(code_.is_optimized());
   ASSERT(pc_ != 0);
   ASSERT(code.ContainsInstructionAt(pc));
@@ -546,9 +549,7 @@
 // current frame were to be deoptimized.
 intptr_t InlinedFunctionsIterator::GetDeoptFpOffset() const {
   ASSERT(deopt_instructions_.length() != 0);
-  for (intptr_t index = index_;
-       index < deopt_instructions_.length();
-       index++) {
+  for (intptr_t index = index_; index < deopt_instructions_.length(); index++) {
     DeoptInstr* deopt_instr = deopt_instructions_[index];
     if (deopt_instr->kind() == DeoptInstr::kCallerFp) {
 #if defined(TARGET_ARCH_DBC)
diff --git a/runtime/vm/stack_frame.h b/runtime/vm/stack_frame.h
index 5076939..dcc6cee 100644
--- a/runtime/vm/stack_frame.h
+++ b/runtime/vm/stack_frame.h
@@ -35,7 +35,7 @@
 // Generic stack frame.
 class StackFrame : public ValueObject {
  public:
-  virtual ~StackFrame() { }
+  virtual ~StackFrame() {}
 
   // Accessors to get the pc, sp and fp of a frame.
   uword sp() const { return sp_; }
@@ -52,8 +52,8 @@
   }
 
   uword IsMarkedForLazyDeopt() const {
-    uword raw_pc = *reinterpret_cast<uword*>(
-        sp() + (kSavedPcSlotFromSp * kWordSize));
+    uword raw_pc =
+        *reinterpret_cast<uword*>(sp() + (kSavedPcSlotFromSp * kWordSize));
     return raw_pc == StubCode::DeoptimizeLazyFromReturn_entry()->EntryPoint();
   }
   void MarkForLazyDeopt() {
@@ -107,10 +107,12 @@
 
  protected:
   explicit StackFrame(Thread* thread)
-      : fp_(0), sp_(0), pc_(0), thread_(thread) { }
+      : fp_(0), sp_(0), pc_(0), thread_(thread) {}
 
   // Name of the frame, used for generic frame printing functionality.
-  virtual const char* GetName() const { return IsStubFrame()? "stub" : "dart"; }
+  virtual const char* GetName() const {
+    return IsStubFrame() ? "stub" : "dart";
+  }
 
   Isolate* isolate() const { return thread_->isolate(); }
 
@@ -119,13 +121,11 @@
  private:
   RawCode* GetCodeObject() const;
 
-  uword GetCallerSp() const {
-    return fp() + (kCallerSpSlotFromFp * kWordSize);
-  }
+  uword GetCallerSp() const { return fp() + (kCallerSpSlotFromFp * kWordSize); }
 
   uword GetCallerFp() const {
-    return *(reinterpret_cast<uword*>(
-      fp() + (kSavedCallerFpSlotFromFp * kWordSize)));
+    return *(reinterpret_cast<uword*>(fp() +
+                                      (kSavedCallerFpSlotFromFp * kWordSize)));
   }
 
   uword GetCallerPc() const {
@@ -167,7 +167,7 @@
   virtual const char* GetName() const { return "exit"; }
 
  private:
-  explicit ExitFrame(Thread* thread) : StackFrame(thread) { }
+  explicit ExitFrame(Thread* thread) : StackFrame(thread) {}
 
   friend class StackFrameIterator;
   DISALLOW_COPY_AND_ASSIGN(ExitFrame);
@@ -178,9 +178,7 @@
 // dart code.
 class EntryFrame : public StackFrame {
  public:
-  bool IsValid() const {
-    return StubCode::InInvocationStub(pc());
-  }
+  bool IsValid() const { return StubCode::InInvocationStub(pc()); }
   bool IsDartFrame(bool validate = true) const { return false; }
   bool IsStubFrame() const { return false; }
   bool IsEntryFrame() const { return true; }
@@ -192,7 +190,7 @@
   virtual const char* GetName() const { return "entry"; }
 
  private:
-  explicit EntryFrame(Thread* thread) : StackFrame(thread) { }
+  explicit EntryFrame(Thread* thread) : StackFrame(thread) {}
 
   friend class StackFrameIterator;
   DISALLOW_COPY_AND_ASSIGN(EntryFrame);
@@ -211,15 +209,19 @@
 
   // Iterators for iterating over all frames from the last ExitFrame to the
   // first EntryFrame.
-  StackFrameIterator(bool validate,
-                     Thread* thread = Thread::Current());
-  StackFrameIterator(uword last_fp, bool validate,
+  explicit StackFrameIterator(bool validate,
+                              Thread* thread = Thread::Current());
+  StackFrameIterator(uword last_fp,
+                     bool validate,
                      Thread* thread = Thread::Current());
 
 #if !defined(TARGET_ARCH_DBC)
   // Iterator for iterating over all frames from the current frame (given by its
   // fp, sp, and pc) to the first EntryFrame.
-  StackFrameIterator(uword fp, uword sp, uword pc, bool validate,
+  StackFrameIterator(uword fp,
+                     uword sp,
+                     uword pc,
+                     bool validate,
                      Thread* thread = Thread::Current());
 #endif
 
@@ -241,8 +243,8 @@
       if (fp_ == 0) {
         return false;
       }
-      const uword pc = *(reinterpret_cast<uword*>(
-          sp_ + (kSavedPcSlotFromSp * kWordSize)));
+      const uword pc =
+          *(reinterpret_cast<uword*>(sp_ + (kSavedPcSlotFromSp * kWordSize)));
       return !StubCode::InInvocationStub(pc);
     }
 
@@ -251,7 +253,7 @@
 
    private:
     explicit FrameSetIterator(Thread* thread)
-        : fp_(0), sp_(0), pc_(0), stack_frame_(thread), thread_(thread) { }
+        : fp_(0), sp_(0), pc_(0), stack_frame_(thread), thread_(thread) {}
     uword fp_;
     uword sp_;
     uword pc_;
@@ -277,9 +279,9 @@
   void SetupLastExitFrameData();
   void SetupNextExitFrameData();
 
-  bool validate_;  // Validate each frame as we traverse the frames.
+  bool validate_;     // Validate each frame as we traverse the frames.
   EntryFrame entry_;  // Singleton entry frame returned by NextEntryFrame().
-  ExitFrame exit_;  // Singleton exit frame returned by NextExitFrame().
+  ExitFrame exit_;    // Singleton exit frame returned by NextExitFrame().
   FrameSetIterator frames_;
   StackFrame* current_frame_;  // Points to the current frame in the iterator.
   Thread* thread_;
@@ -298,19 +300,16 @@
 class DartFrameIterator : public ValueObject {
  public:
   explicit DartFrameIterator(Thread* thread = Thread::Current())
-      : frames_(StackFrameIterator::kDontValidateFrames, thread) { }
-  DartFrameIterator(uword last_fp,
-                    Thread* thread = Thread::Current())
-      : frames_(last_fp, StackFrameIterator::kDontValidateFrames, thread) { }
+      : frames_(StackFrameIterator::kDontValidateFrames, thread) {}
+  explicit DartFrameIterator(uword last_fp, Thread* thread = Thread::Current())
+      : frames_(last_fp, StackFrameIterator::kDontValidateFrames, thread) {}
 
 #if !defined(TARGET_ARCH_DBC)
   DartFrameIterator(uword fp,
                     uword sp,
                     uword pc,
                     Thread* thread = Thread::Current())
-      : frames_(fp, sp, pc,
-                StackFrameIterator::kDontValidateFrames, thread) {
-  }
+      : frames_(fp, sp, pc, StackFrameIterator::kDontValidateFrames, thread) {}
 #endif
 
   // Get next dart frame.
diff --git a/runtime/vm/stack_frame_dbc.h b/runtime/vm/stack_frame_dbc.h
index f355fa9..9cc08ac 100644
--- a/runtime/vm/stack_frame_dbc.h
+++ b/runtime/vm/stack_frame_dbc.h
@@ -43,7 +43,7 @@
 static const int kSavedCallerFpSlotFromFp = -1;
 static const int kSavedCallerPpSlotFromFp = kSavedCallerFpSlotFromFp;
 static const int kSavedCallerPcSlotFromFp = -2;
-static const int kCallerSpSlotFromFp = -kDartFrameFixedSize-1;
+static const int kCallerSpSlotFromFp = -kDartFrameFixedSize - 1;
 static const int kPcMarkerSlotFromFp = -3;
 static const int kFunctionSlotFromFp = -4;
 
diff --git a/runtime/vm/stack_frame_test.cc b/runtime/vm/stack_frame_test.cc
index a2198aa..d1ebde6 100644
--- a/runtime/vm/stack_frame_test.cc
+++ b/runtime/vm/stack_frame_test.cc
@@ -34,8 +34,7 @@
 
 
 #define FUNCTION_NAME(name) StackFrame_##name
-#define REGISTER_FUNCTION(name, count)                                         \
-  { ""#name, FUNCTION_NAME(name), count },
+#define REGISTER_FUNCTION(name, count) {"" #name, FUNCTION_NAME(name), count},
 
 
 void FUNCTION_NAME(StackFrame_equals)(Dart_NativeArguments args) {
@@ -43,8 +42,8 @@
   const Instance& expected = Instance::CheckedHandle(arguments->NativeArgAt(0));
   const Instance& actual = Instance::CheckedHandle(arguments->NativeArgAt(1));
   if (!expected.OperatorEquals(actual)) {
-    OS::Print("expected: '%s' actual: '%s'\n",
-        expected.ToCString(), actual.ToCString());
+    OS::Print("expected: '%s' actual: '%s'\n", expected.ToCString(),
+              actual.ToCString());
     FATAL("Expect_equals fails.\n");
   }
 }
@@ -99,8 +98,8 @@
       const char* name = function.ToFullyQualifiedCString();
       // Currently all unit tests are loaded as being part of dart:core-lib.
       String& url = String::Handle(zone, String::New(TestCase::url()));
-      const Library& lib = Library::Handle(zone,
-                                           Library::LookupLibrary(thread, url));
+      const Library& lib =
+          Library::Handle(zone, Library::LookupLibrary(thread, url));
       ASSERT(!lib.IsNull());
       const char* lib_name = String::Handle(zone, lib.url()).ToCString();
       char* full_name = OS::SCreate(zone, "%s_%s", lib_name, expected_name);
@@ -123,16 +122,14 @@
   V(StackFrame_equals, 2)                                                      \
   V(StackFrame_frameCount, 0)                                                  \
   V(StackFrame_dartFrameCount, 0)                                              \
-  V(StackFrame_validateFrame, 2)                                               \
+  V(StackFrame_validateFrame, 2)
 
 
 static struct NativeEntries {
   const char* name_;
   Dart_NativeFunction function_;
   int argument_count_;
-} BuiltinEntries[] = {
-  STACKFRAME_NATIVE_LIST(REGISTER_FUNCTION)
-};
+} BuiltinEntries[] = {STACKFRAME_NATIVE_LIST(REGISTER_FUNCTION)};
 
 
 static Dart_NativeFunction native_lookup(Dart_Handle name,
@@ -237,8 +234,7 @@
       "  }"
       "}";
   Dart_Handle lib = TestCase::LoadTestScript(
-      kScriptChars,
-      reinterpret_cast<Dart_NativeEntryResolver>(native_lookup));
+      kScriptChars, reinterpret_cast<Dart_NativeEntryResolver>(native_lookup));
   Dart_Handle cls = Dart_GetClass(lib, NewString("StackFrameTest"));
   EXPECT_VALID(Dart_Invoke(cls, NewString("testMain"), 0, NULL));
 }
@@ -252,75 +248,77 @@
   // methods are marked invisible.
   if (FLAG_lazy_dispatchers) {
     kScriptChars =
-      "class StackFrame {"
-      "  static equals(var obj1, var obj2) native \"StackFrame_equals\";"
-      "  static int frameCount() native \"StackFrame_frameCount\";"
-      "  static int dartFrameCount() native \"StackFrame_dartFrameCount\";"
-      "  static validateFrame(int index,"
-      "                       String name) native \"StackFrame_validateFrame\";"
-      "} "
-      "class StackFrame2Test {"
-      "  StackFrame2Test() {}"
-      "  noSuchMethod(Invocation im) {"
-      "    /* We should have 6 general frames and 4 dart frames as follows:"
-      "     * exit frame"
-      "     * dart frame corresponding to StackFrame.frameCount"
-      "     * dart frame corresponding to StackFrame2Test.noSuchMethod"
-      "     * frame for instance function invocation stub calling noSuchMethod"
-      "     * dart frame corresponding to StackFrame2Test.testMain"
-      "     * entry frame"
-      "     */"
-      "    StackFrame.equals(6, StackFrame.frameCount());"
-      "    StackFrame.equals(4, StackFrame.dartFrameCount());"
-      "    StackFrame.validateFrame(0, \"StackFrame_validateFrame\");"
-      "    StackFrame.validateFrame(1, \"StackFrame2Test_noSuchMethod\");"
-      "    StackFrame.validateFrame(2, \"StackFrame2Test_foo\");"
-      "    StackFrame.validateFrame(3, \"StackFrame2Test_testMain\");"
-      "    return 5;"
-      "  }"
-      "  static testMain() {"
-      "    var obj = new StackFrame2Test();"
-      "    StackFrame.equals(5, obj.foo(101, 202));"
-      "  }"
-      "}";
+        "class StackFrame {"
+        "  static equals(var obj1, var obj2) native \"StackFrame_equals\";"
+        "  static int frameCount() native \"StackFrame_frameCount\";"
+        "  static int dartFrameCount() native \"StackFrame_dartFrameCount\";"
+        "  static validateFrame(int index,"
+        "                       String name) native "
+        "\"StackFrame_validateFrame\";"
+        "} "
+        "class StackFrame2Test {"
+        "  StackFrame2Test() {}"
+        "  noSuchMethod(Invocation im) {"
+        "    /* We should have 6 general frames and 4 dart frames as follows:"
+        "     * exit frame"
+        "     * dart frame corresponding to StackFrame.frameCount"
+        "     * dart frame corresponding to StackFrame2Test.noSuchMethod"
+        "     * frame for instance function invocation stub calling "
+        "noSuchMethod"
+        "     * dart frame corresponding to StackFrame2Test.testMain"
+        "     * entry frame"
+        "     */"
+        "    StackFrame.equals(6, StackFrame.frameCount());"
+        "    StackFrame.equals(4, StackFrame.dartFrameCount());"
+        "    StackFrame.validateFrame(0, \"StackFrame_validateFrame\");"
+        "    StackFrame.validateFrame(1, \"StackFrame2Test_noSuchMethod\");"
+        "    StackFrame.validateFrame(2, \"StackFrame2Test_foo\");"
+        "    StackFrame.validateFrame(3, \"StackFrame2Test_testMain\");"
+        "    return 5;"
+        "  }"
+        "  static testMain() {"
+        "    var obj = new StackFrame2Test();"
+        "    StackFrame.equals(5, obj.foo(101, 202));"
+        "  }"
+        "}";
   } else {
     kScriptChars =
-      "class StackFrame {"
-      "  static equals(var obj1, var obj2) native \"StackFrame_equals\";"
-      "  static int frameCount() native \"StackFrame_frameCount\";"
-      "  static int dartFrameCount() native \"StackFrame_dartFrameCount\";"
-      "  static validateFrame(int index,"
-      "                       String name) native \"StackFrame_validateFrame\";"
-      "} "
-      "class StackFrame2Test {"
-      "  StackFrame2Test() {}"
-      "  noSuchMethod(Invocation im) {"
-      "    /* We should have 8 general frames and 3 dart frames as follows:"
-      "     * exit frame"
-      "     * dart frame corresponding to StackFrame.frameCount"
-      "     * dart frame corresponding to StackFrame2Test.noSuchMethod"
-      "     * entry frame"
-      "     * exit frame (call to runtime InvokeNoSuchMethodDispatcher)"
-      "     * IC stub"
-      "     * dart frame corresponding to StackFrame2Test.testMain"
-      "     * entry frame"
-      "     */"
-      "    StackFrame.equals(8, StackFrame.frameCount());"
-      "    StackFrame.equals(3, StackFrame.dartFrameCount());"
-      "    StackFrame.validateFrame(0, \"StackFrame_validateFrame\");"
-      "    StackFrame.validateFrame(1, \"StackFrame2Test_noSuchMethod\");"
-      "    StackFrame.validateFrame(2, \"StackFrame2Test_testMain\");"
-      "    return 5;"
-      "  }"
-      "  static testMain() {"
-      "    var obj = new StackFrame2Test();"
-      "    StackFrame.equals(5, obj.foo(101, 202));"
-      "  }"
-      "}";
+        "class StackFrame {"
+        "  static equals(var obj1, var obj2) native \"StackFrame_equals\";"
+        "  static int frameCount() native \"StackFrame_frameCount\";"
+        "  static int dartFrameCount() native \"StackFrame_dartFrameCount\";"
+        "  static validateFrame(int index,"
+        "                       String name) native "
+        "\"StackFrame_validateFrame\";"
+        "} "
+        "class StackFrame2Test {"
+        "  StackFrame2Test() {}"
+        "  noSuchMethod(Invocation im) {"
+        "    /* We should have 8 general frames and 3 dart frames as follows:"
+        "     * exit frame"
+        "     * dart frame corresponding to StackFrame.frameCount"
+        "     * dart frame corresponding to StackFrame2Test.noSuchMethod"
+        "     * entry frame"
+        "     * exit frame (call to runtime InvokeNoSuchMethodDispatcher)"
+        "     * IC stub"
+        "     * dart frame corresponding to StackFrame2Test.testMain"
+        "     * entry frame"
+        "     */"
+        "    StackFrame.equals(8, StackFrame.frameCount());"
+        "    StackFrame.equals(3, StackFrame.dartFrameCount());"
+        "    StackFrame.validateFrame(0, \"StackFrame_validateFrame\");"
+        "    StackFrame.validateFrame(1, \"StackFrame2Test_noSuchMethod\");"
+        "    StackFrame.validateFrame(2, \"StackFrame2Test_testMain\");"
+        "    return 5;"
+        "  }"
+        "  static testMain() {"
+        "    var obj = new StackFrame2Test();"
+        "    StackFrame.equals(5, obj.foo(101, 202));"
+        "  }"
+        "}";
   }
   Dart_Handle lib = TestCase::LoadTestScript(
-      kScriptChars,
-      reinterpret_cast<Dart_NativeEntryResolver>(native_lookup));
+      kScriptChars, reinterpret_cast<Dart_NativeEntryResolver>(native_lookup));
   Dart_Handle cls = Dart_GetClass(lib, NewString("StackFrame2Test"));
   EXPECT_VALID(Dart_Invoke(cls, NewString("testMain"), 0, NULL));
 }
diff --git a/runtime/vm/store_buffer.cc b/runtime/vm/store_buffer.cc
index 67f0fcb..95e6f96 100644
--- a/runtime/vm/store_buffer.cc
+++ b/runtime/vm/store_buffer.cc
@@ -15,40 +15,39 @@
 }
 END_LEAF_RUNTIME_ENTRY
 
-template<int BlockSize>
-typename BlockStack<BlockSize>::List*
-BlockStack<BlockSize>::global_empty_ = NULL;
-template<int BlockSize>
+template <int BlockSize>
+typename BlockStack<BlockSize>::List* BlockStack<BlockSize>::global_empty_ =
+    NULL;
+template <int BlockSize>
 Mutex* BlockStack<BlockSize>::global_mutex_ = NULL;
 
 
-template<int BlockSize>
+template <int BlockSize>
 void BlockStack<BlockSize>::InitOnce() {
   global_empty_ = new List();
   global_mutex_ = new Mutex();
 }
 
 
-template<int BlockSize>
+template <int BlockSize>
 void BlockStack<BlockSize>::ShutDown() {
   delete global_empty_;
   delete global_mutex_;
 }
 
 
-template<int BlockSize>
-BlockStack<BlockSize>::BlockStack() : mutex_(new Mutex()) {
-}
+template <int BlockSize>
+BlockStack<BlockSize>::BlockStack() : mutex_(new Mutex()) {}
 
 
-template<int BlockSize>
+template <int BlockSize>
 BlockStack<BlockSize>::~BlockStack() {
   Reset();
   delete mutex_;
 }
 
 
-template<int BlockSize>
+template <int BlockSize>
 void BlockStack<BlockSize>::Reset() {
   MutexLocker local_mutex_locker(mutex_);
   {
@@ -69,7 +68,7 @@
 }
 
 
-template<int BlockSize>
+template <int BlockSize>
 typename BlockStack<BlockSize>::Block* BlockStack<BlockSize>::Blocks() {
   MutexLocker ml(mutex_);
   while (!partial_.IsEmpty()) {
@@ -79,7 +78,7 @@
 }
 
 
-template<int BlockSize>
+template <int BlockSize>
 void BlockStack<BlockSize>::PushBlockImpl(Block* block) {
   ASSERT(block->next() == NULL);  // Should be just a single block.
   if (block->IsFull()) {
@@ -110,7 +109,7 @@
 }
 
 
-template<int BlockSize>
+template <int BlockSize>
 typename BlockStack<BlockSize>::Block*
 BlockStack<BlockSize>::PopNonFullBlock() {
   {
@@ -123,7 +122,7 @@
 }
 
 
-template<int BlockSize>
+template <int BlockSize>
 typename BlockStack<BlockSize>::Block* BlockStack<BlockSize>::PopEmptyBlock() {
   {
     MutexLocker ml(global_mutex_);
@@ -135,7 +134,7 @@
 }
 
 
-template<int BlockSize>
+template <int BlockSize>
 typename BlockStack<BlockSize>::Block*
 BlockStack<BlockSize>::PopNonEmptyBlock() {
   MutexLocker ml(mutex_);
@@ -149,14 +148,14 @@
 }
 
 
-template<int BlockSize>
+template <int BlockSize>
 bool BlockStack<BlockSize>::IsEmpty() {
   MutexLocker ml(mutex_);
   return full_.IsEmpty() && partial_.IsEmpty();
 }
 
 
-template<int BlockSize>
+template <int BlockSize>
 BlockStack<BlockSize>::List::~List() {
   while (!IsEmpty()) {
     delete Pop();
@@ -164,7 +163,7 @@
 }
 
 
-template<int BlockSize>
+template <int BlockSize>
 typename BlockStack<BlockSize>::Block* BlockStack<BlockSize>::List::Pop() {
   Block* result = head_;
   head_ = head_->next_;
@@ -174,7 +173,7 @@
 }
 
 
-template<int BlockSize>
+template <int BlockSize>
 typename BlockStack<BlockSize>::Block* BlockStack<BlockSize>::List::PopAll() {
   Block* result = head_;
   head_ = NULL;
@@ -183,7 +182,7 @@
 }
 
 
-template<int BlockSize>
+template <int BlockSize>
 void BlockStack<BlockSize>::List::Push(Block* block) {
   ASSERT(block->next_ == NULL);
   block->next_ = head_;
@@ -198,7 +197,7 @@
 }
 
 
-template<int BlockSize>
+template <int BlockSize>
 void BlockStack<BlockSize>::TrimGlobalEmpty() {
   DEBUG_ASSERT(global_mutex_->IsOwnedByCurrentThread());
   while (global_empty_->length() > kMaxGlobalEmpty) {
diff --git a/runtime/vm/store_buffer.h b/runtime/vm/store_buffer.h
index 46b0110..45a0957 100644
--- a/runtime/vm/store_buffer.h
+++ b/runtime/vm/store_buffer.h
@@ -16,7 +16,7 @@
 class RawObject;
 
 // A set of RawObject*. Must be emptied before destruction (using Pop/Reset).
-template<int Size>
+template <int Size>
 class PointerBlock {
  public:
   enum { kSize = Size };
@@ -68,7 +68,8 @@
   int32_t top_;
   RawObject* pointers_[kSize];
 
-  template<int> friend class BlockStack;
+  template <int>
+  friend class BlockStack;
 
   DISALLOW_COPY_AND_ASSIGN(PointerBlock);
 };
@@ -77,7 +78,7 @@
 // A synchronized collection of pointer blocks of a particular size.
 // This class is meant to be used as a base (note PushBlockImpl is protected).
 // The global list of cached empty blocks is currently per-size.
-template<int BlockSize>
+template <int BlockSize>
 class BlockStack {
  public:
   typedef PointerBlock<BlockSize> Block;
@@ -112,6 +113,7 @@
     intptr_t length() const { return length_; }
     bool IsEmpty() const { return head_ == NULL; }
     Block* PopAll();
+
    private:
     Block* head_;
     intptr_t length_;
@@ -144,10 +146,7 @@
   // Interrupt when crossing this threshold of non-empty blocks in the buffer.
   static const intptr_t kMaxNonEmpty = 100;
 
-  enum ThresholdPolicy {
-    kCheckThreshold,
-    kIgnoreThreshold
-  };
+  enum ThresholdPolicy { kCheckThreshold, kIgnoreThreshold };
 
   // Adds and transfers ownership of the block to the buffer. Optionally
   // checks the number of non-empty blocks for overflow, and schedules an
diff --git a/runtime/vm/stub_code.cc b/runtime/vm/stub_code.cc
index f0eaf6d..0418da8 100644
--- a/runtime/vm/stub_code.cc
+++ b/runtime/vm/stub_code.cc
@@ -20,8 +20,7 @@
 
 DEFINE_FLAG(bool, disassemble_stubs, false, "Disassemble generated stubs.");
 
-#define STUB_CODE_DECLARE(name)                                                \
-  StubEntry* StubCode::name##_entry_ = NULL;
+#define STUB_CODE_DECLARE(name) StubEntry* StubCode::name##_entry_ = NULL;
 VM_STUB_CODE_LIST(STUB_CODE_DECLARE);
 #undef STUB_CODE_DECLARE
 
@@ -31,8 +30,7 @@
       entry_point_(code.UncheckedEntryPoint()),
       checked_entry_point_(code.CheckedEntryPoint()),
       size_(code.Size()),
-      label_(code.UncheckedEntryPoint()) {
-}
+      label_(code.UncheckedEntryPoint()) {}
 
 
 // Visit all object pointers.
@@ -43,7 +41,7 @@
 
 
 #define STUB_CODE_GENERATE(name)                                               \
-  code ^= Generate("_stub_"#name, StubCode::Generate##name##Stub);             \
+  code ^= Generate("_stub_" #name, StubCode::Generate##name##Stub);            \
   name##_entry_ = new StubEntry(code);
 
 
@@ -62,16 +60,14 @@
 
 
 void StubCode::Push(Serializer* serializer) {
-#define WRITE_STUB(name)                                                       \
-  serializer->Push(StubCode::name##_entry()->code());
+#define WRITE_STUB(name) serializer->Push(StubCode::name##_entry()->code());
   VM_STUB_CODE_LIST(WRITE_STUB);
 #undef WRITE_STUB
 }
 
 
 void StubCode::WriteRef(Serializer* serializer) {
-#define WRITE_STUB(name)                                                       \
-  serializer->WriteRef(StubCode::name##_entry()->code());
+#define WRITE_STUB(name) serializer->WriteRef(StubCode::name##_entry()->code());
   VM_STUB_CODE_LIST(WRITE_STUB);
 #undef WRITE_STUB
 }
@@ -87,12 +83,10 @@
 }
 
 
-
-void StubCode::Init(Isolate* isolate) { }
+void StubCode::Init(Isolate* isolate) {}
 
 
-void StubCode::VisitObjectPointers(ObjectPointerVisitor* visitor) {
-}
+void StubCode::VisitObjectPointers(ObjectPointerVisitor* visitor) {}
 
 
 bool StubCode::HasBeenInitialized() {
@@ -135,7 +129,7 @@
 
 
 RawCode* StubCode::GetAllocationStubForClass(const Class& cls) {
-  // These stubs are not used by DBC.
+// These stubs are not used by DBC.
 #if !defined(TARGET_ARCH_DBC)
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
@@ -205,7 +199,7 @@
 
 const StubEntry* StubCode::UnoptimizedStaticCallEntry(
     intptr_t num_args_tested) {
-  // These stubs are not used by DBC.
+// These stubs are not used by DBC.
 #if !defined(TARGET_ARCH_DBC)
   switch (num_args_tested) {
     case 0:
@@ -228,8 +222,8 @@
                             void (*GenerateStub)(Assembler* assembler)) {
   Assembler assembler;
   GenerateStub(&assembler);
-  const Code& code = Code::Handle(
-      Code::FinalizeCode(name, &assembler, false /* optimized */));
+  const Code& code =
+      Code::Handle(Code::FinalizeCode(name, &assembler, false /* optimized */));
 #ifndef PRODUCT
   if (FLAG_support_disassembler && FLAG_disassemble_stubs) {
     LogBlock lb;
@@ -249,7 +243,7 @@
 #define VM_STUB_CODE_TESTER(name)                                              \
   if ((name##_entry() != NULL) &&                                              \
       (entry_point == name##_entry()->EntryPoint())) {                         \
-    return ""#name;                                                            \
+    return "" #name;                                                           \
   }
   VM_STUB_CODE_LIST(VM_STUB_CODE_TESTER);
 #undef VM_STUB_CODE_TESTER
diff --git a/runtime/vm/stub_code.h b/runtime/vm/stub_code.h
index d183296..7d0dd14 100644
--- a/runtime/vm/stub_code.h
+++ b/runtime/vm/stub_code.h
@@ -67,7 +67,7 @@
   V(Subtype2TestCache)                                                         \
   V(Subtype3TestCache)                                                         \
   V(CallClosureNoSuchMethod)                                                   \
-  V(FrameAwaitingMaterialization)                                              \
+  V(FrameAwaitingMaterialization)
 
 #else
 #define VM_STUB_CODE_LIST(V)                                                   \
@@ -77,7 +77,7 @@
   V(Deoptimize)                                                                \
   V(DeoptimizeLazyFromReturn)                                                  \
   V(DeoptimizeLazyFromThrow)                                                   \
-  V(FrameAwaitingMaterialization)                                              \
+  V(FrameAwaitingMaterialization)
 
 #endif  // !defined(TARGET_ARCH_DBC)
 
@@ -144,14 +144,10 @@
   // Returns NULL if no stub found.
   static const char* NameOfStub(uword entry_point);
 
-  // Define the shared stub code accessors.
+// Define the shared stub code accessors.
 #define STUB_CODE_ACCESSOR(name)                                               \
-  static const StubEntry* name##_entry() {                                     \
-    return name##_entry_;                                                      \
-  }                                                                            \
-  static intptr_t name##Size() {                                               \
-    return name##_entry()->Size();                                             \
-  }
+  static const StubEntry* name##_entry() { return name##_entry_; }             \
+  static intptr_t name##Size() { return name##_entry()->Size(); }
   VM_STUB_CODE_LIST(STUB_CODE_ACCESSOR);
 #undef STUB_CODE_ACCESSOR
 
@@ -171,8 +167,7 @@
   VM_STUB_CODE_LIST(STUB_CODE_GENERATE);
 #undef STUB_CODE_GENERATE
 
-#define STUB_CODE_ENTRY(name)                                                  \
-  static StubEntry* name##_entry_;
+#define STUB_CODE_ENTRY(name) static StubEntry* name##_entry_;
   VM_STUB_CODE_LIST(STUB_CODE_ENTRY);
 #undef STUB_CODE_ENTRY
 
@@ -196,11 +191,7 @@
 };
 
 
-enum DeoptStubKind {
-  kLazyDeoptFromReturn,
-  kLazyDeoptFromThrow,
-  kEagerDeopt
-};
+enum DeoptStubKind { kLazyDeoptFromReturn, kLazyDeoptFromThrow, kEagerDeopt };
 
 }  // namespace dart
 
diff --git a/runtime/vm/stub_code_arm.cc b/runtime/vm/stub_code_arm.cc
index 6831e9a..10722cc 100644
--- a/runtime/vm/stub_code_arm.cc
+++ b/runtime/vm/stub_code_arm.cc
@@ -23,8 +23,10 @@
 namespace dart {
 
 DEFINE_FLAG(bool, inline_alloc, true, "Inline allocation of objects.");
-DEFINE_FLAG(bool, use_slow_path, false,
-    "Set to true for debugging & verifying the slow paths.");
+DEFINE_FLAG(bool,
+            use_slow_path,
+            false,
+            "Set to true for debugging & verifying the slow paths.");
 DECLARE_FLAG(bool, trace_optimized_ic_calls);
 
 // Input parameters:
@@ -47,7 +49,8 @@
   __ StoreToOffset(kWord, FP, THR, Thread::top_exit_frame_info_offset());
 
 #if defined(DEBUG)
-  { Label ok;
+  {
+    Label ok;
     // Check that we are always entering from Dart code.
     __ LoadFromOffset(kWord, R8, THR, Thread::vm_tag_offset());
     __ CompareImmediate(R8, VMTag::kDartTagId);
@@ -139,7 +142,8 @@
   __ StoreToOffset(kWord, FP, THR, Thread::top_exit_frame_info_offset());
 
 #if defined(DEBUG)
-  { Label ok;
+  {
+    Label ok;
     // Check that we are always entering from Dart code.
     __ LoadFromOffset(kWord, R8, THR, Thread::vm_tag_offset());
     __ CompareImmediate(R8, VMTag::kDartTagId);
@@ -179,7 +183,7 @@
   // Passing the structure by value as in runtime calls would require changing
   // Dart API for native functions.
   // For now, space is reserved on the stack and we pass a pointer to it.
-  __ stm(IA, SP,  (1 << R0) | (1 << R1) | (1 << R2) | (1 << R3));
+  __ stm(IA, SP, (1 << R0) | (1 << R1) | (1 << R2) | (1 << R3));
   __ mov(R0, Operand(SP));  // Pass the pointer to the NativeArguments.
 
   __ mov(R1, Operand(R9));  // Pass the function entrypoint to call.
@@ -220,7 +224,8 @@
   __ StoreToOffset(kWord, FP, THR, Thread::top_exit_frame_info_offset());
 
 #if defined(DEBUG)
-  { Label ok;
+  {
+    Label ok;
     // Check that we are always entering from Dart code.
     __ LoadFromOffset(kWord, R8, THR, Thread::vm_tag_offset());
     __ CompareImmediate(R8, VMTag::kDartTagId);
@@ -260,7 +265,7 @@
   // Passing the structure by value as in runtime calls would require changing
   // Dart API for native functions.
   // For now, space is reserved on the stack and we pass a pointer to it.
-  __ stm(IA, SP,  (1 << R0) | (1 << R1) | (1 << R2) | (1 << R3));
+  __ stm(IA, SP, (1 << R0) | (1 << R1) | (1 << R2) | (1 << R3));
   __ mov(R0, Operand(SP));  // Pass the pointer to the NativeArguments.
 
   // Call native function or redirection via simulator.
@@ -463,8 +468,8 @@
   }
 
   __ mov(R0, Operand(SP));  // Pass address of saved registers block.
-  bool is_lazy = (kind == kLazyDeoptFromReturn) ||
-                 (kind == kLazyDeoptFromThrow);
+  bool is_lazy =
+      (kind == kLazyDeoptFromReturn) || (kind == kLazyDeoptFromThrow);
   __ mov(R1, Operand(is_lazy ? 1 : 0));
   __ ReserveAlignedFrameSpace(0);
   __ CallRuntime(kDeoptimizeCopyFrameRuntimeEntry, 2);
@@ -645,7 +650,7 @@
   // Compute the size to be allocated, it is based on the array length
   // and is computed as:
   // RoundedAllocationSize((array_length * kwordSize) + sizeof(RawArray)).
-  __ MoveRegister(R3, R2);   // Array length.
+  __ MoveRegister(R3, R2);  // Array length.
   // Check that length is a positive Smi.
   __ tst(R3, Operand(kSmiTagMask));
   if (FLAG_use_slow_path) {
@@ -677,7 +682,7 @@
   // Potential new object start.
   __ ldr(R0, Address(R8, Heap::TopOffset(space)));
   __ adds(NOTFP, R0, Operand(R9));  // Potential next object start.
-  __ b(&slow_case, CS);  // Branch if unsigned overflow.
+  __ b(&slow_case, CS);             // Branch if unsigned overflow.
 
   // Check if the allocation fits into the remaining space.
   // R0: potential new object start.
@@ -715,14 +720,11 @@
   // R0: new object start as a tagged pointer.
   // NOTFP: new object end address.
   // Store the type argument field.
-  __ StoreIntoObjectNoBarrier(R0,
-                              FieldAddress(R0, Array::type_arguments_offset()),
-                              R1);
+  __ StoreIntoObjectNoBarrier(
+      R0, FieldAddress(R0, Array::type_arguments_offset()), R1);
 
   // Set the length field.
-  __ StoreIntoObjectNoBarrier(R0,
-                              FieldAddress(R0, Array::length_offset()),
-                              R2);
+  __ StoreIntoObjectNoBarrier(R0, FieldAddress(R0, Array::length_offset()), R2);
 
   // Initialize all array elements to raw_null.
   // R0: new object start as a tagged pointer.
@@ -1021,7 +1023,7 @@
   __ Bind(&add_to_buffer);
   // R2: Header word.
   if (TargetCPUFeatures::arm_version() == ARMv5TE) {
-    // TODO(21263): Implement 'swp' and use it below.
+// TODO(21263): Implement 'swp' and use it below.
 #if !defined(USING_SIMULATOR)
     ASSERT(OS::NumberOfAvailableProcessors() <= 1);
 #endif
@@ -1147,8 +1149,8 @@
       if ((end_offset - begin_offset) >= (2 * kWordSize)) {
         __ mov(R3, Operand(R2));
       }
-      __ InitializeFieldsNoBarrierUnrolled(R0, R0, begin_offset, end_offset,
-                                           R2, R3);
+      __ InitializeFieldsNoBarrierUnrolled(R0, R0, begin_offset, end_offset, R2,
+                                           R3);
     } else {
       // There are more than kInlineInstanceSize(12) fields
       __ add(R4, R0, Operand(Instance::NextFieldOffset() - kHeapObjectTag));
@@ -1191,7 +1193,7 @@
   // calling into the runtime.
   __ EnterStubFrame();  // Uses pool pointer to pass cls to runtime.
   __ LoadObject(R2, Object::null_object());
-  __ Push(R2);  // Setup space on stack for return value.
+  __ Push(R2);         // Setup space on stack for return value.
   __ PushObject(cls);  // Push class of object to be allocated.
   if (is_cls_parameterized) {
     // Push type arguments.
@@ -1201,7 +1203,7 @@
     __ Push(R2);
   }
   __ CallRuntime(kAllocateObjectRuntimeEntry, 2);  // Allocate object.
-  __ Drop(2);  // Pop arguments.
+  __ Drop(2);                                      // Pop arguments.
   __ Pop(R0);  // Pop result (newly allocated object).
   // R0: new object
   // Restore the frame pointer.
@@ -1251,10 +1253,10 @@
   if (FLAG_trace_optimized_ic_calls) {
     __ EnterStubFrame();
     __ PushList((1 << R9) | (1 << R8));  // Preserve.
-    __ Push(ic_reg);  // Argument.
-    __ Push(func_reg);  // Argument.
+    __ Push(ic_reg);                     // Argument.
+    __ Push(func_reg);                   // Argument.
     __ CallRuntime(kTraceICCallRuntimeEntry, 2);
-    __ Drop(2);  // Discard argument;
+    __ Drop(2);                         // Discard argument;
     __ PopList((1 << R9) | (1 << R8));  // Restore.
     __ LeaveStubFrame();
   }
@@ -1296,12 +1298,12 @@
   __ b(not_smi_or_overflow, NE);
   switch (kind) {
     case Token::kADD: {
-      __ adds(R0, R1, Operand(R0));  // Adds.
+      __ adds(R0, R1, Operand(R0));   // Adds.
       __ b(not_smi_or_overflow, VS);  // Branch if overflow.
       break;
     }
     case Token::kSUB: {
-      __ subs(R0, R1, Operand(R0));  // Subtract.
+      __ subs(R0, R1, Operand(R0));   // Subtract.
       __ b(not_smi_or_overflow, VS);  // Branch if overflow.
       break;
     }
@@ -1311,13 +1313,14 @@
       __ LoadObject(R0, Bool::False(), NE);
       break;
     }
-    default: UNIMPLEMENTED();
+    default:
+      UNIMPLEMENTED();
   }
   // R9: IC data object (preserved).
   __ ldr(R8, FieldAddress(R9, ICData::ic_data_offset()));
   // R8: ic_data_array with check entries: classes and target functions.
   __ AddImmediate(R8, R8, Array::data_offset() - kHeapObjectTag);
-  // R8: points directly to the first ic data array element.
+// R8: points directly to the first ic data array element.
 #if defined(DEBUG)
   // Check that first entry is for Smi/Smi.
   Label error, ok;
@@ -1363,7 +1366,8 @@
   __ CheckCodePointer();
   ASSERT(num_args > 0);
 #if defined(DEBUG)
-  { Label ok;
+  {
+    Label ok;
     // Check that the IC data array has NumArgsTested() == num_args.
     // 'NumArgsTested' is stored in the least significant bits of 'state_bits'.
     __ ldr(R8, FieldAddress(R9, ICData::state_bits_offset()));
@@ -1443,7 +1447,7 @@
 
   const intptr_t entry_size = ICData::TestEntryLengthFor(num_args) * kWordSize;
   __ AddImmediate(R8, entry_size);  // Next entry.
-  __ ldr(R1, Address(R8, 0));  // Next class ID.
+  __ ldr(R1, Address(R8, 0));       // Next class ID.
 
   __ Bind(&test);
   __ CompareImmediate(R1, Smi::RawValue(kIllegalCid));  // Done?
@@ -1529,42 +1533,37 @@
 //   - 1 target function.
 void StubCode::GenerateOneArgCheckInlineCacheStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, R8);
-  GenerateNArgsCheckInlineCacheStub(assembler,
-      1,
-      kInlineCacheMissHandlerOneArgRuntimeEntry,
-      Token::kILLEGAL);
+  GenerateNArgsCheckInlineCacheStub(
+      assembler, 1, kInlineCacheMissHandlerOneArgRuntimeEntry, Token::kILLEGAL);
 }
 
 
 void StubCode::GenerateTwoArgsCheckInlineCacheStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, R8);
-  GenerateNArgsCheckInlineCacheStub(assembler,
-      2,
-      kInlineCacheMissHandlerTwoArgsRuntimeEntry,
-      Token::kILLEGAL);
+  GenerateNArgsCheckInlineCacheStub(assembler, 2,
+                                    kInlineCacheMissHandlerTwoArgsRuntimeEntry,
+                                    Token::kILLEGAL);
 }
 
 
 void StubCode::GenerateSmiAddInlineCacheStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, R8);
-  GenerateNArgsCheckInlineCacheStub(assembler,
-      2,
-      kInlineCacheMissHandlerTwoArgsRuntimeEntry,
-      Token::kADD);
+  GenerateNArgsCheckInlineCacheStub(
+      assembler, 2, kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kADD);
 }
 
 
 void StubCode::GenerateSmiSubInlineCacheStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, R8);
-  GenerateNArgsCheckInlineCacheStub(assembler, 2,
-      kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kSUB);
+  GenerateNArgsCheckInlineCacheStub(
+      assembler, 2, kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kSUB);
 }
 
 
 void StubCode::GenerateSmiEqualInlineCacheStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, R8);
-  GenerateNArgsCheckInlineCacheStub(assembler, 2,
-      kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kEQ);
+  GenerateNArgsCheckInlineCacheStub(
+      assembler, 2, kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kEQ);
 }
 
 
@@ -1572,8 +1571,8 @@
     Assembler* assembler) {
   GenerateOptimizedUsageCounterIncrement(assembler);
   GenerateNArgsCheckInlineCacheStub(assembler, 1,
-      kInlineCacheMissHandlerOneArgRuntimeEntry, Token::kILLEGAL,
-      true /* optimized */);
+                                    kInlineCacheMissHandlerOneArgRuntimeEntry,
+                                    Token::kILLEGAL, true /* optimized */);
 }
 
 
@@ -1581,8 +1580,8 @@
     Assembler* assembler) {
   GenerateOptimizedUsageCounterIncrement(assembler);
   GenerateNArgsCheckInlineCacheStub(assembler, 2,
-      kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kILLEGAL,
-      true /* optimized */);
+                                    kInlineCacheMissHandlerTwoArgsRuntimeEntry,
+                                    Token::kILLEGAL, true /* optimized */);
 }
 
 
@@ -1592,7 +1591,8 @@
 void StubCode::GenerateZeroArgsUnoptimizedStaticCallStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, R8);
 #if defined(DEBUG)
-  { Label ok;
+  {
+    Label ok;
     // Check that the IC data array has NumArgsTested() == 0.
     // 'NumArgsTested' is stored in the least significant bits of 'state_bits'.
     __ ldr(R8, FieldAddress(R9, ICData::state_bits_offset()));
@@ -1662,8 +1662,8 @@
 
 void StubCode::GenerateTwoArgsUnoptimizedStaticCallStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, R8);
-  GenerateNArgsCheckInlineCacheStub(assembler, 2,
-      kStaticCallMissHandlerTwoArgsRuntimeEntry, Token::kILLEGAL);
+  GenerateNArgsCheckInlineCacheStub(
+      assembler, 2, kStaticCallMissHandlerTwoArgsRuntimeEntry, Token::kILLEGAL);
 }
 
 
@@ -1677,7 +1677,7 @@
   __ PushList((1 << R4) | (1 << R9));
   __ Push(R0);  // Pass function.
   __ CallRuntime(kCompileFunctionRuntimeEntry, 1);
-  __ Pop(R0);  // Restore argument.
+  __ Pop(R0);                         // Restore argument.
   __ PopList((1 << R4) | (1 << R9));  // Restore arg desc. and IC data.
   __ LeaveStubFrame();
 
@@ -1716,8 +1716,7 @@
 
 
 // Called only from unoptimized code. All relevant registers have been saved.
-void StubCode::GenerateDebugStepCheckStub(
-    Assembler* assembler) {
+void StubCode::GenerateDebugStepCheckStub(Assembler* assembler) {
   // Check single stepping.
   Label stepping, done_stepping;
   __ LoadIsolate(R1);
@@ -1749,8 +1748,8 @@
     // Compute instance type arguments into R4.
     Label has_no_type_arguments;
     __ LoadObject(R4, Object::null_object());
-    __ ldr(R9, FieldAddress(R3,
-        Class::type_arguments_field_offset_in_words_offset()));
+    __ ldr(R9, FieldAddress(
+                   R3, Class::type_arguments_field_offset_in_words_offset()));
     __ CompareImmediate(R9, Class::kNoTypeArguments);
     __ b(&has_no_type_arguments, EQ);
     __ add(R9, R0, Operand(R9, LSL, 2));
@@ -1792,7 +1791,7 @@
     } else {
       __ b(&next_iteration, NE);
       __ ldr(R9, Address(R2, kWordSize *
-                             SubtypeTestCache::kInstantiatorTypeArguments));
+                                 SubtypeTestCache::kInstantiatorTypeArguments));
       __ cmp(R9, Operand(R1));
       __ b(&found, EQ);
     }
@@ -1863,13 +1862,13 @@
 void StubCode::GenerateJumpToExceptionHandlerStub(Assembler* assembler) {
   ASSERT(kExceptionObjectReg == R0);
   ASSERT(kStackTraceObjectReg == R1);
-  __ mov(IP, Operand(R1));  // Copy Stack pointer into IP.
-  __ mov(LR, Operand(R0));  // Program counter.
-  __ mov(R0, Operand(R3));  // Exception object.
-  __ ldr(R1, Address(SP, 0));  // StackTrace object.
+  __ mov(IP, Operand(R1));      // Copy Stack pointer into IP.
+  __ mov(LR, Operand(R0));      // Program counter.
+  __ mov(R0, Operand(R3));      // Exception object.
+  __ ldr(R1, Address(SP, 0));   // StackTrace object.
   __ ldr(THR, Address(SP, 4));  // Thread.
-  __ mov(FP, Operand(R2));  // Frame_pointer.
-  __ mov(SP, Operand(IP));  // Set Stack pointer.
+  __ mov(FP, Operand(R2));      // Frame_pointer.
+  __ mov(SP, Operand(IP));      // Set Stack pointer.
   // Set the tag.
   __ LoadImmediate(R2, VMTag::kDartTagId);
   __ StoreToOffset(kWord, R2, THR, Thread::vm_tag_offset());
@@ -1958,7 +1957,7 @@
   __ b(&done, NE);
   __ EnterStubFrame();
   __ ReserveAlignedFrameSpace(2 * kWordSize);
-  __ stm(IA, SP,  (1 << R0) | (1 << R1));
+  __ stm(IA, SP, (1 << R0) | (1 << R1));
   __ CallRuntime(kBigintCompareRuntimeEntry, 2);
   // Result in R0, 0 means equal.
   __ LeaveStubFrame();
diff --git a/runtime/vm/stub_code_arm64.cc b/runtime/vm/stub_code_arm64.cc
index 443ab1c..71dae4b 100644
--- a/runtime/vm/stub_code_arm64.cc
+++ b/runtime/vm/stub_code_arm64.cc
@@ -22,8 +22,10 @@
 namespace dart {
 
 DEFINE_FLAG(bool, inline_alloc, true, "Inline allocation of objects.");
-DEFINE_FLAG(bool, use_slow_path, false,
-    "Set to true for debugging & verifying the slow paths.");
+DEFINE_FLAG(bool,
+            use_slow_path,
+            false,
+            "Set to true for debugging & verifying the slow paths.");
 DECLARE_FLAG(bool, trace_optimized_ic_calls);
 
 // Input parameters:
@@ -48,7 +50,8 @@
   __ StoreToOffset(FP, THR, Thread::top_exit_frame_info_offset());
 
 #if defined(DEBUG)
-  { Label ok;
+  {
+    Label ok;
     // Check that we are always entering from Dart code.
     __ LoadFromOffset(R8, THR, Thread::vm_tag_offset());
     __ CompareImmediate(R8, VMTag::kDartTagId);
@@ -86,7 +89,7 @@
   // Set argv in NativeArguments.
   __ AddImmediate(R2, R2, kParamEndSlotFromFp * kWordSize);
 
-    ASSERT(retval_offset == 3 * kWordSize);
+  ASSERT(retval_offset == 3 * kWordSize);
   __ AddImmediate(R3, R2, kWordSize);
 
   __ StoreToOffset(R0, SP, thread_offset);
@@ -152,7 +155,8 @@
   __ StoreToOffset(FP, THR, Thread::top_exit_frame_info_offset());
 
 #if defined(DEBUG)
-  { Label ok;
+  {
+    Label ok;
     // Check that we are always entering from Dart code.
     __ LoadFromOffset(R6, THR, Thread::vm_tag_offset());
     __ CompareImmediate(R6, VMTag::kDartTagId);
@@ -245,7 +249,8 @@
   __ StoreToOffset(FP, THR, Thread::top_exit_frame_info_offset());
 
 #if defined(DEBUG)
-  { Label ok;
+  {
+    Label ok;
     // Check that we are always entering from Dart code.
     __ LoadFromOffset(R6, THR, Thread::vm_tag_offset());
     __ CompareImmediate(R6, VMTag::kDartTagId);
@@ -479,8 +484,8 @@
   }
 
   __ mov(R0, SP);  // Pass address of saved registers block.
-  bool is_lazy = (kind == kLazyDeoptFromReturn) ||
-                 (kind == kLazyDeoptFromThrow);
+  bool is_lazy =
+      (kind == kLazyDeoptFromReturn) || (kind == kLazyDeoptFromThrow);
   __ LoadImmediate(R1, is_lazy ? 1 : 0);
   __ ReserveAlignedFrameSpace(0);
   __ CallRuntime(kDeoptimizeCopyFrameRuntimeEntry, 2);
@@ -738,8 +743,7 @@
   // R7: new object end address.
 
   // Store the type argument field.
-  __ StoreIntoObjectOffsetNoBarrier(
-      R0, Array::type_arguments_offset(), R1);
+  __ StoreIntoObjectOffsetNoBarrier(R0, Array::type_arguments_offset(), R1);
 
   // Set the length field.
   __ StoreIntoObjectOffsetNoBarrier(R0, Array::length_offset(), R2);
@@ -1020,8 +1024,7 @@
     // R1: number of context variables.
     // R2: raw null.
     Label loop, done;
-    __ AddImmediate(
-        R3, R0, Context::variable_offset(0) - kHeapObjectTag);
+    __ AddImmediate(R3, R0, Context::variable_offset(0) - kHeapObjectTag);
     __ Bind(&loop);
     __ subs(R1, R1, Operand(1));
     __ b(&done, MI);
@@ -1184,8 +1187,7 @@
       // Check if the object contains any non-header fields.
       // Small objects are initialized using a consecutive set of writes.
       for (intptr_t current_offset = Instance::NextFieldOffset();
-           current_offset < instance_size;
-           current_offset += kWordSize) {
+           current_offset < instance_size; current_offset += kWordSize) {
         __ StoreToOffset(R0, R2, current_offset);
       }
     } else {
@@ -1224,8 +1226,8 @@
   // Create a stub frame as we are pushing some objects on the stack before
   // calling into the runtime.
   __ EnterStubFrame();  // Uses pool pointer to pass cls to runtime.
-  __ Push(ZR);  // Result slot.
-  __ PushObject(cls);  // Push class of object to be allocated.
+  __ Push(ZR);          // Result slot.
+  __ PushObject(cls);   // Push class of object to be allocated.
   if (is_cls_parameterized) {
     // Push type arguments.
     __ Push(R1);
@@ -1234,7 +1236,7 @@
     __ PushObject(Object::null_object());
   }
   __ CallRuntime(kAllocateObjectRuntimeEntry, 2);  // Allocate object.
-  __ Drop(2);  // Pop arguments.
+  __ Drop(2);                                      // Pop arguments.
   __ Pop(R0);  // Pop result (newly allocated object).
   // R0: new object
   // Restore the frame pointer.
@@ -1284,9 +1286,9 @@
   Register func_reg = R6;
   if (FLAG_trace_optimized_ic_calls) {
     __ EnterStubFrame();
-    __ Push(R6);  // Preserve.
-    __ Push(R5);  // Preserve.
-    __ Push(ic_reg);  // Argument.
+    __ Push(R6);        // Preserve.
+    __ Push(R5);        // Preserve.
+    __ Push(ic_reg);    // Argument.
     __ Push(func_reg);  // Argument.
     __ CallRuntime(kTraceICCallRuntimeEntry, 2);
     __ Drop(2);  // Discard argument;
@@ -1294,11 +1296,9 @@
     __ Pop(R6);  // Restore.
     __ LeaveStubFrame();
   }
-  __ LoadFieldFromOffset(
-      R7, func_reg, Function::usage_counter_offset(), kWord);
+  __ LoadFieldFromOffset(R7, func_reg, Function::usage_counter_offset(), kWord);
   __ add(R7, R7, Operand(1));
-  __ StoreFieldToOffset(
-      R7, func_reg, Function::usage_counter_offset(), kWord);
+  __ StoreFieldToOffset(R7, func_reg, Function::usage_counter_offset(), kWord);
 }
 
 
@@ -1311,11 +1311,11 @@
     ASSERT(temp_reg == R6);
     __ Comment("Increment function counter");
     __ LoadFieldFromOffset(func_reg, ic_reg, ICData::owner_offset());
-    __ LoadFieldFromOffset(
-        R7, func_reg, Function::usage_counter_offset(), kWord);
+    __ LoadFieldFromOffset(R7, func_reg, Function::usage_counter_offset(),
+                           kWord);
     __ AddImmediate(R7, R7, 1);
-    __ StoreFieldToOffset(
-        R7, func_reg, Function::usage_counter_offset(), kWord);
+    __ StoreFieldToOffset(R7, func_reg, Function::usage_counter_offset(),
+                          kWord);
   }
 }
 
@@ -1329,19 +1329,19 @@
                           intptr_t num_args,
                           Label* not_smi_or_overflow) {
   __ Comment("Fast Smi op");
-  __ ldr(R0, Address(SP, + 0 * kWordSize));  // Right.
-  __ ldr(R1, Address(SP, + 1 * kWordSize));  // Left.
+  __ ldr(R0, Address(SP, +0 * kWordSize));  // Right.
+  __ ldr(R1, Address(SP, +1 * kWordSize));  // Left.
   __ orr(TMP, R0, Operand(R1));
   __ tsti(TMP, Immediate(kSmiTagMask));
   __ b(not_smi_or_overflow, NE);
   switch (kind) {
     case Token::kADD: {
-      __ adds(R0, R1, Operand(R0));  // Adds.
+      __ adds(R0, R1, Operand(R0));   // Adds.
       __ b(not_smi_or_overflow, VS);  // Branch if overflow.
       break;
     }
     case Token::kSUB: {
-      __ subs(R0, R1, Operand(R0));  // Subtract.
+      __ subs(R0, R1, Operand(R0));   // Subtract.
       __ b(not_smi_or_overflow, VS);  // Branch if overflow.
       break;
     }
@@ -1352,14 +1352,15 @@
       __ csel(R0, R1, R0, NE);
       break;
     }
-    default: UNIMPLEMENTED();
+    default:
+      UNIMPLEMENTED();
   }
 
   // R5: IC data object (preserved).
   __ LoadFieldFromOffset(R6, R5, ICData::ic_data_offset());
   // R6: ic_data_array with check entries: classes and target functions.
   __ AddImmediate(R6, R6, Array::data_offset() - kHeapObjectTag);
-  // R6: points directly to the first ic data array element.
+// R6: points directly to the first ic data array element.
 #if defined(DEBUG)
   // Check that first entry is for Smi/Smi.
   Label error, ok;
@@ -1406,7 +1407,8 @@
     bool optimized) {
   ASSERT(num_args > 0);
 #if defined(DEBUG)
-  { Label ok;
+  {
+    Label ok;
     // Check that the IC data array has NumArgsTested() == num_args.
     // 'NumArgsTested' is stored in the least significant bits of 'state_bits'.
     __ LoadFromOffset(R6, R5, ICData::state_bits_offset() - kHeapObjectTag,
@@ -1424,8 +1426,7 @@
   if (FLAG_support_debugger && !optimized) {
     __ Comment("Check single stepping");
     __ LoadIsolate(R6);
-    __ LoadFromOffset(
-        R6, R6, Isolate::single_step_offset(), kUnsignedByte);
+    __ LoadFromOffset(R6, R6, Isolate::single_step_offset(), kUnsignedByte);
     __ CompareRegisters(R6, ZR);
     __ b(&stepping, NE);
     __ Bind(&done_stepping);
@@ -1433,10 +1434,7 @@
 
   Label not_smi_or_overflow;
   if (kind != Token::kILLEGAL) {
-    EmitFastSmiOp(assembler,
-                  kind,
-                  num_args,
-                  &not_smi_or_overflow);
+    EmitFastSmiOp(assembler, kind, num_args, &not_smi_or_overflow);
   }
   __ Bind(&not_smi_or_overflow);
 
@@ -1496,7 +1494,7 @@
 
   const intptr_t entry_size = ICData::TestEntryLengthFor(num_args) * kWordSize;
   __ AddImmediate(R6, R6, entry_size);  // Next entry.
-  __ ldr(R1, Address(R6));  // Next class ID.
+  __ ldr(R1, Address(R6));              // Next class ID.
 
   __ Bind(&test);
   __ CompareImmediate(R1, Smi::RawValue(kIllegalCid));  // Done?
@@ -1589,36 +1587,37 @@
 //   - 1 target function.
 void StubCode::GenerateOneArgCheckInlineCacheStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, R6);
-  GenerateNArgsCheckInlineCacheStub(assembler, 1,
-      kInlineCacheMissHandlerOneArgRuntimeEntry, Token::kILLEGAL);
+  GenerateNArgsCheckInlineCacheStub(
+      assembler, 1, kInlineCacheMissHandlerOneArgRuntimeEntry, Token::kILLEGAL);
 }
 
 
 void StubCode::GenerateTwoArgsCheckInlineCacheStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, R6);
   GenerateNArgsCheckInlineCacheStub(assembler, 2,
-      kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kILLEGAL);
+                                    kInlineCacheMissHandlerTwoArgsRuntimeEntry,
+                                    Token::kILLEGAL);
 }
 
 
 void StubCode::GenerateSmiAddInlineCacheStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, R6);
-  GenerateNArgsCheckInlineCacheStub(assembler, 2,
-      kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kADD);
+  GenerateNArgsCheckInlineCacheStub(
+      assembler, 2, kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kADD);
 }
 
 
 void StubCode::GenerateSmiSubInlineCacheStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, R6);
-  GenerateNArgsCheckInlineCacheStub(assembler, 2,
-      kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kSUB);
+  GenerateNArgsCheckInlineCacheStub(
+      assembler, 2, kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kSUB);
 }
 
 
 void StubCode::GenerateSmiEqualInlineCacheStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, R6);
-  GenerateNArgsCheckInlineCacheStub(assembler, 2,
-      kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kEQ);
+  GenerateNArgsCheckInlineCacheStub(
+      assembler, 2, kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kEQ);
 }
 
 
@@ -1626,8 +1625,8 @@
     Assembler* assembler) {
   GenerateOptimizedUsageCounterIncrement(assembler);
   GenerateNArgsCheckInlineCacheStub(assembler, 1,
-      kInlineCacheMissHandlerOneArgRuntimeEntry, Token::kILLEGAL,
-      true /* optimized */);
+                                    kInlineCacheMissHandlerOneArgRuntimeEntry,
+                                    Token::kILLEGAL, true /* optimized */);
 }
 
 
@@ -1635,15 +1634,16 @@
     Assembler* assembler) {
   GenerateOptimizedUsageCounterIncrement(assembler);
   GenerateNArgsCheckInlineCacheStub(assembler, 2,
-      kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kILLEGAL,
-      true /* optimized */);
+                                    kInlineCacheMissHandlerTwoArgsRuntimeEntry,
+                                    Token::kILLEGAL, true /* optimized */);
 }
 
 
 void StubCode::GenerateZeroArgsUnoptimizedStaticCallStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, R6);
 #if defined(DEBUG)
-  { Label ok;
+  {
+    Label ok;
     // Check that the IC data array has NumArgsTested() == 0.
     // 'NumArgsTested' is stored in the least significant bits of 'state_bits'.
     __ LoadFromOffset(R6, R5, ICData::state_bits_offset() - kHeapObjectTag,
@@ -1659,10 +1659,9 @@
 
   // Check single stepping.
   Label stepping, done_stepping;
-    if (FLAG_support_debugger) {
+  if (FLAG_support_debugger) {
     __ LoadIsolate(R6);
-    __ LoadFromOffset(
-        R6, R6, Isolate::single_step_offset(), kUnsignedByte);
+    __ LoadFromOffset(R6, R6, Isolate::single_step_offset(), kUnsignedByte);
     __ CompareImmediate(R6, 0);
     __ b(&stepping, NE);
     __ Bind(&done_stepping);
@@ -1716,8 +1715,8 @@
 
 void StubCode::GenerateTwoArgsUnoptimizedStaticCallStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, R6);
-  GenerateNArgsCheckInlineCacheStub(assembler, 2,
-      kStaticCallMissHandlerTwoArgsRuntimeEntry, Token::kILLEGAL);
+  GenerateNArgsCheckInlineCacheStub(
+      assembler, 2, kStaticCallMissHandlerTwoArgsRuntimeEntry, Token::kILLEGAL);
 }
 
 
@@ -1768,13 +1767,11 @@
 }
 
 // Called only from unoptimized code. All relevant registers have been saved.
-void StubCode::GenerateDebugStepCheckStub(
-    Assembler* assembler) {
+void StubCode::GenerateDebugStepCheckStub(Assembler* assembler) {
   // Check single stepping.
   Label stepping, done_stepping;
   __ LoadIsolate(R1);
-  __ LoadFromOffset(
-      R1, R1, Isolate::single_step_offset(), kUnsignedByte);
+  __ LoadFromOffset(R1, R1, Isolate::single_step_offset(), kUnsignedByte);
   __ CompareImmediate(R1, 0);
   __ b(&stepping, NE);
   __ Bind(&done_stepping);
@@ -1803,8 +1800,8 @@
     // Compute instance type arguments into R4.
     Label has_no_type_arguments;
     __ LoadObject(R4, Object::null_object());
-    __ LoadFieldFromOffset(R5, R3,
-        Class::type_arguments_field_offset_in_words_offset(), kWord);
+    __ LoadFieldFromOffset(
+        R5, R3, Class::type_arguments_field_offset_in_words_offset(), kWord);
     __ CompareImmediate(R5, Class::kNoTypeArguments);
     __ b(&has_no_type_arguments, EQ);
     __ add(R5, R0, Operand(R5, LSL, 3));
@@ -1830,8 +1827,8 @@
   __ LoadFieldFromOffset(R3, R0, Closure::function_offset());
   // R3: instance class id as Smi or function.
   __ Bind(&loop);
-  __ LoadFromOffset(
-      R5, R2, kWordSize * SubtypeTestCache::kInstanceClassIdOrFunction);
+  __ LoadFromOffset(R5, R2,
+                    kWordSize * SubtypeTestCache::kInstanceClassIdOrFunction);
   __ CompareObject(R5, Object::null_object());
   __ b(&not_found, EQ);
   __ CompareRegisters(R5, R3);
@@ -1839,22 +1836,21 @@
     __ b(&found, EQ);
   } else {
     __ b(&next_iteration, NE);
-    __ LoadFromOffset(
-        R5, R2, kWordSize * SubtypeTestCache::kInstanceTypeArguments);
+    __ LoadFromOffset(R5, R2,
+                      kWordSize * SubtypeTestCache::kInstanceTypeArguments);
     __ CompareRegisters(R5, R4);
     if (n == 2) {
       __ b(&found, EQ);
     } else {
       __ b(&next_iteration, NE);
-      __ LoadFromOffset(R5, R2,
-          kWordSize * SubtypeTestCache::kInstantiatorTypeArguments);
+      __ LoadFromOffset(
+          R5, R2, kWordSize * SubtypeTestCache::kInstantiatorTypeArguments);
       __ CompareRegisters(R5, R1);
       __ b(&found, EQ);
     }
   }
   __ Bind(&next_iteration);
-  __ AddImmediate(
-      R2, R2, kWordSize * SubtypeTestCache::kTestEntryLength);
+  __ AddImmediate(R2, R2, kWordSize * SubtypeTestCache::kTestEntryLength);
   __ b(&loop);
   // Fall through to not found.
   __ Bind(&not_found);
diff --git a/runtime/vm/stub_code_arm64_test.cc b/runtime/vm/stub_code_arm64_test.cc
index f2d8a25..7112f26 100644
--- a/runtime/vm/stub_code_arm64_test.cc
+++ b/runtime/vm/stub_code_arm64_test.cc
@@ -20,25 +20,23 @@
 namespace dart {
 
 static Function* CreateFunction(const char* name) {
-  const String& class_name = String::Handle(Symbols::New(Thread::Current(),
-                                                         "ownerClass"));
+  const String& class_name =
+      String::Handle(Symbols::New(Thread::Current(), "ownerClass"));
   const Script& script = Script::Handle();
   const Library& lib = Library::Handle(Library::New(class_name));
   const Class& owner_class = Class::Handle(
       Class::New(lib, class_name, script, TokenPosition::kNoSource));
-  const String& function_name = String::ZoneHandle(
-      Symbols::New(Thread::Current(), name));
-  Function& function = Function::ZoneHandle(
-      Function::New(function_name, RawFunction::kRegularFunction,
-                    true, false, false, false, false, owner_class,
-                    TokenPosition::kNoSource));
+  const String& function_name =
+      String::ZoneHandle(Symbols::New(Thread::Current(), name));
+  Function& function = Function::ZoneHandle(Function::New(
+      function_name, RawFunction::kRegularFunction, true, false, false, false,
+      false, owner_class, TokenPosition::kNoSource));
   return &function;
 }
 
 
 // Test calls to stub code which calls into the runtime.
-static void GenerateCallToCallRuntimeStub(Assembler* assembler,
-                                          int length) {
+static void GenerateCallToCallRuntimeStub(Assembler* assembler, int length) {
   const int argc = 2;
   const Smi& smi_length = Smi::ZoneHandle(Smi::New(length));
   __ EnterDartFrame(0);
diff --git a/runtime/vm/stub_code_arm_test.cc b/runtime/vm/stub_code_arm_test.cc
index a0c35cc..5a79e93 100644
--- a/runtime/vm/stub_code_arm_test.cc
+++ b/runtime/vm/stub_code_arm_test.cc
@@ -20,25 +20,23 @@
 namespace dart {
 
 static Function* CreateFunction(const char* name) {
-  const String& class_name = String::Handle(Symbols::New(Thread::Current(),
-                                                         "ownerClass"));
+  const String& class_name =
+      String::Handle(Symbols::New(Thread::Current(), "ownerClass"));
   const Script& script = Script::Handle();
   const Library& lib = Library::Handle(Library::New(class_name));
   const Class& owner_class = Class::Handle(
       Class::New(lib, class_name, script, TokenPosition::kNoSource));
-  const String& function_name = String::ZoneHandle(
-      Symbols::New(Thread::Current(), name));
-  Function& function = Function::ZoneHandle(
-      Function::New(function_name, RawFunction::kRegularFunction,
-                    true, false, false, false, false, owner_class,
-                    TokenPosition::kNoSource));
+  const String& function_name =
+      String::ZoneHandle(Symbols::New(Thread::Current(), name));
+  Function& function = Function::ZoneHandle(Function::New(
+      function_name, RawFunction::kRegularFunction, true, false, false, false,
+      false, owner_class, TokenPosition::kNoSource));
   return &function;
 }
 
 
 // Test calls to stub code which calls into the runtime.
-static void GenerateCallToCallRuntimeStub(Assembler* assembler,
-                                          int length) {
+static void GenerateCallToCallRuntimeStub(Assembler* assembler, int length) {
   const int argc = 2;
   const Smi& smi_length = Smi::ZoneHandle(Smi::New(length));
   __ EnterDartFrame(0);
diff --git a/runtime/vm/stub_code_dbc.cc b/runtime/vm/stub_code_dbc.cc
index 81a83d6..54711516 100644
--- a/runtime/vm/stub_code_dbc.cc
+++ b/runtime/vm/stub_code_dbc.cc
@@ -23,8 +23,10 @@
 namespace dart {
 
 DEFINE_FLAG(bool, inline_alloc, true, "Inline allocation of objects.");
-DEFINE_FLAG(bool, use_slow_path, false,
-    "Set to true for debugging & verifying the slow paths.");
+DEFINE_FLAG(bool,
+            use_slow_path,
+            false,
+            "Set to true for debugging & verifying the slow paths.");
 DECLARE_FLAG(bool, trace_optimized_ic_calls);
 
 void StubCode::GenerateLazyCompileStub(Assembler* assembler) {
diff --git a/runtime/vm/stub_code_ia32.cc b/runtime/vm/stub_code_ia32.cc
index 83f6ba0..1de178a8 100644
--- a/runtime/vm/stub_code_ia32.cc
+++ b/runtime/vm/stub_code_ia32.cc
@@ -24,8 +24,10 @@
 namespace dart {
 
 DEFINE_FLAG(bool, inline_alloc, true, "Inline allocation of objects.");
-DEFINE_FLAG(bool, use_slow_path, false,
-    "Set to true for debugging & verifying the slow paths.");
+DEFINE_FLAG(bool,
+            use_slow_path,
+            false,
+            "Set to true for debugging & verifying the slow paths.");
 DECLARE_FLAG(bool, trace_optimized_ic_calls);
 
 #define INT32_SIZEOF(x) static_cast<int32_t>(sizeof(x))
@@ -51,7 +53,8 @@
   __ movl(Address(THR, Thread::top_exit_frame_info_offset()), EBP);
 
 #if defined(DEBUG)
-  { Label ok;
+  {
+    Label ok;
     // Check that we are always entering from Dart code.
     __ cmpl(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
     __ j(EQUAL, &ok, Assembler::kNearJump);
@@ -76,8 +79,8 @@
   __ movl(Address(ESP, argc_tag_offset), EDX);  // Set argc in NativeArguments.
   // Compute argv.
   __ leal(EAX, Address(EBP, EDX, TIMES_4, kParamEndSlotFromFp * kWordSize));
-  __ movl(Address(ESP, argv_offset), EAX);  // Set argv in NativeArguments.
-  __ addl(EAX, Immediate(1 * kWordSize));  // Retval is next to 1st argument.
+  __ movl(Address(ESP, argv_offset), EAX);    // Set argv in NativeArguments.
+  __ addl(EAX, Immediate(1 * kWordSize));     // Retval is next to 1st argument.
   __ movl(Address(ESP, retval_offset), EAX);  // Set retval in NativeArguments.
   __ call(ECX);
 
@@ -137,7 +140,8 @@
   __ movl(Address(THR, Thread::top_exit_frame_info_offset()), EBP);
 
 #if defined(DEBUG)
-  { Label ok;
+  {
+    Label ok;
     // Check that we are always entering from Dart code.
     __ cmpl(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
     __ j(EQUAL, &ok, Assembler::kNearJump);
@@ -159,10 +163,10 @@
   }
 
   // Pass NativeArguments structure by value and call native function.
-  __ movl(Address(ESP, thread_offset), THR);  // Set thread in NativeArgs.
+  __ movl(Address(ESP, thread_offset), THR);    // Set thread 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.
+  __ movl(Address(ESP, argv_offset), EAX);      // Set argv in NativeArguments.
+  __ leal(EAX, Address(EBP, 2 * kWordSize));    // Compute return value addr.
   __ movl(Address(ESP, retval_offset), EAX);  // Set retval in NativeArguments.
   __ leal(EAX, Address(ESP, 2 * kWordSize));  // Pointer to the NativeArguments.
   __ movl(Address(ESP, 0), EAX);  // Pass the pointer to the NativeArguments.
@@ -205,7 +209,8 @@
   __ movl(Address(THR, Thread::top_exit_frame_info_offset()), EBP);
 
 #if defined(DEBUG)
-  { Label ok;
+  {
+    Label ok;
     // Check that we are always entering from Dart code.
     __ cmpl(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
     __ j(EQUAL, &ok, Assembler::kNearJump);
@@ -226,12 +231,12 @@
   }
 
   // Pass NativeArguments structure by value and call native function.
-  __ movl(Address(ESP, thread_offset), THR);  // Set thread in NativeArgs.
+  __ movl(Address(ESP, thread_offset), THR);    // Set thread 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.
+  __ movl(Address(ESP, argv_offset), EAX);      // Set argv in NativeArguments.
+  __ leal(EAX, Address(EBP, 2 * kWordSize));    // Compute return value addr.
   __ movl(Address(ESP, retval_offset), EAX);  // Set retval in NativeArguments.
-  __ leal(EAX, Address(ESP, kWordSize));  // Pointer to the NativeArguments.
+  __ leal(EAX, Address(ESP, kWordSize));      // Pointer to the NativeArguments.
   __ movl(Address(ESP, 0), EAX);  // Pass the pointer to the NativeArguments.
   __ call(ECX);
 
@@ -249,7 +254,7 @@
 //   EDX: arguments descriptor array.
 void StubCode::GenerateCallStaticFunctionStub(Assembler* assembler) {
   __ EnterStubFrame();
-  __ pushl(EDX);  // Preserve arguments descriptor array.
+  __ pushl(EDX);           // Preserve arguments descriptor array.
   __ pushl(Immediate(0));  // Setup space on stack for return value.
   __ CallRuntime(kPatchStaticCallRuntimeEntry, 0);
   __ popl(EAX);  // Get Code object result.
@@ -269,7 +274,7 @@
   // Create a stub frame as we are pushing some objects on the stack before
   // calling into the runtime.
   __ EnterStubFrame();
-  __ pushl(EDX);  // Preserve arguments descriptor array.
+  __ pushl(EDX);           // Preserve arguments descriptor array.
   __ pushl(Immediate(0));  // Setup space on stack for return value.
   __ CallRuntime(kFixCallersTargetRuntimeEntry, 0);
   __ popl(EAX);  // Get Code object.
@@ -387,8 +392,8 @@
   __ movl(ECX, ESP);  // Preserve saved registers block.
   __ ReserveAlignedFrameSpace(2 * kWordSize);
   __ movl(Address(ESP, 0 * kWordSize), ECX);  // Start of register block.
-  bool is_lazy = (kind == kLazyDeoptFromReturn) ||
-                 (kind == kLazyDeoptFromThrow);
+  bool is_lazy =
+      (kind == kLazyDeoptFromReturn) || (kind == kLazyDeoptFromThrow);
   __ movl(Address(ESP, 1 * kWordSize), Immediate(is_lazy ? 1 : 0));
   __ CallRuntime(kDeoptimizeCopyFrameRuntimeEntry, 2);
   // Result (EAX) is stack-size (FP - SP) in bytes.
@@ -403,10 +408,10 @@
   }
 
   __ LeaveFrame();
-  __ popl(EDX);  // Preserve return address.
+  __ popl(EDX);       // Preserve return address.
   __ movl(ESP, EBP);  // Discard optimized frame.
   __ subl(ESP, EAX);  // Reserve space for deoptimized frame.
-  __ pushl(EDX);  // Restore return address.
+  __ pushl(EDX);      // Restore return address.
 
   // Leaf runtime function DeoptimizeFillFrame expects a Dart frame.
   __ EnterDartFrame(0);
@@ -454,9 +459,9 @@
   }
   __ LeaveFrame();
 
-  __ popl(ECX);  // Pop return address.
+  __ popl(ECX);       // Pop return address.
   __ addl(ESP, EBX);  // Remove materialization arguments.
-  __ pushl(ECX);  // Push return address.
+  __ pushl(ECX);      // Push return address.
   __ ret();
 }
 
@@ -495,12 +500,12 @@
   __ EnterStubFrame();
   // Load the receiver.
   __ movl(EDI, FieldAddress(EDX, ArgumentsDescriptor::count_offset()));
-  __ movl(EAX, Address(
-      EBP, EDI, TIMES_HALF_WORD_SIZE, kParamEndSlotFromFp * kWordSize));
+  __ movl(EAX, Address(EBP, EDI, TIMES_HALF_WORD_SIZE,
+                       kParamEndSlotFromFp * kWordSize));
   __ pushl(Immediate(0));  // Setup space on stack for result.
-  __ pushl(EAX);  // Receiver.
-  __ pushl(ECX);  // ICData/MegamorphicCache.
-  __ pushl(EDX);  // Arguments descriptor array.
+  __ pushl(EAX);           // Receiver.
+  __ pushl(ECX);           // ICData/MegamorphicCache.
+  __ pushl(EDX);           // Arguments descriptor array.
   __ movl(EDX, EDI);
   // EDX: Smi-tagged arguments array length.
   PushArgumentsArray(assembler);
@@ -526,9 +531,9 @@
   __ pushl(EDX);
 
   __ pushl(Immediate(0));  // Space for the result of the runtime call.
-  __ pushl(EAX);  // Pass receiver.
-  __ pushl(ECX);  // Pass IC data.
-  __ pushl(EDX);  // Pass arguments descriptor.
+  __ pushl(EAX);           // Pass receiver.
+  __ pushl(ECX);           // Pass IC data.
+  __ pushl(EDX);           // Pass arguments descriptor.
   __ CallRuntime(kMegamorphicCacheMissHandlerRuntimeEntry, 3);
   // Discard arguments.
   __ popl(EAX);
@@ -570,7 +575,7 @@
     __ j(NOT_ZERO, &slow_case);
   }
   __ cmpl(EDX, Immediate(0));
-  __ j(LESS,  &slow_case);
+  __ j(LESS, &slow_case);
 
   // Check for maximum allowed length.
   const Immediate& max_len =
@@ -578,10 +583,8 @@
   __ cmpl(EDX, max_len);
   __ j(GREATER, &slow_case);
 
-  NOT_IN_PRODUCT(__ MaybeTraceAllocation(kArrayCid,
-                                         EAX,
-                                         &slow_case,
-                                         Assembler::kFarJump));
+  NOT_IN_PRODUCT(
+      __ MaybeTraceAllocation(kArrayCid, EAX, &slow_case, Assembler::kFarJump));
 
   const intptr_t fixed_size = sizeof(RawArray) + kObjectAlignment - 1;
   __ leal(EBX, Address(EDX, TIMES_2, fixed_size));  // EDX is Smi.
@@ -642,13 +645,11 @@
   // EDX: Array length as Smi (preserved).
   // Store the type argument field.
   // No generetional barrier needed, since we store into a new object.
-  __ StoreIntoObjectNoBarrier(EAX,
-                              FieldAddress(EAX, Array::type_arguments_offset()),
-                              ECX);
+  __ StoreIntoObjectNoBarrier(
+      EAX, FieldAddress(EAX, Array::type_arguments_offset()), ECX);
 
   // Set the length field.
-  __ StoreIntoObjectNoBarrier(EAX,
-                              FieldAddress(EAX, Array::length_offset()),
+  __ StoreIntoObjectNoBarrier(EAX, FieldAddress(EAX, Array::length_offset()),
                               EDX);
 
   // Initialize all array elements to raw_null.
@@ -679,8 +680,8 @@
   // calling into the runtime.
   __ EnterStubFrame();
   __ pushl(Immediate(0));  // Setup space on stack for return value.
-  __ pushl(EDX);  // Array length as Smi.
-  __ pushl(ECX);  // Element type.
+  __ pushl(EDX);           // Array length as Smi.
+  __ pushl(ECX);           // Element type.
   __ CallRuntime(kAllocateArrayRuntimeEntry, 2);
   __ popl(EAX);  // Pop element type argument.
   __ popl(EDX);  // Pop array length argument (preserved).
@@ -814,9 +815,7 @@
     __ leal(EBX, Address(EDX, TIMES_4, fixed_size));
     __ andl(EBX, Immediate(-kObjectAlignment));
 
-    NOT_IN_PRODUCT(__ MaybeTraceAllocation(kContextCid,
-                                           EAX,
-                                           &slow_case,
+    NOT_IN_PRODUCT(__ MaybeTraceAllocation(kContextCid, EAX, &slow_case,
                                            Assembler::kFarJump));
 
     // Now allocate the object.
@@ -874,8 +873,7 @@
       // EAX: new object.
       // EDX: number of context variables.
       // EBX: size and bit tags.
-      __ orl(EBX,
-             Immediate(RawObject::ClassIdTag::encode(cid)));
+      __ orl(EBX, Immediate(RawObject::ClassIdTag::encode(cid)));
       __ movl(FieldAddress(EAX, Context::tags_offset()), EBX);  // Tags.
     }
 
@@ -903,8 +901,7 @@
       __ Bind(&loop);
       __ decl(EDX);
       // No generational barrier needed, since we are storing null.
-      __ StoreIntoObjectNoBarrier(EAX,
-                                  Address(EBX, EDX, TIMES_4, 0),
+      __ StoreIntoObjectNoBarrier(EAX, Address(EBX, EDX, TIMES_4, 0),
                                   Object::null_object());
       __ Bind(&entry);
       __ cmpl(EDX, Immediate(0));
@@ -1008,8 +1005,8 @@
 // Uses EAX, EBX, ECX, EDX, EDI as temporary registers.
 // Returns patch_code_pc offset where patching code for disabling the stub
 // has been generated (similar to regularly generated Dart code).
-void StubCode::GenerateAllocationStubForClass(
-    Assembler* assembler, const Class& cls) {
+void StubCode::GenerateAllocationStubForClass(Assembler* assembler,
+                                              const Class& cls) {
   const intptr_t kObjectTypeArgumentsOffset = 1 * kWordSize;
   const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
@@ -1072,10 +1069,8 @@
       // Check if the object contains any non-header fields.
       // Small objects are initialized using a consecutive set of writes.
       for (intptr_t current_offset = Instance::NextFieldOffset();
-           current_offset < instance_size;
-           current_offset += kWordSize) {
-        __ StoreIntoObjectNoBarrier(EAX,
-                                    FieldAddress(EAX, current_offset),
+           current_offset < instance_size; current_offset += kWordSize) {
+        __ StoreIntoObjectNoBarrier(EAX, FieldAddress(EAX, current_offset),
                                     Object::null_object());
       }
     } else {
@@ -1090,9 +1085,7 @@
       __ Bind(&init_loop);
       __ cmpl(ECX, EBX);
       __ j(ABOVE_EQUAL, &done, Assembler::kNearJump);
-      __ StoreIntoObjectNoBarrier(EAX,
-                                  Address(ECX, 0),
-                                  Object::null_object());
+      __ StoreIntoObjectNoBarrier(EAX, Address(ECX, 0), Object::null_object());
       __ addl(ECX, Immediate(kWordSize));
       __ jmp(&init_loop, Assembler::kNearJump);
       __ Bind(&done);
@@ -1149,8 +1142,8 @@
   __ movl(EAX, Address(EBP, EDI, TIMES_2, kParamEndSlotFromFp * kWordSize));
 
   __ pushl(Immediate(0));  // Setup space on stack for result from noSuchMethod.
-  __ pushl(EAX);  // Receiver.
-  __ pushl(EDX);  // Arguments descriptor array.
+  __ pushl(EAX);           // Receiver.
+  __ pushl(EDX);           // Arguments descriptor array.
 
   __ movl(EDX, EDI);
   // EDX: Smi-tagged arguments array length.
@@ -1170,15 +1163,15 @@
   Register func_reg = EBX;
   if (FLAG_trace_optimized_ic_calls) {
     __ EnterStubFrame();
-    __ pushl(func_reg);     // Preserve
-    __ pushl(ic_reg);       // Preserve.
-    __ pushl(ic_reg);       // Argument.
-    __ pushl(func_reg);     // Argument.
+    __ pushl(func_reg);  // Preserve
+    __ pushl(ic_reg);    // Preserve.
+    __ pushl(ic_reg);    // Argument.
+    __ pushl(func_reg);  // Argument.
     __ CallRuntime(kTraceICCallRuntimeEntry, 2);
-    __ popl(EAX);          // Discard argument;
-    __ popl(EAX);          // Discard argument;
-    __ popl(ic_reg);       // Restore.
-    __ popl(func_reg);     // Restore.
+    __ popl(EAX);       // Discard argument;
+    __ popl(EAX);       // Discard argument;
+    __ popl(ic_reg);    // Restore.
+    __ popl(func_reg);  // Restore.
     __ LeaveFrame();
   }
   __ incl(FieldAddress(func_reg, Function::usage_counter_offset()));
@@ -1209,8 +1202,8 @@
                           Label* not_smi_or_overflow) {
   __ Comment("Fast Smi op");
   ASSERT(num_args == 2);
-  __ movl(EDI, Address(ESP, + 1 * kWordSize));  // Right
-  __ movl(EAX, Address(ESP, + 2 * kWordSize));  // Left
+  __ movl(EDI, Address(ESP, +1 * kWordSize));  // Right
+  __ movl(EAX, Address(ESP, +2 * kWordSize));  // Left
   __ movl(EBX, EDI);
   __ orl(EBX, EAX);
   __ testl(EBX, Immediate(kSmiTagMask));
@@ -1243,7 +1236,8 @@
       __ Bind(&done);
       break;
     }
-    default: UNIMPLEMENTED();
+    default:
+      UNIMPLEMENTED();
   }
 
   // ECX: IC data object.
@@ -1294,7 +1288,8 @@
     bool optimized) {
   ASSERT(num_args > 0);
 #if defined(DEBUG)
-  { Label ok;
+  {
+    Label ok;
     // Check that the IC data array has NumArgsTested() == num_args.
     // 'NumArgsTested' is stored in the least significant bits of 'state_bits'.
     __ movl(EBX, FieldAddress(ECX, ICData::state_bits_offset()));
@@ -1349,7 +1344,7 @@
     if (i > 0) {
       // If not the first, load the next argument's class ID.
       __ movl(EAX, FieldAddress(EDX, ArgumentsDescriptor::count_offset()));
-      __ movl(EDI, Address(ESP, EAX, TIMES_2, - i * kWordSize));
+      __ movl(EDI, Address(ESP, EAX, TIMES_2, -i * kWordSize));
       __ LoadTaggedClassIdMayBeSmi(EAX, EDI);
 
       // EAX: next argument class ID (smi).
@@ -1374,7 +1369,7 @@
 
   const intptr_t entry_size = ICData::TestEntryLengthFor(num_args) * kWordSize;
   __ addl(EBX, Immediate(entry_size));  // Next entry.
-  __ movl(EDI, Address(EBX, 0));  // Next class ID.
+  __ movl(EDI, Address(EBX, 0));        // Next class ID.
 
   __ Bind(&test);
   __ cmpl(EDI, Immediate(Smi::RawValue(kIllegalCid)));  // Done?
@@ -1388,8 +1383,8 @@
   // Create a stub frame as we are pushing some objects on the stack before
   // calling into the runtime.
   __ EnterStubFrame();
-  __ pushl(EDX);  // Preserve arguments descriptor array.
-  __ pushl(ECX);  // Preserve IC data object.
+  __ pushl(EDX);           // Preserve arguments descriptor array.
+  __ pushl(ECX);           // Preserve IC data object.
   __ pushl(Immediate(0));  // Result slot.
   // Push call arguments.
   for (intptr_t i = 0; i < num_args; i++) {
@@ -1458,41 +1453,37 @@
 //   - 1 target function.
 void StubCode::GenerateOneArgCheckInlineCacheStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, EBX);
-  GenerateNArgsCheckInlineCacheStub(assembler, 1,
-      kInlineCacheMissHandlerOneArgRuntimeEntry,
-      Token::kILLEGAL);
+  GenerateNArgsCheckInlineCacheStub(
+      assembler, 1, kInlineCacheMissHandlerOneArgRuntimeEntry, Token::kILLEGAL);
 }
 
 
 void StubCode::GenerateTwoArgsCheckInlineCacheStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, EBX);
   GenerateNArgsCheckInlineCacheStub(assembler, 2,
-      kInlineCacheMissHandlerTwoArgsRuntimeEntry,
-      Token::kILLEGAL);
+                                    kInlineCacheMissHandlerTwoArgsRuntimeEntry,
+                                    Token::kILLEGAL);
 }
 
 
 void StubCode::GenerateSmiAddInlineCacheStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, EBX);
-  GenerateNArgsCheckInlineCacheStub(assembler, 2,
-      kInlineCacheMissHandlerTwoArgsRuntimeEntry,
-      Token::kADD);
+  GenerateNArgsCheckInlineCacheStub(
+      assembler, 2, kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kADD);
 }
 
 
 void StubCode::GenerateSmiSubInlineCacheStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, EBX);
-  GenerateNArgsCheckInlineCacheStub(assembler, 2,
-      kInlineCacheMissHandlerTwoArgsRuntimeEntry,
-      Token::kSUB);
+  GenerateNArgsCheckInlineCacheStub(
+      assembler, 2, kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kSUB);
 }
 
 
 void StubCode::GenerateSmiEqualInlineCacheStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, EBX);
-  GenerateNArgsCheckInlineCacheStub(assembler, 2,
-      kInlineCacheMissHandlerTwoArgsRuntimeEntry,
-      Token::kEQ);
+  GenerateNArgsCheckInlineCacheStub(
+      assembler, 2, kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kEQ);
 }
 
 
@@ -1511,9 +1502,8 @@
     Assembler* assembler) {
   GenerateOptimizedUsageCounterIncrement(assembler);
   GenerateNArgsCheckInlineCacheStub(assembler, 1,
-      kInlineCacheMissHandlerOneArgRuntimeEntry,
-      Token::kILLEGAL,
-      true /* optimized */);
+                                    kInlineCacheMissHandlerOneArgRuntimeEntry,
+                                    Token::kILLEGAL, true /* optimized */);
 }
 
 
@@ -1521,9 +1511,8 @@
     Assembler* assembler) {
   GenerateOptimizedUsageCounterIncrement(assembler);
   GenerateNArgsCheckInlineCacheStub(assembler, 2,
-     kInlineCacheMissHandlerTwoArgsRuntimeEntry,
-     Token::kILLEGAL,
-     true /* optimized */);
+                                    kInlineCacheMissHandlerTwoArgsRuntimeEntry,
+                                    Token::kILLEGAL, true /* optimized */);
 }
 
 
@@ -1534,7 +1523,8 @@
   GenerateUsageCounterIncrement(assembler, EBX);
 
 #if defined(DEBUG)
-  { Label ok;
+  {
+    Label ok;
     // Check that the IC data array has NumArgsTested() == num_args.
     // 'NumArgsTested' is stored in the least significant bits of 'state_bits'.
     __ movl(EBX, FieldAddress(ECX, ICData::state_bits_offset()));
@@ -1595,16 +1585,14 @@
 void StubCode::GenerateOneArgUnoptimizedStaticCallStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, EBX);
   GenerateNArgsCheckInlineCacheStub(
-      assembler, 1, kStaticCallMissHandlerOneArgRuntimeEntry,
-      Token::kILLEGAL);
+      assembler, 1, kStaticCallMissHandlerOneArgRuntimeEntry, Token::kILLEGAL);
 }
 
 
 void StubCode::GenerateTwoArgsUnoptimizedStaticCallStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, EBX);
-  GenerateNArgsCheckInlineCacheStub(assembler, 2,
-      kStaticCallMissHandlerTwoArgsRuntimeEntry,
-      Token::kILLEGAL);
+  GenerateNArgsCheckInlineCacheStub(
+      assembler, 2, kStaticCallMissHandlerTwoArgsRuntimeEntry, Token::kILLEGAL);
 }
 
 
@@ -1699,8 +1687,9 @@
     // Compute instance type arguments into EBX.
     Label has_no_type_arguments;
     __ movl(EBX, raw_null);
-    __ movl(EDI, FieldAddress(ECX,
-        Class::type_arguments_field_offset_in_words_offset()));
+    __ movl(EDI,
+            FieldAddress(ECX,
+                         Class::type_arguments_field_offset_in_words_offset()));
     __ cmpl(EDI, Immediate(Class::kNoTypeArguments));
     __ j(EQUAL, &has_no_type_arguments, Assembler::kNearJump);
     __ movl(EBX, FieldAddress(EAX, EDI, TIMES_4, 0));
@@ -1724,9 +1713,8 @@
   __ movl(ECX, FieldAddress(EAX, Closure::function_offset()));
   // ECX: instance class id as Smi or function.
   __ Bind(&loop);
-  __ movl(EDI,
-          Address(EDX,
-                  kWordSize * SubtypeTestCache::kInstanceClassIdOrFunction));
+  __ movl(EDI, Address(EDX, kWordSize *
+                                SubtypeTestCache::kInstanceClassIdOrFunction));
   __ cmpl(EDI, raw_null);
   __ j(EQUAL, &not_found, Assembler::kNearJump);
   __ cmpl(EDI, ECX);
@@ -1735,7 +1723,7 @@
   } else {
     __ j(NOT_EQUAL, &next_iteration, Assembler::kNearJump);
     __ movl(EDI,
-          Address(EDX, kWordSize * SubtypeTestCache::kInstanceTypeArguments));
+            Address(EDX, kWordSize * SubtypeTestCache::kInstanceTypeArguments));
     __ cmpl(EDI, EBX);
     if (n == 2) {
       __ j(EQUAL, &found, Assembler::kNearJump);
@@ -1743,7 +1731,7 @@
       __ j(NOT_EQUAL, &next_iteration, Assembler::kNearJump);
       __ movl(EDI,
               Address(EDX, kWordSize *
-                           SubtypeTestCache::kInstantiatorTypeArguments));
+                               SubtypeTestCache::kInstantiatorTypeArguments));
       __ cmpl(EDI, Address(ESP, kInstantiatorTypeArgumentsInBytes));
       __ j(EQUAL, &found, Assembler::kNearJump);
     }
diff --git a/runtime/vm/stub_code_ia32_test.cc b/runtime/vm/stub_code_ia32_test.cc
index 6ba14dc..ed2951b 100644
--- a/runtime/vm/stub_code_ia32_test.cc
+++ b/runtime/vm/stub_code_ia32_test.cc
@@ -20,25 +20,23 @@
 namespace dart {
 
 static Function* CreateFunction(const char* name) {
-  const String& class_name = String::Handle(Symbols::New(Thread::Current(),
-                                                         "ownerClass"));
+  const String& class_name =
+      String::Handle(Symbols::New(Thread::Current(), "ownerClass"));
   const Script& script = Script::Handle();
   const Library& lib = Library::Handle(Library::New(class_name));
   const Class& owner_class = Class::Handle(
       Class::New(lib, class_name, script, TokenPosition::kNoSource));
-  const String& function_name = String::ZoneHandle(
-      Symbols::New(Thread::Current(), name));
-  Function& function = Function::ZoneHandle(
-      Function::New(function_name, RawFunction::kRegularFunction,
-                    true, false, false, false, false, owner_class,
-                    TokenPosition::kMinSource));
+  const String& function_name =
+      String::ZoneHandle(Symbols::New(Thread::Current(), name));
+  Function& function = Function::ZoneHandle(Function::New(
+      function_name, RawFunction::kRegularFunction, true, false, false, false,
+      false, owner_class, TokenPosition::kMinSource));
   return &function;
 }
 
 
 // Test calls to stub code which calls into the runtime.
-static void GenerateCallToCallRuntimeStub(Assembler* assembler,
-                                          int length) {
+static void GenerateCallToCallRuntimeStub(Assembler* assembler, int length) {
   const int argc = 2;
   const Smi& smi_length = Smi::ZoneHandle(Smi::New(length));
   __ enter(Immediate(0));
diff --git a/runtime/vm/stub_code_mips.cc b/runtime/vm/stub_code_mips.cc
index 692d91a..40c8bb8 100644
--- a/runtime/vm/stub_code_mips.cc
+++ b/runtime/vm/stub_code_mips.cc
@@ -22,8 +22,10 @@
 namespace dart {
 
 DEFINE_FLAG(bool, inline_alloc, true, "Inline allocation of objects.");
-DEFINE_FLAG(bool, use_slow_path, false,
-    "Set to true for debugging & verifying the slow paths.");
+DEFINE_FLAG(bool,
+            use_slow_path,
+            false,
+            "Set to true for debugging & verifying the slow paths.");
 DECLARE_FLAG(bool, trace_optimized_ic_calls);
 
 // Input parameters:
@@ -48,7 +50,8 @@
   __ sw(FP, Address(THR, Thread::top_exit_frame_info_offset()));
 
 #if defined(DEBUG)
-  { Label ok;
+  {
+    Label ok;
     // Check that we are always entering from Dart code.
     __ lw(T0, Assembler::VMTagAddress());
     __ BranchEqual(T0, Immediate(VMTag::kDartTagId), &ok);
@@ -90,7 +93,7 @@
   __ mov(T9, S5);
   __ jalr(T9);
 
-    ASSERT(retval_offset == 3 * kWordSize);
+  ASSERT(retval_offset == 3 * kWordSize);
   // Retval is next to 1st argument.
   __ delay_slot()->addiu(A3, A2, Immediate(kWordSize));
   __ Comment("CallToRuntimeStub return");
@@ -146,7 +149,8 @@
   __ sw(FP, Address(THR, Thread::top_exit_frame_info_offset()));
 
 #if defined(DEBUG)
-  { Label ok;
+  {
+    Label ok;
     // Check that we are always entering from Dart code.
     __ lw(T0, Assembler::VMTagAddress());
     __ BranchEqual(T0, Immediate(VMTag::kDartTagId), &ok);
@@ -188,7 +192,7 @@
   __ mov(A0, SP);  // Pass the pointer to the NativeArguments.
 
 
-  __ mov(A1, T5);  // Pass the function entrypoint.
+  __ mov(A1, T5);                              // Pass the function entrypoint.
   __ ReserveAlignedFrameSpace(2 * kWordSize);  // Just passing A0, A1.
 
   // Call native wrapper function or redirection via simulator.
@@ -228,7 +232,8 @@
   __ sw(FP, Address(THR, Thread::top_exit_frame_info_offset()));
 
 #if defined(DEBUG)
-  { Label ok;
+  {
+    Label ok;
     // Check that we are always entering from Dart code.
     __ lw(T0, Assembler::VMTagAddress());
     __ BranchEqual(T0, Immediate(VMTag::kDartTagId), &ok);
@@ -473,8 +478,8 @@
   }
 
   __ mov(A0, SP);  // Pass address of saved registers block.
-  bool is_lazy = (kind == kLazyDeoptFromReturn) ||
-                 (kind == kLazyDeoptFromThrow);
+  bool is_lazy =
+      (kind == kLazyDeoptFromReturn) || (kind == kLazyDeoptFromThrow);
   __ LoadImmediate(A1, is_lazy ? 1 : 0);
   __ ReserveAlignedFrameSpace(1 * kWordSize);
   __ CallRuntime(kDeoptimizeCopyFrameRuntimeEntry, 2);
@@ -703,7 +708,7 @@
   // Potential new object start.
   __ lw(T0, Address(T3, Heap::TopOffset(space)));
 
-  __ addu(T1, T0, T2);  // Potential next object start.
+  __ addu(T1, T0, T2);                        // Potential next object start.
   __ BranchUnsignedLess(T1, T0, &slow_case);  // Branch on unsigned overflow.
 
   // Check if the allocation fits into the remaining space.
@@ -729,8 +734,8 @@
     Label overflow, done;
     const intptr_t shift = RawObject::kSizeTagPos - kObjectAlignmentLog2;
 
-    __ BranchUnsignedGreater(
-        T2, Immediate(RawObject::SizeTag::kMaxSizeTag), &overflow);
+    __ BranchUnsignedGreater(T2, Immediate(RawObject::SizeTag::kMaxSizeTag),
+                             &overflow);
     __ b(&done);
     __ delay_slot()->sll(T2, T2, shift);
     __ Bind(&overflow);
@@ -747,14 +752,11 @@
   // T0: new object start as a tagged pointer.
   // T1: new object end address.
   // Store the type argument field.
-  __ StoreIntoObjectNoBarrier(T0,
-                              FieldAddress(T0, Array::type_arguments_offset()),
-                              A0);
+  __ StoreIntoObjectNoBarrier(
+      T0, FieldAddress(T0, Array::type_arguments_offset()), A0);
 
   // Set the length field.
-  __ StoreIntoObjectNoBarrier(T0,
-                              FieldAddress(T0, Array::length_offset()),
-                              A1);
+  __ StoreIntoObjectNoBarrier(T0, FieldAddress(T0, Array::length_offset()), A1);
 
   __ LoadObject(T7, Object::null_object());
   // Initialize all array elements to raw_null.
@@ -822,8 +824,8 @@
   // The saved vm tag, top resource, and top exit frame info.
   const intptr_t kPreservedSlots = 3;
   const intptr_t kPreservedRegSpace =
-      kWordSize * (kAbiPreservedCpuRegCount + kAbiPreservedFpuRegCount +
-                   kPreservedSlots);
+      kWordSize *
+      (kAbiPreservedCpuRegCount + kAbiPreservedFpuRegCount + kPreservedSlots);
 
   __ addiu(SP, SP, Immediate(-kPreservedRegSpace));
   for (int i = S0; i <= S7; i++) {
@@ -832,12 +834,11 @@
     __ sw(r, Address(SP, slot * kWordSize));
   }
 
-  for (intptr_t i = kAbiFirstPreservedFpuReg;
-       i <= kAbiLastPreservedFpuReg; i++) {
+  for (intptr_t i = kAbiFirstPreservedFpuReg; i <= kAbiLastPreservedFpuReg;
+       i++) {
     FRegister r = static_cast<FRegister>(i);
-    const intptr_t slot =
-        kAbiPreservedCpuRegCount + kPreservedSlots + i -
-        kAbiFirstPreservedFpuReg;
+    const intptr_t slot = kAbiPreservedCpuRegCount + kPreservedSlots + i -
+                          kAbiFirstPreservedFpuReg;
     __ swc1(r, Address(SP, slot * kWordSize));
   }
 
@@ -928,12 +929,11 @@
     __ lw(r, Address(SP, slot * kWordSize));
   }
 
-  for (intptr_t i = kAbiFirstPreservedFpuReg;
-       i <= kAbiLastPreservedFpuReg; i++) {
+  for (intptr_t i = kAbiFirstPreservedFpuReg; i <= kAbiLastPreservedFpuReg;
+       i++) {
     FRegister r = static_cast<FRegister>(i);
-    const intptr_t slot =
-        kAbiPreservedCpuRegCount + kPreservedSlots + i -
-        kAbiFirstPreservedFpuReg;
+    const intptr_t slot = kAbiPreservedCpuRegCount + kPreservedSlots + i -
+                          kAbiFirstPreservedFpuReg;
     __ lwc1(r, Address(SP, slot * kWordSize));
   }
 
@@ -960,7 +960,7 @@
     __ sll(T0, T1, 2);
     __ addu(T2, T2, T0);
     ASSERT(kSmiTagShift == 1);
-    __ LoadImmediate(T0, ~((kObjectAlignment) - 1));
+    __ LoadImmediate(T0, ~((kObjectAlignment)-1));
     __ and_(T2, T2, T0);
 
     NOT_IN_PRODUCT(__ MaybeTraceAllocation(kContextCid, T4, &slow_case));
@@ -1004,8 +1004,8 @@
     const intptr_t shift = RawObject::kSizeTagPos - kObjectAlignmentLog2;
     __ LoadImmediate(TMP, RawObject::SizeTag::kMaxSizeTag);
     __ sltu(CMPRES1, TMP, T2);  // CMPRES1 = T2 > TMP ? 1 : 0.
-    __ movn(T2, ZR, CMPRES1);  // T2 = CMPRES1 != 0 ? 0 : T2.
-    __ sll(TMP, T2, shift);  // TMP = T2 << shift.
+    __ movn(T2, ZR, CMPRES1);   // T2 = CMPRES1 != 0 ? 0 : T2.
+    __ sll(TMP, T2, shift);     // TMP = T2 << shift.
     __ movz(T2, TMP, CMPRES1);  // T2 = CMPRES1 == 0 ? TMP : T2.
 
     // Get the class index and insert it into the tags.
@@ -1053,8 +1053,8 @@
   __ sw(TMP, Address(SP, 1 * kWordSize));  // Store null.
   __ sw(T1, Address(SP, 0 * kWordSize));
   __ CallRuntime(kAllocateContextRuntimeEntry, 1);  // Allocate context.
-  __ lw(V0, Address(SP, 1 * kWordSize));  // Get the new context.
-  __ addiu(SP, SP, Immediate(2 * kWordSize));  // Pop argument and return.
+  __ lw(V0, Address(SP, 1 * kWordSize));            // Get the new context.
+  __ addiu(SP, SP, Immediate(2 * kWordSize));       // Pop argument and return.
 
   // V0: new object
   // Restore the frame pointer.
@@ -1204,8 +1204,7 @@
       // Check if the object contains any non-header fields.
       // Small objects are initialized using a consecutive set of writes.
       for (intptr_t current_offset = Instance::NextFieldOffset();
-           current_offset < instance_size;
-           current_offset += kWordSize) {
+           current_offset < instance_size; current_offset += kWordSize) {
         __ sw(T7, Address(T2, current_offset));
       }
     } else {
@@ -1313,7 +1312,7 @@
     __ addiu(SP, SP, Immediate(-4 * kWordSize));
     __ sw(T0, Address(SP, 3 * kWordSize));
     __ sw(S5, Address(SP, 2 * kWordSize));
-    __ sw(ic_reg, Address(SP, 1 * kWordSize));  // Argument.
+    __ sw(ic_reg, Address(SP, 1 * kWordSize));    // Argument.
     __ sw(func_reg, Address(SP, 0 * kWordSize));  // Argument.
     __ CallRuntime(kTraceICCallRuntimeEntry, 2);
     __ lw(S5, Address(SP, 2 * kWordSize));
@@ -1361,13 +1360,13 @@
   __ bne(CMPRES1, ZR, not_smi_or_overflow);
   switch (kind) {
     case Token::kADD: {
-     __ AdduDetectOverflow(V0, T1, T0, CMPRES1);  // Add.
-     __ bltz(CMPRES1, not_smi_or_overflow);  // Fall through on overflow.
+      __ AdduDetectOverflow(V0, T1, T0, CMPRES1);  // Add.
+      __ bltz(CMPRES1, not_smi_or_overflow);       // Fall through on overflow.
       break;
     }
     case Token::kSUB: {
       __ SubuDetectOverflow(V0, T1, T0, CMPRES1);  // Subtract.
-      __ bltz(CMPRES1, not_smi_or_overflow);  // Fall through on overflow.
+      __ bltz(CMPRES1, not_smi_or_overflow);       // Fall through on overflow.
       break;
     }
     case Token::kEQ: {
@@ -1380,13 +1379,14 @@
       __ Bind(&done);
       break;
     }
-    default: UNIMPLEMENTED();
+    default:
+      UNIMPLEMENTED();
   }
   // S5: IC data object (preserved).
   __ lw(T0, FieldAddress(S5, ICData::ic_data_offset()));
   // T0: ic_data_array with check entries: classes and target functions.
   __ AddImmediate(T0, Array::data_offset() - kHeapObjectTag);
-  // T0: points directly to the first ic data array element.
+// T0: points directly to the first ic data array element.
 #if defined(DEBUG)
   // Check that first entry is for Smi/Smi.
   Label error, ok;
@@ -1433,7 +1433,8 @@
   __ Comment("NArgsCheckInlineCacheStub");
   ASSERT(num_args > 0);
 #if defined(DEBUG)
-  { Label ok;
+  {
+    Label ok;
     // Check that the IC data array has NumArgsTested() == num_args.
     // 'NumArgsTested' is stored in the least significant bits of 'state_bits'.
     __ lw(T0, FieldAddress(S5, ICData::state_bits_offset()));
@@ -1510,7 +1511,7 @@
       // Last check, all checks before matched.
       Label skip;
       __ bne(T3, T4, &skip);
-      __ b(&found);  // Break.
+      __ b(&found);                  // Break.
       __ delay_slot()->mov(RA, T2);  // Restore return address if found.
       __ Bind(&skip);
     }
@@ -1526,7 +1527,7 @@
 
   const intptr_t entry_size = ICData::TestEntryLengthFor(num_args) * kWordSize;
   __ AddImmediate(T0, entry_size);  // Next entry.
-  __ lw(T4, Address(T0));  // Next class ID.
+  __ lw(T4, Address(T0));           // Next class ID.
 
   __ Bind(&test);
   __ BranchNotEqual(T4, Immediate(Smi::RawValue(kIllegalCid)), &loop);  // Done?
@@ -1635,36 +1636,37 @@
 //   - 1 target function.
 void StubCode::GenerateOneArgCheckInlineCacheStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, T0);
-  GenerateNArgsCheckInlineCacheStub(assembler, 1,
-      kInlineCacheMissHandlerOneArgRuntimeEntry, Token::kILLEGAL);
+  GenerateNArgsCheckInlineCacheStub(
+      assembler, 1, kInlineCacheMissHandlerOneArgRuntimeEntry, Token::kILLEGAL);
 }
 
 
 void StubCode::GenerateTwoArgsCheckInlineCacheStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, T0);
   GenerateNArgsCheckInlineCacheStub(assembler, 2,
-      kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kILLEGAL);
+                                    kInlineCacheMissHandlerTwoArgsRuntimeEntry,
+                                    Token::kILLEGAL);
 }
 
 
 void StubCode::GenerateSmiAddInlineCacheStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, T0);
-  GenerateNArgsCheckInlineCacheStub(assembler, 2,
-      kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kADD);
+  GenerateNArgsCheckInlineCacheStub(
+      assembler, 2, kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kADD);
 }
 
 
 void StubCode::GenerateSmiSubInlineCacheStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, T0);
-  GenerateNArgsCheckInlineCacheStub(assembler, 2,
-      kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kSUB);
+  GenerateNArgsCheckInlineCacheStub(
+      assembler, 2, kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kSUB);
 }
 
 
 void StubCode::GenerateSmiEqualInlineCacheStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, T0);
-  GenerateNArgsCheckInlineCacheStub(assembler, 2,
-      kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kEQ);
+  GenerateNArgsCheckInlineCacheStub(
+      assembler, 2, kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kEQ);
 }
 
 
@@ -1672,8 +1674,8 @@
     Assembler* assembler) {
   GenerateOptimizedUsageCounterIncrement(assembler);
   GenerateNArgsCheckInlineCacheStub(assembler, 1,
-      kInlineCacheMissHandlerOneArgRuntimeEntry, Token::kILLEGAL,
-      true /* optimized */);
+                                    kInlineCacheMissHandlerOneArgRuntimeEntry,
+                                    Token::kILLEGAL, true /* optimized */);
 }
 
 
@@ -1681,8 +1683,8 @@
     Assembler* assembler) {
   GenerateOptimizedUsageCounterIncrement(assembler);
   GenerateNArgsCheckInlineCacheStub(assembler, 2,
-      kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kILLEGAL,
-      true /* optimized */);
+                                    kInlineCacheMissHandlerTwoArgsRuntimeEntry,
+                                    Token::kILLEGAL, true /* optimized */);
 }
 
 
@@ -1693,7 +1695,8 @@
   GenerateUsageCounterIncrement(assembler, T0);
   __ Comment("UnoptimizedStaticCallStub");
 #if defined(DEBUG)
-  { Label ok;
+  {
+    Label ok;
     // Check that the IC data array has NumArgsTested() == 0.
     // 'NumArgsTested' is stored in the least significant bits of 'state_bits'.
     __ lw(T0, FieldAddress(S5, ICData::state_bits_offset()));
@@ -1733,7 +1736,7 @@
   }
 
   // Load arguments descriptor into S4.
-  __ lw(S4,  FieldAddress(S5, ICData::arguments_descriptor_offset()));
+  __ lw(S4, FieldAddress(S5, ICData::arguments_descriptor_offset()));
 
   // Get function and call it, if possible.
   __ lw(T0, Address(T0, target_offset));
@@ -1768,8 +1771,8 @@
 
 void StubCode::GenerateTwoArgsUnoptimizedStaticCallStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, T0);
-  GenerateNArgsCheckInlineCacheStub(assembler, 2,
-      kStaticCallMissHandlerTwoArgsRuntimeEntry, Token::kILLEGAL);
+  GenerateNArgsCheckInlineCacheStub(
+      assembler, 2, kStaticCallMissHandlerTwoArgsRuntimeEntry, Token::kILLEGAL);
 }
 
 
@@ -1871,10 +1874,10 @@
     // Compute instance type arguments into T1.
     Label has_no_type_arguments;
     __ LoadObject(T1, Object::null_object());
-    __ lw(T2, FieldAddress(T0,
-        Class::type_arguments_field_offset_in_words_offset()));
-    __ BranchEqual(
-        T2, Immediate(Class::kNoTypeArguments), &has_no_type_arguments);
+    __ lw(T2, FieldAddress(
+                  T0, Class::type_arguments_field_offset_in_words_offset()));
+    __ BranchEqual(T2, Immediate(Class::kNoTypeArguments),
+                   &has_no_type_arguments);
     __ sll(T2, T2, 2);
     __ addu(T2, A0, T2);  // T2 <- A0 + T2 * 4
     __ lw(T1, FieldAddress(T2, 0));
@@ -1916,14 +1919,14 @@
     } else {
       __ bne(T3, T1, &next_iteration);
       __ lw(T3, Address(T2, kWordSize *
-                        SubtypeTestCache::kInstantiatorTypeArguments));
+                                SubtypeTestCache::kInstantiatorTypeArguments));
       __ beq(T3, A1, &found);
     }
   }
   __ Bind(&next_iteration);
   __ b(&loop);
-  __ delay_slot()->addiu(T2, T2,
-      Immediate(kWordSize * SubtypeTestCache::kTestEntryLength));
+  __ delay_slot()->addiu(
+      T2, T2, Immediate(kWordSize * SubtypeTestCache::kTestEntryLength));
   // Fall through to not found.
   __ Bind(&not_found);
   __ Ret();
@@ -1992,8 +1995,8 @@
   __ mov(V0, A3);  // Exception object.
   // MIPS ABI reserves stack space for all arguments. The StackTrace object is
   // the last of five arguments, so it is first pushed on the stack.
-  __ lw(V1, Address(SP, 4 * kWordSize));  // StackTrace object.
-  __ mov(FP, A2);  // Frame_pointer.
+  __ lw(V1, Address(SP, 4 * kWordSize));   // StackTrace object.
+  __ mov(FP, A2);                          // Frame_pointer.
   __ lw(THR, Address(SP, 5 * kWordSize));  // Thread.
   // Set tag.
   __ LoadImmediate(A2, VMTag::kDartTagId);
@@ -2003,7 +2006,7 @@
   // Restore pool pointer.
   __ RestoreCodePointer();
   __ LoadPoolPointer();
-  __ jr(A0);  // Jump to the exception handler code.
+  __ jr(A0);                     // Jump to the exception handler code.
   __ delay_slot()->mov(SP, A1);  // Stack pointer.
 }
 
@@ -2021,8 +2024,8 @@
   __ sw(T0, Address(SP, 0 * kWordSize));
   __ CallRuntime(kOptimizeInvokedFunctionRuntimeEntry, 1);
   __ Comment("OptimizeFunctionStub return");
-  __ lw(T0, Address(SP, 1 * kWordSize));  // Get Function object
-  __ lw(S4, Address(SP, 2 * kWordSize));  // Restore argument descriptor.
+  __ lw(T0, Address(SP, 1 * kWordSize));       // Get Function object
+  __ lw(S4, Address(SP, 2 * kWordSize));       // Restore argument descriptor.
   __ addiu(SP, SP, Immediate(3 * kWordSize));  // Discard argument.
 
   __ lw(CODE_REG, FieldAddress(T0, Function::code_offset()));
diff --git a/runtime/vm/stub_code_mips_test.cc b/runtime/vm/stub_code_mips_test.cc
index 65ff616..13e3101 100644
--- a/runtime/vm/stub_code_mips_test.cc
+++ b/runtime/vm/stub_code_mips_test.cc
@@ -20,25 +20,23 @@
 namespace dart {
 
 static Function* CreateFunction(const char* name) {
-  const String& class_name = String::Handle(Symbols::New(Thread::Current(),
-                                                         "ownerClass"));
+  const String& class_name =
+      String::Handle(Symbols::New(Thread::Current(), "ownerClass"));
   const Script& script = Script::Handle();
   const Library& lib = Library::Handle(Library::New(class_name));
   const Class& owner_class = Class::Handle(
       Class::New(lib, class_name, script, TokenPosition::kNoSource));
-  const String& function_name = String::ZoneHandle(
-      Symbols::New(Thread::Current(), name));
-  Function& function = Function::ZoneHandle(
-      Function::New(function_name, RawFunction::kRegularFunction,
-                    true, false, false, false, false, owner_class,
-                    TokenPosition::kNoSource));
+  const String& function_name =
+      String::ZoneHandle(Symbols::New(Thread::Current(), name));
+  Function& function = Function::ZoneHandle(Function::New(
+      function_name, RawFunction::kRegularFunction, true, false, false, false,
+      false, owner_class, TokenPosition::kNoSource));
   return &function;
 }
 
 
 // Test calls to stub code which calls into the runtime.
-static void GenerateCallToCallRuntimeStub(Assembler* assembler,
-                                          int length) {
+static void GenerateCallToCallRuntimeStub(Assembler* assembler, int length) {
   const int argc = 2;
   const Smi& smi_length = Smi::ZoneHandle(Smi::New(length));
   __ EnterDartFrame(0);
diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc
index f5692b7..9ca6a6e2 100644
--- a/runtime/vm/stub_code_x64.cc
+++ b/runtime/vm/stub_code_x64.cc
@@ -23,8 +23,10 @@
 namespace dart {
 
 DEFINE_FLAG(bool, inline_alloc, true, "Inline allocation of objects.");
-DEFINE_FLAG(bool, use_slow_path, false,
-    "Set to true for debugging & verifying the slow paths.");
+DEFINE_FLAG(bool,
+            use_slow_path,
+            false,
+            "Set to true for debugging & verifying the slow paths.");
 DECLARE_FLAG(bool, trace_optimized_ic_calls);
 
 // Input parameters:
@@ -48,7 +50,8 @@
   __ movq(Address(THR, Thread::top_exit_frame_info_offset()), RBP);
 
 #if defined(DEBUG)
-  { Label ok;
+  {
+    Label ok;
     // Check that we are always entering from Dart code.
     __ movq(RAX, Immediate(VMTag::kDartTagId));
     __ cmpq(RAX, Assembler::VMTagAddress());
@@ -74,8 +77,8 @@
   __ movq(Address(RSP, argc_tag_offset), R10);  // Set argc in NativeArguments.
   // Compute argv.
   __ leaq(RAX, Address(RBP, R10, TIMES_8, kParamEndSlotFromFp * kWordSize));
-  __ movq(Address(RSP, argv_offset), RAX);  // Set argv in NativeArguments.
-  __ addq(RAX, Immediate(1 * kWordSize));  // Retval is next to 1st argument.
+  __ movq(Address(RSP, argv_offset), RAX);    // Set argv in NativeArguments.
+  __ addq(RAX, Immediate(1 * kWordSize));     // Retval is next to 1st argument.
   __ movq(Address(RSP, retval_offset), RAX);  // Set retval in NativeArguments.
 #if defined(_WIN64)
   ASSERT(sizeof(NativeArguments) > CallingConventions::kRegisterTransferLimit);
@@ -107,7 +110,7 @@
 // Must preserve all registers.
 void StubCode::GeneratePrintStopMessageStub(Assembler* assembler) {
   __ EnterCallRuntimeFrame(0);
-  // Call the runtime leaf function. RDI already contains the parameter.
+// Call the runtime leaf function. RDI already contains the parameter.
 #if defined(_WIN64)
   __ movq(CallingConventions::kArg1Reg, RDI);
 #endif
@@ -141,7 +144,8 @@
   __ movq(Address(THR, Thread::top_exit_frame_info_offset()), RBP);
 
 #if defined(DEBUG)
-  { Label ok;
+  {
+    Label ok;
     // Check that we are always entering from Dart code.
     __ movq(R8, Immediate(VMTag::kDartTagId));
     __ cmpq(R8, Assembler::VMTagAddress());
@@ -163,10 +167,10 @@
   }
 
   // Pass NativeArguments structure by value and call native function.
-  __ movq(Address(RSP, thread_offset), THR);  // Set thread in NativeArgs.
+  __ movq(Address(RSP, thread_offset), THR);    // Set thread 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.
+  __ movq(Address(RSP, argv_offset), RAX);      // Set argv in NativeArguments.
+  __ leaq(RAX, Address(RBP, 2 * kWordSize));    // Compute return value addr.
   __ movq(Address(RSP, retval_offset), RAX);  // Set retval in NativeArguments.
 
   // Pass the pointer to the NativeArguments.
@@ -212,7 +216,8 @@
   __ movq(Address(THR, Thread::top_exit_frame_info_offset()), RBP);
 
 #if defined(DEBUG)
-  { Label ok;
+  {
+    Label ok;
     // Check that we are always entering from Dart code.
     __ movq(R8, Immediate(VMTag::kDartTagId));
     __ cmpq(R8, Assembler::VMTagAddress());
@@ -234,10 +239,10 @@
   }
 
   // Pass NativeArguments structure by value and call native function.
-  __ movq(Address(RSP, thread_offset), THR);  // Set thread in NativeArgs.
+  __ movq(Address(RSP, thread_offset), THR);    // Set thread 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.
+  __ movq(Address(RSP, argv_offset), RAX);      // Set argv in NativeArguments.
+  __ leaq(RAX, Address(RBP, 2 * kWordSize));    // Compute return value addr.
   __ movq(Address(RSP, retval_offset), RAX);  // Set retval in NativeArguments.
 
   // Pass the pointer to the NativeArguments.
@@ -264,7 +269,7 @@
   __ pushq(Immediate(0));
   __ CallRuntime(kPatchStaticCallRuntimeEntry, 0);
   __ popq(CODE_REG);  // Get Code object result.
-  __ popq(R10);  // Restore arguments descriptor array.
+  __ popq(R10);       // Restore arguments descriptor array.
   // Remove the stub frame as we are about to jump to the dart function.
   __ LeaveStubFrame();
 
@@ -287,7 +292,7 @@
   __ pushq(Immediate(0));
   __ CallRuntime(kFixCallersTargetRuntimeEntry, 0);
   __ popq(CODE_REG);  // Get Code object.
-  __ popq(R10);  // Restore arguments descriptor array.
+  __ popq(R10);       // Restore arguments descriptor array.
   __ movq(RAX, FieldAddress(CODE_REG, Code::entry_point_offset()));
   __ LeaveStubFrame();
   __ jmp(RAX);
@@ -412,8 +417,8 @@
 
   // Pass address of saved registers block.
   __ movq(CallingConventions::kArg1Reg, RSP);
-  bool is_lazy = (kind == kLazyDeoptFromReturn) ||
-                 (kind == kLazyDeoptFromThrow);
+  bool is_lazy =
+      (kind == kLazyDeoptFromReturn) || (kind == kLazyDeoptFromThrow);
   __ movq(CallingConventions::kArg2Reg, Immediate(is_lazy ? 1 : 0));
   __ ReserveAlignedFrameSpace(0);  // Ensure stack is aligned before the call.
   __ CallRuntime(kDeoptimizeCopyFrameRuntimeEntry, 2);
@@ -432,10 +437,10 @@
   __ RestoreCodePointer();
   __ LeaveStubFrame();
 
-  __ popq(RCX);   // Preserve return address.
+  __ popq(RCX);       // Preserve return address.
   __ movq(RSP, RBP);  // Discard optimized frame.
   __ subq(RSP, RAX);  // Reserve space for deoptimized frame.
-  __ pushq(RCX);  // Restore return address.
+  __ pushq(RCX);      // Restore return address.
 
   // DeoptimizeFillFrame expects a Dart frame, i.e. EnterDartFrame(0), but there
   // is no need to set the correct PC marker or load PP, since they get patched.
@@ -490,9 +495,9 @@
   }
   __ LeaveStubFrame();
 
-  __ popq(RCX);  // Pop return address.
+  __ popq(RCX);       // Pop return address.
   __ addq(RSP, RBX);  // Remove materialization arguments.
-  __ pushq(RCX);  // Push return address.
+  __ pushq(RCX);      // Push return address.
   __ ret();
 }
 
@@ -535,12 +540,12 @@
   __ EnterStubFrame();
   // Load the receiver.
   __ movq(RDI, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
-  __ movq(RAX, Address(
-      RBP, RDI, TIMES_HALF_WORD_SIZE, kParamEndSlotFromFp * kWordSize));
+  __ movq(RAX, Address(RBP, RDI, TIMES_HALF_WORD_SIZE,
+                       kParamEndSlotFromFp * kWordSize));
   __ pushq(Immediate(0));  // Setup space on stack for result.
-  __ pushq(RAX);  // Receiver.
-  __ pushq(RBX);  // ICData/MegamorphicCache.
-  __ pushq(R10);  // Arguments descriptor array.
+  __ pushq(RAX);           // Receiver.
+  __ pushq(RBX);           // ICData/MegamorphicCache.
+  __ pushq(R10);           // Arguments descriptor array.
   __ movq(R10, RDI);
   // EDX: Smi-tagged arguments array length.
   PushArgumentsArray(assembler);
@@ -560,8 +565,8 @@
   __ movq(RAX, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
   // Three words (saved pp, saved fp, stub's pc marker)
   // in the stack above the return address.
-  __ movq(RAX, Address(RSP, RAX, TIMES_4,
-                       kSavedAboveReturnAddress * kWordSize));
+  __ movq(RAX,
+          Address(RSP, RAX, TIMES_4, kSavedAboveReturnAddress * kWordSize));
   // Preserve IC data and arguments descriptor.
   __ pushq(RBX);
   __ pushq(R10);
@@ -620,9 +625,8 @@
   __ j(GREATER, &slow_case);
 
   // Check for allocation tracing.
-  NOT_IN_PRODUCT(__ MaybeTraceAllocation(kArrayCid,
-                                         &slow_case,
-                                         Assembler::kFarJump));
+  NOT_IN_PRODUCT(
+      __ MaybeTraceAllocation(kArrayCid, &slow_case, Assembler::kFarJump));
 
   const intptr_t fixed_size = sizeof(RawArray) + kObjectAlignment - 1;
   __ leaq(RDI, Address(RDI, TIMES_4, fixed_size));  // RDI is a Smi.
@@ -674,13 +678,11 @@
   // RAX: new object start as a tagged pointer.
   // Store the type argument field.
   // No generetional barrier needed, since we store into a new object.
-  __ StoreIntoObjectNoBarrier(RAX,
-                              FieldAddress(RAX, Array::type_arguments_offset()),
-                              RBX);
+  __ StoreIntoObjectNoBarrier(
+      RAX, FieldAddress(RAX, Array::type_arguments_offset()), RBX);
 
   // Set the length field.
-  __ StoreIntoObjectNoBarrier(RAX,
-                              FieldAddress(RAX, Array::length_offset()),
+  __ StoreIntoObjectNoBarrier(RAX, FieldAddress(RAX, Array::length_offset()),
                               R10);
 
   // Initialize all array elements to raw_null.
@@ -738,9 +740,9 @@
   __ EnterFrame(0);
 
   const Register kTargetCodeReg = CallingConventions::kArg1Reg;
-  const Register kArgDescReg    = CallingConventions::kArg2Reg;
-  const Register kArgsReg       = CallingConventions::kArg3Reg;
-  const Register kThreadReg     = CallingConventions::kArg4Reg;
+  const Register kArgDescReg = CallingConventions::kArg2Reg;
+  const Register kArgsReg = CallingConventions::kArg3Reg;
+  const Register kThreadReg = CallingConventions::kArg4Reg;
 
   // Push code object to PC marker slot.
   __ pushq(Address(kThreadReg, Thread::invoke_dart_code_stub_offset()));
@@ -752,7 +754,7 @@
 
   const intptr_t kInitialOffset = 2;
   // Save arguments descriptor array.
-  const intptr_t kArgumentsDescOffset = -(kInitialOffset) * kWordSize;
+  const intptr_t kArgumentsDescOffset = -(kInitialOffset)*kWordSize;
   __ pushq(kArgDescReg);
 
   // Save C++ ABI callee-saved registers.
@@ -778,8 +780,7 @@
   // StackFrameIterator reads the top exit frame info saved in this frame.
   __ movq(RAX, Address(THR, Thread::top_resource_offset()));
   __ pushq(RAX);
-  __ movq(Address(THR, Thread::top_resource_offset()),
-          Immediate(0));
+  __ movq(Address(THR, Thread::top_resource_offset()), Immediate(0));
   __ movq(RAX, Address(THR, Thread::top_exit_frame_info_offset()));
   // The constant kExitLinkSlotFromEntryFp must be kept in sync with the
   // code below.
@@ -795,8 +796,7 @@
   }
 #endif
 
-  __ movq(Address(THR, Thread::top_exit_frame_info_offset()),
-          Immediate(0));
+  __ movq(Address(THR, Thread::top_exit_frame_info_offset()), Immediate(0));
 
   // Load arguments descriptor array into R10, which is passed to Dart code.
   __ movq(R10, Address(kArgDescReg, VMHandles::kOffsetOfRawPtrInHandle));
@@ -875,9 +875,8 @@
     __ andq(R13, Immediate(-kObjectAlignment));
 
     // Check for allocation tracing.
-    NOT_IN_PRODUCT(__ MaybeTraceAllocation(kContextCid,
-                                           &slow_case,
-                                           Assembler::kFarJump));
+    NOT_IN_PRODUCT(
+        __ MaybeTraceAllocation(kContextCid, &slow_case, Assembler::kFarJump));
 
     // Now allocate the object.
     // R10: number of context variables.
@@ -931,8 +930,7 @@
       // RAX: new object.
       // R10: number of context variables.
       // R13: size and bit tags.
-      __ orq(R13,
-             Immediate(RawObject::ClassIdTag::encode(cid)));
+      __ orq(R13, Immediate(RawObject::ClassIdTag::encode(cid)));
       __ movq(FieldAddress(RAX, Context::tags_offset()), R13);  // Tags.
     }
 
@@ -945,9 +943,8 @@
     // RAX: new object.
     // R10: number of context variables.
     // No generational barrier needed, since we are storing null.
-    __ StoreIntoObjectNoBarrier(RAX,
-                                FieldAddress(RAX, Context::parent_offset()),
-                                R9);
+    __ StoreIntoObjectNoBarrier(
+        RAX, FieldAddress(RAX, Context::parent_offset()), R9);
 
     // Initialize the context variables.
     // RAX: new object.
@@ -964,9 +961,7 @@
       __ Bind(&loop);
       __ decq(R10);
       // No generational barrier needed, since we are storing null.
-      __ StoreIntoObjectNoBarrier(RAX,
-                                  Address(R13, R10, TIMES_8, 0),
-                                  R9);
+      __ StoreIntoObjectNoBarrier(RAX, Address(R13, R10, TIMES_8, 0), R9);
       __ Bind(&entry);
       __ cmpq(R10, Immediate(0));
       __ j(NOT_EQUAL, &loop, Assembler::kNearJump);
@@ -1123,11 +1118,8 @@
       // Check if the object contains any non-header fields.
       // Small objects are initialized using a consecutive set of writes.
       for (intptr_t current_offset = Instance::NextFieldOffset();
-           current_offset < instance_size;
-           current_offset += kWordSize) {
-        __ StoreIntoObjectNoBarrier(RAX,
-                                    FieldAddress(RAX, current_offset),
-                                    R9);
+           current_offset < instance_size; current_offset += kWordSize) {
+        __ StoreIntoObjectNoBarrier(RAX, FieldAddress(RAX, current_offset), R9);
       }
     } else {
       __ leaq(RCX, FieldAddress(RAX, Instance::NextFieldOffset()));
@@ -1168,8 +1160,8 @@
   // RDX: new object type arguments.
   // Create a stub frame.
   __ EnterStubFrame();  // Uses PP to access class object.
-  __ pushq(R9);  // Setup space on stack for return value.
-  __ PushObject(cls);  // Push class of object to be allocated.
+  __ pushq(R9);         // Setup space on stack for return value.
+  __ PushObject(cls);   // Push class of object to be allocated.
   if (is_cls_parameterized) {
     __ pushq(RDX);  // Push type arguments of object to be allocated.
   } else {
@@ -1201,8 +1193,8 @@
   __ movq(RAX, Address(RBP, R13, TIMES_4, kParamEndSlotFromFp * kWordSize));
 
   __ pushq(Immediate(0));  // Result slot.
-  __ pushq(RAX);  // Receiver.
-  __ pushq(R10);  // Arguments descriptor array.
+  __ pushq(RAX);           // Receiver.
+  __ pushq(R10);           // Arguments descriptor array.
 
   __ movq(R10, R13);  // Smi-tagged arguments array length.
   PushArgumentsArray(assembler);
@@ -1221,15 +1213,15 @@
   Register func_reg = RDI;
   if (FLAG_trace_optimized_ic_calls) {
     __ EnterStubFrame();
-    __ pushq(func_reg);     // Preserve
-    __ pushq(ic_reg);       // Preserve.
-    __ pushq(ic_reg);       // Argument.
-    __ pushq(func_reg);     // Argument.
+    __ pushq(func_reg);  // Preserve
+    __ pushq(ic_reg);    // Preserve.
+    __ pushq(ic_reg);    // Argument.
+    __ pushq(func_reg);  // Argument.
     __ CallRuntime(kTraceICCallRuntimeEntry, 2);
-    __ popq(RAX);          // Discard argument;
-    __ popq(RAX);          // Discard argument;
-    __ popq(ic_reg);       // Restore.
-    __ popq(func_reg);     // Restore.
+    __ popq(RAX);       // Discard argument;
+    __ popq(RAX);       // Discard argument;
+    __ popq(ic_reg);    // Restore.
+    __ popq(func_reg);  // Restore.
     __ LeaveStubFrame();
   }
   __ incl(FieldAddress(func_reg, Function::usage_counter_offset()));
@@ -1260,8 +1252,8 @@
                           Label* not_smi_or_overflow) {
   __ Comment("Fast Smi op");
   ASSERT(num_args == 2);
-  __ movq(RCX, Address(RSP, + 1 * kWordSize));  // Right
-  __ movq(RAX, Address(RSP, + 2 * kWordSize));  // Left.
+  __ movq(RCX, Address(RSP, +1 * kWordSize));  // Right
+  __ movq(RAX, Address(RSP, +2 * kWordSize));  // Left.
   __ movq(R13, RCX);
   __ orq(R13, RAX);
   __ testq(R13, Immediate(kSmiTagMask));
@@ -1288,14 +1280,15 @@
       __ Bind(&done);
       break;
     }
-    default: UNIMPLEMENTED();
+    default:
+      UNIMPLEMENTED();
   }
 
   // RBX: IC data object (preserved).
   __ movq(R13, FieldAddress(RBX, ICData::ic_data_offset()));
   // R13: ic_data_array with check entries: classes and target functions.
   __ leaq(R13, FieldAddress(R13, Array::data_offset()));
-  // R13: points directly to the first ic data array element.
+// R13: points directly to the first ic data array element.
 #if defined(DEBUG)
   // Check that first entry is for Smi/Smi.
   Label error, ok;
@@ -1342,7 +1335,8 @@
     bool optimized) {
   ASSERT(num_args > 0);
 #if defined(DEBUG)
-  { Label ok;
+  {
+    Label ok;
     // Check that the IC data array has NumArgsTested() == num_args.
     // 'NumArgsTested' is stored in the least significant bits of 'state_bits'.
     __ movl(RCX, FieldAddress(RBX, ICData::state_bits_offset()));
@@ -1366,11 +1360,7 @@
 
   Label not_smi_or_overflow;
   if (kind != Token::kILLEGAL) {
-    EmitFastSmiOp(
-        assembler,
-        kind,
-        num_args,
-        &not_smi_or_overflow);
+    EmitFastSmiOp(assembler, kind, num_args, &not_smi_or_overflow);
   }
   __ Bind(&not_smi_or_overflow);
 
@@ -1400,7 +1390,7 @@
     if (i > 0) {
       // If not the first, load the next argument's class ID.
       __ movq(RAX, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
-      __ movq(R9, Address(RSP, RAX, TIMES_4, - i * kWordSize));
+      __ movq(R9, Address(RSP, RAX, TIMES_4, -i * kWordSize));
       __ LoadTaggedClassIdMayBeSmi(RAX, R9);
       // RAX: next argument class ID (smi).
       __ movq(R9, Address(R13, i * kWordSize));
@@ -1424,7 +1414,7 @@
 
   const intptr_t entry_size = ICData::TestEntryLengthFor(num_args) * kWordSize;
   __ addq(R13, Immediate(entry_size));  // Next entry.
-  __ movq(R9, Address(R13, 0));  // Next class ID.
+  __ movq(R9, Address(R13, 0));         // Next class ID.
 
   __ Bind(&test);
   __ cmpq(R9, Immediate(Smi::RawValue(kIllegalCid)));  // Done?
@@ -1436,8 +1426,8 @@
   __ movq(RAX, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
   __ leaq(RAX, Address(RSP, RAX, TIMES_4, 0));  // RAX is Smi.
   __ EnterStubFrame();
-  __ pushq(R10);  // Preserve arguments descriptor array.
-  __ pushq(RBX);  // Preserve IC data object.
+  __ pushq(R10);           // Preserve arguments descriptor array.
+  __ pushq(RBX);           // Preserve IC data object.
   __ pushq(Immediate(0));  // Result slot.
   // Push call arguments.
   for (intptr_t i = 0; i < num_args; i++) {
@@ -1511,41 +1501,37 @@
 //   - 1 target function.
 void StubCode::GenerateOneArgCheckInlineCacheStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, RCX);
-  GenerateNArgsCheckInlineCacheStub(assembler, 1,
-      kInlineCacheMissHandlerOneArgRuntimeEntry,
-      Token::kILLEGAL);
+  GenerateNArgsCheckInlineCacheStub(
+      assembler, 1, kInlineCacheMissHandlerOneArgRuntimeEntry, Token::kILLEGAL);
 }
 
 
 void StubCode::GenerateTwoArgsCheckInlineCacheStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, RCX);
   GenerateNArgsCheckInlineCacheStub(assembler, 2,
-      kInlineCacheMissHandlerTwoArgsRuntimeEntry,
-      Token::kILLEGAL);
+                                    kInlineCacheMissHandlerTwoArgsRuntimeEntry,
+                                    Token::kILLEGAL);
 }
 
 
 void StubCode::GenerateSmiAddInlineCacheStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, RCX);
-  GenerateNArgsCheckInlineCacheStub(assembler, 2,
-      kInlineCacheMissHandlerTwoArgsRuntimeEntry,
-      Token::kADD);
+  GenerateNArgsCheckInlineCacheStub(
+      assembler, 2, kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kADD);
 }
 
 
 void StubCode::GenerateSmiSubInlineCacheStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, RCX);
-  GenerateNArgsCheckInlineCacheStub(assembler, 2,
-      kInlineCacheMissHandlerTwoArgsRuntimeEntry,
-      Token::kSUB);
+  GenerateNArgsCheckInlineCacheStub(
+      assembler, 2, kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kSUB);
 }
 
 
 void StubCode::GenerateSmiEqualInlineCacheStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, RCX);
-  GenerateNArgsCheckInlineCacheStub(assembler, 2,
-      kInlineCacheMissHandlerTwoArgsRuntimeEntry,
-      Token::kEQ);
+  GenerateNArgsCheckInlineCacheStub(
+      assembler, 2, kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kEQ);
 }
 
 
@@ -1564,9 +1550,8 @@
     Assembler* assembler) {
   GenerateOptimizedUsageCounterIncrement(assembler);
   GenerateNArgsCheckInlineCacheStub(assembler, 1,
-      kInlineCacheMissHandlerOneArgRuntimeEntry,
-      Token::kILLEGAL,
-      true /* optimized */);
+                                    kInlineCacheMissHandlerOneArgRuntimeEntry,
+                                    Token::kILLEGAL, true /* optimized */);
 }
 
 
@@ -1574,9 +1559,8 @@
     Assembler* assembler) {
   GenerateOptimizedUsageCounterIncrement(assembler);
   GenerateNArgsCheckInlineCacheStub(assembler, 2,
-      kInlineCacheMissHandlerTwoArgsRuntimeEntry,
-      Token::kILLEGAL,
-      true /* optimized */);
+                                    kInlineCacheMissHandlerTwoArgsRuntimeEntry,
+                                    Token::kILLEGAL, true /* optimized */);
 }
 
 
@@ -1586,7 +1570,8 @@
 void StubCode::GenerateZeroArgsUnoptimizedStaticCallStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, RCX);
 #if defined(DEBUG)
-  { Label ok;
+  {
+    Label ok;
     // Check that the IC data array has NumArgsTested() == 0.
     // 'NumArgsTested' is stored in the least significant bits of 'state_bits'.
     __ movl(RCX, FieldAddress(RBX, ICData::state_bits_offset()));
@@ -1606,9 +1591,9 @@
     __ movzxb(RAX, Address(RAX, Isolate::single_step_offset()));
     __ cmpq(RAX, Immediate(0));
 #if defined(DEBUG)
-      static const bool kJumpLength = Assembler::kFarJump;
+    static const bool kJumpLength = Assembler::kFarJump;
 #else
-      static const bool kJumpLength = Assembler::kNearJump;
+    static const bool kJumpLength = Assembler::kNearJump;
 #endif  // DEBUG
     __ j(NOT_EQUAL, &stepping, kJumpLength);
     __ Bind(&done_stepping);
@@ -1656,19 +1641,14 @@
 void StubCode::GenerateOneArgUnoptimizedStaticCallStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, RCX);
   GenerateNArgsCheckInlineCacheStub(
-      assembler,
-      1,
-      kStaticCallMissHandlerOneArgRuntimeEntry,
-      Token::kILLEGAL);
+      assembler, 1, kStaticCallMissHandlerOneArgRuntimeEntry, Token::kILLEGAL);
 }
 
 
 void StubCode::GenerateTwoArgsUnoptimizedStaticCallStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, RCX);
-  GenerateNArgsCheckInlineCacheStub(assembler,
-      2,
-      kStaticCallMissHandlerTwoArgsRuntimeEntry,
-      Token::kILLEGAL);
+  GenerateNArgsCheckInlineCacheStub(
+      assembler, 2, kStaticCallMissHandlerTwoArgsRuntimeEntry, Token::kILLEGAL);
 }
 
 
@@ -1697,15 +1677,15 @@
 // TOS(0): return address (Dart code).
 void StubCode::GenerateICCallBreakpointStub(Assembler* assembler) {
   __ EnterStubFrame();
-  __ pushq(RBX);  // Preserve IC data.
+  __ pushq(RBX);           // Preserve IC data.
   __ pushq(Immediate(0));  // Result slot.
   __ CallRuntime(kBreakpointRuntimeHandlerRuntimeEntry, 0);
   __ popq(CODE_REG);  // Original stub.
-  __ popq(RBX);  // Restore IC data.
+  __ popq(RBX);       // Restore IC data.
   __ LeaveStubFrame();
 
   __ movq(RAX, FieldAddress(CODE_REG, Code::entry_point_offset()));
-  __ jmp(RAX);   // Jump to original stub.
+  __ jmp(RAX);  // Jump to original stub.
 }
 
 
@@ -1718,7 +1698,7 @@
   __ LeaveStubFrame();
 
   __ movq(RAX, FieldAddress(CODE_REG, Code::entry_point_offset()));
-  __ jmp(RAX);   // Jump to original stub.
+  __ jmp(RAX);  // Jump to original stub.
 }
 
 
@@ -1759,8 +1739,9 @@
     // Compute instance type arguments into R13.
     Label has_no_type_arguments;
     __ movq(R13, R9);
-    __ movl(RDI, FieldAddress(R10,
-        Class::type_arguments_field_offset_in_words_offset()));
+    __ movl(RDI,
+            FieldAddress(R10,
+                         Class::type_arguments_field_offset_in_words_offset()));
     __ cmpl(RDI, Immediate(Class::kNoTypeArguments));
     __ j(EQUAL, &has_no_type_arguments, Assembler::kNearJump);
     __ movq(R13, FieldAddress(RAX, RDI, TIMES_8, 0));
@@ -1783,9 +1764,8 @@
   __ movq(R10, FieldAddress(RAX, Closure::function_offset()));
   // R10: instance class id as Smi or function.
   __ Bind(&loop);
-  __ movq(RDI,
-          Address(RDX,
-                  kWordSize * SubtypeTestCache::kInstanceClassIdOrFunction));
+  __ movq(RDI, Address(RDX, kWordSize *
+                                SubtypeTestCache::kInstanceClassIdOrFunction));
   __ cmpq(RDI, R9);
   __ j(EQUAL, &not_found, Assembler::kNearJump);
   __ cmpq(RDI, R10);
@@ -1794,15 +1774,15 @@
   } else {
     __ j(NOT_EQUAL, &next_iteration, Assembler::kNearJump);
     __ movq(RDI,
-        Address(RDX, kWordSize * SubtypeTestCache::kInstanceTypeArguments));
+            Address(RDX, kWordSize * SubtypeTestCache::kInstanceTypeArguments));
     __ cmpq(RDI, R13);
     if (n == 2) {
       __ j(EQUAL, &found, Assembler::kNearJump);
     } else {
       __ j(NOT_EQUAL, &next_iteration, Assembler::kNearJump);
       __ movq(RDI,
-          Address(RDX,
-                  kWordSize * SubtypeTestCache::kInstantiatorTypeArguments));
+              Address(RDX, kWordSize *
+                               SubtypeTestCache::kInstantiatorTypeArguments));
       __ cmpq(RDI, Address(RSP, kInstantiatorTypeArgumentsInBytes));
       __ j(EQUAL, &found, Assembler::kNearJump);
     }
@@ -1895,8 +1875,7 @@
   // Set the tag.
   __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
   // Clear top exit frame.
-  __ movq(Address(THR, Thread::top_exit_frame_info_offset()),
-          Immediate(0));
+  __ movq(Address(THR, Thread::top_exit_frame_info_offset()), Immediate(0));
   // Restore the pool pointer.
   __ RestoreCodePointer();
   __ LoadPoolPointer(PP);
@@ -1909,9 +1888,9 @@
 // R10: argument descriptor (preserved).
 void StubCode::GenerateOptimizeFunctionStub(Assembler* assembler) {
   __ EnterStubFrame();
-  __ pushq(R10);  // Preserve args descriptor.
+  __ pushq(R10);           // Preserve args descriptor.
   __ pushq(Immediate(0));  // Result slot.
-  __ pushq(RDI);  // Arg0: function to optimize
+  __ pushq(RDI);           // Arg0: function to optimize
   __ CallRuntime(kOptimizeInvokedFunctionRuntimeEntry, 1);
   __ popq(RAX);  // Disard argument.
   __ popq(RAX);  // Get Code object.
diff --git a/runtime/vm/stub_code_x64_test.cc b/runtime/vm/stub_code_x64_test.cc
index 66feaeb..d217c32 100644
--- a/runtime/vm/stub_code_x64_test.cc
+++ b/runtime/vm/stub_code_x64_test.cc
@@ -20,25 +20,23 @@
 namespace dart {
 
 static Function* CreateFunction(const char* name) {
-  const String& class_name = String::Handle(Symbols::New(Thread::Current(),
-                                                         "ownerClass"));
+  const String& class_name =
+      String::Handle(Symbols::New(Thread::Current(), "ownerClass"));
   const Script& script = Script::Handle();
   const Library& lib = Library::Handle(Library::New(class_name));
   const Class& owner_class = Class::Handle(
       Class::New(lib, class_name, script, TokenPosition::kNoSource));
-  const String& function_name = String::ZoneHandle(
-      Symbols::New(Thread::Current(), name));
-  Function& function = Function::ZoneHandle(
-      Function::New(function_name, RawFunction::kRegularFunction,
-                    true, false, false, false, false, owner_class,
-                    TokenPosition::kNoSource));
+  const String& function_name =
+      String::ZoneHandle(Symbols::New(Thread::Current(), name));
+  Function& function = Function::ZoneHandle(Function::New(
+      function_name, RawFunction::kRegularFunction, true, false, false, false,
+      false, owner_class, TokenPosition::kNoSource));
   return &function;
 }
 
 
 // Test calls to stub code which calls into the runtime.
-static void GenerateCallToCallRuntimeStub(Assembler* assembler,
-                                          int length) {
+static void GenerateCallToCallRuntimeStub(Assembler* assembler, int length) {
   const int argc = 2;
   const Smi& smi_length = Smi::ZoneHandle(Smi::New(length));
   __ EnterStubFrame();
diff --git a/runtime/vm/symbols.cc b/runtime/vm/symbols.cc
index 0f91fb6..0d95289 100644
--- a/runtime/vm/symbols.cc
+++ b/runtime/vm/symbols.cc
@@ -21,38 +21,38 @@
 String* Symbols::symbol_handles_[Symbols::kMaxPredefinedId];
 
 static const char* names[] = {
+    // clang-format off
   NULL,
-
-#define DEFINE_SYMBOL_LITERAL(symbol, literal)                                 \
-  literal,
-PREDEFINED_SYMBOLS_LIST(DEFINE_SYMBOL_LITERAL)
+#define DEFINE_SYMBOL_LITERAL(symbol, literal) literal,
+  PREDEFINED_SYMBOLS_LIST(DEFINE_SYMBOL_LITERAL)
 #undef DEFINE_SYMBOL_LITERAL
-
   "",  // matches kTokenTableStart.
-
-#define DEFINE_TOKEN_SYMBOL_INDEX(t, s, p, a)                                  \
-  s,
+#define DEFINE_TOKEN_SYMBOL_INDEX(t, s, p, a) s,
   DART_TOKEN_LIST(DEFINE_TOKEN_SYMBOL_INDEX)
   DART_KEYWORD_LIST(DEFINE_TOKEN_SYMBOL_INDEX)
 #undef DEFINE_TOKEN_SYMBOL_INDEX
+    // clang-format on
 };
 
 RawString* StringFrom(const uint8_t* data, intptr_t len, Heap::Space space) {
   return String::FromLatin1(data, len, space);
 }
+
+
 RawString* StringFrom(const uint16_t* data, intptr_t len, Heap::Space space) {
   return String::FromUTF16(data, len, space);
 }
+
+
 RawString* StringFrom(const int32_t* data, intptr_t len, Heap::Space space) {
   return String::FromUTF32(data, len, space);
 }
 
 
-template<typename CharType>
+template <typename CharType>
 class CharArray {
  public:
-  CharArray(const CharType* data, intptr_t len)
-      : data_(data), len_(len) {
+  CharArray(const CharType* data, intptr_t len) : data_(data), len_(len) {
     hash_ = String::Hash(data, len);
   }
   RawString* ToSymbol() const {
@@ -69,6 +69,7 @@
     return other.Equals(data_, len_);
   }
   intptr_t Hash() const { return hash_; }
+
  private:
   const CharType* data_;
   intptr_t len_;
@@ -94,6 +95,7 @@
     return other.Equals(str_, begin_index_, len_);
   }
   intptr_t Hash() const { return hash_; }
+
  private:
   bool is_all() const { return begin_index_ == 0 && len_ == str_.Length(); }
   const String& str_;
@@ -108,8 +110,8 @@
     str_.SetCanonical();
     return str_.raw();
   } else {
-    String& result = String::Handle(
-        String::SubString(str_, begin_index_, len_, Heap::kOld));
+    String& result =
+        String::Handle(String::SubString(str_, begin_index_, len_, Heap::kOld));
     result.SetCanonical();
     result.SetHash(hash_);
     return result.raw();
@@ -130,6 +132,7 @@
     return other.EqualsConcat(str1_, str2_);
   }
   intptr_t Hash() const { return hash_; }
+
  private:
   const String& str1_;
   const String& str2_;
@@ -165,7 +168,7 @@
     // Use a comparison which does not consider the state of the canonical bit.
     return a_str.Equals(b_str, 0, a_len);
   }
-  template<typename CharType>
+  template <typename CharType>
   static bool IsMatch(const CharArray<CharType>& array, const Object& obj) {
     return array.Equals(String::Cast(obj));
   }
@@ -175,20 +178,14 @@
   static bool IsMatch(const ConcatString& concat, const Object& obj) {
     return concat.Equals(String::Cast(obj));
   }
-  static uword Hash(const Object& key) {
-    return String::Cast(key).Hash();
-  }
-  template<typename CharType>
+  static uword Hash(const Object& key) { return String::Cast(key).Hash(); }
+  template <typename CharType>
   static uword Hash(const CharArray<CharType>& array) {
     return array.Hash();
   }
-  static uword Hash(const StringSlice& slice) {
-    return slice.Hash();
-  }
-  static uword Hash(const ConcatString& concat) {
-    return concat.Hash();
-  }
-  template<typename CharType>
+  static uword Hash(const StringSlice& slice) { return slice.Hash(); }
+  static uword Hash(const ConcatString& concat) { return concat.Hash(); }
+  template <typename CharType>
   static RawObject* NewKey(const CharArray<CharType>& array) {
     return array.ToSymbol();
   }
@@ -310,8 +307,9 @@
   ASSERT(isolate != NULL);
 
   // Setup the symbol table used within the String class.
-  const intptr_t initial_size = (isolate == Dart::vm_isolate()) ?
-      kInitialVMIsolateSymtabSize : kInitialSymtabSize;
+  const intptr_t initial_size = (isolate == Dart::vm_isolate())
+                                    ? kInitialVMIsolateSymtabSize
+                                    : kInitialSymtabSize;
   Array& array =
       Array::Handle(HashTables::New<SymbolTable>(initial_size, Heap::kOld));
   isolate->object_store()->set_symbol_table(array);
@@ -330,8 +328,8 @@
                        Dart::vm_isolate()->object_store()->symbol_table());
   SymbolTable table(zone, isolate->object_store()->symbol_table());
   intptr_t unified_size = vm_table.NumOccupied() + table.NumOccupied();
-  SymbolTable unified_table(zone, HashTables::New<SymbolTable>(unified_size,
-                                                               Heap::kOld));
+  SymbolTable unified_table(
+      zone, HashTables::New<SymbolTable>(unified_size, Heap::kOld));
   String& symbol = String::Handle(zone);
 
   SymbolTable::Iterator vm_iter(&vm_table);
@@ -369,10 +367,8 @@
   GrowableArray<String*> symbols;
   class SymbolCollector : public ObjectVisitor {
    public:
-    SymbolCollector(Thread* thread,
-                    GrowableArray<String*>* symbols)
-        : symbols_(symbols),
-          zone_(thread->zone()) {}
+    SymbolCollector(Thread* thread, GrowableArray<String*>* symbols)
+        : symbols_(symbols), zone_(thread->zone()) {}
 
     void VisitObject(RawObject* obj) {
       if (obj->IsCanonical() && obj->IsStringInstance()) {
@@ -389,9 +385,8 @@
   isolate->heap()->IterateObjects(&visitor);
 
   // 3. Build a new table from the surviving symbols.
-  Array& array =
-      Array::Handle(zone, HashTables::New<SymbolTable>(symbols.length() * 4 / 3,
-                                                       Heap::kOld));
+  Array& array = Array::Handle(
+      zone, HashTables::New<SymbolTable>(symbols.length() * 4 / 3, Heap::kOld));
   SymbolTable table(zone, array.raw());
   for (intptr_t i = 0; i < symbols.length(); i++) {
     String& symbol = *symbols[i];
@@ -402,7 +397,7 @@
   }
   isolate->object_store()->set_symbol_table(table.Release());
 }
-#endif   // DART_PRECOMPILER
+#endif  // DART_PRECOMPILER
 
 
 void Symbols::GetStats(Isolate* isolate, intptr_t* size, intptr_t* capacity) {
@@ -495,7 +490,8 @@
 // TODO(srdjan): If this becomes performance critical code, consider looking
 // up symbol from hash of pieces instead of concatenating them first into
 // a string.
-RawString* Symbols::FromConcatAll(Thread* thread,
+RawString* Symbols::FromConcatAll(
+    Thread* thread,
     const GrowableHandlePtrArray<const String>& strs) {
   const intptr_t strs_length = strs.length();
   GrowableArray<intptr_t> lengths(strs_length);
@@ -527,9 +523,9 @@
       if (str_len > 0) {
         const String& str = strs[i];
         ASSERT(str.IsOneByteString() || str.IsExternalOneByteString());
-        const uint8_t* src_p = str.IsOneByteString() ?
-            OneByteString::CharAddr(str, 0) :
-            ExternalOneByteString::CharAddr(str, 0);
+        const uint8_t* src_p = str.IsOneByteString()
+                                   ? OneByteString::CharAddr(str, 0)
+                                   : ExternalOneByteString::CharAddr(str, 0);
         memmove(buffer, src_p, str_len);
         buffer += str_len;
       }
@@ -551,9 +547,9 @@
         } else {
           // One-byte to two-byte string copy.
           ASSERT(str.IsOneByteString() || str.IsExternalOneByteString());
-          const uint8_t* src_p = str.IsOneByteString() ?
-              OneByteString::CharAddr(str, 0) :
-              ExternalOneByteString::CharAddr(str, 0);
+          const uint8_t* src_p = str.IsOneByteString()
+                                     ? OneByteString::CharAddr(str, 0)
+                                     : ExternalOneByteString::CharAddr(str, 0);
           for (int n = 0; n < str_len; n++) {
             buffer[n] = src_p[n];
           }
@@ -568,7 +564,7 @@
 
 
 // StringType can be StringSlice, ConcatString, or {Latin1,UTF16,UTF32}Array.
-template<typename StringType>
+template <typename StringType>
 RawString* Symbols::NewSymbol(Thread* thread, const StringType& str) {
   REUSABLE_OBJECT_HANDLESCOPE(thread);
   REUSABLE_SMI_HANDLESCOPE(thread);
@@ -598,7 +594,7 @@
 }
 
 
-template<typename StringType>
+template <typename StringType>
 RawString* Symbols::Lookup(Thread* thread, const StringType& str) {
   REUSABLE_OBJECT_HANDLESCOPE(thread);
   REUSABLE_SMI_HANDLESCOPE(thread);
@@ -628,8 +624,9 @@
 }
 
 
-RawString* Symbols::LookupFromConcat(
-    Thread* thread, const String& str1, const String& str2) {
+RawString* Symbols::LookupFromConcat(Thread* thread,
+                                     const String& str1,
+                                     const String& str2) {
   if (str1.Length() == 0) {
     return Lookup(thread, str2);
   } else if (str2.Length() == 0) {
@@ -671,7 +668,6 @@
 }
 
 
-
 RawString* Symbols::NewFormatted(Thread* thread, const char* format, ...) {
   va_list args;
   va_start(args, format);
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index afcb3ff..a728610 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -230,20 +230,20 @@
   V(Float64x2List, "Float64x2List")                                            \
   V(Float32List, "Float32List")                                                \
   V(Float64List, "Float64List")                                                \
-  V(_Int8ArrayFactory, "Int8List.")                                          \
-  V(_Uint8ArrayFactory, "Uint8List.")                                        \
-  V(_Uint8ClampedArrayFactory, "Uint8ClampedList.")                          \
-  V(_Int16ArrayFactory, "Int16List.")                                        \
-  V(_Uint16ArrayFactory, "Uint16List.")                                      \
-  V(_Int32ArrayFactory, "Int32List.")                                        \
-  V(_Uint32ArrayFactory, "Uint32List.")                                      \
-  V(_Int64ArrayFactory, "Int64List.")                                        \
-  V(_Uint64ArrayFactory, "Uint64List.")                                      \
-  V(_Float32x4ArrayFactory, "Float32x4List.")                                \
-  V(_Int32x4ArrayFactory, "Int32x4List.")                                    \
-  V(_Float64x2ArrayFactory, "Float64x2List.")                                \
-  V(_Float32ArrayFactory, "Float32List.")                                    \
-  V(_Float64ArrayFactory, "Float64List.")                                    \
+  V(_Int8ArrayFactory, "Int8List.")                                            \
+  V(_Uint8ArrayFactory, "Uint8List.")                                          \
+  V(_Uint8ClampedArrayFactory, "Uint8ClampedList.")                            \
+  V(_Int16ArrayFactory, "Int16List.")                                          \
+  V(_Uint16ArrayFactory, "Uint16List.")                                        \
+  V(_Int32ArrayFactory, "Int32List.")                                          \
+  V(_Uint32ArrayFactory, "Uint32List.")                                        \
+  V(_Int64ArrayFactory, "Int64List.")                                          \
+  V(_Uint64ArrayFactory, "Uint64List.")                                        \
+  V(_Float32x4ArrayFactory, "Float32x4List.")                                  \
+  V(_Int32x4ArrayFactory, "Int32x4List.")                                      \
+  V(_Float64x2ArrayFactory, "Float64x2List.")                                  \
+  V(_Float32ArrayFactory, "Float32List.")                                      \
+  V(_Float64ArrayFactory, "Float64List.")                                      \
   V(_Int8ArrayView, "_Int8ArrayView")                                          \
   V(_Uint8ArrayView, "_Uint8ArrayView")                                        \
   V(_Uint8ClampedArrayView, "_Uint8ClampedArrayView")                          \
@@ -404,7 +404,7 @@
   V(_classRangeCheck, "_classRangeCheck")                                      \
   V(_classRangeCheckNegative, "_classRangeCheckNegative")                      \
   V(GetRuntimeType, "get:runtimeType")                                         \
-  V(HaveSameRuntimeType, "_haveSameRuntimeType")                               \
+  V(HaveSameRuntimeType, "_haveSameRuntimeType")
 
 
 // Contains a list of frequently used strings in a canonicalized form. This
@@ -416,23 +416,23 @@
 
   // List of strings that are pre created in the vm isolate.
   enum SymbolId {
+    // clang-format off
     kIllegal = 0,
 
-#define DEFINE_SYMBOL_INDEX(symbol, literal)                                   \
-    k##symbol##Id,
+#define DEFINE_SYMBOL_INDEX(symbol, literal) k##symbol##Id,
     PREDEFINED_SYMBOLS_LIST(DEFINE_SYMBOL_INDEX)
 #undef DEFINE_SYMBOL_INDEX
 
     kTokenTableStart,  // First token at kTokenTableStart + 1.
 
-#define DEFINE_TOKEN_SYMBOL_INDEX(t, s, p, a)                                  \
-    t##Id,
-    DART_TOKEN_LIST(DEFINE_TOKEN_SYMBOL_INDEX)
-    DART_KEYWORD_LIST(DEFINE_TOKEN_SYMBOL_INDEX)
+#define DEFINE_TOKEN_SYMBOL_INDEX(t, s, p, a) t##Id,
+    DART_TOKEN_LIST(DEFINE_TOKEN_SYMBOL_INDEX) DART_KEYWORD_LIST(
+        DEFINE_TOKEN_SYMBOL_INDEX)
 #undef DEFINE_TOKEN_SYMBOL_INDEX
 
     kNullCharId,  // One char code symbol starts here and takes up 256 entries.
     kMaxPredefinedId = kNullCharId + kMaxOneCharCodeSymbol + 1,
+    // clang-format on
   };
 
   // Number of one character symbols being predefined in the predefined_ array.
@@ -448,21 +448,13 @@
   }
 
   // Access methods for one byte character symbols stored in the vm isolate.
-  static const String& Dot() {
-    return *(symbol_handles_[kNullCharId + '.']);
-  }
+  static const String& Dot() { return *(symbol_handles_[kNullCharId + '.']); }
   static const String& Equals() {
     return *(symbol_handles_[kNullCharId + '=']);
   }
-  static const String& Plus() {
-    return *(symbol_handles_[kNullCharId + '+']);
-  }
-  static const String& Minus() {
-    return *(symbol_handles_[kNullCharId + '-']);
-  }
-  static const String& BitOr() {
-    return *(symbol_handles_[kNullCharId + '|']);
-  }
+  static const String& Plus() { return *(symbol_handles_[kNullCharId + '+']); }
+  static const String& Minus() { return *(symbol_handles_[kNullCharId + '-']); }
+  static const String& BitOr() { return *(symbol_handles_[kNullCharId + '|']); }
   static const String& BitAnd() {
     return *(symbol_handles_[kNullCharId + '&']);
   }
@@ -490,9 +482,7 @@
   static const String& RBrace() {
     return *(symbol_handles_[kNullCharId + '}']);
   }
-  static const String& Blank() {
-    return *(symbol_handles_[kNullCharId + ' ']);
-  }
+  static const String& Blank() { return *(symbol_handles_[kNullCharId + ' ']); }
   static const String& Dollar() {
     return *(symbol_handles_[kNullCharId + '$']);
   }
@@ -508,39 +498,27 @@
   static const String& LowercaseR() {
     return *(symbol_handles_[kNullCharId + 'r']);
   }
-  static const String& Dash() {
-    return *(symbol_handles_[kNullCharId + '-']);
-  }
+  static const String& Dash() { return *(symbol_handles_[kNullCharId + '-']); }
   static const String& Ampersand() {
     return *(symbol_handles_[kNullCharId + '&']);
   }
   static const String& Backtick() {
     return *(symbol_handles_[kNullCharId + '`']);
   }
-  static const String& Slash() {
-    return *(symbol_handles_[kNullCharId + '/']);
-  }
-  static const String& At() {
-    return *(symbol_handles_[kNullCharId + '@']);
-  }
+  static const String& Slash() { return *(symbol_handles_[kNullCharId + '/']); }
+  static const String& At() { return *(symbol_handles_[kNullCharId + '@']); }
   static const String& HashMark() {
     return *(symbol_handles_[kNullCharId + '#']);
   }
   static const String& Semicolon() {
     return *(symbol_handles_[kNullCharId + ';']);
   }
-  static const String& Star() {
-    return *(symbol_handles_[kNullCharId + '*']);
-  }
+  static const String& Star() { return *(symbol_handles_[kNullCharId + '*']); }
   static const String& Percent() {
     return *(symbol_handles_[kNullCharId + '%']);
   }
-  static const String& Caret() {
-    return *(symbol_handles_[kNullCharId + '^']);
-  }
-  static const String& Tilde() {
-    return *(symbol_handles_[kNullCharId + '~']);
-  }
+  static const String& Caret() { return *(symbol_handles_[kNullCharId + '^']); }
+  static const String& Tilde() { return *(symbol_handles_[kNullCharId + '~']); }
 
   static const String& Empty() { return *(symbol_handles_[kTokenTableStart]); }
   static const String& False() { return *(symbol_handles_[kFALSEId]); }
@@ -550,14 +528,14 @@
   static const String& True() { return *(symbol_handles_[kTRUEId]); }
   static const String& Void() { return *(symbol_handles_[kVOIDId]); }
 
-  // Access methods for symbol handles stored in the vm isolate for predefined
-  // symbols.
+// Access methods for symbol handles stored in the vm isolate for predefined
+// symbols.
 #define DEFINE_SYMBOL_HANDLE_ACCESSOR(symbol, literal)                         \
   static const String& symbol() { return *(symbol_handles_[k##symbol##Id]); }
   PREDEFINED_SYMBOLS_LIST(DEFINE_SYMBOL_HANDLE_ACCESSOR)
 #undef DEFINE_SYMBOL_HANDLE_ACCESSOR
 
-  // Access methods for symbol handles stored in the vm isolate for keywords.
+// Access methods for symbol handles stored in the vm isolate for keywords.
 #define DEFINE_SYMBOL_HANDLE_ACCESSOR(t, s, p, a)                              \
   static const String& t() { return *(symbol_handles_[t##Id]); }
   DART_TOKEN_LIST(DEFINE_SYMBOL_HANDLE_ACCESSOR)
@@ -625,7 +603,8 @@
                                const String& str1,
                                const String& str2);
 
-  static RawString* FromConcatAll(Thread* thread,
+  static RawString* FromConcatAll(
+      Thread* thread,
       const GrowableHandlePtrArray<const String>& strs);
 
   static RawString* FromGet(Thread* thread, const String& str);
@@ -644,7 +623,7 @@
   static void DumpStats();
 
   // Returns Symbol::Null if no symbol is found.
-  template<typename StringType>
+  template <typename StringType>
   static RawString* Lookup(Thread* thread, const StringType& str);
 
   // Returns Symbol::Null if no symbol is found.
@@ -656,17 +635,12 @@
   static RawString* LookupFromSet(Thread* thread, const String& str);
   static RawString* LookupFromDot(Thread* thread, const String& str);
 
-  static void GetStats(Isolate* isolate,
-                       intptr_t* size,
-                       intptr_t* capacity);
+  static void GetStats(Isolate* isolate, intptr_t* size, intptr_t* capacity);
 
  private:
-  enum {
-    kInitialVMIsolateSymtabSize = 1024,
-    kInitialSymtabSize = 2048
-  };
+  enum { kInitialVMIsolateSymtabSize = 1024, kInitialSymtabSize = 2048 };
 
-  template<typename StringType>
+  template <typename StringType>
   static RawString* NewSymbol(Thread* thread, const StringType& str);
 
   static intptr_t LookupPredefinedSymbol(RawObject* obj);
diff --git a/runtime/vm/tags.cc b/runtime/vm/tags.cc
index ccb52ab..30e284c 100644
--- a/runtime/vm/tags.cc
+++ b/runtime/vm/tags.cc
@@ -83,12 +83,13 @@
 
 
 VMTag::TagEntry VMTag::entries_[] = {
-  { "InvalidTag", kInvalidTagId, },
-#define DEFINE_VM_TAG_ENTRY(tag)                                               \
-  { ""#tag, k##tag##TagId },
-  VM_TAG_LIST(DEFINE_VM_TAG_ENTRY)
+    {
+        "InvalidTag", kInvalidTagId,
+    },
+#define DEFINE_VM_TAG_ENTRY(tag) {"" #tag, k##tag##TagId},
+    VM_TAG_LIST(DEFINE_VM_TAG_ENTRY)
 #undef DEFINE_VM_TAG_ENTRY
-  { "kNumVMTags", kNumVMTags },
+        {"kNumVMTags", kNumVMTags},
 };
 
 
@@ -162,8 +163,7 @@
   ASSERT(tag_id >= kUserTagIdOffset);
   ASSERT(tag_id < kUserTagIdOffset + kMaxUserTags);
   Zone* zone = Thread::Current()->zone();
-  const UserTag& tag =
-      UserTag::Handle(zone, UserTag::FindTagById(tag_id));
+  const UserTag& tag = UserTag::Handle(zone, UserTag::FindTagById(tag_id));
   ASSERT(!tag.IsNull());
   const String& label = String::Handle(zone, tag.label());
   return label.ToCString();
diff --git a/runtime/vm/tags.h b/runtime/vm/tags.h
index c6a0230c..66ab39e 100644
--- a/runtime/vm/tags.h
+++ b/runtime/vm/tags.h
@@ -14,9 +14,9 @@
 class RuntimeEntry;
 
 #define VM_TAG_LIST(V)                                                         \
-  V(Idle)          /* isolate is idle and is_runnable() */                     \
-  V(LoadWait)      /* isolate is idle and !is_runnable() */                    \
-  V(VM)            /* Catch all */                                             \
+  V(Idle)     /* isolate is idle and is_runnable() */                          \
+  V(LoadWait) /* isolate is idle and !is_runnable() */                         \
+  V(VM)       /* Catch all */                                                  \
   V(CompileOptimized)                                                          \
   V(CompileUnoptimized)                                                        \
   V(CompileClass)                                                              \
@@ -30,17 +30,16 @@
   V(GCOldSpace)                                                                \
   V(Embedder)                                                                  \
   V(Runtime)                                                                   \
-  V(Native)                                                                    \
+  V(Native)
 
 class VMTag : public AllStatic {
  public:
   enum VMTagId {
     kInvalidTagId = 0,
-#define DEFINE_VM_TAG_ID(tag)                                                  \
-    k##tag##TagId,
+#define DEFINE_VM_TAG_ID(tag) k##tag##TagId,
     VM_TAG_LIST(DEFINE_VM_TAG_ID)
 #undef DEFINE_VM_TAG_KIND
-    kNumVMTags,
+        kNumVMTags,
     //
     // All tags below |kNumVMTags| are special meta-data tags and do not
     // indicate the state of the VM during a sample.
@@ -82,6 +81,7 @@
  public:
   VMTagScope(Thread* thread, uword tag, bool conditional_set = true);
   ~VMTagScope();
+
  private:
   uword previous_tag_;
 
diff --git a/runtime/vm/thread.cc b/runtime/vm/thread.cc
index d3534af..dc4e1ca 100644
--- a/runtime/vm/thread.cc
+++ b/runtime/vm/thread.cc
@@ -56,8 +56,7 @@
 #define REUSABLE_HANDLE_SCOPE_INIT(object)
 #endif  // defined(DEBUG)
 
-#define REUSABLE_HANDLE_INITIALIZERS(object)                                   \
-  object##_handle_(NULL),
+#define REUSABLE_HANDLE_INITIALIZERS(object) object##_handle_(NULL),
 
 
 Thread::Thread(Isolate* isolate)
@@ -97,27 +96,24 @@
       sticky_error_(Error::null()),
       compiler_stats_(NULL),
       REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_INITIALIZERS)
-      REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_SCOPE_INIT)
-      safepoint_state_(0),
+          REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_SCOPE_INIT) safepoint_state_(0),
       execution_state_(kThreadInNative),
       next_(NULL) {
-NOT_IN_PRODUCT(
+#if !defined(PRODUCT)
   dart_stream_ = Timeline::GetDartStream();
   ASSERT(dart_stream_ != NULL);
-)
+#endif
 #define DEFAULT_INIT(type_name, member_name, init_expr, default_init_value)    \
   member_name = default_init_value;
-CACHED_CONSTANTS_LIST(DEFAULT_INIT)
+  CACHED_CONSTANTS_LIST(DEFAULT_INIT)
 #undef DEFAULT_INIT
 
-#define DEFAULT_INIT(name)                                                     \
-  name##_entry_point_ = 0;
-RUNTIME_ENTRY_LIST(DEFAULT_INIT)
+#define DEFAULT_INIT(name) name##_entry_point_ = 0;
+  RUNTIME_ENTRY_LIST(DEFAULT_INIT)
 #undef DEFAULT_INIT
 
-#define DEFAULT_INIT(returntype, name, ...)                                    \
-  name##_entry_point_ = 0;
-LEAF_RUNTIME_ENTRY_LIST(DEFAULT_INIT)
+#define DEFAULT_INIT(returntype, name, ...) name##_entry_point_ = 0;
+  LEAF_RUNTIME_ENTRY_LIST(DEFAULT_INIT)
 #undef DEFAULT_INIT
 
   // We cannot initialize the VM constants here for the vm isolate thread
@@ -138,73 +134,67 @@
 static const struct ALIGN16 {
   uint64_t a;
   uint64_t b;
-} double_negate_constant =
-    {0x8000000000000000LL, 0x8000000000000000LL};
+} double_negate_constant = {0x8000000000000000LL, 0x8000000000000000LL};
 
 static const struct ALIGN16 {
   uint64_t a;
   uint64_t b;
-} double_abs_constant =
-    {0x7FFFFFFFFFFFFFFFLL, 0x7FFFFFFFFFFFFFFFLL};
+} double_abs_constant = {0x7FFFFFFFFFFFFFFFLL, 0x7FFFFFFFFFFFFFFFLL};
 
 static const struct ALIGN16 {
   uint32_t a;
   uint32_t b;
   uint32_t c;
   uint32_t d;
-} float_not_constant =
-    { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
+} float_not_constant = {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF};
 
 static const struct ALIGN16 {
   uint32_t a;
   uint32_t b;
   uint32_t c;
   uint32_t d;
-} float_negate_constant =
-    { 0x80000000, 0x80000000, 0x80000000, 0x80000000 };
+} float_negate_constant = {0x80000000, 0x80000000, 0x80000000, 0x80000000};
 
 static const struct ALIGN16 {
   uint32_t a;
   uint32_t b;
   uint32_t c;
   uint32_t d;
-} float_absolute_constant =
-    { 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF };
+} float_absolute_constant = {0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF};
 
 static const struct ALIGN16 {
   uint32_t a;
   uint32_t b;
   uint32_t c;
   uint32_t d;
-} float_zerow_constant =
-    { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000 };
+} float_zerow_constant = {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000};
 
 
 void Thread::InitVMConstants() {
 #define ASSERT_VM_HEAP(type_name, member_name, init_expr, default_init_value)  \
   ASSERT((init_expr)->IsOldObject());
-CACHED_VM_OBJECTS_LIST(ASSERT_VM_HEAP)
+  CACHED_VM_OBJECTS_LIST(ASSERT_VM_HEAP)
 #undef ASSERT_VM_HEAP
 
 #define INIT_VALUE(type_name, member_name, init_expr, default_init_value)      \
   ASSERT(member_name == default_init_value);                                   \
   member_name = (init_expr);
-CACHED_CONSTANTS_LIST(INIT_VALUE)
+  CACHED_CONSTANTS_LIST(INIT_VALUE)
 #undef INIT_VALUE
 
 #define INIT_VALUE(name)                                                       \
   ASSERT(name##_entry_point_ == 0);                                            \
   name##_entry_point_ = k##name##RuntimeEntry.GetEntryPoint();
-RUNTIME_ENTRY_LIST(INIT_VALUE)
+  RUNTIME_ENTRY_LIST(INIT_VALUE)
 #undef INIT_VALUE
 
 #define INIT_VALUE(returntype, name, ...)                                      \
   ASSERT(name##_entry_point_ == 0);                                            \
   name##_entry_point_ = k##name##RuntimeEntry.GetEntryPoint();
-LEAF_RUNTIME_ENTRY_LIST(INIT_VALUE)
+  LEAF_RUNTIME_ENTRY_LIST(INIT_VALUE)
 #undef INIT_VALUE
 
-  // Setup the thread specific reusable handles.
+// Setup the thread specific reusable handles.
 #define REUSABLE_HANDLE_ALLOCATION(object)                                     \
   this->object##_handle_ = this->AllocateReusableHandle<object>();
   REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_ALLOCATION)
@@ -280,8 +270,8 @@
                                   bool bypass_safepoint) {
   ASSERT(kind != kMutatorTask);
   const bool kIsNotMutatorThread = false;
-  Thread* thread = isolate->ScheduleThread(kIsNotMutatorThread,
-                                           bypass_safepoint);
+  Thread* thread =
+      isolate->ScheduleThread(kIsNotMutatorThread, bypass_safepoint);
   if (thread != NULL) {
     ASSERT(thread->store_buffer_block_ == NULL);
     // TODO(koda): Use StoreBufferAcquire once we properly flush
@@ -326,14 +316,14 @@
 
 
 void Thread::SetStackLimitFromStackBase(uword stack_base) {
-  // Set stack limit.
+// Set stack limit.
 #if !defined(TARGET_ARCH_DBC)
 #if defined(USING_SIMULATOR)
   // Ignore passed-in native stack top and use Simulator stack top.
   Simulator* sim = Simulator::Current();  // May allocate a simulator.
   ASSERT(isolate()->simulator() == sim);  // Isolate's simulator is current one.
   stack_base = sim->StackTop();
-  // The overflow area is accounted for by the simulator.
+// The overflow area is accounted for by the simulator.
 #endif
   SetStackLimit(stack_base - OSThread::GetSpecifiedStackSize());
 #else
@@ -370,7 +360,7 @@
 #else
   uword (*func)() = NULL;
 #endif
-  // But for performance (and to support simulators), we normally use a local.
+// But for performance (and to support simulators), we normally use a local.
 #if defined(__has_feature)
 #if __has_feature(address_sanitizer)
   uword current_sp = func();
@@ -506,8 +496,10 @@
       // False result from HandleOOBMessages signals that the isolate should
       // be terminating.
       if (FLAG_trace_isolates) {
-        OS::Print("[!] Terminating isolate due to OOB message:\n"
-                  "\tisolate:    %s\n", isolate()->name());
+        OS::Print(
+            "[!] Terminating isolate due to OOB message:\n"
+            "\tisolate:    %s\n",
+            isolate()->name());
       }
       Thread* thread = Thread::Current();
       const Error& error = Error::Handle(thread->sticky_error());
@@ -578,18 +570,16 @@
 
 
 bool Thread::IsExecutingDartCode() const {
-  return (top_exit_frame_info() == 0) &&
-         (vm_tag() == VMTag::kDartTagId);
+  return (top_exit_frame_info() == 0) && (vm_tag() == VMTag::kDartTagId);
 }
 
 
 bool Thread::HasExitedDartCode() const {
-  return (top_exit_frame_info() != 0) &&
-         (vm_tag() != VMTag::kDartTagId);
+  return (top_exit_frame_info() != 0) && (vm_tag() != VMTag::kDartTagId);
 }
 
 
-template<class C>
+template <class C>
 C* Thread::AllocateReusableHandle() {
   C* handle = reinterpret_cast<C*>(reusable_handles_.AllocateScopedHandle());
   C::initializeHandle(handle, C::null());
@@ -598,8 +588,7 @@
 
 
 void Thread::ClearReusableHandles() {
-#define CLEAR_REUSABLE_HANDLE(object)                                          \
-  *object##_handle_ = object::null();
+#define CLEAR_REUSABLE_HANDLE(object) *object##_handle_ = object::null();
   REUSABLE_HANDLE_LIST(CLEAR_REUSABLE_HANDLE)
 #undef CLEAR_REUSABLE_HANDLE
 }
@@ -616,10 +605,8 @@
   // Visit objects in thread specific handles area.
   reusable_handles_.VisitObjectPointers(visitor);
 
-  visitor->VisitPointer(
-      reinterpret_cast<RawObject**>(&pending_functions_));
-  visitor->VisitPointer(
-      reinterpret_cast<RawObject**>(&sticky_error_));
+  visitor->VisitPointer(reinterpret_cast<RawObject**>(&pending_functions_));
+  visitor->VisitPointer(reinterpret_cast<RawObject**>(&sticky_error_));
 
   // Visit the api local scope as it has all the api local handles.
   ApiLocalScope* scope = api_top_scope_;
@@ -629,8 +616,7 @@
   }
 
   // Iterate over all the stack frames and visit objects on the stack.
-  StackFrameIterator frames_iterator(top_exit_frame_info(),
-                                     validate_frames);
+  StackFrameIterator frames_iterator(top_exit_frame_info(), validate_frames);
   StackFrame* frame = frames_iterator.NextFrame();
   while (frame != NULL) {
     frame->VisitObjectPointers(visitor);
@@ -642,7 +628,7 @@
 bool Thread::CanLoadFromThread(const Object& object) {
 #define CHECK_OBJECT(type_name, member_name, expr, default_init_value)         \
   if (object.raw() == expr) return true;
-CACHED_VM_OBJECTS_LIST(CHECK_OBJECT)
+  CACHED_VM_OBJECTS_LIST(CHECK_OBJECT)
 #undef CHECK_OBJECT
   return false;
 }
@@ -652,7 +638,7 @@
 #define COMPUTE_OFFSET(type_name, member_name, expr, default_init_value)       \
   ASSERT((expr)->IsVMHeapObject());                                            \
   if (object.raw() == expr) return Thread::member_name##offset();
-CACHED_VM_OBJECTS_LIST(COMPUTE_OFFSET)
+  CACHED_VM_OBJECTS_LIST(COMPUTE_OFFSET)
 #undef COMPUTE_OFFSET
   UNREACHABLE();
   return -1;
@@ -671,7 +657,7 @@
     *object = expr;                                                            \
     return true;                                                               \
   }
-CACHED_VM_OBJECTS_LIST(COMPUTE_OFFSET)
+  CACHED_VM_OBJECTS_LIST(COMPUTE_OFFSET)
 #undef COMPUTE_OFFSET
   return false;
 }
@@ -679,17 +665,17 @@
 
 intptr_t Thread::OffsetFromThread(const RuntimeEntry* runtime_entry) {
 #define COMPUTE_OFFSET(name)                                                   \
-  if (runtime_entry->function() == k##name##RuntimeEntry.function())         { \
+  if (runtime_entry->function() == k##name##RuntimeEntry.function()) {         \
     return Thread::name##_entry_point_offset();                                \
   }
-RUNTIME_ENTRY_LIST(COMPUTE_OFFSET)
+  RUNTIME_ENTRY_LIST(COMPUTE_OFFSET)
 #undef COMPUTE_OFFSET
 
 #define COMPUTE_OFFSET(returntype, name, ...)                                  \
-  if (runtime_entry->function() == k##name##RuntimeEntry.function())         { \
+  if (runtime_entry->function() == k##name##RuntimeEntry.function()) {         \
     return Thread::name##_entry_point_offset();                                \
   }
-LEAF_RUNTIME_ENTRY_LIST(COMPUTE_OFFSET)
+  LEAF_RUNTIME_ENTRY_LIST(COMPUTE_OFFSET)
 #undef COMPUTE_OFFSET
 
   UNREACHABLE();
@@ -735,8 +721,7 @@
   // Unwind all scopes using the same stack_marker, i.e. all scopes allocated
   // under the same top_exit_frame_info.
   ApiLocalScope* scope = api_top_scope_;
-  while (scope != NULL &&
-         scope->stack_marker() != 0 &&
+  while (scope != NULL && scope->stack_marker() != 0 &&
          scope->stack_marker() == stack_marker) {
     api_top_scope_ = scope->previous();
     delete scope;
diff --git a/runtime/vm/thread.h b/runtime/vm/thread.h
index 4e3741e..95d04b2 100644
--- a/runtime/vm/thread.h
+++ b/runtime/vm/thread.h
@@ -71,7 +71,7 @@
   V(Smi)                                                                       \
   V(String)                                                                    \
   V(TypeArguments)                                                             \
-  V(TypeParameter)                                                             \
+  V(TypeParameter)
 
 
 #if defined(TARGET_ARCH_DBC)
@@ -86,8 +86,8 @@
     StubCode::FixAllocationStubTarget_entry()->code(), NULL)                   \
   V(RawCode*, invoke_dart_code_stub_,                                          \
     StubCode::InvokeDartCode_entry()->code(), NULL)                            \
-  V(RawCode*, call_to_runtime_stub_,                                           \
-    StubCode::CallToRuntime_entry()->code(), NULL)                             \
+  V(RawCode*, call_to_runtime_stub_, StubCode::CallToRuntime_entry()->code(),  \
+    NULL)                                                                      \
   V(RawCode*, monomorphic_miss_stub_,                                          \
     StubCode::MonomorphicMiss_entry()->code(), NULL)                           \
   V(RawCode*, ic_lookup_through_code_stub_,                                    \
@@ -95,7 +95,7 @@
   V(RawCode*, lazy_deopt_from_return_stub_,                                    \
     StubCode::DeoptimizeLazyFromReturn_entry()->code(), NULL)                  \
   V(RawCode*, lazy_deopt_from_throw_stub_,                                     \
-    StubCode::DeoptimizeLazyFromThrow_entry()->code(), NULL)                   \
+    StubCode::DeoptimizeLazyFromThrow_entry()->code(), NULL)
 
 #endif
 
@@ -104,7 +104,7 @@
   V(RawObject*, object_null_, Object::null(), NULL)                            \
   V(RawBool*, bool_true_, Object::bool_true().raw(), NULL)                     \
   V(RawBool*, bool_false_, Object::bool_false().raw(), NULL)                   \
-  CACHED_VM_STUBS_LIST(V)                                                      \
+  CACHED_VM_STUBS_LIST(V)
 
 #if defined(TARGET_ARCH_DBC)
 #define CACHED_VM_STUBS_ADDRESSES_LIST(V)
@@ -117,7 +117,7 @@
   V(uword, megamorphic_call_checked_entry_,                                    \
     StubCode::MegamorphicCall_entry()->EntryPoint(), 0)                        \
   V(uword, monomorphic_miss_entry_,                                            \
-    StubCode::MonomorphicMiss_entry()->EntryPoint(), 0)                        \
+    StubCode::MonomorphicMiss_entry()->EntryPoint(), 0)
 
 #endif
 
@@ -125,24 +125,24 @@
   CACHED_VM_STUBS_ADDRESSES_LIST(V)                                            \
   V(uword, native_call_wrapper_entry_point_,                                   \
     NativeEntry::NativeCallWrapperEntry(), 0)                                  \
-  V(RawString**, predefined_symbols_address_,                                  \
-    Symbols::PredefinedAddress(), NULL)                                        \
+  V(RawString**, predefined_symbols_address_, Symbols::PredefinedAddress(),    \
+    NULL)                                                                      \
   V(uword, double_negate_address_,                                             \
     reinterpret_cast<uword>(&double_negate_constant), 0)                       \
-  V(uword, double_abs_address_,                                                \
-    reinterpret_cast<uword>(&double_abs_constant), 0)                          \
-  V(uword, float_not_address_,                                                 \
-    reinterpret_cast<uword>(&float_not_constant), 0)                           \
+  V(uword, double_abs_address_, reinterpret_cast<uword>(&double_abs_constant), \
+    0)                                                                         \
+  V(uword, float_not_address_, reinterpret_cast<uword>(&float_not_constant),   \
+    0)                                                                         \
   V(uword, float_negate_address_,                                              \
     reinterpret_cast<uword>(&float_negate_constant), 0)                        \
   V(uword, float_absolute_address_,                                            \
     reinterpret_cast<uword>(&float_absolute_constant), 0)                      \
   V(uword, float_zerow_address_,                                               \
-    reinterpret_cast<uword>(&float_zerow_constant), 0)                         \
+    reinterpret_cast<uword>(&float_zerow_constant), 0)
 
 #define CACHED_CONSTANTS_LIST(V)                                               \
   CACHED_VM_OBJECTS_LIST(V)                                                    \
-  CACHED_ADDRESSES_LIST(V)                                                     \
+  CACHED_ADDRESSES_LIST(V)
 
 // A VM thread; may be executing Dart code or performing helper tasks like
 // garbage collection or compilation. The Thread structure associated with
@@ -210,9 +210,7 @@
 
 #if defined(TARGET_ARCH_DBC)
   // Access to the current stack limit for DBC interpreter.
-  uword stack_limit() const {
-    return stack_limit_;
-  }
+  uword stack_limit() const { return stack_limit_; }
 #endif
 
   // Stack overflow flags
@@ -231,9 +229,7 @@
     return ++stack_overflow_count_;
   }
 
-  TaskKind task_kind() const {
-    return task_kind_;
-  }
+  TaskKind task_kind() const { return task_kind_; }
 
   // Retrieves and clears the stack overflow flags.  These are set by
   // the generated code before the slow path runtime routine for a
@@ -255,9 +251,7 @@
 
   // OSThread corresponding to this thread.
   OSThread* os_thread() const { return os_thread_; }
-  void set_os_thread(OSThread* os_thread) {
-    os_thread_ = os_thread;
-  }
+  void set_os_thread(OSThread* os_thread) { os_thread_ = os_thread; }
 
   // Monitor corresponding to this thread.
   Monitor* thread_lock() const { return thread_lock_; }
@@ -281,9 +275,7 @@
 
   // The isolate that this thread is operating on, or NULL if none.
   Isolate* isolate() const { return isolate_; }
-  static intptr_t isolate_offset() {
-    return OFFSET_OF(Thread, isolate_);
-  }
+  static intptr_t isolate_offset() { return OFFSET_OF(Thread, isolate_); }
   bool IsMutatorThread() const;
   bool CanCollectGarbage() const;
 
@@ -314,9 +306,7 @@
     type_range_cache_ = value;
   }
 
-  int32_t no_callback_scope_depth() const {
-    return no_callback_scope_depth_;
-  }
+  int32_t no_callback_scope_depth() const { return no_callback_scope_depth_; }
 
   void IncrementNoCallbackScopeDepth() {
     ASSERT(no_callback_scope_depth_ < INT_MAX);
@@ -340,9 +330,7 @@
     return OFFSET_OF(Thread, store_buffer_block_);
   }
 
-  uword top_exit_frame_info() const {
-    return top_exit_frame_info_;
-  }
+  uword top_exit_frame_info() const { return top_exit_frame_info_; }
   void set_top_exit_frame_info(uword top_exit_frame_info) {
     top_exit_frame_info_ = top_exit_frame_info;
   }
@@ -351,18 +339,14 @@
   }
 
   StackResource* top_resource() const { return top_resource_; }
-  void set_top_resource(StackResource* value) {
-    top_resource_ = value;
-  }
+  void set_top_resource(StackResource* value) { top_resource_ = value; }
   static intptr_t top_resource_offset() {
     return OFFSET_OF(Thread, top_resource_);
   }
 
   // Heap of the isolate that this thread is operating on.
   Heap* heap() const { return heap_; }
-  static intptr_t heap_offset() {
-    return OFFSET_OF(Thread, heap_);
-  }
+  static intptr_t heap_offset() { return OFFSET_OF(Thread, heap_); }
 
   int32_t no_handle_scope_depth() const {
 #if defined(DEBUG)
@@ -426,21 +410,21 @@
   static intptr_t member_name##offset() {                                      \
     return OFFSET_OF(Thread, member_name);                                     \
   }
-CACHED_CONSTANTS_LIST(DEFINE_OFFSET_METHOD)
+  CACHED_CONSTANTS_LIST(DEFINE_OFFSET_METHOD)
 #undef DEFINE_OFFSET_METHOD
 
 #define DEFINE_OFFSET_METHOD(name)                                             \
   static intptr_t name##_entry_point_offset() {                                \
     return OFFSET_OF(Thread, name##_entry_point_);                             \
   }
-RUNTIME_ENTRY_LIST(DEFINE_OFFSET_METHOD)
+  RUNTIME_ENTRY_LIST(DEFINE_OFFSET_METHOD)
 #undef DEFINE_OFFSET_METHOD
 
 #define DEFINE_OFFSET_METHOD(returntype, name, ...)                            \
   static intptr_t name##_entry_point_offset() {                                \
     return OFFSET_OF(Thread, name##_entry_point_);                             \
   }
-LEAF_RUNTIME_ENTRY_LIST(DEFINE_OFFSET_METHOD)
+  LEAF_RUNTIME_ENTRY_LIST(DEFINE_OFFSET_METHOD)
 #undef DEFINE_OFFSET_METHOD
 
   static bool CanLoadFromThread(const Object& object);
@@ -478,19 +462,11 @@
   }
 
   LongJumpScope* long_jump_base() const { return long_jump_base_; }
-  void set_long_jump_base(LongJumpScope* value) {
-    long_jump_base_ = value;
-  }
+  void set_long_jump_base(LongJumpScope* value) { long_jump_base_ = value; }
 
-  uword vm_tag() const {
-    return vm_tag_;
-  }
-  void set_vm_tag(uword tag) {
-    vm_tag_ = tag;
-  }
-  static intptr_t vm_tag_offset() {
-    return OFFSET_OF(Thread, vm_tag_);
-  }
+  uword vm_tag() const { return vm_tag_; }
+  void set_vm_tag(uword tag) { vm_tag_ = tag; }
+  static intptr_t vm_tag_offset() { return OFFSET_OF(Thread, vm_tag_); }
 
   RawGrowableObjectArray* pending_functions();
   void clear_pending_functions();
@@ -514,7 +490,9 @@
 
   bool IsAnyReusableHandleScopeActive() const {
 #define IS_REUSABLE_HANDLE_SCOPE_ACTIVE(object)                                \
-    if (reusable_##object##_handle_scope_active_) return true;
+  if (reusable_##object##_handle_scope_active_) {                              \
+    return true;                                                               \
+  }
     REUSABLE_HANDLE_LIST(IS_REUSABLE_HANDLE_SCOPE_ACTIVE)
     return false;
 #undef IS_REUSABLE_HANDLE_SCOPE_ACTIVE
@@ -524,9 +502,7 @@
   void ClearReusableHandles();
 
 #define REUSABLE_HANDLE(object)                                                \
-  object& object##Handle() const {                                             \
-    return *object##_handle_;                                                  \
-  }
+  object& object##Handle() const { return *object##_handle_; }
   REUSABLE_HANDLE_LIST(REUSABLE_HANDLE)
 #undef REUSABLE_HANDLE
 
@@ -577,9 +553,8 @@
     do {
       old_state = safepoint_state_;
       new_state = SafepointRequestedField::update(value, old_state);
-    } while (AtomicOperations::CompareAndSwapUint32(&safepoint_state_,
-                                                    old_state,
-                                                    new_state) != old_state);
+    } while (AtomicOperations::CompareAndSwapUint32(
+                 &safepoint_state_, old_state, new_state) != old_state);
     return old_state;
   }
   static bool IsBlockedForSafepoint(uint32_t state) {
@@ -656,7 +631,8 @@
   void InitVMConstants();
 
  private:
-  template<class T> T* AllocateReusableHandle();
+  template <class T>
+  T* AllocateReusableHandle();
 
   // Accessed from generated code:
   uword stack_limit_;
@@ -667,20 +643,18 @@
   StoreBufferBlock* store_buffer_block_;
   uword vm_tag_;
   TaskKind task_kind_;
-  // State that is cached in the TLS for fast access in generated code.
+// State that is cached in the TLS for fast access in generated code.
 #define DECLARE_MEMBERS(type_name, member_name, expr, default_init_value)      \
   type_name member_name;
-CACHED_CONSTANTS_LIST(DECLARE_MEMBERS)
+  CACHED_CONSTANTS_LIST(DECLARE_MEMBERS)
 #undef DECLARE_MEMBERS
 
-#define DECLARE_MEMBERS(name)      \
-  uword name##_entry_point_;
-RUNTIME_ENTRY_LIST(DECLARE_MEMBERS)
+#define DECLARE_MEMBERS(name) uword name##_entry_point_;
+  RUNTIME_ENTRY_LIST(DECLARE_MEMBERS)
 #undef DECLARE_MEMBERS
 
-#define DECLARE_MEMBERS(returntype, name, ...)      \
-  uword name##_entry_point_;
-LEAF_RUNTIME_ENTRY_LIST(DECLARE_MEMBERS)
+#define DECLARE_MEMBERS(returntype, name, ...) uword name##_entry_point_;
+  LEAF_RUNTIME_ENTRY_LIST(DECLARE_MEMBERS)
 #undef DECLARE_MEMBERS
 
   TimelineStream* dart_stream_;
@@ -714,9 +688,8 @@
 
   CompilerStats* compiler_stats_;
 
-  // Reusable handles support.
-#define REUSABLE_HANDLE_FIELDS(object)                                         \
-  object* object##_handle_;
+// Reusable handles support.
+#define REUSABLE_HANDLE_FIELDS(object) object* object##_handle_;
   REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_FIELDS)
 #undef REUSABLE_HANDLE_FIELDS
 
@@ -741,13 +714,9 @@
       StoreBuffer::ThresholdPolicy policy = StoreBuffer::kCheckThreshold);
   void StoreBufferAcquire();
 
-  void set_zone(Zone* zone) {
-    zone_ = zone;
-  }
+  void set_zone(Zone* zone) { zone_ = zone; }
 
-  void set_safepoint_state(uint32_t value) {
-    safepoint_state_ = value;
-  }
+  void set_safepoint_state(uint32_t value) { safepoint_state_ = value; }
   void EnterSafepointUsingLock();
   void ExitSafepointUsingLock();
   void BlockForSafepoint();
@@ -761,7 +730,7 @@
 
 #define REUSABLE_FRIEND_DECLARATION(name)                                      \
   friend class Reusable##name##HandleScope;
-REUSABLE_HANDLE_LIST(REUSABLE_FRIEND_DECLARATION)
+  REUSABLE_HANDLE_LIST(REUSABLE_FRIEND_DECLARATION)
 #undef REUSABLE_FRIEND_DECLARATION
 
   friend class ApiZone;
diff --git a/runtime/vm/thread_barrier.h b/runtime/vm/thread_barrier.h
index 458f28d..020fcf6 100644
--- a/runtime/vm/thread_barrier.h
+++ b/runtime/vm/thread_barrier.h
@@ -49,12 +49,12 @@
   explicit ThreadBarrier(intptr_t num_threads,
                          Monitor* monitor,
                          Monitor* done_monitor)
-    : num_threads_(num_threads),
-      monitor_(monitor),
-      remaining_(num_threads),
-      parity_(false),
-      done_monitor_(done_monitor),
-      done_(false) {
+      : num_threads_(num_threads),
+        monitor_(monitor),
+        remaining_(num_threads),
+        parity_(false),
+        done_monitor_(done_monitor),
+        done_(false) {
     ASSERT(remaining_ > 0);
   }
 
diff --git a/runtime/vm/thread_barrier_test.cc b/runtime/vm/thread_barrier_test.cc
index 7ca11c6..9fcdc1c 100644
--- a/runtime/vm/thread_barrier_test.cc
+++ b/runtime/vm/thread_barrier_test.cc
@@ -12,13 +12,8 @@
 
 class FuzzTask : public ThreadPool::Task {
  public:
-  FuzzTask(intptr_t num_rounds,
-           ThreadBarrier* barrier,
-           uint64_t seed)
-    : num_rounds_(num_rounds),
-      barrier_(barrier),
-      rng_(seed) {
-  }
+  FuzzTask(intptr_t num_rounds, ThreadBarrier* barrier, uint64_t seed)
+      : num_rounds_(num_rounds), barrier_(barrier), rng_(seed) {}
 
   virtual void Run() {
     for (intptr_t i = 0; i < num_rounds_; ++i) {
diff --git a/runtime/vm/thread_interrupter.cc b/runtime/vm/thread_interrupter.cc
index fa14d2e..0ad9ead 100644
--- a/runtime/vm/thread_interrupter.cc
+++ b/runtime/vm/thread_interrupter.cc
@@ -47,8 +47,7 @@
 // effect: if the thread is interrupted by a signal handler during a ThreadState
 // update the signal handler will immediately return.
 
-DEFINE_FLAG(bool, trace_thread_interrupter, false,
-            "Trace thread interrupter");
+DEFINE_FLAG(bool, trace_thread_interrupter, false, "Trace thread interrupter");
 
 bool ThreadInterrupter::initialized_ = false;
 bool ThreadInterrupter::shutdown_ = false;
diff --git a/runtime/vm/thread_interrupter_android.cc b/runtime/vm/thread_interrupter_android.cc
index 58f302f..30bd440 100644
--- a/runtime/vm/thread_interrupter_android.cc
+++ b/runtime/vm/thread_interrupter_android.cc
@@ -6,7 +6,7 @@
 #if defined(TARGET_OS_ANDROID)
 
 #include <sys/syscall.h>  // NOLINT
-#include <errno.h>  // NOLINT
+#include <errno.h>        // NOLINT
 
 #include "vm/flags.h"
 #include "vm/os.h"
@@ -23,7 +23,8 @@
 
 class ThreadInterrupterAndroid : public AllStatic {
  public:
-  static void ThreadInterruptSignalHandler(int signal, siginfo_t* info,
+  static void ThreadInterruptSignalHandler(int signal,
+                                           siginfo_t* info,
                                            void* context_) {
     if (signal != SIGPROF) {
       return;
diff --git a/runtime/vm/thread_interrupter_linux.cc b/runtime/vm/thread_interrupter_linux.cc
index 4eb07f4..167581e 100644
--- a/runtime/vm/thread_interrupter_linux.cc
+++ b/runtime/vm/thread_interrupter_linux.cc
@@ -20,7 +20,8 @@
 
 class ThreadInterrupterLinux : public AllStatic {
  public:
-  static void ThreadInterruptSignalHandler(int signal, siginfo_t* info,
+  static void ThreadInterruptSignalHandler(int signal,
+                                           siginfo_t* info,
                                            void* context_) {
     if (signal != SIGPROF) {
       return;
diff --git a/runtime/vm/thread_interrupter_macos.cc b/runtime/vm/thread_interrupter_macos.cc
index 222a294..fb9e145 100644
--- a/runtime/vm/thread_interrupter_macos.cc
+++ b/runtime/vm/thread_interrupter_macos.cc
@@ -22,7 +22,8 @@
 
 class ThreadInterrupterMacOS : public AllStatic {
  public:
-  static void ThreadInterruptSignalHandler(int signal, siginfo_t* info,
+  static void ThreadInterruptSignalHandler(int signal,
+                                           siginfo_t* info,
                                            void* context_) {
     if (signal != SIGPROF) {
       return;
diff --git a/runtime/vm/thread_interrupter_win.cc b/runtime/vm/thread_interrupter_win.cc
index 30d6d8b..bcbcc77 100644
--- a/runtime/vm/thread_interrupter_win.cc
+++ b/runtime/vm/thread_interrupter_win.cc
@@ -56,11 +56,9 @@
 
   static void Interrupt(OSThread* os_thread) {
     ASSERT(!OSThread::Compare(GetCurrentThreadId(), os_thread->id()));
-    HANDLE handle = OpenThread(THREAD_GET_CONTEXT |
-                               THREAD_QUERY_INFORMATION |
-                               THREAD_SUSPEND_RESUME,
-                               false,
-                               os_thread->id());
+    HANDLE handle = OpenThread(
+        THREAD_GET_CONTEXT | THREAD_QUERY_INFORMATION | THREAD_SUSPEND_RESUME,
+        false, os_thread->id());
     ASSERT(handle != NULL);
     DWORD result = SuspendThread(handle);
     if (result == kThreadError) {
diff --git a/runtime/vm/thread_pool.cc b/runtime/vm/thread_pool.cc
index 0c326d3..40ca9d5 100644
--- a/runtime/vm/thread_pool.cc
+++ b/runtime/vm/thread_pool.cc
@@ -10,20 +10,21 @@
 
 namespace dart {
 
-DEFINE_FLAG(int, worker_timeout_millis, 5000,
+DEFINE_FLAG(int,
+            worker_timeout_millis,
+            5000,
             "Free workers when they have been idle for this amount of time.");
 
 ThreadPool::ThreadPool()
-  : shutting_down_(false),
-    all_workers_(NULL),
-    idle_workers_(NULL),
-    count_started_(0),
-    count_stopped_(0),
-    count_running_(0),
-    count_idle_(0),
-    shutting_down_workers_(NULL),
-    join_list_(NULL) {
-}
+    : shutting_down_(false),
+      all_workers_(NULL),
+      idle_workers_(NULL),
+      count_started_(0),
+      count_stopped_(0),
+      count_running_(0),
+      count_idle_(0),
+      shutting_down_workers_(NULL),
+      join_list_(NULL) {}
 
 
 ThreadPool::~ThreadPool() {
@@ -146,8 +147,7 @@
 
 bool ThreadPool::IsIdle(Worker* worker) {
   ASSERT(worker != NULL && worker->owned_);
-  for (Worker* current = idle_workers_;
-       current != NULL;
+  for (Worker* current = idle_workers_; current != NULL;
        current = current->idle_next_) {
     if (current == worker) {
       return true;
@@ -170,8 +170,7 @@
     return true;
   }
 
-  for (Worker* current = idle_workers_;
-       current->idle_next_ != NULL;
+  for (Worker* current = idle_workers_; current->idle_next_ != NULL;
        current = current->idle_next_) {
     if (current->idle_next_ == worker) {
       current->idle_next_ = worker->idle_next_;
@@ -198,8 +197,7 @@
     return true;
   }
 
-  for (Worker* current = all_workers_;
-       current->all_next_ != NULL;
+  for (Worker* current = all_workers_; current->all_next_ != NULL;
        current = current->all_next_) {
     if (current->all_next_ == worker) {
       current->all_next_ = worker->all_next_;
@@ -298,8 +296,7 @@
   }
 
   for (Worker* current = shutting_down_workers_;
-       current->shutdown_next_ != NULL;
-       current = current->shutdown_next_) {
+       current->shutdown_next_ != NULL; current = current->shutdown_next_) {
     if (current->shutdown_next_ == worker) {
       current->shutdown_next_ = worker->shutdown_next_;
       worker->shutdown_next_ = NULL;
@@ -325,24 +322,21 @@
 }
 
 
-ThreadPool::Task::Task() {
-}
+ThreadPool::Task::Task() {}
 
 
-ThreadPool::Task::~Task() {
-}
+ThreadPool::Task::~Task() {}
 
 
 ThreadPool::Worker::Worker(ThreadPool* pool)
-  : pool_(pool),
-    task_(NULL),
-    id_(OSThread::kInvalidThreadId),
-    done_(false),
-    owned_(false),
-    all_next_(NULL),
-    idle_next_(NULL),
-    shutdown_next_(NULL) {
-}
+    : pool_(pool),
+      task_(NULL),
+      id_(OSThread::kInvalidThreadId),
+      done_(false),
+      owned_(false),
+      all_next_(NULL),
+      idle_next_(NULL),
+      shutdown_next_(NULL) {}
 
 
 ThreadId ThreadPool::Worker::id() {
@@ -354,13 +348,12 @@
 void ThreadPool::Worker::StartThread() {
 #if defined(DEBUG)
   // Must call SetTask before StartThread.
-  { // NOLINT
+  {  // NOLINT
     MonitorLocker ml(&monitor_);
     ASSERT(task_ != NULL);
   }
 #endif
-  int result = OSThread::Start("Dart ThreadPool Worker",
-                               &Worker::Main,
+  int result = OSThread::Start("Dart ThreadPool Worker", &Worker::Main,
                                reinterpret_cast<uword>(this));
   if (result != 0) {
     FATAL1("Could not start worker thread: result = %d.", result);
@@ -478,8 +471,8 @@
       JoinList::AddLocked(join_id, &pool->join_list_);
     }
 
-    // worker->id_ should never be read again, so set to invalid in debug mode
-    // for asserts.
+// worker->id_ should never be read again, so set to invalid in debug mode
+// for asserts.
 #if defined(DEBUG)
     {
       MonitorLocker ml(&worker->monitor_);
diff --git a/runtime/vm/thread_pool.h b/runtime/vm/thread_pool.h
index d9a4634..6fbe0d7 100644
--- a/runtime/vm/thread_pool.h
+++ b/runtime/vm/thread_pool.h
@@ -93,8 +93,7 @@
 
   class JoinList {
    public:
-    explicit JoinList(ThreadJoinId id, JoinList* next) : id_(id), next_(next) {
-    }
+    explicit JoinList(ThreadJoinId id, JoinList* next) : id_(id), next_(next) {}
 
     // The thread pool's mutex_ must be held when calling this.
     static void AddLocked(ThreadJoinId id, JoinList** list);
diff --git a/runtime/vm/thread_pool_test.cc b/runtime/vm/thread_pool_test.cc
index a555503..23d6140 100644
--- a/runtime/vm/thread_pool_test.cc
+++ b/runtime/vm/thread_pool_test.cc
@@ -19,9 +19,7 @@
 
 class TestTask : public ThreadPool::Task {
  public:
-  TestTask(Monitor* sync, bool* done)
-      : sync_(sync), done_(done) {
-  }
+  TestTask(Monitor* sync, bool* done) : sync_(sync), done_(done) {}
 
   // Before running the task, *done_ should be true. This lets the caller
   // ASSERT things knowing that the thread is still around. To unblock the
@@ -94,8 +92,7 @@
       : sync_(sync),
         started_count_(started_count),
         slept_count_(slept_count),
-        millis_(millis) {
-  }
+        millis_(millis) {}
 
   virtual void Run() {
     {
@@ -200,8 +197,7 @@
 class SpawnTask : public ThreadPool::Task {
  public:
   SpawnTask(ThreadPool* pool, Monitor* sync, int todo, int total, int* done)
-      : pool_(pool), sync_(sync), todo_(todo), total_(total), done_(done) {
-  }
+      : pool_(pool), sync_(sync), todo_(todo), total_(total), done_(done) {}
 
   virtual void Run() {
     todo_--;  // Subtract one for current task.
@@ -209,8 +205,8 @@
 
     // Spawn 0-2 children.
     if (todo_ > 0) {
-      pool_->Run(new SpawnTask(
-          pool_, sync_, todo_ - child_todo, total_, done_));
+      pool_->Run(
+          new SpawnTask(pool_, sync_, todo_ - child_todo, total_, done_));
     }
     if (todo_ > 1) {
       pool_->Run(new SpawnTask(pool_, sync_, child_todo, total_, done_));
diff --git a/runtime/vm/thread_registry.h b/runtime/vm/thread_registry.h
index 4965e75..eb2d327 100644
--- a/runtime/vm/thread_registry.h
+++ b/runtime/vm/thread_registry.h
@@ -43,7 +43,7 @@
   // we need to iterate over threads (both active and free) in an isolate.
   Monitor* threads_lock_;
   Thread* active_list_;  // List of active threads in the isolate.
-  Thread* free_list_;  // Free list of Thread objects that can be reused.
+  Thread* free_list_;    // Free list of Thread objects that can be reused.
 
   // TODO(asiva): Currently we treat a mutator thread as a special thread
   // and always schedule execution of Dart code on the same mutator thread
diff --git a/runtime/vm/thread_test.cc b/runtime/vm/thread_test.cc
index dc2edac..2dcf568 100644
--- a/runtime/vm/thread_test.cc
+++ b/runtime/vm/thread_test.cc
@@ -15,8 +15,8 @@
 
 UNIT_TEST_CASE(Mutex) {
   // This unit test case needs a running isolate.
-  Dart_CreateIsolate(
-      NULL, NULL, bin::isolate_snapshot_buffer, NULL, NULL, NULL);
+  Dart_CreateIsolate(NULL, NULL, bin::isolate_snapshot_buffer, NULL, NULL,
+                     NULL);
 
   Mutex* mutex = new Mutex();
   mutex->Lock();
@@ -37,8 +37,8 @@
 
 UNIT_TEST_CASE(Monitor) {
   // This unit test case needs a running isolate.
-  Dart_CreateIsolate(
-      NULL, NULL, bin::isolate_snapshot_buffer, NULL, NULL, NULL);
+  Dart_CreateIsolate(NULL, NULL, bin::isolate_snapshot_buffer, NULL, NULL,
+                     NULL);
   OSThread* thread = OSThread::Current();
   // Thread interrupter interferes with this test, disable interrupts.
   thread->DisableThreadInterrupts();
@@ -63,7 +63,7 @@
     // Check whether this attempt falls within the exptected time limits.
     int64_t wakeup_time = stop - start;
     OS::Print("wakeup_time: %" Pd64 "\n", wakeup_time);
-    const int kAcceptableTimeJitter = 20;  // Measured in milliseconds.
+    const int kAcceptableTimeJitter = 20;    // Measured in milliseconds.
     const int kAcceptableWakeupDelay = 150;  // Measured in milliseconds.
     if (((wait_time - kAcceptableTimeJitter) <= wakeup_time) &&
         (wakeup_time <= (wait_time + kAcceptableWakeupDelay))) {
@@ -85,7 +85,7 @@
 class ObjectCounter : public ObjectPointerVisitor {
  public:
   explicit ObjectCounter(Isolate* isolate, const Object* obj)
-      : ObjectPointerVisitor(isolate), obj_(obj), count_(0) { }
+      : ObjectPointerVisitor(isolate), obj_(obj), count_(0) {}
 
   virtual void VisitPointers(RawObject** first, RawObject** last) {
     for (RawObject** current = first; current <= last; ++current) {
@@ -119,7 +119,7 @@
       HANDLESCOPE(thread);
       Zone* zone = thread->zone();
       EXPECT_EQ(zone, stack_zone.GetZone());
-      ZoneGrowableArray<bool>* a0 = new(zone) ZoneGrowableArray<bool>(zone, 1);
+      ZoneGrowableArray<bool>* a0 = new (zone) ZoneGrowableArray<bool>(zone, 1);
       GrowableArray<bool> a1(zone, 1);
       for (intptr_t i = 0; i < 100000; ++i) {
         a0->Add(true);
@@ -135,9 +135,8 @@
       {
         ObjectCounter counter(isolate_, &smi);
         // Ensure that our particular zone is visited.
-        isolate_->IterateObjectPointers(
-            &counter,
-            StackFrameIterator::kValidateFrames);
+        isolate_->IterateObjectPointers(&counter,
+                                        StackFrameIterator::kValidateFrames);
         EXPECT_EQ(1, counter.count());
       }
       char* unique_chars = zone->PrintToString("unique_str_%" Pd, id_);
@@ -152,9 +151,8 @@
       {
         ObjectCounter str_counter(isolate_, &unique_str);
         // Ensure that our particular zone is visited.
-        isolate_->IterateObjectPointers(
-            &str_counter,
-            StackFrameIterator::kValidateFrames);
+        isolate_->IterateObjectPointers(&str_counter,
+                                        StackFrameIterator::kValidateFrames);
         // We should visit the string object exactly once.
         EXPECT_EQ(1, str_counter.count());
       }
@@ -213,14 +211,14 @@
   char* orig_str = orig_zone->PrintToString("foo");
   Dart_ExitIsolate();
   // Create and enter a new isolate.
-  Dart_CreateIsolate(
-      NULL, NULL, bin::isolate_snapshot_buffer, NULL, NULL, NULL);
+  Dart_CreateIsolate(NULL, NULL, bin::isolate_snapshot_buffer, NULL, NULL,
+                     NULL);
   Zone* zone0 = Thread::Current()->zone();
   EXPECT(zone0 != orig_zone);
   Dart_ShutdownIsolate();
   // Create and enter yet another isolate.
-  Dart_CreateIsolate(
-      NULL, NULL, bin::isolate_snapshot_buffer, NULL, NULL, NULL);
+  Dart_CreateIsolate(NULL, NULL, bin::isolate_snapshot_buffer, NULL, NULL,
+                     NULL);
   {
     // Create a stack resource this time, and exercise it.
     StackZone stack_zone(Thread::Current());
@@ -251,12 +249,12 @@
                     intptr_t* expected_count,
                     intptr_t* total_done,
                     intptr_t* exited)
-    : isolate_(isolate),
-      monitor_(monitor),
-      expected_count_(expected_count),
-      total_done_(total_done),
-      exited_(exited),
-      local_done_(false) {}
+      : isolate_(isolate),
+        monitor_(monitor),
+        expected_count_(expected_count),
+        total_done_(total_done),
+        exited_(exited),
+        local_done_(false) {}
 
   virtual void Run() {
     Thread::EnterIsolateAsHelper(isolate_, Thread::kUnknownTask);
@@ -265,7 +263,7 @@
       ++*expected_count_;
     }
     Thread* thread = Thread::Current();
-    for (int i = reinterpret_cast<intptr_t>(thread); ; ++i) {
+    for (int i = reinterpret_cast<intptr_t>(thread);; ++i) {
       StackZone stack_zone(thread);
       Zone* zone = thread->zone();
       HANDLESCOPE(thread);
@@ -278,9 +276,8 @@
         // But occasionally, organize a rendezvous.
         SafepointOperationScope safepoint_scope(thread);
         ObjectCounter counter(isolate_, &smi);
-        isolate_->IterateObjectPointers(
-            &counter,
-            StackFrameIterator::kValidateFrames);
+        isolate_->IterateObjectPointers(&counter,
+                                        StackFrameIterator::kValidateFrames);
         {
           MonitorLocker ml(monitor_);
           EXPECT_EQ(*expected_count_, counter.count());
@@ -345,10 +342,10 @@
     Dart::thread_pool()->Run(new SafepointTestTask(
         isolate, &monitor, &expected_count, &total_done, &exited));
   }
-  // Run Dart code on the main thread long enough to allow all helpers
-  // to get their verification done and exit. Use a specific UserTag
-  // to enable the helpers to verify that the main thread is
-  // successfully interrupted in the pure Dart loop.
+// Run Dart code on the main thread long enough to allow all helpers
+// to get their verification done and exit. Use a specific UserTag
+// to enable the helpers to verify that the main thread is
+// successfully interrupted in the pure Dart loop.
 #if defined(USING_SIMULATOR)
   const intptr_t kLoopCount = 12345678;
 #else
@@ -356,14 +353,16 @@
 #endif  // USING_SIMULATOR
   char buffer[1024];
   OS::SNPrint(buffer, sizeof(buffer),
-      "import 'dart:developer';\n"
-      "int dummy = 0;\n"
-      "main() {\n"
-      "  new UserTag('foo').makeCurrent();\n"
-      "  for (dummy = 0; dummy < %" Pd "; ++dummy) {\n"
-      "    dummy += (dummy & 1);\n"
-      "  }\n"
-      "}\n", kLoopCount);
+              "import 'dart:developer';\n"
+              "int dummy = 0;\n"
+              "main() {\n"
+              "  new UserTag('foo').makeCurrent();\n"
+              "  for (dummy = 0; dummy < %" Pd
+              "; ++dummy) {\n"
+              "    dummy += (dummy & 1);\n"
+              "  }\n"
+              "}\n",
+              kLoopCount);
   Dart_Handle lib = TestCase::LoadTestScript(buffer, NULL);
   EXPECT_VALID(lib);
   Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
@@ -491,8 +490,7 @@
     MonitorLocker ml(params.monitor);
     EXPECT(params.spawned_thread_id == OSThread::kInvalidThreadId);
     // Spawn thread and wait to receive the thread id.
-    OSThread::Start("ThreadIteratorTest",
-                    ThreadIteratorTestMain,
+    OSThread::Start("ThreadIteratorTest", ThreadIteratorTestMain,
                     reinterpret_cast<uword>(&params));
     while (params.spawned_thread_id == OSThread::kInvalidThreadId) {
       ml.Wait();
@@ -586,13 +584,8 @@
 
 class AllocAndGCTask : public ThreadPool::Task {
  public:
-  AllocAndGCTask(Isolate* isolate,
-                 Monitor* done_monitor,
-                 bool* done)
-    : isolate_(isolate),
-      done_monitor_(done_monitor),
-      done_(done) {
-  }
+  AllocAndGCTask(Isolate* isolate, Monitor* done_monitor, bool* done)
+      : isolate_(isolate), done_monitor_(done_monitor), done_(done) {}
 
   virtual void Run() {
     Thread::EnterIsolateAsHelper(isolate_, Thread::kUnknownTask);
diff --git a/runtime/vm/timeline.cc b/runtime/vm/timeline.cc
index 2627ac9..f0b0ee1 100644
--- a/runtime/vm/timeline.cc
+++ b/runtime/vm/timeline.cc
@@ -23,20 +23,29 @@
 DEFINE_FLAG(bool, complete_timeline, false, "Record the complete timeline");
 DEFINE_FLAG(bool, startup_timeline, false, "Record the startup timeline");
 DEFINE_FLAG(bool, systrace_timeline, false, "Record the timeline to systrace");
-DEFINE_FLAG(bool, trace_timeline, false,
-            "Trace timeline backend");
-DEFINE_FLAG(bool, trace_timeline_analysis, false,
+DEFINE_FLAG(bool, trace_timeline, false, "Trace timeline backend");
+DEFINE_FLAG(bool,
+            trace_timeline_analysis,
+            false,
             "Trace timeline analysis backend");
-DEFINE_FLAG(bool, timing, false,
+DEFINE_FLAG(bool,
+            timing,
+            false,
             "Dump isolate timing information from timeline.");
-DEFINE_FLAG(charp, timeline_dir, NULL,
+DEFINE_FLAG(charp,
+            timeline_dir,
+            NULL,
             "Enable all timeline trace streams and output VM global trace "
             "into specified directory.");
-DEFINE_FLAG(charp, timeline_streams, NULL,
+DEFINE_FLAG(charp,
+            timeline_streams,
+            NULL,
             "Comma separated list of timeline streams to record. "
             "Valid values: all, API, Compiler, Dart, Debugger, Embedder, "
             "GC, Isolate, and VM.");
-DEFINE_FLAG(charp, timeline_recorder, "ring",
+DEFINE_FLAG(charp,
+            timeline_recorder,
+            "ring",
             "Select the timeline recorder used. "
             "Valid values: ring, endless, startup, and systrace.")
 
@@ -164,8 +173,8 @@
 
 // Returns true if |streams| contains |stream| or "all". Not case sensitive.
 static bool HasStream(MallocGrowableArray<char*>* streams, const char* stream) {
-  if ((FLAG_timeline_dir != NULL) ||
-      FLAG_timing || FLAG_complete_timeline || FLAG_startup_timeline) {
+  if ((FLAG_timeline_dir != NULL) || FLAG_timing || FLAG_complete_timeline ||
+      FLAG_startup_timeline) {
     return true;
   }
   for (intptr_t i = 0; i < streams->length(); i++) {
@@ -184,10 +193,9 @@
   recorder_ = CreateTimelineRecorder();
   ASSERT(recorder_ != NULL);
   enabled_streams_ = GetEnabledByDefaultTimelineStreams();
-  // Global overrides.
+// Global overrides.
 #define TIMELINE_STREAM_FLAG_DEFAULT(name, not_used)                           \
-  stream_##name##_.Init(#name,                                                 \
-                        HasStream(enabled_streams_, #name));
+  stream_##name##_.Init(#name, HasStream(enabled_streams_, #name));
   TIMELINE_STREAM_LIST(TIMELINE_STREAM_FLAG_DEFAULT)
 #undef TIMELINE_STREAM_FLAG_DEFAULT
 
@@ -226,7 +234,7 @@
     recorder_->WriteTo(FLAG_timeline_dir);
   }
 
-  // Disable global streams.
+// Disable global streams.
 #define TIMELINE_STREAM_DISABLE(name, not_used)                                \
   Timeline::stream_##name##_.set_enabled(false);
   TIMELINE_STREAM_LIST(TIMELINE_STREAM_DISABLE)
@@ -278,18 +286,17 @@
   }
   {
     JSONArray availableStreams(&obj, "availableStreams");
-#define ADD_STREAM_NAME(name, not_used)                                        \
-    availableStreams.AddValue(#name);
-TIMELINE_STREAM_LIST(ADD_STREAM_NAME);
+#define ADD_STREAM_NAME(name, not_used) availableStreams.AddValue(#name);
+    TIMELINE_STREAM_LIST(ADD_STREAM_NAME);
 #undef ADD_STREAM_NAME
   }
   {
     JSONArray recordedStreams(&obj, "recordedStreams");
 #define ADD_RECORDED_STREAM_NAME(name, not_used)                               \
-    if (stream_##name##_.enabled()) {                                          \
-      recordedStreams.AddValue(#name);                                         \
-    }
-TIMELINE_STREAM_LIST(ADD_RECORDED_STREAM_NAME);
+  if (stream_##name##_.enabled()) {                                            \
+    recordedStreams.AddValue(#name);                                           \
+  }
+    TIMELINE_STREAM_LIST(ADD_RECORDED_STREAM_NAME);
 #undef ADD_RECORDED_STREAM_NAME
   }
 }
@@ -312,7 +319,7 @@
 
 #define TIMELINE_STREAM_DEFINE(name, enabled_by_default)                       \
   TimelineStream Timeline::stream_##name##_;
-  TIMELINE_STREAM_LIST(TIMELINE_STREAM_DEFINE)
+TIMELINE_STREAM_LIST(TIMELINE_STREAM_DEFINE)
 #undef TIMELINE_STREAM_DEFINE
 
 TimelineEvent::TimelineEvent()
@@ -326,8 +333,7 @@
       label_(NULL),
       category_(""),
       thread_(OSThread::kInvalidThreadId),
-      isolate_id_(ILLEGAL_PORT) {
-}
+      isolate_id_(ILLEGAL_PORT) {}
 
 
 TimelineEvent::~TimelineEvent() {
@@ -390,16 +396,14 @@
 }
 
 
-void TimelineEvent::DurationEnd(int64_t micros,
-                                int64_t thread_micros) {
+void TimelineEvent::DurationEnd(int64_t micros, int64_t thread_micros) {
   ASSERT(timestamp1_ == 0);
   set_timestamp1(micros);
   set_thread_timestamp1(thread_micros);
 }
 
 
-void TimelineEvent::Instant(const char* label,
-                            int64_t micros) {
+void TimelineEvent::Instant(const char* label, int64_t micros) {
   Init(kInstant, label);
   set_timestamp0(micros);
 }
@@ -477,8 +481,10 @@
 }
 
 
-void TimelineEvent::FormatArgument(intptr_t i, const char* name,
-                                   const char* fmt, ...) {
+void TimelineEvent::FormatArgument(intptr_t i,
+                                   const char* name,
+                                   const char* fmt,
+                                   ...) {
   ASSERT(i >= 0);
   ASSERT(i < arguments_length_);
   va_list args;
@@ -519,25 +525,20 @@
   switch (event_type()) {
     case kBegin: {
       length = OS::SNPrint(buffer, buffer_size, "B|%" Pd64 "|%s", pid, label());
-    }
-    break;
+    } break;
     case kEnd: {
       length = OS::SNPrint(buffer, buffer_size, "E");
-    }
-    break;
+    } break;
     case kCounter: {
       if (arguments_length_ > 0) {
         // We only report the first counter value.
-        length = OS::SNPrint(buffer, buffer_size,
-                             "C|%" Pd64 "|%s|%s",
-                             pid,
-                             label(),
-                             arguments_[0].value);
+        length = OS::SNPrint(buffer, buffer_size, "C|%" Pd64 "|%s|%s", pid,
+                             label(), arguments_[0].value);
       }
     }
     default:
       // Ignore event types that we cannot serialize to the Systrace format.
-    break;
+      break;
   }
   return length;
 }
@@ -573,8 +574,7 @@
 }
 
 
-void TimelineEvent::Init(EventType event_type,
-                         const char* label) {
+void TimelineEvent::Init(EventType event_type, const char* label) {
   ASSERT(label != NULL);
   state_ = 0;
   timestamp0_ = 0;
@@ -600,8 +600,7 @@
 
 bool TimelineEvent::Within(int64_t time_origin_micros,
                            int64_t time_extent_micros) {
-  if ((time_origin_micros == -1) ||
-      (time_extent_micros == -1)) {
+  if ((time_origin_micros == -1) || (time_extent_micros == -1)) {
     // No time range specified.
     return true;
   }
@@ -653,48 +652,39 @@
   switch (event_type()) {
     case kBegin: {
       obj.AddProperty("ph", "B");
-    }
-    break;
+    } break;
     case kEnd: {
       obj.AddProperty("ph", "E");
-    }
-    break;
+    } break;
     case kDuration: {
       obj.AddProperty("ph", "X");
       obj.AddPropertyTimeMicros("dur", TimeDuration());
       if (HasThreadCPUTime()) {
         obj.AddPropertyTimeMicros("tdur", ThreadCPUTimeDuration());
       }
-    }
-    break;
+    } break;
     case kInstant: {
       obj.AddProperty("ph", "i");
       obj.AddProperty("s", "p");
-    }
-    break;
+    } break;
     case kAsyncBegin: {
       obj.AddProperty("ph", "b");
       obj.AddPropertyF("id", "%" Px64 "", AsyncId());
-    }
-    break;
+    } break;
     case kAsyncInstant: {
       obj.AddProperty("ph", "n");
       obj.AddPropertyF("id", "%" Px64 "", AsyncId());
-    }
-    break;
+    } break;
     case kAsyncEnd: {
       obj.AddProperty("ph", "e");
       obj.AddPropertyF("id", "%" Px64 "", AsyncId());
-    }
-    break;
+    } break;
     case kMetadata: {
       obj.AddProperty("ph", "M");
-    }
-    break;
+    } break;
     case kCounter: {
       obj.AddProperty("ph", "C");
-    }
-    break;
+    } break;
     default:
       UNIMPLEMENTED();
   }
@@ -751,7 +741,6 @@
 }
 
 
-
 int64_t TimelineEvent::ThreadCPUTimeOrigin() const {
   ASSERT(HasThreadCPUTime());
   return thread_timestamp0_;
@@ -768,14 +757,10 @@
 }
 
 
-TimelineStream::TimelineStream()
-    : name_(NULL),
-      enabled_(false) {
-}
+TimelineStream::TimelineStream() : name_(NULL), enabled_(false) {}
 
 
-void TimelineStream::Init(const char* name,
-                          bool enabled) {
+void TimelineStream::Init(const char* name, bool enabled) {
   name_ = name;
   enabled_ = enabled;
 }
@@ -879,7 +864,8 @@
 
 void TimelineEventScope::FormatArgument(intptr_t i,
                                         const char* name,
-                                        const char* fmt, ...) {
+                                        const char* fmt,
+                                        ...) {
   if (!enabled()) {
     return;
   }
@@ -958,11 +944,8 @@
   }
   ASSERT(event != NULL);
   // Emit a duration event.
-  event->Duration(label(),
-                  timestamp_,
-                  OS::GetCurrentMonotonicMicros(),
-                  thread_timestamp_,
-                  OS::GetCurrentThreadCPUMicros());
+  event->Duration(label(), timestamp_, OS::GetCurrentMonotonicMicros(),
+                  thread_timestamp_, OS::GetCurrentThreadCPUMicros());
   StealArguments(event);
   event->Complete();
 }
@@ -1047,25 +1030,19 @@
 }
 
 
-TimelineEventFilter::~TimelineEventFilter() {
-}
+TimelineEventFilter::~TimelineEventFilter() {}
 
 
 IsolateTimelineEventFilter::IsolateTimelineEventFilter(
     Dart_Port isolate_id,
     int64_t time_origin_micros,
     int64_t time_extent_micros)
-    : TimelineEventFilter(time_origin_micros,
-                          time_extent_micros),
-      isolate_id_(isolate_id) {
-}
+    : TimelineEventFilter(time_origin_micros, time_extent_micros),
+      isolate_id_(isolate_id) {}
 
 
 TimelineEventRecorder::TimelineEventRecorder()
-    : async_id_(0),
-      time_low_micros_(0),
-      time_high_micros_(0) {
-}
+    : async_id_(0), time_low_micros_(0), time_high_micros_(0) {}
 
 
 void TimelineEventRecorder::PrintJSONMeta(JSONArray* events) const {
@@ -1133,7 +1110,7 @@
     TimelineEvent* event = thread_block->StartEvent();
     return event;
   }
-  // Drop lock here as no event is being handed out.
+// Drop lock here as no event is being handed out.
 #if defined(DEBUG)
   if (T != NULL) {
     T->DecrementNoSafepointScopeDepth();
@@ -1210,8 +1187,8 @@
   Timeline::ReclaimCachedBlocksFromThreads();
 
   intptr_t pid = OS::ProcessId();
-  char* filename = OS::SCreate(NULL,
-      "%s/dart-timeline-%" Pd ".json", directory, pid);
+  char* filename =
+      OS::SCreate(NULL, "%s/dart-timeline-%" Pd ".json", directory, pid);
   void* file = (*file_open)(filename, true);
   if (file == NULL) {
     OS::Print("Failed to write timeline file: %s\n", filename);
@@ -1238,8 +1215,8 @@
 
 int64_t TimelineEventRecorder::GetNextAsyncId() {
   // TODO(johnmccutchan): Gracefully handle wrap around.
-  uint32_t next = static_cast<uint32_t>(
-      AtomicOperations::FetchAndIncrement(&async_id_));
+  uint32_t next =
+      static_cast<uint32_t>(AtomicOperations::FetchAndIncrement(&async_id_));
   return static_cast<int64_t>(next);
 }
 
@@ -1261,17 +1238,13 @@
 
 TimelineEventFixedBufferRecorder::TimelineEventFixedBufferRecorder(
     intptr_t capacity)
-    : blocks_(NULL),
-      capacity_(capacity),
-      num_blocks_(0),
-      block_cursor_(0) {
+    : blocks_(NULL), capacity_(capacity), num_blocks_(0), block_cursor_(0) {
   // Capacity must be a multiple of TimelineEventBlock::kBlockSize
   ASSERT((capacity % TimelineEventBlock::kBlockSize) == 0);
   // Allocate blocks array.
   num_blocks_ = capacity / TimelineEventBlock::kBlockSize;
-  blocks_ =
-      reinterpret_cast<TimelineEventBlock**>(
-          calloc(num_blocks_, sizeof(TimelineEventBlock*)));
+  blocks_ = reinterpret_cast<TimelineEventBlock**>(
+      calloc(num_blocks_, sizeof(TimelineEventBlock*)));
   // Allocate each block.
   for (intptr_t i = 0; i < num_blocks_; i++) {
     blocks_[i] = new TimelineEventBlock(i);
@@ -1401,8 +1374,7 @@
 
 
 TimelineEventSystraceRecorder::TimelineEventSystraceRecorder(intptr_t capacity)
-    : TimelineEventFixedBufferRecorder(capacity),
-      systrace_fd_(-1) {
+    : TimelineEventFixedBufferRecorder(capacity), systrace_fd_(-1) {
 #if defined(TARGET_OS_ANDROID) || defined(TARGET_OS_LINUX)
   const char* kSystracePath = "/sys/kernel/debug/tracing/trace_marker";
   systrace_fd_ = open(kSystracePath, O_WRONLY);
@@ -1411,8 +1383,9 @@
                  kSystracePath);
   }
 #else
-  OS::PrintErr("Warning: The systrace timeline recorder is equivalent to the"
-               "ring recorder on this platform.");
+  OS::PrintErr(
+      "Warning: The systrace timeline recorder is equivalent to the"
+      "ring recorder on this platform.");
 #endif
 }
 
@@ -1487,16 +1460,14 @@
 }
 
 
-TimelineEventCallbackRecorder::TimelineEventCallbackRecorder() {
-}
+TimelineEventCallbackRecorder::TimelineEventCallbackRecorder() {}
 
 
-TimelineEventCallbackRecorder::~TimelineEventCallbackRecorder() {
-}
+TimelineEventCallbackRecorder::~TimelineEventCallbackRecorder() {}
 
 
 void TimelineEventCallbackRecorder::PrintJSON(JSONStream* js,
-                                               TimelineEventFilter* filter) {
+                                              TimelineEventFilter* filter) {
   if (!FLAG_support_service) {
     return;
   }
@@ -1532,9 +1503,7 @@
 
 
 TimelineEventEndlessRecorder::TimelineEventEndlessRecorder()
-    : head_(NULL),
-      block_index_(0) {
-}
+    : head_(NULL), block_index_(0) {}
 
 
 void TimelineEventEndlessRecorder::PrintJSON(JSONStream* js,
@@ -1662,8 +1631,7 @@
       length_(0),
       block_index_(block_index),
       thread_id_(OSThread::kInvalidThreadId),
-      in_use_(false) {
-}
+      in_use_(false) {}
 
 
 TimelineEventBlock::~TimelineEventBlock() {
@@ -1760,8 +1728,7 @@
 
 TimelineEventBlockIterator::TimelineEventBlockIterator(
     TimelineEventRecorder* recorder)
-    : current_(NULL),
-      recorder_(NULL) {
+    : current_(NULL), recorder_(NULL) {
   Reset(recorder);
 }
 
diff --git a/runtime/vm/timeline.h b/runtime/vm/timeline.h
index 64d11a0..cc93040 100644
--- a/runtime/vm/timeline.h
+++ b/runtime/vm/timeline.h
@@ -44,20 +44,13 @@
  public:
   TimelineStream();
 
-  void Init(const char* name,
-            bool enabled);
+  void Init(const char* name, bool enabled);
 
-  const char* name() const {
-    return name_;
-  }
+  const char* name() const { return name_; }
 
-  bool enabled() const {
-    return enabled_ != 0;
-  }
+  bool enabled() const { return enabled_ != 0; }
 
-  void set_enabled(bool enabled) {
-    enabled_ = enabled ? 1 : 0;
-  }
+  void set_enabled(bool enabled) { enabled_ = enabled ? 1 : 0; }
 
   // Records an event. Will return |NULL| if not enabled. The returned
   // |TimelineEvent| is in an undefined state and must be initialized.
@@ -230,18 +223,15 @@
   // |name| must be a compile time constant. Copies |argument|.
   void CopyArgument(intptr_t i, const char* name, const char* argument);
   // |name| must be a compile time constant.
-  void FormatArgument(intptr_t i,
-                      const char* name,
-                      const char* fmt, ...) PRINTF_ATTRIBUTE(4, 5);
+  void FormatArgument(intptr_t i, const char* name, const char* fmt, ...)
+      PRINTF_ATTRIBUTE(4, 5);
 
   void StealArguments(intptr_t arguments_length,
                       TimelineEventArgument* arguments);
   // Mandatory to call when this event is completely filled out.
   void Complete();
 
-  EventType event_type() const {
-    return EventTypeField::decode(state_);
-  }
+  EventType event_type() const { return EventTypeField::decode(state_); }
 
   bool IsFinishedDuration() const {
     return (event_type() == kDuration) && (timestamp1_ > timestamp0_);
@@ -266,43 +256,27 @@
 
   void PrintJSON(JSONStream* stream) const;
 
-  ThreadId thread() const {
-    return thread_;
-  }
+  ThreadId thread() const { return thread_; }
 
-  void set_thread(ThreadId tid) {
-    thread_ = tid;
-  }
+  void set_thread(ThreadId tid) { thread_ = tid; }
 
-  Dart_Port isolate_id() const {
-    return isolate_id_;
-  }
+  Dart_Port isolate_id() const { return isolate_id_; }
 
-  const char* label() const {
-    return label_;
-  }
+  const char* label() const { return label_; }
 
   // Does this duration end before |micros| ?
   bool DurationFinishedBefore(int64_t micros) const {
     return TimeEnd() <= micros;
   }
 
-  bool IsDuration() const {
-    return (event_type() == kDuration);
-  }
+  bool IsDuration() const { return (event_type() == kDuration); }
 
-  bool IsBegin() const {
-    return (event_type() == kBegin);
-  }
+  bool IsBegin() const { return (event_type() == kBegin); }
 
-  bool IsEnd() const {
-    return (event_type() == kEnd);
-  }
+  bool IsEnd() const { return (event_type() == kEnd); }
 
   // Is this event a synchronous begin or end event?
-  bool IsBeginOrEnd() const {
-    return IsBegin() || IsEnd();
-  }
+  bool IsBeginOrEnd() const { return IsBegin() || IsEnd(); }
 
   // Does this duration fully contain |other| ?
   bool DurationContains(TimelineEvent* other) const {
@@ -333,8 +307,7 @@
     }
   }
 
-  bool Within(int64_t time_origin_micros,
-              int64_t time_extent_micros);
+  bool Within(int64_t time_origin_micros, int64_t time_extent_micros);
 
   const char* GetSerializedJSON() const;
 
@@ -376,17 +349,13 @@
     thread_timestamp1_ = value;
   }
 
-  bool pre_serialized_json() const {
-    return PreSerializedJSON::decode(state_);
-  }
+  bool pre_serialized_json() const { return PreSerializedJSON::decode(state_); }
 
   void set_pre_serialized_json(bool pre_serialized_json) {
     state_ = PreSerializedJSON::update(pre_serialized_json, state_);
   }
 
-  bool owns_label() const {
-    return OwnsLabelBit::decode(state_);
-  }
+  bool owns_label() const { return OwnsLabelBit::decode(state_); }
 
   enum StateBits {
     kEventTypeBit = 0,  // reserve 4 bits for type.
@@ -396,8 +365,8 @@
   };
 
   class EventTypeField : public BitField<uword, EventType, kEventTypeBit, 4> {};
-  class PreSerializedJSON :
-      public BitField<uword, bool, kPreSerializedJSON, 1> {};
+  class PreSerializedJSON
+      : public BitField<uword, bool, kPreSerializedJSON, 1> {};
   class OwnsLabelBit : public BitField<uword, bool, kOwnsLabelBit, 1> {};
 
   int64_t timestamp0_;
@@ -425,15 +394,11 @@
 
 #ifndef PRODUCT
 #define TIMELINE_FUNCTION_COMPILATION_DURATION(thread, name, function)         \
-  TimelineDurationScope tds(thread,                                            \
-                            Timeline::GetCompilerStream(),                     \
-                            name);                                             \
+  TimelineDurationScope tds(thread, Timeline::GetCompilerStream(), name);      \
   if (tds.enabled()) {                                                         \
     tds.SetNumArguments(1);                                                    \
-    tds.CopyArgument(                                                          \
-        0,                                                                     \
-        "function",                                                            \
-        function.ToLibNamePrefixedQualifiedCString());                         \
+    tds.CopyArgument(0, "function",                                            \
+                     function.ToLibNamePrefixedQualifiedCString());            \
   }
 
 #define TIMELINE_FUNCTION_GC_DURATION(thread, name)                            \
@@ -446,9 +411,7 @@
 // See |TimelineDurationScope| and |TimelineBeginEndScope|.
 class TimelineEventScope : public StackResource {
  public:
-  bool enabled() const {
-    return enabled_;
-  }
+  bool enabled() const { return enabled_; }
 
   void SetNumArguments(intptr_t length);
 
@@ -456,33 +419,21 @@
 
   void CopyArgument(intptr_t i, const char* name, const char* argument);
 
-  void FormatArgument(intptr_t i,
-                      const char* name,
-                      const char* fmt, ...)  PRINTF_ATTRIBUTE(4, 5);
+  void FormatArgument(intptr_t i, const char* name, const char* fmt, ...)
+      PRINTF_ATTRIBUTE(4, 5);
 
  protected:
-  TimelineEventScope(TimelineStream* stream,
-                     const char* label);
+  TimelineEventScope(TimelineStream* stream, const char* label);
 
-  TimelineEventScope(Thread* thread,
-                     TimelineStream* stream,
-                     const char* label);
+  TimelineEventScope(Thread* thread, TimelineStream* stream, const char* label);
 
-  bool ShouldEmitEvent() const {
-    return enabled_;
-  }
+  bool ShouldEmitEvent() const { return enabled_; }
 
-  void set_enabled(bool enabled) {
-    enabled_ = enabled;
-  }
+  void set_enabled(bool enabled) { enabled_ = enabled; }
 
-  const char* label() const {
-    return label_;
-  }
+  const char* label() const { return label_; }
 
-  TimelineStream* stream() const {
-    return stream_;
-  }
+  TimelineStream* stream() const { return stream_; }
 
   virtual ~TimelineEventScope();
 
@@ -504,8 +455,7 @@
 
 class TimelineDurationScope : public TimelineEventScope {
  public:
-  TimelineDurationScope(TimelineStream* stream,
-                        const char* label);
+  TimelineDurationScope(TimelineStream* stream, const char* label);
 
   TimelineDurationScope(Thread* thread,
                         TimelineStream* stream,
@@ -523,8 +473,7 @@
 
 class TimelineBeginEndScope : public TimelineEventScope {
  public:
-  TimelineBeginEndScope(TimelineStream* stream,
-                        const char* label);
+  TimelineBeginEndScope(TimelineStream* stream, const char* label);
 
   TimelineBeginEndScope(Thread* thread,
                         TimelineStream* stream,
@@ -548,28 +497,16 @@
   explicit TimelineEventBlock(intptr_t index);
   ~TimelineEventBlock();
 
-  TimelineEventBlock* next() const {
-    return next_;
-  }
-  void set_next(TimelineEventBlock* next) {
-    next_ = next;
-  }
+  TimelineEventBlock* next() const { return next_; }
+  void set_next(TimelineEventBlock* next) { next_ = next; }
 
-  intptr_t length() const {
-    return length_;
-  }
+  intptr_t length() const { return length_; }
 
-  intptr_t block_index() const {
-    return block_index_;
-  }
+  intptr_t block_index() const { return block_index_; }
 
-  bool IsEmpty() const {
-    return length_ == 0;
-  }
+  bool IsEmpty() const { return length_ == 0; }
 
-  bool IsFull() const {
-    return length_ == kBlockSize;
-  }
+  bool IsFull() const { return length_ == kBlockSize; }
 
   TimelineEvent* At(intptr_t index) {
     ASSERT(index >= 0);
@@ -595,14 +532,10 @@
   void Reset();
 
   // Only safe to access under the recorder's lock.
-  bool in_use() const {
-    return in_use_;
-  }
+  bool in_use() const { return in_use_; }
 
   // Only safe to access under the recorder's lock.
-  ThreadId thread_id() const {
-    return thread_id_;
-  }
+  ThreadId thread_id() const { return thread_id_; }
 
  protected:
   void PrintJSON(JSONStream* stream) const;
@@ -657,13 +590,9 @@
     return event->IsValid();
   }
 
-  int64_t time_origin_micros() const {
-    return time_origin_micros_;
-  }
+  int64_t time_origin_micros() const { return time_origin_micros_; }
 
-  int64_t time_extent_micros() const {
-    return time_extent_micros_;
-  }
+  int64_t time_extent_micros() const { return time_extent_micros_; }
 
  private:
   int64_t time_origin_micros_;
@@ -686,8 +615,7 @@
   }
 
   bool IncludeEvent(TimelineEvent* event) {
-    return event->IsValid() &&
-           (event->isolate_id() == isolate_id_);
+    return event->IsValid() && (event->isolate_id() == isolate_id_);
   }
 
  private:
@@ -782,9 +710,7 @@
       : TimelineEventFixedBufferRecorder(capacity) {}
   ~TimelineEventRingRecorder() {}
 
-  const char* name() const {
-    return "Ring";
-  }
+  const char* name() const { return "Ring"; }
 
  protected:
   TimelineEventBlock* GetNewBlockLocked();
@@ -794,16 +720,13 @@
 // A recorder that writes events to Android Systrace. Events are also stored in
 // a buffer of fixed capacity. When the buffer is full, new events overwrite
 // old events.
-class TimelineEventSystraceRecorder
-    : public TimelineEventFixedBufferRecorder {
+class TimelineEventSystraceRecorder : public TimelineEventFixedBufferRecorder {
  public:
   explicit TimelineEventSystraceRecorder(intptr_t capacity = kDefaultCapacity);
 
   ~TimelineEventSystraceRecorder();
 
-  const char* name() const {
-    return "Systrace";
-  }
+  const char* name() const { return "Systrace"; }
 
  protected:
   TimelineEventBlock* GetNewBlockLocked();
@@ -821,9 +744,7 @@
       : TimelineEventFixedBufferRecorder(capacity) {}
   ~TimelineEventStartupRecorder() {}
 
-  const char* name() const {
-    return "Startup";
-  }
+  const char* name() const { return "Startup"; }
 
  protected:
   TimelineEventBlock* GetNewBlockLocked();
@@ -844,19 +765,12 @@
   // |event| as it may be freed as soon as this function returns.
   virtual void OnEvent(TimelineEvent* event) = 0;
 
-  const char* name() const {
-    return "Callback";
-  }
+  const char* name() const { return "Callback"; }
 
  protected:
-  TimelineEventBlock* GetNewBlockLocked() {
-    return NULL;
-  }
-  TimelineEventBlock* GetHeadBlockLocked() {
-    return NULL;
-  }
-  void Clear() {
-  }
+  TimelineEventBlock* GetNewBlockLocked() { return NULL; }
+  TimelineEventBlock* GetHeadBlockLocked() { return NULL; }
+  void Clear() {}
   TimelineEvent* StartEvent();
   void CompleteEvent(TimelineEvent* event);
 };
@@ -872,9 +786,7 @@
   void PrintJSON(JSONStream* js, TimelineEventFilter* filter);
   void PrintTraceEvent(JSONStream* js, TimelineEventFilter* filter);
 
-  const char* name() const {
-    return "Endless";
-  }
+  const char* name() const { return "Endless"; }
 
  protected:
   TimelineEvent* StartEvent();
diff --git a/runtime/vm/timeline_analysis.cc b/runtime/vm/timeline_analysis.cc
index 5360d29..f4e7fd0 100644
--- a/runtime/vm/timeline_analysis.cc
+++ b/runtime/vm/timeline_analysis.cc
@@ -15,13 +15,10 @@
 DECLARE_FLAG(bool, trace_timeline_analysis);
 DECLARE_FLAG(bool, timing);
 
-TimelineAnalysisThread::TimelineAnalysisThread(ThreadId id)
-    : id_(id) {
-}
+TimelineAnalysisThread::TimelineAnalysisThread(ThreadId id) : id_(id) {}
 
 
-TimelineAnalysisThread::~TimelineAnalysisThread() {
-}
+TimelineAnalysisThread::~TimelineAnalysisThread() {}
 
 
 void TimelineAnalysisThread::AddBlock(TimelineEventBlock* block) {
@@ -43,8 +40,7 @@
   blocks_.Sort(CompareBlocksLowerTimeBound);
   if (FLAG_trace_timeline_analysis) {
     THR_Print("Thread %" Px " has %" Pd " blocks\n",
-              OSThread::ThreadIdToIntPtr(id_),
-              blocks_.length());
+              OSThread::ThreadIdToIntPtr(id_), blocks_.length());
   }
 }
 
@@ -120,8 +116,7 @@
 }
 
 
-TimelineAnalysis::~TimelineAnalysis() {
-}
+TimelineAnalysis::~TimelineAnalysis() {}
 
 
 void TimelineAnalysis::BuildThreads() {
@@ -166,11 +161,15 @@
     }
     if (!block->CheckBlock()) {
       if (FLAG_trace_timeline_analysis) {
-        THR_Print("DiscoverThreads block %" Pd " "
-                  "violates invariants.\n", block->block_index());
+        THR_Print("DiscoverThreads block %" Pd
+                  " "
+                  "violates invariants.\n",
+                  block->block_index());
       }
-      SetError("Block %" Pd " violates invariants. See "
-               "TimelineEventBlock::CheckBlock", block->block_index());
+      SetError("Block %" Pd
+               " violates invariants. See "
+               "TimelineEventBlock::CheckBlock",
+               block->block_index());
       return;
     }
     TimelineAnalysisThread* thread = GetOrAddThread(block->thread_id());
@@ -268,8 +267,7 @@
 TimelinePauses::TimelinePauses(Zone* zone,
                                Isolate* isolate,
                                TimelineEventRecorder* recorder)
-    : TimelineAnalysis(zone, isolate, recorder) {
-}
+    : TimelineAnalysis(zone, isolate, recorder) {}
 
 
 void TimelinePauses::Setup() {
@@ -376,8 +374,7 @@
   PopFinishedDurations(kMaxInt64);
   if (FLAG_trace_timeline_analysis) {
     THR_Print("<<< TimelinePauses::ProcessThread %" Px " had %" Pd " events\n",
-              OSThread::ThreadIdToIntPtr(thread->id()),
-              event_count);
+              OSThread::ThreadIdToIntPtr(thread->id()), event_count);
   }
 }
 
@@ -410,10 +407,8 @@
       // Top of stack completes before |start|.
       stack_.RemoveLast();
       if (FLAG_trace_timeline_analysis) {
-        THR_Print("Popping %s (%" Pd64 " <= %" Pd64 ")\n",
-                  top.event->label(),
-                  top.event->TimeEnd(),
-                  start);
+        THR_Print("Popping %s (%" Pd64 " <= %" Pd64 ")\n", top.event->label(),
+                  top.event->TimeEnd(), start);
       }
     } else {
       return;
@@ -440,26 +435,22 @@
   const int64_t duration = end - start;
   // Sanity checks.
   if (strcmp(top_label, label) != 0) {
-    SetError("PopBegin(%s, ...) called with %s at the top of stack",
-             label, top.event->label());
+    SetError("PopBegin(%s, ...) called with %s at the top of stack", label,
+             top.event->label());
     return;
   }
   if (!top_is_begin) {
-    SetError("kEnd event not paired with kBegin event for label %s",
-             label);
+    SetError("kEnd event not paired with kBegin event for label %s", label);
     return;
   }
   // Pop this event.
   // Add duration to exclusive micros.
   if (FLAG_trace_timeline_analysis) {
-    THR_Print("Popping %s (%" Pd64 ")\n",
-              top.event->label(),
-              duration);
+    THR_Print("Popping %s (%" Pd64 ")\n", top.event->label(), duration);
   }
   const int64_t exclusive_micros = top.exclusive_micros + duration;
   stack_.RemoveLast();
-  top.pause_info->OnBeginPop(duration,
-                             exclusive_micros,
+  top.pause_info->OnBeginPop(duration, exclusive_micros,
                              IsLabelOnStack(top_label));
   if (StackDepth() > 0) {
     StackItem& top = GetStackTop();
@@ -474,8 +465,7 @@
   ASSERT(pause_info != NULL);
   // |pause_info| will be running for |event->TimeDuration()|.
   if (FLAG_trace_timeline_analysis) {
-    THR_Print("Pushing %s %" Pd64 " us\n",
-              pause_info->name(),
+    THR_Print("Pushing %s %" Pd64 " us\n", pause_info->name(),
               event->TimeDuration());
   }
   if (event->IsDuration()) {
@@ -541,12 +531,10 @@
 }
 
 
-TimelinePauseTrace::TimelinePauseTrace() {
-}
+TimelinePauseTrace::TimelinePauseTrace() {}
 
 
-TimelinePauseTrace::~TimelinePauseTrace() {
-}
+TimelinePauseTrace::~TimelinePauseTrace() {}
 
 
 void TimelinePauseTrace::Print() {
@@ -561,16 +549,14 @@
   TimelinePauses pauses(zone, isolate, recorder);
   pauses.Setup();
 
-  THR_Print("Timing for isolate %s (from %" Pd " threads)\n",
-            isolate->name(),
+  THR_Print("Timing for isolate %s (from %" Pd " threads)\n", isolate->name(),
             pauses.NumThreads());
   THR_Print("\n");
   for (intptr_t t_idx = 0; t_idx < pauses.NumThreads(); t_idx++) {
     TimelineAnalysisThread* tat = pauses.At(t_idx);
     ASSERT(tat != NULL);
     pauses.CalculatePauseTimesForThread(tat->id());
-    THR_Print("Thread %" Pd " (%" Px "):\n",
-              t_idx,
+    THR_Print("Thread %" Pd " (%" Px "):\n", t_idx,
               OSThread::ThreadIdToIntPtr(tat->id()));
     for (intptr_t j = 0; j < pauses.NumPauseInfos(); j++) {
       const TimelineLabelPauseInfo* pause_info = pauses.PauseInfoAt(j);
diff --git a/runtime/vm/timeline_analysis.h b/runtime/vm/timeline_analysis.h
index 2e457c9..ca1424b 100644
--- a/runtime/vm/timeline_analysis.h
+++ b/runtime/vm/timeline_analysis.h
@@ -15,17 +15,11 @@
   explicit TimelineAnalysisThread(ThreadId id);
   ~TimelineAnalysisThread();
 
-  ThreadId id() const {
-    return id_;
-  }
+  ThreadId id() const { return id_; }
 
-  intptr_t NumBlocks() const {
-    return blocks_.length();
-  }
+  intptr_t NumBlocks() const { return blocks_.length(); }
 
-  TimelineEventBlock* At(intptr_t i) const {
-    return blocks_.At(i);
-  }
+  TimelineEventBlock* At(intptr_t i) const { return blocks_.At(i); }
 
  private:
   void AddBlock(TimelineEventBlock* block);
@@ -69,23 +63,15 @@
 
   void BuildThreads();
 
-  intptr_t NumThreads() const {
-    return threads_.length();
-  }
+  intptr_t NumThreads() const { return threads_.length(); }
 
-  TimelineAnalysisThread* At(intptr_t i) const {
-    return threads_[i];
-  }
+  TimelineAnalysisThread* At(intptr_t i) const { return threads_[i]; }
 
   TimelineAnalysisThread* GetThread(ThreadId tid);
 
-  bool has_error() const {
-    return has_error_;
-  }
+  bool has_error() const { return has_error_; }
 
-  const char* error_msg() const {
-    return error_msg_;
-  }
+  const char* error_msg() const { return error_msg_; }
 
  protected:
   TimelineAnalysisThread* GetOrAddThread(ThreadId tid);
@@ -109,25 +95,15 @@
  public:
   explicit TimelineLabelPauseInfo(const char* name);
 
-  const char* name() const {
-    return name_;
-  }
+  const char* name() const { return name_; }
 
-  int64_t inclusive_micros() const {
-    return inclusive_micros_;
-  }
+  int64_t inclusive_micros() const { return inclusive_micros_; }
 
-  int64_t exclusive_micros() const {
-    return exclusive_micros_;
-  }
+  int64_t exclusive_micros() const { return exclusive_micros_; }
 
-  int64_t max_inclusive_micros() const {
-    return max_inclusive_micros_;
-  }
+  int64_t max_inclusive_micros() const { return max_inclusive_micros_; }
 
-  int64_t max_exclusive_micros() const {
-    return max_exclusive_micros_;
-  }
+  int64_t max_exclusive_micros() const { return max_exclusive_micros_; }
 
  private:
   // Adjusts |inclusive_micros_| and |exclusive_micros_| by |micros|.
@@ -174,9 +150,7 @@
 
 class TimelinePauses : public TimelineAnalysis {
  public:
-  TimelinePauses(Zone* zone,
-                 Isolate* isolate,
-                 TimelineEventRecorder* recorder);
+  TimelinePauses(Zone* zone, Isolate* isolate, TimelineEventRecorder* recorder);
 
   void Setup();
 
@@ -189,9 +163,7 @@
   int64_t MaxInclusiveTime(const char* name) const;
   int64_t MaxExclusiveTime(const char* name) const;
 
-  intptr_t NumPauseInfos() const {
-    return labels_.length();
-  }
+  intptr_t NumPauseInfos() const { return labels_.length(); }
 
   const TimelineLabelPauseInfo* PauseInfoAt(intptr_t i) const {
     return labels_.At(i);
diff --git a/runtime/vm/timeline_test.cc b/runtime/vm/timeline_test.cc
index e7f0e7a..2266898 100644
--- a/runtime/vm/timeline_test.cc
+++ b/runtime/vm/timeline_test.cc
@@ -24,9 +24,7 @@
     Timeline::recorder_ = new_recorder;
   }
 
-  ~TimelineRecorderOverride() {
-    Timeline::recorder_ = recorder_;
-  }
+  ~TimelineRecorderOverride() { Timeline::recorder_ = recorder_; }
 
  private:
   TimelineEventRecorder* recorder_;
@@ -39,11 +37,10 @@
     event->StreamInit(stream);
   }
 
-  static void FakeThreadEvent(
-      TimelineEventBlock* block,
-      intptr_t ftid,
-      const char* label = "fake",
-      TimelineStream* stream = NULL) {
+  static void FakeThreadEvent(TimelineEventBlock* block,
+                              intptr_t ftid,
+                              const char* label = "fake",
+                              TimelineStream* stream = NULL) {
     TimelineEvent* event = block->StartEvent();
     ASSERT(event != NULL);
     event->DurationBegin(label);
@@ -53,16 +50,14 @@
     }
   }
 
-  static void SetBlockThread(TimelineEventBlock* block,
-                             intptr_t ftid) {
+  static void SetBlockThread(TimelineEventBlock* block, intptr_t ftid) {
     block->thread_id_ = OSThread::ThreadIdFromIntPtr(ftid);
   }
 
-  static void FakeDuration(
-      TimelineEventRecorder* recorder,
-      const char* label,
-      int64_t start,
-      int64_t end) {
+  static void FakeDuration(TimelineEventRecorder* recorder,
+                           const char* label,
+                           int64_t start,
+                           int64_t end) {
     ASSERT(recorder != NULL);
     ASSERT(start < end);
     ASSERT(label != NULL);
@@ -72,10 +67,9 @@
     event->Complete();
   }
 
-  static void FakeBegin(
-      TimelineEventRecorder* recorder,
-      const char* label,
-      int64_t start) {
+  static void FakeBegin(TimelineEventRecorder* recorder,
+                        const char* label,
+                        int64_t start) {
     ASSERT(recorder != NULL);
     ASSERT(label != NULL);
     ASSERT(start >= 0);
@@ -85,10 +79,9 @@
     event->Complete();
   }
 
-  static void FakeEnd(
-      TimelineEventRecorder* recorder,
-      const char* label,
-      int64_t end) {
+  static void FakeEnd(TimelineEventRecorder* recorder,
+                      const char* label,
+                      int64_t end) {
     ASSERT(recorder != NULL);
     ASSERT(label != NULL);
     ASSERT(end >= 0);
@@ -103,9 +96,7 @@
     recorder->Clear();
   }
 
-  static void FinishBlock(TimelineEventBlock* block) {
-    block->Finish();
-  }
+  static void FinishBlock(TimelineEventBlock* block) { block->Finish(); }
 };
 
 
@@ -289,13 +280,9 @@
     }
   }
 
-  void OnEvent(TimelineEvent* event) {
-    counts_[event->event_type()]++;
-  }
+  void OnEvent(TimelineEvent* event) { counts_[event->event_type()]++; }
 
-  intptr_t CountFor(TimelineEvent::EventType type) {
-    return counts_[type];
-  }
+  intptr_t CountFor(TimelineEvent::EventType type) { return counts_[type]; }
 
  private:
   intptr_t counts_[TimelineEvent::kNumEventTypes];
@@ -307,8 +294,7 @@
   TimelineRecorderOverride override(recorder);
 
   // Initial counts are all zero.
-  for (intptr_t i = TimelineEvent::kNone + 1;
-       i < TimelineEvent::kNumEventTypes;
+  for (intptr_t i = TimelineEvent::kNone + 1; i < TimelineEvent::kNumEventTypes;
        i++) {
     EXPECT_EQ(0, recorder->CountFor(static_cast<TimelineEvent::EventType>(i)));
   }
diff --git a/runtime/vm/timer.cc b/runtime/vm/timer.cc
index 5b76b48..94835e9 100644
--- a/runtime/vm/timer.cc
+++ b/runtime/vm/timer.cc
@@ -6,8 +6,4 @@
 #include "vm/timer.h"
 #include "vm/json_stream.h"
 
-namespace dart {
-
-
-
-}  // namespace dart
+namespace dart {}  // namespace dart
diff --git a/runtime/vm/timer.h b/runtime/vm/timer.h
index 7d32522..1cf28c9 100644
--- a/runtime/vm/timer.h
+++ b/runtime/vm/timer.h
@@ -16,8 +16,7 @@
 // Timer class allows timing of specific operations in the VM.
 class Timer : public ValueObject {
  public:
-  Timer(bool report, const char* message)
-      : report_(report), message_(message) {
+  Timer(bool report, const char* message) : report_(report), message_(message) {
     Reset();
   }
   ~Timer() {}
@@ -69,7 +68,7 @@
 
   bool IsReset() const {
     return (start_ == 0) && (stop_ == 0) && (total_ == 0) &&
-        (max_contiguous_ == 0) && !running_;
+           (max_contiguous_ == 0) && !running_;
   }
 
   void AddTotal(const Timer& other) {
@@ -111,9 +110,7 @@
 class TimerScope : public StackResource {
  public:
   TimerScope(bool flag, Timer* timer, Thread* thread = NULL)
-      : StackResource(thread),
-        nested_(false),
-        timer_(flag ? timer : NULL) {
+      : StackResource(thread), nested_(false), timer_(flag ? timer : NULL) {
     Init();
   }
 
@@ -146,9 +143,7 @@
 class PauseTimerScope : public StackResource {
  public:
   PauseTimerScope(bool flag, Timer* timer, Thread* thread = NULL)
-      : StackResource(thread),
-        nested_(false),
-        timer_(flag ? timer : NULL) {
+      : StackResource(thread), nested_(false), timer_(flag ? timer : NULL) {
     if (timer_) {
       if (timer_->running()) {
         timer_->Stop();
@@ -174,7 +169,6 @@
 };
 
 
-
 }  // namespace dart
 
 #endif  // RUNTIME_VM_TIMER_H_
diff --git a/runtime/vm/token.cc b/runtime/vm/token.cc
index b6a34ce..5109177 100644
--- a/runtime/vm/token.cc
+++ b/runtime/vm/token.cc
@@ -9,31 +9,23 @@
 namespace dart {
 
 #define TOKEN_NAME(t, s, p, a) #t,
-const char* Token::name_[] = {
-  DART_TOKEN_LIST(TOKEN_NAME)
-  DART_KEYWORD_LIST(TOKEN_NAME)
-};
+const char* Token::name_[] = {DART_TOKEN_LIST(TOKEN_NAME)
+                                  DART_KEYWORD_LIST(TOKEN_NAME)};
 #undef TOKEN_NAME
 
 #define TOKEN_STRING(t, s, p, a) s,
-const char* Token::tok_str_[] = {
-  DART_TOKEN_LIST(TOKEN_STRING)
-  DART_KEYWORD_LIST(TOKEN_STRING)
-};
+const char* Token::tok_str_[] = {DART_TOKEN_LIST(TOKEN_STRING)
+                                     DART_KEYWORD_LIST(TOKEN_STRING)};
 #undef TOKEN_STRING
 
 #define TOKEN_PRECEDENCE(t, s, p, a) p,
-const uint8_t Token::precedence_[] = {
-  DART_TOKEN_LIST(TOKEN_PRECEDENCE)
-  DART_KEYWORD_LIST(TOKEN_PRECEDENCE)
-};
+const uint8_t Token::precedence_[] = {DART_TOKEN_LIST(TOKEN_PRECEDENCE)
+                                          DART_KEYWORD_LIST(TOKEN_PRECEDENCE)};
 #undef TOKEN_PRECEDENCE
 
 #define TOKEN_ATTRIBUTE(t, s, p, a) a,
-  const Token::Attribute Token::attributes_[] = {
-    DART_TOKEN_LIST(TOKEN_ATTRIBUTE)
-    DART_KEYWORD_LIST(TOKEN_ATTRIBUTE)
-  };
+const Token::Attribute Token::attributes_[] = {
+    DART_TOKEN_LIST(TOKEN_ATTRIBUTE) DART_KEYWORD_LIST(TOKEN_ATTRIBUTE)};
 #undef TOKEN_ATTRIBUTE
 
 
@@ -77,4 +69,18 @@
   return (token == kBIT_NOT) || (token == kNEGATE);
 }
 
+
+bool Token::IsBinaryBitwiseOperator(Token::Kind token) {
+  switch (token) {
+    case Token::kBIT_OR:
+    case Token::kBIT_XOR:
+    case Token::kBIT_AND:
+    case Token::kSHL:
+    case Token::kSHR:
+      return true;
+    default:
+      return false;
+  }
+}
+
 }  // namespace dart
diff --git a/runtime/vm/token.h b/runtime/vm/token.h
index 0f5ff54..3d2e821 100644
--- a/runtime/vm/token.h
+++ b/runtime/vm/token.h
@@ -42,12 +42,12 @@
   TOK(kLBRACE, "{", 0, kNoAttribute)                                           \
   TOK(kRBRACE, "}", 0, kNoAttribute)                                           \
   TOK(kARROW, "=>", 0, kNoAttribute)                                           \
-  TOK(kCOLON,  ":", 0, kNoAttribute)                                           \
+  TOK(kCOLON, ":", 0, kNoAttribute)                                            \
   TOK(kSEMICOLON, ";", 0, kNoAttribute)                                        \
   TOK(kPERIOD, ".", 0, kNoAttribute)                                           \
   TOK(kQM_PERIOD, "?.", 0, kNoAttribute)                                       \
-  TOK(kINCR,   "++", 0, kNoAttribute)                                          \
-  TOK(kDECR,   "--", 0, kNoAttribute)                                          \
+  TOK(kINCR, "++", 0, kNoAttribute)                                            \
+  TOK(kDECR, "--", 0, kNoAttribute)                                            \
                                                                                \
   /* Assignment operators.                            */                       \
   /* Please update IsAssignmentOperator() if you make */                       \
@@ -139,7 +139,7 @@
   TOK(kSCRIPTTAG, "#!", 0, kNoAttribute)                                       \
                                                                                \
   /* Support for optimized code */                                             \
-  TOK(kREM, "", 0, kNoAttribute)                                               \
+  TOK(kREM, "", 0, kNoAttribute)
 
 // List of keywords. The list must be alphabetically ordered. The
 // keyword recognition code depends on the ordering.
@@ -199,17 +199,13 @@
 class Token {
  public:
 #define T(t, s, p, a) t,
-  enum Kind {
-    DART_TOKEN_LIST(T)
-    DART_KEYWORD_LIST(T)
-    kNumTokens
-  };
+  enum Kind { DART_TOKEN_LIST(T) DART_KEYWORD_LIST(T) kNumTokens };
 #undef T
 
   enum Attribute {
-    kNoAttribute     = 0,
-    kKeyword         = 1 << 0,
-    kPseudoKeyword   = 1 << 1,
+    kNoAttribute = 0,
+    kKeyword = 1 << 0,
+    kPseudoKeyword = 1 << 1,
   };
 
   static const Kind kFirstKeyword = kABSTRACT;
@@ -236,9 +232,7 @@
     return (tok == kIS) || (tok == kISNOT);
   }
 
-  static bool IsTypeCastOperator(Kind tok) {
-    return tok == kAS;
-  }
+  static bool IsTypeCastOperator(Kind tok) { return tok == kAS; }
 
   static bool IsIndexOperator(Kind tok) {
     return tok == kINDEX || tok == kASSIGN_INDEX;
@@ -248,9 +242,7 @@
     return (Attributes(tok) & kPseudoKeyword) != 0;
   }
 
-  static bool IsKeyword(Kind tok) {
-    return (Attributes(tok) & kKeyword) != 0;
-  }
+  static bool IsKeyword(Kind tok) { return (Attributes(tok) & kKeyword) != 0; }
 
   static bool IsIdentifier(Kind tok) {
     return (tok == kIDENT) || IsPseudoKeyword(tok);
@@ -278,20 +270,16 @@
 
   static bool CanBeOverloaded(Kind tok) {
     ASSERT(tok < kNumTokens);
-    return IsRelationalOperator(tok) ||
-           (tok == kEQ) ||
-           (tok >= kADD && tok <= kMOD) ||  // Arithmetic operations.
+    return IsRelationalOperator(tok) || (tok == kEQ) ||
+           (tok >= kADD && tok <= kMOD) ||     // Arithmetic operations.
            (tok >= kBIT_OR && tok <= kSHR) ||  // Bit operations.
-           (tok == kINDEX) ||
-           (tok == kASSIGN_INDEX);
+           (tok == kINDEX) || (tok == kASSIGN_INDEX);
   }
 
   static bool NeedsLiteralToken(Kind tok) {
     ASSERT(tok < kNumTokens);
-    return ((tok == Token::kINTEGER) ||
-            (tok == Token::kSTRING) ||
-            (tok == Token::kINTERPOL_VAR) ||
-            (tok == Token::kERROR) ||
+    return ((tok == Token::kINTEGER) || (tok == Token::kSTRING) ||
+            (tok == Token::kINTERPOL_VAR) || (tok == Token::kERROR) ||
             (tok == Token::kDOUBLE));
   }
 
@@ -301,20 +289,32 @@
   static bool IsBinaryArithmeticOperator(Token::Kind token);
   static bool IsUnaryArithmeticOperator(Token::Kind token);
 
+  static bool IsBinaryBitwiseOperator(Token::Kind token);
+
   // For a comparison operation return an operation for the negated comparison:
   // !(a (op) b) === a (op') b
   static Token::Kind NegateComparison(Token::Kind op) {
     switch (op) {
-      case Token::kEQ: return Token::kNE;
-      case Token::kNE: return Token::kEQ;
-      case Token::kLT: return Token::kGTE;
-      case Token::kGT: return Token::kLTE;
-      case Token::kLTE: return Token::kGT;
-      case Token::kGTE: return Token::kLT;
-      case Token::kEQ_STRICT: return Token::kNE_STRICT;
-      case Token::kNE_STRICT: return Token::kEQ_STRICT;
-      case Token::kIS:    return Token::kISNOT;
-      case Token::kISNOT: return Token::kIS;
+      case Token::kEQ:
+        return Token::kNE;
+      case Token::kNE:
+        return Token::kEQ;
+      case Token::kLT:
+        return Token::kGTE;
+      case Token::kGT:
+        return Token::kLTE;
+      case Token::kLTE:
+        return Token::kGT;
+      case Token::kGTE:
+        return Token::kLT;
+      case Token::kEQ_STRICT:
+        return Token::kNE_STRICT;
+      case Token::kNE_STRICT:
+        return Token::kEQ_STRICT;
+      case Token::kIS:
+        return Token::kISNOT;
+      case Token::kISNOT:
+        return Token::kIS;
       default:
         UNREACHABLE();
         return Token::kILLEGAL;
diff --git a/runtime/vm/token_position.cc b/runtime/vm/token_position.cc
index a6490cd..cfda6af 100644
--- a/runtime/vm/token_position.cc
+++ b/runtime/vm/token_position.cc
@@ -31,20 +31,19 @@
 
 
 #define DEFINE_VALUES(name, value)                                             \
-const TokenPosition TokenPosition::k##name = TokenPosition(value);
-  SENTINEL_TOKEN_DESCRIPTORS(DEFINE_VALUES);
+  const TokenPosition TokenPosition::k##name = TokenPosition(value);
+SENTINEL_TOKEN_DESCRIPTORS(DEFINE_VALUES);
 #undef DEFINE_VALUES
-const TokenPosition TokenPosition::kMinSource =
-    TokenPosition(kMinSourcePos);
+const TokenPosition TokenPosition::kMinSource = TokenPosition(kMinSourcePos);
 
-const TokenPosition TokenPosition::kMaxSource =
-    TokenPosition(kMaxSourcePos);
+const TokenPosition TokenPosition::kMaxSource = TokenPosition(kMaxSourcePos);
 
 
 const char* TokenPosition::ToCString() const {
   switch (value_) {
 #define DEFINE_CASE(name, value)                                               \
-    case value: return #name;
+  case value:                                                                  \
+    return #name;
     SENTINEL_TOKEN_DESCRIPTORS(DEFINE_CASE);
 #undef DEFINE_CASE
     default: {
diff --git a/runtime/vm/token_position.h b/runtime/vm/token_position.h
index dc7c5a0e..b0a2062 100644
--- a/runtime/vm/token_position.h
+++ b/runtime/vm/token_position.h
@@ -29,41 +29,33 @@
 // This organization allows for ~1 billion token positions.
 
 #define SENTINEL_TOKEN_DESCRIPTORS(V)                                          \
-    V(NoSource, -1)                                                            \
-    V(Box, -2)                                                                 \
-    V(ParallelMove, -3)                                                        \
-    V(TempMove, -4)                                                            \
-    V(Constant, -5)                                                            \
-    V(PushArgument, -6)                                                        \
-    V(ControlFlow, -7)                                                         \
-    V(Context, -8)                                                             \
-    V(MethodExtractor, -9)                                                     \
-    V(DeferredSlowPath, -10)                                                   \
-    V(DeferredDeoptInfo, -11)                                                  \
-    V(DartCodePrologue, -12)                                                   \
-    V(DartCodeEpilogue, -13)                                                   \
-    V(Last, -14)   // Always keep this at the end.
+  V(NoSource, -1)                                                              \
+  V(Box, -2)                                                                   \
+  V(ParallelMove, -3)                                                          \
+  V(TempMove, -4)                                                              \
+  V(Constant, -5)                                                              \
+  V(PushArgument, -6)                                                          \
+  V(ControlFlow, -7)                                                           \
+  V(Context, -8)                                                               \
+  V(MethodExtractor, -9)                                                       \
+  V(DeferredSlowPath, -10)                                                     \
+  V(DeferredDeoptInfo, -11)                                                    \
+  V(DartCodePrologue, -12)                                                     \
+  V(DartCodeEpilogue, -13)                                                     \
+  V(Last, -14)  // Always keep this at the end.
 
 // A token position representing a debug safe source (real) position,
 // non-debug safe source (synthetic) positions, or a classifying value used
 // by the profiler.
 class TokenPosition {
  public:
-  TokenPosition()
-      : value_(kNoSource.value()) {
-  }
+  TokenPosition() : value_(kNoSource.value()) {}
 
-  explicit TokenPosition(intptr_t value)
-      : value_(value) {
-  }
+  explicit TokenPosition(intptr_t value) : value_(value) {}
 
-  bool operator==(const TokenPosition& b) const {
-    return value() == b.value();
-  }
+  bool operator==(const TokenPosition& b) const { return value() == b.value(); }
 
-  bool operator!=(const TokenPosition& b) const {
-    return !(*this == b);
-  }
+  bool operator!=(const TokenPosition& b) const { return !(*this == b); }
 
   bool operator<(const TokenPosition& b) const {
     // TODO(johnmccutchan): Assert that this is a source position.
@@ -87,8 +79,7 @@
 
   static const intptr_t kMaxSentinelDescriptors = 64;
 
-#define DECLARE_VALUES(name, value)                                            \
-  static const TokenPosition k##name;
+#define DECLARE_VALUES(name, value) static const TokenPosition k##name;
   SENTINEL_TOKEN_DESCRIPTORS(DECLARE_VALUES);
 #undef DECLARE_VALUES
   static const TokenPosition kMinSource;
@@ -109,9 +100,7 @@
 
   // The raw value.
   // TODO(johnmccutchan): Make this private.
-  intptr_t value() const {
-    return value_;
-  }
+  intptr_t value() const { return value_; }
 
   // Return the source position.
   intptr_t Pos() const {
@@ -134,9 +123,7 @@
   }
 
   // Is |this| the no source position sentinel?
-  bool IsNoSource() const {
-    return *this == kNoSource;
-  }
+  bool IsNoSource() const { return *this == kNoSource; }
 
   // Is |this| a synthetic source position?
   // Synthetic source positions are used by the profiler to attribute ticks to a
@@ -144,9 +131,7 @@
   bool IsSynthetic() const;
 
   // Is |this| a real source position?
-  bool IsReal() const {
-    return value_ >= kMinSourcePos;
-  }
+  bool IsReal() const { return value_ >= kMinSourcePos; }
 
   // Is |this| a source position?
   bool IsSourcePosition() const {
diff --git a/runtime/vm/type_table.h b/runtime/vm/type_table.h
index 6e3818c..6541d20 100644
--- a/runtime/vm/type_table.h
+++ b/runtime/vm/type_table.h
@@ -13,14 +13,9 @@
 
 class CanonicalTypeKey {
  public:
-  explicit CanonicalTypeKey(const Type& key) : key_(key) {
-  }
-  bool Matches(const Type& arg) const {
-    return key_.Equals(arg);
-  }
-  uword Hash() const {
-    return key_.Hash();
-  }
+  explicit CanonicalTypeKey(const Type& key) : key_(key) {}
+  bool Matches(const Type& arg) const { return key_.Equals(arg); }
+  uword Hash() const { return key_.Hash(); }
   const Type& key_;
 
  private:
@@ -49,26 +44,21 @@
     ASSERT(key.IsType());
     return Type::Cast(key).Hash();
   }
-  static uword Hash(const CanonicalTypeKey& key) {
-    return key.Hash();
-  }
+  static uword Hash(const CanonicalTypeKey& key) { return key.Hash(); }
   static RawObject* NewKey(const CanonicalTypeKey& obj) {
     return obj.key_.raw();
   }
 };
-typedef UnorderedHashSet <CanonicalTypeTraits> CanonicalTypeSet;
+typedef UnorderedHashSet<CanonicalTypeTraits> CanonicalTypeSet;
 
 
 class CanonicalTypeArgumentsKey {
  public:
-  explicit CanonicalTypeArgumentsKey(const TypeArguments& key) : key_(key) {
-  }
+  explicit CanonicalTypeArgumentsKey(const TypeArguments& key) : key_(key) {}
   bool Matches(const TypeArguments& arg) const {
     return key_.Equals(arg) && (key_.Hash() == arg.Hash());
   }
-  uword Hash() const {
-    return key_.Hash();
-  }
+  uword Hash() const { return key_.Hash(); }
   const TypeArguments& key_;
 
  private:
@@ -97,9 +87,7 @@
     ASSERT(key.IsTypeArguments());
     return TypeArguments::Cast(key).Hash();
   }
-  static uword Hash(const CanonicalTypeArgumentsKey& key) {
-    return key.Hash();
-  }
+  static uword Hash(const CanonicalTypeArgumentsKey& key) { return key.Hash(); }
   static RawObject* NewKey(const CanonicalTypeArgumentsKey& obj) {
     return obj.key_.raw();
   }
diff --git a/runtime/vm/unibrow-inl.h b/runtime/vm/unibrow-inl.h
index 47ef64d..ab6f5d5 100644
--- a/runtime/vm/unibrow-inl.h
+++ b/runtime/vm/unibrow-inl.h
@@ -11,8 +11,8 @@
 
 namespace unibrow {
 
-template <class T, intptr_t s> intptr_t Mapping<T, s>::get(
-    int32_t c, int32_t n, int32_t* result) {
+template <class T, intptr_t s>
+intptr_t Mapping<T, s>::get(int32_t c, int32_t n, int32_t* result) {
   CacheEntry entry = entries_[c & kMask];
   if (entry.code_point_ == c) {
     if (entry.offset_ == 0) {
@@ -26,8 +26,8 @@
   }
 }
 
-template <class T, intptr_t s> intptr_t Mapping<T, s>::CalculateValue(
-    int32_t c, int32_t n, int32_t* result) {
+template <class T, intptr_t s>
+intptr_t Mapping<T, s>::CalculateValue(int32_t c, int32_t n, int32_t* result) {
   bool allow_caching = true;
   intptr_t length = T::Convert(c, n, result, &allow_caching);
   if (allow_caching) {
diff --git a/runtime/vm/unibrow.cc b/runtime/vm/unibrow.cc
index 7f590d4..e39a6d3 100644
--- a/runtime/vm/unibrow.cc
+++ b/runtime/vm/unibrow.cc
@@ -188,7 +188,7 @@
 
 
 // Letter:               point.category in ['Lu', 'Ll', 'Lt', 'Lm', 'Lo', 'Nl']
-
+// clang-format off
 static const uint16_t kLetterTable0Size = 431;
 static const int32_t kLetterTable0[431] = {
     1073741889, 90,         1073741921, 122,
@@ -1823,34 +1823,29 @@
 static const uint16_t kCanonicalizationRangeTable7Size = 4;  // NOLINT
 static const int32_t kCanonicalizationRangeTable7[8] = {
   1073749793, 100, 7994, 0, 1073749825, 100, 8026, 0 };  // NOLINT
+
+// clang-format on
+
 intptr_t CanonicalizationRange::Convert(int32_t c,
-                      int32_t n,
-                      int32_t* result,
-                      bool* allow_caching_ptr) {
+                                        int32_t n,
+                                        int32_t* result,
+                                        bool* allow_caching_ptr) {
   intptr_t 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;
+    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;
   }
 }
 
diff --git a/runtime/vm/unibrow.h b/runtime/vm/unibrow.h
index f4ac7b5..565a9a8 100644
--- a/runtime/vm/unibrow.h
+++ b/runtime/vm/unibrow.h
@@ -23,16 +23,16 @@
 template <class T, intptr_t size = 256>
 class Mapping {
  public:
-  inline Mapping() { }
+  inline Mapping() {}
   inline intptr_t get(int32_t c, int32_t n, int32_t* result);
+
  private:
   friend class Test;
   intptr_t CalculateValue(int32_t c, int32_t n, int32_t* result);
   struct CacheEntry {
-    inline CacheEntry() : code_point_(kNoChar), offset_(0) { }
+    inline CacheEntry() : code_point_(kNoChar), offset_(0) {}
     inline CacheEntry(int32_t code_point, signed offset)
-      : code_point_(code_point),
-        offset_(offset) { }
+        : code_point_(code_point), offset_(offset) {}
     int32_t code_point_;
     signed offset_;
     static const intptr_t kNoChar = (1 << 21) - 1;
diff --git a/runtime/vm/unicode.cc b/runtime/vm/unicode.cc
index 8e1649e..f271574 100644
--- a/runtime/vm/unicode.cc
+++ b/runtime/vm/unicode.cc
@@ -10,6 +10,7 @@
 
 namespace dart {
 
+// clang-format off
 const int8_t Utf8::kTrailBytes[256] = {
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -28,29 +29,17 @@
   3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
   4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 0, 0
 };
+// clang-format on
 
-
-const uint32_t Utf8::kMagicBits[7] = {
-  0,  // Padding.
-  0x00000000,
-  0x00003080,
-  0x000E2080,
-  0x03C82080,
-  0xFA082080,
-  0x82082080
-};
+const uint32_t Utf8::kMagicBits[7] = {0,  // Padding.
+                                      0x00000000, 0x00003080, 0x000E2080,
+                                      0x03C82080, 0xFA082080, 0x82082080};
 
 
 // Minimum values of code points used to check shortest form.
-const uint32_t Utf8::kOverlongMinimum[7] = {
-  0,  // Padding.
-  0x0,
-  0x80,
-  0x800,
-  0x10000,
-  0xFFFFFFFF,
-  0xFFFFFFFF
-};
+const uint32_t Utf8::kOverlongMinimum[7] = {0,  // Padding.
+                                            0x0,     0x80,       0x800,
+                                            0x10000, 0xFFFFFFFF, 0xFFFFFFFF};
 
 
 // Returns the most restricted coding form in which the sequence of utf8
@@ -65,7 +54,7 @@
     uint8_t code_unit = utf8_array[i];
     if (!IsTrailByte(code_unit)) {
       ++len;
-      if (!IsLatin1SequenceStart(code_unit)) {  // > U+00FF
+      if (!IsLatin1SequenceStart(code_unit)) {          // > U+00FF
         if (IsSupplementarySequenceStart(code_unit)) {  // >= U+10000
           char_type = kSupplementary;
           ++len;
@@ -99,10 +88,8 @@
         }
       }
       ch -= kMagicBits[num_trail_bytes];
-      if (!((is_malformed == false) &&
-            (j == num_trail_bytes) &&
-            !Utf::IsOutOfRange(ch) &&
-            !IsNonShortestForm(ch, j))) {
+      if (!((is_malformed == false) && (j == num_trail_bytes) &&
+            !Utf::IsOutOfRange(ch) && !IsNonShortestForm(ch, j))) {
         return false;
       }
     }
@@ -197,10 +184,8 @@
       }
     }
     ch -= kMagicBits[num_trail_bytes];
-    if (!((is_malformed == false) &&
-          (i == num_trail_bytes) &&
-          !Utf::IsOutOfRange(ch) &&
-          !IsNonShortestForm(ch, i))) {
+    if (!((is_malformed == false) && (i == num_trail_bytes) &&
+          !Utf::IsOutOfRange(ch) && !IsNonShortestForm(ch, i))) {
       *dst = -1;
       return 0;
     }
diff --git a/runtime/vm/unicode.h b/runtime/vm/unicode.h
index 6acf84f..5116863 100644
--- a/runtime/vm/unicode.h
+++ b/runtime/vm/unicode.h
@@ -38,8 +38,8 @@
 class Utf8 : AllStatic {
  public:
   enum Type {
-    kLatin1 = 0,  // Latin-1 code point [U+0000, U+00FF].
-    kBMP,  // Basic Multilingual Plane code point [U+0000, U+FFFF].
+    kLatin1 = 0,     // Latin-1 code point [U+0000, U+00FF].
+    kBMP,            // Basic Multilingual Plane code point [U+0000, U+FFFF].
     kSupplementary,  // Supplementary code point [U+010000, U+10FFFF].
   };
 
@@ -75,14 +75,12 @@
                             intptr_t array_len,
                             int32_t* dst,
                             intptr_t len);
-  static bool DecodeCStringToUTF32(const char* str,
-                                   int32_t* dst,
-                                   intptr_t len);
+  static bool DecodeCStringToUTF32(const char* str, int32_t* dst, intptr_t len);
 
-  static const int32_t kMaxOneByteChar   = 0x7F;
-  static const int32_t kMaxTwoByteChar   = 0x7FF;
+  static const int32_t kMaxOneByteChar = 0x7F;
+  static const int32_t kMaxTwoByteChar = 0x7FF;
   static const int32_t kMaxThreeByteChar = 0xFFFF;
-  static const int32_t kMaxFourByteChar  = Utf::kMaxCodePoint;
+  static const int32_t kMaxFourByteChar = Utf::kMaxCodePoint;
 
  private:
   static bool IsTrailByte(uint8_t code_unit) {
@@ -117,9 +115,7 @@
   }
 
   // Returns true if ch is a lead or trail surrogate.
-  static bool IsSurrogate(uint32_t ch) {
-    return (ch & 0xFFFFF800) == 0xD800;
-  }
+  static bool IsSurrogate(uint32_t ch) { return (ch & 0xFFFFF800) == 0xD800; }
 
   // Returns true if ch is a lead surrogate.
   static bool IsLeadSurrogate(uint32_t ch) {
diff --git a/runtime/vm/unicode_data.cc b/runtime/vm/unicode_data.cc
index e61eccb..d8fed1e 100644
--- a/runtime/vm/unicode_data.cc
+++ b/runtime/vm/unicode_data.cc
@@ -6,6 +6,7 @@
 
 namespace dart {
 
+// clang-format off
 const uint8_t CaseMapping::stage1_[261] = {
   0, 1, 2, 3, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 6, 6, 6,
   6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 9, 10, 6, 11, 6, 6, 12, 6, 6, 6,
@@ -679,5 +680,6 @@
   { 0, -10783 },  // U+2C6F
   { 0, -35332 },  // U+A77D
 };
+// clang-format on
 
 }  // namespace dart
diff --git a/runtime/vm/unicode_test.cc b/runtime/vm/unicode_test.cc
index 36fdf85..c8f6a26 100644
--- a/runtime/vm/unicode_test.cc
+++ b/runtime/vm/unicode_test.cc
@@ -12,7 +12,7 @@
   // Examples from the Unicode specification, chapter 3
   {
     const char* src = "\x41\xC3\xB1\x42";
-    int32_t expected[] = { 0x41, 0xF1, 0x42 };
+    int32_t expected[] = {0x41, 0xF1, 0x42};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -22,7 +22,7 @@
 
   {
     const char* src = "\x4D";
-    int32_t expected[] = { 0x4D };
+    int32_t expected[] = {0x4D};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -32,7 +32,7 @@
 
   {
     const char* src = "\xD0\xB0";
-    int32_t expected[] = { 0x430 };
+    int32_t expected[] = {0x430};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -42,7 +42,7 @@
 
   {
     const char* src = "\xE4\xBA\x8C";
-    int32_t expected[] = { 0x4E8C };
+    int32_t expected[] = {0x4E8C};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -52,7 +52,7 @@
 
   {
     const char* src = "\xF0\x90\x8C\x82";
-    int32_t expected[] = { 0x10302 };
+    int32_t expected[] = {0x10302};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -62,7 +62,7 @@
 
   {
     const char* src = "\x4D\xD0\xB0\xE4\xBA\x8C\xF0\x90\x8C\x82";
-    int32_t expected[] = { 0x4D, 0x430, 0x4E8C, 0x10302 };
+    int32_t expected[] = {0x4D, 0x430, 0x4E8C, 0x10302};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -72,12 +72,12 @@
 
   // Mixture of non-ASCII and ASCII characters
   {
-    const char* src = "\xD7\x92\xD7\x9C\xD7\xA2\xD7\x93"
-                      "\x20"
-                      "\xD7\x91\xD7\xA8\xD7\x9B\xD7\x94";
-    int32_t expected[] = { 0x5D2, 0x5DC, 0x5E2, 0x5D3,
-                           0x20,
-                           0x5D1, 0x5E8, 0x5DB, 0x5D4 };
+    const char* src =
+        "\xD7\x92\xD7\x9C\xD7\xA2\xD7\x93"
+        "\x20"
+        "\xD7\x91\xD7\xA8\xD7\x9B\xD7\x94";
+    int32_t expected[] = {0x5D2, 0x5DC, 0x5E2, 0x5D3, 0x20,
+                          0x5D1, 0x5E8, 0x5DB, 0x5D4};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -90,7 +90,7 @@
   // 1 - Some correct UTF-8 text
   {
     const char* src = "\xCE\xBA\xE1\xBD\xB9\xCF\x83\xCE\xBC\xCE\xB5";
-    int32_t expected[] = { 0x3BA, 0x1F79, 0x3C3, 0x3BC, 0x3B5 };
+    int32_t expected[] = {0x3BA, 0x1F79, 0x3C3, 0x3BC, 0x3B5};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -105,7 +105,7 @@
   // 2.1.1 - 1 byte (U-00000000):        "\x00"
   {
     const char* src = "\x00";
-    int32_t expected[] = { 0x0 };
+    int32_t expected[] = {0x0};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -116,7 +116,7 @@
   // 2.1.2 - 2 bytes (U-00000080):        "\xC2\x80"
   {
     const char* src = "\xC2\x80";
-    int32_t expected[] = { 0x80 };
+    int32_t expected[] = {0x80};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -127,7 +127,7 @@
   // 2.1.3 - 3 bytes (U-00000800):        "\xE0\xA0\x80"
   {
     const char* src = "\xE0\xA0\x80";
-    int32_t expected[] = { 0x800 };
+    int32_t expected[] = {0x800};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -138,7 +138,7 @@
   // 2.1.4 - 4 bytes (U-00010000):        "\xF0\x90\x80\x80"
   {
     const char* src = "\xF0\x90\x80\x80";
-    int32_t expected[] = { 0x10000 };
+    int32_t expected[] = {0x10000};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -149,7 +149,7 @@
   // 2.1.5 - 5 bytes (U-00200000):        "\xF8\x88\x80\x80\x80"
   {
     const char* src = "\xF8\x88\x80\x80\x80";
-    int32_t expected[] = { 0x200000 };
+    int32_t expected[] = {0x200000};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -160,7 +160,7 @@
   // 2.1.6 - 6 bytes (U-04000000):        "\xFC\x84\x80\x80\x80\x80"
   {
     const char* src = "\xFC\x84\x80\x80\x80\x80";
-    int32_t expected[] = { 0x400000 };
+    int32_t expected[] = {0x400000};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -173,7 +173,7 @@
   // 2.2.1 - 1 byte (U-0000007F):        "\x7F"
   {
     const char* src = "\x7F";
-    int32_t expected[] = { 0x7F };
+    int32_t expected[] = {0x7F};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -184,7 +184,7 @@
   // 2.2.2 - 2 bytes (U-000007FF):        "\xDF\xBF"
   {
     const char* src = "\xDF\xBF";
-    int32_t expected[] = { 0x7FF };
+    int32_t expected[] = {0x7FF};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -195,7 +195,7 @@
   // 2.2.3 - 3 bytes (U-0000FFFF):        "\xEF\xBF\xBF"
   {
     const char* src = "\xEF\xBF\xBF";
-    int32_t expected[] = { 0xFFFF };
+    int32_t expected[] = {0xFFFF};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -206,7 +206,7 @@
   // 2.2.4 - 4 bytes (U-001FFFFF):        "\xF7\xBF\xBF\xBF"
   {
     const char* src = "\xF7\xBF\xBF\xBF";
-    int32_t expected[] = { 0x1FFFF };
+    int32_t expected[] = {0x1FFFF};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -217,7 +217,7 @@
   // 2.2.5 - 5 bytes (U-03FFFFFF):        "\xFB\xBF\xBF\xBF\xBF"
   {
     const char* src = "\xFB\xBF\xBF\xBF\xBF";
-    int32_t expected[] = { 0x3FFFFFF };
+    int32_t expected[] = {0x3FFFFFF};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -228,7 +228,7 @@
   // 2.2.6 - 6 bytes (U-7FFFFFFF):        "\xFD\xBF\xBF\xBF\xBF\xBF"
   {
     const char* src = "\xFD\xBF\xBF\xBF\xBF\xBF";
-    int32_t expected[] = { 0x7FFFFFF };
+    int32_t expected[] = {0x7FFFFFF};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -241,7 +241,7 @@
   // 2.3.1 - U-0000D7FF = ed 9f bf = "\xED\x9F\xBF"
   {
     const char* src = "\xED\x9F\xBF";
-    int32_t expected[] = { 0xD7FF };
+    int32_t expected[] = {0xD7FF};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -252,7 +252,7 @@
   // 2.3.2 - U-0000E000 = ee 80 80 = "\xEE\x80\x80"
   {
     const char* src = "\xEE\x80\x80";
-    int32_t expected[] = { 0xE000 };
+    int32_t expected[] = {0xE000};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -263,7 +263,7 @@
   // 2.3.3 - U-0000FFFD = ef bf bd = "\xEF\xBF\xBD"
   {
     const char* src = "\xEF\xBF\xBD";
-    int32_t expected[] = { 0xFFFD };
+    int32_t expected[] = {0xFFFD};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -274,7 +274,7 @@
   // 2.3.4 - U-0010FFFF = f4 8f bf bf = "\xF4\x8F\xBF\xBF"
   {
     const char* src = "\xF4\x8F\xBF\xBF";
-    int32_t expected[] = { 0x10FFFF };
+    int32_t expected[] = {0x10FFFF};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -285,7 +285,7 @@
   // 2.3.5 - U-00110000 = f4 90 80 80 = "\xF4\x90\x80\x80"
   {
     const char* src = "\xF4\x90\x80\x80";
-    int32_t expected[] = { 0x110000 };
+    int32_t expected[] = {0x110000};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -300,7 +300,7 @@
   // 3.1.1 - First continuation byte 0x80: "\x80"
   {
     const char* src = "\x80";
-    int32_t expected[] = { 0x80 };
+    int32_t expected[] = {0x80};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -311,7 +311,7 @@
   // 3.1.2 - Last continuation byte 0xbf: "\xBF"
   {
     const char* src = "\xBF";
-    int32_t expected[] = { 0xBF };
+    int32_t expected[] = {0xBF};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -322,7 +322,7 @@
   // 3.1.3 - 2 continuation bytes: "\x80\xBF"
   {
     const char* src = "\x80\xBF";
-    int32_t expected[] = { 0x80, 0xBF };
+    int32_t expected[] = {0x80, 0xBF};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -333,7 +333,7 @@
   // 3.1.4 - 3 continuation bytes: "\x80\xBF\x80"
   {
     const char* src = "\x80\xBF\x80";
-    int32_t expected[] = { 0x80, 0xBF, 0x80 };
+    int32_t expected[] = {0x80, 0xBF, 0x80};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -344,7 +344,7 @@
   // 3.1.5 - 4 continuation bytes: "\x80\xBF\x80\xBF"
   {
     const char* src = "\x80\xBF\x80\xBF";
-    int32_t expected[] = { 0x80, 0xBF, 0x80, 0xBF  };
+    int32_t expected[] = {0x80, 0xBF, 0x80, 0xBF};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -355,7 +355,7 @@
   // 3.1.6 - 5 continuation bytes: "\x80\xBF\x80\xBF\x80"
   {
     const char* src = "\x80\xBF\x80\xBF\x80";
-    int32_t expected[] = { 0x80, 0xBF, 0x80, 0xBF, 0x80 };
+    int32_t expected[] = {0x80, 0xBF, 0x80, 0xBF, 0x80};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -366,7 +366,7 @@
   // 3.1.7 - 6 continuation bytes: "\x80\xBF\x80\xBF\x80\xBF"
   {
     const char* src = "\x80\xBF\x80\xBF\x80\xBF";
-    int32_t expected[] = { 0x80, 0xBF, 0x80, 0xBF, 0x80, 0xBF };
+    int32_t expected[] = {0x80, 0xBF, 0x80, 0xBF, 0x80, 0xBF};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -377,7 +377,7 @@
   // 3.1.8 - 7 continuation bytes: "\x80\xBF\x80\xBF\x80\xBF\x80"
   {
     const char* src = "\x80\xBF\x80\xBF\x80\xBF\x80";
-    int32_t expected[] = { 0x80, 0xBF, 0x80, 0xBF, 0x80, 0xBF, 0x80 };
+    int32_t expected[] = {0x80, 0xBF, 0x80, 0xBF, 0x80, 0xBF, 0x80};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -387,15 +387,16 @@
 
   // 3.1.9 - Sequence of all 64 possible continuation bytes (0x80-0xbf):
   {
-    const char* src = "\x80\x81\x82\x83\x84\x85\x86\x87"
-                      "\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F"
-                      "\x90\x91\x92\x93\x94\x95\x96\x97"
-                      "\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F"
-                      "\xA0\xA1\xA2\xA3\xA4\xA5\xA6\xA7"
-                      "\xA8\xA9\xAA\xAB\xAC\xAD\xAE\xAF"
-                      "\xB0\xB1\xB2\xB3\xB4\xB5\xB6\xB7"
-                      "\xB8\xB9\xBA\xBB\xBC\xBD\xBE\xBF";
-    int32_t expected[] = { 0x0 };
+    const char* src =
+        "\x80\x81\x82\x83\x84\x85\x86\x87"
+        "\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F"
+        "\x90\x91\x92\x93\x94\x95\x96\x97"
+        "\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F"
+        "\xA0\xA1\xA2\xA3\xA4\xA5\xA6\xA7"
+        "\xA8\xA9\xAA\xAB\xAC\xAD\xAE\xAF"
+        "\xB0\xB1\xB2\xB3\xB4\xB5\xB6\xB7"
+        "\xB8\xB9\xBA\xBB\xBC\xBD\xBE\xBF";
+    int32_t expected[] = {0x0};
     int32_t dst[ARRAY_SIZE(expected)];
     for (size_t i = 0; i < strlen(src); ++i) {
       memset(dst, 0xFF, sizeof(dst));
@@ -410,15 +411,16 @@
   // 3.2.1 - All 32 first bytes of 2-byte sequences (0xc0-0xdf), each
   //         followed by a space character:
   {
-    const char* src = "\xC0\x20\xC1\x20\xC2\x20\xC3\x20"
-                      "\xC4\x20\xC5\x20\xC6\x20\xC7\x20"
-                      "\xC8\x20\xC9\x20\xCA\x20\xCB\x20"
-                      "\xCC\x20\xCD\x20\xCE\x20\xCF\x20"
-                      "\xD0\x20\xD1\x20\xD2\x20\xD3\x20"
-                      "\xD4\x20\xD5\x20\xD6\x20\xD7\x20"
-                      "\xD8\x20\xD9\x20\xDA\x20\xDB\x20"
-                      "\xDC\x20\xDD\x20\xDE\x20\xDF\x20";
-    int32_t expected[] = { 0x0 };
+    const char* src =
+        "\xC0\x20\xC1\x20\xC2\x20\xC3\x20"
+        "\xC4\x20\xC5\x20\xC6\x20\xC7\x20"
+        "\xC8\x20\xC9\x20\xCA\x20\xCB\x20"
+        "\xCC\x20\xCD\x20\xCE\x20\xCF\x20"
+        "\xD0\x20\xD1\x20\xD2\x20\xD3\x20"
+        "\xD4\x20\xD5\x20\xD6\x20\xD7\x20"
+        "\xD8\x20\xD9\x20\xDA\x20\xDB\x20"
+        "\xDC\x20\xDD\x20\xDE\x20\xDF\x20";
+    int32_t expected[] = {0x0};
     int32_t dst[ARRAY_SIZE(expected)];
     for (size_t i = 0; i < strlen(src); i += 2) {
       memset(dst, 0xFF, sizeof(dst));
@@ -431,11 +433,12 @@
   // 3.2.2 - All 16 first bytes of 3-byte sequences (0xe0-0xef), each
   //         followed by a space character:
   {
-    const char* src = "\xE0\x20\xE1\x20\xE2\x20\xE3\x20"
-                      "\xE4\x20\xE5\x20\xE6\x20\xE7\x20"
-                      "\xE8\x20\xE9\x20\xEA\x20\xEB\x20"
-                      "\xEC\x20\xED\x20\xEE\x20\xEF\x20";
-    int32_t expected[] = { 0x0 };
+    const char* src =
+        "\xE0\x20\xE1\x20\xE2\x20\xE3\x20"
+        "\xE4\x20\xE5\x20\xE6\x20\xE7\x20"
+        "\xE8\x20\xE9\x20\xEA\x20\xEB\x20"
+        "\xEC\x20\xED\x20\xEE\x20\xEF\x20";
+    int32_t expected[] = {0x0};
     int32_t dst[ARRAY_SIZE(expected)];
     for (size_t i = 0; i < strlen(src); i += 2) {
       memset(dst, 0xFF, sizeof(dst));
@@ -448,9 +451,10 @@
   // 3.2.3 - All 8 first bytes of 4-byte sequences (0xf0-0xf7), each
   //         followed by a space character:
   {
-    const char* src = "\xF0\x20\xF1\x20\xF2\x20\xF3\x20"
-                      "\xF4\x20\xF5\x20\xF6\x20\xF7\x20";
-    int32_t expected[] = { 0x0 };
+    const char* src =
+        "\xF0\x20\xF1\x20\xF2\x20\xF3\x20"
+        "\xF4\x20\xF5\x20\xF6\x20\xF7\x20";
+    int32_t expected[] = {0x0};
     int32_t dst[ARRAY_SIZE(expected)];
     for (size_t i = 0; i < strlen(src); i += 2) {
       memset(dst, 0xFF, sizeof(dst));
@@ -464,7 +468,7 @@
   //         followed by a space character:
   {
     const char* src = "\xF8\x20\xF9\x20\xFA\x20\xFB\x20";
-    int32_t expected[] = { 0x0 };
+    int32_t expected[] = {0x0};
     int32_t dst[ARRAY_SIZE(expected)];
     for (size_t i = 0; i < strlen(src); i += 2) {
       memset(dst, 0xFF, sizeof(dst));
@@ -478,7 +482,7 @@
   //         followed by a space character:
   {
     const char* src = "\xFC\x20\xFD\x20";
-    int32_t expected[] = { 0x0 };
+    int32_t expected[] = {0x0};
     int32_t dst[ARRAY_SIZE(expected)];
     for (size_t i = 0; i < strlen(src); i += 2) {
       memset(dst, 0xFF, sizeof(dst));
@@ -493,7 +497,7 @@
   // 3.3.1 - 2-byte sequence with last byte missing (U+0000): "\xC0"
   {
     const char* src = "\xC0";
-    int32_t expected[] = { 0x0 };
+    int32_t expected[] = {0x0};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -504,7 +508,7 @@
   // 3.3.2 - 3-byte sequence with last byte missing (U+0000): "\xE0\x80"
   {
     const char* src = "\xE0\x80";
-    int32_t expected[] = { 0x0 };
+    int32_t expected[] = {0x0};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -515,7 +519,7 @@
   // 3.3.3 - 4-byte sequence with last byte missing (U+0000): "\xF0\x80\x80"
   {
     const char* src = "\xF0\x80\x80";
-    int32_t expected[] = { 0x0 };
+    int32_t expected[] = {0x0};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -526,7 +530,7 @@
   // 3.3.4 - 5-byte sequence with last byte missing (U+0000): "\xF8\x80\x80\x80"
   {
     const char* src = "\xF8\x80\x80\x80";
-    int32_t expected[] = { 0x0 };
+    int32_t expected[] = {0x0};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -538,7 +542,7 @@
   // "\xFC\x80\x80\x80\x80"
   {
     const char* src = "\xFC\x80\x80\x80\x80";
-    int32_t expected[] = { 0x0 };
+    int32_t expected[] = {0x0};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -549,7 +553,7 @@
   // 3.3.6 - 2-byte sequence with last byte missing (U-000007FF): "\xDF"
   {
     const char* src = "\xDF";
-    int32_t expected[] = { 0x0 };
+    int32_t expected[] = {0x0};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -560,7 +564,7 @@
   // 3.3.7 - 3-byte sequence with last byte missing (U-0000FFFF): "\xEF\xBF"
   {
     const char* src = "\xEF\xBF";
-    int32_t expected[] = { 0x0 };
+    int32_t expected[] = {0x0};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -571,7 +575,7 @@
   // 3.3.8 - 4-byte sequence with last byte missing (U-001FFFFF): "\xF7\xBF\xBF"
   {
     const char* src = "\xF7\xBF\xBF";
-    int32_t expected[] = { 0x0 };
+    int32_t expected[] = {0x0};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -583,7 +587,7 @@
   // "\xFB\xBF\xBF\xBF"
   {
     const char* src = "\xFB\xBF\xBF\xBF";
-    int32_t expected[] = { 0x0 };
+    int32_t expected[] = {0x0};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -595,7 +599,7 @@
   // "\xFD\xBF\xBF\xBF\xBF"
   {
     const char* src = "\xFD\xBF\xBF\xBF\xBF";
-    int32_t expected[] = { 0x0 };
+    int32_t expected[] = {0x0};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -605,18 +609,19 @@
 
   // 3.4 - Concatenation of incomplete sequences
   {
-    const char* src = "\xC0\xE0\x80\xF0\x80\x80"
-                      "\xF8\x80\x80\x80\xFC\x80"
-                      "\x80\x80\x80\xDF\xEF\xBF"
-                      "\xF7\xBF\xBF\xFB\xBF\xBF"
-                      "\xBF\xFD\xBF\xBF\xBF\xBF";
-    int32_t expected[] = { 0x0 };
+    const char* src =
+        "\xC0\xE0\x80\xF0\x80\x80"
+        "\xF8\x80\x80\x80\xFC\x80"
+        "\x80\x80\x80\xDF\xEF\xBF"
+        "\xF7\xBF\xBF\xFB\xBF\xBF"
+        "\xBF\xFD\xBF\xBF\xBF\xBF";
+    int32_t expected[] = {0x0};
     int32_t dst[ARRAY_SIZE(expected)];
     for (size_t i = 0; i < strlen(src); ++i) {
       for (size_t j = 1; j < (strlen(src) - i); ++j) {
         memset(dst, 0xFF, sizeof(dst));
-        bool is_valid = Utf8::DecodeCStringToUTF32(&src[i],
-                                                   dst, ARRAY_SIZE(dst));
+        bool is_valid =
+            Utf8::DecodeCStringToUTF32(&src[i], dst, ARRAY_SIZE(dst));
         EXPECT(!is_valid);
         EXPECT(memcmp(expected, dst, sizeof(expected)));
       }
@@ -628,7 +633,7 @@
   // 3.5.1 - fe = "\xFE"
   {
     const char* src = "\xFE";
-    int32_t expected[] = { 0xFE };
+    int32_t expected[] = {0xFE};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -639,7 +644,7 @@
   // 3.5.2 - ff = "\xFF"
   {
     const char* src = "\xFF";
-    int32_t expected[] = { 0xFF };
+    int32_t expected[] = {0xFF};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -650,7 +655,7 @@
   // 3.5.3 - fe fe ff ff = "\xFE\xFE\xFF\xFF"
   {
     const char* src = "\xFE\xFE\xFF\xFF";
-    int32_t expected[] = { 0xFF };
+    int32_t expected[] = {0xFF};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -665,7 +670,7 @@
   // 4.1.1 - U+002F = c0 af             = "\xC0\xAF"
   {
     const char* src = "\xC0\xAF";
-    int32_t expected[] = { 0x2F };
+    int32_t expected[] = {0x2F};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -676,7 +681,7 @@
   // 4.1.2 - U+002F = e0 80 af          = "\xE0\x80\xAF"
   {
     const char* src = "\xE0\x80\xAF";
-    int32_t expected[] = { 0x2F };
+    int32_t expected[] = {0x2F};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -687,7 +692,7 @@
   // 4.1.3 - U+002F = f0 80 80 af       = "\xF0\x80\x80\xAF"
   {
     const char* src = "\xF0\x80\x80\xAF";
-    int32_t expected[] = { 0x2F };
+    int32_t expected[] = {0x2F};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -698,7 +703,7 @@
   // 4.1.4 - U+002F = f8 80 80 80 af    = "\xF8\x80\x80\x80\xAF"
   {
     const char* src = "\xF8\x80\x80\x80\xAF";
-    int32_t expected[] = { 0x2F };
+    int32_t expected[] = {0x2F};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -709,7 +714,7 @@
   // 4.1.5 - U+002F = fc 80 80 80 80 af = "\xFC\x80\x80\x80\x80\xAF"
   {
     const char* src = "\xFC\x80\x80\x80\x80\xAF";
-    int32_t expected[] = { 0x2F };
+    int32_t expected[] = {0x2F};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -722,7 +727,7 @@
   // 4.2.1 - U-0000007F = c1 bf             = "\xC1\xBF"
   {
     const char* src = "\xC1\xBF";
-    int32_t expected[] = { 0x7F };
+    int32_t expected[] = {0x7F};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -733,7 +738,7 @@
   // 4.2.2 U+000007FF = e0 9f bf          = "\xE0\x9F\xBF"
   {
     const char* src = "\xE0\x9F\xBF";
-    int32_t expected[] = { 0x7FF };
+    int32_t expected[] = {0x7FF};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -744,7 +749,7 @@
   // 4.2.3 - U+0000FFFF = f0 8f bf bf       = "\xF0\x8F\xBF\xBF"
   {
     const char* src = "\xF0\x8F\xBF\xBF";
-    int32_t expected[] = { 0xFFFF };
+    int32_t expected[] = {0xFFFF};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -755,7 +760,7 @@
   // 4.2.4  U-001FFFFF = f8 87 bf bf bf    = "\xF8\x87\xBF\xBF\xBF"
   {
     const char* src = "\xF8\x87\xBF\xBF\xBF";
-    int32_t expected[] = { 0x1FFFFF };
+    int32_t expected[] = {0x1FFFFF};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -766,7 +771,7 @@
   // 4.2.5  U-03FFFFFF = fc 83 bf bf bf bf = "\xFC\x83\xBF\xBF\xBF\xBF"
   {
     const char* src = "\xFC\x83\xBF\xBF\xBF\xBF";
-    int32_t expected[] = { 0x3FFFFFF };
+    int32_t expected[] = {0x3FFFFFF};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -779,7 +784,7 @@
   // 4.3.1 - U+0000 = "\xC0\x80"
   {
     const char* src = "\xC0\x80";
-    int32_t expected[] = { 0x0 };
+    int32_t expected[] = {0x0};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -790,7 +795,7 @@
   // 4.3.2  U+0000 = e0 80 80 = "\xE0\x80\x80"
   {
     const char* src = "\xE0\x80\x80";
-    int32_t expected[] = { 0x0 };
+    int32_t expected[] = {0x0};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -801,7 +806,7 @@
   // 4.3.3  U+0000 = f0 80 80 80 = "\xF0\x80\x80\x80"
   {
     const char* src = "\xF0\x80\x80\x80";
-    int32_t expected[] = { 0x0 };
+    int32_t expected[] = {0x0};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -812,7 +817,7 @@
   // 4.3.4  U+0000 = f8 80 80 80 80 = "\xF8\x80\x80\x80\x80"
   {
     const char* src = "\xF8\x80\x80\x80\x80";
-    int32_t expected[] = { 0x0 };
+    int32_t expected[] = {0x0};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -823,7 +828,7 @@
   // 4.3.5  U+0000 = fc 80 80 80 80 80 = "\xFC\x80\x80\x80\x80\x80"
   {
     const char* src = "\xFC\x80\x80\x80\x80\x80";
-    int32_t expected[] = { 0x0 };
+    int32_t expected[] = {0x0};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -838,7 +843,7 @@
   // 5.1.1 - U+D800 = ed a0 80 = "\xED\xA0\x80"
   {
     const char* src = "\xED\xA0\x80";
-    int32_t expected[] = { 0xD800 };
+    int32_t expected[] = {0xD800};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -849,7 +854,7 @@
   // 5.1.2 - U+DB7F = ed ad bf = "\xED\xAD\xBF"
   {
     const char* src = "\xED\xAD\xBF";
-    int32_t expected[] = { 0xDB7F };
+    int32_t expected[] = {0xDB7F};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -860,7 +865,7 @@
   // 5.1.3 - U+DB80 = ed ae 80 = "\xED\xAE\x80"
   {
     const char* src = "\xED\xAE\x80";
-    int32_t expected[] = { 0xDB80 };
+    int32_t expected[] = {0xDB80};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -871,7 +876,7 @@
   // 5.1.4 - U+DBFF = ed af bf = "\xED\xAF\xBF"
   {
     const char* src = "\xED\xAF\xBF";
-    int32_t expected[] = { 0xDBFF };
+    int32_t expected[] = {0xDBFF};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -882,7 +887,7 @@
   // 5.1.5 - U+DC00 = ed b0 80 = "\xED\xB0\x80"
   {
     const char* src = "\xED\xB0\x80";
-    int32_t expected[] = { 0xDC00 };
+    int32_t expected[] = {0xDC00};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -893,7 +898,7 @@
   // 5.1.6 - U+DF80 = ed be 80 = "\xED\xBE\x80"
   {
     const char* src = "\xED\xBE\x80";
-    int32_t expected[] = { 0xDF80 };
+    int32_t expected[] = {0xDF80};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -904,7 +909,7 @@
   // 5.1.7 - U+DFFF = ed bf bf = "\xED\xBF\xBF"
   {
     const char* src = "\xED\xBF\xBF";
-    int32_t expected[] = { 0xDFFF };
+    int32_t expected[] = {0xDFFF};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -922,7 +927,7 @@
   // 5.2.1 - U+D800 U+DC00 = ed a0 80 ed b0 80 = "\xED\xA0\x80\xED\xB0\x80"
   {
     const char* src = "\xED\xA0\x80\xED\xB0\x80";
-    int32_t expected[] = { 0xD800, 0xDC00 };
+    int32_t expected[] = {0xD800, 0xDC00};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -933,7 +938,7 @@
   // 5.2.2 - U+D800 U+DFFF = ed a0 80 ed bf bf = "\xED\xA0\x80\xED\xBF\xBF"
   {
     const char* src = "\xED\xA0\x80\xED\xBF\xBF";
-    int32_t expected[] = { 0xD800, 0xDFFF };
+    int32_t expected[] = {0xD800, 0xDFFF};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -944,7 +949,7 @@
   // 5.2.3 - U+DB7F U+DC00 = ed a0 80 ed bf bf = "\xED\xAD\xBF\xED\xB0\x80"
   {
     const char* src = "\xED\xAD\xBF\xED\xB0\x80";
-    int32_t expected[] = { 0xDB7F, 0xDC00 };
+    int32_t expected[] = {0xDB7F, 0xDC00};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -955,7 +960,7 @@
   // 5.2.4 - U+DB7F U+DFFF = ed ad bf ed bf bf = "\xED\xAD\xBF\xED\xBF\xBF"
   {
     const char* src = "\xED\xAD\xBF\xED\xBF\xBF";
-    int32_t expected[] = { 0xDB7F, 0xDFFF };
+    int32_t expected[] = {0xDB7F, 0xDFFF};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -966,7 +971,7 @@
   // 5.2.5 - U+DB80 U+DC00 = ed ae 80 ed b0 80 = "\xED\xAE\x80\xED\xB0\x80"
   {
     const char* src = "\xED\xAE\x80\xED\xB0\x80";
-    int32_t expected[] = { 0xDB80, 0xDC00 };
+    int32_t expected[] = {0xDB80, 0xDC00};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -977,7 +982,7 @@
   // 5.2.6 - U+DB80 U+DFFF = ed ae 80 ed bf bf = "\xED\xAE\x80\xED\xBF\xBF"
   {
     const char* src = "\xED\xAE\x80\xED\xBF\xBF";
-    int32_t expected[] = { 0xDB80, 0xDFFF };
+    int32_t expected[] = {0xDB80, 0xDFFF};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -988,7 +993,7 @@
   // 5.2.7 - U+DBFF U+DC00 = ed af bf ed b0 80 = "\xED\xAF\xBF\xED\xB0\x80"
   {
     const char* src = "\xED\xAF\xBF\xED\xB0\x80";
-    int32_t expected[] = { 0xDBFF, 0xDC00 };
+    int32_t expected[] = {0xDBFF, 0xDC00};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -999,7 +1004,7 @@
   // 5.2.8 - U+DBFF U+DFFF = ed af bf ed bf bf = "\xED\xAF\xBF\xED\xBF\xBF"
   {
     const char* src = "\xED\xAF\xBF\xED\xBF\xBF";
-    int32_t expected[] = { 0xDBFF, 0xDFFF };
+    int32_t expected[] = {0xDBFF, 0xDFFF};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -1012,7 +1017,7 @@
   // 5.3.1 - U+FFFE = ef bf be = "\xEF\xBF\xBE"
   {
     const char* src = "\xEF\xBF\xBE";
-    int32_t expected[] = { 0xFFFE };
+    int32_t expected[] = {0xFFFE};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
@@ -1023,7 +1028,7 @@
   // 5.3.2 - U+FFFF = ef bf bf = "\xEF\xBF\xBF"
   {
     const char* src = "\xEF\xBF\xBF";
-    int32_t expected[] = { 0xFFFF };
+    int32_t expected[] = {0xFFFF};
     int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
diff --git a/runtime/vm/unit_test.cc b/runtime/vm/unit_test.cc
index b507c00..1c138e7 100644
--- a/runtime/vm/unit_test.cc
+++ b/runtime/vm/unit_test.cc
@@ -54,8 +54,8 @@
 Dart_Isolate TestCase::CreateIsolate(const uint8_t* buffer, const char* name) {
   bin::IsolateData* isolate_data = new bin::IsolateData(name, NULL, NULL);
   char* err;
-  Dart_Isolate isolate = Dart_CreateIsolate(
-      name, NULL, buffer, NULL, isolate_data, &err);
+  Dart_Isolate isolate =
+      Dart_CreateIsolate(name, NULL, buffer, NULL, isolate_data, &err);
   if (isolate == NULL) {
     OS::Print("Creation of isolate failed '%s'\n", err);
     free(err);
@@ -118,8 +118,7 @@
   const char* kIsolateReloadTestLibUri = "test:isolate_reload_helper";
   static const intptr_t kIsolateReloadTestLibUriLen =
       strlen(kIsolateReloadTestLibUri);
-  return (strncmp(url_name,
-                  kIsolateReloadTestLibUri,
+  return (strncmp(url_name, kIsolateReloadTestLibUri,
                   kIsolateReloadTestLibUriLen) == 0);
 }
 
@@ -149,8 +148,7 @@
   Dart_Handle dart_args[kNumArgs];
   dart_args[0] = DartUtils::NewString(uri_chars);
   return Dart_Invoke(DartUtils::BuiltinLib(),
-                     DartUtils::NewString("_filePathFromUri"),
-                     kNumArgs,
+                     DartUtils::NewString("_filePathFromUri"), kNumArgs,
                      dart_args);
 }
 
@@ -170,16 +168,11 @@
   if (tag == Dart_kScriptTag) {
     // Reload request.
     ASSERT(script_reload_key != kUnsetThreadLocalKey);
-    const char* script_source =
-       reinterpret_cast<const char*>(
-           OSThread::GetThreadLocal(script_reload_key));
+    const char* script_source = reinterpret_cast<const char*>(
+        OSThread::GetThreadLocal(script_reload_key));
     ASSERT(script_source != NULL);
     OSThread::SetThreadLocal(script_reload_key, 0);
-    return Dart_LoadScript(url,
-                           Dart_Null(),
-                           NewString(script_source),
-                           0,
-                           0);
+    return Dart_LoadScript(url, Dart_Null(), NewString(script_source), 0, 0);
   }
   if (!Dart_IsLibrary(library)) {
     return Dart_NewApiError("not a library");
@@ -217,20 +210,19 @@
     Dart_Handle source = Dart_NewStringFromCString(lib_source);
     return Dart_LoadLibrary(url, Dart_Null(), source, 0, 0);
   }
-  NOT_IN_PRODUCT(
+#if !defined(PRODUCT)
   if (IsIsolateReloadTestLib(url_chars)) {
     Dart_Handle library =
         Dart_LoadLibrary(url, Dart_Null(), IsolateReloadTestLibSource(), 0, 0);
     DART_CHECK_VALID(library);
     Dart_SetNativeResolver(library, IsolateReloadTestNativeResolver, 0);
     return library;
-  })
+  }
+#endif
   if (is_io_library) {
     ASSERT(tag == Dart_kSourceTag);
-    return Dart_LoadSource(library,
-                           url, Dart_Null(),
-                           Builtin::PartSource(Builtin::kIOLibrary,
-                                               url_chars),
+    return Dart_LoadSource(library, url, Dart_Null(),
+                           Builtin::PartSource(Builtin::kIOLibrary, url_chars),
                            0, 0);
   }
   Dart_Handle resolved_url = url;
@@ -378,27 +370,22 @@
 
 
 void AssemblerTest::Assemble() {
-  const String& function_name = String::ZoneHandle(
-      Symbols::New(Thread::Current(), name_));
+  const String& function_name =
+      String::ZoneHandle(Symbols::New(Thread::Current(), name_));
 
   // We make a dummy script so that exception objects can be composed for
   // assembler instructions that do runtime calls, in particular on DBC.
   const char* kDummyScript = "assembler_test_dummy_function() {}";
-  const Script& script = Script::Handle(Script::New(
-      function_name,
-      String::Handle(String::New(kDummyScript)),
-      RawScript::kSourceTag));
+  const Script& script = Script::Handle(
+      Script::New(function_name, String::Handle(String::New(kDummyScript)),
+                  RawScript::kSourceTag));
   script.Tokenize(String::Handle());
   const Library& lib = Library::Handle(Library::CoreLibrary());
   const Class& cls = Class::ZoneHandle(
-      Class::New(lib,
-                 function_name,
-                 script,
-                 TokenPosition::kMinSource));
+      Class::New(lib, function_name, script, TokenPosition::kMinSource));
   Function& function = Function::ZoneHandle(
-      Function::New(function_name, RawFunction::kRegularFunction,
-                    true, false, false, false, false, cls,
-                    TokenPosition::kMinSource));
+      Function::New(function_name, RawFunction::kRegularFunction, true, false,
+                    false, false, false, cls, TokenPosition::kMinSource));
   code_ = Code::FinalizeCode(function, assembler_);
   code_.set_owner(function);
   code_.set_exception_handlers(Object::empty_exception_handlers());
@@ -416,22 +403,21 @@
 
 
 CodeGenTest::CodeGenTest(const char* name)
-  : function_(Function::ZoneHandle()),
-    node_sequence_(new SequenceNode(TokenPosition::kMinSource,
-                                    new LocalScope(NULL, 0, 0))),
-    default_parameter_values_(new ZoneGrowableArray<const Instance*> ()) {
+    : function_(Function::ZoneHandle()),
+      node_sequence_(new SequenceNode(TokenPosition::kMinSource,
+                                      new LocalScope(NULL, 0, 0))),
+      default_parameter_values_(new ZoneGrowableArray<const Instance*>()) {
   ASSERT(name != NULL);
-  const String& function_name = String::ZoneHandle(
-      Symbols::New(Thread::Current(), name));
+  const String& function_name =
+      String::ZoneHandle(Symbols::New(Thread::Current(), name));
   // Add function to a class and that class to the class dictionary so that
   // frame walking can be used.
   Library& lib = Library::Handle(Library::CoreLibrary());
-  const Class& cls = Class::ZoneHandle(
-      Class::New(lib, function_name, Script::Handle(),
-                  TokenPosition::kMinSource));
-  function_ = Function::New(
-      function_name, RawFunction::kRegularFunction,
-      true, false, false, false, false, cls, TokenPosition::kMinSource);
+  const Class& cls = Class::ZoneHandle(Class::New(
+      lib, function_name, Script::Handle(), TokenPosition::kMinSource));
+  function_ =
+      Function::New(function_name, RawFunction::kRegularFunction, true, false,
+                    false, false, false, cls, TokenPosition::kMinSource);
   function_.set_result_type(Type::Handle(Type::DynamicType()));
   const Array& functions = Array::Handle(Array::New(1));
   functions.SetAt(0, function_);
@@ -447,8 +433,7 @@
   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());
+  node_sequence_->scope()->AddVariable(parsed_function->current_context_var());
   parsed_function->EnsureExpressionTemp();
   node_sequence_->scope()->AddVariable(parsed_function->expression_temp_var());
   parsed_function->AllocateVariables();
@@ -464,8 +449,7 @@
   ASSERT(isolate != NULL);
   const Error& error = Error::Handle(Compiler::Compile(library, script));
   if (!error.IsNull()) {
-    OS::Print("Error compiling test script:\n%s\n",
-    error.ToErrorCString());
+    OS::Print("Error compiling test script:\n%s\n", error.ToErrorCString());
   }
   return error.IsNull();
 }
@@ -475,8 +459,8 @@
   Thread* thread = Thread::Current();
   ASSERT(thread != NULL);
   ASSERT(ClassFinalizer::AllClassesFinalized());
-  const Error& error = Error::Handle(Compiler::CompileFunction(thread,
-                                                               function));
+  const Error& error =
+      Error::Handle(Compiler::CompileFunction(thread, function));
   return error.IsNull();
 }
 
diff --git a/runtime/vm/unit_test.h b/runtime/vm/unit_test.h
index 61d0715..c08f36e 100644
--- a/runtime/vm/unit_test.h
+++ b/runtime/vm/unit_test.h
@@ -34,8 +34,7 @@
 // this macro is transitioned from kThreadInNative to kThreadInVM.
 #define VM_TEST_CASE(name)                                                     \
   static void Dart_TestHelper##name(Thread* thread);                           \
-  UNIT_TEST_CASE(name)                                                         \
-  {                                                                            \
+  UNIT_TEST_CASE(name) {                                                       \
     TestIsolateScope __test_isolate__;                                         \
     Thread* __thread__ = Thread::Current();                                    \
     ASSERT(__thread__->isolate() == __test_isolate__.isolate());               \
@@ -52,8 +51,7 @@
 // execution state of threads using this macro remains kThreadNative.
 #define TEST_CASE(name)                                                        \
   static void Dart_TestHelper##name(Thread* thread);                           \
-  UNIT_TEST_CASE(name)                                                         \
-  {                                                                            \
+  UNIT_TEST_CASE(name) {                                                       \
     TestIsolateScope __test_isolate__;                                         \
     Thread* __thread__ = Thread::Current();                                    \
     ASSERT(__thread__->isolate() == __test_isolate__.isolate());               \
@@ -80,7 +78,7 @@
   static void AssemblerTestRun##name(AssemblerTest* test);                     \
   VM_TEST_CASE(name) {                                                         \
     Assembler __assembler__;                                                   \
-    AssemblerTest test(""#name, &__assembler__);                               \
+    AssemblerTest test("" #name, &__assembler__);                              \
     AssemblerTestGenerate##name(test.assembler());                             \
     test.Assemble();                                                           \
     AssemblerTestRun##name(&test);                                             \
@@ -102,7 +100,7 @@
 #define CODEGEN_TEST_RUN(name, expected)                                       \
   static void CodeGenTestRun##name(const Function& function);                  \
   VM_TEST_CASE(name) {                                                         \
-    CodeGenTest __test__(""#name);                                             \
+    CodeGenTest __test__("" #name);                                            \
     CodeGenTestGenerate##name(&__test__);                                      \
     __test__.Compile();                                                        \
     CodeGenTestRun##name(__test__.function());                                 \
@@ -122,7 +120,7 @@
 #define CODEGEN_TEST_RAW_RUN(name, function)                                   \
   static void CodeGenTestRun##name(const Function& function);                  \
   VM_TEST_CASE(name) {                                                         \
-    CodeGenTest __test__(""#name);                                             \
+    CodeGenTest __test__("" #name);                                            \
     CodeGenTestGenerate##name(&__test__);                                      \
     __test__.Compile();                                                        \
     CodeGenTestRun##name(__test__.function());                                 \
@@ -136,11 +134,11 @@
   static void CodeGenTestRun##name1(const Function& function);                 \
   VM_TEST_CASE(name1) {                                                        \
     /* Generate code for name2 */                                              \
-    CodeGenTest __test2__(""#name2);                                           \
+    CodeGenTest __test2__("" #name2);                                          \
     CodeGenTestGenerate##name2(&__test2__);                                    \
     __test2__.Compile();                                                       \
     /* Generate code for name1, providing function2 */                         \
-    CodeGenTest __test1__(""#name1);                                           \
+    CodeGenTest __test1__("" #name1);                                          \
     CodeGenTestGenerate##name1(__test2__.function(), &__test1__);              \
     __test1__.Compile();                                                       \
     CodeGenTestRun##name1(__test1__.function());                               \
@@ -155,85 +153,76 @@
   }
 
 
-#if defined(TARGET_ARCH_ARM) ||                                                \
-    defined(TARGET_ARCH_MIPS) ||                                               \
+#if defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_MIPS) ||                   \
     defined(TARGET_ARCH_ARM64)
-#if defined(HOST_ARCH_ARM) ||                                                  \
-    defined(HOST_ARCH_MIPS) ||                                                 \
+#if defined(HOST_ARCH_ARM) || defined(HOST_ARCH_MIPS) ||                       \
     defined(HOST_ARCH_ARM64)
 // Running on actual ARM or MIPS hardware, execute code natively.
 #define EXECUTE_TEST_CODE_INT32(name, entry) reinterpret_cast<name>(entry)()
 #define EXECUTE_TEST_CODE_INT64(name, entry) reinterpret_cast<name>(entry)()
 #define EXECUTE_TEST_CODE_INT64_LL(name, entry, long_arg0, long_arg1)          \
-    reinterpret_cast<name>(entry)(long_arg0, long_arg1)
+  reinterpret_cast<name>(entry)(long_arg0, long_arg1)
 #define EXECUTE_TEST_CODE_FLOAT(name, entry) reinterpret_cast<name>(entry)()
 #define EXECUTE_TEST_CODE_DOUBLE(name, entry) reinterpret_cast<name>(entry)()
 #define EXECUTE_TEST_CODE_INT32_F(name, entry, float_arg)                      \
-    reinterpret_cast<name>(entry)(float_arg)
+  reinterpret_cast<name>(entry)(float_arg)
 #define EXECUTE_TEST_CODE_INT32_D(name, entry, double_arg)                     \
-    reinterpret_cast<name>(entry)(double_arg)
+  reinterpret_cast<name>(entry)(double_arg)
 #define EXECUTE_TEST_CODE_INTPTR_INTPTR(name, entry, pointer_arg)              \
-    reinterpret_cast<name>(entry)(pointer_arg)
+  reinterpret_cast<name>(entry)(pointer_arg)
 #define EXECUTE_TEST_CODE_INT32_INTPTR(name, entry, pointer_arg)               \
-    reinterpret_cast<name>(entry)(pointer_arg)
+  reinterpret_cast<name>(entry)(pointer_arg)
 #else
 // Not running on ARM or MIPS hardware, call simulator to execute code.
 #if defined(ARCH_IS_64_BIT)
 #define EXECUTE_TEST_CODE_INT64(name, entry)                                   \
-  static_cast<int64_t>(Simulator::Current()->Call(                             \
-      bit_cast<int64_t, uword>(entry), 0, 0, 0, 0))
+  static_cast<int64_t>(                                                        \
+      Simulator::Current()->Call(bit_cast<int64_t, uword>(entry), 0, 0, 0, 0))
 #define EXECUTE_TEST_CODE_DOUBLE(name, entry)                                  \
   bit_cast<double, int64_t>(Simulator::Current()->Call(                        \
       bit_cast<int64_t, uword>(entry), 0, 0, 0, 0, true))
 #define EXECUTE_TEST_CODE_INTPTR_INTPTR(name, entry, pointer_arg)              \
   static_cast<intptr_t>(Simulator::Current()->Call(                            \
       bit_cast<int64_t, uword>(entry),                                         \
-      bit_cast<int64_t, intptr_t>(pointer_arg),                                \
-      0, 0, 0))
+      bit_cast<int64_t, intptr_t>(pointer_arg), 0, 0, 0))
 #define EXECUTE_TEST_CODE_INT32_INTPTR(name, entry, pointer_arg)               \
   static_cast<int32_t>(Simulator::Current()->Call(                             \
       bit_cast<int64_t, uword>(entry),                                         \
-      bit_cast<int64_t, intptr_t>(pointer_arg),                                \
-      0, 0, 0))
+      bit_cast<int64_t, intptr_t>(pointer_arg), 0, 0, 0))
 #else
 #define EXECUTE_TEST_CODE_INT32(name, entry)                                   \
-  static_cast<int32_t>(Simulator::Current()->Call(                             \
-      bit_cast<int32_t, uword>(entry), 0, 0, 0, 0))
+  static_cast<int32_t>(                                                        \
+      Simulator::Current()->Call(bit_cast<int32_t, uword>(entry), 0, 0, 0, 0))
 #define EXECUTE_TEST_CODE_DOUBLE(name, entry)                                  \
   bit_cast<double, int64_t>(Simulator::Current()->Call(                        \
       bit_cast<int32_t, uword>(entry), 0, 0, 0, 0, true))
 #define EXECUTE_TEST_CODE_INTPTR_INTPTR(name, entry, pointer_arg)              \
   static_cast<intptr_t>(Simulator::Current()->Call(                            \
       bit_cast<int32_t, uword>(entry),                                         \
-      bit_cast<int32_t, intptr_t>(pointer_arg),                                \
-      0, 0, 0))
+      bit_cast<int32_t, intptr_t>(pointer_arg), 0, 0, 0))
 #define EXECUTE_TEST_CODE_INT32_INTPTR(name, entry, pointer_arg)               \
   static_cast<int32_t>(Simulator::Current()->Call(                             \
       bit_cast<int32_t, uword>(entry),                                         \
-      bit_cast<int32_t, intptr_t>(pointer_arg),                                \
-      0, 0, 0))
+      bit_cast<int32_t, intptr_t>(pointer_arg), 0, 0, 0))
 #endif  // defined(ARCH_IS_64_BIT)
 #define EXECUTE_TEST_CODE_INT64_LL(name, entry, long_arg0, long_arg1)          \
   static_cast<int64_t>(Simulator::Current()->Call(                             \
-      bit_cast<int32_t, uword>(entry),                                         \
-      Utils::Low32Bits(long_arg0),                                             \
-      Utils::High32Bits(long_arg0),                                            \
-      Utils::Low32Bits(long_arg1),                                             \
+      bit_cast<int32_t, uword>(entry), Utils::Low32Bits(long_arg0),            \
+      Utils::High32Bits(long_arg0), Utils::Low32Bits(long_arg1),               \
       Utils::High32Bits(long_arg1)))
 #define EXECUTE_TEST_CODE_FLOAT(name, entry)                                   \
   bit_cast<float, int32_t>(Simulator::Current()->Call(                         \
       bit_cast<int32_t, uword>(entry), 0, 0, 0, 0, true))
 #define EXECUTE_TEST_CODE_INT32_F(name, entry, float_arg)                      \
   static_cast<int32_t>(Simulator::Current()->Call(                             \
-      bit_cast<int32_t, uword>(entry),                                         \
-      bit_cast<int32_t, float>(float_arg),                                     \
-      0, 0, 0, false, true))
+      bit_cast<int32_t, uword>(entry), bit_cast<int32_t, float>(float_arg), 0, \
+      0, 0, false, true))
 #define EXECUTE_TEST_CODE_INT32_D(name, entry, double_arg)                     \
   static_cast<int32_t>(Simulator::Current()->Call(                             \
       bit_cast<int32_t, uword>(entry),                                         \
       Utils::Low32Bits(bit_cast<int64_t, double>(double_arg)),                 \
-      Utils::High32Bits(bit_cast<int64_t, double>(double_arg)),                \
-      0, 0, false, true))
+      Utils::High32Bits(bit_cast<int64_t, double>(double_arg)), 0, 0, false,   \
+      true))
 #endif  // defined(HOST_ARCH_ARM) || defined(HOST_ARCH_MIPS)
 #endif  // defined(TARGET_ARCH_{ARM, ARM64, MIPS})
 
@@ -265,7 +254,7 @@
 class TestCaseBase {
  public:
   explicit TestCaseBase(const char* name);
-  virtual ~TestCaseBase() { }
+  virtual ~TestCaseBase() {}
 
   const char* name() const { return name_; }
 
@@ -289,9 +278,9 @@
 
 class TestCase : TestCaseBase {
  public:
-  typedef void (RunEntry)();
+  typedef void(RunEntry)();
 
-  TestCase(RunEntry* run, const char* name) : TestCaseBase(name), run_(run) { }
+  TestCase(RunEntry* run, const char* name) : TestCaseBase(name), run_(run) {}
 
   static Dart_Handle LoadTestScript(const char* script,
                                     Dart_NativeEntryResolver resolver,
@@ -301,8 +290,8 @@
                                         Dart_NativeEntryResolver resolver);
   static Dart_Handle lib();
   static const char* url() { return USER_TEST_URI; }
-  static Dart_Isolate CreateTestIsolateFromSnapshot(
-      uint8_t* buffer, const char* name = NULL) {
+  static Dart_Isolate CreateTestIsolateFromSnapshot(uint8_t* buffer,
+                                                    const char* name = NULL) {
     return CreateIsolate(buffer, name);
   }
   static Dart_Isolate CreateTestIsolate(const char* name = NULL) {
@@ -356,22 +345,26 @@
 };
 
 
-template<typename T> struct is_void {
+template <typename T>
+struct is_void {
   static const bool value = false;
 };
 
 
-template<> struct is_void<void> {
+template <>
+struct is_void<void> {
   static const bool value = true;
 };
 
 
-template<typename T> struct is_double {
+template <typename T>
+struct is_double {
   static const bool value = false;
 };
 
 
-template<> struct is_double<double> {
+template <>
+struct is_double<double> {
   static const bool value = true;
 };
 
@@ -379,13 +372,11 @@
 class AssemblerTest {
  public:
   AssemblerTest(const char* name, Assembler* assembler)
-      : name_(name),
-        assembler_(assembler),
-        code_(Code::ZoneHandle()) {
+      : name_(name), assembler_(assembler), code_(Code::ZoneHandle()) {
     ASSERT(name != NULL);
     ASSERT(assembler != NULL);
   }
-  ~AssemblerTest() { }
+  ~AssemblerTest() {}
 
   Assembler* assembler() const { return assembler_; }
 
@@ -394,10 +385,10 @@
   uword payload_start() const { return code_.PayloadStart(); }
   uword entry() const { return code_.UncheckedEntryPoint(); }
 
-  // Invoke/InvokeWithCodeAndThread is used to call assembler test functions
-  // using the ABI calling convention.
-  // ResultType is the return type of the assembler test function.
-  // ArgNType is the type of the Nth argument.
+// Invoke/InvokeWithCodeAndThread is used to call assembler test functions
+// using the ABI calling convention.
+// ResultType is the return type of the assembler test function.
+// ArgNType is the type of the Nth argument.
 #if defined(USING_SIMULATOR) && !defined(TARGET_ARCH_DBC)
 
 #if defined(ARCH_IS_64_BIT)
@@ -407,18 +398,17 @@
   // on 32-bit platforms when returning an int32_t. Since template functions
   // don't support partial specialization, we'd need to introduce a helper
   // class to support 32-bit return types.
-  template<typename ResultType> ResultType InvokeWithCodeAndThread() {
+  template <typename ResultType>
+  ResultType InvokeWithCodeAndThread() {
     const bool fp_return = is_double<ResultType>::value;
     const bool fp_args = false;
     Thread* thread = Thread::Current();
     ASSERT(thread != NULL);
     return bit_cast<ResultType, int64_t>(Simulator::Current()->Call(
-        bit_cast<intptr_t, uword>(entry()),
-        reinterpret_cast<intptr_t>(&code_),
-        reinterpret_cast<intptr_t>(thread),
-        0, 0, fp_return, fp_args));
+        bit_cast<intptr_t, uword>(entry()), reinterpret_cast<intptr_t>(&code_),
+        reinterpret_cast<intptr_t>(thread), 0, 0, fp_return, fp_args));
   }
-  template<typename ResultType, typename Arg1Type>
+  template <typename ResultType, typename Arg1Type>
   ResultType InvokeWithCodeAndThread(Arg1Type arg1) {
     const bool fp_return = is_double<ResultType>::value;
     const bool fp_args = is_double<Arg1Type>::value;
@@ -427,18 +417,16 @@
     Thread* thread = Thread::Current();
     ASSERT(thread != NULL);
     return bit_cast<ResultType, int64_t>(Simulator::Current()->Call(
-        bit_cast<intptr_t, uword>(entry()),
-        reinterpret_cast<intptr_t>(&code_),
-        reinterpret_cast<intptr_t>(thread),
-        reinterpret_cast<intptr_t>(arg1),
-        0, fp_return, fp_args));
+        bit_cast<intptr_t, uword>(entry()), reinterpret_cast<intptr_t>(&code_),
+        reinterpret_cast<intptr_t>(thread), reinterpret_cast<intptr_t>(arg1), 0,
+        fp_return, fp_args));
   }
 #endif  // ARCH_IS_64_BIT
 
-  template<typename ResultType,
-           typename Arg1Type,
-           typename Arg2Type,
-           typename Arg3Type>
+  template <typename ResultType,
+            typename Arg1Type,
+            typename Arg2Type,
+            typename Arg3Type>
   ResultType Invoke(Arg1Type arg1, Arg2Type arg2, Arg3Type arg3) {
     // TODO(fschneider): Support double arguments for simulator calls.
     COMPILE_ASSERT(is_void<ResultType>::value);
@@ -448,17 +436,15 @@
     const bool fp_args = false;
     const bool fp_return = false;
     Simulator::Current()->Call(
-        bit_cast<intptr_t, uword>(entry()),
-        reinterpret_cast<intptr_t>(arg1),
-        reinterpret_cast<intptr_t>(arg2),
-        reinterpret_cast<intptr_t>(arg3),
-        0, fp_return, fp_args);
+        bit_cast<intptr_t, uword>(entry()), reinterpret_cast<intptr_t>(arg1),
+        reinterpret_cast<intptr_t>(arg2), reinterpret_cast<intptr_t>(arg3), 0,
+        fp_return, fp_args);
   }
 #elif defined(USING_SIMULATOR) && defined(TARGET_ARCH_DBC)
-  template<typename ResultType,
-           typename Arg1Type,
-           typename Arg2Type,
-           typename Arg3Type>
+  template <typename ResultType,
+            typename Arg1Type,
+            typename Arg2Type,
+            typename Arg3Type>
   ResultType Invoke(Arg1Type arg1, Arg2Type arg2, Arg3Type arg3) {
     // TODO(fschneider): Support double arguments for simulator calls.
     COMPILE_ASSERT(is_void<ResultType>::value);
@@ -471,34 +457,32 @@
     const Array& arguments = Array::Handle(Array::New(2));
     arguments.SetAt(0, arg1obj);
     arguments.SetAt(1, arg2obj);
-    Simulator::Current()->Call(
-        code(),
-        argdesc,
-        arguments,
-        reinterpret_cast<Thread*>(arg3));
+    Simulator::Current()->Call(code(), argdesc, arguments,
+                               reinterpret_cast<Thread*>(arg3));
   }
 #else
-  template<typename ResultType> ResultType InvokeWithCodeAndThread() {
+  template <typename ResultType>
+  ResultType InvokeWithCodeAndThread() {
     Thread* thread = Thread::Current();
     ASSERT(thread != NULL);
-    typedef ResultType (*FunctionType) (const Code&, Thread*);
+    typedef ResultType (*FunctionType)(const Code&, Thread*);
     return reinterpret_cast<FunctionType>(entry())(code_, thread);
   }
 
-  template<typename ResultType, typename Arg1Type>
+  template <typename ResultType, typename Arg1Type>
   ResultType InvokeWithCodeAndThread(Arg1Type arg1) {
     Thread* thread = Thread::Current();
     ASSERT(thread != NULL);
-    typedef ResultType (*FunctionType) (const Code&, Thread*, Arg1Type);
+    typedef ResultType (*FunctionType)(const Code&, Thread*, Arg1Type);
     return reinterpret_cast<FunctionType>(entry())(code_, thread, arg1);
   }
 
-  template<typename ResultType,
-           typename Arg1Type,
-           typename Arg2Type,
-           typename Arg3Type>
+  template <typename ResultType,
+            typename Arg1Type,
+            typename Arg2Type,
+            typename Arg3Type>
   ResultType Invoke(Arg1Type arg1, Arg2Type arg2, Arg3Type arg3) {
-    typedef ResultType (*FunctionType) (Arg1Type, Arg2Type, Arg3Type);
+    typedef ResultType (*FunctionType)(Arg1Type, Arg2Type, Arg3Type);
     return reinterpret_cast<FunctionType>(entry())(arg1, arg2, arg3);
   }
 #endif  // defined(USING_SIMULATOR) && !defined(TARGET_ARCH_DBC)
@@ -518,9 +502,9 @@
 class CodeGenTest {
  public:
   explicit CodeGenTest(const char* name);
-  ~CodeGenTest() { }
+  ~CodeGenTest() {}
 
-    // Accessors.
+  // Accessors.
   const Function& function() const { return function_; }
 
   SequenceNode* node_sequence() const { return node_sequence_; }
@@ -556,10 +540,12 @@
   do {                                                                         \
     Dart_Handle tmp_handle = (handle);                                         \
     if (Dart_IsError(tmp_handle)) {                                            \
-      dart::Expect(__FILE__, __LINE__).Fail(                                   \
-          "expected '%s' to be a valid handle but found an error handle:\n"    \
-          "    '%s'\n",                                                        \
-          #handle, Dart_GetError(tmp_handle));                                 \
+      dart::Expect(__FILE__, __LINE__)                                         \
+          .Fail(                                                               \
+              "expected '%s' to be a valid handle but found an error "         \
+              "handle:\n"                                                      \
+              "    '%s'\n",                                                    \
+              #handle, Dart_GetError(tmp_handle));                             \
     }                                                                          \
   } while (0)
 
@@ -567,12 +553,14 @@
   do {                                                                         \
     Dart_Handle tmp_handle = (handle);                                         \
     if (Dart_IsError(tmp_handle)) {                                            \
-      dart::Expect(__FILE__, __LINE__).IsSubstring((substring),                \
-                                                   Dart_GetError(tmp_handle)); \
+      dart::Expect(__FILE__, __LINE__)                                         \
+          .IsSubstring((substring), Dart_GetError(tmp_handle));                \
     } else {                                                                   \
-      dart::Expect(__FILE__, __LINE__).Fail(                                   \
-          "expected '%s' to be an error handle but found a valid handle.\n",   \
-          #handle);                                                            \
+      dart::Expect(__FILE__, __LINE__)                                         \
+          .Fail(                                                               \
+              "expected '%s' to be an error handle but found a valid "         \
+              "handle.\n",                                                     \
+              #handle);                                                        \
     }                                                                          \
   } while (0)
 
@@ -583,12 +571,12 @@
       bool value;                                                              \
       Dart_BooleanValue(tmp_handle, &value);                                   \
       if (!value) {                                                            \
-        dart::Expect(__FILE__, __LINE__).Fail("expected True, but was '%s'\n", \
-            #handle);                                                          \
+        dart::Expect(__FILE__, __LINE__)                                       \
+            .Fail("expected True, but was '%s'\n", #handle);                   \
       }                                                                        \
     } else {                                                                   \
-      dart::Expect(__FILE__, __LINE__).Fail("expected True, but was '%s'\n",   \
-          #handle);                                                            \
+      dart::Expect(__FILE__, __LINE__)                                         \
+          .Fail("expected True, but was '%s'\n", #handle);                     \
     }                                                                          \
   } while (0)
 
@@ -610,18 +598,14 @@
 void ElideJSONSubstring(const char* prefix, const char* in, char* out);
 
 
-template<typename T>
+template <typename T>
 class SetFlagScope : public ValueObject {
  public:
-  SetFlagScope(T* flag, T value)
-      : flag_(flag),
-        original_value_(*flag) {
+  SetFlagScope(T* flag, T value) : flag_(flag), original_value_(*flag) {
     *flag_ = value;
   }
 
-  ~SetFlagScope() {
-    *flag_ = original_value_;
-  }
+  ~SetFlagScope() { *flag_ = original_value_; }
 
  private:
   T* flag_;
diff --git a/runtime/vm/uri.cc b/runtime/vm/uri.cc
index 7d9ef76..6b8c9c4 100644
--- a/runtime/vm/uri.cc
+++ b/runtime/vm/uri.cc
@@ -9,23 +9,32 @@
 namespace dart {
 
 static bool IsUnreservedChar(intptr_t value) {
-  return ((value >= 'a' && value <= 'z') ||
-          (value >= 'A' && value <= 'Z') ||
-          (value >= '0' && value <= '9') ||
-          value == '-' ||
-          value == '.' ||
-          value == '_' ||
-          value == '~');
+  return ((value >= 'a' && value <= 'z') || (value >= 'A' && value <= 'Z') ||
+          (value >= '0' && value <= '9') || value == '-' || value == '.' ||
+          value == '_' || value == '~');
 }
 
 
 static bool IsDelimiter(intptr_t value) {
   switch (value) {
-    case ':': case '/': case '?': case '#':
-    case '[': case ']': case '@': case '!':
-    case '$': case '&': case '\'': case '(':
-    case ')': case '*': case '+': case ',':
-    case ';': case '=':
+    case ':':
+    case '/':
+    case '?':
+    case '#':
+    case '[':
+    case ']':
+    case '@':
+    case '!':
+    case '$':
+    case '&':
+    case '\'':
+    case '(':
+    case ')':
+    case '*':
+    case '+':
+    case ',':
+    case ';':
+    case '=':
       return true;
     default:
       return false;
@@ -34,8 +43,7 @@
 
 
 static bool IsHexDigit(char value) {
-  return ((value >= '0' && value <= '9') ||
-          (value >= 'A' && value <= 'F') ||
+  return ((value >= '0' && value <= '9') || (value >= 'A' && value <= 'F') ||
           (value >= 'a' && value <= 'f'));
 }
 
@@ -224,8 +232,7 @@
   if (*question_pos == '?') {
     // There is a query part.
     const char* query_start = question_pos + 1;
-    parsed_uri->query =
-        NormalizeEscapes(query_start, (hash_pos - query_start));
+    parsed_uri->query = NormalizeEscapes(query_start, (hash_pos - query_start));
   } else {
     parsed_uri->query = NULL;
   }
@@ -235,8 +242,7 @@
     // There is an authority part.
     const char* authority_start = rest + 2;  // 2 for '//'.
 
-    intptr_t authority_len =
-        ParseAuthority(authority_start, parsed_uri);
+    intptr_t authority_len = ParseAuthority(authority_start, parsed_uri);
     if (authority_len < 0) {
       ClearParsedUri(parsed_uri);
       return false;
@@ -367,7 +373,7 @@
   intptr_t truncated_base_len = last_slash - base_path;
   intptr_t ref_path_len = strlen(ref_path);
   intptr_t len = truncated_base_len + ref_path_len + 1;  // +1 for '/'
-  char* buffer = zone->Alloc<char>(len + 1);  // +1 for '\0'
+  char* buffer = zone->Alloc<char>(len + 1);             // +1 for '\0'
 
   // Copy truncated base.
   strncpy(buffer, base_path, truncated_base_len);
@@ -399,17 +405,16 @@
   // relative urls inside a "dart:" library.
   if (uri.scheme == NULL) {
     ASSERT(uri.userinfo == NULL && uri.host == NULL && uri.port == NULL);
-    return zone->PrintToString("%s%s%s%s%s",
-                               uri.path, query_separator, query,
+    return zone->PrintToString("%s%s%s%s%s", uri.path, query_separator, query,
                                fragment_separator, fragment);
   }
 
   // Uri with no authority: "scheme:path[?query][#fragment]"
   if (uri.host == NULL) {
     ASSERT(uri.userinfo == NULL && uri.port == NULL);
-    return zone->PrintToString("%s:%s%s%s%s%s",
-                               uri.scheme, uri.path, query_separator, query,
-                               fragment_separator, fragment);
+    return zone->PrintToString("%s:%s%s%s%s%s", uri.scheme, uri.path,
+                               query_separator, query, fragment_separator,
+                               fragment);
   }
 
   const char* user = uri.userinfo == NULL ? "" : uri.userinfo;
@@ -419,16 +424,16 @@
 
   // If the path doesn't start with a '/', add one.  We need it to
   // separate the path from the authority.
-  const char* path_separator = ((uri.path[0] == '\0' || uri.path[0] == '/')
-                                ? "" : "/");
+  const char* path_separator =
+      ((uri.path[0] == '\0' || uri.path[0] == '/') ? "" : "/");
 
   // Uri with authority:
   //   "scheme://[userinfo@]host[:port][/]path[?query][#fragment]"
   return zone->PrintToString(
       "%s://%s%s%s%s%s%s%s%s%s%s%s",  // There is *nothing* wrong with this.
       uri.scheme, user, user_separator, uri.host, port_separator, port,
-      path_separator, uri.path, query_separator, query,
-      fragment_separator, fragment);
+      path_separator, uri.path, query_separator, query, fragment_separator,
+      fragment);
 }
 
 
diff --git a/runtime/vm/uri_test.cc b/runtime/vm/uri_test.cc
index 34631a5..14f26fb 100644
--- a/runtime/vm/uri_test.cc
+++ b/runtime/vm/uri_test.cc
@@ -48,8 +48,8 @@
 
 TEST_CASE(ParseUri_WithScheme_WithQueryWithFragment) {
   ParsedUri uri;
-  EXPECT(ParseUri("foo://example.com:8042/over/there?name=ferret#fragment",
-                  &uri));
+  EXPECT(
+      ParseUri("foo://example.com:8042/over/there?name=ferret#fragment", &uri));
   EXPECT_STREQ("foo", uri.scheme);
   EXPECT(uri.userinfo == NULL);
   EXPECT_STREQ("example.com", uri.host);
@@ -244,8 +244,8 @@
 
 TEST_CASE(ParseUri_NormalizeEscapes_PathQueryFragment) {
   ParsedUri uri;
-  EXPECT(ParseUri(
-      "scheme:/This%09Is A P%61th?This%09Is A Qu%65ry#A Fr%61gment", &uri));
+  EXPECT(ParseUri("scheme:/This%09Is A P%61th?This%09Is A Qu%65ry#A Fr%61gment",
+                  &uri));
   EXPECT_STREQ("scheme", uri.scheme);
   EXPECT(uri.userinfo == NULL);
   EXPECT(uri.host == NULL);
@@ -258,8 +258,7 @@
 
 TEST_CASE(ParseUri_NormalizeEscapes_UppercaseEscapesPreferred) {
   ParsedUri uri;
-  EXPECT(ParseUri(
-      "scheme:/%1b%1B", &uri));
+  EXPECT(ParseUri("scheme:/%1b%1B", &uri));
   EXPECT_STREQ("scheme", uri.scheme);
   EXPECT(uri.userinfo == NULL);
   EXPECT(uri.host == NULL);
@@ -272,8 +271,7 @@
 
 TEST_CASE(ParseUri_NormalizeEscapes_Authority) {
   ParsedUri uri;
-  EXPECT(ParseUri(
-      "scheme://UsEr N%61%4de@h%4FsT.c%6fm:80/", &uri));
+  EXPECT(ParseUri("scheme://UsEr N%61%4de@h%4FsT.c%6fm:80/", &uri));
   EXPECT_STREQ("scheme", uri.scheme);
   EXPECT_STREQ("UsEr%20NaMe", uri.userinfo);  // Normalized, case preserved.
   EXPECT_STREQ("host.com", uri.host);         // Normalized, lower-cased.
@@ -299,8 +297,7 @@
 
 TEST_CASE(ParseUri_BrokenEscapeSequence) {
   ParsedUri uri;
-  EXPECT(ParseUri(
-      "scheme:/%1g", &uri));
+  EXPECT(ParseUri("scheme:/%1g", &uri));
   EXPECT_STREQ("scheme", uri.scheme);
   EXPECT(uri.userinfo == NULL);
   EXPECT(uri.host == NULL);
@@ -340,8 +337,7 @@
 
 TEST_CASE(ResolveUri_NoSchemeNoAuthority_AbsolutePath) {
   const char* target_uri;
-  EXPECT(ResolveUri("/ref/path",
-                    "bscheme://buser@bhost:11/base/path?baseQuery",
+  EXPECT(ResolveUri("/ref/path", "bscheme://buser@bhost:11/base/path?baseQuery",
                     &target_uri));
   EXPECT_STREQ("bscheme://buser@bhost:11/ref/path", target_uri);
 }
@@ -349,8 +345,7 @@
 
 TEST_CASE(ResolveUri_NoSchemeNoAuthority_RelativePath) {
   const char* target_uri;
-  EXPECT(ResolveUri("ref/path",
-                    "bscheme://buser@bhost:11/base/path?baseQuery",
+  EXPECT(ResolveUri("ref/path", "bscheme://buser@bhost:11/base/path?baseQuery",
                     &target_uri));
   EXPECT_STREQ("bscheme://buser@bhost:11/base/ref/path", target_uri);
 }
@@ -358,18 +353,14 @@
 
 TEST_CASE(ResolveUri_NoSchemeNoAuthority_RelativePathEmptyBasePath) {
   const char* target_uri;
-  EXPECT(ResolveUri("ref/path",
-                    "bscheme://buser@bhost:11",
-                    &target_uri));
+  EXPECT(ResolveUri("ref/path", "bscheme://buser@bhost:11", &target_uri));
   EXPECT_STREQ("bscheme://buser@bhost:11/ref/path", target_uri);
 }
 
 
 TEST_CASE(ResolveUri_NoSchemeNoAuthority_RelativePathWeirdBasePath) {
   const char* target_uri;
-  EXPECT(ResolveUri("ref/path",
-                    "bscheme:base",
-                    &target_uri));
+  EXPECT(ResolveUri("ref/path", "bscheme:base", &target_uri));
   EXPECT_STREQ("bscheme:ref/path", target_uri);
 }
 
@@ -405,36 +396,28 @@
 
 TEST_CASE(ResolveUri_RemoveDots_RemoveOneDotSegment) {
   const char* target_uri;
-  EXPECT(ResolveUri("./refpath",
-                    "scheme://auth/a/b/c/d",
-                    &target_uri));
+  EXPECT(ResolveUri("./refpath", "scheme://auth/a/b/c/d", &target_uri));
   EXPECT_STREQ("scheme://auth/a/b/c/refpath", target_uri);
 }
 
 
 TEST_CASE(ResolveUri_RemoveDots_RemoveTwoDotSegments) {
   const char* target_uri;
-  EXPECT(ResolveUri("././refpath",
-                    "scheme://auth/a/b/c/d",
-                    &target_uri));
+  EXPECT(ResolveUri("././refpath", "scheme://auth/a/b/c/d", &target_uri));
   EXPECT_STREQ("scheme://auth/a/b/c/refpath", target_uri);
 }
 
 
 TEST_CASE(ResolveUri_RemoveDots_RemoveOneDotDotSegment) {
   const char* target_uri;
-  EXPECT(ResolveUri("../refpath",
-                    "scheme://auth/a/b/c/d",
-                    &target_uri));
+  EXPECT(ResolveUri("../refpath", "scheme://auth/a/b/c/d", &target_uri));
   EXPECT_STREQ("scheme://auth/a/b/refpath", target_uri);
 }
 
 
 TEST_CASE(ResolveUri_RemoveDots_RemoveTwoDotDotSegments) {
   const char* target_uri;
-  EXPECT(ResolveUri("../../refpath",
-                    "scheme://auth/a/b/c/d",
-                    &target_uri));
+  EXPECT(ResolveUri("../../refpath", "scheme://auth/a/b/c/d", &target_uri));
   EXPECT_STREQ("scheme://auth/a/refpath", target_uri);
 }
 
@@ -442,47 +425,36 @@
 TEST_CASE(ResolveUri_RemoveDots_RemoveTooManyDotDotSegments) {
   const char* target_uri;
   EXPECT(ResolveUri("../../../../../../../../../refpath",
-                    "scheme://auth/a/b/c/d",
-                    &target_uri));
+                    "scheme://auth/a/b/c/d", &target_uri));
   EXPECT_STREQ("scheme://auth/refpath", target_uri);
 }
 
 
 TEST_CASE(ResolveUri_RemoveDots_RemoveDotSegmentsNothingLeft1) {
   const char* target_uri;
-  EXPECT(ResolveUri("../../../../..",
-                    "scheme://auth/a/b/c/d",
-                    &target_uri));
+  EXPECT(ResolveUri("../../../../..", "scheme://auth/a/b/c/d", &target_uri));
   EXPECT_STREQ("scheme://auth/", target_uri);
 }
 
 
-
 TEST_CASE(ResolveUri_RemoveDots_RemoveDotSegmentsNothingLeft2) {
   const char* target_uri;
-  EXPECT(ResolveUri(".",
-                    "scheme://auth/",
-                    &target_uri));
+  EXPECT(ResolveUri(".", "scheme://auth/", &target_uri));
   EXPECT_STREQ("scheme://auth/", target_uri);
 }
 
 
-
 TEST_CASE(ResolveUri_RemoveDots_RemoveDotSegmentsInitialPrefix) {
   const char* target_uri;
-  EXPECT(ResolveUri("../../../../refpath",
-                    "scheme://auth",
-                    &target_uri));
+  EXPECT(ResolveUri("../../../../refpath", "scheme://auth", &target_uri));
   EXPECT_STREQ("scheme://auth/refpath", target_uri);
 }
 
 
-
 TEST_CASE(ResolveUri_RemoveDots_RemoveDotSegmentsMixed) {
   const char* target_uri;
   EXPECT(ResolveUri("../../1/./2/../3/4/../5/././6/../7",
-                    "scheme://auth/a/b/c/d/e",
-                    &target_uri));
+                    "scheme://auth/a/b/c/d/e", &target_uri));
   EXPECT_STREQ("scheme://auth/a/b/1/3/5/7", target_uri);
 }
 
@@ -500,19 +472,15 @@
 
 TEST_CASE(ResolveUri_NormalizeEscapes_UppercaseHexPreferred) {
   const char* target_uri;
-  EXPECT(ResolveUri("",
-                    "scheme:/%1b%1B",
-                    &target_uri));
-  EXPECT_STREQ("scheme:/%1B%1B",
-               target_uri);
+  EXPECT(ResolveUri("", "scheme:/%1b%1B", &target_uri));
+  EXPECT_STREQ("scheme:/%1B%1B", target_uri);
 }
 
 
 TEST_CASE(ResolveUri_NormalizeEscapes_Authority) {
   const char* target_uri;
-  EXPECT(ResolveUri("",
-                    "scheme://UsEr N%61%4de@h%4FsT.c%6fm:80/",
-                    &target_uri));
+  EXPECT(
+      ResolveUri("", "scheme://UsEr N%61%4de@h%4FsT.c%6fm:80/", &target_uri));
   // userinfo is normalized and case is preserved.  host is normalized
   // and lower-cased.
   EXPECT_STREQ("scheme://UsEr%20NaMe@host.com:80/", target_uri);
@@ -521,18 +489,30 @@
 
 TEST_CASE(ResolveUri_NormalizeEscapes_BrokenEscapeSequence) {
   const char* target_uri;
-  EXPECT(ResolveUri("",
-                    "scheme:/%1g",
-                    &target_uri));
+  EXPECT(ResolveUri("", "scheme:/%1g", &target_uri));
   // We don't change broken escape sequences.
-  EXPECT_STREQ("scheme:/%1g",
-               target_uri);
+  EXPECT_STREQ("scheme:/%1g", target_uri);
 }
 
 
 TEST_CASE(ResolveUri_DataUri) {
   const char* data_uri =
-      "data:application/dart;charset=utf-8,%20%20%20%20%20%20%20%20import%20%22dart:isolate%22;%0A%0A%20%20%20%20%20%20%20%20import%20%22package:stream_channel/stream_channel.dart%22;%0A%0A%20%20%20%20%20%20%20%20import%20%22package:test/src/runner/plugin/remote_platform_helpers.dart%22;%0A%20%20%20%20%20%20%20%20import%20%22package:test/src/runner/vm/catch_isolate_errors.dart%22;%0A%0A%20%20%20%20%20%20%20%20import%20%22file:///home/sra/xxxx/dev_compiler/test/all_tests.dart%22%20as%20test;%0A%0A%20%20%20%20%20%20%20%20void%20main(_,%20SendPort%20message)%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20channel%20=%20serializeSuite(()%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20catchIsolateErrors();%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20test.main;%0A%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%20%20%20%20new%20IsolateChannel.connectSend(message).pipe(channel);%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20";  // NOLINT
+      "data:application/"
+      "dart;charset=utf-8,%20%20%20%20%20%20%20%20import%20%22dart:isolate%22;%"
+      "0A%0A%20%20%20%20%20%20%20%20import%20%22package:stream_channel/"
+      "stream_channel.dart%22;%0A%0A%20%20%20%20%20%20%20%20import%20%"
+      "22package:test/src/runner/plugin/"
+      "remote_platform_helpers.dart%22;%0A%20%20%20%20%20%20%20%20import%20%"
+      "22package:test/src/runner/vm/"
+      "catch_isolate_errors.dart%22;%0A%0A%20%20%20%20%20%20%20%20import%20%"
+      "22file:///home/sra/xxxx/dev_compiler/test/"
+      "all_tests.dart%22%20as%20test;%0A%0A%20%20%20%20%20%20%20%20void%20main("
+      "_,%20SendPort%20message)%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%"
+      "20channel%20=%20serializeSuite(()%20%7B%0A%20%20%20%20%20%20%20%20%20%"
+      "20%20%20catchIsolateErrors();%0A%20%20%20%20%20%20%20%20%20%20%20%"
+      "20return%20test.main;%0A%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%"
+      "20%20%20%20%20%20%20new%20IsolateChannel.connectSend(message).pipe("
+      "channel);%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20";
 
   const char* target_uri;
   EXPECT(ResolveUri(data_uri,
@@ -581,51 +561,51 @@
   const char* base = "http://a/b/c/d;p?q";
 
   // From RFC 3986
-  EXPECT_STREQ("g:h",                   TestResolve(base, "g:h"));
-  EXPECT_STREQ("http://a/b/c/g",        TestResolve(base, "g"));
-  EXPECT_STREQ("http://a/b/c/g",        TestResolve(base, "./g"));
-  EXPECT_STREQ("http://a/b/c/g/",       TestResolve(base, "g/"));
-  EXPECT_STREQ("http://a/g",            TestResolve(base, "/g"));
-  EXPECT_STREQ("http://g",              TestResolve(base, "//g"));
-  EXPECT_STREQ("http://a/b/c/d;p?y",    TestResolve(base, "?y"));
-  EXPECT_STREQ("http://a/b/c/g?y",      TestResolve(base, "g?y"));
-  EXPECT_STREQ("http://a/b/c/d;p?q#s",  TestResolve(base, "#s"));
-  EXPECT_STREQ("http://a/b/c/g#s",      TestResolve(base, "g#s"));
-  EXPECT_STREQ("http://a/b/c/g?y#s",    TestResolve(base, "g?y#s"));
-  EXPECT_STREQ("http://a/b/c/;x",       TestResolve(base, ";x"));
-  EXPECT_STREQ("http://a/b/c/g;x",      TestResolve(base, "g;x"));
-  EXPECT_STREQ("http://a/b/c/g;x?y#s",  TestResolve(base, "g;x?y#s"));
-  EXPECT_STREQ("http://a/b/c/d;p?q",    TestResolve(base, ""));
-  EXPECT_STREQ("http://a/b/c/",         TestResolve(base, "."));
-  EXPECT_STREQ("http://a/b/c/",         TestResolve(base, "./"));
-  EXPECT_STREQ("http://a/b/",           TestResolve(base, ".."));
-  EXPECT_STREQ("http://a/b/",           TestResolve(base, "../"));
-  EXPECT_STREQ("http://a/b/g",          TestResolve(base, "../g"));
-  EXPECT_STREQ("http://a/",             TestResolve(base, "../.."));
-  EXPECT_STREQ("http://a/",             TestResolve(base, "../../"));
-  EXPECT_STREQ("http://a/g",            TestResolve(base, "../../g"));
-  EXPECT_STREQ("http://a/g",            TestResolve(base, "../../../g"));
-  EXPECT_STREQ("http://a/g",            TestResolve(base, "../../../../g"));
-  EXPECT_STREQ("http://a/g",            TestResolve(base, "/./g"));
-  EXPECT_STREQ("http://a/g",            TestResolve(base, "/../g"));
-  EXPECT_STREQ("http://a/b/c/g.",       TestResolve(base, "g."));
-  EXPECT_STREQ("http://a/b/c/.g",       TestResolve(base, ".g"));
-  EXPECT_STREQ("http://a/b/c/g..",      TestResolve(base, "g.."));
-  EXPECT_STREQ("http://a/b/c/..g",      TestResolve(base, "..g"));
-  EXPECT_STREQ("http://a/b/g",          TestResolve(base, "./../g"));
-  EXPECT_STREQ("http://a/b/c/g/",       TestResolve(base, "./g/."));
-  EXPECT_STREQ("http://a/b/c/g/h",      TestResolve(base, "g/./h"));
-  EXPECT_STREQ("http://a/b/c/h",        TestResolve(base, "g/../h"));
-  EXPECT_STREQ("http://a/b/c/g;x=1/y",  TestResolve(base, "g;x=1/./y"));
-  EXPECT_STREQ("http://a/b/c/y",        TestResolve(base, "g;x=1/../y"));
-  EXPECT_STREQ("http://a/b/c/g?y/./x",  TestResolve(base, "g?y/./x"));
+  EXPECT_STREQ("g:h", TestResolve(base, "g:h"));
+  EXPECT_STREQ("http://a/b/c/g", TestResolve(base, "g"));
+  EXPECT_STREQ("http://a/b/c/g", TestResolve(base, "./g"));
+  EXPECT_STREQ("http://a/b/c/g/", TestResolve(base, "g/"));
+  EXPECT_STREQ("http://a/g", TestResolve(base, "/g"));
+  EXPECT_STREQ("http://g", TestResolve(base, "//g"));
+  EXPECT_STREQ("http://a/b/c/d;p?y", TestResolve(base, "?y"));
+  EXPECT_STREQ("http://a/b/c/g?y", TestResolve(base, "g?y"));
+  EXPECT_STREQ("http://a/b/c/d;p?q#s", TestResolve(base, "#s"));
+  EXPECT_STREQ("http://a/b/c/g#s", TestResolve(base, "g#s"));
+  EXPECT_STREQ("http://a/b/c/g?y#s", TestResolve(base, "g?y#s"));
+  EXPECT_STREQ("http://a/b/c/;x", TestResolve(base, ";x"));
+  EXPECT_STREQ("http://a/b/c/g;x", TestResolve(base, "g;x"));
+  EXPECT_STREQ("http://a/b/c/g;x?y#s", TestResolve(base, "g;x?y#s"));
+  EXPECT_STREQ("http://a/b/c/d;p?q", TestResolve(base, ""));
+  EXPECT_STREQ("http://a/b/c/", TestResolve(base, "."));
+  EXPECT_STREQ("http://a/b/c/", TestResolve(base, "./"));
+  EXPECT_STREQ("http://a/b/", TestResolve(base, ".."));
+  EXPECT_STREQ("http://a/b/", TestResolve(base, "../"));
+  EXPECT_STREQ("http://a/b/g", TestResolve(base, "../g"));
+  EXPECT_STREQ("http://a/", TestResolve(base, "../.."));
+  EXPECT_STREQ("http://a/", TestResolve(base, "../../"));
+  EXPECT_STREQ("http://a/g", TestResolve(base, "../../g"));
+  EXPECT_STREQ("http://a/g", TestResolve(base, "../../../g"));
+  EXPECT_STREQ("http://a/g", TestResolve(base, "../../../../g"));
+  EXPECT_STREQ("http://a/g", TestResolve(base, "/./g"));
+  EXPECT_STREQ("http://a/g", TestResolve(base, "/../g"));
+  EXPECT_STREQ("http://a/b/c/g.", TestResolve(base, "g."));
+  EXPECT_STREQ("http://a/b/c/.g", TestResolve(base, ".g"));
+  EXPECT_STREQ("http://a/b/c/g..", TestResolve(base, "g.."));
+  EXPECT_STREQ("http://a/b/c/..g", TestResolve(base, "..g"));
+  EXPECT_STREQ("http://a/b/g", TestResolve(base, "./../g"));
+  EXPECT_STREQ("http://a/b/c/g/", TestResolve(base, "./g/."));
+  EXPECT_STREQ("http://a/b/c/g/h", TestResolve(base, "g/./h"));
+  EXPECT_STREQ("http://a/b/c/h", TestResolve(base, "g/../h"));
+  EXPECT_STREQ("http://a/b/c/g;x=1/y", TestResolve(base, "g;x=1/./y"));
+  EXPECT_STREQ("http://a/b/c/y", TestResolve(base, "g;x=1/../y"));
+  EXPECT_STREQ("http://a/b/c/g?y/./x", TestResolve(base, "g?y/./x"));
   EXPECT_STREQ("http://a/b/c/g?y/../x", TestResolve(base, "g?y/../x"));
-  EXPECT_STREQ("http://a/b/c/g#s/./x",  TestResolve(base, "g#s/./x"));
+  EXPECT_STREQ("http://a/b/c/g#s/./x", TestResolve(base, "g#s/./x"));
   EXPECT_STREQ("http://a/b/c/g#s/../x", TestResolve(base, "g#s/../x"));
-  EXPECT_STREQ("http:g",                TestResolve(base, "http:g"));
+  EXPECT_STREQ("http:g", TestResolve(base, "http:g"));
 
   // Additional tests (not from RFC 3986).
-  EXPECT_STREQ("http://a/b/g;p/h;s",    TestResolve(base, "../g;p/h;s"));
+  EXPECT_STREQ("http://a/b/g;p/h;s", TestResolve(base, "../g;p/h;s"));
 
   base = "s:a/b";
   EXPECT_STREQ("s:/c", TestResolve(base, "../c"));
@@ -635,32 +615,32 @@
 // This test is ported from sdk/tests/corelib/uri_test.dart (testResolvePath).
 TEST_CASE(ResolveUri_MoreDotSegmentTests) {
   const char* base = "/";
-  EXPECT_STREQ("/a/g",    TestResolve(base, "/a/b/c/./../../g"));
-  EXPECT_STREQ("/a/g",    TestResolve(base, "/a/b/c/./../../g"));
-  EXPECT_STREQ("/mid/6",  TestResolve(base, "mid/content=5/../6"));
-  EXPECT_STREQ("/a/b/e",  TestResolve(base, "a/b/c/d/../../e"));
-  EXPECT_STREQ("/a/b/e",  TestResolve(base, "../a/b/c/d/../../e"));
-  EXPECT_STREQ("/a/b/e",  TestResolve(base, "./a/b/c/d/../../e"));
-  EXPECT_STREQ("/a/b/e",  TestResolve(base, "../a/b/./c/d/../../e"));
-  EXPECT_STREQ("/a/b/e",  TestResolve(base, "./a/b/./c/d/../../e"));
+  EXPECT_STREQ("/a/g", TestResolve(base, "/a/b/c/./../../g"));
+  EXPECT_STREQ("/a/g", TestResolve(base, "/a/b/c/./../../g"));
+  EXPECT_STREQ("/mid/6", TestResolve(base, "mid/content=5/../6"));
+  EXPECT_STREQ("/a/b/e", TestResolve(base, "a/b/c/d/../../e"));
+  EXPECT_STREQ("/a/b/e", TestResolve(base, "../a/b/c/d/../../e"));
+  EXPECT_STREQ("/a/b/e", TestResolve(base, "./a/b/c/d/../../e"));
+  EXPECT_STREQ("/a/b/e", TestResolve(base, "../a/b/./c/d/../../e"));
+  EXPECT_STREQ("/a/b/e", TestResolve(base, "./a/b/./c/d/../../e"));
   EXPECT_STREQ("/a/b/e/", TestResolve(base, "./a/b/./c/d/../../e/."));
   EXPECT_STREQ("/a/b/e/", TestResolve(base, "./a/b/./c/d/../../e/./."));
   EXPECT_STREQ("/a/b/e/", TestResolve(base, "./a/b/./c/d/../../e/././."));
 
-  #define LH "http://localhost"
+#define LH "http://localhost"
   base = LH;
-  EXPECT_STREQ(LH "/a/g",    TestResolve(base, "/a/b/c/./../../g"));
-  EXPECT_STREQ(LH "/a/g",    TestResolve(base, "/a/b/c/./../../g"));
-  EXPECT_STREQ(LH "/mid/6",  TestResolve(base, "mid/content=5/../6"));
-  EXPECT_STREQ(LH "/a/b/e",  TestResolve(base, "a/b/c/d/../../e"));
-  EXPECT_STREQ(LH "/a/b/e",  TestResolve(base, "../a/b/c/d/../../e"));
-  EXPECT_STREQ(LH "/a/b/e",  TestResolve(base, "./a/b/c/d/../../e"));
-  EXPECT_STREQ(LH "/a/b/e",  TestResolve(base, "../a/b/./c/d/../../e"));
-  EXPECT_STREQ(LH "/a/b/e",  TestResolve(base, "./a/b/./c/d/../../e"));
+  EXPECT_STREQ(LH "/a/g", TestResolve(base, "/a/b/c/./../../g"));
+  EXPECT_STREQ(LH "/a/g", TestResolve(base, "/a/b/c/./../../g"));
+  EXPECT_STREQ(LH "/mid/6", TestResolve(base, "mid/content=5/../6"));
+  EXPECT_STREQ(LH "/a/b/e", TestResolve(base, "a/b/c/d/../../e"));
+  EXPECT_STREQ(LH "/a/b/e", TestResolve(base, "../a/b/c/d/../../e"));
+  EXPECT_STREQ(LH "/a/b/e", TestResolve(base, "./a/b/c/d/../../e"));
+  EXPECT_STREQ(LH "/a/b/e", TestResolve(base, "../a/b/./c/d/../../e"));
+  EXPECT_STREQ(LH "/a/b/e", TestResolve(base, "./a/b/./c/d/../../e"));
   EXPECT_STREQ(LH "/a/b/e/", TestResolve(base, "./a/b/./c/d/../../e/."));
   EXPECT_STREQ(LH "/a/b/e/", TestResolve(base, "./a/b/./c/d/../../e/./."));
   EXPECT_STREQ(LH "/a/b/e/", TestResolve(base, "./a/b/./c/d/../../e/././."));
-  #undef LH
+#undef LH
 }
 
 }  // namespace dart
diff --git a/runtime/vm/verifier.cc b/runtime/vm/verifier.cc
index a2ce0c3..5bc4765 100644
--- a/runtime/vm/verifier.cc
+++ b/runtime/vm/verifier.cc
@@ -26,18 +26,18 @@
       }
     } else {
       switch (mark_expectation_) {
-       case kForbidMarked:
-        if (raw_obj->IsMarked()) {
-          FATAL1("Marked object encountered %#" Px "\n", raw_addr);
-        }
-        break;
-       case kAllowMarked:
-        break;
-       case kRequireMarked:
-        if (!raw_obj->IsMarked()) {
-          FATAL1("Unmarked object encountered %#" Px "\n", raw_addr);
-        }
-        break;
+        case kForbidMarked:
+          if (raw_obj->IsMarked()) {
+            FATAL1("Marked object encountered %#" Px "\n", raw_addr);
+          }
+          break;
+        case kAllowMarked:
+          break;
+        case kRequireMarked:
+          if (!raw_obj->IsMarked()) {
+            FATAL1("Unmarked object encountered %#" Px "\n", raw_addr);
+          }
+          break;
       }
     }
   }
@@ -72,13 +72,11 @@
   Thread* thread = Thread::Current();
   Isolate* isolate = thread->isolate();
   StackZone stack_zone(thread);
-  ObjectSet* allocated_set =
-      isolate->heap()->CreateAllocatedObjectSet(stack_zone.GetZone(),
-                                                mark_expectation);
+  ObjectSet* allocated_set = isolate->heap()->CreateAllocatedObjectSet(
+      stack_zone.GetZone(), mark_expectation);
   VerifyPointersVisitor visitor(isolate, allocated_set);
   // Visit all strongly reachable objects.
-  isolate->IterateObjectPointers(&visitor,
-                                 StackFrameIterator::kValidateFrames);
+  isolate->IterateObjectPointers(&visitor, StackFrameIterator::kValidateFrames);
   VerifyWeakPointersVisitor weak_visitor(&visitor);
   // Visit weak handles and prologue weak handles.
   isolate->VisitWeakPersistentHandles(&weak_visitor);
@@ -87,9 +85,7 @@
 
 #if defined(DEBUG)
 VerifyCanonicalVisitor::VerifyCanonicalVisitor(Thread* thread)
-    : thread_(thread),
-      instanceHandle_(Instance::Handle(thread->zone())) {
-}
+    : thread_(thread), instanceHandle_(Instance::Handle(thread->zone())) {}
 
 
 void VerifyCanonicalVisitor::VisitObject(RawObject* obj) {
diff --git a/runtime/vm/verifier.h b/runtime/vm/verifier.h
index bade6ab..e949738 100644
--- a/runtime/vm/verifier.h
+++ b/runtime/vm/verifier.h
@@ -18,22 +18,17 @@
 class RawObject;
 
 
-enum MarkExpectation {
-  kForbidMarked,
-  kAllowMarked,
-  kRequireMarked
-};
+enum MarkExpectation { kForbidMarked, kAllowMarked, kRequireMarked };
 
 
 class VerifyObjectVisitor : public ObjectVisitor {
  public:
   VerifyObjectVisitor(Isolate* isolate,
-                     ObjectSet* allocated_set,
-                     MarkExpectation mark_expectation)
+                      ObjectSet* allocated_set,
+                      MarkExpectation mark_expectation)
       : isolate_(isolate),
         allocated_set_(allocated_set),
-        mark_expectation_(mark_expectation) {
-  }
+        mark_expectation_(mark_expectation) {}
 
   virtual void VisitObject(RawObject* obj);
 
@@ -50,9 +45,7 @@
 class VerifyPointersVisitor : public ObjectPointerVisitor {
  public:
   explicit VerifyPointersVisitor(Isolate* isolate, ObjectSet* allocated_set)
-      : ObjectPointerVisitor(isolate),
-        allocated_set_(allocated_set) {
-  }
+      : ObjectPointerVisitor(isolate), allocated_set_(allocated_set) {}
 
   virtual void VisitPointers(RawObject** first, RawObject** last);
 
@@ -67,9 +60,7 @@
 class VerifyWeakPointersVisitor : public HandleVisitor {
  public:
   explicit VerifyWeakPointersVisitor(VerifyPointersVisitor* visitor)
-      :  HandleVisitor(Thread::Current()),
-         visitor_(visitor) {
-  }
+      : HandleVisitor(Thread::Current()), visitor_(visitor) {}
 
   virtual void VisitHandle(uword addr);
 
diff --git a/runtime/vm/virtual_memory.cc b/runtime/vm/virtual_memory.cc
index 1372545..1e62f8b 100644
--- a/runtime/vm/virtual_memory.cc
+++ b/runtime/vm/virtual_memory.cc
@@ -19,7 +19,7 @@
   ASSERT((new_size & (PageSize() - 1)) == 0);
   ASSERT(new_size <= size());
   if (try_unmap &&
-      (reserved_size_ == size()) &&  /* Don't create holes in reservation. */
+      (reserved_size_ == size()) && /* Don't create holes in reservation. */
       FreeSubSegment(reinterpret_cast<void*>(start() + new_size),
                      size() - new_size)) {
     reserved_size_ = new_size;
diff --git a/runtime/vm/virtual_memory.h b/runtime/vm/virtual_memory.h
index 8eefd30..a26b8ce7 100644
--- a/runtime/vm/virtual_memory.h
+++ b/runtime/vm/virtual_memory.h
@@ -32,9 +32,7 @@
 
   static void InitOnce();
 
-  bool Contains(uword addr) const {
-    return region_.Contains(addr);
-  }
+  bool Contains(uword addr) const { return region_.Contains(addr); }
 
   // Commits the virtual memory area, which is guaranteed to be zeroed. Returns
   // true on success and false on failure (e.g., out-of-memory).
@@ -44,15 +42,11 @@
 
   // Changes the protection of the virtual memory area.
   static bool Protect(void* address, intptr_t size, Protection mode);
-  bool Protect(Protection mode) {
-    return Protect(address(), size(), mode);
-  }
+  bool Protect(Protection mode) { return Protect(address(), size(), mode); }
 
   // Reserves a virtual memory segment with size. If a segment of the requested
   // size cannot be allocated NULL is returned.
-  static VirtualMemory* Reserve(intptr_t size) {
-    return ReserveInternal(size);
-  }
+  static VirtualMemory* Reserve(intptr_t size) { return ReserveInternal(size); }
 
   static intptr_t PageSize() {
     ASSERT(page_size_ != 0);
@@ -83,11 +77,11 @@
 
   // This constructor is only used internally when reserving new virtual spaces.
   // It does not reserve any virtual address space on its own.
-  explicit VirtualMemory(const MemoryRegion& region, int32_t handle = 0) :
-      region_(region.pointer(), region.size()),
-      reserved_size_(region.size()),
-      handle_(handle),
-      embedder_allocated_(false) { }
+  explicit VirtualMemory(const MemoryRegion& region, int32_t handle = 0)
+      : region_(region.pointer(), region.size()),
+        reserved_size_(region.size()),
+        handle_(handle),
+        embedder_allocated_(false) {}
 
   MemoryRegion region_;
 
diff --git a/runtime/vm/virtual_memory_android.cc b/runtime/vm/virtual_memory_android.cc
index 16aa834..7406d22 100644
--- a/runtime/vm/virtual_memory_android.cc
+++ b/runtime/vm/virtual_memory_android.cc
@@ -8,7 +8,7 @@
 #include "vm/virtual_memory.h"
 
 #include <sys/mman.h>  // NOLINT
-#include <unistd.h>  // NOLINT
+#include <unistd.h>    // NOLINT
 
 #include "platform/assert.h"
 #include "platform/utils.h"
@@ -33,8 +33,7 @@
 VirtualMemory* VirtualMemory::ReserveInternal(intptr_t size) {
   // TODO(4408): use ashmem instead of anonymous memory.
   void* address = mmap(NULL, size, PROT_NONE,
-                       MAP_PRIVATE | MAP_ANON | MAP_NORESERVE,
-                       -1, 0);
+                       MAP_PRIVATE | MAP_ANON | MAP_NORESERVE, -1, 0);
   if (address == MAP_FAILED) {
     return NULL;
   }
@@ -72,8 +71,7 @@
   ASSERT(Contains(addr + size) || (addr + size == end()));
   int prot = PROT_READ | PROT_WRITE | (executable ? PROT_EXEC : 0);
   void* address = mmap(reinterpret_cast<void*>(addr), size, prot,
-                       MAP_PRIVATE | MAP_ANON | MAP_FIXED,
-                       -1, 0);
+                       MAP_PRIVATE | MAP_ANON | MAP_FIXED, -1, 0);
   if (address == MAP_FAILED) {
     return false;
   }
@@ -106,8 +104,7 @@
       break;
   }
   return (mprotect(reinterpret_cast<void*>(page_address),
-                   end_address - page_address,
-                   prot) == 0);
+                   end_address - page_address, prot) == 0);
 }
 
 }  // namespace dart
diff --git a/runtime/vm/virtual_memory_fuchsia.cc b/runtime/vm/virtual_memory_fuchsia.cc
index 49b6e4a..bd78bf9 100644
--- a/runtime/vm/virtual_memory_fuchsia.cc
+++ b/runtime/vm/virtual_memory_fuchsia.cc
@@ -34,12 +34,10 @@
   // TODO(zra): map with PERM_NONE, when that works, and relax with
   // Commit and Protect when they are implemented.
   // Issue MG-161.
-  const int prot = MX_VM_FLAG_PERM_READ |
-                   MX_VM_FLAG_PERM_WRITE |
-                   MX_VM_FLAG_PERM_EXECUTE;
+  const int prot =
+      MX_VM_FLAG_PERM_READ | MX_VM_FLAG_PERM_WRITE | MX_VM_FLAG_PERM_EXECUTE;
   uintptr_t addr;
-  status = mx_process_map_vm(
-      mx_process_self(), vmo, 0, size, &addr, prot);
+  status = mx_process_map_vm(mx_process_self(), vmo, 0, size, &addr, prot);
   if (status != NO_ERROR) {
     mx_handle_close(vmo);
     FATAL("VirtualMemory::ReserveInternal FAILED");
@@ -56,8 +54,8 @@
     // TODO(zra): Use reserved_size_.
     // Issue MG-162.
     uintptr_t addr = reinterpret_cast<uintptr_t>(address());
-    mx_status_t status = mx_process_unmap_vm(
-        mx_process_self(), addr, 0 /*reserved_size_*/);
+    mx_status_t status =
+        mx_process_unmap_vm(mx_process_self(), addr, 0 /*reserved_size_*/);
     if (status != NO_ERROR) {
       FATAL("VirtualMemory::~VirtualMemory: unamp FAILED");
     }
diff --git a/runtime/vm/virtual_memory_linux.cc b/runtime/vm/virtual_memory_linux.cc
index 0228f68..be3655f 100644
--- a/runtime/vm/virtual_memory_linux.cc
+++ b/runtime/vm/virtual_memory_linux.cc
@@ -8,7 +8,7 @@
 #include "vm/virtual_memory.h"
 
 #include <sys/mman.h>  // NOLINT
-#include <unistd.h>  // NOLINT
+#include <unistd.h>    // NOLINT
 
 #include "platform/assert.h"
 #include "platform/utils.h"
@@ -32,8 +32,7 @@
 
 VirtualMemory* VirtualMemory::ReserveInternal(intptr_t size) {
   void* address = mmap(NULL, size, PROT_NONE,
-                       MAP_PRIVATE | MAP_ANON | MAP_NORESERVE,
-                       -1, 0);
+                       MAP_PRIVATE | MAP_ANON | MAP_NORESERVE, -1, 0);
   if (address == MAP_FAILED) {
     return NULL;
   }
@@ -71,8 +70,7 @@
   ASSERT(Contains(addr + size) || (addr + size == end()));
   int prot = PROT_READ | PROT_WRITE | (executable ? PROT_EXEC : 0);
   void* address = mmap(reinterpret_cast<void*>(addr), size, prot,
-                       MAP_PRIVATE | MAP_ANON | MAP_FIXED,
-                       -1, 0);
+                       MAP_PRIVATE | MAP_ANON | MAP_FIXED, -1, 0);
   if (address == MAP_FAILED) {
     return false;
   }
@@ -105,8 +103,7 @@
       break;
   }
   return (mprotect(reinterpret_cast<void*>(page_address),
-                   end_address - page_address,
-                   prot) == 0);
+                   end_address - page_address, prot) == 0);
 }
 
 
diff --git a/runtime/vm/virtual_memory_macos.cc b/runtime/vm/virtual_memory_macos.cc
index 484ad78..6f42b55 100644
--- a/runtime/vm/virtual_memory_macos.cc
+++ b/runtime/vm/virtual_memory_macos.cc
@@ -8,7 +8,7 @@
 #include "vm/virtual_memory.h"
 
 #include <sys/mman.h>  // NOLINT
-#include <unistd.h>  // NOLINT
+#include <unistd.h>    // NOLINT
 
 #include "platform/assert.h"
 #include "platform/utils.h"
@@ -33,8 +33,7 @@
 VirtualMemory* VirtualMemory::ReserveInternal(intptr_t size) {
   ASSERT((size & (PageSize() - 1)) == 0);
   void* address = mmap(NULL, size, PROT_NONE,
-                       MAP_PRIVATE | MAP_ANON | MAP_NORESERVE,
-                       -1, 0);
+                       MAP_PRIVATE | MAP_ANON | MAP_NORESERVE, -1, 0);
   if (address == MAP_FAILED) {
     return NULL;
   }
@@ -72,8 +71,7 @@
   ASSERT(Contains(addr + size) || (addr + size == end()));
   int prot = PROT_READ | PROT_WRITE | (executable ? PROT_EXEC : 0);
   void* address = mmap(reinterpret_cast<void*>(addr), size, prot,
-                       MAP_PRIVATE | MAP_ANON | MAP_FIXED,
-                       -1, 0);
+                       MAP_PRIVATE | MAP_ANON | MAP_FIXED, -1, 0);
   if (address == MAP_FAILED) {
     return false;
   }
@@ -106,8 +104,7 @@
       break;
   }
   return (mprotect(reinterpret_cast<void*>(page_address),
-                   end_address - page_address,
-                   prot) == 0);
+                   end_address - page_address, prot) == 0);
 }
 
 }  // namespace dart
diff --git a/runtime/vm/virtual_memory_win.cc b/runtime/vm/virtual_memory_win.cc
index 2584613..de9156d 100644
--- a/runtime/vm/virtual_memory_win.cc
+++ b/runtime/vm/virtual_memory_win.cc
@@ -90,9 +90,7 @@
   }
   DWORD old_prot = 0;
   bool result = VirtualProtect(reinterpret_cast<void*>(page_address),
-                        end_address - page_address,
-                        prot,
-                        &old_prot);
+                               end_address - page_address, prot, &old_prot);
   return result;
 }
 
diff --git a/runtime/vm/visitor.h b/runtime/vm/visitor.h
index 3c35b10..51f95ed 100644
--- a/runtime/vm/visitor.h
+++ b/runtime/vm/visitor.h
@@ -18,8 +18,8 @@
 // An object pointer visitor interface.
 class ObjectPointerVisitor {
  public:
-  explicit ObjectPointerVisitor(Isolate* isolate) : isolate_(isolate) { }
-  virtual ~ObjectPointerVisitor() { }
+  explicit ObjectPointerVisitor(Isolate* isolate) : isolate_(isolate) {}
+  virtual ~ObjectPointerVisitor() {}
 
   Isolate* isolate() const { return isolate_; }
 
@@ -27,15 +27,13 @@
   virtual void VisitPointers(RawObject** first, RawObject** last) = 0;
 
   virtual bool visit_function_code() const { return true; }
-  virtual void add_skipped_code_function(RawFunction* funct) {
-    UNREACHABLE();
-  }
+  virtual void add_skipped_code_function(RawFunction* funct) { UNREACHABLE(); }
   // len argument is the number of pointers to visit starting from 'p'.
   void VisitPointers(RawObject** p, intptr_t len) {
     VisitPointers(p, (p + len - 1));
   }
 
-  void VisitPointer(RawObject** p) { VisitPointers(p , p); }
+  void VisitPointer(RawObject** p) { VisitPointers(p, p); }
 
  private:
   Isolate* isolate_;
@@ -48,9 +46,9 @@
 // An object visitor interface.
 class ObjectVisitor {
  public:
-  ObjectVisitor() { }
+  ObjectVisitor() {}
 
-  virtual ~ObjectVisitor() { }
+  virtual ~ObjectVisitor() {}
 
   // Invoked for each object.
   virtual void VisitObject(RawObject* obj) = 0;
@@ -63,8 +61,8 @@
 // An object finder visitor interface.
 class FindObjectVisitor {
  public:
-  FindObjectVisitor() { }
-  virtual ~FindObjectVisitor() { }
+  FindObjectVisitor() {}
+  virtual ~FindObjectVisitor() {}
 
   // Allow to specify a address filter.
   virtual uword filter_addr() const { return 0; }
diff --git a/runtime/vm/weak_code.cc b/runtime/vm/weak_code.cc
index 4de2189..c7e12d1 100644
--- a/runtime/vm/weak_code.cc
+++ b/runtime/vm/weak_code.cc
@@ -32,13 +32,13 @@
     }
   }
 
-  const WeakProperty& weak_property = WeakProperty::Handle(
-      WeakProperty::New(Heap::kOld));
+  const WeakProperty& weak_property =
+      WeakProperty::Handle(WeakProperty::New(Heap::kOld));
   weak_property.set_key(value);
 
   intptr_t length = array_.IsNull() ? 0 : array_.Length();
-  const Array& new_array = Array::Handle(
-      Array::Grow(array_, length + 1, Heap::kOld));
+  const Array& new_array =
+      Array::Handle(Array::Grow(array_, length + 1, Heap::kOld));
   new_array.SetAt(length, weak_property);
   UpdateArrayTo(new_array);
 }
diff --git a/runtime/vm/weak_table.cc b/runtime/vm/weak_table.cc
index e45e9c8..a9e8c11 100644
--- a/runtime/vm/weak_table.cc
+++ b/runtime/vm/weak_table.cc
@@ -18,8 +18,9 @@
     // Increase the capacity.
     result = size * 2;
     if (result < size) {
-      FATAL("Reached impossible state of having more weak table entries"
-            " than memory available for heap objects.");
+      FATAL(
+          "Reached impossible state of having more weak table entries"
+          " than memory available for heap objects.");
     }
   }
   if (result < kMinSize) {
@@ -91,8 +92,8 @@
 
   intptr_t new_size = SizeFor(count(), size());
   ASSERT(Utils::IsPowerOfTwo(new_size));
-  intptr_t* new_data = reinterpret_cast<intptr_t*>(
-      calloc(new_size, kEntrySize * kWordSize));
+  intptr_t* new_data =
+      reinterpret_cast<intptr_t*>(calloc(new_size, kEntrySize * kWordSize));
 
   intptr_t mask = new_size - 1;
   set_used(0);
diff --git a/runtime/vm/weak_table.h b/runtime/vm/weak_table.h
index 8489dda..5814bb0 100644
--- a/runtime/vm/weak_table.h
+++ b/runtime/vm/weak_table.h
@@ -26,7 +26,7 @@
     }
     // Get a max size that avoids overflows.
     const intptr_t kMaxSize =
-      (kIntptrOne << (kBitsPerWord - 2)) / (kEntrySize * kWordSize);
+        (kIntptrOne << (kBitsPerWord - 2)) / (kEntrySize * kWordSize);
     ASSERT(Utils::IsPowerOfTwo(kMaxSize));
     if (size > kMaxSize) {
       size = kMaxSize;
@@ -36,9 +36,7 @@
     data_ = reinterpret_cast<intptr_t*>(calloc(size_, kEntrySize * kWordSize));
   }
 
-  ~WeakTable() {
-    free(data_);
-  }
+  ~WeakTable() { free(data_); }
 
   static WeakTable* NewFrom(WeakTable* original) {
     return new WeakTable(SizeFor(original->count(), original->size()));
@@ -49,11 +47,9 @@
   intptr_t count() const { return count_; }
 
   bool IsValidEntryAt(intptr_t i) const {
-    ASSERT(((ValueAt(i) == 0) &&
-            ((ObjectAt(i) == NULL) ||
-             (data_[ObjectIndex(i)] == kDeletedEntry))) ||
-           ((ValueAt(i) != 0) &&
-            (ObjectAt(i) != NULL) &&
+    ASSERT(((ValueAt(i) == 0) && ((ObjectAt(i) == NULL) ||
+                                  (data_[ObjectIndex(i)] == kDeletedEntry))) ||
+           ((ValueAt(i) != 0) && (ObjectAt(i) != NULL) &&
             (data_[ObjectIndex(i)] != kDeletedEntry)));
     return (data_[ValueIndex(i)] != 0);
   }
@@ -111,9 +107,7 @@
   }
   intptr_t limit() const { return LimitFor(size()); }
 
-  intptr_t index(intptr_t i) const {
-    return i * kEntrySize;
-  }
+  intptr_t index(intptr_t i) const { return i * kEntrySize; }
 
   void set_used(intptr_t val) {
     ASSERT(val <= limit());
@@ -126,13 +120,9 @@
     count_ = val;
   }
 
-  intptr_t ObjectIndex(intptr_t i) const {
-    return index(i) + kObjectOffset;
-  }
+  intptr_t ObjectIndex(intptr_t i) const { return index(i) + kObjectOffset; }
 
-  intptr_t ValueIndex(intptr_t i) const {
-    return index(i) + kValueOffset;
-  }
+  intptr_t ValueIndex(intptr_t i) const { return index(i) + kValueOffset; }
 
   void SetObjectAt(intptr_t i, RawObject* key) {
     ASSERT(i >= 0);
diff --git a/runtime/vm/zone.cc b/runtime/vm/zone.cc
index bace1f3..45314dc 100644
--- a/runtime/vm/zone.cc
+++ b/runtime/vm/zone.cc
@@ -107,7 +107,7 @@
     Segment::DeleteSegmentList(large_segments_);
   }
 
-  // Reset zone state.
+// Reset zone state.
 #ifdef DEBUG
   memset(initial_buffer_.pointer(), kZapDeletedByte, initial_buffer_.size());
 #endif
@@ -147,11 +147,11 @@
   // there isn't enough room in the Zone to satisfy the request.
   ASSERT(Utils::IsAligned(size, kAlignment));
   intptr_t free_size = (limit_ - position_);
-  ASSERT(free_size <  size);
+  ASSERT(free_size < size);
 
   // First check to see if we should just chain it as a large segment.
-  intptr_t max_size = Utils::RoundDown(kSegmentSize - sizeof(Segment),
-                                       kAlignment);
+  intptr_t max_size =
+      Utils::RoundDown(kSegmentSize - sizeof(Segment), kAlignment);
   ASSERT(max_size > 0);
   if (size > max_size) {
     return AllocateLargeSegment(size);
@@ -175,7 +175,7 @@
   // there isn't enough room in the Zone to satisfy the request.
   ASSERT(Utils::IsAligned(size, kAlignment));
   intptr_t free_size = (limit_ - position_);
-  ASSERT(free_size <  size);
+  ASSERT(free_size < size);
 
   // Create a new large segment and chain it up.
   ASSERT(Utils::IsAligned(sizeof(Segment), kAlignment));
@@ -230,7 +230,8 @@
   for (Segment* s = large_segments_; s != NULL; s = s->next()) {
     size += s->size();
   }
-  OS::PrintErr("***   Zone(0x%" Px ") size in bytes,"
+  OS::PrintErr("***   Zone(0x%" Px
+               ") size in bytes,"
                " Total = %" Pd " Large Segments = %" Pd "\n",
                reinterpret_cast<intptr_t>(this), SizeInBytes(), size);
 }
diff --git a/runtime/vm/zone.h b/runtime/vm/zone.h
index 6d216e9..4e2e8a9 100644
--- a/runtime/vm/zone.h
+++ b/runtime/vm/zone.h
@@ -98,9 +98,7 @@
   uword AllocateLargeSegment(intptr_t size);
 
   // Insert zone into zone chain, after current_zone.
-  void Link(Zone* current_zone) {
-    previous_ = current_zone;
-  }
+  void Link(Zone* current_zone) { previous_ = current_zone; }
 
   // Delete all objects and free all memory allocated in the zone.
   void DeleteAll();
@@ -156,9 +154,9 @@
 
   friend class StackZone;
   friend class ApiZone;
-  template<typename T, typename B, typename Allocator>
+  template <typename T, typename B, typename Allocator>
   friend class BaseGrowableArray;
-  template<typename T, typename B, typename Allocator>
+  template <typename T, typename B, typename Allocator>
   friend class BaseDirectChainedHashMap;
   DISALLOW_COPY_AND_ASSIGN(Zone);
 };
@@ -181,8 +179,10 @@
  private:
   Zone zone_;
 
-  template<typename T> friend class GrowableArray;
-  template<typename T> friend class ZoneGrowableArray;
+  template <typename T>
+  friend class GrowableArray;
+  template <typename T>
+  friend class ZoneGrowableArray;
 
   DISALLOW_IMPLICIT_CONSTRUCTORS(StackZone);
 };
@@ -251,8 +251,7 @@
   ElementType* new_data = Alloc<ElementType>(new_len);
   if (old_data != 0) {
     memmove(reinterpret_cast<void*>(new_data),
-            reinterpret_cast<void*>(old_data),
-            old_len * kElementSize);
+            reinterpret_cast<void*>(old_data), old_len * kElementSize);
   }
   return new_data;
 }
diff --git a/runtime/vm/zone_test.cc b/runtime/vm/zone_test.cc
index 9ddf276..4cb9231 100644
--- a/runtime/vm/zone_test.cc
+++ b/runtime/vm/zone_test.cc
@@ -14,8 +14,8 @@
 #if defined(DEBUG)
   FLAG_trace_zones = true;
 #endif
-  Dart_CreateIsolate(
-      NULL, NULL, bin::isolate_snapshot_buffer, NULL, NULL, NULL);
+  Dart_CreateIsolate(NULL, NULL, bin::isolate_snapshot_buffer, NULL, NULL,
+                     NULL);
   Thread* thread = Thread::Current();
   EXPECT(thread->zone() == NULL);
   {
@@ -46,8 +46,8 @@
 
     // Test corner cases of kSegmentSize.
     uint8_t* buffer = NULL;
-    buffer = reinterpret_cast<uint8_t*>(
-        zone->AllocUnsafe(kSegmentSize - kWordSize));
+    buffer =
+        reinterpret_cast<uint8_t*>(zone->AllocUnsafe(kSegmentSize - kWordSize));
     EXPECT(buffer != NULL);
     buffer[(kSegmentSize - kWordSize) - 1] = 0;
     allocated_size += (kSegmentSize - kWordSize);
@@ -60,8 +60,8 @@
     allocated_size += (kSegmentSize - (2 * kWordSize));
     EXPECT_LE(allocated_size, zone->SizeInBytes());
 
-    buffer = reinterpret_cast<uint8_t*>(
-        zone->AllocUnsafe(kSegmentSize + kWordSize));
+    buffer =
+        reinterpret_cast<uint8_t*>(zone->AllocUnsafe(kSegmentSize + kWordSize));
     EXPECT(buffer != NULL);
     buffer[(kSegmentSize + kWordSize) - 1] = 0;
     allocated_size += (kSegmentSize + kWordSize);
@@ -76,8 +76,8 @@
 #if defined(DEBUG)
   FLAG_trace_zones = true;
 #endif
-  Dart_CreateIsolate(
-      NULL, NULL, bin::isolate_snapshot_buffer, NULL, NULL, NULL);
+  Dart_CreateIsolate(NULL, NULL, bin::isolate_snapshot_buffer, NULL, NULL,
+                     NULL);
   Thread* thread = Thread::Current();
   EXPECT(thread->zone() == NULL);
   {
@@ -100,8 +100,8 @@
 #if defined(DEBUG)
   FLAG_trace_zones = true;
 #endif
-  Dart_CreateIsolate(
-      NULL, NULL, bin::isolate_snapshot_buffer, NULL, NULL, NULL);
+  Dart_CreateIsolate(NULL, NULL, bin::isolate_snapshot_buffer, NULL, NULL,
+                     NULL);
   Thread* thread = Thread::Current();
   EXPECT(thread->zone() == NULL);
   {
@@ -119,16 +119,16 @@
 #if defined(DEBUG)
   FLAG_trace_zones = true;
 #endif
-  Dart_CreateIsolate(
-      NULL, NULL, bin::isolate_snapshot_buffer, NULL, NULL, NULL);
+  Dart_CreateIsolate(NULL, NULL, bin::isolate_snapshot_buffer, NULL, NULL,
+                     NULL);
   Thread* thread = Thread::Current();
   EXPECT(thread->zone() == NULL);
   static int marker;
 
   class SimpleZoneObject : public ZoneAllocated {
    public:
-    SimpleZoneObject() : slot(marker++) { }
-    virtual ~SimpleZoneObject() { }
+    SimpleZoneObject() : slot(marker++) {}
+    virtual ~SimpleZoneObject() {}
     virtual int GetSlot() { return slot; }
     int slot;
   };
diff --git a/samples/samples.status b/samples/samples.status
index 02b193f..fd8f581 100644
--- a/samples/samples.status
+++ b/samples/samples.status
@@ -14,12 +14,17 @@
 [ $compiler == dart2js && $cps_ir && $checked ]
 sample_extension: Crash # Unable to compile UnsupportedError.message.
 
-
 [ $compiler == dart2analyzer ]
 build_dart: Skip
 
+[ $arch == ia32 && $system == windows ]
+sample_extension/test/sample_extension_app_snapshot_test: RuntimeError # Issue 27786
+
 [ $arch == arm ]
 sample_extension/test/*: Skip # Issue 14705
 
-[ $noopt || $runtime == dart_precompiled || $runtime == dart_app ]
-sample_extension: Skip # Platform.executable
+[ $compiler == precompiler ]
+sample_extension/test/*: Skip # These tests attempt to spawn another script using the precompiled runtime.
+
+[ $runtime == dart_app ]
+sample_extension/test/*: Skip # Shared use of a temp directory
diff --git a/sdk/lib/_internal/js_runtime/lib/interceptors.dart b/sdk/lib/_internal/js_runtime/lib/interceptors.dart
index 23025ad..7246c40 100644
--- a/sdk/lib/_internal/js_runtime/lib/interceptors.dart
+++ b/sdk/lib/_internal/js_runtime/lib/interceptors.dart
@@ -168,24 +168,69 @@
     }
   }
 
-  var interceptor = lookupAndCacheInterceptor(object);
-  if (interceptor == null) {
-    // JavaScript Objects created via object literals and `Object.create(null)`
-    // are 'plain' Objects.  This test could be simplified and the dispatch path
-    // be faster if Object.prototype was pre-patched with a non-leaf dispatch
-    // record.
-    if (JS('bool', 'typeof # == "function"', object)) {
-      return JS_INTERCEPTOR_CONSTANT(JavaScriptFunction);
-    }
-    var proto = JS('', 'Object.getPrototypeOf(#)', object);
-    if (JS('bool', '# == null || # === Object.prototype', proto, proto)) {
-      return JS_INTERCEPTOR_CONSTANT(PlainJavaScriptObject);
-    } else {
-      return JS_INTERCEPTOR_CONSTANT(UnknownJavaScriptObject);
-    }
-  }
+  // Check for cached UnknownJavaScriptObject. This avoids doing the slow
+  // dispatch-record based lookup for repeated js-interop classes.
+  var constructor = JS('', '#.constructor', object);
+  var interceptor = lookupInterceptorByConstructor(constructor);
+  if (interceptor != null) return interceptor;
 
-  return interceptor;
+  // This takes care of dispatch-record based caching, but not constructor based
+  // caching of [UnknownJavaScriptObject]s.
+  interceptor = lookupAndCacheInterceptor(object);
+  if (interceptor != null) return interceptor;
+
+  // JavaScript Objects created via object literals and `Object.create(null)`
+  // are 'plain' Objects.  This test could be simplified and the dispatch path
+  // be faster if Object.prototype was pre-patched with a non-leaf dispatch
+  // record.
+  if (JS('bool', 'typeof # == "function"', object)) {
+    interceptor = JS_INTERCEPTOR_CONSTANT(JavaScriptFunction);
+    // TODO(sra): Investigate caching on `Function`. It might be impossible if
+    // some HTML embedded objects on some browsers are (still) JS functions.
+    return interceptor;
+  }
+  var proto = JS('', 'Object.getPrototypeOf(#)', object);
+  if (JS('bool', '# == null', proto)) {
+    // Nowhere to cache output.
+    return JS_INTERCEPTOR_CONSTANT(PlainJavaScriptObject);
+  }
+  interceptor = JS_INTERCEPTOR_CONSTANT(UnknownJavaScriptObject);
+  if (JS('bool', '# === Object.prototype', proto)) {
+    interceptor = JS_INTERCEPTOR_CONSTANT(PlainJavaScriptObject);
+    // TODO(sra): Investigate caching on 'Object'. It might be impossible if
+    // some native class is plain Object (e.g. like Firefox's ImageData).
+    return interceptor;
+  }
+  if (JS('bool', 'typeof # == "function"', constructor)) {
+    cacheInterceptorOnConstructor(constructor, interceptor);
+    return interceptor;
+  }
+  return JS_INTERCEPTOR_CONSTANT(UnknownJavaScriptObject);
+}
+
+
+// A JS String or Symbol.
+final JS_INTEROP_INTERCEPTOR_TAG = getIsolateAffinityTag(r'_$dart_js');
+
+lookupInterceptorByConstructor(constructor) {
+  return constructor == null
+      ? null
+      : JS('', '#[#]', constructor, JS_INTEROP_INTERCEPTOR_TAG);
+}
+
+void cacheInterceptorOnConstructor(constructor, interceptor) {
+  defineProperty(constructor, JS_INTEROP_INTERCEPTOR_TAG, interceptor);
+}
+
+var constructorToInterceptor =
+    JS('', 'typeof(self.WeakMap) == "undefined" ? new Map() : new WeakMap()');
+
+XlookupInterceptorByConstructor(constructor) {
+  return JS('', '#.get(#)', constructorToInterceptor, constructor);
+}
+
+void XcacheInterceptorOnConstructor(constructor, interceptor) {
+  JS('', '#.set(#, #)', constructorToInterceptor, constructor, interceptor);
 }
 
 /**
diff --git a/sdk/lib/_internal/js_runtime/lib/native_helper.dart b/sdk/lib/_internal/js_runtime/lib/native_helper.dart
index 30d3ba7..d3ef5f2 100644
--- a/sdk/lib/_internal/js_runtime/lib/native_helper.dart
+++ b/sdk/lib/_internal/js_runtime/lib/native_helper.dart
@@ -449,13 +449,9 @@
 
 const _baseHooks = const JS_CONST(r'''
 function() {
-  function typeNameInChrome(o) {
-    var constructor = o.constructor;
-    if (constructor) {
-      var name = constructor.name;
-      if (name) return name;
-    }
-    var s = Object.prototype.toString.call(o);
+  var toStringFunction = Object.prototype.toString;
+  function getTag(o) {
+    var s = toStringFunction.call(o);
     return s.substring(8, s.length - 1);
   }
   function getUnknownTag(object, tag) {
@@ -463,7 +459,7 @@
     // here allows [getUnknownTag] to be tested on d8.
     if (/^HTML[A-Z].*Element$/.test(tag)) {
       // Check that it is not a simple JavaScript object.
-      var name = Object.prototype.toString.call(object);
+      var name = toStringFunction.call(object);
       if (name == "[object Object]") return null;
       return "HTMLElement";
     }
@@ -484,7 +480,7 @@
   var isBrowser = typeof navigator == "object";
 
   return {
-    getTag: typeNameInChrome,
+    getTag: getTag,
     getUnknownTag: isBrowser ? getUnknownTagGenericBrowser : getUnknownTag,
     prototypeForTag: prototypeForTag,
     discriminator: discriminator };
@@ -501,30 +497,6 @@
  */
 const _constructorNameFallback = const JS_CONST(r'''
 function getTagFallback(o) {
-  var constructor = o.constructor;
-  if (typeof constructor == "function") {
-    var name = constructor.name;
-    // If the name is a non-empty string, we use that as the type name of this
-    // object.  There are various cases where that does not work, so we have to
-    // detect them and fall through to the toString() based implementation.
-
-    if (typeof name == "string" &&
-
-        // Sometimes the string is empty.  This test also catches minified
-        // shadow dom polyfil wrapper for Window on Firefox where the faked
-        // constructor name does not 'stick'.  The shortest real DOM object
-        // names have three characters (e.g. URL, CSS).
-        name.length > 2 &&
-
-        // On Firefox we often get "Object" as the constructor name, even for
-        // more specialized DOM objects.
-        name !== "Object" &&
-
-        // This can happen in Opera.
-        name !== "Function.prototype") {
-      return name;
-    }
-  }
   var s = Object.prototype.toString.call(o);
   return s.substring(8, s.length - 1);
 }''');
diff --git a/sdk/lib/core/stopwatch.dart b/sdk/lib/core/stopwatch.dart
index e923083..f6dd85e 100644
--- a/sdk/lib/core/stopwatch.dart
+++ b/sdk/lib/core/stopwatch.dart
@@ -9,31 +9,35 @@
  */
 class Stopwatch {
   /**
-   * Frequency of the elapsed counter in Hz.
+   * Cached frequency of the system. Must be initialized in [_initTicker];
    */
-  int get frequency => _frequency;
+  static int _frequency;
 
   // The _start and _stop fields capture the time when [start] and [stop]
   // are called respectively.
-  // If _start is null, then the [Stopwatch] has not been started yet.
-  // If _stop is null, then the [Stopwatch] has not been stopped yet,
-  // or is running.
-  int _start;
-  int _stop;
+  // If _stop is null, the stopwatched is running.
+  int _start = 0;
+  int _stop = 0;
 
   /**
    * Creates a [Stopwatch] in stopped state with a zero elapsed count.
    *
    * The following example shows how to start a [Stopwatch]
    * immediately after allocation.
-   *
-   *     Stopwatch stopwatch = new Stopwatch()..start();
+   * ```
+   * var stopwatch = new Stopwatch()..start();
+   * ```
    */
   Stopwatch() {
-    _initTicker();
+    if (_frequency == null) _initTicker();
   }
 
   /**
+   * Frequency of the elapsed counter in Hz.
+   */
+  int get frequency => _frequency;
+
+  /**
    * Starts the [Stopwatch].
    *
    * The [elapsed] count is increasing monotonically. If the [Stopwatch] has
@@ -43,14 +47,10 @@
    * If the [Stopwatch] is currently running, then calling start does nothing.
    */
   void start() {
-    if (isRunning) return;
-    if (_start == null) {
-      // This stopwatch has never been started.
-      _start = _now();
-    } else {
-      // Restart this stopwatch. Prepend the elapsed time to the current
-      // start time.
-      _start = _now() - (_stop - _start);
+    if (_stop != null) {
+      // (Re)start this stopwatch.
+      // Don't count the time while the stopwatch has been stopped.
+      _start += _now() - _stop;
       _stop = null;
     }
   }
@@ -63,8 +63,7 @@
    * effect.
    */
   void stop() {
-    if (!isRunning) return;
-    _stop = _now();
+    _stop ??= _now();
   }
 
   /**
@@ -73,51 +72,40 @@
    * This method does not stop or start the [Stopwatch].
    */
   void reset() {
-    if (_start == null) return;
-    // If [_start] is not null, then the stopwatch had already been started. It
-    // may running right now.
-    _start = _now();
-    if (_stop != null) {
-      // The watch is not running. So simply set the [_stop] to [_start] thus
-      // having an elapsed time of 0.
-      _stop = _start;
-    }
+    _start = _stop ?? _now();
   }
 
   /**
-   * Returns the elapsed number of clock ticks since calling [start] while the
+   * The elapsed number of clock ticks since calling [start] while the
    * [Stopwatch] is running.
    *
-   * Returns the elapsed number of clock ticks between calling [start] and
+   * This is the elapsed number of clock ticks between calling [start] and
    * calling [stop].
    *
-   * Returns 0 if the [Stopwatch] has never been started.
+   * Is 0 if the [Stopwatch] has never been started.
    *
    * The elapsed number of clock ticks increases by [frequency] every second.
    */
   int get elapsedTicks {
-    if (_start == null) {
-      return 0;
-    }
-    return (_stop == null) ? (_now() - _start) : (_stop - _start);
+    return (_stop ?? _now()) - _start;
   }
 
   /**
-   * Returns the [elapsedTicks] counter converted to a [Duration].
+   * The [elapsedTicks] counter converted to a [Duration].
    */
   Duration get elapsed {
     return new Duration(microseconds: elapsedMicroseconds);
   }
 
   /**
-   * Returns the [elapsedTicks] counter converted to microseconds.
+   * The [elapsedTicks] counter converted to microseconds.
    */
   int get elapsedMicroseconds {
     return (elapsedTicks * 1000000) ~/ frequency;
   }
 
   /**
-   * Returns the [elapsedTicks] counter converted to milliseconds.
+   * The [elapsedTicks] counter converted to milliseconds.
    */
   int get elapsedMilliseconds {
     return (elapsedTicks * 1000) ~/ frequency;
@@ -125,14 +113,9 @@
 
 
   /**
-   * Returns wether the [StopWatch] is currently running.
+   * Whether the [StopWatch] is currently running.
    */
-  bool get isRunning => _start != null && _stop == null;
-
-  /**
-   * Cached frequency of the system. Must be initialized in [_initTicker];
-   */
-  static int _frequency;
+  bool get isRunning => _stop == null;
 
   /**
    * Initializes the time-measuring system. *Must* initialize the [_frequency]
diff --git a/sdk/lib/developer/extension.dart b/sdk/lib/developer/extension.dart
index 75737f6..5883fb5 100644
--- a/sdk/lib/developer/extension.dart
+++ b/sdk/lib/developer/extension.dart
@@ -13,7 +13,7 @@
   final int _errorCode;
   final String _errorDetail;
 
-  /// Creates a successful to a service protocol extension RPC.
+  /// Creates a successful response to a service protocol extension RPC.
   ///
   /// Requires [result] to be a JSON object encoded as a string. When forming
   /// the JSON-RPC message [result] will be inlined directly.
diff --git a/sdk/lib/developer/service.dart b/sdk/lib/developer/service.dart
index 2934afe..9ccf0dc 100644
--- a/sdk/lib/developer/service.dart
+++ b/sdk/lib/developer/service.dart
@@ -4,7 +4,10 @@
 
 part of dart.developer;
 
-/// Information about the service protocol.
+/// Service protocol is the protocol that a client like the observatory
+/// could use to access the services provided by the Dart VM for
+/// debugging and inspecting Dart programs. This class encapsulates the
+/// version number and Uri for accessing this service.
 class ServiceProtocolInfo {
   /// The major version of the protocol. If the running Dart environment does
   /// not support the service protocol, this is 0.
@@ -28,9 +31,12 @@
   }
 }
 
-/// Access information about the service protocol and control the web server.
+/// Access information about the service protocol and control the web server
+/// that provides access to the services provided by the Dart VM for
+/// debugging and inspecting Dart programs.
 class Service {
-  /// Get information about the service protocol.
+  /// Get information about the service protocol (version number and
+  /// Uri to access the service).
   static Future<ServiceProtocolInfo> getInfo() async {
     // Port to receive response from service isolate.
     final RawReceivePort receivePort = new RawReceivePort();
@@ -46,6 +52,8 @@
   }
 
   /// Control the web server that the service protocol is accessed through.
+  /// The [enable] argument must be a boolean and is used as a toggle to
+  /// enable(true) or disable(false) the web server servicing requests.
   static Future<ServiceProtocolInfo> controlWebServer(
       {bool enable: false}) async {
     if (enable is! bool) {
diff --git a/tests/compiler/dart2js/call_site_simple_type_inferer_test.dart b/tests/compiler/dart2js/call_site_simple_type_inferer_test.dart
index 8a6e86b..f12fe38 100644
--- a/tests/compiler/dart2js/call_site_simple_type_inferer_test.dart
+++ b/tests/compiler/dart2js/call_site_simple_type_inferer_test.dart
@@ -211,7 +211,7 @@
     var expectedTypes = f(compiler);
     var signature = element.functionSignature;
     int index = 0;
-    var inferrer = compiler.globalInference.typesInferrer;
+    var inferrer = compiler.globalInference.typesInferrerInternal;
     signature.forEachParameter((Element element) {
       Expect.equals(expectedTypes[index++],
           simplify(inferrer.getTypeOfElement(element), compiler), test);
@@ -230,31 +230,37 @@
 }
 
 void test() {
-  runTest(TEST_1, (compiler) => [compiler.commonMasks.stringType]);
-  runTest(TEST_2, (compiler) => [compiler.commonMasks.uint31Type]);
-  runTest(TEST_3, (compiler) => [compiler.commonMasks.intType]);
-  runTest(TEST_4, (compiler) => [compiler.commonMasks.numType]);
-  runTest(TEST_5, (compiler) => [compiler.commonMasks.numType]);
-  runTest(TEST_6, (compiler) => [compiler.commonMasks.numType]);
+  runTest(TEST_1, (compiler) => [compiler.closedWorld.commonMasks.stringType]);
+  runTest(TEST_2, (compiler) => [compiler.closedWorld.commonMasks.uint31Type]);
+  runTest(TEST_3, (compiler) => [compiler.closedWorld.commonMasks.intType]);
+  runTest(TEST_4, (compiler) => [compiler.closedWorld.commonMasks.numType]);
+  runTest(TEST_5, (compiler) => [compiler.closedWorld.commonMasks.numType]);
+  runTest(TEST_6, (compiler) => [compiler.closedWorld.commonMasks.numType]);
   runTest(TEST_7a, (compiler) => [subclassOfInterceptor(compiler)]);
   runTest(
-      TEST_7b, (compiler) => [compiler.commonMasks.dynamicType.nonNullable()]);
+      TEST_7b,
+      (compiler) =>
+          [compiler.closedWorld.commonMasks.dynamicType.nonNullable()]);
 
   runTest(
       TEST_8,
       (compiler) => [
-            compiler.commonMasks.uint31Type,
+            compiler.closedWorld.commonMasks.uint31Type,
             subclassOfInterceptor(compiler),
-            compiler.commonMasks.dynamicType.nonNullable()
+            compiler.closedWorld.commonMasks.dynamicType.nonNullable()
           ]);
   runTest(
       TEST_9,
-      (compiler) =>
-          [compiler.commonMasks.uint31Type, compiler.commonMasks.uint31Type]);
+      (compiler) => [
+            compiler.closedWorld.commonMasks.uint31Type,
+            compiler.closedWorld.commonMasks.uint31Type
+          ]);
   runTest(
       TEST_10,
-      (compiler) =>
-          [compiler.commonMasks.uint31Type, compiler.commonMasks.uint31Type]);
+      (compiler) => [
+            compiler.closedWorld.commonMasks.uint31Type,
+            compiler.closedWorld.commonMasks.uint31Type
+          ]);
   runTest(
       TEST_11,
       (compiler) =>
@@ -262,35 +268,41 @@
 
   runTest(
       TEST_12,
-      (compiler) =>
-          [compiler.commonMasks.stringType, compiler.commonMasks.uint31Type]);
+      (compiler) => [
+            compiler.closedWorld.commonMasks.stringType,
+            compiler.closedWorld.commonMasks.uint31Type
+          ]);
 
-  runTest(TEST_13, (compiler) => [compiler.commonMasks.numType]);
+  runTest(TEST_13, (compiler) => [compiler.closedWorld.commonMasks.numType]);
 
   runTest(
       TEST_14,
-      (compiler) =>
-          [compiler.commonMasks.uint31Type, compiler.commonMasks.stringType]);
+      (compiler) => [
+            compiler.closedWorld.commonMasks.uint31Type,
+            compiler.closedWorld.commonMasks.stringType
+          ]);
 
   runTest(
       TEST_15,
-      (compiler) =>
-          [compiler.commonMasks.stringType, compiler.commonMasks.boolType]);
+      (compiler) => [
+            compiler.closedWorld.commonMasks.stringType,
+            compiler.closedWorld.commonMasks.boolType
+          ]);
 
   runTest(
       TEST_16,
       (compiler) => [
-            compiler.commonMasks.uint31Type,
-            compiler.commonMasks.uint31Type,
-            compiler.commonMasks.stringType
+            compiler.closedWorld.commonMasks.uint31Type,
+            compiler.closedWorld.commonMasks.uint31Type,
+            compiler.closedWorld.commonMasks.stringType
           ]);
 
   runTest(
       TEST_17,
       (compiler) => [
-            compiler.commonMasks.uint31Type,
-            compiler.commonMasks.boolType,
-            compiler.commonMasks.doubleType
+            compiler.closedWorld.commonMasks.uint31Type,
+            compiler.closedWorld.commonMasks.boolType,
+            compiler.closedWorld.commonMasks.doubleType
           ]);
 
   runTest(
diff --git a/tests/compiler/dart2js/closure_tracer_test.dart b/tests/compiler/dart2js/closure_tracer_test.dart
index 110ccd4..f76bea1 100644
--- a/tests/compiler/dart2js/closure_tracer_test.dart
+++ b/tests/compiler/dart2js/closure_tracer_test.dart
@@ -154,8 +154,8 @@
   Uri uri = new Uri(scheme: 'source');
   var compiler = compilerFor(TEST, uri);
   asyncTest(() => compiler.run(uri).then((_) {
-        var commonMasks = compiler.commonMasks;
-        var typesInferrer = compiler.globalInference.typesInferrer;
+        var commonMasks = compiler.closedWorld.commonMasks;
+        var typesInferrer = compiler.globalInference.typesInferrerInternal;
 
         checkType(String name, type) {
           var element = findElement(compiler, name);
diff --git a/tests/compiler/dart2js/compiler_helper.dart b/tests/compiler/dart2js/compiler_helper.dart
index c9bd508..eaa26df 100644
--- a/tests/compiler/dart2js/compiler_helper.dart
+++ b/tests/compiler/dart2js/compiler_helper.dart
@@ -72,10 +72,9 @@
     lego.Element element = compiler.mainApp.find(entry);
     if (element == null) return null;
     compiler.phase = Compiler.PHASE_RESOLVING;
-    compiler.backend.enqueueHelpers(
-        compiler.enqueuer.resolution, compiler.globalDependencies);
+    compiler.backend.enqueueHelpers(compiler.enqueuer.resolution);
     compiler.processQueue(compiler.enqueuer.resolution, element);
-    compiler.openWorld.closeWorld();
+    compiler.openWorld.closeWorld(compiler.reporter);
     compiler.backend.onResolutionComplete();
     ResolutionWorkItem resolutionWork = new ResolutionWorkItem(element);
     resolutionWork.run(compiler, compiler.enqueuer.resolution);
diff --git a/tests/compiler/dart2js/concrete_type_inference_test.dart b/tests/compiler/dart2js/concrete_type_inference_test.dart
index e3833ad..ce5b556 100644
--- a/tests/compiler/dart2js/concrete_type_inference_test.dart
+++ b/tests/compiler/dart2js/concrete_type_inference_test.dart
@@ -20,47 +20,44 @@
   asyncTest(() => compileAndFind('main() { print($expression); }', 'print',
           (compiler, printElement) {
         var parameter = printElement.functionSignature.requiredParameters.first;
-        var type = compiler.globalInference.results.typeOf(parameter);
-        checkType(compiler, type);
+        checkType(compiler, _typeOf(compiler, parameter));
       }));
 
   asyncTest(() =>
       compileAndFind('main() { var x = print; print($expression); }', 'print',
           (compiler, printElement) {
         var parameter = printElement.functionSignature.requiredParameters.first;
-        var type = compiler.globalInference.results.typeOf(parameter);
-        checkType(compiler, type);
+        checkType(compiler, _typeOf(compiler, parameter));
       }));
 
   asyncTest(() => compileAndFind(
           'main() { print($expression); print($expression); }', 'print',
           (compiler, printElement) {
         var parameter = printElement.functionSignature.requiredParameters.first;
-        var type = compiler.globalInference.results.typeOf(parameter);
-        checkType(compiler, type);
+        checkType(compiler, _typeOf(compiler, parameter));
       }));
 }
 
 void testBasicTypes() {
   checkPrintType('true', (compiler, type) {
     if (type.isForwarding) type = type.forwardTo;
-    Expect.identical(compiler.commonMasks.boolType, type);
+    Expect.identical(compiler.closedWorld.commonMasks.boolType, type);
   });
   checkPrintType('1.5', (compiler, type) {
-    Expect.identical(compiler.commonMasks.doubleType, type);
+    Expect.identical(compiler.closedWorld.commonMasks.doubleType, type);
   });
   checkPrintType('1', (compiler, type) {
-    Expect.identical(compiler.commonMasks.uint31Type, type);
+    Expect.identical(compiler.closedWorld.commonMasks.uint31Type, type);
   });
   checkPrintType('[]', (compiler, type) {
     if (type.isForwarding) type = type.forwardTo;
-    Expect.identical(compiler.commonMasks.growableListType, type);
+    Expect.identical(compiler.closedWorld.commonMasks.growableListType, type);
   });
   checkPrintType('null', (compiler, type) {
-    Expect.identical(compiler.commonMasks.nullType, type);
+    Expect.identical(compiler.closedWorld.commonMasks.nullType, type);
   });
   checkPrintType('"foo"', (compiler, type) {
-    Expect.isTrue(compiler.commonMasks.stringType
+    Expect.isTrue(compiler.closedWorld.commonMasks.stringType
         .containsOnlyString(compiler.closedWorld));
   });
 }
@@ -71,14 +68,10 @@
     var firstParameter = fiskElement.functionSignature.requiredParameters[0];
     var secondParameter = fiskElement.functionSignature.optionalParameters[0];
     var thirdParameter = fiskElement.functionSignature.optionalParameters[1];
-    var commonMasks = compiler.commonMasks;
-    var inference = compiler.globalInference;
-    Expect.identical(
-        commonMasks.uint31Type, inference.results.typeOf(firstParameter));
-    Expect.identical(
-        commonMasks.nullType, inference.results.typeOf(secondParameter));
-    Expect.identical(
-        commonMasks.nullType, inference.results.typeOf(thirdParameter));
+    var commonMasks = compiler.closedWorld.commonMasks;
+    Expect.identical(commonMasks.uint31Type, _typeOf(compiler, firstParameter));
+    Expect.identical(commonMasks.nullType, _typeOf(compiler, secondParameter));
+    Expect.identical(commonMasks.nullType, _typeOf(compiler, thirdParameter));
   });
 }
 
@@ -86,3 +79,6 @@
   testBasicTypes();
   testOptionalParameters();
 }
+
+_typeOf(compiler, parameter) =>
+    compiler.globalInference.results.resultOf(parameter).type;
diff --git a/tests/compiler/dart2js/container_mask_equal_test.dart b/tests/compiler/dart2js/container_mask_equal_test.dart
index 21836b7..9f67840 100644
--- a/tests/compiler/dart2js/container_mask_equal_test.dart
+++ b/tests/compiler/dart2js/container_mask_equal_test.dart
@@ -30,7 +30,7 @@
   asyncTest(() async {
     var result = await runCompiler(memorySourceFiles: MEMORY_SOURCE_FILES);
     var compiler = result.compiler;
-    var typesInferrer = compiler.globalInference.typesInferrer;
+    var typesInferrer = compiler.globalInference.typesInferrerInternal;
 
     var element = compiler.mainApp.find('a');
     var mask1 = typesInferrer.getReturnTypeOfElement(element);
diff --git a/tests/compiler/dart2js/deferred_load_graph_segmentation_test.dart b/tests/compiler/dart2js/deferred_load_graph_segmentation_test.dart
index 5e67cc3..0563a63 100644
--- a/tests/compiler/dart2js/deferred_load_graph_segmentation_test.dart
+++ b/tests/compiler/dart2js/deferred_load_graph_segmentation_test.dart
@@ -24,7 +24,6 @@
 
     var main = compiler.mainFunction;
     Expect.isNotNull(main, "Could not find 'main'");
-    compiler.deferredLoadTask.onResolutionComplete(main);
 
     var outputUnitForElement = compiler.deferredLoadTask.outputUnitForElement;
 
diff --git a/tests/compiler/dart2js/dictionary_types_test.dart b/tests/compiler/dart2js/dictionary_types_test.dart
index 0a169d6..15a4e57 100644
--- a/tests/compiler/dart2js/dictionary_types_test.dart
+++ b/tests/compiler/dart2js/dictionary_types_test.dart
@@ -141,8 +141,8 @@
         compiler.stopAfterTypeInference = !createCode;
       });
   var compiler = result.compiler;
-  var commonMasks = compiler.commonMasks;
-  var typesInferrer = compiler.globalInference.typesInferrer;
+  var commonMasks = compiler.closedWorld.commonMasks;
+  var typesInferrer = compiler.globalInference.typesInferrerInternal;
   getType(String name) {
     var element = findElement(compiler, name);
     return typesInferrer.getTypeOfElement(element);
diff --git a/tests/compiler/dart2js/expect_annotations_test.dart b/tests/compiler/dart2js/expect_annotations_test.dart
index 10ee78c..c9c47e0 100644
--- a/tests/compiler/dart2js/expect_annotations_test.dart
+++ b/tests/compiler/dart2js/expect_annotations_test.dart
@@ -92,17 +92,18 @@
           expectAssumeDynamic,
           backend.annotations.assumeDynamic(method),
           "Unexpected annotation of @AssumeDynamic on '$method'.");
-      TypesInferrer inferrer = compiler.globalInference.typesInferrer;
+      TypesInferrer inferrer = compiler.globalInference.typesInferrerInternal;
       if (expectTrustTypeAnnotations && expectedParameterType != null) {
         testTypeMatch(
             method, expectedParameterType, expectedReturnType, inferrer);
       } else if (expectAssumeDynamic) {
-        testTypeMatch(method, compiler.commonMasks.dynamicType, null, inferrer);
+        testTypeMatch(method, compiler.closedWorld.commonMasks.dynamicType,
+            null, inferrer);
       }
     }
 
-    TypeMask jsStringType = compiler.commonMasks.stringType;
-    TypeMask jsIntType = compiler.commonMasks.intType;
+    TypeMask jsStringType = compiler.closedWorld.commonMasks.stringType;
+    TypeMask jsIntType = compiler.closedWorld.commonMasks.intType;
     TypeMask coreStringType = new TypeMask.subtype(
         compiler.coreClasses.stringClass, compiler.closedWorld);
 
diff --git a/tests/compiler/dart2js/field_type_simple_inferer_test.dart b/tests/compiler/dart2js/field_type_simple_inferer_test.dart
index 03d7de3..0e930a0 100644
--- a/tests/compiler/dart2js/field_type_simple_inferer_test.dart
+++ b/tests/compiler/dart2js/field_type_simple_inferer_test.dart
@@ -5,6 +5,8 @@
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/types/types.dart' show TypeMask;
+import 'package:compiler/src/types/masks.dart' show CommonMasks;
+import 'package:compiler/src/compiler.dart' show Compiler;
 
 import 'compiler_helper.dart';
 import 'type_mask_test_helper.dart';
@@ -469,11 +471,14 @@
   }
 """;
 
-void doTest(String test, bool disableInlining, Map<String, Function> fields) {
-  fields.forEach((String name, Function f) {
+typedef TypeMask TestCallback(Compiler compiler, CommonMasks masks);
+
+void doTest(
+    String test, bool disableInlining, Map<String, TestCallback> fields) {
+  fields.forEach((String name, TestCallback f) {
     compileAndFind(test, 'A', name, disableInlining, (compiler, field) {
-      TypeMask type = f(compiler.commonMasks);
-      var inferrer = compiler.globalInference.typesInferrer;
+      TypeMask type = f(compiler, compiler.closedWorld.commonMasks);
+      var inferrer = compiler.globalInference.typesInferrerInternal;
       TypeMask inferredType =
           simplify(inferrer.getTypeOfElement(field), inferrer.compiler);
       Expect.equals(type, inferredType, test);
@@ -481,92 +486,120 @@
   });
 }
 
-void runTest(String test, Map<String, Function> fields) {
+void runTest(String test, Map<String, TestCallback> fields) {
   doTest(test, false, fields);
   doTest(test, true, fields);
 }
 
 void test() {
-  subclassOfInterceptor(types) =>
-      findTypeMask(types.compiler, 'Interceptor', 'nonNullSubclass');
+  TypeMask subclassOfInterceptor(Compiler compiler, CommonMasks types) =>
+      findTypeMask(compiler, 'Interceptor', 'nonNullSubclass');
 
-  runTest(TEST_1, {'f': (types) => types.nullType});
-  runTest(TEST_2,
-      {'f1': (types) => types.nullType, 'f2': (types) => types.uint31Type});
-  runTest(TEST_3, {
-    'f1': (types) => types.uint31Type,
-    'f2': (types) => types.uint31Type.nullable()
+  runTest(
+      TEST_1, <String, TestCallback>{'f': (compiler, types) => types.nullType});
+  runTest(TEST_2, <String, TestCallback>{
+    'f1': (compiler, types) => types.nullType,
+    'f2': (compiler, types) => types.uint31Type
   });
-  runTest(TEST_4, {
+  runTest(TEST_3, <String, TestCallback>{
+    'f1': (compiler, types) => types.uint31Type,
+    'f2': (compiler, types) => types.uint31Type.nullable()
+  });
+  runTest(TEST_4, <String, TestCallback>{
     'f1': subclassOfInterceptor,
-    'f2': (types) => types.stringType.nullable()
+    'f2': (compiler, types) => types.stringType.nullable()
   });
 
   // TODO(ngeoffray): We should try to infer that the initialization
   // code at the declaration site of the fields does not matter.
-  runTest(TEST_5, {'f1': subclassOfInterceptor, 'f2': subclassOfInterceptor});
-  runTest(TEST_6, {'f1': subclassOfInterceptor, 'f2': subclassOfInterceptor});
-  runTest(TEST_7, {'f1': subclassOfInterceptor, 'f2': subclassOfInterceptor});
+  runTest(TEST_5, <String, TestCallback>{
+    'f1': subclassOfInterceptor,
+    'f2': subclassOfInterceptor
+  });
+  runTest(TEST_6, <String, TestCallback>{
+    'f1': subclassOfInterceptor,
+    'f2': subclassOfInterceptor
+  });
+  runTest(TEST_7, <String, TestCallback>{
+    'f1': subclassOfInterceptor,
+    'f2': subclassOfInterceptor
+  });
 
-  runTest(TEST_8, {'f': (types) => types.stringType.nullable()});
-  runTest(TEST_9, {'f': (types) => types.stringType.nullable()});
-  runTest(TEST_10, {'f': (types) => types.uint31Type});
-  runTest(TEST_11, {'fs': (types) => types.uint31Type});
+  runTest(TEST_8, <String, TestCallback>{
+    'f': (compiler, types) => types.stringType.nullable()
+  });
+  runTest(TEST_9, <String, TestCallback>{
+    'f': (compiler, types) => types.stringType.nullable()
+  });
+  runTest(TEST_10,
+      <String, TestCallback>{'f': (compiler, types) => types.uint31Type});
+  runTest(TEST_11,
+      <String, TestCallback>{'fs': (compiler, types) => types.uint31Type});
 
   // TODO(ngeoffray): We should try to infer that the initialization
   // code at the declaration site of the fields does not matter.
-  runTest(TEST_12, {'fs': subclassOfInterceptor});
+  runTest(TEST_12, <String, TestCallback>{'fs': subclassOfInterceptor});
 
-  runTest(TEST_13, {'fs': (types) => types.uint31Type});
-  runTest(TEST_14, {'f': (types) => types.uint31Type});
-  runTest(TEST_15, {
-    'f': (types) {
-      ClassElement cls = types.compiler.backend.helpers.jsIndexableClass;
-      return new TypeMask.nonNullSubtype(cls, types.compiler.closedWorld);
+  runTest(TEST_13,
+      <String, TestCallback>{'fs': (compiler, types) => types.uint31Type});
+  runTest(TEST_14,
+      <String, TestCallback>{'f': (compiler, types) => types.uint31Type});
+  runTest(TEST_15, <String, TestCallback>{
+    'f': (compiler, types) {
+      ClassElement cls = compiler.backend.helpers.jsIndexableClass;
+      return new TypeMask.nonNullSubtype(cls, compiler.closedWorld);
     }
   });
-  runTest(TEST_16, {'f': subclassOfInterceptor});
-  runTest(TEST_17, {'f': (types) => types.uint31Type.nullable()});
-  runTest(TEST_18, {
-    'f1': (types) => types.uint31Type,
-    'f2': (types) => types.stringType,
-    'f3': (types) => types.dynamicType
+  runTest(TEST_16, <String, TestCallback>{'f': subclassOfInterceptor});
+  runTest(TEST_17, <String, TestCallback>{
+    'f': (compiler, types) => types.uint31Type.nullable()
   });
-  runTest(TEST_19, {
-    'f1': (types) => types.uint31Type,
-    'f2': (types) => types.stringType,
-    'f3': (types) => types.dynamicType
+  runTest(TEST_18, <String, TestCallback>{
+    'f1': (compiler, types) => types.uint31Type,
+    'f2': (compiler, types) => types.stringType,
+    'f3': (compiler, types) => types.dynamicType
   });
-  runTest(TEST_20, {'f': (types) => types.uint31Type.nullable()});
-  runTest(TEST_21, {'f': (types) => types.uint31Type.nullable()});
-
-  runTest(TEST_22, {
-    'f1': (types) => types.uint31Type,
-    'f2': (types) => types.uint31Type,
-    'f3': (types) => types.stringType.nullable()
+  runTest(TEST_19, <String, TestCallback>{
+    'f1': (compiler, types) => types.uint31Type,
+    'f2': (compiler, types) => types.stringType,
+    'f3': (compiler, types) => types.dynamicType
+  });
+  runTest(TEST_20, <String, TestCallback>{
+    'f': (compiler, types) => types.uint31Type.nullable()
+  });
+  runTest(TEST_21, <String, TestCallback>{
+    'f': (compiler, types) => types.uint31Type.nullable()
   });
 
-  runTest(TEST_23, {
-    'f1': (types) => types.uint31Type.nullable(),
-    'f2': (types) => types.uint31Type.nullable(),
-    'f3': (types) => types.uint31Type.nullable(),
-    'f4': (types) => types.uint31Type.nullable()
+  runTest(TEST_22, <String, TestCallback>{
+    'f1': (compiler, types) => types.uint31Type,
+    'f2': (compiler, types) => types.uint31Type,
+    'f3': (compiler, types) => types.stringType.nullable()
   });
 
-  runTest(TEST_24, {
-    'f1': (types) => types.positiveIntType,
-    'f2': (types) => types.positiveIntType,
-    'f3': (types) => types.uint31Type,
-    'f4': (types) => types.uint31Type,
-    'f5': (types) => types.numType.nullable(),
-    'f6': (types) => types.stringType.nullable()
+  runTest(TEST_23, <String, TestCallback>{
+    'f1': (compiler, types) => types.uint31Type.nullable(),
+    'f2': (compiler, types) => types.uint31Type.nullable(),
+    'f3': (compiler, types) => types.uint31Type.nullable(),
+    'f4': (compiler, types) => types.uint31Type.nullable()
   });
 
-  runTest(TEST_25, {'f1': (types) => types.uint31Type});
-  runTest(TEST_26, {'f1': (types) => types.positiveIntType});
-  runTest(TEST_27, {
-    'f1': (types) => types.uint31Type,
-    'f2': (types) => types.uint31Type.nullable()
+  runTest(TEST_24, <String, TestCallback>{
+    'f1': (compiler, types) => types.positiveIntType,
+    'f2': (compiler, types) => types.positiveIntType,
+    'f3': (compiler, types) => types.uint31Type,
+    'f4': (compiler, types) => types.uint31Type,
+    'f5': (compiler, types) => types.numType.nullable(),
+    'f6': (compiler, types) => types.stringType.nullable()
+  });
+
+  runTest(TEST_25,
+      <String, TestCallback>{'f1': (compiler, types) => types.uint31Type});
+  runTest(TEST_26,
+      <String, TestCallback>{'f1': (compiler, types) => types.positiveIntType});
+  runTest(TEST_27, <String, TestCallback>{
+    'f1': (compiler, types) => types.uint31Type,
+    'f2': (compiler, types) => types.uint31Type.nullable()
   });
 }
 
diff --git a/tests/compiler/dart2js/issue13354_test.dart b/tests/compiler/dart2js/issue13354_test.dart
index 32826cc..ecf8dba 100644
--- a/tests/compiler/dart2js/issue13354_test.dart
+++ b/tests/compiler/dart2js/issue13354_test.dart
@@ -29,8 +29,8 @@
   Uri uri = new Uri(scheme: 'source');
   var compiler = compilerFor(TEST, uri);
   asyncTest(() => compiler.run(uri).then((_) {
-        var commonMasks = compiler.commonMasks;
-        var typesInferrer = compiler.globalInference.typesInferrer;
+        var commonMasks = compiler.closedWorld.commonMasks;
+        var typesInferrer = compiler.globalInference.typesInferrerInternal;
 
         checkReturn(String name, type) {
           var element = findElement(compiler, name);
diff --git a/tests/compiler/dart2js/kernel/closed_world_test.dart b/tests/compiler/dart2js/kernel/closed_world_test.dart
new file mode 100644
index 0000000..d277221
--- /dev/null
+++ b/tests/compiler/dart2js/kernel/closed_world_test.dart
@@ -0,0 +1,114 @@
+// Copyright (c) 2016, 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.
+
+// Tests that the closed world computed from [WorldImpact]s derived from kernel
+// is equivalent to the original computed from resolution.
+library dart2js.kernel.closed_world_test;
+
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/common.dart';
+import 'package:compiler/src/common/names.dart';
+import 'package:compiler/src/common/resolution.dart';
+import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/constants/expressions.dart';
+import 'package:compiler/src/dart_types.dart';
+import 'package:compiler/src/elements/elements.dart';
+import 'package:compiler/src/enqueue.dart';
+import 'package:compiler/src/js_backend/backend.dart';
+import 'package:compiler/src/js_backend/type_variable_handler.dart';
+import 'package:compiler/src/resolution/registry.dart';
+import 'package:compiler/src/resolution/tree_elements.dart';
+import 'package:compiler/src/ssa/kernel_impact.dart';
+import 'package:compiler/src/serialization/equivalence.dart';
+import 'package:compiler/src/universe/call_structure.dart';
+import 'package:compiler/src/universe/feature.dart';
+import 'package:compiler/src/universe/world_impact.dart';
+import 'package:compiler/src/world.dart';
+import 'package:expect/expect.dart';
+import 'impact_test.dart';
+import '../memory_compiler.dart';
+import '../serialization/helper.dart';
+import '../serialization/model_test_helper.dart';
+
+const SOURCE = const {
+  'main.dart': '''
+main() {
+  print('Hello World!');
+}
+'''
+};
+
+main(List<String> args) {
+  Arguments arguments = new Arguments.from(args);
+  Uri entryPoint;
+  Map<String, String> memorySourceFiles;
+  if (arguments.uri != null) {
+    entryPoint = arguments.uri;
+    memorySourceFiles = const <String, String>{};
+  } else {
+    entryPoint = Uri.parse('memory:main.dart');
+    memorySourceFiles = SOURCE;
+  }
+
+  asyncTest(() async {
+    enableDebugMode();
+    Compiler compiler = compilerFor(
+        entryPoint: entryPoint,
+        memorySourceFiles: memorySourceFiles,
+        options: [
+          Flags.analyzeOnly,
+          Flags.useKernel,
+          Flags.enableAssertMessage
+        ]);
+    compiler.resolution.retainCachesForTesting = true;
+    await compiler.run(entryPoint);
+    compiler.openWorld.closeWorld(compiler.reporter);
+
+    JavaScriptBackend backend = compiler.backend;
+    // Create a new resolution enqueuer and feed it with the [WorldImpact]s
+    // computed from kernel through the [build] in `kernel_impact.dart`.
+    ResolutionEnqueuer enqueuer = new ResolutionEnqueuer(
+        compiler.enqueuer,
+        compiler.options,
+        compiler.resolution,
+        compiler.enqueuerFilter,
+        const TreeShakingEnqueuerStrategy(),
+        compiler.globalDependencies,
+        backend,
+        compiler.commonElements,
+        compiler.cacheStrategy);
+    // TODO(johnniwinther): Store backend info separately. This replacement is
+    // made to reset a field in [TypeVariableHandler] that prevents it from
+    // enqueuing twice.
+    backend.typeVariableHandler = new TypeVariableHandler(compiler);
+
+    backend.enqueueHelpers(enqueuer);
+    enqueuer.addToWorkList(compiler.mainFunction);
+    enqueuer.forEach((work) {
+      AstElement element = work.element;
+      ResolutionImpact resolutionImpact = build(compiler, element.resolvedAst);
+      WorldImpact worldImpact = compiler.backend.impactTransformer
+          .transformResolutionImpact(enqueuer, resolutionImpact);
+      enqueuer.registerProcessedElement(element);
+      enqueuer.applyImpact(compiler.impactStrategy, worldImpact,
+          impactSource: element);
+    });
+    ClosedWorld closedWorld =
+        enqueuer.universe.openWorld.closeWorld(compiler.reporter);
+
+    checkResolutionEnqueuers(compiler.enqueuer.resolution, enqueuer,
+        typeEquivalence: (DartType a, DartType b) {
+      return areTypesEquivalent(unalias(a), unalias(b));
+    }, elementFilter: (Element element) {
+      if (element is ConstructorElement && element.isRedirectingFactory) {
+        // Redirecting factory constructors are skipped in kernel.
+        return false;
+      }
+      return true;
+    }, verbose: arguments.verbose);
+    checkClosedWorlds(compiler.closedWorld, closedWorld,
+        verbose: arguments.verbose);
+  });
+}
diff --git a/tests/compiler/dart2js/kernel/impact_test.dart b/tests/compiler/dart2js/kernel/impact_test.dart
index 363f44d..fd2467f 100644
--- a/tests/compiler/dart2js/kernel/impact_test.dart
+++ b/tests/compiler/dart2js/kernel/impact_test.dart
@@ -688,13 +688,18 @@
       new ResolutionWorldImpactBuilder('Lax impact of ${element}');
   for (StaticUse staticUse in impact.staticUses) {
     switch (staticUse.kind) {
+      case StaticUseKind.CONSTRUCTOR_INVOKE:
       case StaticUseKind.CONST_CONSTRUCTOR_INVOKE:
         ConstructorElement constructor = staticUse.element;
         ConstructorElement effectiveTarget = constructor.effectiveTarget;
         DartType effectiveTargetType =
             constructor.computeEffectiveTargetType(staticUse.type);
-        builder.registerStaticUse(new StaticUse.constConstructorInvoke(
-            effectiveTarget.declaration, null, effectiveTargetType));
+        builder.registerStaticUse(
+            staticUse.kind == StaticUseKind.CONST_CONSTRUCTOR_INVOKE
+                ? new StaticUse.constConstructorInvoke(
+                    effectiveTarget.declaration, null, effectiveTargetType)
+                : new StaticUse.typedConstructorInvoke(
+                    effectiveTarget.declaration, null, effectiveTargetType));
         break;
       default:
         builder.registerStaticUse(staticUse);
diff --git a/tests/compiler/dart2js/kernel/visitor_test.dart b/tests/compiler/dart2js/kernel/visitor_test.dart
index e8ad842..ec8e3ae 100644
--- a/tests/compiler/dart2js/kernel/visitor_test.dart
+++ b/tests/compiler/dart2js/kernel/visitor_test.dart
@@ -22,8 +22,8 @@
 const String TESTCASE_DIR = 'third_party/pkg/kernel/testcases/';
 
 const List<String> SKIP_TESTS = const <String>[
-  // Encoding of redirecting factories have changed.
-  'redirecting_factory',
+  /// The test expects an unpatched api.
+  'external',
 ];
 
 main(List<String> arguments) {
diff --git a/tests/compiler/dart2js/list_tracer2_test.dart b/tests/compiler/dart2js/list_tracer2_test.dart
index d03ab91..c0a5166 100644
--- a/tests/compiler/dart2js/list_tracer2_test.dart
+++ b/tests/compiler/dart2js/list_tracer2_test.dart
@@ -24,7 +24,7 @@
   Uri uri = new Uri(scheme: 'source');
   var compiler = compilerFor(TEST, uri);
   asyncTest(() => compiler.run(uri).then((_) {
-        var typesInferrer = compiler.globalInference.typesInferrer;
+        var typesInferrer = compiler.globalInference.typesInferrerInternal;
 
         checkType(String name, type) {
           var element = findElement(compiler, name);
@@ -32,6 +32,6 @@
           Expect.equals(type, simplify(mask.elementType, compiler), name);
         }
 
-        checkType('myList', compiler.commonMasks.uint31Type);
+        checkType('myList', compiler.closedWorld.commonMasks.uint31Type);
       }));
 }
diff --git a/tests/compiler/dart2js/list_tracer3_test.dart b/tests/compiler/dart2js/list_tracer3_test.dart
index cb1b936..1e61858 100644
--- a/tests/compiler/dart2js/list_tracer3_test.dart
+++ b/tests/compiler/dart2js/list_tracer3_test.dart
@@ -26,7 +26,7 @@
   Uri uri = new Uri(scheme: 'source');
   var compiler = compilerFor(TEST, uri);
   asyncTest(() => compiler.run(uri).then((_) {
-        var typesInferrer = compiler.globalInference.typesInferrer;
+        var typesInferrer = compiler.globalInference.typesInferrerInternal;
 
         checkType(String name, type) {
           var element = findElement(compiler, name);
diff --git a/tests/compiler/dart2js/list_tracer_test.dart b/tests/compiler/dart2js/list_tracer_test.dart
index fe1bd17..c407ce8 100644
--- a/tests/compiler/dart2js/list_tracer_test.dart
+++ b/tests/compiler/dart2js/list_tracer_test.dart
@@ -198,8 +198,8 @@
   var compiler = compilerFor(generateTest(allocation), uri,
       expectedErrors: 0, expectedWarnings: 1);
   asyncTest(() => compiler.run(uri).then((_) {
-        var commonMasks = compiler.commonMasks;
-        var typesInferrer = compiler.globalInference.typesInferrer;
+        var commonMasks = compiler.closedWorld.commonMasks;
+        var typesInferrer = compiler.globalInference.typesInferrerInternal;
 
         checkType(String name, type) {
           var element = findElement(compiler, name);
diff --git a/tests/compiler/dart2js/list_tracer_typed_data_length_test.dart b/tests/compiler/dart2js/list_tracer_typed_data_length_test.dart
index b0dc4fd..ee15963 100644
--- a/tests/compiler/dart2js/list_tracer_typed_data_length_test.dart
+++ b/tests/compiler/dart2js/list_tracer_typed_data_length_test.dart
@@ -29,7 +29,7 @@
   asyncTest(() async {
     CompilationResult result = await runCompiler(memorySourceFiles: TEST);
     Compiler compiler = result.compiler;
-    var typesInferrer = compiler.globalInference.typesInferrer;
+    var typesInferrer = compiler.globalInference.typesInferrerInternal;
 
     checkType(String name, type, length) {
       var element = findElement(compiler, name);
@@ -40,7 +40,7 @@
       Expect.equals(container.length, length);
     }
 
-    checkType('myList', compiler.commonMasks.numType, 42);
-    checkType('myOtherList', compiler.commonMasks.uint31Type, 32);
+    checkType('myList', compiler.closedWorld.commonMasks.numType, 42);
+    checkType('myOtherList', compiler.closedWorld.commonMasks.uint31Type, 32);
   });
 }
diff --git a/tests/compiler/dart2js/map_tracer_const_test.dart b/tests/compiler/dart2js/map_tracer_const_test.dart
index ee20f9f..69d9554 100644
--- a/tests/compiler/dart2js/map_tracer_const_test.dart
+++ b/tests/compiler/dart2js/map_tracer_const_test.dart
@@ -33,8 +33,8 @@
   var compiler = compilerFor(TEST, uri, expectedErrors: 0, expectedWarnings: 0);
   compiler.stopAfterTypeInference = true;
   asyncTest(() => compiler.run(uri).then((_) {
-        var commonMasks = compiler.commonMasks;
-        var typesInferrer = compiler.globalInference.typesInferrer;
+        var commonMasks = compiler.closedWorld.commonMasks;
+        var typesInferrer = compiler.globalInference.typesInferrerInternal;
         var element = findElement(compiler, 'closure');
         var mask = typesInferrer.getReturnTypeOfElement(element);
         Expect.equals(commonMasks.numType, simplify(mask, compiler));
diff --git a/tests/compiler/dart2js/map_tracer_keys_test.dart b/tests/compiler/dart2js/map_tracer_keys_test.dart
index 4516fb3..4394879 100644
--- a/tests/compiler/dart2js/map_tracer_keys_test.dart
+++ b/tests/compiler/dart2js/map_tracer_keys_test.dart
@@ -57,8 +57,8 @@
   var compiler = compilerFor(generateTest(key, value, initial), uri,
       expectedErrors: 0, expectedWarnings: 0);
   asyncTest(() => compiler.run(uri).then((_) {
-        var commonMasks = compiler.commonMasks;
-        var typesInferrer = compiler.globalInference.typesInferrer;
+        var commonMasks = compiler.closedWorld.commonMasks;
+        var typesInferrer = compiler.globalInference.typesInferrerInternal;
         var aDoubleType =
             typesInferrer.getTypeOfElement(findElement(compiler, 'aDouble'));
         var aListType =
diff --git a/tests/compiler/dart2js/map_tracer_test.dart b/tests/compiler/dart2js/map_tracer_test.dart
index 4399798..571450c 100644
--- a/tests/compiler/dart2js/map_tracer_test.dart
+++ b/tests/compiler/dart2js/map_tracer_test.dart
@@ -211,11 +211,11 @@
   Uri uri = new Uri(scheme: 'source');
   var compiler = compilerFor(generateTest(allocation), uri,
       expectedErrors: 0, expectedWarnings: 1);
-  var closedWorld = compiler.openWorld.closeWorld();
+  var closedWorld = compiler.openWorld.closeWorld(compiler.reporter);
   asyncTest(() => compiler.run(uri).then((_) {
         var keyType, valueType;
-        var commonMasks = compiler.commonMasks;
-        var typesInferrer = compiler.globalInference.typesInferrer;
+        var commonMasks = compiler.closedWorld.commonMasks;
+        var typesInferrer = compiler.globalInference.typesInferrerInternal;
         var emptyType = new TypeMask.nonNullEmpty();
         var aKeyType =
             typesInferrer.getTypeOfElement(findElement(compiler, 'aKey'));
diff --git a/tests/compiler/dart2js/mirror_final_field_inferrer2_test.dart b/tests/compiler/dart2js/mirror_final_field_inferrer2_test.dart
index 4f109a4..3d5ce6d 100644
--- a/tests/compiler/dart2js/mirror_final_field_inferrer2_test.dart
+++ b/tests/compiler/dart2js/mirror_final_field_inferrer2_test.dart
@@ -28,8 +28,8 @@
     var result = await runCompiler(memorySourceFiles: MEMORY_SOURCE_FILES);
     var compiler = result.compiler;
     var element = findElement(compiler, 'field');
-    var commonMasks = compiler.commonMasks;
-    var typesInferrer = compiler.globalInference.typesInferrer;
+    var commonMasks = compiler.closedWorld.commonMasks;
+    var typesInferrer = compiler.globalInference.typesInferrerInternal;
     Expect.equals(commonMasks.uint31Type,
         simplify(typesInferrer.getTypeOfElement(element), compiler), 'field');
   });
diff --git a/tests/compiler/dart2js/mirror_final_field_inferrer_test.dart b/tests/compiler/dart2js/mirror_final_field_inferrer_test.dart
index 31b555d..78ea487 100644
--- a/tests/compiler/dart2js/mirror_final_field_inferrer_test.dart
+++ b/tests/compiler/dart2js/mirror_final_field_inferrer_test.dart
@@ -28,8 +28,8 @@
     var result = await runCompiler(memorySourceFiles: MEMORY_SOURCE_FILES);
     var compiler = result.compiler;
     var element = findElement(compiler, 'field');
-    var commonMasks = compiler.commonMasks;
-    var typesInferrer = compiler.globalInference.typesInferrer;
+    var commonMasks = compiler.closedWorld.commonMasks;
+    var typesInferrer = compiler.globalInference.typesInferrerInternal;
     Expect.equals(commonMasks.uint31Type,
         simplify(typesInferrer.getTypeOfElement(element), compiler), 'field');
   });
diff --git a/tests/compiler/dart2js/mirror_tree_shaking_test.dart b/tests/compiler/dart2js/mirror_tree_shaking_test.dart
index 3618c816..744d36e 100644
--- a/tests/compiler/dart2js/mirror_tree_shaking_test.dart
+++ b/tests/compiler/dart2js/mirror_tree_shaking_test.dart
@@ -16,15 +16,18 @@
     CompilationResult result = await runCompiler(
         memorySourceFiles: MEMORY_SOURCE_FILES, diagnosticHandler: collector);
     Compiler compiler = result.compiler;
+    JavaScriptBackend backend = compiler.backend;
     Expect.isTrue(collector.errors.isEmpty);
     Expect.isTrue(collector.infos.isEmpty);
     Expect.isFalse(compiler.compilationFailed);
-    Expect.isFalse(compiler.enqueuer.resolution.hasEnqueuedReflectiveElements);
+    Expect.isFalse(backend
+        .mirrorsAnalysis.resolutionHandler.hasEnqueuedReflectiveElements);
+    Expect.isFalse(backend
+        .mirrorsAnalysis.resolutionHandler.hasEnqueuedReflectiveStaticFields);
     Expect.isFalse(
-        compiler.enqueuer.resolution.hasEnqueuedReflectiveStaticFields);
-    JavaScriptBackend backend = compiler.backend;
-    Expect.isFalse(backend.codegenEnqueuer.hasEnqueuedReflectiveElements);
-    Expect.isFalse(backend.codegenEnqueuer.hasEnqueuedReflectiveStaticFields);
+        backend.mirrorsAnalysis.codegenHandler.hasEnqueuedReflectiveElements);
+    Expect.isFalse(backend
+        .mirrorsAnalysis.codegenHandler.hasEnqueuedReflectiveStaticFields);
     Expect.isFalse(compiler.disableTypeInference);
     Expect.isFalse(backend.hasRetainedMetadata);
   });
diff --git a/tests/compiler/dart2js/patch_test.dart b/tests/compiler/dart2js/patch_test.dart
index f12c2b2..f7b34dd 100644
--- a/tests/compiler/dart2js/patch_test.dart
+++ b/tests/compiler/dart2js/patch_test.dart
@@ -920,7 +920,7 @@
       """,
       runCompiler: true,
       analyzeOnly: true);
-  ClosedWorld world = compiler.openWorld.closeWorld();
+  ClosedWorld world = compiler.openWorld.closeWorld(compiler.reporter);
 
   ClassElement cls = ensure(
       compiler, "A", compiler.commonElements.coreLibrary.find,
diff --git a/tests/compiler/dart2js/related_types.dart b/tests/compiler/dart2js/related_types.dart
index 09b28ea..a2516f7 100644
--- a/tests/compiler/dart2js/related_types.dart
+++ b/tests/compiler/dart2js/related_types.dart
@@ -35,7 +35,7 @@
 
 /// Check all loaded libraries in [compiler] for unrelated types.
 void checkRelatedTypes(Compiler compiler) {
-  compiler.openWorld.closeWorld();
+  compiler.openWorld.closeWorld(compiler.reporter);
   for (LibraryElement library in compiler.libraryLoader.libraries) {
     checkLibraryElement(compiler, library);
   }
diff --git a/tests/compiler/dart2js/related_types_test.dart b/tests/compiler/dart2js/related_types_test.dart
index 38449bc..6711fb2 100644
--- a/tests/compiler/dart2js/related_types_test.dart
+++ b/tests/compiler/dart2js/related_types_test.dart
@@ -267,7 +267,7 @@
     Expect.isFalse(
         collector.hasRegularMessages, "Unexpected analysis messages.");
     Compiler compiler = result.compiler;
-    compiler.openWorld.closeWorld();
+    compiler.openWorld.closeWorld(compiler.reporter);
 
     void checkMember(MemberElement member) {
       if (!member.name.startsWith('test_')) return;
diff --git a/tests/compiler/dart2js/serialization/helper.dart b/tests/compiler/dart2js/serialization/helper.dart
index cd6ecb2..7fab60f 100644
--- a/tests/compiler/dart2js/serialization/helper.dart
+++ b/tests/compiler/dart2js/serialization/helper.dart
@@ -11,6 +11,7 @@
 import 'package:compiler/src/common/names.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/elements/elements.dart';
+import 'package:compiler/src/filenames.dart';
 
 import '../memory_compiler.dart';
 import 'test_data.dart';
@@ -71,6 +72,13 @@
         saveSerializedData: saveSerializedData);
   }
 
+  Uri get uri {
+    if (filename != null) {
+      return Uri.base.resolve(nativeToUriPath(filename));
+    }
+    return null;
+  }
+
   Future forEachTest(SerializedData serializedData, List<Test> tests,
       TestFunction testFunction) async {
     Uri entryPoint = Uri.parse('memory:main.dart');
diff --git a/tests/compiler/dart2js/serialization/model_test_helper.dart b/tests/compiler/dart2js/serialization/model_test_helper.dart
index 9a4484a..152bd39 100644
--- a/tests/compiler/dart2js/serialization/model_test_helper.dart
+++ b/tests/compiler/dart2js/serialization/model_test_helper.dart
@@ -13,13 +13,16 @@
 import 'package:compiler/src/common.dart';
 import 'package:compiler/src/constants/values.dart';
 import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/dart_types.dart';
 import 'package:compiler/src/deferred_load.dart';
 import 'package:compiler/src/elements/elements.dart';
+import 'package:compiler/src/enqueue.dart';
 import 'package:compiler/src/filenames.dart';
 import 'package:compiler/src/js_backend/js_backend.dart';
 import 'package:compiler/src/serialization/equivalence.dart';
 import 'package:compiler/src/tree/nodes.dart';
 import 'package:compiler/src/universe/class_set.dart';
+import 'package:compiler/src/world.dart' show ClosedWorld;
 import '../memory_compiler.dart';
 import 'helper.dart';
 import 'test_data.dart';
@@ -36,8 +39,8 @@
     Arguments arguments = new Arguments.from(args);
     SerializedData serializedData =
         await serializeDartCore(arguments: arguments);
-    if (arguments.filename != null) {
-      Uri entryPoint = Uri.base.resolve(nativeToUriPath(arguments.filename));
+    if (arguments.uri != null) {
+      Uri entryPoint = arguments.uri;
       SerializationResult result =
           await measure('${entryPoint}', 'serialize', () {
         return serialize(entryPoint,
@@ -90,97 +93,121 @@
 
   return measure(title, 'check models', () async {
     checkAllImpacts(compilerNormal, compilerDeserialized, verbose: verbose);
-
-    checkSets(
-        compilerNormal.resolverWorld.directlyInstantiatedClasses,
-        compilerDeserialized.resolverWorld.directlyInstantiatedClasses,
-        "Directly instantiated classes mismatch",
-        areElementsEquivalent,
+    checkResolutionEnqueuers(compilerNormal.enqueuer.resolution,
+        compilerDeserialized.enqueuer.resolution,
         verbose: verbose);
-
-    checkSets(
-        compilerNormal.resolverWorld.instantiatedTypes,
-        compilerDeserialized.resolverWorld.instantiatedTypes,
-        "Instantiated types mismatch",
-        areTypesEquivalent,
+    checkClosedWorlds(
+        compilerNormal.closedWorld, compilerDeserialized.closedWorld,
         verbose: verbose);
+    checkBackendInfo(compilerNormal, compilerDeserialized, verbose: verbose);
+  });
+}
 
-    checkSets(
-        compilerNormal.resolverWorld.isChecks,
-        compilerDeserialized.resolverWorld.isChecks,
-        "Is-check mismatch",
-        areTypesEquivalent,
-        verbose: verbose);
+void checkResolutionEnqueuers(
+    ResolutionEnqueuer enqueuer1, ResolutionEnqueuer enqueuer2,
+    {bool typeEquivalence(DartType a, DartType b): areTypesEquivalent,
+    bool elementFilter(Element element),
+    bool verbose: false}) {
+  Iterable<Element> processedElements1 = enqueuer1.processedElements;
+  Iterable<Element> processedElements2 = enqueuer2.processedElements;
+  if (elementFilter != null) {
+    processedElements1 = processedElements1.where(elementFilter);
+    processedElements2 = processedElements2.where(elementFilter);
+  }
 
-    checkSets(
-        compilerNormal.enqueuer.resolution.processedElements,
-        compilerDeserialized.enqueuer.resolution.processedElements,
-        "Processed element mismatch",
-        areElementsEquivalent, onSameElement: (a, b) {
-      checkElements(compilerNormal, compilerDeserialized, a, b,
-          verbose: verbose);
-    }, verbose: verbose);
+  checkSets(processedElements1, processedElements2,
+      "Processed element mismatch", areElementsEquivalent,
+      verbose: verbose);
 
-    checkClassHierarchyNodes(
-        compilerNormal,
-        compilerDeserialized,
-        compilerNormal.closedWorld
-            .getClassHierarchyNode(compilerNormal.coreClasses.objectClass),
-        compilerDeserialized.closedWorld.getClassHierarchyNode(
-            compilerDeserialized.coreClasses.objectClass),
-        verbose: verbose);
+  checkSets(
+      enqueuer1.universe.directlyInstantiatedClasses,
+      enqueuer2.universe.directlyInstantiatedClasses,
+      "Directly instantiated classes mismatch",
+      areElementsEquivalent,
+      verbose: verbose);
 
-    Expect.equals(
-        compilerNormal.enabledInvokeOn,
-        compilerDeserialized.enabledInvokeOn,
-        "Compiler.enabledInvokeOn mismatch");
-    Expect.equals(
-        compilerNormal.enabledFunctionApply,
-        compilerDeserialized.enabledFunctionApply,
-        "Compiler.enabledFunctionApply mismatch");
-    Expect.equals(
-        compilerNormal.enabledRuntimeType,
-        compilerDeserialized.enabledRuntimeType,
-        "Compiler.enabledRuntimeType mismatch");
-    Expect.equals(
-        compilerNormal.hasIsolateSupport,
-        compilerDeserialized.hasIsolateSupport,
-        "Compiler.hasIsolateSupport mismatch");
-    Expect.equals(
-        compilerNormal.deferredLoadTask.isProgramSplit,
-        compilerDeserialized.deferredLoadTask.isProgramSplit,
-        "isProgramSplit mismatch");
+  checkSets(
+      enqueuer1.universe.instantiatedTypes,
+      enqueuer2.universe.instantiatedTypes,
+      "Instantiated types mismatch",
+      typeEquivalence,
+      verbose: verbose);
 
-    Map<ConstantValue, OutputUnit> constants1 =
-        compilerNormal.deferredLoadTask.outputUnitForConstantsForTesting;
-    Map<ConstantValue, OutputUnit> constants2 =
-        compilerDeserialized.deferredLoadTask.outputUnitForConstantsForTesting;
-    checkSets(
-        constants1.keys,
-        constants2.keys,
-        'deferredLoadTask._outputUnitForConstants.keys',
-        areConstantValuesEquivalent,
-        failOnUnfound: false,
-        failOnExtra: false,
-        onSameElement: (ConstantValue value1, ConstantValue value2) {
-      OutputUnit outputUnit1 = constants1[value1];
-      OutputUnit outputUnit2 = constants2[value2];
-      checkOutputUnits(
-          outputUnit1,
-          outputUnit2,
-          'for ${value1.toStructuredText()} '
-          'vs ${value2.toStructuredText()}');
-    }, onUnfoundElement: (ConstantValue value1) {
-      OutputUnit outputUnit1 = constants1[value1];
-      Expect.isTrue(outputUnit1.isMainOutput,
-          "Missing deferred constant: ${value1.toStructuredText()}");
-    }, onExtraElement: (ConstantValue value2) {
-      OutputUnit outputUnit2 = constants2[value2];
-      Expect.isTrue(outputUnit2.isMainOutput,
-          "Extra deferred constant: ${value2.toStructuredText()}");
-    }, elementToString: (a) {
-      return '${a.toStructuredText()} -> ${constants1[a]}/${constants2[a]}';
-    });
+  checkSets(enqueuer1.universe.isChecks, enqueuer2.universe.isChecks,
+      "Is-check mismatch", typeEquivalence,
+      verbose: verbose);
+
+  JavaScriptBackend backend1 = enqueuer1.backend;
+  JavaScriptBackend backend2 = enqueuer2.backend;
+  Expect.equals(backend1.hasInvokeOnSupport, backend2.hasInvokeOnSupport,
+      "Compiler.enabledInvokeOn mismatch");
+  Expect.equals(
+      enqueuer1.universe.hasFunctionApplySupport,
+      enqueuer2.universe.hasFunctionApplySupport,
+      "ResolutionEnqueuer.universe.hasFunctionApplySupport mismatch");
+  Expect.equals(
+      enqueuer1.universe.hasRuntimeTypeSupport,
+      enqueuer2.universe.hasRuntimeTypeSupport,
+      "ResolutionEnqueuer.universe.hasRuntimeTypeSupport mismatch");
+  Expect.equals(
+      enqueuer1.universe.hasIsolateSupport,
+      enqueuer2.universe.hasIsolateSupport,
+      "ResolutionEnqueuer.universe.hasIsolateSupport mismatch");
+}
+
+void checkClosedWorlds(ClosedWorld closedWorld1, ClosedWorld closedWorld2,
+    {bool verbose: false}) {
+  checkClassHierarchyNodes(
+      closedWorld1,
+      closedWorld2,
+      closedWorld1.getClassHierarchyNode(closedWorld1.coreClasses.objectClass),
+      closedWorld2.getClassHierarchyNode(closedWorld2.coreClasses.objectClass),
+      verbose: verbose);
+}
+
+void checkBackendInfo(Compiler compilerNormal, Compiler compilerDeserialized,
+    {bool verbose: false}) {
+  checkSets(
+      compilerNormal.enqueuer.resolution.processedElements,
+      compilerDeserialized.enqueuer.resolution.processedElements,
+      "Processed element mismatch",
+      areElementsEquivalent, onSameElement: (a, b) {
+    checkElements(compilerNormal, compilerDeserialized, a, b, verbose: verbose);
+  }, verbose: verbose);
+  Expect.equals(
+      compilerNormal.deferredLoadTask.isProgramSplit,
+      compilerDeserialized.deferredLoadTask.isProgramSplit,
+      "isProgramSplit mismatch");
+
+  Map<ConstantValue, OutputUnit> constants1 =
+      compilerNormal.deferredLoadTask.outputUnitForConstantsForTesting;
+  Map<ConstantValue, OutputUnit> constants2 =
+      compilerDeserialized.deferredLoadTask.outputUnitForConstantsForTesting;
+  checkSets(
+      constants1.keys,
+      constants2.keys,
+      'deferredLoadTask._outputUnitForConstants.keys',
+      areConstantValuesEquivalent,
+      failOnUnfound: false,
+      failOnExtra: false,
+      onSameElement: (ConstantValue value1, ConstantValue value2) {
+    OutputUnit outputUnit1 = constants1[value1];
+    OutputUnit outputUnit2 = constants2[value2];
+    checkOutputUnits(
+        outputUnit1,
+        outputUnit2,
+        'for ${value1.toStructuredText()} '
+        'vs ${value2.toStructuredText()}');
+  }, onUnfoundElement: (ConstantValue value1) {
+    OutputUnit outputUnit1 = constants1[value1];
+    Expect.isTrue(outputUnit1.isMainOutput,
+        "Missing deferred constant: ${value1.toStructuredText()}");
+  }, onExtraElement: (ConstantValue value2) {
+    OutputUnit outputUnit2 = constants2[value2];
+    Expect.isTrue(outputUnit2.isMainOutput,
+        "Extra deferred constant: ${value2.toStructuredText()}");
+  }, elementToString: (a) {
+    return '${a.toStructuredText()} -> ${constants1[a]}/${constants2[a]}';
   });
 }
 
@@ -260,19 +287,19 @@
   checkElementOutputUnits(compiler1, compiler2, element1, element2);
 }
 
-void checkMixinUses(Compiler compiler1, Compiler compiler2, ClassElement class1,
-    ClassElement class2,
+void checkMixinUses(ClosedWorld closedWorld1, ClosedWorld closedWorld2,
+    ClassElement class1, ClassElement class2,
     {bool verbose: false}) {
-  checkSets(
-      compiler1.closedWorld.mixinUsesOf(class1),
-      compiler2.closedWorld.mixinUsesOf(class2),
-      "Mixin uses of $class1 vs $class2",
-      areElementsEquivalent,
+  checkSets(closedWorld1.mixinUsesOf(class1), closedWorld2.mixinUsesOf(class2),
+      "Mixin uses of $class1 vs $class2", areElementsEquivalent,
       verbose: verbose);
 }
 
-void checkClassHierarchyNodes(Compiler compiler1, Compiler compiler2,
-    ClassHierarchyNode node1, ClassHierarchyNode node2,
+void checkClassHierarchyNodes(
+    ClosedWorld closedWorld1,
+    ClosedWorld closedWorld2,
+    ClassHierarchyNode node1,
+    ClassHierarchyNode node2,
     {bool verbose: false}) {
   if (verbose) {
     print('Checking $node1 vs $node2');
@@ -295,7 +322,7 @@
     bool found = false;
     for (ClassHierarchyNode other in node2.directSubclasses) {
       if (areElementsEquivalent(child.cls, other.cls)) {
-        checkClassHierarchyNodes(compiler1, compiler2, child, other,
+        checkClassHierarchyNodes(closedWorld1, closedWorld2, child, other,
             verbose: verbose);
         found = true;
         break;
@@ -305,10 +332,10 @@
       if (child.isInstantiated) {
         print('Missing subclass ${child.cls} of ${node1.cls} '
             'in ${node2.directSubclasses}');
-        print(compiler1.closedWorld
-            .dump(verbose ? compiler1.coreClasses.objectClass : node1.cls));
-        print(compiler2.closedWorld
-            .dump(verbose ? compiler2.coreClasses.objectClass : node2.cls));
+        print(closedWorld1
+            .dump(verbose ? closedWorld1.coreClasses.objectClass : node1.cls));
+        print(closedWorld2
+            .dump(verbose ? closedWorld2.coreClasses.objectClass : node2.cls));
       }
       Expect.isFalse(
           child.isInstantiated,
@@ -316,7 +343,8 @@
           '${node2.directSubclasses}');
     }
   }
-  checkMixinUses(compiler1, compiler2, node1.cls, node2.cls, verbose: verbose);
+  checkMixinUses(closedWorld1, closedWorld2, node1.cls, node2.cls,
+      verbose: verbose);
 }
 
 bool areLocalsEquivalent(Local a, Local b) {
diff --git a/tests/compiler/dart2js/simple_inferrer_and_or_test.dart b/tests/compiler/dart2js/simple_inferrer_and_or_test.dart
index ac2e682..2c81edc 100644
--- a/tests/compiler/dart2js/simple_inferrer_and_or_test.dart
+++ b/tests/compiler/dart2js/simple_inferrer_and_or_test.dart
@@ -96,7 +96,7 @@
   Uri uri = new Uri(scheme: 'source');
   var compiler = compilerFor(TEST, uri);
   asyncTest(() => compiler.run(uri).then((_) {
-        var typesInferrer = compiler.globalInference.typesInferrer;
+        var typesInferrer = compiler.globalInference.typesInferrerInternal;
 
         checkReturn(String name, type) {
           var element = findElement(compiler, name);
@@ -112,16 +112,17 @@
         checkReturn('returnDyn1', subclassOfInterceptor);
         checkReturn('returnDyn2', subclassOfInterceptor);
         checkReturn('returnDyn3', subclassOfInterceptor);
-        checkReturn(
-            'returnDyn4', compiler.commonMasks.dynamicType.nonNullable());
-        checkReturn(
-            'returnDyn5', compiler.commonMasks.dynamicType.nonNullable());
-        checkReturn(
-            'returnDyn6', compiler.commonMasks.dynamicType.nonNullable());
+        checkReturn('returnDyn4',
+            compiler.closedWorld.commonMasks.dynamicType.nonNullable());
+        checkReturn('returnDyn5',
+            compiler.closedWorld.commonMasks.dynamicType.nonNullable());
+        checkReturn('returnDyn6',
+            compiler.closedWorld.commonMasks.dynamicType.nonNullable());
         checkReturn('returnDyn7', subclassOfInterceptor);
         checkReturn('returnDyn7b', subclassOfInterceptor);
         checkReturn('returnDyn8', subclassOfInterceptor);
         checkReturn('returnDyn9', subclassOfInterceptor);
-        checkReturn('returnString', compiler.commonMasks.stringType);
+        checkReturn(
+            'returnString', compiler.closedWorld.commonMasks.stringType);
       }));
 }
diff --git a/tests/compiler/dart2js/simple_inferrer_callers_test.dart b/tests/compiler/dart2js/simple_inferrer_callers_test.dart
index 85b537e..41b9457 100644
--- a/tests/compiler/dart2js/simple_inferrer_callers_test.dart
+++ b/tests/compiler/dart2js/simple_inferrer_callers_test.dart
@@ -35,10 +35,13 @@
 
 void main() {
   Uri uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(TEST, uri);
-  var inferrer = new MyInferrer(compiler, compiler.commonMasks);
-  compiler.globalInference.typesInferrer = inferrer;
+  var compiler = compilerFor(TEST, uri, analyzeOnly: true);
   asyncTest(() => compiler.run(uri).then((_) {
+        compiler.closeResolution();
+        var inferrer =
+            new MyInferrer(compiler, compiler.closedWorld.commonMasks);
+        compiler.globalInference.typesInferrerInternal = inferrer;
+        compiler.globalInference.runGlobalTypeInference(compiler.mainFunction);
         var mainElement = findElement(compiler, 'main');
         var classA = findElement(compiler, 'A');
         var fieldA = classA.lookupLocalMember('field');
diff --git a/tests/compiler/dart2js/simple_inferrer_closure_test.dart b/tests/compiler/dart2js/simple_inferrer_closure_test.dart
index 5a12baa..109f197 100644
--- a/tests/compiler/dart2js/simple_inferrer_closure_test.dart
+++ b/tests/compiler/dart2js/simple_inferrer_closure_test.dart
@@ -118,7 +118,7 @@
   Uri uri = new Uri(scheme: 'source');
   var compiler = compilerFor(TEST, uri);
   asyncTest(() => compiler.run(uri).then((_) {
-        var typesInferrer = compiler.globalInference.typesInferrer;
+        var typesInferrer = compiler.globalInference.typesInferrerInternal;
 
         checkReturn(String name, type) {
           var element = findElement(compiler, name);
@@ -128,20 +128,20 @@
               name);
         }
 
-        checkReturn('returnInt1', compiler.commonMasks.uint31Type);
-        checkReturn('returnInt2', compiler.commonMasks.uint31Type);
-        checkReturn('returnInt3', compiler.commonMasks.uint31Type);
-        checkReturn('returnInt4', compiler.commonMasks.uint31Type);
-        checkReturn(
-            'returnIntOrNull', compiler.commonMasks.uint31Type.nullable());
+        checkReturn('returnInt1', compiler.closedWorld.commonMasks.uint31Type);
+        checkReturn('returnInt2', compiler.closedWorld.commonMasks.uint31Type);
+        checkReturn('returnInt3', compiler.closedWorld.commonMasks.uint31Type);
+        checkReturn('returnInt4', compiler.closedWorld.commonMasks.uint31Type);
+        checkReturn('returnIntOrNull',
+            compiler.closedWorld.commonMasks.uint31Type.nullable());
 
-        checkReturn(
-            'returnDyn1', compiler.commonMasks.dynamicType.nonNullable());
-        checkReturn(
-            'returnDyn2', compiler.commonMasks.dynamicType.nonNullable());
-        checkReturn(
-            'returnDyn3', compiler.commonMasks.dynamicType.nonNullable());
-        checkReturn('returnNum1', compiler.commonMasks.numType);
+        checkReturn('returnDyn1',
+            compiler.closedWorld.commonMasks.dynamicType.nonNullable());
+        checkReturn('returnDyn2',
+            compiler.closedWorld.commonMasks.dynamicType.nonNullable());
+        checkReturn('returnDyn3',
+            compiler.closedWorld.commonMasks.dynamicType.nonNullable());
+        checkReturn('returnNum1', compiler.closedWorld.commonMasks.numType);
 
         checkReturnInClass(String className, String methodName, type) {
           var cls = findElement(compiler, className);
diff --git a/tests/compiler/dart2js/simple_inferrer_const_closure2_test.dart b/tests/compiler/dart2js/simple_inferrer_const_closure2_test.dart
index 175d716..2e59a21 100644
--- a/tests/compiler/dart2js/simple_inferrer_const_closure2_test.dart
+++ b/tests/compiler/dart2js/simple_inferrer_const_closure2_test.dart
@@ -28,7 +28,7 @@
   Uri uri = new Uri(scheme: 'source');
   var compiler = compilerFor(TEST, uri);
   asyncTest(() => compiler.run(uri).then((_) {
-        var typesInferrer = compiler.globalInference.typesInferrer;
+        var typesInferrer = compiler.globalInference.typesInferrerInternal;
 
         checkReturn(String name, type) {
           var element = findElement(compiler, name);
@@ -38,7 +38,7 @@
               name);
         }
 
-        checkReturn('method', compiler.commonMasks.numType);
-        checkReturn('returnNum', compiler.commonMasks.numType);
+        checkReturn('method', compiler.closedWorld.commonMasks.numType);
+        checkReturn('returnNum', compiler.closedWorld.commonMasks.numType);
       }));
 }
diff --git a/tests/compiler/dart2js/simple_inferrer_const_closure3_test.dart b/tests/compiler/dart2js/simple_inferrer_const_closure3_test.dart
index 1a60bc8..a354985 100644
--- a/tests/compiler/dart2js/simple_inferrer_const_closure3_test.dart
+++ b/tests/compiler/dart2js/simple_inferrer_const_closure3_test.dart
@@ -28,7 +28,7 @@
   Uri uri = new Uri(scheme: 'source');
   var compiler = compilerFor(TEST, uri);
   asyncTest(() => compiler.run(uri).then((_) {
-        var typesInferrer = compiler.globalInference.typesInferrer;
+        var typesInferrer = compiler.globalInference.typesInferrerInternal;
 
         checkArgument(String functionName, type) {
           var functionElement = findElement(compiler, functionName);
@@ -40,6 +40,6 @@
               functionName);
         }
 
-        checkArgument('method', compiler.commonMasks.uint31Type);
+        checkArgument('method', compiler.closedWorld.commonMasks.uint31Type);
       }));
 }
diff --git a/tests/compiler/dart2js/simple_inferrer_const_closure4_test.dart b/tests/compiler/dart2js/simple_inferrer_const_closure4_test.dart
index 40914d4..eeeeb02 100644
--- a/tests/compiler/dart2js/simple_inferrer_const_closure4_test.dart
+++ b/tests/compiler/dart2js/simple_inferrer_const_closure4_test.dart
@@ -29,7 +29,7 @@
   Uri uri = new Uri(scheme: 'source');
   var compiler = compilerFor(TEST, uri);
   asyncTest(() => compiler.run(uri).then((_) {
-        var typesInferrer = compiler.globalInference.typesInferrer;
+        var typesInferrer = compiler.globalInference.typesInferrerInternal;
 
         checkArgument(String functionName, type) {
           var functionElement = findElement(compiler, functionName);
@@ -41,7 +41,7 @@
               functionName);
         }
 
-        checkArgument('method', compiler.commonMasks.numType);
-        checkArgument('returnNum', compiler.commonMasks.numType);
+        checkArgument('method', compiler.closedWorld.commonMasks.numType);
+        checkArgument('returnNum', compiler.closedWorld.commonMasks.numType);
       }));
 }
diff --git a/tests/compiler/dart2js/simple_inferrer_const_closure5_test.dart b/tests/compiler/dart2js/simple_inferrer_const_closure5_test.dart
index 413a385..a41c254 100644
--- a/tests/compiler/dart2js/simple_inferrer_const_closure5_test.dart
+++ b/tests/compiler/dart2js/simple_inferrer_const_closure5_test.dart
@@ -29,7 +29,7 @@
   Uri uri = new Uri(scheme: 'source');
   var compiler = compilerFor(TEST, uri);
   asyncTest(() => compiler.run(uri).then((_) {
-        var typesInferrer = compiler.globalInference.typesInferrer;
+        var typesInferrer = compiler.globalInference.typesInferrerInternal;
 
         checkArgument(String functionName, type) {
           var functionElement = findElement(compiler, functionName);
@@ -41,6 +41,6 @@
               functionName);
         }
 
-        checkArgument('method', compiler.commonMasks.numType);
+        checkArgument('method', compiler.closedWorld.commonMasks.numType);
       }));
 }
diff --git a/tests/compiler/dart2js/simple_inferrer_const_closure_default_test.dart b/tests/compiler/dart2js/simple_inferrer_const_closure_default_test.dart
index 0a97f95..f2d38c6 100644
--- a/tests/compiler/dart2js/simple_inferrer_const_closure_default_test.dart
+++ b/tests/compiler/dart2js/simple_inferrer_const_closure_default_test.dart
@@ -42,7 +42,7 @@
   Uri uri = new Uri(scheme: 'source');
   var compiler = compilerFor(TEST, uri);
   asyncTest(() => compiler.run(uri).then((_) {
-        var typesInferrer = compiler.globalInference.typesInferrer;
+        var typesInferrer = compiler.globalInference.typesInferrerInternal;
 
         checkArgument(String functionName, type) {
           var functionElement = findElement(compiler, functionName);
@@ -66,41 +66,47 @@
               functionName);
         }
 
-        checkArgument('foo1', compiler.commonMasks.functionType);
+        checkArgument('foo1', compiler.closedWorld.commonMasks.functionType);
 
         /// 01: ok
-        checkArgument('foo2', compiler.commonMasks.functionType);
+        checkArgument('foo2', compiler.closedWorld.commonMasks.functionType);
 
         /// 02: ok
-        checkArgument('foo3', compiler.commonMasks.functionType);
+        checkArgument('foo3', compiler.closedWorld.commonMasks.functionType);
 
         /// 03: ok
-        checkArgument('foo4', compiler.commonMasks.functionType);
+        checkArgument('foo4', compiler.closedWorld.commonMasks.functionType);
 
         /// 04: ok
-        checkArgument('foo5', compiler.commonMasks.dynamicType);
+        checkArgument('foo5', compiler.closedWorld.commonMasks.dynamicType);
 
         /// 05: ok
-        checkArgument('foo6', compiler.commonMasks.dynamicType);
+        checkArgument('foo6', compiler.closedWorld.commonMasks.dynamicType);
 
         /// 06: ok
 
-        checkArgument('defaultFn1', compiler.commonMasks.uint31Type);
+        checkArgument(
+            'defaultFn1', compiler.closedWorld.commonMasks.uint31Type);
 
         /// 07: ok
-        checkArgument('defaultFn2', compiler.commonMasks.uint31Type);
+        checkArgument(
+            'defaultFn2', compiler.closedWorld.commonMasks.uint31Type);
 
         /// 08: ok
-        checkArgument('defaultFn3', compiler.commonMasks.uint31Type);
+        checkArgument(
+            'defaultFn3', compiler.closedWorld.commonMasks.uint31Type);
 
         /// 09: ok
-        checkArgument('defaultFn4', compiler.commonMasks.uint31Type);
+        checkArgument(
+            'defaultFn4', compiler.closedWorld.commonMasks.uint31Type);
 
         /// 10: ok
-        checkArgument('defaultFn5', compiler.commonMasks.uint31Type);
+        checkArgument(
+            'defaultFn5', compiler.closedWorld.commonMasks.uint31Type);
 
         /// 11: ok
-        checkArgument('defaultFn6', compiler.commonMasks.uint31Type);
+        checkArgument(
+            'defaultFn6', compiler.closedWorld.commonMasks.uint31Type);
 
         /// 12: ok
       }));
diff --git a/tests/compiler/dart2js/simple_inferrer_const_closure_test.dart b/tests/compiler/dart2js/simple_inferrer_const_closure_test.dart
index bb5e17e..6dbd781 100644
--- a/tests/compiler/dart2js/simple_inferrer_const_closure_test.dart
+++ b/tests/compiler/dart2js/simple_inferrer_const_closure_test.dart
@@ -37,7 +37,7 @@
   Uri uri = new Uri(scheme: 'source');
   var compiler = compilerFor(TEST, uri);
   asyncTest(() => compiler.run(uri).then((_) {
-        var typesInferrer = compiler.globalInference.typesInferrer;
+        var typesInferrer = compiler.globalInference.typesInferrerInternal;
 
         checkReturn(String name, type) {
           var element = findElement(compiler, name);
@@ -47,10 +47,10 @@
               name);
         }
 
-        checkReturn('method1', compiler.commonMasks.uint31Type);
-        checkReturn('returnInt1', compiler.commonMasks.uint31Type);
+        checkReturn('method1', compiler.closedWorld.commonMasks.uint31Type);
+        checkReturn('returnInt1', compiler.closedWorld.commonMasks.uint31Type);
 
-        checkReturn('method2', compiler.commonMasks.uint31Type);
-        checkReturn('returnInt2', compiler.commonMasks.uint31Type);
+        checkReturn('method2', compiler.closedWorld.commonMasks.uint31Type);
+        checkReturn('returnInt2', compiler.closedWorld.commonMasks.uint31Type);
       }));
 }
diff --git a/tests/compiler/dart2js/simple_inferrer_final_field2_test.dart b/tests/compiler/dart2js/simple_inferrer_final_field2_test.dart
index cc429df..2a31462 100644
--- a/tests/compiler/dart2js/simple_inferrer_final_field2_test.dart
+++ b/tests/compiler/dart2js/simple_inferrer_final_field2_test.dart
@@ -28,7 +28,7 @@
   Uri uri = new Uri(scheme: 'source');
   var compiler = compilerFor(TEST, uri);
   asyncTest(() => compiler.run(uri).then((_) {
-        var typesInferrer = compiler.globalInference.typesInferrer;
+        var typesInferrer = compiler.globalInference.typesInferrerInternal;
 
         checkFieldTypeInClass(String className, String fieldName, type) {
           var cls = findElement(compiler, className);
diff --git a/tests/compiler/dart2js/simple_inferrer_final_field3_test.dart b/tests/compiler/dart2js/simple_inferrer_final_field3_test.dart
index caa821f..7eeefae 100644
--- a/tests/compiler/dart2js/simple_inferrer_final_field3_test.dart
+++ b/tests/compiler/dart2js/simple_inferrer_final_field3_test.dart
@@ -27,7 +27,7 @@
   Uri uri = new Uri(scheme: 'source');
   var compiler = compilerFor(TEST, uri);
   asyncTest(() => compiler.run(uri).then((_) {
-        var typesInferrer = compiler.globalInference.typesInferrer;
+        var typesInferrer = compiler.globalInference.typesInferrerInternal;
 
         checkFieldTypeInClass(String className, String fieldName, type) {
           var cls = findElement(compiler, className);
diff --git a/tests/compiler/dart2js/simple_inferrer_final_field_test.dart b/tests/compiler/dart2js/simple_inferrer_final_field_test.dart
index d36ffa9..78b3ebc 100644
--- a/tests/compiler/dart2js/simple_inferrer_final_field_test.dart
+++ b/tests/compiler/dart2js/simple_inferrer_final_field_test.dart
@@ -31,7 +31,7 @@
   Uri uri = new Uri(scheme: 'source');
   var compiler = compilerFor(TEST, uri);
   asyncTest(() => compiler.run(uri).then((_) {
-        var typesInferrer = compiler.globalInference.typesInferrer;
+        var typesInferrer = compiler.globalInference.typesInferrerInternal;
 
         checkFieldTypeInClass(String className, String fieldName, type) {
           var cls = findElement(compiler, className);
@@ -40,12 +40,13 @@
               simplify(typesInferrer.getTypeOfElement(element), compiler));
         }
 
-        checkFieldTypeInClass('A', 'intField', compiler.commonMasks.uint31Type);
+        checkFieldTypeInClass(
+            'A', 'intField', compiler.closedWorld.commonMasks.uint31Type);
         checkFieldTypeInClass('A', 'giveUpField1',
             findTypeMask(compiler, 'Interceptor', 'nonNullSubclass'));
         checkFieldTypeInClass('A', 'giveUpField2',
-            compiler.commonMasks.dynamicType.nonNullable());
+            compiler.closedWorld.commonMasks.dynamicType.nonNullable());
         checkFieldTypeInClass(
-            'A', 'fieldParameter', compiler.commonMasks.uint31Type);
+            'A', 'fieldParameter', compiler.closedWorld.commonMasks.uint31Type);
       }));
 }
diff --git a/tests/compiler/dart2js/simple_inferrer_global_field_closure2_test.dart b/tests/compiler/dart2js/simple_inferrer_global_field_closure2_test.dart
index c2e7492..01a896a 100644
--- a/tests/compiler/dart2js/simple_inferrer_global_field_closure2_test.dart
+++ b/tests/compiler/dart2js/simple_inferrer_global_field_closure2_test.dart
@@ -28,7 +28,7 @@
   Uri uri = new Uri(scheme: 'source');
   var compiler = compilerFor(TEST, uri);
   asyncTest(() => compiler.run(uri).then((_) {
-        var typesInferrer = compiler.globalInference.typesInferrer;
+        var typesInferrer = compiler.globalInference.typesInferrerInternal;
 
         checkArgument(String functionName, type) {
           var functionElement = findElement(compiler, functionName);
@@ -40,6 +40,6 @@
               functionName);
         }
 
-        checkArgument('method', compiler.commonMasks.uint31Type);
+        checkArgument('method', compiler.closedWorld.commonMasks.uint31Type);
       }));
 }
diff --git a/tests/compiler/dart2js/simple_inferrer_global_field_closure_test.dart b/tests/compiler/dart2js/simple_inferrer_global_field_closure_test.dart
index eb486bc..f20912a 100644
--- a/tests/compiler/dart2js/simple_inferrer_global_field_closure_test.dart
+++ b/tests/compiler/dart2js/simple_inferrer_global_field_closure_test.dart
@@ -37,7 +37,7 @@
   Uri uri = new Uri(scheme: 'source');
   var compiler = compilerFor(TEST, uri);
   asyncTest(() => compiler.run(uri).then((_) {
-        var typesInferrer = compiler.globalInference.typesInferrer;
+        var typesInferrer = compiler.globalInference.typesInferrerInternal;
 
         checkReturn(String name, type) {
           var element = findElement(compiler, name);
@@ -47,10 +47,10 @@
               name);
         }
 
-        checkReturn('method1', compiler.commonMasks.uint31Type);
-        checkReturn('returnInt1', compiler.commonMasks.uint31Type);
+        checkReturn('method1', compiler.closedWorld.commonMasks.uint31Type);
+        checkReturn('returnInt1', compiler.closedWorld.commonMasks.uint31Type);
 
-        checkReturn('method2', compiler.commonMasks.uint31Type);
-        checkReturn('returnInt2', compiler.commonMasks.uint31Type);
+        checkReturn('method2', compiler.closedWorld.commonMasks.uint31Type);
+        checkReturn('returnInt2', compiler.closedWorld.commonMasks.uint31Type);
       }));
 }
diff --git a/tests/compiler/dart2js/simple_inferrer_no_such_method_test.dart b/tests/compiler/dart2js/simple_inferrer_no_such_method_test.dart
index 96ede85..a68120c 100644
--- a/tests/compiler/dart2js/simple_inferrer_no_such_method_test.dart
+++ b/tests/compiler/dart2js/simple_inferrer_no_such_method_test.dart
@@ -164,7 +164,7 @@
   Uri uri = new Uri(scheme: 'source');
 
   checkReturn(MockCompiler compiler, String name, type) {
-    var typesInferrer = compiler.globalInference.typesInferrer;
+    var typesInferrer = compiler.globalInference.typesInferrerInternal;
     var element = findElement(compiler, name);
     Expect.equals(
         type,
@@ -174,51 +174,74 @@
 
   var compiler1 = compilerFor(TEST1, uri);
   asyncTest(() => compiler1.run(uri).then((_) {
-        checkReturn(compiler1, 'test1', compiler1.commonMasks.uint31Type);
+        checkReturn(
+            compiler1, 'test1', compiler1.closedWorld.commonMasks.uint31Type);
         checkReturn(compiler1, 'test2',
-            compiler1.commonMasks.dynamicType.nonNullable());
-        checkReturn(compiler1, 'test3', compiler1.commonMasks.uint31Type);
-        checkReturn(compiler1, 'test4', compiler1.commonMasks.mapType);
+            compiler1.closedWorld.commonMasks.dynamicType.nonNullable());
+        checkReturn(
+            compiler1, 'test3', compiler1.closedWorld.commonMasks.uint31Type);
+        checkReturn(
+            compiler1, 'test4', compiler1.closedWorld.commonMasks.mapType);
         checkReturn(compiler1, 'test5',
-            compiler1.commonMasks.dynamicType.nonNullable());
+            compiler1.closedWorld.commonMasks.dynamicType.nonNullable());
         checkReturn(compiler1, 'test6',
-            compiler1.commonMasks.dynamicType.nonNullable());
+            compiler1.closedWorld.commonMasks.dynamicType.nonNullable());
       }));
 
   var compiler2 = compilerFor(TEST2, uri);
   asyncTest(() => compiler2.run(uri).then((_) {
+        checkReturn(compiler2, 'test1',
+            compiler2.closedWorld.commonMasks.mapType.nonNullable());
         checkReturn(
-            compiler2, 'test1', compiler2.commonMasks.mapType.nonNullable());
-        checkReturn(compiler2, 'test2', compiler2.commonMasks.mapType);
-        checkReturn(compiler2, 'test3', compiler2.commonMasks.mapType);
-        checkReturn(compiler2, 'test4', compiler2.commonMasks.mapType);
-        checkReturn(compiler2, 'test5', compiler2.commonMasks.mapType);
+            compiler2, 'test2', compiler2.closedWorld.commonMasks.mapType);
+        checkReturn(
+            compiler2, 'test3', compiler2.closedWorld.commonMasks.mapType);
+        checkReturn(
+            compiler2, 'test4', compiler2.closedWorld.commonMasks.mapType);
+        checkReturn(
+            compiler2, 'test5', compiler2.closedWorld.commonMasks.mapType);
 
-        checkReturn(compiler2, 'test6', compiler2.commonMasks.numType);
-        checkReturn(compiler2, 'test7', compiler2.commonMasks.uint31Type);
-        checkReturn(compiler2, 'test8', compiler2.commonMasks.uint31Type);
-        checkReturn(compiler2, 'test9', compiler2.commonMasks.uint31Type);
-        checkReturn(compiler2, 'test10', compiler2.commonMasks.numType);
-        checkReturn(compiler2, 'test11', compiler2.commonMasks.doubleType);
+        checkReturn(
+            compiler2, 'test6', compiler2.closedWorld.commonMasks.numType);
+        checkReturn(
+            compiler2, 'test7', compiler2.closedWorld.commonMasks.uint31Type);
+        checkReturn(
+            compiler2, 'test8', compiler2.closedWorld.commonMasks.uint31Type);
+        checkReturn(
+            compiler2, 'test9', compiler2.closedWorld.commonMasks.uint31Type);
+        checkReturn(
+            compiler2, 'test10', compiler2.closedWorld.commonMasks.numType);
+        checkReturn(
+            compiler2, 'test11', compiler2.closedWorld.commonMasks.doubleType);
       }));
 
   var compiler3 = compilerFor(TEST3, uri);
   asyncTest(() => compiler3.run(uri).then((_) {
         checkReturn(compiler3, 'test1', const TypeMask.nonNullEmpty());
-        checkReturn(compiler3, 'test2', compiler3.commonMasks.mapType);
-        checkReturn(compiler3, 'test3', compiler3.commonMasks.mapType);
-        checkReturn(compiler3, 'test4', compiler3.commonMasks.mapType);
-        checkReturn(compiler3, 'test5', compiler3.commonMasks.mapType);
-        checkReturn(compiler3, 'test6', compiler3.commonMasks.mapType);
+        checkReturn(
+            compiler3, 'test2', compiler3.closedWorld.commonMasks.mapType);
+        checkReturn(
+            compiler3, 'test3', compiler3.closedWorld.commonMasks.mapType);
+        checkReturn(
+            compiler3, 'test4', compiler3.closedWorld.commonMasks.mapType);
+        checkReturn(
+            compiler3, 'test5', compiler3.closedWorld.commonMasks.mapType);
+        checkReturn(
+            compiler3, 'test6', compiler3.closedWorld.commonMasks.mapType);
       }));
 
   var compiler4 = compilerFor(TEST4, uri);
   asyncTest(() => compiler4.run(uri).then((_) {
         checkReturn(compiler4, 'test1', const TypeMask.nonNullEmpty());
-        checkReturn(compiler4, 'test2', compiler4.commonMasks.mapType);
-        checkReturn(compiler4, 'test3', compiler4.commonMasks.mapType);
-        checkReturn(compiler4, 'test4', compiler4.commonMasks.mapType);
-        checkReturn(compiler4, 'test5', compiler4.commonMasks.mapType);
-        checkReturn(compiler4, 'test6', compiler4.commonMasks.mapType);
+        checkReturn(
+            compiler4, 'test2', compiler4.closedWorld.commonMasks.mapType);
+        checkReturn(
+            compiler4, 'test3', compiler4.closedWorld.commonMasks.mapType);
+        checkReturn(
+            compiler4, 'test4', compiler4.closedWorld.commonMasks.mapType);
+        checkReturn(
+            compiler4, 'test5', compiler4.closedWorld.commonMasks.mapType);
+        checkReturn(
+            compiler4, 'test6', compiler4.closedWorld.commonMasks.mapType);
       }));
 }
diff --git a/tests/compiler/dart2js/simple_inferrer_postfix_prefix_test.dart b/tests/compiler/dart2js/simple_inferrer_postfix_prefix_test.dart
index 3b308f0..3d37e58 100644
--- a/tests/compiler/dart2js/simple_inferrer_postfix_prefix_test.dart
+++ b/tests/compiler/dart2js/simple_inferrer_postfix_prefix_test.dart
@@ -66,8 +66,8 @@
   Uri uri = new Uri(scheme: 'source');
   var compiler = compilerFor(TEST, uri);
   asyncTest(() => compiler.run(uri).then((_) {
-        var commonMasks = compiler.commonMasks;
-        var typesInferrer = compiler.globalInference.typesInferrer;
+        var commonMasks = compiler.closedWorld.commonMasks;
+        var typesInferrer = compiler.globalInference.typesInferrerInternal;
 
         checkReturnInClass(String className, String methodName, type) {
           var cls = findElement(compiler, className);
diff --git a/tests/compiler/dart2js/simple_inferrer_test.dart b/tests/compiler/dart2js/simple_inferrer_test.dart
index ccb07a8..cf29a1a 100644
--- a/tests/compiler/dart2js/simple_inferrer_test.dart
+++ b/tests/compiler/dart2js/simple_inferrer_test.dart
@@ -727,8 +727,8 @@
   var compiler = compilerFor(TEST, uri);
   compiler.diagnosticHandler = createHandler(compiler, TEST);
   asyncTest(() => compiler.run(uri).then((_) {
-        var commonMasks = compiler.commonMasks;
-        var typesInferrer = compiler.globalInference.typesInferrer;
+        var commonMasks = compiler.closedWorld.commonMasks;
+        var typesInferrer = compiler.globalInference.typesInferrerInternal;
         var world = compiler.closedWorld;
 
         checkReturn(String name, type) {
diff --git a/tests/compiler/dart2js/simple_inferrer_try_catch_test.dart b/tests/compiler/dart2js/simple_inferrer_try_catch_test.dart
index 28c8fde..207a861 100644
--- a/tests/compiler/dart2js/simple_inferrer_try_catch_test.dart
+++ b/tests/compiler/dart2js/simple_inferrer_try_catch_test.dart
@@ -167,8 +167,8 @@
   Uri uri = new Uri(scheme: 'source');
   var compiler = compilerFor(TEST, uri);
   asyncTest(() => compiler.run(uri).then((_) {
-        var commonMasks = compiler.commonMasks;
-        var typesInferrer = compiler.globalInference.typesInferrer;
+        var commonMasks = compiler.closedWorld.commonMasks;
+        var typesInferrer = compiler.globalInference.typesInferrerInternal;
 
         checkReturn(String name, type) {
           var element = findElement(compiler, name);
diff --git a/tests/compiler/dart2js/simple_inferrer_unregister_call_test.dart b/tests/compiler/dart2js/simple_inferrer_unregister_call_test.dart
index 1253b83..f0be6f8 100644
--- a/tests/compiler/dart2js/simple_inferrer_unregister_call_test.dart
+++ b/tests/compiler/dart2js/simple_inferrer_unregister_call_test.dart
@@ -32,7 +32,7 @@
   Uri uri = new Uri(scheme: 'source');
   var compiler = compilerFor(TEST, uri);
   asyncTest(() => compiler.run(uri).then((_) {
-        var typesInferrer = compiler.globalInference.typesInferrer;
+        var typesInferrer = compiler.globalInference.typesInferrerInternal;
 
         checkReturnInClass(String className, String methodName, type) {
           var cls = findElement(compiler, className);
@@ -40,6 +40,7 @@
           Expect.equals(type, typesInferrer.getReturnTypeOfElement(element));
         }
 
-        checkReturnInClass('A', '+', compiler.commonMasks.uint31Type);
+        checkReturnInClass(
+            'A', '+', compiler.closedWorld.commonMasks.uint31Type);
       }));
 }
diff --git a/tests/compiler/dart2js/trust_type_annotations_test.dart b/tests/compiler/dart2js/trust_type_annotations_test.dart
index c140fed..764e5ef 100644
--- a/tests/compiler/dart2js/trust_type_annotations_test.dart
+++ b/tests/compiler/dart2js/trust_type_annotations_test.dart
@@ -50,7 +50,7 @@
   Uri uri = new Uri(scheme: 'source');
   var compiler = compilerFor(TEST, uri, trustTypeAnnotations: true);
   asyncTest(() => compiler.run(uri).then((_) {
-        var typesInferrer = compiler.globalInference.typesInferrer;
+        var typesInferrer = compiler.globalInference.typesInferrerInternal;
 
         ClassElement classA = findElement(compiler, "A");
 
diff --git a/tests/compiler/dart2js/type_combination_test.dart b/tests/compiler/dart2js/type_combination_test.dart
index f15d471f..875f276 100644
--- a/tests/compiler/dart2js/type_combination_test.dart
+++ b/tests/compiler/dart2js/type_combination_test.dart
@@ -736,24 +736,23 @@
     """);
     JavaScriptBackend backend = compiler.backend;
     BackendHelpers helpers = backend.helpers;
-    ClosedWorld world = compiler.openWorld.closeWorld();
+    ClosedWorld world = compiler.openWorld.closeWorld(compiler.reporter);
     helpers.interceptorsLibrary.forEachLocalMember((element) {
       if (element.isClass) {
         element.ensureResolved(compiler.resolution);
-        backend.registerInstantiatedType(element.rawType,
-            compiler.enqueuer.resolution, compiler.globalDependencies);
+        compiler.enqueuer.resolution.registerInstantiatedType(element.rawType);
       }
     });
     ClassElement patternImplClass = compiler.mainApp.find('PatternImpl');
     patternImplClass.ensureResolved(compiler.resolution);
 
-    backend.registerInstantiatedType(compiler.coreTypes.mapType(),
-        compiler.enqueuer.resolution, compiler.globalDependencies);
-    backend.registerInstantiatedType(compiler.coreTypes.functionType,
-        compiler.enqueuer.resolution, compiler.globalDependencies);
-    backend.registerInstantiatedType(patternImplClass.rawType,
-        compiler.enqueuer.resolution, compiler.globalDependencies);
-    compiler.openWorld.closeWorld();
+    compiler.enqueuer.resolution
+        .registerInstantiatedType(compiler.coreTypes.mapType());
+    compiler.enqueuer.resolution
+        .registerInstantiatedType(compiler.coreTypes.functionType);
+    compiler.enqueuer.resolution
+        .registerInstantiatedType(patternImplClass.rawType);
+    compiler.openWorld.closeWorld(compiler.reporter);
 
     // Grab hold of a supertype for String so we can produce potential
     // string types.
diff --git a/tests/compiler/dart2js/type_inference6_test.dart b/tests/compiler/dart2js/type_inference6_test.dart
index 7eaf0a5..a9cdc0a 100644
--- a/tests/compiler/dart2js/type_inference6_test.dart
+++ b/tests/compiler/dart2js/type_inference6_test.dart
@@ -24,8 +24,8 @@
   Uri uri = new Uri(scheme: 'source');
   var compiler = compilerFor(TEST, uri);
   return compiler.run(uri).then((_) {
-    var commonMasks = compiler.commonMasks;
-    var typesInferrer = compiler.globalInference.typesInferrer;
+    var commonMasks = compiler.closedWorld.commonMasks;
+    var typesInferrer = compiler.globalInference.typesInferrerInternal;
     var element = findElement(compiler, "foo");
     var mask = typesInferrer.getReturnTypeOfElement(element);
     Expect.equals(commonMasks.uint31Type, simplify(mask, compiler));
diff --git a/tests/compiler/dart2js/type_inference7_test.dart b/tests/compiler/dart2js/type_inference7_test.dart
index 42b19b0..a8ebbb0 100644
--- a/tests/compiler/dart2js/type_inference7_test.dart
+++ b/tests/compiler/dart2js/type_inference7_test.dart
@@ -23,8 +23,8 @@
     // Assertions enabled:
     var compiler = compilerFor(TEST, uri, enableUserAssertions: true);
     await compiler.run(uri);
-    var commonMasks = compiler.commonMasks;
-    var typesInferrer = compiler.globalInference.typesInferrer;
+    var commonMasks = compiler.closedWorld.commonMasks;
+    var typesInferrer = compiler.globalInference.typesInferrerInternal;
     var foo = findElement(compiler, "foo");
     // Return type is null|bool.
     var mask = typesInferrer.getReturnTypeOfElement(foo);
@@ -52,8 +52,8 @@
     // Assertions disabled:
     var compiler = compilerFor(TEST, uri, enableUserAssertions: false);
     await compiler.run(uri);
-    var commonMasks = compiler.commonMasks;
-    var typesInferrer = compiler.globalInference.typesInferrer;
+    var commonMasks = compiler.closedWorld.commonMasks;
+    var typesInferrer = compiler.globalInference.typesInferrerInternal;
     var foo = findElement(compiler, "foo");
     // Return type is null.
     var mask = typesInferrer.getReturnTypeOfElement(foo);
diff --git a/tests/compiler/dart2js/type_inference8_test.dart b/tests/compiler/dart2js/type_inference8_test.dart
index bcae368..fb4717c 100644
--- a/tests/compiler/dart2js/type_inference8_test.dart
+++ b/tests/compiler/dart2js/type_inference8_test.dart
@@ -34,8 +34,8 @@
   Uri uri = new Uri(scheme: 'source');
   var compiler = compilerFor(TEST1, uri);
   return compiler.run(uri).then((_) {
-    var commonMasks = compiler.commonMasks;
-    var typesInferrer = compiler.globalInference.typesInferrer;
+    var commonMasks = compiler.closedWorld.commonMasks;
+    var typesInferrer = compiler.globalInference.typesInferrerInternal;
     var element = findElement(compiler, "foo");
     var mask = typesInferrer.getReturnTypeOfElement(element);
     var falseType =
@@ -77,8 +77,8 @@
   Uri uri = new Uri(scheme: 'source');
   var compiler = compilerFor(TEST2, uri);
   return compiler.run(uri).then((_) {
-    var commonMasks = compiler.commonMasks;
-    var typesInferrer = compiler.globalInference.typesInferrer;
+    var commonMasks = compiler.closedWorld.commonMasks;
+    var typesInferrer = compiler.globalInference.typesInferrerInternal;
     var element = findElement(compiler, "foo");
     var mask = typesInferrer.getReturnTypeOfElement(element);
     // Can't infer value for foo's return type, it could be either true or false
diff --git a/tests/compiler/dart2js/type_inference_switch_test.dart b/tests/compiler/dart2js/type_inference_switch_test.dart
index bac1abd..181fc41 100644
--- a/tests/compiler/dart2js/type_inference_switch_test.dart
+++ b/tests/compiler/dart2js/type_inference_switch_test.dart
@@ -135,15 +135,15 @@
   var compiler = compilerFor(test, uri);
 
   checkTypeOf(String name, TypeMask type) {
-    var commonMasks = compiler.commonMasks;
-    var typesInferrer = compiler.globalInference.typesInferrer;
+    var commonMasks = compiler.closedWorld.commonMasks;
+    var typesInferrer = compiler.globalInference.typesInferrerInternal;
     var element = findElement(compiler, name);
     var mask = typesInferrer.getReturnTypeOfElement(element);
     Expect.equals(type, simplify(mask, compiler));
   }
 
   return compiler.run(uri).then((_) {
-    checker(compiler.commonMasks, checkTypeOf);
+    checker(compiler.closedWorld.commonMasks, checkTypeOf);
   });
 }
 
diff --git a/tests/compiler/dart2js/type_mask_test.dart b/tests/compiler/dart2js/type_mask_test.dart
index fae28df..3cb01a0 100644
--- a/tests/compiler/dart2js/type_mask_test.dart
+++ b/tests/compiler/dart2js/type_mask_test.dart
@@ -21,7 +21,7 @@
 main() {
   Uri uri = new Uri(scheme: 'source');
   var compiler = compilerFor(CODE, uri);
-  var closedWorld = compiler.openWorld.closeWorld();
+  var closedWorld = compiler.openWorld.closeWorld(compiler.reporter);
 
   asyncTest(() => compiler.run(uri).then((_) {
         var classA = findElement(compiler, 'A');
diff --git a/tests/compiler/dart2js/union_type_test.dart b/tests/compiler/dart2js/union_type_test.dart
index 336ce10..65e6da6 100644
--- a/tests/compiler/dart2js/union_type_test.dart
+++ b/tests/compiler/dart2js/union_type_test.dart
@@ -22,7 +22,8 @@
       }
       """,
         useMockCompiler: false);
-    ClosedWorld world = env.compiler.openWorld.closeWorld();
+    ClosedWorld world =
+        env.compiler.openWorld.closeWorld(env.compiler.reporter);
     FlatTypeMask mask1 = new FlatTypeMask.exact(env.getElement('A'));
     FlatTypeMask mask2 = new FlatTypeMask.exact(env.getElement('B'));
     UnionTypeMask union1 = mask1.nonNullable().union(mask2, world);
diff --git a/tests/compiler/dart2js_native/abstract_class_test.dart b/tests/compiler/dart2js_native/abstract_class_test.dart
index 18e0af3..d90fe2e 100644
--- a/tests/compiler/dart2js_native/abstract_class_test.dart
+++ b/tests/compiler/dart2js_native/abstract_class_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 // Native classes can have subclasses that are not declared to the program.  The
 // subclasses are indistinguishable from the base class.  This means that
@@ -29,17 +28,17 @@
 B.prototype.foo = function() { return 'B.foo'; };
 makeA = function(){return new A};
 makeB = function(){return new B};
+self.nativeConstructor(A);
+self.nativeConstructor(B);
 """;
 
-var inscrutable;
 main() {
+  nativeTesting();
   setup();
-  inscrutable = (x) => x;
-  inscrutable = inscrutable(inscrutable);
 
   var a = makeA();
   var b = makeB();
-  var c = inscrutable(new C());
+  var c = confuse(new C());
 
   Expect.isTrue(a is A);
   Expect.isFalse(b is A);
diff --git a/tests/compiler/dart2js_native/bound_closure_super_test.dart b/tests/compiler/dart2js_native/bound_closure_super_test.dart
index 35b19e0..d97d8e1 100644
--- a/tests/compiler/dart2js_native/bound_closure_super_test.dart
+++ b/tests/compiler/dart2js_native/bound_closure_super_test.dart
@@ -5,7 +5,7 @@
 // Test calling convention of property extraction closures (super edition).
 library bound_closure_super_test;
 
-import "package:expect/expect.dart";
+import 'package:expect/expect.dart';
 
 import 'bound_closure_test.dart' as bound_closure_test;
 
diff --git a/tests/compiler/dart2js_native/bound_closure_test.dart b/tests/compiler/dart2js_native/bound_closure_test.dart
index a637121..325f23f 100644
--- a/tests/compiler/dart2js_native/bound_closure_test.dart
+++ b/tests/compiler/dart2js_native/bound_closure_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import 'native_testing.dart';
 
 // Test calling convention of property extraction closures.
 
@@ -42,9 +41,13 @@
 makeBB = function(){return new BB;};
 makeCC = function(){return new CC;};
 inscrutable = function(a){return a;};
+
+self.nativeConstructor(BB);
+self.nativeConstructor(CC);
 """;
 
 main() {
+  nativeTesting();
   setup();
   var a = inscrutable(new AA());
   var b = inscrutable(makeBB());
diff --git a/tests/compiler/dart2js_native/browser_compat_1_prepatched_test.dart b/tests/compiler/dart2js_native/browser_compat_1_prepatched_test.dart
index 40662d8..606d4b1 100644
--- a/tests/compiler/dart2js_native/browser_compat_1_prepatched_test.dart
+++ b/tests/compiler/dart2js_native/browser_compat_1_prepatched_test.dart
@@ -2,10 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
-//import 'dart:_foreign_helper' show JS;
-//import 'dart:_js_helper' show Creates, setNativeSubclassDispatchRecord;
+import "native_testing.dart";
 
 // Test for dartNativeDispatchHooksTransformer, getTag hook.
 
@@ -42,6 +39,10 @@
 makeT1B = function(){return new T1CrazyB;};
 makeT1C = function(){return new T1fakeA;};
 
+self.nativeConstructor(T1A);
+self.nativeConstructor(T1CrazyB);
+self.nativeConstructor(T1fakeA);
+
 var getTagCount = 0;
 getTagCallCount = function() { return getTagCount; }
 
@@ -69,11 +70,9 @@
 dartNativeDispatchHooksTransformer = [transformer1];
 ''';
 
-var inscrutable;
-
 main() {
+  nativeTesting();
   setup();
-  inscrutable = (x) => x;
 
   var t1a = makeT1A();
   var t1b = makeT1B();
@@ -85,9 +84,9 @@
 
   Expect.equals(2, getTagCallCount());
 
-  Expect.equals(true, inscrutable(t1a) is T1A, '$t1a is T1A');
-  Expect.equals(true, inscrutable(t1b) is T1B, '$t1b is T1B');
-  Expect.equals(true, inscrutable(t1c) is T1C, '$t1c is T1C');
+  Expect.equals(true, confuse(t1a) is T1A, '$t1a is T1A');
+  Expect.equals(true, confuse(t1b) is T1B, '$t1b is T1B');
+  Expect.equals(true, confuse(t1c) is T1C, '$t1c is T1C');
 
   Expect.equals(2, getTagCallCount());
 }
diff --git a/tests/compiler/dart2js_native/browser_compat_1_unpatched_test.dart b/tests/compiler/dart2js_native/browser_compat_1_unpatched_test.dart
index 5e494d4..f2ada1e 100644
--- a/tests/compiler/dart2js_native/browser_compat_1_unpatched_test.dart
+++ b/tests/compiler/dart2js_native/browser_compat_1_unpatched_test.dart
@@ -2,10 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
-//import 'dart:_foreign_helper' show JS;
-//import 'dart:_js_helper' show Creates, setNativeSubclassDispatchRecord;
+import "native_testing.dart";
 
 // Test for dartNativeDispatchHooksTransformer, getTag hook.
 // Same as browser_compat_1_prepatched_test but with prepatching disabled.
@@ -43,6 +40,10 @@
 makeT1B = function(){return new T1CrazyB;};
 makeT1C = function(){return new T1fakeA;};
 
+self.nativeConstructor(T1A);
+self.nativeConstructor(T1CrazyB);
+self.nativeConstructor(T1fakeA);
+
 var getTagCount = 0;
 getTagCallCount = function() { return getTagCount; }
 
@@ -72,11 +73,9 @@
 dartNativeDispatchHooksTransformer = [transformer1];
 ''';
 
-var inscrutable;
-
 main() {
+  nativeTesting();
   setup();
-  inscrutable = (x) => x;
 
   var t1a = makeT1A();
   var t1b = makeT1B();
@@ -88,9 +87,9 @@
 
   Expect.equals(3, getTagCallCount());
 
-  Expect.equals(true, inscrutable(t1a) is T1A, '$t1a is T1A');
-  Expect.equals(true, inscrutable(t1b) is T1B, '$t1b is T1B');
-  Expect.equals(true, inscrutable(t1c) is T1C, '$t1c is T1C');
+  Expect.equals(true, confuse(t1a) is T1A, '$t1a is T1A');
+  Expect.equals(true, confuse(t1b) is T1B, '$t1b is T1B');
+  Expect.equals(true, confuse(t1c) is T1C, '$t1c is T1C');
 
   Expect.equals(3, getTagCallCount());
 }
diff --git a/tests/compiler/dart2js_native/browser_compat_2_test.dart b/tests/compiler/dart2js_native/browser_compat_2_test.dart
index eeb87fa..e659ce4 100644
--- a/tests/compiler/dart2js_native/browser_compat_2_test.dart
+++ b/tests/compiler/dart2js_native/browser_compat_2_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 // Test for dartNativeDispatchHooksTransformer
 //  - uncached, instance, leaf and interior caching modes.
@@ -63,6 +62,11 @@
 makeT1C = function(){return new T1C;};
 makeT1D = function(){return new T1D;};
 
+self.nativeConstructor(T1A);
+self.nativeConstructor(T1B);
+self.nativeConstructor(T1C);
+self.nativeConstructor(T1D);
+
 var getTagCount = 0;
 getTagCallCount = function() { return getTagCount; }
 clearTagCallCount = function() { getTagCount = 0; }
@@ -99,11 +103,9 @@
 dartNativeDispatchHooksTransformer = [transformer1, transformer2];
 ''';
 
-var inscrutable;
-
 main() {
+  nativeTesting();
   setup();
-  inscrutable = (x) => x;
 
   var t1a = makeT1A();
   var t1b = makeT1B();
@@ -111,17 +113,17 @@
   var t1d = makeT1D();
 
   clearTagCallCount();
-  Expect.equals("aA", inscrutable(t1a).foo(), 't1a is T1A');
-  Expect.equals("bB", inscrutable(t1b).foo(), 't1b is T1B');
-  Expect.equals("cC", inscrutable(t1c).foo(), 't1c is T1C');
-  Expect.equals("dD", inscrutable(t1d).foo(), 't1d is T1D');
+  Expect.equals("aA", confuse(t1a).foo(), 't1a is T1A');
+  Expect.equals("bB", confuse(t1b).foo(), 't1b is T1B');
+  Expect.equals("cC", confuse(t1c).foo(), 't1c is T1C');
+  Expect.equals("dD", confuse(t1d).foo(), 't1d is T1D');
   Expect.equals(4, getTagCallCount(), '4 fresh instances / types');
 
   clearTagCallCount();
-  Expect.equals("aA", inscrutable(t1a).foo(), 't1a is T1A');
-  Expect.equals("bB", inscrutable(t1b).foo(), 't1b is T1B');
-  Expect.equals("cC", inscrutable(t1c).foo(), 't1c is T1C');
-  Expect.equals("dD", inscrutable(t1d).foo(), 't1d is T1D');
+  Expect.equals("aA", confuse(t1a).foo(), 't1a is T1A');
+  Expect.equals("bB", confuse(t1b).foo(), 't1b is T1B');
+  Expect.equals("cC", confuse(t1c).foo(), 't1c is T1C');
+  Expect.equals("dD", confuse(t1d).foo(), 't1d is T1D');
   Expect.equals(1, getTagCallCount(), '1 = 1 uncached + (3 cached)');
 
   t1a = makeT1A();
@@ -130,18 +132,18 @@
   t1d = makeT1D();
 
   clearTagCallCount();
-  Expect.equals("aA", inscrutable(t1a).foo(), 't1a is T1A');
-  Expect.equals("bB", inscrutable(t1b).foo(), 't1b is T1B');
-  Expect.equals("cC", inscrutable(t1c).foo(), 't1c is T1C');
-  Expect.equals("dD", inscrutable(t1d).foo(), 't1d is T1D');
+  Expect.equals("aA", confuse(t1a).foo(), 't1a is T1A');
+  Expect.equals("bB", confuse(t1b).foo(), 't1b is T1B');
+  Expect.equals("cC", confuse(t1c).foo(), 't1c is T1C');
+  Expect.equals("dD", confuse(t1d).foo(), 't1d is T1D');
   Expect.equals(2, getTagCallCount(),
       '2 = 1 fresh instance + 1 uncached (+ 2 proto cached)');
 
   clearTagCallCount();
-  Expect.equals("aA", inscrutable(t1a).foo(), 't1a is T1A');
-  Expect.equals("bB", inscrutable(t1b).foo(), 't1b is T1B');
-  Expect.equals("cC", inscrutable(t1c).foo(), 't1c is T1C');
-  Expect.equals("dD", inscrutable(t1d).foo(), 't1d is T1D');
+  Expect.equals("aA", confuse(t1a).foo(), 't1a is T1A');
+  Expect.equals("bB", confuse(t1b).foo(), 't1b is T1B');
+  Expect.equals("cC", confuse(t1c).foo(), 't1c is T1C');
+  Expect.equals("dD", confuse(t1d).foo(), 't1d is T1D');
   Expect.equals(1, getTagCallCount(),
       '1 = 2 proto cached + 1 instance cached + 1 uncached');
 }
diff --git a/tests/compiler/dart2js_native/catch_javascript_null_stack_trace_test.dart b/tests/compiler/dart2js_native/catch_javascript_null_stack_trace_test.dart
index 43a6b22..cf9f528 100644
--- a/tests/compiler/dart2js_native/catch_javascript_null_stack_trace_test.dart
+++ b/tests/compiler/dart2js_native/catch_javascript_null_stack_trace_test.dart
@@ -2,8 +2,7 @@
 // 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:_foreign_helper' show JS;
-import "package:expect/expect.dart";
+import 'native_testing.dart';
 
 // Try throwing a javascript null, and getting a stack-trace from it.
 
diff --git a/tests/compiler/dart2js_native/core_type_check_native_test.dart b/tests/compiler/dart2js_native/core_type_check_native_test.dart
index 261acf7..307509f 100644
--- a/tests/compiler/dart2js_native/core_type_check_native_test.dart
+++ b/tests/compiler/dart2js_native/core_type_check_native_test.dart
@@ -2,10 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
-
-var inscrutable = (int x) => x == 0 ? 0 : x | inscrutable(x & (x - 1));
+import "native_testing.dart";
 
 @Native("A")
 class A {}
@@ -33,6 +30,11 @@
 makeC = function() { return new C; }
 function D() {};
 makeD = function() { return new D; }
+
+self.nativeConstructor(A);
+self.nativeConstructor(B);
+self.nativeConstructor(C);
+self.nativeConstructor(D);
 """;
 
 checkTest(value, expectComparable, expectPattern) {
@@ -65,7 +67,7 @@
     makeC(),
     makeD()
   ];
-  value(i) => things[inscrutable(i)];
+  value(i) => confuse(things[i]);
 
   check(value(0), false, false); // List
   check(value(1), true, false); // int
@@ -79,6 +81,7 @@
 }
 
 main() {
+  nativeTesting();
   setup();
 
   checkAll(checkTest);
diff --git a/tests/compiler/dart2js_native/dart2js_native.status b/tests/compiler/dart2js_native/dart2js_native.status
index 080c6e1..874ace3 100644
--- a/tests/compiler/dart2js_native/dart2js_native.status
+++ b/tests/compiler/dart2js_native/dart2js_native.status
@@ -25,11 +25,3 @@
 
 [ $compiler == dart2js && $runtime == d8 && $system == windows ]
 compute_this_script_test: Skip # Issue 17458
-
-[ $compiler == dart2js && $cps_ir ]
-foreign_test: RuntimeError # Expect.equals(expected: <1234567891011>, actual: <1234567891011>) fails.
-native_exception_test: RuntimeError # Issue 24421
-optimization_hints_test: RuntimeError # Please triage this failure.
-
-[ $compiler == dart2js && $cps_ir && $checked ]
-*: Skip # `assert` not implemented, 75% of the tests fail.
diff --git a/tests/compiler/dart2js_native/dispatch_property_initialization_test.dart b/tests/compiler/dart2js_native/dispatch_property_initialization_test.dart
index 174eaf8..6da238e 100644
--- a/tests/compiler/dart2js_native/dispatch_property_initialization_test.dart
+++ b/tests/compiler/dart2js_native/dispatch_property_initialization_test.dart
@@ -4,9 +4,7 @@
 
 // Test for initialization of dispatchPropertyName.
 
-import "package:expect/expect.dart";
-import 'dart:_foreign_helper' show JS;
-import 'dart:_js_helper' show Native;
+import 'native_testing.dart';
 
 @Native("Foo")
 class Foo {
@@ -20,10 +18,13 @@
 Foo.prototype.method = function(x) { return 'Foo ' + x; }
 
 self.makeFoo = function() { return new Foo(); }
+
+self.nativeConstructor(Foo);
 """;
 
 
 main() {
+  nativeTesting();
   setup();
 
   // If the dispatchPropertyName is uninitialized, it will be `undefined` or
diff --git a/tests/compiler/dart2js_native/downcast_test.dart b/tests/compiler/dart2js_native/downcast_test.dart
index f993388..dab6ec8 100644
--- a/tests/compiler/dart2js_native/downcast_test.dart
+++ b/tests/compiler/dart2js_native/downcast_test.dart
@@ -4,8 +4,7 @@
 
 // Test for downcasts on native classes.
 
-import "dart:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 abstract class J {}
 
@@ -48,6 +47,9 @@
 A.prototype.write = function(x) { this._x = x; };
 makeA = function(){return new A};
 makeB = function(){return new B};
+
+self.nativeConstructor(A);
+self.nativeConstructor(B);
 """;
 
 class C {}
@@ -55,6 +57,7 @@
 bool _check(a, b) => identical(a, b);
 
 main() {
+  nativeTesting();
   setup();
 
   var a1 = makeA();
diff --git a/tests/compiler/dart2js_native/error_safeToString_test.dart b/tests/compiler/dart2js_native/error_safeToString_test.dart
index fa022d9..7e117f9 100644
--- a/tests/compiler/dart2js_native/error_safeToString_test.dart
+++ b/tests/compiler/dart2js_native/error_safeToString_test.dart
@@ -2,9 +2,8 @@
 // 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";
-import 'dart:_foreign_helper' show JS_INTERCEPTOR_CONSTANT, JS;
-import 'dart:_js_helper' show Native, Creates;
+import "native_testing.dart";
+import 'dart:_foreign_helper' show JS_INTERCEPTOR_CONSTANT;
 import 'dart:_interceptors'
     show
         Interceptor,
@@ -70,6 +69,9 @@
 function RRRR(){}
 makeR = function(){return new RRRR();};
 
+self.nativeConstructor(PPPP);
+self.nativeConstructor(QQQQ);
+self.nativeConstructor(RRRR);
 """;
 
 expectTypeName(expectedName, s) {
@@ -158,6 +160,7 @@
 }
 
 main() {
+  nativeTesting();
   setup();
 
   testDistinctInterceptors();
diff --git a/tests/compiler/dart2js_native/event_loop_test.dart b/tests/compiler/dart2js_native/event_loop_test.dart
index 18d2068..60dd77a 100644
--- a/tests/compiler/dart2js_native/event_loop_test.dart
+++ b/tests/compiler/dart2js_native/event_loop_test.dart
@@ -3,9 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import "dart:async";
-import "dart:_js_helper";
 import "package:async_helper/async_helper.dart";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 typedef void Callback0();
 
@@ -20,9 +19,11 @@
 function A() {}
 A.prototype.foo = function(f) { return f(); };
 makeA = function() { return new A; };
+self.nativeConstructor(A);
 """;
 
 main() {
+  nativeTesting();
   setup();
 
   // Makes sure that we don't run the event-loop when we have a reentrant
diff --git a/tests/compiler/dart2js_native/fake_thing_2_test.dart b/tests/compiler/dart2js_native/fake_thing_2_test.dart
index 3ec92e0..157e08f 100644
--- a/tests/compiler/dart2js_native/fake_thing_2_test.dart
+++ b/tests/compiler/dart2js_native/fake_thing_2_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import 'native_testing.dart';
 
 // Test that native objects cannot accidentally or maliciously be mistaken for
 // Dart objects.
@@ -27,19 +26,20 @@
 function NT() {}
 NT.prototype.$isThing = true;
 make3 = function(){return new NT;};
+
+self.nativeConstructor(NT);
 """;
 
-var inscrutable;
 main() {
+  nativeTesting();
   setup();
-  inscrutable = (x) => x;
 
   var a = new Thing();
   var b = make1();
   var c = make2();
   var d = make3();
-  Expect.isTrue(inscrutable(a) is Thing);
-  Expect.isFalse(inscrutable(b) is Thing);
-  Expect.isFalse(inscrutable(c) is Thing);
-  Expect.isFalse(inscrutable(d) is Thing);
+  Expect.isTrue(confuse(a) is Thing);
+  Expect.isFalse(confuse(b) is Thing);
+  Expect.isFalse(confuse(c) is Thing);
+  Expect.isFalse(confuse(d) is Thing);
 }
diff --git a/tests/compiler/dart2js_native/field_type2_test.dart b/tests/compiler/dart2js_native/field_type2_test.dart
index 31de669..e3f0693 100644
--- a/tests/compiler/dart2js_native/field_type2_test.dart
+++ b/tests/compiler/dart2js_native/field_type2_test.dart
@@ -5,7 +5,7 @@
 // Test that a closure call on a native field is recognized by the
 // type inferrer.
 
-import 'dart:_js_helper';
+import 'native_testing.dart';
 
 @Native("Node")
 class Node {
@@ -18,9 +18,12 @@
 // This code is all inside 'setup' and so not accesible from the global scope.
 function Node(parent){ this.parentNode = parent; }
 makeNode = function(p){return new Node(p);};
+
+self.nativeConstructor(Node);
 """;
 
 main() {
+  nativeTesting();
   setup();
   var node = makeNode(null);
   if (node.parentNode != null) {
diff --git a/tests/compiler/dart2js_native/field_type_test.dart b/tests/compiler/dart2js_native/field_type_test.dart
index ebb83c6..c9f4ec9 100644
--- a/tests/compiler/dart2js_native/field_type_test.dart
+++ b/tests/compiler/dart2js_native/field_type_test.dart
@@ -6,8 +6,7 @@
 // This regression test verifies that compiler accounts for hidden constructor
 // when analysing field values.
 
-import "dart:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 @Native("Node")
 class Node {
@@ -48,9 +47,11 @@
 // This code is all inside 'setup' and so not accesible from the global scope.
 function Node(parent){ this.parentNode = parent; }
 makeNode = function(p){return new Node(p);};
+self.nativeConstructor(Node);
 """;
 
 main() {
+  nativeTesting();
   setup();
 
   var n1 = makeNode(null);
diff --git a/tests/compiler/dart2js_native/fixup_get_tag_test.dart b/tests/compiler/dart2js_native/fixup_get_tag_test.dart
index 8fc9b70..160e41a 100644
--- a/tests/compiler/dart2js_native/fixup_get_tag_test.dart
+++ b/tests/compiler/dart2js_native/fixup_get_tag_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 // Test for dartExperimentalFixupGetTag.
 
@@ -34,12 +33,15 @@
 
 makeA = function() { return new A; };
 makeB = function() { return new B; };
+
+self.nativeConstructor(A);
 """;
 
 makeA() native ;
 makeB() native ;
 
 main() {
+  nativeTesting();
   setup();
 
   var a = makeA();
diff --git a/tests/compiler/dart2js_native/foreign_test.dart b/tests/compiler/dart2js_native/foreign_test.dart
index e2a4c4e..c1d1c65 100644
--- a/tests/compiler/dart2js_native/foreign_test.dart
+++ b/tests/compiler/dart2js_native/foreign_test.dart
@@ -2,8 +2,7 @@
 // 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";
-import 'dart:_foreign_helper' show JS;
+import "native_testing.dart";
 
 foreign1(var a, var b) {
   return JS("num", r"# + #", a, b);
diff --git a/tests/compiler/dart2js_native/hash_code_test.dart b/tests/compiler/dart2js_native/hash_code_test.dart
index c909a10..8bf0180 100644
--- a/tests/compiler/dart2js_native/hash_code_test.dart
+++ b/tests/compiler/dart2js_native/hash_code_test.dart
@@ -2,20 +2,32 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import 'native_testing.dart';
 
 @Native("A")
 class A {}
 
+@Native("B")
+class B {
+  int get hashCode => 1234567;
+}
+
 makeA() native ;
+makeB() native ;
 
 void setup() native """
 function A() {}
+function B() {}
 makeA = function(){return new A;};
+makeB = function(){return new B;};
+
+self.nativeConstructor(A);
+self.nativeConstructor(B);
 """;
 
 main() {
+  nativeTesting();
   setup();
   Expect.isTrue(makeA().hashCode is int);
+  Expect.equals(1234567, makeB().hashCode);
 }
diff --git a/tests/compiler/dart2js_native/inference_of_helper_methods_test.dart b/tests/compiler/dart2js_native/inference_of_helper_methods_test.dart
index 7d821c3..ef29951 100644
--- a/tests/compiler/dart2js_native/inference_of_helper_methods_test.dart
+++ b/tests/compiler/dart2js_native/inference_of_helper_methods_test.dart
@@ -2,7 +2,7 @@
 // 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";
+import 'native_testing.dart';
 import 'dart:_js_helper' show intTypeCheck;
 
 bool get inCheckedMode {
@@ -18,7 +18,7 @@
   var a = [];
   a.add(42);
   a.add('foo');
-  // By calling direclty [intTypeCheck] with an int, we're making the
+  // By calling directly [intTypeCheck] with an int, we're making the
   // type inferrer infer that the parameter type of [intTypeCheck] is
   // always an int, and therefore the method will be compiled to
   // never throw. So when the backend actually uses the helper for
diff --git a/tests/compiler/dart2js_native/is_check_test.dart b/tests/compiler/dart2js_native/is_check_test.dart
index ecc42b2..ec1d703 100644
--- a/tests/compiler/dart2js_native/is_check_test.dart
+++ b/tests/compiler/dart2js_native/is_check_test.dart
@@ -2,13 +2,12 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import 'native_testing.dart';
 
 @Native("A")
 class A {}
 
 main() {
-  var a = [new Object()];
-  Expect.isFalse(a[0] is A);
+  JS('A', '(null)'); // Class 'A' appears to be created.
+  Expect.isFalse(confuse(new Object()) is A);
 }
diff --git a/tests/compiler/dart2js_native/issue9182_test.dart b/tests/compiler/dart2js_native/issue9182_test.dart
index 5e06b35..1b5d1ac 100644
--- a/tests/compiler/dart2js_native/issue9182_test.dart
+++ b/tests/compiler/dart2js_native/issue9182_test.dart
@@ -5,8 +5,7 @@
 // Regression test for Issue 9182.  The generative constructor body function
 // should not have the interceptor calling convention.
 
-import "dart:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 @Native("A")
 class Foo {
@@ -28,16 +27,17 @@
 void setup() native r"""
 function A(){}
 makeA = function() { return new A; };
+self.nativeConstructor(A);
 """;
 
 makeA() native ;
 
 main() {
+  nativeTesting();
   setup();
 
-  var things = [new Foo(), new Bar(30, 40)];
-  var foo = things[0];
-  var bar = things[1];
+  var foo = confuse(new Foo());
+  var bar = confuse(new Bar(30, 40));
 
   Expect.equals(123, foo.Bar()); // Ensure that Foo.Bar is used.
 
diff --git a/tests/compiler/dart2js_native/js_constant_test.dart b/tests/compiler/dart2js_native/js_constant_test.dart
index 7658dc0..bc9837e 100644
--- a/tests/compiler/dart2js_native/js_constant_test.dart
+++ b/tests/compiler/dart2js_native/js_constant_test.dart
@@ -2,8 +2,7 @@
 // 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:_foreign_helper' show JS;
-import "package:expect/expect.dart";
+import 'native_testing.dart';
 
 // Negative constant numbers must be generated as negation, not just a literal
 // with a sign, i.e.
diff --git a/tests/compiler/dart2js_native/jsobject_test.dart b/tests/compiler/dart2js_native/jsobject_test.dart
index f7a92f9..7f31dd1 100644
--- a/tests/compiler/dart2js_native/jsobject_test.dart
+++ b/tests/compiler/dart2js_native/jsobject_test.dart
@@ -2,8 +2,8 @@
 // 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";
-import 'dart:_js_helper' show Native, Creates, setNativeSubclassDispatchRecord;
+import 'native_testing.dart';
+import 'dart:_js_helper' show setNativeSubclassDispatchRecord;
 import 'dart:_interceptors'
     show
         JSObject, // The interface, which may be re-exported by a
@@ -32,6 +32,8 @@
 
 function QQ(){}
 makeQ = function(){return new QQ();};
+
+self.nativeConstructor(QQ);
 """;
 
 class Is<T> {
@@ -93,6 +95,7 @@
 }
 
 main() {
+  nativeTesting();
   setup();
 
   dynamic_test();
diff --git a/tests/compiler/dart2js_native/load_elim_refinement_test.dart b/tests/compiler/dart2js_native/load_elim_refinement_test.dart
index 026b142..981c0fa 100644
--- a/tests/compiler/dart2js_native/load_elim_refinement_test.dart
+++ b/tests/compiler/dart2js_native/load_elim_refinement_test.dart
@@ -2,8 +2,7 @@
 // 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";
-import 'dart:_foreign_helper' show JS;
+import 'native_testing.dart';
 
 class A {
   int a;
diff --git a/tests/compiler/dart2js_native/mirror_intercepted_field_test.dart b/tests/compiler/dart2js_native/mirror_intercepted_field_test.dart
index a9cb2e0..4a3b337 100644
--- a/tests/compiler/dart2js_native/mirror_intercepted_field_test.dart
+++ b/tests/compiler/dart2js_native/mirror_intercepted_field_test.dart
@@ -3,8 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:mirrors';
-import "dart:_js_helper";
-import "package:expect/expect.dart";
+import 'native_testing.dart';
 
 @Native("B")
 class B {
@@ -20,6 +19,7 @@
 const symF = const Symbol('f');
 
 main() {
+  JS('B', '(null)'); // B appears to be created.
   var a = new A();
 
   InstanceMirror mirror = reflect(a);
diff --git a/tests/compiler/dart2js_native/native_call_arity1_frog_test.dart b/tests/compiler/dart2js_native/native_call_arity1_frog_test.dart
index ed3d131..d435bdd 100644
--- a/tests/compiler/dart2js_native/native_call_arity1_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_call_arity1_frog_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 // Test that native methods with unnamed* optional arguments are called with the
 // number of arguments in the call site.  This is necessary because native
@@ -38,12 +37,14 @@
 
 makeA = function(){return new A;};
 makeB = function(){return new B;};
+
+self.nativeConstructor(A);
+self.nativeConstructor(B);
 """;
 
 testDynamicContext() {
-  var things = [makeA(), makeB()];
-  var a = things[0];
-  var b = things[1];
+  var a = confuse(makeA());
+  var b = confuse(makeB());
 
   Expect.throws(() => a.foo());
   Expect.equals(1, a.foo(10));
@@ -76,6 +77,7 @@
 }
 
 main() {
+  nativeTesting();
   setup();
   testDynamicContext();
   testStaticContext();
diff --git a/tests/compiler/dart2js_native/native_call_arity2_frog_test.dart b/tests/compiler/dart2js_native/native_call_arity2_frog_test.dart
index b99e07b..029122c 100644
--- a/tests/compiler/dart2js_native/native_call_arity2_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_call_arity2_frog_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 // This is a similar test to NativeCallArity1FrogTest, but makes sure
 // that subclasses also get the right number of arguments.
@@ -41,12 +40,14 @@
 
 makeA = function(){return new A;};
 makeB = function(){return new B;};
+
+self.nativeConstructor(A);
+self.nativeConstructor(B);
 """;
 
 testDynamicContext() {
-  var things = [makeA(), makeB()];
-  var a = things[0];
-  var b = things[1];
+  var a = confuse(makeA());
+  var b = confuse(makeB());
 
   Expect.equals(0, a.foo());
   Expect.equals(1, a.foo(10));
@@ -91,6 +92,7 @@
 }
 
 main() {
+  nativeTesting();
   setup();
   testDynamicContext();
   testStaticContext();
diff --git a/tests/compiler/dart2js_native/native_call_arity3_frog_test.dart b/tests/compiler/dart2js_native/native_call_arity3_frog_test.dart
index 1b4048e..f333d81 100644
--- a/tests/compiler/dart2js_native/native_call_arity3_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_call_arity3_frog_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 // Test similar to NativeCallArity1FrogTest, but with default values to
 // parameters set to null. These parameters should be treated as if they
@@ -34,12 +33,14 @@
 
 makeA = function(){return new A;};
 makeB = function(){return new B;};
+
+self.nativeConstructor(A);
+self.nativeConstructor(B);
 """;
 
 testDynamicContext() {
-  var things = [makeA(), makeB()];
-  var a = things[0];
-  var b = things[1];
+  var a = confuse(makeA());
+  var b = confuse(makeB());
 
   Expect.throws(() => a.foo());
   Expect.equals(1, a.foo(10));
@@ -78,6 +79,7 @@
 }
 
 main() {
+  nativeTesting();
   setup();
   testDynamicContext();
   testStaticContext();
diff --git a/tests/compiler/dart2js_native/native_checked_arguments1_frog_test.dart b/tests/compiler/dart2js_native/native_checked_arguments1_frog_test.dart
index 9a64a3d..e0f1e31 100644
--- a/tests/compiler/dart2js_native/native_checked_arguments1_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_checked_arguments1_frog_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import 'native_testing.dart';
 
 // Test that type checks occur on native methods.
 
@@ -33,6 +32,9 @@
 
 makeA = function(){return new A;};
 makeB = function(){return new B;};
+
+self.nativeConstructor(A);
+self.nativeConstructor(B);
 """;
 
 expectThrows(action()) {
@@ -135,6 +137,7 @@
 }
 
 main() {
+  nativeTesting();
   setup();
 
   if (isCheckedMode()) {
diff --git a/tests/compiler/dart2js_native/native_checked_fields_frog_test.dart b/tests/compiler/dart2js_native/native_checked_fields_frog_test.dart
index 3ae79bf..83f5bac 100644
--- a/tests/compiler/dart2js_native/native_checked_fields_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_checked_fields_frog_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import 'native_testing.dart';
 
 // Test that type checks occur on assignment to fields of native methods.
 
@@ -27,6 +26,9 @@
 
 makeA = function(){return new A;};
 makeB = function(){return new B;};
+
+self.nativeConstructor(A);
+self.nativeConstructor(B);
 """;
 
 expectThrows(action()) {
@@ -109,6 +111,7 @@
 }
 
 main() {
+  nativeTesting();
   setup();
 
   if (isCheckedMode()) {
diff --git a/tests/compiler/dart2js_native/native_class_avoids_hidden_name_frog_test.dart b/tests/compiler/dart2js_native/native_class_avoids_hidden_name_frog_test.dart
index 8690e4b..3f28682 100644
--- a/tests/compiler/dart2js_native/native_class_avoids_hidden_name_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_class_avoids_hidden_name_frog_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 // Test that hidden native class names are not used by generated code.
 
@@ -41,18 +40,18 @@
 function CC(){}
 makeA = function(){return new BB};  // AA is native "BB"
 makeB = function(){return new CC};  // BB is native "CC"
+self.nativeConstructor(BB);
+self.nativeConstructor(CC);
 """;
 
-int inscrutable(int x) => x == 0 ? 0 : x | inscrutable(x & (x - 1));
-
 main() {
+  nativeTesting();
   setup1();
   setup2();
 
-  var things = [AA.create(), BB.create(), CC.create()];
-  var a = things[inscrutable(0)];
-  var b = things[inscrutable(1)];
-  var c = things[inscrutable(2)];
+  var a = confuse(AA.create());
+  var b = confuse(BB.create());
+  var c = confuse(CC.create());
 
   Expect.equals('AA', a.name);
   Expect.equals('BB', b.name);
diff --git a/tests/compiler/dart2js_native/native_class_fields_2_test.dart b/tests/compiler/dart2js_native/native_class_fields_2_test.dart
index 419d82f..efd4398 100644
--- a/tests/compiler/dart2js_native/native_class_fields_2_test.dart
+++ b/tests/compiler/dart2js_native/native_class_fields_2_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 // Verify that methods are not renamed to clash with native field names
 // that are known from the DOM (like x, y, z).
@@ -23,7 +22,7 @@
 
 function A(){
   var a = Object.create(
-      { constructor: { name: 'A'}},
+      { constructor: A },
       { x: { get: getter, configurable: false, writeable: false },
         y: { get: getter, configurable: false, writeable: false },
         z: { get: getter, configurable: false, writeable: false }
@@ -33,6 +32,7 @@
 }
 
 makeA = function() { return new A; };
+self.nativeConstructor(A);
 """;
 
 A makeA() native ;
@@ -72,9 +72,10 @@
 int inscrutable(int x) => x == 0 ? 0 : x | inscrutable(x & (x - 1));
 
 main() {
+  nativeTesting();
   setup();
-  var both = [makeA(), new B()];
-  var x = both[inscrutable(0)];
+  confuse(new B()).a();
+  var x = confuse(makeA());
   // Each of these will throw, because an instance of A doesn't have any of
   // these functions.  The important thing is that none of them have been
   // renamed to be called 'z' by the minifier, because then the getter will be
diff --git a/tests/compiler/dart2js_native/native_class_fields_3_test.dart b/tests/compiler/dart2js_native/native_class_fields_3_test.dart
index ce6c28d..5576638 100644
--- a/tests/compiler/dart2js_native/native_class_fields_3_test.dart
+++ b/tests/compiler/dart2js_native/native_class_fields_3_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 // Verify that we can have fields with names that start with g and s even
 // though those names are reserved for getters and setters in minified mode.
@@ -45,7 +44,7 @@
 
 function A(){
   var a = Object.create(
-      { constructor: { name: 'A'}},
+      { constructor: A },
       { bar: descriptor,
         g: descriptor,
         s: descriptor,
@@ -59,30 +58,46 @@
 }
 
 makeA = function() { return new A; };
+self.nativeConstructor(A);
 """;
 
 A makeA() native ;
 
 class B {}
 
-int inscrutable(int x) => x == 0 ? 0 : x | inscrutable(x & (x - 1));
-
 main() {
+  nativeTesting();
   setup();
-  var both = [makeA(), new B()];
-  var foo = both[inscrutable(0)];
-  Expect.equals(42, foo.bar);
-  Expect.equals(42, foo.g);
-  Expect.equals(42, foo.s);
-  Expect.equals(42, foo.end);
-  Expect.equals(42, foo.gend);
-  Expect.equals(42, foo.send);
-  Expect.equals(271, foo.bar = 271);
-  Expect.equals(271, foo.g = 271);
-  Expect.equals(271, foo.s = 271);
-  Expect.equals(271, foo.end = 271);
-  Expect.equals(271, foo.gend = 271);
-  Expect.equals(271, foo.send = 271);
-  Expect.equals(6, foo.gettersCalled);
-  Expect.equals(6, foo.settersCalled);
+  confuse(new B());
+  var a = makeA();
+
+  Expect.equals(42, confuse(a).bar);
+  Expect.equals(42, confuse(a).g);
+  Expect.equals(42, confuse(a).s);
+  Expect.equals(42, confuse(a).end);
+  Expect.equals(42, confuse(a).gend);
+  Expect.equals(42, confuse(a).send);
+  Expect.equals(271, confuse(a).bar = 271);
+  Expect.equals(271, confuse(a).g = 271);
+  Expect.equals(271, confuse(a).s = 271);
+  Expect.equals(271, confuse(a).end = 271);
+  Expect.equals(271, confuse(a).gend = 271);
+  Expect.equals(271, confuse(a).send = 271);
+  Expect.equals(6, confuse(a).gettersCalled);
+  Expect.equals(6, confuse(a).settersCalled);
+
+  Expect.equals(42, a.bar);
+  Expect.equals(42, a.g);
+  Expect.equals(42, a.s);
+  Expect.equals(42, a.end);
+  Expect.equals(42, a.gend);
+  Expect.equals(42, a.send);
+  Expect.equals(271, a.bar = 271);
+  Expect.equals(271, a.g = 271);
+  Expect.equals(271, a.s = 271);
+  Expect.equals(271, a.end = 271);
+  Expect.equals(271, a.gend = 271);
+  Expect.equals(271, a.send = 271);
+  Expect.equals(12, a.gettersCalled);
+  Expect.equals(12, a.settersCalled);
 }
diff --git a/tests/compiler/dart2js_native/native_class_fields_test.dart b/tests/compiler/dart2js_native/native_class_fields_test.dart
index 45a45bf..67380cb 100644
--- a/tests/compiler/dart2js_native/native_class_fields_test.dart
+++ b/tests/compiler/dart2js_native/native_class_fields_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 // Verify that native fields on classes are not renamed by the minifier.
 @Native("A")
@@ -25,7 +24,7 @@
 
 function A(){
   var a = Object.create(
-      { constructor: { name: 'A'}},
+      { constructor: A},
       { myLongPropertyName: { get: getter,
                               set: setter,
                               configurable: false,
@@ -37,17 +36,24 @@
 }
 
 makeA = function(){return new A;};
+self.nativeConstructor(A);
 """;
 
 A makeA() native ;
 
 main() {
+  nativeTesting();
   setup();
   var a = makeA();
   a.myLongPropertyName = 21;
   int gotten = a.myLongPropertyName;
   Expect.equals(11, gotten);
 
+  // Force interceptor dispatch.
+  confuse(a).myLongPropertyName = 99;
+  gotten = confuse(a).myLongPropertyName;
+  Expect.equals(22, gotten);
+
   var a2 = makeA();
   if (a2 is A) {
     // Inside this 'if' the compiler knows that a2 is an A, so it is tempted
diff --git a/tests/compiler/dart2js_native/native_class_inheritance1_frog_test.dart b/tests/compiler/dart2js_native/native_class_inheritance1_frog_test.dart
index 3b0ab8b..2693b13 100644
--- a/tests/compiler/dart2js_native/native_class_inheritance1_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_class_inheritance1_frog_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 // Test to see if resolving a hidden native class's method interferes with
 // subsequent resolving the subclass's method.  This might happen if the
@@ -67,9 +66,15 @@
 
 makeA2 = function(){return new A2};
 makeB2 = function(){return new B2};
+
+self.nativeConstructor(A1);
+self.nativeConstructor(A2);
+self.nativeConstructor(B1);
+self.nativeConstructor(B2);
 """;
 
 main() {
+  nativeTesting();
   setup();
 
   var a1 = makeA1();
diff --git a/tests/compiler/dart2js_native/native_class_inheritance2_frog_test.dart b/tests/compiler/dart2js_native/native_class_inheritance2_frog_test.dart
index d01b4ff..49c7bfd 100644
--- a/tests/compiler/dart2js_native/native_class_inheritance2_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_class_inheritance2_frog_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 // Test to see if resolving a hidden native class's method interferes with
 // subsequent resolving the subclass's method.  This might happen if the
@@ -59,9 +58,15 @@
 makeB = function(){return new B};
 makeC = function(){return new C};
 makeD = function(){return new D};
+
+self.nativeConstructor(A);
+self.nativeConstructor(B);
+self.nativeConstructor(C);
+self.nativeConstructor(D);
 """;
 
 main() {
+  nativeTesting();
   setup();
 
   var a = makeA();
diff --git a/tests/compiler/dart2js_native/native_class_inheritance3_frog_test.dart b/tests/compiler/dart2js_native/native_class_inheritance3_frog_test.dart
index 9c23566..900b011 100644
--- a/tests/compiler/dart2js_native/native_class_inheritance3_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_class_inheritance3_frog_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 // Test to see if resolving a hidden native class's method to noSuchMethod
 // interferes with subsequent resolving of the method.  This might happen if the
@@ -59,9 +58,15 @@
 makeB2 = function(){return new B2};
 
 makeObject = function(){return new Object};
+
+self.nativeConstructor(A1);
+self.nativeConstructor(A2);
+self.nativeConstructor(B1);
+self.nativeConstructor(B2);
 """;
 
 main() {
+  nativeTesting();
   setup();
 
   var a1 = makeA1();
diff --git a/tests/compiler/dart2js_native/native_class_inheritance4_frog_test.dart b/tests/compiler/dart2js_native/native_class_inheritance4_frog_test.dart
index 3f7544a..3ba8cc8 100644
--- a/tests/compiler/dart2js_native/native_class_inheritance4_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_class_inheritance4_frog_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 // Additional Dart code may be 'placed on' hidden native classes.  With
 // inheritance, the superclass method must not be reached by a call on the
@@ -53,6 +52,9 @@
 inherits(B, A);
 makeA = function(){return new A;};
 makeB = function(){return new B;};
+
+self.nativeConstructor(A);
+self.nativeConstructor(B);
 """;
 
 testBasicA_dynamic() {
@@ -145,6 +147,7 @@
 }
 
 main() {
+  nativeTesting();
   testBasicA_dynamic();
   testBasicA_typed();
   testBasicB_dynamic();
diff --git a/tests/compiler/dart2js_native/native_class_is_check1_frog_test.dart b/tests/compiler/dart2js_native/native_class_is_check1_frog_test.dart
index b5ace6d..3c2e908 100644
--- a/tests/compiler/dart2js_native/native_class_is_check1_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_class_is_check1_frog_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 // Test for correct simple is-checks on hidden native classes.
 
@@ -29,11 +28,13 @@
 A.prototype.read = function() { return this._x; };
 A.prototype.write = function(x) { this._x = x; };
 makeA = function(){return new A};
+self.nativeConstructor(A);
 """;
 
 class B {}
 
 main() {
+  nativeTesting();
   setup();
 
   var a1 = makeA();
diff --git a/tests/compiler/dart2js_native/native_class_is_check3_frog_test.dart b/tests/compiler/dart2js_native/native_class_is_check3_frog_test.dart
index e6d55fe..f24c355 100644
--- a/tests/compiler/dart2js_native/native_class_is_check3_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_class_is_check3_frog_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 // Test for correct simple is-checks on hidden native classes.
 
@@ -48,11 +47,14 @@
 A.prototype.write = function(x) { this._x = x; };
 makeA = function(){return new A};
 makeB = function(){return new B};
+self.nativeConstructor(A);
+self.nativeConstructor(B);
 """;
 
 class C {}
 
 main() {
+  nativeTesting();
   setup();
 
   var a1 = makeA();
diff --git a/tests/compiler/dart2js_native/native_class_with_dart_methods_frog_test.dart b/tests/compiler/dart2js_native/native_class_with_dart_methods_frog_test.dart
index 08d19ef..5c90a1b 100644
--- a/tests/compiler/dart2js_native/native_class_with_dart_methods_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_class_with_dart_methods_frog_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import 'native_testing.dart';
 
 // Additional Dart code may be 'placed on' hidden native classes.
 
@@ -24,9 +23,11 @@
 void setup() native """
 function A() {}
 makeA = function(){return new A;};
+self.nativeConstructor(A);
 """;
 
 main() {
+  nativeTesting();
   setup();
 
   var a = makeA();
diff --git a/tests/compiler/dart2js_native/native_closure_identity_frog_test.dart b/tests/compiler/dart2js_native/native_closure_identity_frog_test.dart
index 2a27d5d..3d73c35 100644
--- a/tests/compiler/dart2js_native/native_closure_identity_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_closure_identity_frog_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import 'native_testing.dart';
 
 typedef void MyFunctionType();
 
@@ -22,6 +21,8 @@
 A.prototype.check = function(f) { return this.f === f; };
 A.prototype.invoke = function() { return this.f(); };
 makeA = function(){return new A;};
+
+self.nativeConstructor(A);
 """;
 
 var staticClosure;
@@ -45,6 +46,7 @@
 }
 
 main() {
+  nativeTesting();
   setup();
 
   staticClosure = () => 44;
diff --git a/tests/compiler/dart2js_native/native_constructor_name_test.dart b/tests/compiler/dart2js_native/native_constructor_name_test.dart
index 76a30d7..34e6734c 100644
--- a/tests/compiler/dart2js_native/native_constructor_name_test.dart
+++ b/tests/compiler/dart2js_native/native_constructor_name_test.dart
@@ -8,8 +8,7 @@
 // This could be done by renaming the Dart constructor or by being able to check
 // that objects are Dart classes.
 
-import "dart:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 class A {}
 
@@ -23,9 +22,11 @@
 void setup() native """
 function A(){}
 makeZ = function(){return new A};
+self.nativeConstructor(A);
 """;
 
 main() {
+  nativeTesting();
   setup();
 
   var a = new A();
diff --git a/tests/compiler/dart2js_native/native_equals_frog_test.dart b/tests/compiler/dart2js_native/native_equals_frog_test.dart
index b8868a5..c6913ec 100644
--- a/tests/compiler/dart2js_native/native_equals_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_equals_frog_test.dart
@@ -2,20 +2,35 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import 'native_testing.dart';
 
 @Native("A")
 class A {}
 
+int calls = 0;
+@Native("B")
+class B {
+  bool operator==(other) {
+    ++calls;
+    return other is B;
+  }
+  int get hashCode => 1;
+}
+
 makeA() native ;
+makeB() native ;
 
 void setup() native """
 function A() {}
+function B() {}
 makeA = function(){return new A;};
+makeB = function(){return new B;};
+
+self.nativeConstructor(B);
 """;
 
 main() {
+  nativeTesting();
   setup();
   var a = makeA();
   Expect.isTrue(a == a);
@@ -23,4 +38,13 @@
 
   Expect.isFalse(a == makeA());
   Expect.isFalse(identical(a, makeA()));
+
+  var b = makeB();
+  Expect.isTrue(b == b);
+  Expect.isTrue(identical(b, b));
+
+  Expect.isTrue(b == makeB());
+  Expect.isFalse(identical(b, makeB()));
+
+  Expect.equals(2, calls);
 }
diff --git a/tests/compiler/dart2js_native/native_exception2_test.dart b/tests/compiler/dart2js_native/native_exception2_test.dart
index 44f89fb..916709b 100644
--- a/tests/compiler/dart2js_native/native_exception2_test.dart
+++ b/tests/compiler/dart2js_native/native_exception2_test.dart
@@ -8,19 +8,24 @@
 library native_exception2_test;
 
 import 'native_exception_test.dart' as other;
-import 'dart:_js_helper';
+import 'native_testing.dart';
 
 @Native("NativeClass")
-class NativeClass {}
+class NativeClass {
+  foo() => 'oof';
+}
 
 makeNativeClass() native ;
 
 setup() native """
 function NativeClass() {}
 makeNativeClass = function() { return new NativeClass; }
+self.nativeConstructor(NativeClass);
 """;
 
 main() {
+  nativeTesting();
   setup();
+  Expect.equals('oof', makeNativeClass().foo());
   other.main();
 }
diff --git a/tests/compiler/dart2js_native/native_exception_test.dart b/tests/compiler/dart2js_native/native_exception_test.dart
index 0c2edf5..e3e4a98 100644
--- a/tests/compiler/dart2js_native/native_exception_test.dart
+++ b/tests/compiler/dart2js_native/native_exception_test.dart
@@ -6,9 +6,7 @@
 
 library native_exception_test;
 
-import 'dart:_foreign_helper' show JS;
-import 'dart:_js_helper';
-import 'package:expect/expect.dart';
+import 'native_testing.dart';
 
 main() {
   var previous;
diff --git a/tests/compiler/dart2js_native/native_exceptions1_frog_test.dart b/tests/compiler/dart2js_native/native_exceptions1_frog_test.dart
index a111650..9ab4283 100644
--- a/tests/compiler/dart2js_native/native_exceptions1_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_exceptions1_frog_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import 'native_testing.dart';
 
 // Test that hidden native exception classes can be marked as existing.
 //
@@ -57,11 +56,15 @@
   return  x / 2;
 };
 makeA = function(){return new A};
+
+self.nativeConstructor(E);
+self.nativeConstructor(A);
 """;
 
 int inscrutable(int x) => x == 0 ? 0 : x | inscrutable(x & (x - 1));
 
 main() {
+  nativeTesting();
   setup1();
   setup2();
 
diff --git a/tests/compiler/dart2js_native/native_field_invocation2_test.dart b/tests/compiler/dart2js_native/native_field_invocation2_test.dart
index 290a68f..05e2eab 100644
--- a/tests/compiler/dart2js_native/native_field_invocation2_test.dart
+++ b/tests/compiler/dart2js_native/native_field_invocation2_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 @Native("NNative")
 class NNative {
@@ -11,19 +10,9 @@
 
   var f;
 
-  ClickCounter() {
-    f = wrap(g);
-  }
-
   g(val) => "### $val ###";
 }
 
-nativeId(x) native ;
-
-void setup() native """
-nativeId = function(x) { return x; }
-""";
-
 class ClickCounter {
   var status;
 
@@ -42,6 +31,13 @@
   };
 }
 
+nativeId(x) native ;
+
+void setup() native """
+nativeId = function(x) { return x; }
+""";
+
+
 main() {
   setup();
   // Make sure the ClickCounter class goes through interceptors.
diff --git a/tests/compiler/dart2js_native/native_field_invocation3_test.dart b/tests/compiler/dart2js_native/native_field_invocation3_test.dart
index 0944f17..18390cd 100644
--- a/tests/compiler/dart2js_native/native_field_invocation3_test.dart
+++ b/tests/compiler/dart2js_native/native_field_invocation3_test.dart
@@ -2,14 +2,14 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 makeCC() native ;
 
 void setup() native """
 function CC() {}
 makeCC = function() { return new CC; }
+self.nativeConstructor(CC);
 """;
 
 @Native("CC")
@@ -32,6 +32,7 @@
 }
 
 main() {
+  nativeTesting();
   setup();
   var c = makeCC();
   c.init();
diff --git a/tests/compiler/dart2js_native/native_field_invocation4_test.dart b/tests/compiler/dart2js_native/native_field_invocation4_test.dart
index 18489d5..40f8670 100644
--- a/tests/compiler/dart2js_native/native_field_invocation4_test.dart
+++ b/tests/compiler/dart2js_native/native_field_invocation4_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 @Native("A")
 class A {
@@ -26,8 +25,8 @@
   b.foo = (x) => x + 1;
   b = nativeId(b); // Inferrer doesn't know if A has been instantiated.
   // At this point b could be A or B. The call to "foo" thus needs to go through
-  // an interceptor. Tests that the interceptor doesn't screw with retrieving
-  // the field and invoking the closure.
+  // an interceptor. Tests that the interceptor works for retrieving the field
+  // and invoking the closure.
   // Use a type-check to guarantee that b is a "B".
   if (b is B) {
     Expect.equals(499, b.foo(498));
diff --git a/tests/compiler/dart2js_native/native_field_invocation5_test.dart b/tests/compiler/dart2js_native/native_field_invocation5_test.dart
index abc60aa..5c3ff7b 100644
--- a/tests/compiler/dart2js_native/native_field_invocation5_test.dart
+++ b/tests/compiler/dart2js_native/native_field_invocation5_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 makeCC() native ;
 nativeFirst(x, y) native ;
@@ -12,6 +11,7 @@
 function CC() {}
 makeCC = function() { return new CC; }
 nativeFirst = function(x, y) { return x; }
+self.nativeConstructor(CC);
 """;
 
 class C {
@@ -38,6 +38,7 @@
 }
 
 main() {
+  nativeTesting();
   setup();
   var c = makeCC();
   c.init();
diff --git a/tests/compiler/dart2js_native/native_field_invocation6_test.dart b/tests/compiler/dart2js_native/native_field_invocation6_test.dart
index 3d3b264..ec27608 100644
--- a/tests/compiler/dart2js_native/native_field_invocation6_test.dart
+++ b/tests/compiler/dart2js_native/native_field_invocation6_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 makeA() native ;
 nativeFirst(x, y) native ;
@@ -13,6 +12,7 @@
 
 function A() {}
 makeA = function() { return new A; }
+self.nativeConstructor(A);
 """;
 
 @Native("A")
@@ -39,6 +39,7 @@
 }
 
 main() {
+  nativeTesting();
   setup();
   var a = makeA();
   a.init();
diff --git a/tests/compiler/dart2js_native/native_field_invocation_test.dart b/tests/compiler/dart2js_native/native_field_invocation_test.dart
index df6b9ab..2bfb71d 100644
--- a/tests/compiler/dart2js_native/native_field_invocation_test.dart
+++ b/tests/compiler/dart2js_native/native_field_invocation_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 @Native("A")
 class A {
@@ -26,7 +25,7 @@
   b.foo = (x) => x + 1;
   b = nativeId(b); // Inferrer doesn't know if A has been instantiated.
   // At this point b could be A or B. The call to "foo" thus needs to go through
-  // an interceptor. Tests that the interceptor doesn't screw with retrieving
-  // the field and invoking the closure.
+  // an interceptor. Tests that the interceptor works for retrieving the Dart
+  // class field and invoking the closure.
   Expect.equals(499, b.foo(498));
 }
diff --git a/tests/compiler/dart2js_native/native_field_name_test.dart b/tests/compiler/dart2js_native/native_field_name_test.dart
index b0001a8..6269e4f 100644
--- a/tests/compiler/dart2js_native/native_field_name_test.dart
+++ b/tests/compiler/dart2js_native/native_field_name_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import 'native_testing.dart';
 
 // Check that native fields are not incorrectly renamed.
 
@@ -29,7 +28,7 @@
 
 function A(){
   var a = Object.create(
-      { constructor: { name: 'A'}},
+      { constructor: A },
       { myLongPropertyName: { get: getter,
                               set: setter,
                               configurable: false,
@@ -41,11 +40,14 @@
 }
 
 makeA = function(){return new A;};
+
+self.nativeConstructor(A);
 """;
 
-A makeA() native ;
+/*A*/ makeA() native ;
 
 main() {
+  nativeTesting();
   setup();
   var a = makeA();
   a.myLongPropertyName = 21;
diff --git a/tests/compiler/dart2js_native/native_field_optimization_test.dart b/tests/compiler/dart2js_native/native_field_optimization_test.dart
index a24be43..0210071 100644
--- a/tests/compiler/dart2js_native/native_field_optimization_test.dart
+++ b/tests/compiler/dart2js_native/native_field_optimization_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import 'native_testing.dart';
 
 // Test that compiler is cautious with optimizations on native fields.  The
 // motivation is that DOM properties are getters and setters with arbitrary
@@ -42,6 +41,8 @@
 });
 
 makeFoo = function() { return new Foo() }
+
+self.nativeConstructor(Foo);
 """;
 
 test1() {
@@ -84,6 +85,7 @@
 }
 
 main() {
+  nativeTesting();
   setup();
   (test1)();
   (test2)();
diff --git a/tests/compiler/dart2js_native/native_field_rename_1_frog_test.dart b/tests/compiler/dart2js_native/native_field_rename_1_frog_test.dart
index aaa578b..a18c31c 100644
--- a/tests/compiler/dart2js_native/native_field_rename_1_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_field_rename_1_frog_test.dart
@@ -6,8 +6,7 @@
 // fields.  However, native fields keep their name.  The implication: a getter
 // for the field must be based on the field's name, not the field's jsname.
 
-import "package:expect/expect.dart";
-import 'dart:_js_helper' show Native, JSName;
+import 'native_testing.dart';
 
 @Native("A")
 class A {
@@ -44,13 +43,15 @@
 
 makeA = function(){return new A};
 makeX = function(){return new X};
+
+self.nativeConstructor(A);
+self.nativeConstructor(X);
 """;
 
 testDynamic() {
-  var things = [makeA(), new B(), makeX()];
-  var a = things[0];
-  var b = things[1];
-  var x = things[2];
+  var a = confuse(makeA());
+  var b = confuse(new B());
+  var x = confuse(makeX());
 
   Expect.equals(111, a.key);
   Expect.equals(222, b.key);
@@ -77,6 +78,7 @@
 }
 
 main() {
+  nativeTesting();
   setup();
 
   testTyped();
diff --git a/tests/compiler/dart2js_native/native_field_rename_2_frog_test.dart b/tests/compiler/dart2js_native/native_field_rename_2_frog_test.dart
index cb093cb..1d3cdcc 100644
--- a/tests/compiler/dart2js_native/native_field_rename_2_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_field_rename_2_frog_test.dart
@@ -6,8 +6,7 @@
 // fields.  However, native fields keep their name.  The implication: a getter
 // for the field must be based on the field's name, not the field's jsname.
 
-import "package:expect/expect.dart";
-import 'dart:_js_helper' show Native, JSName;
+import 'native_testing.dart';
 
 abstract class I {
   int key;
@@ -47,13 +46,15 @@
 
 makeA = function(){return new A};
 makeX = function(){return new X};
+
+self.nativeConstructor(A);
+self.nativeConstructor(X);
 """;
 
 testDynamic() {
-  var things = [makeA(), new B(), makeX()];
-  var a = things[0];
-  var b = things[1];
-  var x = things[2];
+  var a = confuse(makeA());
+  var b = confuse(new B());
+  var x = confuse(makeX());
 
   Expect.equals(111, a.key);
   Expect.equals(222, b.key);
@@ -91,6 +92,7 @@
 }
 
 main() {
+  nativeTesting();
   setup();
 
   testTyped();
diff --git a/tests/compiler/dart2js_native/native_library_same_name_used_frog_test.dart b/tests/compiler/dart2js_native/native_library_same_name_used_frog_test.dart
index 9f305f7..e90e9f4 100644
--- a/tests/compiler/dart2js_native/native_library_same_name_used_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_library_same_name_used_frog_test.dart
@@ -6,7 +6,7 @@
 
 library main;
 
-import "package:expect/expect.dart";
+import 'native_testing.dart';
 import 'native_library_same_name_used_lib1.dart';
 
 void setup() native """
@@ -15,6 +15,7 @@
   I.prototype.read = function() { return this._x; };
   I.prototype.write = function(x) { this._x = x; };
   makeI = function(){return new I};
+  self.nativeConstructor(I);
 """;
 
 // A pure Dart implementation of I.
@@ -31,6 +32,7 @@
 }
 
 main() {
+  nativeTesting();
   setup();
 
   var a1 = makeI();
@@ -47,4 +49,7 @@
 
   Expect.isTrue(a1 is I, 'a1 is I');
   Expect.isFalse(a1 is ProxyI, 'a1 is ProxyI');
+
+  Expect.isTrue(confuse(a1) is I, 'a1 is I');
+  Expect.isFalse(confuse(a1) is ProxyI, 'a1 is ProxyI');
 }
diff --git a/tests/compiler/dart2js_native/native_method_inlining_test.dart b/tests/compiler/dart2js_native/native_method_inlining_test.dart
index dce81ec..07a0620 100644
--- a/tests/compiler/dart2js_native/native_method_inlining_test.dart
+++ b/tests/compiler/dart2js_native/native_method_inlining_test.dart
@@ -5,8 +5,7 @@
 // Test that native methods with unnamed optional arguments are called with the
 // number of arguments in the call site AND the call site is inlined.
 
-import "package:expect/expect.dart";
-import 'dart:_js_helper' show Native, NoInline;
+import 'native_testing.dart';
 
 typedef int Int2Int(int x);
 
@@ -71,6 +70,8 @@
     if (s.indexOf(string)>0) return s;
   }
 };
+
+self.nativeConstructor(A);
 """;
 
 bool get isCheckedMode {
@@ -148,6 +149,7 @@
 }
 
 main() {
+  nativeTesting();
   setup();
   test1();
   test2();
diff --git a/tests/compiler/dart2js_native/native_method_rename1_frog_test.dart b/tests/compiler/dart2js_native/native_method_rename1_frog_test.dart
index e38cd28..4d8ead2 100644
--- a/tests/compiler/dart2js_native/native_method_rename1_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_method_rename1_frog_test.dart
@@ -4,7 +4,7 @@
 
 // Test the feature where the native string declares the native method's name.
 
-import "package:expect/expect.dart";
+import 'native_testing.dart';
 import 'dart:_js_helper' show Native, JSName;
 
 @Native("A")
@@ -34,14 +34,13 @@
 A.prototype.bazA = function(){return 300;};
 
 makeA = function(){return new A};
+
+self.nativeConstructor(A);
 """;
 
 testDynamic() {
-  setup();
-
-  var things = [makeA(), new B()];
-  var a = things[0];
-  var b = things[1];
+  var a = confuse(makeA());
+  var b = confuse(new B());
 
   Expect.equals(100, a.foo());
   Expect.equals(200, a.bar());
@@ -62,6 +61,7 @@
 }
 
 main() {
+  nativeTesting();
   setup();
   testDynamic();
   testTyped();
diff --git a/tests/compiler/dart2js_native/native_method_rename2_frog_test.dart b/tests/compiler/dart2js_native/native_method_rename2_frog_test.dart
index e375f2f..5979e1e 100644
--- a/tests/compiler/dart2js_native/native_method_rename2_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_method_rename2_frog_test.dart
@@ -4,8 +4,7 @@
 
 // Test the feature where the native string declares the native method's name.
 
-import "package:expect/expect.dart";
-import 'dart:_js_helper' show Native, JSName;
+import "native_testing.dart";
 
 @Native("A")
 class A {
@@ -42,6 +41,9 @@
 
 makeA = function(){return new A};
 makeB = function(){return new B};
+
+self.nativeConstructor(A);
+self.nativeConstructor(B);
 """;
 
 testDynamic() {
@@ -76,6 +78,7 @@
 }
 
 main() {
+  nativeTesting();
   setup();
 
   testDynamic();
diff --git a/tests/compiler/dart2js_native/native_method_rename3_frog_test.dart b/tests/compiler/dart2js_native/native_method_rename3_frog_test.dart
index fcfd40b..014e669 100644
--- a/tests/compiler/dart2js_native/native_method_rename3_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_method_rename3_frog_test.dart
@@ -5,8 +5,7 @@
 // Test the feature where the native string declares the native method's name.
 // #3. The name does not get
 
-import "package:expect/expect.dart";
-import 'dart:_js_helper' show Native, JSName;
+import 'native_testing.dart';
 
 @Native("A")
 class A {
@@ -49,13 +48,15 @@
 
 makeA = function(){return new A};
 makeB = function(){return new B};
+
+self.nativeConstructor(A);
+self.nativeConstructor(B);
 """;
 
 testDynamic() {
-  var things = [makeA(), makeB(), new Decoy()];
-  var a = things[0];
-  var b = things[1];
-  var d = things[2];
+  var a = confuse(makeA());
+  var b = confuse(makeB());
+  var d = confuse(new Decoy());
 
   Expect.equals(100, a.foo());
   Expect.equals(200, b.foo());
@@ -87,6 +88,7 @@
 }
 
 main() {
+  nativeTesting();
   setup();
 
   testDynamic();
diff --git a/tests/compiler/dart2js_native/native_method_with_keyword_name_test.dart b/tests/compiler/dart2js_native/native_method_with_keyword_name_test.dart
index cb16ab1..d35c1c7 100644
--- a/tests/compiler/dart2js_native/native_method_with_keyword_name_test.dart
+++ b/tests/compiler/dart2js_native/native_method_with_keyword_name_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import 'native_testing.dart';
 
 // Make sure we can have a native with a name that is a JavaScript keyword.
 
@@ -19,13 +18,15 @@
 A.prototype.delete = function() { return 87; };
 
 makeA = function(){return new A;};
+self.nativeConstructor(A);
 """;
 
 main() {
+  nativeTesting();
   setup();
 
-  var a = makeA();
-  Expect.equals(87, a.delete());
-  A aa = a;
-  Expect.equals(87, aa.delete());
+  var a1 = confuse(makeA());
+  Expect.equals(87, a1.delete());
+  A a2 = makeA();
+  Expect.equals(87, a2.delete());
 }
diff --git a/tests/compiler/dart2js_native/native_mirror_test.dart b/tests/compiler/dart2js_native/native_mirror_test.dart
index 58e8ffe..99551c6 100644
--- a/tests/compiler/dart2js_native/native_mirror_test.dart
+++ b/tests/compiler/dart2js_native/native_mirror_test.dart
@@ -9,9 +9,9 @@
 // calling-convention for parts of the compiler, and the non-intercepted
 // convention for others, making this fail.
 
-import "package:expect/expect.dart";
-import "dart:_js_helper";
-import "dart:mirrors";
+import 'native_testing.dart';
+import 'dart:_js_helper';
+import 'dart:mirrors';
 
 @Native("A")
 class A {
diff --git a/tests/compiler/dart2js_native/native_missing_method1_frog_test.dart b/tests/compiler/dart2js_native/native_missing_method1_frog_test.dart
index a6c0e077..6223080 100644
--- a/tests/compiler/dart2js_native/native_missing_method1_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_missing_method1_frog_test.dart
@@ -2,47 +2,50 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import 'native_testing.dart';
 
 @Native("A")
 class A {}
 
-makeA() native ;
+A makeA() native ;
 
 void setup() native """
 function A() {};
-A.prototype.foo = function() { return  42; }
+A.prototype.foo = function() { return  99; }
 makeA = function() { return new A; }
+self.nativeConstructor(A);
 """;
 
 class B {
-  // We need to define a foo method so that Frog sees it. Because it's
-  // the only occurence of 'foo', Frog does not bother mangling the
-  // call sites. It thinks all calls will either go to this method, or
-  // throw a NoSuchMethodError.
+  // We need to define a foo method so that dart2js sees it. Because the the
+  // only occurences of 'foo' is on B, a Dart class, no interceptor is used.  It
+  // thinks all calls will either go to this method, or throw a
+  // NoSuchMethodError. It is possible that the native class will shadow a
+  // method, but it will not shadow 'foo' because the name is either 'mangled'
+  // with the arity, or minified.
   foo() {
     return 42;
   }
 }
 
 typedContext() {
-  var things = [makeA(), new B()];
-  A a = things[0];
+  confuse(new B()).foo();
+  A a = makeA();
   Expect.throws(() => a.foo(), (e) => e is NoSuchMethodError);
   Expect.throws(() => a.foo, (e) => e is NoSuchMethodError);
   Expect.throws(() => a.foo = 4, (e) => e is NoSuchMethodError);
 }
 
 untypedContext() {
-  var things = [makeA(), new B()];
-  var a = things[0];
+  confuse(new B()).foo();
+  var a = confuse(makeA());
   Expect.throws(() => a.foo(), (e) => e is NoSuchMethodError);
   Expect.throws(() => a.foo, (e) => e is NoSuchMethodError);
   Expect.throws(() => a.foo = 4, (e) => e is NoSuchMethodError);
 }
 
 main() {
+  nativeTesting();
   setup();
   typedContext();
   untypedContext();
diff --git a/tests/compiler/dart2js_native/native_missing_method2_frog_test.dart b/tests/compiler/dart2js_native/native_missing_method2_frog_test.dart
index 0a7b1f4..2baba11 100644
--- a/tests/compiler/dart2js_native/native_missing_method2_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_missing_method2_frog_test.dart
@@ -2,18 +2,17 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
-
+import 'native_testing.dart';
 @Native("A")
 class A {}
 
-makeA() native ;
+A makeA() native ;
 
 void setup() native """
 function A() {};
 A.prototype.foo = function() { return  42; }
 makeA = function() { return new A; }
+self.nativeConstructor(A);
 """;
 
 class B {
@@ -31,23 +30,24 @@
 }
 
 typedContext() {
-  var things = [makeA(), new B()];
-  A a = things[0];
+  A a = makeA();
   Expect.throws(() => a.foo(), (e) => e is NoSuchMethodError);
   Expect.throws(() => a.foo, (e) => e is NoSuchMethodError);
   Expect.throws(() => a.foo = 4, (e) => e is NoSuchMethodError);
 }
 
 untypedContext() {
-  var things = [makeA(), new B()];
-  var a = things[0];
+  var a = confuse(makeA());
   Expect.throws(() => a.foo(), (e) => e is NoSuchMethodError);
   Expect.throws(() => a.foo, (e) => e is NoSuchMethodError);
   Expect.throws(() => a.foo = 4, (e) => e is NoSuchMethodError);
 }
 
 main() {
+  nativeTesting();
   setup();
+  confuse(new B()).foo();
+  confuse(new C()).foo(1);
   typedContext();
   untypedContext();
 }
diff --git a/tests/compiler/dart2js_native/native_mixin_field_test.dart b/tests/compiler/dart2js_native/native_mixin_field_test.dart
index 87688c5..5cf736b 100644
--- a/tests/compiler/dart2js_native/native_mixin_field_test.dart
+++ b/tests/compiler/dart2js_native/native_mixin_field_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 // Test that native classes can use ordinary Dart classes with fields
 // as mixins.
@@ -35,9 +34,14 @@
 function B() {A.call(this);this.bar='B-bar';this.baz='M1-baz';}
 makeA = function(){return new A;};
 makeB = function(){return new B;};
+
+self.nativeConstructor(A);
+self.nativeConstructor(B);
 """;
 
+
 main() {
+  nativeTesting();
   setup();
   A a = makeA();
   Expect.equals("A-foo", a.foo);
diff --git a/tests/compiler/dart2js_native/native_mixin_multiple2_test.dart b/tests/compiler/dart2js_native/native_mixin_multiple2_test.dart
index e3196e1..2fb2b2b 100644
--- a/tests/compiler/dart2js_native/native_mixin_multiple2_test.dart
+++ b/tests/compiler/dart2js_native/native_mixin_multiple2_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 // Test that native classes can access methods defined only by mixins.
 
@@ -30,9 +29,12 @@
 void setup() native """
 function B() {}
 makeB = function(){return new B;};
+
+self.nativeConstructor(B);
 """;
 
 main() {
+  nativeTesting();
   setup();
 
   B b = makeB();
diff --git a/tests/compiler/dart2js_native/native_mixin_multiple3_test.dart b/tests/compiler/dart2js_native/native_mixin_multiple3_test.dart
index 3b8875c..ccbdd0c 100644
--- a/tests/compiler/dart2js_native/native_mixin_multiple3_test.dart
+++ b/tests/compiler/dart2js_native/native_mixin_multiple3_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 // Test that native classes and plain classes can access methods defined only by
 // the same mixin.
@@ -46,6 +45,10 @@
 makeA = function(){return new A;};
 makeB = function(){return new B;};
 makeC = function(){return new C;};
+
+self.nativeConstructor(A);
+self.nativeConstructor(B);
+self.nativeConstructor(C);
 """;
 
 var g;
@@ -62,6 +65,7 @@
 makeAll() => [makeA(), makeB(), makeC(), new D(), new E()];
 
 main() {
+  nativeTesting();
   setup();
   /*
   var a = makeA();
diff --git a/tests/compiler/dart2js_native/native_mixin_multiple_test.dart b/tests/compiler/dart2js_native/native_mixin_multiple_test.dart
index 0e43179..b8167bc 100644
--- a/tests/compiler/dart2js_native/native_mixin_multiple_test.dart
+++ b/tests/compiler/dart2js_native/native_mixin_multiple_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 // Test that native classes can use ordinary Dart classes as mixins.
 
@@ -35,9 +34,13 @@
 function B() {}
 makeA = function(){return new A;};
 makeB = function(){return new B;};
+
+self.nativeConstructor(A);
+self.nativeConstructor(B);
 """;
 
 main() {
+  nativeTesting();
   setup();
   A a = makeA();
   Expect.equals("A-foo", a.foo());
diff --git a/tests/compiler/dart2js_native/native_mixin_test.dart b/tests/compiler/dart2js_native/native_mixin_test.dart
index 667da82..a0ab15b 100644
--- a/tests/compiler/dart2js_native/native_mixin_test.dart
+++ b/tests/compiler/dart2js_native/native_mixin_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 // Test that native classes can use ordinary Dart classes as mixins.
 
@@ -31,9 +30,13 @@
 function B() {}
 makeA = function(){return new A;};
 makeB = function(){return new B;};
+
+self.nativeConstructor(A);
+self.nativeConstructor(B);
 """;
 
 main() {
+  nativeTesting();
   setup();
   A a = makeA();
   Expect.equals("A-foo", a.foo());
diff --git a/tests/compiler/dart2js_native/native_mixin_with_plain_test.dart b/tests/compiler/dart2js_native/native_mixin_with_plain_test.dart
index 92377a1..5311c32 100644
--- a/tests/compiler/dart2js_native/native_mixin_with_plain_test.dart
+++ b/tests/compiler/dart2js_native/native_mixin_with_plain_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 // Test that native classes and ordinary Dart classes can both use the same
 // ordinary Dart classes as a mixin.
@@ -46,9 +45,13 @@
 function B() {this.aa = 'bb'}
 makeA = function(){return new A;};
 makeB = function(){return new B;};
+
+self.nativeConstructor(A);
+self.nativeConstructor(B);
 """;
 
 main() {
+  nativeTesting();
   setup();
   var things = [makeA, makeB, () => new C(), () => new D(), () => new M()]
       .map((f) => f())
diff --git a/tests/compiler/dart2js_native/native_named_constructors2_frog_test.dart b/tests/compiler/dart2js_native/native_named_constructors2_frog_test.dart
index 9553be5..ef9429a 100644
--- a/tests/compiler/dart2js_native/native_named_constructors2_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_named_constructors2_frog_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 // Native class with named constructors and static methods.
 
@@ -30,9 +29,11 @@
 function A(arg) { this._x = arg; }
 A.prototype.foo = function() { return this._x; };
 makeA = function(arg) { return new A(arg); }
+self.nativeConstructor(A);
 """;
 
 main() {
+  nativeTesting();
   setup();
   var a1 = new A(100);
   var a2 = new A.fromString('Hello');
diff --git a/tests/compiler/dart2js_native/native_named_constructors3_frog_test.dart b/tests/compiler/dart2js_native/native_named_constructors3_frog_test.dart
index dcc89fa..390835c 100644
--- a/tests/compiler/dart2js_native/native_named_constructors3_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_named_constructors3_frog_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 // Hidden native class with factory constructors and NO static methods.
 // Regression test.
@@ -29,9 +28,11 @@
 function A(arg) { this._x = arg; }
 A.prototype.foo = function(){ return this._x; }
 makeA = function(arg) { return new A(arg); }
+self.nativeConstructor(A);
 """;
 
 main() {
+  nativeTesting();
   setup();
   var a1 = new A(100);
   var a2 = new A.fromString('Hello');
diff --git a/tests/compiler/dart2js_native/native_no_such_method_exception2_frog_test.dart b/tests/compiler/dart2js_native/native_no_such_method_exception2_frog_test.dart
index 42a6bda..369b3d9 100644
--- a/tests/compiler/dart2js_native/native_no_such_method_exception2_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_no_such_method_exception2_frog_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 @Native("A")
 class A {}
@@ -33,9 +32,13 @@
   makeA = function() { return new A; }
   makeB = function() { return new B; }
   B.prototype.foo = function() { return 42; }
+
+  self.nativeConstructor(A);
+  self.nativeConstructor(B);
 """;
 
 main() {
+  nativeTesting();
   setup();
   var a = makeA();
   var exception;
diff --git a/tests/compiler/dart2js_native/native_no_such_method_exception3_frog_test.dart b/tests/compiler/dart2js_native/native_no_such_method_exception3_frog_test.dart
index ca125cb..367cb2a 100644
--- a/tests/compiler/dart2js_native/native_no_such_method_exception3_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_no_such_method_exception3_frog_test.dart
@@ -3,8 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import "dart:mirrors" show reflect;
-import "dart:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 class GetName {
   foo(x, y, [z]) => "foo";
@@ -32,9 +31,12 @@
 setup() native """
   function A() {}
   makeA = function() { return new A; }
+
+  self.nativeConstructor(A);
 """;
 
 main() {
+  nativeTesting();
   setup();
   var a = makeA();
   a.bar();
diff --git a/tests/compiler/dart2js_native/native_no_such_method_exception4_frog_test.dart b/tests/compiler/dart2js_native/native_no_such_method_exception4_frog_test.dart
index 3bf26fd..6d3f866 100644
--- a/tests/compiler/dart2js_native/native_no_such_method_exception4_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_no_such_method_exception4_frog_test.dart
@@ -3,8 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import "dart:mirrors" show reflect;
-import "dart:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 class GetName {
   foo(x, y) => "foo";
@@ -29,9 +28,11 @@
 setup() native """
   function A() {}
   makeA = function() { return new A; }
+  self.nativeConstructor(A);
 """;
 
 main() {
+  nativeTesting();
   setup();
   var a = makeA();
   a.bar();
diff --git a/tests/compiler/dart2js_native/native_no_such_method_exception5_frog_test.dart b/tests/compiler/dart2js_native/native_no_such_method_exception5_frog_test.dart
index 141ab49..0d744c9 100644
--- a/tests/compiler/dart2js_native/native_no_such_method_exception5_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_no_such_method_exception5_frog_test.dart
@@ -3,8 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import "dart:mirrors" show reflect;
-import "dart:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 class GetName {
   foo(x, [y]) => "foo";
@@ -34,9 +33,11 @@
 setup() native """
   function A() {}
   makeA = function() { return new A; }
+  self.nativeConstructor(A);
 """;
 
 main() {
+  nativeTesting();
   setup();
   var a = makeA();
   a.bar();
diff --git a/tests/compiler/dart2js_native/native_no_such_method_exception_frog_test.dart b/tests/compiler/dart2js_native/native_no_such_method_exception_frog_test.dart
index f578e89..9aaa100 100644
--- a/tests/compiler/dart2js_native/native_no_such_method_exception_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_no_such_method_exception_frog_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 @Native("A")
 class A {
@@ -20,9 +19,11 @@
 setup() native """
   function A() {}
   makeA = function() { return new A; }
+  self.nativeConstructor(A);
 """;
 
 main() {
+  nativeTesting();
   setup();
   var a = makeA();
   a.bar();
diff --git a/tests/compiler/dart2js_native/native_novel_html_test.dart b/tests/compiler/dart2js_native/native_novel_html_test.dart
index e03589e..01b5099 100644
--- a/tests/compiler/dart2js_native/native_novel_html_test.dart
+++ b/tests/compiler/dart2js_native/native_novel_html_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import 'native_testing.dart';
 
 // Test to see if novel HTML tags are interpreted as HTMLElement.
 
@@ -31,15 +30,11 @@
 };
 makeF = function(){return new HTMLFakeyElement};
 
-// Make the HTMLGoofyElement look like a real host object.
-var theRealObjectToString = Object.prototype.toString;
-Object.prototype.toString = function() {
-  if (this instanceof HTMLGoofyElement) return '[object HTMLGoofyElement]';
-  return theRealObjectToString.call(this);
-}
+self.nativeConstructor(HTMLGoofyElement);
 """;
 
 main() {
+  nativeTesting();
   setup();
 
   var e = makeE();
diff --git a/tests/compiler/dart2js_native/native_null_closure_frog_test.dart b/tests/compiler/dart2js_native/native_null_closure_frog_test.dart
index ec6f8d5..7f19e1e 100644
--- a/tests/compiler/dart2js_native/native_null_closure_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_null_closure_frog_test.dart
@@ -4,9 +4,7 @@
 
 // Test that exception unwrapping handle cases like ({foo:null}).foo().
 
-import "dart:_js_helper";
-
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 typedef void MyFunctionType();
 
@@ -25,9 +23,12 @@
 A.prototype.check = function(f) { return this.f === f; };
 A.prototype.invoke = function() { return this.f(); };
 makeA = function(){return new A;};
+
+self.nativeConstructor(A);
 """;
 
 main() {
+  nativeTesting();
   setup();
   A a = makeA();
   a.setClosure(null);
@@ -35,7 +36,7 @@
   bool caughtException = false;
   try {
     a.invoke();
-  } on JsNoSuchMethodError catch (e) {
+  } on NoSuchMethodError catch (e) {
     print(e);
     caughtException = true;
   }
diff --git a/tests/compiler/dart2js_native/native_null_frog_test.dart b/tests/compiler/dart2js_native/native_null_frog_test.dart
index d554a52..9bd08eb 100644
--- a/tests/compiler/dart2js_native/native_null_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_null_frog_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 // Test for values of some basic types.
 
@@ -24,10 +23,11 @@
 A.prototype.returnEmptyString = function() { return ""; };
 A.prototype.returnZero = function() { return 0; };
 makeA = function(){return new A;};
+self.nativeConstructor(A);
 """;
 
-main() {
-  setup();
+@NoInline()
+staticTests() {
   A a = makeA();
   Expect.equals(null, a.returnNull());
   Expect.equals(null, a.returnUndefined());
@@ -39,3 +39,24 @@
   Expect.isTrue(a.returnZero() is int);
   Expect.equals(0, a.returnZero());
 }
+
+@NoInline()
+dynamicTests() {
+  A a = makeA();
+  Expect.equals(null, confuse(a).returnNull());
+  Expect.equals(null, confuse(a).returnUndefined());
+
+  Expect.equals('', confuse(a).returnEmptyString());
+  Expect.isTrue(confuse(a).returnEmptyString().isEmpty);
+  Expect.isTrue(confuse(a).returnEmptyString() is String);
+
+  Expect.isTrue(confuse(a).returnZero() is int);
+  Expect.equals(0, confuse(a).returnZero());
+}
+
+main() {
+  nativeTesting();
+  setup();
+  staticTests();
+  dynamicTests();
+}
diff --git a/tests/compiler/dart2js_native/native_property_frog_test.dart b/tests/compiler/dart2js_native/native_property_frog_test.dart
index a897596..ae68f6e 100644
--- a/tests/compiler/dart2js_native/native_property_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_property_frog_test.dart
@@ -4,9 +4,7 @@
 
 // Properties on hidden native classes.
 
-import "package:expect/expect.dart";
-import "dart:_js_helper";
-import 'dart:_foreign_helper' show JS;
+import 'native_testing.dart';
 
 @Native("A")
 class A {
@@ -36,10 +34,13 @@
 });
 
 makeA = function(){return new A;};
+
+self.nativeConstructor(A);
 """;
 
 
 main() {
+  nativeTesting();
   setup();
 
   var a = makeA();
@@ -54,4 +55,11 @@
   Expect.equals(10, a.X);
   Expect.equals(20, a.Y);
   Expect.equals(30, a.Z);
+
+  confuse(a).setX(6);
+  Expect.equals(6, confuse(a).getX());
+
+  Expect.equals(6, confuse(a).X);
+  Expect.equals(20, confuse(a).Y);
+  Expect.equals(30, confuse(a).Z);
 }
diff --git a/tests/compiler/dart2js_native/native_testing.dart b/tests/compiler/dart2js_native/native_testing.dart
new file mode 100644
index 0000000..8d90b0b
--- /dev/null
+++ b/tests/compiler/dart2js_native/native_testing.dart
@@ -0,0 +1,50 @@
+// Copyright (c) 2016, 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.
+
+// Native testing library. Provides support for mock @Native classes and
+// collects common imports.
+
+
+import "package:expect/expect.dart";
+import 'dart:_js_helper' show Native;
+
+export "package:expect/expect.dart";
+export 'dart:_js_helper' show Creates, Native, JSName, Returns;
+export 'dart:_foreign_helper' show JS;
+
+void _setup() native r'''
+((function() {
+  var toStringResultProperty = "_toStringResult";
+  var objectToStringMethod = Object.prototype.toString;
+
+  Object.prototype.toString = function() {
+    if (this != null) {
+      var constructor = this.constructor;
+      if (constructor != null) {
+        var result = constructor[toStringResultProperty];
+        if (typeof result == "string") return result;
+      }
+    }
+    return objectToStringMethod.call(this);
+  }
+
+  // To mock a @Native class with JavaScript constructor `Foo`, add
+  //
+  //     self.nativeConstructor(Foo);
+  //
+  // to the JavaScript code.
+  self.nativeConstructor = function(constructor, opt_name) {
+    var toStringResult = "[object " + (opt_name || constructor.name) + "]";
+    constructor[toStringResultProperty] = toStringResult;
+  }
+})());
+''';
+
+void nativeTesting() {
+  _setup();
+}
+
+@NoInline()
+@AssumeDynamic()
+confuse(x) => x;
diff --git a/tests/compiler/dart2js_native/native_to_string_frog_test.dart b/tests/compiler/dart2js_native/native_to_string_frog_test.dart
index cff3ac4..1eaffb7 100644
--- a/tests/compiler/dart2js_native/native_to_string_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_to_string_frog_test.dart
@@ -2,20 +2,28 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import 'native_testing.dart';
 
 @Native("A")
-class A {}
+class A {
+  toString() => 'AAA';
+}
 
 makeA() native ;
 
 void setup() native """
 function A() {}
 makeA = function(){return new A;};
+self.nativeConstructor(A);
 """;
 
 main() {
+  nativeTesting();
   setup();
+
   Expect.isTrue(makeA().toString() is String);
+  Expect.equals('AAA', makeA().toString());
+
+  Expect.isTrue(confuse(makeA()).toString() is String);
+  Expect.equals('AAA', confuse(makeA()).toString());
 }
diff --git a/tests/compiler/dart2js_native/native_use_native_name_in_table_frog_test.dart b/tests/compiler/dart2js_native/native_use_native_name_in_table_frog_test.dart
index 712d173..604cfa1 100644
--- a/tests/compiler/dart2js_native/native_use_native_name_in_table_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_use_native_name_in_table_frog_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import 'native_testing.dart';
 
 // Test that we put native names and not Dart names into the dynamic
 // dispatch table.
@@ -37,18 +36,18 @@
 
 makeA = function(){return new NativeA;};
 makeB = function(){return new NativeB;};
+
+self.nativeConstructor(NativeA);
+self.nativeConstructor(NativeB);
 """;
 
 main() {
+  nativeTesting();
   setup();
 
-  var a = makeA();
-  Expect.equals(42, a.foo());
-  A aa = a;
-  Expect.equals(42, aa.foo());
+  Expect.equals(42, makeA().foo());
+  Expect.equals(42, confuse(makeA()).foo());
 
-  var b = makeB();
-  Expect.equals(42, b.foo());
-  B bb = b;
-  Expect.equals(42, bb.foo());
+  Expect.equals(42, makeB().foo());
+  Expect.equals(42, confuse(makeB()).foo());
 }
diff --git a/tests/compiler/dart2js_native/native_window1_frog_test.dart b/tests/compiler/dart2js_native/native_window1_frog_test.dart
index 80c56cb..fd18641 100644
--- a/tests/compiler/dart2js_native/native_window1_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_window1_frog_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 abstract class Window {
   final int document;
@@ -19,6 +18,7 @@
 class Win implements Window {}
 
 main() {
+  nativeTesting();
   // By typing this variable to 'Window', Frog will optimize calls on
   // it.
   Window win = new Win();
diff --git a/tests/compiler/dart2js_native/native_window2_frog_test.dart b/tests/compiler/dart2js_native/native_window2_frog_test.dart
index d523667..77846c3 100644
--- a/tests/compiler/dart2js_native/native_window2_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_window2_frog_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 abstract class Window {
   final int document;
@@ -19,6 +18,7 @@
 class Win implements Window {}
 
 main() {
+  nativeTesting();
   // By not typing the variable, Frog does not try to optimize calls
   // on it.
   var win = new Win();
diff --git a/tests/compiler/dart2js_native/native_wrapping_function3_frog_test.dart b/tests/compiler/dart2js_native/native_wrapping_function3_frog_test.dart
index 4e82838..a331521 100644
--- a/tests/compiler/dart2js_native/native_wrapping_function3_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_wrapping_function3_frog_test.dart
@@ -2,8 +2,7 @@
 // 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";
-import "dart:_js_helper";
+import "native_testing.dart";
 
 typedef void Callback0();
 typedef void Callback1(arg1);
@@ -15,7 +14,7 @@
   foo2(Callback2 closure, [arg1 = 0, arg2 = 1]) native ;
 }
 
-makeA() native ;
+A makeA() native ;
 
 void setup() native """
 function A() {}
@@ -24,21 +23,24 @@
   return closure(arg1, arg2);
 };
 makeA = function(){return new A;};
+self.nativeConstructor(A);
 """;
 
 main() {
+  nativeTesting();
   setup();
   var a = makeA();
+  // Statically known receiver type calls.
   Expect.equals(43, a.foo1((arg1) => arg1, 43));
   Expect.equals(0, a.foo1((arg1) => arg1));
 
   Expect.equals(44, a.foo2((arg1, arg2) => arg1 + arg2, 21, 23));
   Expect.equals(22, a.foo2((arg1, arg2) => arg1 + arg2, 21));
 
-  A aa = a;
-  Expect.equals(43, aa.foo1((arg1) => arg1, 43));
-  Expect.equals(0, aa.foo1((arg1) => arg1));
+  // Dynamic calls.
+  Expect.equals(43, confuse(a).foo1((arg1) => arg1, 43));
+  Expect.equals(0, confuse(a).foo1((arg1) => arg1));
 
-  Expect.equals(44, aa.foo2((arg1, arg2) => arg1 + arg2, 21, 23));
-  Expect.equals(22, aa.foo2((arg1, arg2) => arg1 + arg2, 21));
+  Expect.equals(44, confuse(a).foo2((arg1, arg2) => arg1 + arg2, 21, 23));
+  Expect.equals(22, confuse(a).foo2((arg1, arg2) => arg1 + arg2, 21));
 }
diff --git a/tests/compiler/dart2js_native/native_wrapping_function_frog_test.dart b/tests/compiler/dart2js_native/native_wrapping_function_frog_test.dart
index e57daf6..51597dd 100644
--- a/tests/compiler/dart2js_native/native_wrapping_function_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_wrapping_function_frog_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 typedef void Callback0();
 typedef void Callback1(arg1);
@@ -26,9 +25,11 @@
   return closure(arg1, arg2);
 };
 makeA = function(){return new A;};
+self.nativeConstructor(A);
 """;
 
 main() {
+  nativeTesting();
   setup();
   var a = makeA();
   Expect.equals(42, a.foo0(() => 42));
diff --git a/tests/compiler/dart2js_native/oddly_named_fields_test.dart b/tests/compiler/dart2js_native/oddly_named_fields_test.dart
index 9561a58..23b244e 100644
--- a/tests/compiler/dart2js_native/oddly_named_fields_test.dart
+++ b/tests/compiler/dart2js_native/oddly_named_fields_test.dart
@@ -2,7 +2,7 @@
 // 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:_js_helper';
+import 'native_testing.dart';
 
 // JavaScript reserved words:
 //
@@ -1384,9 +1384,11 @@
 setup() native """
 function NativeClassWithOddNames() {}
 makeNativeClassWithOddNames = function() { return new NativeClassWithOddNames; }
+self.nativeConstructor(NativeClassWithOddNames);
 """;
 
 main() {
+  nativeTesting();
   setup();
   var object = makeNativeClassWithOddNames();
   object.testMyFields();
diff --git a/tests/compiler/dart2js_native/runtimetype_test.dart b/tests/compiler/dart2js_native/runtimetype_test.dart
index 4667eca..babdc11 100644
--- a/tests/compiler/dart2js_native/runtimetype_test.dart
+++ b/tests/compiler/dart2js_native/runtimetype_test.dart
@@ -2,9 +2,7 @@
 // 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";
-import "dart:_js_helper";
-import 'dart:_foreign_helper' show JS;
+import 'native_testing.dart';
 
 // Test to see runtimeType works on native classes and does not use the native
 // constructor name.
@@ -33,6 +31,9 @@
 
 makeA = function(){return new TAGX};
 makeB = function(){return new TAGY};
+
+self.nativeConstructor(TAGX);
+self.nativeConstructor(TAGY);
 """;
 
 testDynamicContext() {
@@ -58,6 +59,7 @@
 }
 
 main() {
+  nativeTesting();
   setup();
 
   testDynamicContext();
diff --git a/tests/compiler/dart2js_native/static_methods_test.dart b/tests/compiler/dart2js_native/static_methods_test.dart
index f1cfd44..c646bfd 100644
--- a/tests/compiler/dart2js_native/static_methods_test.dart
+++ b/tests/compiler/dart2js_native/static_methods_test.dart
@@ -7,8 +7,8 @@
 //   identifier @JSName -> use @Native tag as 'scope' for @JSName.
 //   other @JSName -> use @JSName as an expression.
 
-import "package:expect/expect.dart";
-import 'dart:_js_helper' show Native, JSName, convertDartClosureToJS;
+import 'native_testing.dart';
+import 'dart:_js_helper' show convertDartClosureToJS;
 
 typedef int Callback(String s);
 
@@ -51,6 +51,7 @@
 """;
 
 main() {
+  nativeTesting();
   setup();
 
   // TODO(sra): Investigate why this line is necessary to get a correctly
diff --git a/tests/compiler/dart2js_native/subclassing_1_test.dart b/tests/compiler/dart2js_native/subclassing_1_test.dart
index 77ca191..69a2aa9 100644
--- a/tests/compiler/dart2js_native/subclassing_1_test.dart
+++ b/tests/compiler/dart2js_native/subclassing_1_test.dart
@@ -2,8 +2,8 @@
 // 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";
-import 'dart:_js_helper' show Native, Creates, setNativeSubclassDispatchRecord;
+import "native_testing.dart";
+import 'dart:_js_helper' show setNativeSubclassDispatchRecord;
 import 'dart:_interceptors' show findInterceptorForType;
 
 // Test that subclasses of native classes can be defined by setting the dispatch
@@ -43,6 +43,7 @@
 """;
 
 main() {
+  nativeTesting();
   setup();
 
   setNativeSubclassDispatchRecord(getBPrototype(), findInterceptorForType(B));
diff --git a/tests/compiler/dart2js_native/subclassing_2_test.dart b/tests/compiler/dart2js_native/subclassing_2_test.dart
index 4b9785c..a6b8bb3 100644
--- a/tests/compiler/dart2js_native/subclassing_2_test.dart
+++ b/tests/compiler/dart2js_native/subclassing_2_test.dart
@@ -2,8 +2,8 @@
 // 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";
-import 'dart:_js_helper' show Native, Creates, setNativeSubclassDispatchRecord;
+import 'native_testing.dart';
+import 'dart:_js_helper' show setNativeSubclassDispatchRecord;
 import 'dart:_interceptors' show findInterceptorForType;
 
 // Test calling convention of methods introduced on subclasses of native
@@ -37,6 +37,7 @@
 """;
 
 main() {
+  nativeTesting();
   setup();
 
   setNativeSubclassDispatchRecord(getBPrototype(), findInterceptorForType(B));
diff --git a/tests/compiler/dart2js_native/subclassing_3_test.dart b/tests/compiler/dart2js_native/subclassing_3_test.dart
index 890f556..528104d 100644
--- a/tests/compiler/dart2js_native/subclassing_3_test.dart
+++ b/tests/compiler/dart2js_native/subclassing_3_test.dart
@@ -2,8 +2,8 @@
 // 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";
-import 'dart:_js_helper' show Native, Creates, setNativeSubclassDispatchRecord;
+import 'native_testing.dart';
+import 'dart:_js_helper' show setNativeSubclassDispatchRecord;
 import 'dart:_interceptors' show Interceptor, findInterceptorForType;
 
 // Test calling convention of methods introduced on subclasses of native
@@ -42,6 +42,7 @@
 """;
 
 main() {
+  nativeTesting();
   setup();
 
   setNativeSubclassDispatchRecord(getBPrototype(), findInterceptorForType(B));
diff --git a/tests/compiler/dart2js_native/subclassing_4_test.dart b/tests/compiler/dart2js_native/subclassing_4_test.dart
index 3e5d482..a284158 100644
--- a/tests/compiler/dart2js_native/subclassing_4_test.dart
+++ b/tests/compiler/dart2js_native/subclassing_4_test.dart
@@ -2,8 +2,8 @@
 // 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";
-import 'dart:_js_helper' show Native, Creates, setNativeSubclassDispatchRecord;
+import 'native_testing.dart';
+import 'dart:_js_helper' show setNativeSubclassDispatchRecord;
 import 'dart:_interceptors' show Interceptor, findInterceptorForType;
 
 // Test calling convention on subclasses of native classes.
@@ -39,6 +39,7 @@
 """;
 
 main() {
+  nativeTesting();
   setup();
 
   setNativeSubclassDispatchRecord(getBPrototype(), findInterceptorForType(B));
diff --git a/tests/compiler/dart2js_native/subclassing_5_test.dart b/tests/compiler/dart2js_native/subclassing_5_test.dart
index 7985893..26a4655 100644
--- a/tests/compiler/dart2js_native/subclassing_5_test.dart
+++ b/tests/compiler/dart2js_native/subclassing_5_test.dart
@@ -2,8 +2,8 @@
 // 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";
-import 'dart:_js_helper' show Native, Creates, setNativeSubclassDispatchRecord;
+import 'native_testing.dart';
+import 'dart:_js_helper' show setNativeSubclassDispatchRecord;
 import 'dart:_interceptors' show Interceptor, findInterceptorForType;
 
 // Test type checks.
@@ -121,51 +121,49 @@
   Expect.identical(x, z);
 }
 
-var inscrutable;
-
 main() {
+  nativeTesting();
   setup();
-  inscrutable = (x) => x;
 
   setNativeSubclassDispatchRecord(getBPrototype(), findInterceptorForType(B));
 
-  var b = inscrutable(makeB());
+  var b = confuse(makeB());
 
-  inscrutable(testIsB)(b);
-  inscrutable(testIsA)(b);
-  inscrutable(testIsN)(b);
-  inscrutable(testIsM)(b);
-  inscrutable(testIsI)(b);
+  confuse(testIsB)(b);
+  confuse(testIsA)(b);
+  confuse(testIsN)(b);
+  confuse(testIsM)(b);
+  confuse(testIsI)(b);
 
-  inscrutable(new Checks<B>().isCheck)(b);
-  inscrutable(new Checks<A>().isCheck)(b);
-  inscrutable(new Checks<N>().isCheck)(b);
-  inscrutable(new Checks<M>().isCheck)(b);
-  inscrutable(new Checks<I>().isCheck)(b);
+  confuse(new Checks<B>().isCheck)(b);
+  confuse(new Checks<A>().isCheck)(b);
+  confuse(new Checks<N>().isCheck)(b);
+  confuse(new Checks<M>().isCheck)(b);
+  confuse(new Checks<I>().isCheck)(b);
 
   if (isCheckedMode()) {
-    inscrutable(testAssignB)(b);
-    inscrutable(testAssignA)(b);
-    inscrutable(testAssignN)(b);
-    inscrutable(testAssignM)(b);
-    inscrutable(testAssignI)(b);
+    confuse(testAssignB)(b);
+    confuse(testAssignA)(b);
+    confuse(testAssignN)(b);
+    confuse(testAssignM)(b);
+    confuse(testAssignI)(b);
 
-    inscrutable(testCastB)(b);
-    inscrutable(testCastA)(b);
-    inscrutable(testCastN)(b);
-    inscrutable(testCastM)(b);
-    inscrutable(testCastI)(b);
+    confuse(testCastB)(b);
+    confuse(testCastA)(b);
+    confuse(testCastN)(b);
+    confuse(testCastM)(b);
+    confuse(testCastI)(b);
 
-    inscrutable(new Checks<B>().assignCheck)(b);
-    inscrutable(new Checks<A>().assignCheck)(b);
-    inscrutable(new Checks<N>().assignCheck)(b);
-    inscrutable(new Checks<M>().assignCheck)(b);
-    inscrutable(new Checks<I>().assignCheck)(b);
+    confuse(new Checks<B>().assignCheck)(b);
+    confuse(new Checks<A>().assignCheck)(b);
+    confuse(new Checks<N>().assignCheck)(b);
+    confuse(new Checks<M>().assignCheck)(b);
+    confuse(new Checks<I>().assignCheck)(b);
 
-    inscrutable(new Checks<B>().castCheck)(b);
-    inscrutable(new Checks<A>().castCheck)(b);
-    inscrutable(new Checks<N>().castCheck)(b);
-    inscrutable(new Checks<M>().castCheck)(b);
-    inscrutable(new Checks<I>().castCheck)(b);
+    confuse(new Checks<B>().castCheck)(b);
+    confuse(new Checks<A>().castCheck)(b);
+    confuse(new Checks<N>().castCheck)(b);
+    confuse(new Checks<M>().castCheck)(b);
+    confuse(new Checks<I>().castCheck)(b);
   }
 }
diff --git a/tests/compiler/dart2js_native/subclassing_constructor_1_test.dart b/tests/compiler/dart2js_native/subclassing_constructor_1_test.dart
index 657dc96..cbd04e5 100644
--- a/tests/compiler/dart2js_native/subclassing_constructor_1_test.dart
+++ b/tests/compiler/dart2js_native/subclassing_constructor_1_test.dart
@@ -2,9 +2,8 @@
 // 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";
-import 'dart:_foreign_helper' show JS;
-import 'dart:_js_helper' show Native, Creates, setNativeSubclassDispatchRecord;
+import "native_testing.dart";
+import 'dart:_js_helper' show setNativeSubclassDispatchRecord;
 import 'dart:_interceptors'
     show findInterceptorForType, findConstructorForNativeSubclassType;
 
@@ -158,11 +157,9 @@
   checkThrows(() => new B.three([]), 'new B.three([])');
 }
 
-var inscrutable;
-
 main() {
+  nativeTesting();
   setup();
-  inscrutable = (x) => x;
   log = (message) {
     trace.add('$message');
     return message;
diff --git a/tests/compiler/dart2js_native/subclassing_constructor_2_test.dart b/tests/compiler/dart2js_native/subclassing_constructor_2_test.dart
index 2b9f6c5..f1c8dd1 100644
--- a/tests/compiler/dart2js_native/subclassing_constructor_2_test.dart
+++ b/tests/compiler/dart2js_native/subclassing_constructor_2_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 // Test that native classes and subclasses of native classes cannot be directly
 // created via a generative constructor.
diff --git a/tests/compiler/dart2js_native/subclassing_super_call_test.dart b/tests/compiler/dart2js_native/subclassing_super_call_test.dart
index a3bb7f4..be90112 100644
--- a/tests/compiler/dart2js_native/subclassing_super_call_test.dart
+++ b/tests/compiler/dart2js_native/subclassing_super_call_test.dart
@@ -2,9 +2,8 @@
 // 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";
-import 'dart:_foreign_helper' show JS;
-import 'dart:_js_helper' show Native, Creates, setNativeSubclassDispatchRecord;
+import "native_testing.dart";
+import 'dart:_js_helper' show setNativeSubclassDispatchRecord;
 import 'dart:_interceptors'
     show findInterceptorForType, findConstructorForNativeSubclassType;
 
@@ -53,8 +52,6 @@
 getBBPrototype = function(){return BB.prototype;};
 """;
 
-var inscrutable;
-
 testSuperOnNative() {
   BB b1 = makeBB();
   BB b2 = makeBB();
@@ -64,14 +61,14 @@
   JS('', '#(#)', constructor, b1);
   JS('', '#(#)', constructor, b2);
 
-  b1.text = inscrutable('one');
-  b2.text = inscrutable('two');
+  b1.text = confuse('one');
+  b2.text = confuse('two');
 
-  print('b1.text ${inscrutable(b1).text}');
-  print('b2.text ${inscrutable(b2).text}');
+  print('b1.text ${confuse(b1).text}');
+  print('b2.text ${confuse(b2).text}');
 
-  print('b1.foo() ${inscrutable(b1).foo()}');
-  print('b2.foo() ${inscrutable(b2).foo()}');
+  print('b1.foo() ${confuse(b1).foo()}');
+  print('b2.foo() ${confuse(b2).foo()}');
 
   Expect.equals('one', b1.text);
   Expect.equals('two', b2.text);
@@ -79,14 +76,14 @@
   Expect.equals('foo:one', b1.foo());
   Expect.equals('foo:two', b2.foo());
 
-  inscrutable(b1).text = inscrutable('three');
-  inscrutable(b2).text = inscrutable('four');
+  confuse(b1).text = confuse('three');
+  confuse(b2).text = confuse('four');
 
-  Expect.equals('three', inscrutable(b1).text);
-  Expect.equals('four', inscrutable(b2).text);
+  Expect.equals('three', confuse(b1).text);
+  Expect.equals('four', confuse(b2).text);
 
-  Expect.equals('foo:three', inscrutable(b1).foo());
-  Expect.equals('foo:four', inscrutable(b2).foo());
+  Expect.equals('foo:three', confuse(b1).foo());
+  Expect.equals('foo:four', confuse(b2).foo());
 }
 
 testSuperOnSubclassOfNative() {
@@ -98,14 +95,14 @@
   JS('', '#(#)', constructor, b1);
   JS('', '#(#)', constructor, b2);
 
-  b1.afield = inscrutable('one');
-  b2.afield = inscrutable('two');
+  b1.afield = confuse('one');
+  b2.afield = confuse('two');
 
-  print('b1.afield ${inscrutable(b1).afield}');
-  print('b2.afield ${inscrutable(b2).afield}');
+  print('b1.afield ${confuse(b1).afield}');
+  print('b2.afield ${confuse(b2).afield}');
 
-  print('b1.afun() ${inscrutable(b1).afun()}');
-  print('b2.afun() ${inscrutable(b2).afun()}');
+  print('b1.afun() ${confuse(b1).afun()}');
+  print('b2.afun() ${confuse(b2).afun()}');
 
   Expect.equals('one', b1.afield);
   Expect.equals('two', b2.afield);
@@ -113,19 +110,19 @@
   Expect.equals('afun:one', b1.afun());
   Expect.equals('afun:two', b2.afun());
 
-  inscrutable(b1).afield = inscrutable('three');
-  inscrutable(b2).afield = inscrutable('four');
+  confuse(b1).afield = confuse('three');
+  confuse(b2).afield = confuse('four');
 
-  Expect.equals('three', inscrutable(b1).afield);
-  Expect.equals('four', inscrutable(b2).afield);
+  Expect.equals('three', confuse(b1).afield);
+  Expect.equals('four', confuse(b2).afield);
 
-  Expect.equals('afun:three', inscrutable(b1).afun());
-  Expect.equals('afun:four', inscrutable(b2).afun());
+  Expect.equals('afun:three', confuse(b1).afun());
+  Expect.equals('afun:four', confuse(b2).afun());
 }
 
 main() {
+  nativeTesting();
   setup();
-  inscrutable = (x) => x;
 
   setNativeSubclassDispatchRecord(getBBPrototype(), findInterceptorForType(BB));
 
diff --git a/tests/compiler/dart2js_native/subclassing_super_field_1_test.dart b/tests/compiler/dart2js_native/subclassing_super_field_1_test.dart
index 1e602df..c3fb6fd 100644
--- a/tests/compiler/dart2js_native/subclassing_super_field_1_test.dart
+++ b/tests/compiler/dart2js_native/subclassing_super_field_1_test.dart
@@ -2,9 +2,8 @@
 // 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";
-import 'dart:_foreign_helper' show JS;
-import 'dart:_js_helper' show Native, Creates, setNativeSubclassDispatchRecord;
+import "native_testing.dart";
+import 'dart:_js_helper' show setNativeSubclassDispatchRecord;
 import 'dart:_interceptors'
     show findInterceptorForType, findConstructorForNativeSubclassType;
 
@@ -40,11 +39,9 @@
 getBPrototype = function(){return B.prototype;};
 """;
 
-var inscrutable;
-
 main() {
+  nativeTesting();
   setup();
-  inscrutable = (x) => x;
 
   setNativeSubclassDispatchRecord(getBPrototype(), findInterceptorForType(B));
 
@@ -56,8 +53,8 @@
 
   print(b);
 
-  Expect.equals(222, inscrutable(b).Bfoo());
-  Expect.equals(111, inscrutable(b).Afoo());
+  Expect.equals(222, confuse(b).Bfoo());
+  Expect.equals(111, confuse(b).Afoo());
 
   Expect.equals(222, b.Bfoo());
   Expect.equals(111, b.Afoo());
diff --git a/tests/compiler/dart2js_native/subclassing_super_field_2_test.dart b/tests/compiler/dart2js_native/subclassing_super_field_2_test.dart
index 4778ed1..8e9bd93 100644
--- a/tests/compiler/dart2js_native/subclassing_super_field_2_test.dart
+++ b/tests/compiler/dart2js_native/subclassing_super_field_2_test.dart
@@ -2,9 +2,8 @@
 // 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";
-import 'dart:_foreign_helper' show JS;
-import 'dart:_js_helper' show Native, Creates, setNativeSubclassDispatchRecord;
+import "native_testing.dart";
+import 'dart:_js_helper' show setNativeSubclassDispatchRecord;
 import 'dart:_interceptors'
     show findInterceptorForType, findConstructorForNativeSubclassType;
 
@@ -44,11 +43,9 @@
 getBPrototype = function(){return B.prototype;};
 """;
 
-var inscrutable;
-
 main() {
+  nativeTesting();
   setup();
-  inscrutable = (x) => x;
 
   setNativeSubclassDispatchRecord(getBPrototype(), findInterceptorForType(B));
 
@@ -60,9 +57,9 @@
 
   print(b);
 
-  Expect.equals(333, inscrutable(b).Bfoo());
-  Expect.equals(222, inscrutable(b).Afoo());
-  Expect.equals(111, inscrutable(b).Nfoo());
+  Expect.equals(333, confuse(b).Bfoo());
+  Expect.equals(222, confuse(b).Afoo());
+  Expect.equals(111, confuse(b).Nfoo());
 
   Expect.equals(333, b.Bfoo());
   Expect.equals(222, b.Afoo());
diff --git a/tests/compiler/dart2js_native/subclassing_type_test.dart b/tests/compiler/dart2js_native/subclassing_type_test.dart
index a4e14e8..3ab4af9 100644
--- a/tests/compiler/dart2js_native/subclassing_type_test.dart
+++ b/tests/compiler/dart2js_native/subclassing_type_test.dart
@@ -2,8 +2,8 @@
 // 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";
-import 'dart:_js_helper' show Native, Creates, setNativeSubclassDispatchRecord;
+import 'native_testing.dart';
+import 'dart:_js_helper' show setNativeSubclassDispatchRecord;
 import 'dart:_interceptors' show Interceptor, findInterceptorForType;
 
 // Test that type checks and casts work for subclasses of native classes and
diff --git a/tests/compiler/dart2js_native/super_call_test.dart b/tests/compiler/dart2js_native/super_call_test.dart
index b420516..0a880f3 100644
--- a/tests/compiler/dart2js_native/super_call_test.dart
+++ b/tests/compiler/dart2js_native/super_call_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 // Test to see if resolving a hidden native class's method interferes with
 // subsequent resolving the subclass's method.  This might happen if the
@@ -62,9 +61,15 @@
 makeB = function(){return new B};
 makeC = function(){return new C};
 makeD = function(){return new D};
+
+self.nativeConstructor(A);
+self.nativeConstructor(B);
+self.nativeConstructor(C);
+self.nativeConstructor(D);
 """;
 
 main() {
+  nativeTesting();
   setup();
 
   var a = makeA();
diff --git a/tests/compiler/dart2js_native/super_property_test.dart b/tests/compiler/dart2js_native/super_property_test.dart
index fbe98f7..0174525 100644
--- a/tests/compiler/dart2js_native/super_property_test.dart
+++ b/tests/compiler/dart2js_native/super_property_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 // Tests super setter where the HInvokeSuper is using interceptor aka
 // explicit-receiver calling convention.
@@ -47,6 +46,8 @@
 function B(){}
 makeA = function(){return new A};
 makeB = function(){return new B};
+self.nativeConstructor(A);
+self.nativeConstructor(B);
 """;
 
 testThing(a) {
@@ -60,6 +61,7 @@
 }
 
 main() {
+  nativeTesting();
   setup();
   var things = [makeA(), makeB(), new C(), new D()];
   var test = testThing;
diff --git a/tests/compiler/dart2js_native/type_error_decode_test.dart b/tests/compiler/dart2js_native/type_error_decode_test.dart
index 3c9a8f0..1c37f03 100644
--- a/tests/compiler/dart2js_native/type_error_decode_test.dart
+++ b/tests/compiler/dart2js_native/type_error_decode_test.dart
@@ -4,9 +4,8 @@
 
 library test.type_error_decode_test;
 
-import 'package:expect/expect.dart';
-
-import 'dart:_js_helper';
+import 'native_testing.dart';
+import 'dart:_js_helper' show NullError, JsNoSuchMethodError;
 
 class Foo {
   var field;
@@ -41,12 +40,19 @@
   var s = "Cannot call method 'foo' of null";
   var nul = null;
   var f = new Foo();
-  // This should foil code analysis so the variables aren't inlined below.
-  [].forEach((y) => f.field = nul = s = x = z = v = y);
+
   expectThrows(() => x.fisk(), isNullError);
   expectThrows(() => v.fisk(), isNullError);
   expectThrows(() => z.fisk(), isJsNoSuchMethodError);
   expectThrows(() => s.fisk(), isJsNoSuchMethodError);
   expectThrows(() => null(), isNullError);
   expectThrows(() => f.field(), isNullError);
+
+  expectThrows(() => confuse(x).fisk(), isNullError);
+  expectThrows(() => confuse(v).fisk(), isNullError);
+  expectThrows(() => confuse(z).fisk(), isJsNoSuchMethodError);
+  expectThrows(() => confuse(s).fisk(), isJsNoSuchMethodError);
+  expectThrows(() => confuse(null)(), isNullError);
+  expectThrows(() => confuse(f).field(), isNullError);
+  expectThrows(() => confuse(f.field)(), isNullError);
 }
diff --git a/tests/compiler/dart2js_native/undefined_bailout_test.dart b/tests/compiler/dart2js_native/undefined_bailout_test.dart
index 8819be1..feff806 100644
--- a/tests/compiler/dart2js_native/undefined_bailout_test.dart
+++ b/tests/compiler/dart2js_native/undefined_bailout_test.dart
@@ -18,8 +18,7 @@
 // comparison does not work for undefined, which the DOM sometimes
 // returns.
 
-import "package:expect/expect.dart";
-import 'dart:_foreign_helper' show JS;
+import "native_testing.dart";
 
 var a = 42;
 var b = 0;
diff --git a/tests/compiler/dart2js_native/uninstantiated_type_parameter_test.dart b/tests/compiler/dart2js_native/uninstantiated_type_parameter_test.dart
index 730a5bb..158063c 100644
--- a/tests/compiler/dart2js_native/uninstantiated_type_parameter_test.dart
+++ b/tests/compiler/dart2js_native/uninstantiated_type_parameter_test.dart
@@ -2,8 +2,7 @@
 // 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:_js_helper";
-import "package:expect/expect.dart";
+import "native_testing.dart";
 
 // Test for uninstantiated native classes as type parameters.
 
diff --git a/tests/html/html.status b/tests/html/html.status
index 419e7bb..b3aece5 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -14,6 +14,8 @@
 js_typed_interop_type3_test: Fail, OK # tests dart2js-specific behavior.
 
 native_gc_test: Skip # Dartium JSInterop failure
+js_interop_constructor_name_test/HTMLDivElement-methods: Fail # Investigate.
+js_interop_constructor_name_test/HTMLDivElement-types: Fail # ditto
 
 [ $compiler == none && ($runtime == drt || $runtime == dartium ) ]
 worker_api_test: Fail # Issue 10223
@@ -32,7 +34,8 @@
 js_type_test/dynamic-null-not-Foo: Fail  # Issue 26838
 js_type_test/dynamic-String-not-Foo: Fail  # Issue 26838
 js_type_test/dynamic-String-not-dynamic-Foo: Fail  # Issue 26838
-
+js_interop_constructor_name_test/HTMLDivElement-types-erroneous1: Fail # Issue 26838
+js_interop_constructor_name_test/HTMLDivElement-types-erroneous2: Fail # Issue 26838
 
 [ $compiler == dart2js && $checked ]
 js_function_getter_trust_types_test: Skip # --trust-type-annotations incompatible with --checked
diff --git a/tests/html/js_interop_constructor_name_test.dart b/tests/html/js_interop_constructor_name_test.dart
new file mode 100644
index 0000000..0b488f4
--- /dev/null
+++ b/tests/html/js_interop_constructor_name_test.dart
@@ -0,0 +1,98 @@
+// 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 jsTest;
+
+import 'dart:async';
+import 'dart:html' as html;
+import 'dart:js';
+import 'package:js/js.dart';
+
+import 'package:unittest/unittest.dart';
+import 'package:unittest/html_individual_config.dart';
+import 'package:expect/expect.dart' show NoInline, AssumeDynamic;
+
+@JS()
+external makeDiv(String text);
+
+@JS()
+class HTMLDivElement {
+  external String bar();
+}
+
+@NoInline() @AssumeDynamic()
+confuse(x) => x;
+
+main() {
+  useHtmlIndividualConfiguration();
+
+  group('HTMLDivElement-types', () {
+    test('dom-is-dom', () {
+      var e = confuse(new html.DivElement());
+      expect(e is html.DivElement, isTrue);
+    });
+
+    test('js-is-dom', () {
+      var e = confuse(makeDiv('hello'));
+      expect(e is html.DivElement, isFalse);
+    });
+
+    test('js-is-js', () {
+      var e = confuse(makeDiv('hello'));
+      expect(e is HTMLDivElement, isTrue);
+    });
+
+  });
+
+  group('HTMLDivElement-types-erroneous1', () {
+    test('dom-is-js', () {
+      var e = confuse(new html.DivElement());
+      // TODO(26838): When Issue 26838 is fixed and this test passes, move this
+      // test into group `HTMLDivElement-types`.
+
+      // Currently, HTML types are not [JavaScriptObject]s. We could change that
+      // by having HTML types extend JavaScriptObject, in which case we would
+      // change this expectation.
+      expect(e is HTMLDivElement, isFalse);
+    });
+  });
+
+  group('HTMLDivElement-types-erroneous2', () {
+    test('String-is-not-js', () {
+      var e = confuse('kombucha');
+      // TODO(26838): When Issue 26838 is fixed and this test passes, move this
+      // test into group `HTMLDivElement-types`.
+
+      // A String should not be a JS interop type. The type test flags are added
+      // to Interceptor, but should be added to the class that implements all
+      // the JS-interop methods.
+      expect(e is HTMLDivElement, isFalse);
+    });
+  });
+
+
+  group('HTMLDivElement-methods', () {
+
+    test('js-call-js-method', () {
+      var e = confuse(makeDiv('hello'));
+      expect(e.bar(), equals('hello'));
+    });
+
+    test('dom-call-js-method', () {
+      var e = confuse(new html.DivElement());
+      expect(() => e.bar(), throws);
+    });
+
+    test('js-call-dom-method', () {
+      var e = confuse(makeDiv('hello'));
+      expect(() => e.clone(false), throws);
+    });
+
+    test('dom-call-dom-method', () {
+      var e = confuse(new html.DivElement());
+      expect(e.clone(false), new isInstanceOf<html.DivElement>());
+    });
+
+  });
+}
diff --git a/tests/html/js_interop_constructor_name_test.html b/tests/html/js_interop_constructor_name_test.html
new file mode 100644
index 0000000..4b21d8b
--- /dev/null
+++ b/tests/html/js_interop_constructor_name_test.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <meta name="dart.unittest" content="full-stack-traces">
+  <title> js_interop_constructor_name_test </title>
+  <style>
+     .unittest-table { font-family:monospace; border:1px; }
+     .unittest-pass { background: #6b3;}
+     .unittest-fail { background: #d55;}
+     .unittest-error { background: #a11;}
+  </style>
+</head>
+<body>
+  <h1> Running js_interop_constructor_name_test </h1>
+  <script type="text/javascript"
+      src="/root_dart/tests/html/js_interop_constructor_name_test_js.js"></script>
+  <script type="text/javascript"
+      src="/root_dart/tools/testing/dart/test_controller.js"></script>
+  %TEST_SCRIPTS%
+</body>
+</html>
diff --git a/tests/html/js_interop_constructor_name_test_js.js b/tests/html/js_interop_constructor_name_test_js.js
new file mode 100644
index 0000000..828cbc9
--- /dev/null
+++ b/tests/html/js_interop_constructor_name_test_js.js
@@ -0,0 +1,20 @@
+(function() {
+
+  // A constructor function with the same name as a HTML element.
+  function HTMLDivElement(a) {
+    this.a = a;
+  }
+
+  HTMLDivElement.prototype.bar = function() {
+    return this.a;
+  }
+
+  HTMLDivElement.prototype.toString = function() {
+    return "HTMLDivElement(" + this.a + ")";
+  }
+
+  self.makeDiv = function(text) {
+    return new HTMLDivElement(text);
+  };
+
+})();
diff --git a/tests/kernel/unsorted/try_finally_test.dart b/tests/kernel/unsorted/try_finally_test.dart
index db3069b..87bb968 100644
--- a/tests/kernel/unsorted/try_finally_test.dart
+++ b/tests/kernel/unsorted/try_finally_test.dart
@@ -144,6 +144,34 @@
   }
 }
 
+testNestedFinally() {
+  var events = '';
+  try {
+    try {
+      events = '$events|start';
+    } finally {
+      events = '$events|start-catch';
+    }
+    try {
+      try {
+        return;
+      } finally {
+        events = '$events|inner';
+        throw 0;
+      }
+    } finally {
+      events = '$events|middle';
+    }
+  } catch (e) {
+    events = '$events|outer-catch';
+  } finally {
+    events = '$events|outer-finally';
+  }
+  Expect.equals(
+      events,
+      '|start|start-catch|inner|middle|outer-catch|outer-finally');
+}
+
 main() {
   Expect.isTrue(testSimpleBreak() == 3);
   Expect.isTrue(testReturnFinally() == 42);
@@ -155,4 +183,5 @@
   Expect.isTrue(testStopContinueInsideLoop() == 42);
   Expect.isTrue(testStopContinueInsideSwitch() == 42);
   Expect.isTrue(testStopContinueInsideSwitch2() == 42);
+  testNestedFinally();
 }
diff --git a/tests/language/language.status b/tests/language/language.status
index 2357dd9..e6b27de 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -261,6 +261,7 @@
 library_env_test/has_mirror_support: RuntimeError, OK
 
 [ $hot_reload || $hot_reload_rollback ]
+methods_as_constants_test: Skip # Issue 27803
 static_closure_identical_test: Pass, Fail # Closure identity
 cha_deopt1_test: Crash # Requires deferred libraries
 cha_deopt2_test: Crash # Requires deferred libraries
diff --git a/tests/language/vm/optimized_list_constructor_test.dart b/tests/language/vm/optimized_list_constructor_test.dart
new file mode 100644
index 0000000..a6e27ce
--- /dev/null
+++ b/tests/language/vm/optimized_list_constructor_test.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2016, 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 various optimizations and deoptimizations of optimizing compiler..
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
+
+import "package:expect/expect.dart";
+
+// Test correct throwing of ArgumentError in optimized code.
+
+test() {
+  try {
+    var r = new List<int>(-1);
+    Expect.isTrue(false);  // Unreachable.
+  } on RangeError {
+    return true;
+  }
+  Expect.isTrue(false);  // Unreachable.
+}
+
+main() {
+  for (var i = 0; i < 20; i++) {
+    Expect.isTrue(test());
+  }
+}
+
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index 8d83a13..8f43474 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -396,8 +396,11 @@
 convert/utf85_test: Pass, Timeout
 
 [ $hot_reload || $hot_reload_rollback ]
+async/zone_debug_test: Skip # Issue 27803
+async/intercept_print1_test: Skip # Issue 27803
 async/multiple_timer_test: Pass, Fail # Timing related
 async/stream_transformer_test: Pass, Fail # Closure identity
+convert/json_toEncodable_reviver_test: Skip # Issue 27803
 mirrors/closurization_equivalence_test: SkipByDesign # Method equality
 mirrors/fake_function_with_call_test: SkipByDesign # Method equality
 
@@ -411,7 +414,6 @@
 mirrors/load_library_test: Crash # Deferred loading
 
 [ $hot_reload ]
-mirrors/metadata_scope_test/none: Fail # Constant equality - Issue 26868
 mirrors/generic_bounded_test/02: Fail # Type equality - Issue 26869
 mirrors/typedef_reflected_type_test/01: Fail # Type equality - Issue 26869
 mirrors/generic_bounded_by_type_parameter_test/02: Fail # Type equality - Issue 26869
diff --git a/tests/standalone/fixed_precision_double_test.dart b/tests/standalone/fixed_precision_double_test.dart
deleted file mode 100644
index 350bbc3..0000000
--- a/tests/standalone/fixed_precision_double_test.dart
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright (c) 2016, 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";
-
-bool testAssociativity(Function f) {
-  // Example from https://en.wikipedia.org/wiki/Floating_point
-  // Test that (a + b) + c == a + (b + c).
-  double a = f(1234.567);  // Chop literals.
-  double b = f(45.67834);
-  double c = f(0.0004);
-  double x = (a + b) + c;  // Chop result of multiplication or division only.
-  double y = a + (b + c);
-  print("x: $x");
-  print("y: $y");
-  return x == y;
-}
-
-bool testDistributivity(Function f) {
-  // Example from https://en.wikipedia.org/wiki/Floating_point
-  // Test that (a + b)*c == a*c + b*c.
-  double a = f(1234.567);  // Chop literals.
-  double b = f(1.234567);
-  double c = f(3.333333);
-  double x = f((a + b)*c);  // Chop result of multiplication.
-  double y = f(a*c) + f(b*c);
-  print("x: $x");
-  print("y: $y");
-  return x == y;
-}
-
-// Simulate precision checking with assert.
-assertP(double d) {
-  assert(d == d.p);
-}
-
-bool assertionsEnabled() {
-  try {
-    assert(false);
-    return false;
-  } on AssertionError catch (e) {
-    return true;
-  }
-  return false;
-}
-
-main() {
-  // The getter p keeps only 20 (by default) bits after the decimal point.
-  Expect.equals(0.0, 0.0.p);  // 0.0 has no 1-bit after the decimal point.
-  Expect.equals(1.5, 1.5.p);  // 1.5 has a single 1-bit after the decimal point.
-  Expect.notEquals(1.1, 1.1.p);  // 1.1 has many 1-bits after the decimal point.
-  Expect.notEquals(1/3, (1/3).p);  // 0.33333333... ditto.
-
-  Expect.equals(1.1 + 1/3, 1/3 + 1.1);  // Test addition commutativity.
-  Expect.equals(1.1.p + (1/3).p, (1/3).p + 1.1.p);
-  Expect.equals(1.1 * 1/3, 1/3 * 1.1);  // Test multiplication commutativity.
-  Expect.equals(1.1.p * (1/3).p, (1/3).p * 1.1.p);
-
-  print("Without chopping fractional bits:");
-  Expect.isFalse(testAssociativity((x) => x));
-  Expect.isFalse(testDistributivity((x) => x));
-  print("With chopping fractional bits:");
-  Expect.isTrue(testAssociativity((x) => x.p));
-  Expect.isTrue(testDistributivity((x) => x.p));
-
-  // Check that p works with NaN and Infinity.
-  Expect.isTrue(double.NAN.p.isNaN);
-  Expect.isTrue(double.INFINITY.p.isInfinite);
-  Expect.isFalse(double.INFINITY.p.isNegative);
-  Expect.isTrue(double.NEGATIVE_INFINITY.p.isInfinite);
-  Expect.isTrue(double.NEGATIVE_INFINITY.p.isNegative);
-
-  // Check use of assert to verify precision.
-  if (assertionsEnabled()) {
-    assertP(1.5);
-    assertP(1.1.p);
-    Expect.throws(() => assertP(1.1), (e) => e is AssertionError);
-    assertP(1.23456789.p);
-    Expect.throws(() => assertP(1.23456789), (e) => e is AssertionError);
-  }
-}
diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status
index 85e68b6..866135b 100644
--- a/tests/standalone/standalone.status
+++ b/tests/standalone/standalone.status
@@ -16,13 +16,9 @@
 package/scenarios/empty_packages_file/empty_packages_file_option_test: Fail, OK # CompileTimeErrors intentionally
 package/scenarios/invalid/invalid_package_name_test: RuntimeError, CompileTimeError # Errors intentionally
 package/scenarios/invalid/same_package_twice_test.dart: RuntimeError, CompileTimeError # Errors intentionally
-full_coverage_test: Pass, Slow, Timeout
 
 issue14236_test: Pass # Do not remove this line. It serves as a marker for Issue 14516 comment #4.
 
-[ ($runtime != vm || $compiler != none) && $compiler != dartanalyzer && $compiler != dart2analyzer ]
-packages_file_test: Skip # Uses Platform.executable
-
 [ ($runtime != vm && $runtime != dart_precompiled && $runtime != dart_app) && ($runtime != drt || $compiler != none)) ]
 no_assert_test: Fail, OK # This is testing a vm flag.
 env_test: Skip # This is testing a vm command line parsing scenario.
@@ -67,7 +63,6 @@
 typed_data_isolate_test: SkipByDesign # This test uses dart:io
 io/*: SkipByDesign # Don't run tests using dart:io in the browser
 package/*: Skip # Do not run those in Dartium.
-full_coverage_test: Skip
 http_launch_test: Skip
 vmservice/*: SkipByDesign # Do not run standalone vm service tests in browser.
 issue14236_test: Skip # Issue 14236 Script snapshots do not work in the browser.
@@ -80,7 +75,6 @@
 
 [ $compiler == dartanalyzer || $compiler == dart2analyzer ]
 issue14236_test: Skip # Analyzer can't handle Script snapshots.
-fixed_precision_double_test: Skip # double p getter only implemented in VM.
 
 # test issue https://code.google.com/p/dart/issues/detail?id=11518
 io/file_constructor_test: fail
@@ -105,7 +99,6 @@
 package/package_test: Fail, OK # dart2js does not support 'package:foo.dart' imports
 package/package1_test: Fail, OK # dart2js does not support 'package:foo.dart' imports
 package/scenarios/invalid/*: CompileTimeError  # Negative tests expecting CompileTimeErrors.
-full_coverage_test: Skip
 left_shift_bit_and_op_test: Skip # Integers exceed dart2js precision.
 pow_test: Skip # Precision > 53 bits.
 double_smi_comparison_test: Skip # Precision > 53 bits.
@@ -117,7 +110,6 @@
 pair_location_remapping_test: Skip
 regress_25335_test: Skip # Int64List not supported.
 deferred_transitive_import_error_test: Skip # Contains intentional errors.
-fixed_precision_double_test: Skip # double p getter only implemented in VM.
 
 [ $compiler == dart2js && $cps_ir && $checked ]
 *: Skip # `assert` not implemented
@@ -163,7 +155,6 @@
 [ $arch == mips && $mode == debug ]
 io/web_socket_test: SkipSlow # Times out. Issue 20352
 io/test_runner_test: Skip # Flakily times out in a subtest. Issue 201351
-full_coverage_test: SkipSlow # Times out. Issue 20352
 io/http_client_stays_alive_test: Skip # Timing dependent test, MIPS machine too slow.
 
 [ $compiler == none && $runtime == dartium && $unchecked ]
@@ -206,7 +197,6 @@
 io/sleep_test: Pass, Fail # Issue 25757
 
 [ ($runtime == vm || $runtime == dart_precompiled || $runtime == dart_app) && $mode == debug && $builder_tag == asan ]
-full_coverage_test: Skip  # Timeout.
 io/file_lock_test: Skip  # Timeout.
 io/test_runner_test: Skip  # Timeout.
 io/http_client_stays_alive_test: Skip  # Timeout.
@@ -229,56 +219,56 @@
 map_insert_remove_oom_test: Skip # Heap limit too low. Increasing iteration count to make a higher limit a meaningful test makes it too slow for simarm[64] bots.
 io/web_socket_test: Pass, RuntimeError # Issue 24674
 
-[ $noopt || $compiler == precompiler || $compiler == dart2app || $compiler == dart2appjit ]
-io/test_extension_test: Skip # Platform.executable
-io/test_extension_fail_test: Skip # Platform.executable
-io/platform_test: Skip # Platform.executable
-io/code_collection_test: Skip # Platform.executable
-full_coverage_test: Skip # Platform.executable
-regress_26031_test: Skip # Platform.resolvedExecutable
-
 [ $compiler == precompiler || $compiler == dart2app || $compiler == dart2appjit ]
 io/compile_all_test: Skip # Incompatible flag --compile_all
 
 [ $runtime == dart_app ]
 io/stdout_bad_argument_test: Skip # Test exits and so can't generate snapshot.
+io/directory_list_sync_test: Skip # Snapshot path differs from script path.
+io/test_extension_test: Skip # Snapshot path differs from script path.
+io/test_extension_fail_test: Skip # Snapshot path differs from script path.
+io/platform_test: Skip # Snapshot path differs from script path.
 
 [ $runtime == dart_precompiled ]
-full_coverage_test: Skip # Platform.executable
-http_launch_test: Skip # Platform.executable
-io/addlatexhash_test: Skip # Platform.executable
-io/file_read_special_device_test: Skip # Platform.executable
-io/file_stream_test: Skip # Platform.executable
-io/file_test: Skip # Platform.executable
-io/http_cross_process_test: Skip # Platform.executable
-io/https_unauthorized_test: Skip # Platform.executable
-io/platform_resolved_executable_test: Skip # Platform.resolvedExecutable
-io/skipping_dart2js_compilations_test: Skip # Platform.executable
-io/snapshot_fail_test: Skip # Platform.executable
-io/stdin_sync_test: Skip # Platform.executable
-io/test_extension_fail_test: Skip # Platform.executable
-io/file_read_special_device_test: Skip # Platform.executable
-verbose_gc_to_bmu_test: Skip # Platform.executable
-io/http_server_close_response_after_error_test: Skip # Platform.executable
-io/http_client_stays_alive_test: Skip # Platform.executable
-io/print_sync_test: Skip # Platform.executable
-io/signals_test: Skip # Platform.executable
-io/stdio_implicit_close_test: Skip # Platform.executable
-io/stdio_nonblocking_test: Skip # Platform.executable
-io/regress_7191_test: Skip # Platform.executable
-io/secure_unauthorized_test: Skip # Platform.executable
-io/dart_std_io_pipe_test: Skip # Platform.executable
-io/platform_test: Skip # Platform.executable
-io/socket_cross_process_test: Skip # Platform.executable
-io/test_runner_test: Skip # Platform.executable
-io/file_lock_test: Skip # Platform.executable
-io/code_collection_test: Skip # Platform.executable
-io/file_blocking_lock_test: Skip # Platform.executable
-io/raw_socket_cross_process_test: Skip # Platform.executable
-io/test_extension_test: Skip # Platform.executable
-io/named_pipe_script_test: Skip # Platform.executable
-io/regress_7679_test: Skip # Platform.executable
-io/process_*: Skip # Most use Platform.executable
+# These tests attempt to spawn another script using the precompiled runtime.
+http_launch_test: Skip
+io/addlatexhash_test: Skip
+io/dart_std_io_pipe_test: Skip
+io/dart_std_io_pipe_test: Skip
+io/file_blocking_lock_test: Skip
+io/file_lock_test: Skip
+io/file_read_special_device_test: Skip
+io/http_client_stays_alive_test: Skip
+io/http_response_deadline_test: Skip
+io/http_server_close_response_after_error_test: Skip
+io/https_unauthorized_test: Skip
+io/named_pipe_script_test: Skip
+io/print_sync_test: Skip
+io/process_check_arguments_test: Skip
+io/process_detached_test: Skip
+io/process_environment_test: Skip
+io/process_non_ascii_test: Skip
+io/process_run_output_test: Skip
+io/process_set_exit_code_test: Skip
+io/process_shell_test: Skip
+io/process_stderr_test: Skip
+io/process_stdin_transform_unsubscribe_test: Skip
+io/process_stdout_test: Skip
+io/process_sync_test: Skip
+io/raw_datagram_socket_test: Skip
+io/regress_7191_test: Skip
+io/regress_7679_test: Skip
+io/secure_unauthorized_test: Skip
+io/signals_test: Skip
+io/stdin_sync_test: Skip
+io/stdio_implicit_close_test: Skip
+io/stdio_nonblocking_test: Skip
+io/test_extension_test: Skip
+io/test_extension_fail_test: Skip
+verbose_gc_to_bmu_test: Skip
+
+io/platform_test: RuntimeError # Expects to be running from 'dart' instead of 'dart_precompiled_runtime'
+io/directory_list_sync_test: Timeout, Skip # Expects to find the test directory relative to the script.
 
 [ $runtime == dart_precompiled || $mode == product ]
 io/skipping_dart2js_compilations_test: CompileTimeError # Imports dart:mirrors
@@ -290,10 +280,6 @@
 no_assert_test: SkipByDesign # Requires checked mode.
 io/code_collection_test: Skip # Incompatible flags
 
-# Code coverage is not supported in product mode.
-[ $mode == product ]
-full_coverage_test: SkipByDesign
-
 # Overriding these flags are not supported in product mode.
 [ $mode == product ]
 no_profiler_test: SkipByDesign
@@ -317,9 +303,6 @@
 package/scenarios/packages_option_only/packages_option_only_test: Skip
 
 [ $arch == simdbc || $arch == simdbc64 ]
-# TODO(vegorov) SIMDBC interpreter doesn't support coverage yet.
-full_coverage_test: Skip
-
 # SIMDBC interpreter doesn't support lazy linking of natives.
 link_natives_lazily_test: SkipByDesign
 
diff --git a/tools/VERSION b/tools/VERSION
index bbdce97..4b02ee1e 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -28,5 +28,5 @@
 MAJOR 1
 MINOR 21
 PATCH 0
-PRERELEASE 5
+PRERELEASE 6
 PRERELEASE_PATCH 0
diff --git a/tools/bots/ddc_tests.py b/tools/bots/ddc_tests.py
index 73f8f4a..fc6830f 100644
--- a/tools/bots/ddc_tests.py
+++ b/tools/bots/ddc_tests.py
@@ -21,6 +21,12 @@
 CHANNEL = bot_utils.GetChannelFromName(bot_name)
 
 if __name__ == '__main__':
-  print "This step should run dartdevc tests"
-  print "Current directory when running on a bot should be"
-  print "/b/build/slave/[builder name]/build/sdk"
+  with utils.ChangedWorkingDirectory('pkg/dev_compiler'):
+    with bot.BuildStep('npm install'):
+      bot.RunProcess(['npm', 'install'])
+
+    with bot.BuildStep('Compile tests and run unit tests'):
+      bot.RunProcess([utils.CheckedInSdkExecutable(), 'test/all_tests.dart'])
+
+    with bot.BuildStep('Execute compiled tests'):
+      bot.RunProcess(['npm', 'test'])
diff --git a/tools/bots/gn_tests.py b/tools/bots/gn_tests.py
old mode 100644
new mode 100755
index cd7ffaa..1f44d69
--- a/tools/bots/gn_tests.py
+++ b/tools/bots/gn_tests.py
@@ -20,6 +20,18 @@
       + argv[1:])
   if build_result != 0:
     return build_result
+  build_result = subprocess.call(
+      ['python', test_py, '--builder-tag=no_ipv6',
+       '-cdart2js', '-rd8', '--use-sdk', 'language/first']
+      + argv[1:])
+  if build_result != 0:
+    return build_result
+  build_result = subprocess.call(
+      ['python', test_py, '--builder-tag=no_ipv6',
+       '-cdart2analyzer', '-rnone', '--use-sdk', 'language/first']
+      + argv[1:])
+  if build_result != 0:
+    return build_result
   return 0
 
 if __name__ == '__main__':
diff --git a/tools/dart_for_gn.py b/tools/dart_for_gn.py
deleted file mode 100755
index 2e6871d..0000000
--- a/tools/dart_for_gn.py
+++ /dev/null
@@ -1,35 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2016 The Dart project authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# Usage: dart_for_gn.py path_to_dart_binary [arguments]
-#
-# We have gn set up so that actions can only run python scripts.
-# We use this wrapper script when we need an action to run the Dart VM
-# The first command line argument is mandatory and should be the absolute path
-# to the Dart VM binary.
-
-import subprocess
-import sys
-
-def run_command(command):
-  try:
-    subprocess.check_output(command, stderr=subprocess.STDOUT)
-    return 0
-  except subprocess.CalledProcessError as e:
-    return ("Command failed: " + ' '.join(command) + "\n" +
-            "output: " + e.output)
-
-def main(argv):
-  if len(argv) < 2:
-    print "Requires path to Dart VM binary as first argument"
-    return -1
-  result = run_command(argv[1:])
-  if result != 0:
-    print result
-    return -1
-  return 0
-
-if __name__ == '__main__':
-    sys.exit(main(sys.argv))
diff --git a/tools/gn.py b/tools/gn.py
index 0a385f3..2ff3bc2 100755
--- a/tools/gn.py
+++ b/tools/gn.py
@@ -87,8 +87,14 @@
   gn_args['dart_use_tcmalloc'] = (gn_args['target_os'] == 'linux'
                                   and not args.asan)
 
-  if gn_args['target_cpu'].startswith('arm'):
+  # Force -mfloat-abi=hard and -mfpu=neon on Linux as we're specifying
+  # a gnueabihf compiler in //build/toolchain/linux BUILD.gn.
+  # TODO(zra): This will likely need some adjustment to build for armv6 etc.
+  hard_float = (gn_args['target_cpu'].startswith('arm') and
+                gn_args['target_os'] == 'linux')
+  if hard_float:
     gn_args['arm_float_abi'] = 'hard'
+    gn_args['arm_use_neon'] = True
 
   gn_args['is_debug'] = mode == 'debug'
   gn_args['is_release'] = mode == 'release'
diff --git a/tools/gypi_to_gn.py b/tools/gypi_to_gn.py
index ca62a12..7cb1190 100755
--- a/tools/gypi_to_gn.py
+++ b/tools/gypi_to_gn.py
@@ -3,9 +3,9 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-"""Converts a given gypi file to a python scope and writes the result to stdout.
+"""Converts given gypi files to a python scope and writes the result to stdout.
 
-It is assumed that the file contains a toplevel dictionary, and this script
+It is assumed that the files contain a toplevel dictionary, and this script
 will return that dictionary as a GN "scope" (see example below). This script
 does not know anything about GYP and it will not expand variables or execute
 conditions.
@@ -22,10 +22,11 @@
   }
 
 You would call it like this:
+  gypi_files = [ "your_file.gypi", "your_other_file.gypi" ]
   gypi_values = exec_script("//build/gypi_to_gn.py",
-                            [ rebase_path("your_file.gypi") ],
+                            [ rebase_path(gypi_files) ],
                             "scope",
-                            [ "your_file.gypi" ])
+                            [ gypi_files ])
 
 Notes:
  - The rebase_path call converts the gypi file from being relative to the
@@ -41,14 +42,14 @@
 
 Read the values into a target like this:
   component("mycomponent") {
-    sources = gypi_values.sources
-    defines = gypi_values.defines
+    sources = gypi_values.your_file_sources
+    defines = gypi_values.your_file_defines
   }
 
 Sometimes your .gypi file will include paths relative to a different
 directory than the current .gn file. In this case, you can rebase them to
 be relative to the current directory.
-  sources = rebase_path(gypi_values.sources, ".",
+  sources = rebase_path(gypi_values.your_files_sources, ".",
                         "//path/gypi/input/values/are/relative/to")
 
 This script will tolerate a 'variables' in the toplevel dictionary or not. If
@@ -73,6 +74,7 @@
 import gn_helpers
 from optparse import OptionParser
 import sys
+import os.path
 
 def LoadPythonDictionary(path):
   file_string = open(path).read()
@@ -105,30 +107,6 @@
   return file_data
 
 
-def ReplaceSubstrings(values, search_for, replace_with):
-  """Recursively replaces substrings in a value.
-
-  Replaces all substrings of the "search_for" with "repace_with" for all
-  strings occurring in "values". This is done by recursively iterating into
-  lists as well as the keys and values of dictionaries."""
-  if isinstance(values, str):
-    return values.replace(search_for, replace_with)
-
-  if isinstance(values, list):
-    return [ReplaceSubstrings(v, search_for, replace_with) for v in values]
-
-  if isinstance(values, dict):
-    # For dictionaries, do the search for both the key and values.
-    result = {}
-    for key, value in values.items():
-      new_key = ReplaceSubstrings(key, search_for, replace_with)
-      new_value = ReplaceSubstrings(value, search_for, replace_with)
-      result[new_key] = new_value
-    return result
-
-  # Assume everything else is unchanged.
-  return values
-
 def KeepOnly(values, filters):
   """Recursively filters out strings not ending in "f" from "values"""
 
@@ -147,37 +125,41 @@
 
 def main():
   parser = OptionParser()
-  parser.add_option("-r", "--replace", action="append",
-    help="Replaces substrings. If passed a=b, replaces all substrs a with b.")
   parser.add_option("-k", "--keep_only", default = [], action="append",
     help="Keeps only files ending with the listed strings.")
+  parser.add_option("--prefix", action="store_true",
+    help="Prefix variables with base name")
   (options, args) = parser.parse_args()
 
-  if len(args) != 1:
-    raise Exception("Need one argument which is the .gypi file to read.")
+  if len(args) < 1:
+    raise Exception("Need at least one .gypi file to read.")
 
-  data = LoadPythonDictionary(args[0])
-  if options.replace:
-    # Do replacements for all specified patterns.
-    for replace in options.replace:
-      split = replace.split('=')
-      # Allow "foo=" to replace with nothing.
-      if len(split) == 1:
-        split.append('')
-      assert len(split) == 2, "Replacement must be of the form 'key=value'."
-      data = ReplaceSubstrings(data, split[0], split[1])
+  data = {}
 
-  if options.keep_only != []:
-    data = KeepOnly(data, options.keep_only)
+  for gypi in args:
+    gypi_data = LoadPythonDictionary(gypi)
 
-  # Sometimes .gypi files use the GYP syntax with percents at the end of the
-  # variable name (to indicate not to overwrite a previously-defined value):
-  #   'foo%': 'bar',
-  # Convert these to regular variables.
-  for key in data:
-    if len(key) > 1 and key[len(key) - 1] == '%':
-      data[key[:-1]] = data[key]
-      del data[key]
+    if options.keep_only != []:
+      gypi_data = KeepOnly(gypi_data, options.keep_only)
+
+    # Sometimes .gypi files use the GYP syntax with percents at the end of the
+    # variable name (to indicate not to overwrite a previously-defined value):
+    #   'foo%': 'bar',
+    # Convert these to regular variables.
+    for key in gypi_data:
+      if len(key) > 1 and key[len(key) - 1] == '%':
+        gypi_data[key[:-1]] = gypi_data[key]
+        del gypi_data[key]
+    gypi_name = os.path.basename(gypi)[:-len(".gypi")]
+    for key in gypi_data:
+      if options.prefix:
+        # Prefix all variables from this gypi file with the name to disambiguate
+        data[gypi_name + "_" + key] = gypi_data[key]
+      elif key in data:
+        for entry in gypi_data[key]:
+            data[key].append(entry)
+      else:
+        data[key] = gypi_data[key]
 
   print gn_helpers.ToGNString(data)
 
diff --git a/tools/process_gypis.py b/tools/process_gypis.py
new file mode 100755
index 0000000..b74ce2c
--- /dev/null
+++ b/tools/process_gypis.py
@@ -0,0 +1,69 @@
+#!/usr/bin/env python
+# Copyright 2016, 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 gn_helpers
+import os.path
+import sys
+
+# Given a list of dart package names read in the set of runtime and sdk library
+# sources into variables in a gn scope.
+
+
+def LoadPythonDictionary(path):
+  file_string = open(path).read()
+  try:
+    file_data = eval(file_string, {'__builtins__': None}, None)
+  except SyntaxError, e:
+    e.filename = path
+    raise
+  except Exception, e:
+    raise Exception('Unexpected error while reading %s: %s' %
+                    (path, str(e)))
+
+  assert isinstance(
+    file_data, dict), '%s does not eval to a dictionary' % path
+  return file_data
+
+
+def main():
+  dart_root_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+  runtime_dir = os.path.join(dart_root_dir, 'runtime')
+  runtime_lib_dir = os.path.join(runtime_dir, 'lib')
+  sdk_lib_dir = os.path.join(dart_root_dir, 'sdk', 'lib')
+  libs = sys.argv[1:]
+  data = {}
+  data['allsources'] = []
+
+  for lib in libs:
+    runtime_path = os.path.join(runtime_lib_dir, lib + '_sources.gypi')
+    sdk_path = os.path.join(sdk_lib_dir, lib, lib + '_sources.gypi')
+    runtime_dict = LoadPythonDictionary(runtime_path)
+    for source in runtime_dict['sources']:
+      data['allsources'].append(source)
+    data[lib + '_runtime_sources'] = runtime_dict['sources']
+    sdk_dict = LoadPythonDictionary(sdk_path)
+    data[lib + '_sdk_sources'] = sdk_dict['sources']
+
+  vm_sources_path = os.path.join(runtime_dir, 'vm', 'vm_sources.gypi')
+  vm_sources_dict = LoadPythonDictionary(vm_sources_path)
+  data['vm_sources'] = vm_sources_dict['sources']
+
+  platform_sources_base = os.path.join(runtime_dir, 'platform', 'platform_')
+  platform_headers_dict = LoadPythonDictionary(
+      platform_sources_base + 'headers.gypi')
+  platform_sources_dict = LoadPythonDictionary(
+      platform_sources_base + 'sources.gypi')
+  data['platform_sources'] = platform_headers_dict[
+      'sources'] + platform_sources_dict['sources']
+
+  bin_io_sources_path = os.path.join(runtime_dir, 'bin', 'io_sources.gypi')
+  bin_io_sources_dict = LoadPythonDictionary(bin_io_sources_path)
+  data['bin_io_sources'] = bin_io_sources_dict['sources']
+
+  print gn_helpers.ToGNString(data)
+  return 0
+
+if __name__ == '__main__':
+  sys.exit(main())
diff --git a/utils/analysis_server/BUILD.gn b/utils/analysis_server/BUILD.gn
index 032a086..9359e2c 100644
--- a/utils/analysis_server/BUILD.gn
+++ b/utils/analysis_server/BUILD.gn
@@ -2,7 +2,7 @@
 # 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("../invoke_dart.gni")
+import("../application_snapshot.gni")
 
 application_snapshot("analysis_server") {
   main_dart = "../../pkg/analysis_server/bin/server.dart"
diff --git a/utils/application_snapshot.gni b/utils/application_snapshot.gni
new file mode 100644
index 0000000..0f36737
--- /dev/null
+++ b/utils/application_snapshot.gni
@@ -0,0 +1,51 @@
+# Copyright (c) 2016, 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("//build/compiled_action.gni")
+
+_dart_root = rebase_path("..")
+
+template("application_snapshot") {
+  assert(defined(invoker.main_dart), "Must specify 'main_dart'")
+  assert(defined(invoker.training_args), "Must specify 'training_args'")
+  main_dart = invoker.main_dart
+  training_args = invoker.training_args
+  name = target_name
+  if (defined(invoker.name)) {
+    name = invoker.name
+  }
+  extra_deps = []
+  if (defined(invoker.deps)) {
+    extra_deps += invoker.deps
+  }
+  extra_inputs = []
+  if (defined(invoker.inputs)) {
+    extra_inputs += invoker.inputs
+  }
+  compiled_action(target_name) {
+    tool = get_path_info("$_dart_root/runtime/bin:dart", "abspath")
+    deps = extra_deps + [ "$_dart_root/pkg:pkg_files_stamp" ]
+
+    inputs = extra_inputs + [
+               "$_dart_root/sdk/lib/_internal/sdk_library_metadata/lib/libraries.dart",
+               "$root_gen_dir/pkg_files.stamp",
+             ]
+
+    output = "$root_gen_dir/$name.dart.snapshot"
+    outputs = [
+      output,
+    ]
+
+    dot_packages = rebase_path("$_dart_root/.packages")
+    abs_output = rebase_path(output)
+    main_file = rebase_path(main_dart)
+
+    args = [
+             "--packages=$dot_packages",
+             "--snapshot=$abs_output",
+             "--snapshot-kind=app-jit",
+             main_file,
+           ] + training_args
+  }
+}
diff --git a/utils/compiler/BUILD.gn b/utils/compiler/BUILD.gn
index e13cea2..c0e428d 100644
--- a/utils/compiler/BUILD.gn
+++ b/utils/compiler/BUILD.gn
@@ -2,8 +2,9 @@
 # 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("//build/compiled_action.gni")
 import("../create_timestamp.gni")
-import("../invoke_dart.gni")
+import("../application_snapshot.gni")
 
 create_timestamp_file("dart2js_files_stamp") {
   path = rebase_path("../../pkg/compiler/lib")
@@ -20,7 +21,8 @@
   output = "$target_gen_dir/dartdoc_files.stamp"
 }
 
-invoke_dart("dart2js_create_snapshot_entries") {
+compiled_action("dart2js_create_snapshot_entries") {
+  tool = "../../runtime/bin:dart"
   deps = [
     ":dart2js_files_stamp",
     ":dartdoc_files_stamp",
diff --git a/utils/dartanalyzer/BUILD.gn b/utils/dartanalyzer/BUILD.gn
index e4d4a62..dbefeec 100644
--- a/utils/dartanalyzer/BUILD.gn
+++ b/utils/dartanalyzer/BUILD.gn
@@ -2,7 +2,8 @@
 # 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("../invoke_dart.gni")
+import("//build/compiled_action.gni")
+import("../application_snapshot.gni")
 
 group("dartanalyzer") {
   deps = [
@@ -37,7 +38,8 @@
   assert(defined(invoker.type), "Must specify the summary type")
   type = invoker.type
   assert(type == "spec" || type == "strong")
-  invoke_dart(target_name) {
+  compiled_action(target_name) {
+    tool = "../../runtime/bin:dart"
     inputs = sdk_lib_files + analyzer_files
 
     output = "$root_gen_dir/$type.sum"
diff --git a/utils/dartdevc/BUILD.gn b/utils/dartdevc/BUILD.gn
index 34aaf88..0c93423 100644
--- a/utils/dartdevc/BUILD.gn
+++ b/utils/dartdevc/BUILD.gn
@@ -2,7 +2,7 @@
 # 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("../invoke_dart.gni")
+import("../application_snapshot.gni")
 
 application_snapshot("dartdevc") {
   main_dart = "../../pkg/dev_compiler/bin/dartdevc.dart"
diff --git a/utils/dartdoc/BUILD.gn b/utils/dartdoc/BUILD.gn
index d7fa984..6abdc9a 100644
--- a/utils/dartdoc/BUILD.gn
+++ b/utils/dartdoc/BUILD.gn
@@ -2,7 +2,7 @@
 # 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("../invoke_dart.gni")
+import("../application_snapshot.gni")
 
 application_snapshot("dartdoc") {
   main_dart = "../../third_party/pkg/dartdoc/bin/dartdoc.dart"
diff --git a/utils/dartfmt/BUILD.gn b/utils/dartfmt/BUILD.gn
index bb875f0..41c5bc4 100644
--- a/utils/dartfmt/BUILD.gn
+++ b/utils/dartfmt/BUILD.gn
@@ -2,7 +2,7 @@
 # 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("../invoke_dart.gni")
+import("../application_snapshot.gni")
 
 application_snapshot("dartfmt") {
   main_dart = "../../third_party/pkg_tested/dart_style/bin/format.dart"
diff --git a/utils/invoke_dart.gni b/utils/invoke_dart.gni
deleted file mode 100644
index bc4747a..0000000
--- a/utils/invoke_dart.gni
+++ /dev/null
@@ -1,90 +0,0 @@
-# Copyright (c) 2016, 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.
-
-_dart_root = rebase_path("..")
-
-if (defined(is_win) && is_win) {
-  dart_executable_suffix = ".exe"
-} else {
-  dart_executable_suffix = ""
-}
-
-template("invoke_dart") {
-  assert(defined(invoker.outputs), "invoke_dart must specify outputs")
-  extra_deps = []
-  if (defined(invoker.deps)) {
-    extra_deps += invoker.deps
-  }
-
-  extra_inputs = []
-  if (defined(invoker.inputs)) {
-    extra_inputs += invoker.inputs
-  }
-
-  extra_args = []
-  if (defined(invoker.args)) {
-    extra_args += invoker.args
-  }
-
-  action(target_name) {
-    relative_dart_root = rebase_path(_dart_root, ".")
-    deps =
-        extra_deps + [ "$relative_dart_root/runtime/bin:dart($host_toolchain)" ]
-
-    dart_out_dir =
-        get_label_info("$relative_dart_root/runtime/bin:dart($host_toolchain)",
-                       "root_out_dir")
-    dart = rebase_path("$dart_out_dir/dart$dart_executable_suffix")
-
-    inputs = [ dart ] + extra_inputs
-
-    outputs = invoker.outputs
-
-    script = "$_dart_root/tools/dart_for_gn.py"
-    args = [ dart ] + extra_args
-  }
-}
-
-template("application_snapshot") {
-  assert(defined(invoker.main_dart), "Must specify 'main_dart'")
-  assert(defined(invoker.training_args), "Must specify 'training_args'")
-  main_dart = invoker.main_dart
-  training_args = invoker.training_args
-  name = target_name
-  if (defined(invoker.name)) {
-    name = invoker.name
-  }
-  extra_deps = []
-  if (defined(invoker.deps)) {
-    extra_deps += invoker.deps
-  }
-  extra_inputs = []
-  if (defined(invoker.inputs)) {
-    extra_inputs += invoker.inputs
-  }
-  invoke_dart(target_name) {
-    deps = extra_deps + [ "$_dart_root/pkg:pkg_files_stamp" ]
-
-    inputs = extra_inputs + [
-               "$_dart_root/sdk/lib/_internal/sdk_library_metadata/lib/libraries.dart",
-               "$root_gen_dir/pkg_files.stamp",
-             ]
-
-    output = "$root_gen_dir/$name.dart.snapshot"
-    outputs = [
-      output,
-    ]
-
-    dot_packages = rebase_path("$_dart_root/.packages")
-    abs_output = rebase_path(output)
-    main_file = rebase_path(main_dart)
-
-    args = [
-             "--packages=$dot_packages",
-             "--snapshot=$abs_output",
-             "--snapshot-kind=app-jit",
-             main_file,
-           ] + training_args
-  }
-}
diff --git a/utils/pub/BUILD.gn b/utils/pub/BUILD.gn
index d1238cd..82669cb 100644
--- a/utils/pub/BUILD.gn
+++ b/utils/pub/BUILD.gn
@@ -2,7 +2,7 @@
 # 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("../invoke_dart.gni")
+import("../application_snapshot.gni")
 
 application_snapshot("pub") {
   main_dart = "../../third_party/pkg/pub/bin/pub.dart"
