Version 2.13.0-204.0.dev

Merge commit 'a6ffc74a4a6b75e20968b42ad2d19fc07a5b1e82' into 'dev'
diff --git a/.dart_tool/package_config.json b/.dart_tool/package_config.json
index f0139e4..1f1e5dc 100644
--- a/.dart_tool/package_config.json
+++ b/.dart_tool/package_config.json
@@ -11,7 +11,7 @@
     "constraint, update this by running tools/generate_package_config.dart."
   ],
   "configVersion": 2,
-  "generated": "2021-03-29T21:48:35.411283",
+  "generated": "2021-04-05T08:58:24.237896",
   "generator": "tools/generate_package_config.dart",
   "packages": [
     {
@@ -443,12 +443,6 @@
       "languageVersion": "2.2"
     },
     {
-      "name": "mustache",
-      "rootUri": "../third_party/pkg/mustache",
-      "packageUri": "lib/",
-      "languageVersion": "2.0"
-    },
-    {
       "name": "native_stack_traces",
       "rootUri": "../pkg/native_stack_traces",
       "packageUri": "lib/",
diff --git a/DEPS b/DEPS
index 8c93fae..f2572e7 100644
--- a/DEPS
+++ b/DEPS
@@ -102,7 +102,7 @@
 
   "chromedriver_tag": "83.0.4103.39",
   "browser_launcher_rev": "12ab9f351a44ac803de9bc17bb2180bb312a9dd7",
-  "dartdoc_rev" : "e2d010ed74059be942a78ced5f35f1b8d667ed16",
+  "dartdoc_rev" : "505f163f7cb48e917503e4a23fbff1227e08b263",
   "ffi_rev": "f3346299c55669cc0db48afae85b8110088bf8da",
   "fixnum_rev": "16d3890c6dc82ca629659da1934e412292508bba",
   "file_rev": "0e09370f581ab6388d46fda4cdab66638c0171a1",
@@ -126,7 +126,6 @@
   "matcher_rev": "1f7b6f0cb15eb6659a1de0513571575a5c8a51d0",
   "mime_rev": "c931f4bed87221beaece356494b43731445ce7b8",
   "mockito_rev": "d39ac507483b9891165e422ec98d9fb480037c8b",
-  "mustache_rev": "664737ecad027e6b96d0d1e627257efa0e46fcb1",
   "oauth2_rev": "7cd3284049fe5badbec9f2bea2afc41d14c01057",
   "package_config_rev": "a84c0d45401f215fbe9384df923a38f4022a3c45",
   "path_rev": "407ab76187fade41c31e39c745b39661b710106c",
@@ -379,10 +378,6 @@
       Var("dart_git") + "mime.git" + "@" + Var("mime_rev"),
   Var("dart_root") + "/third_party/pkg/mockito":
       Var("dart_git") + "mockito.git" + "@" + Var("mockito_rev"),
-  Var("dart_root") + "/third_party/pkg/mustache":
-      Var("dart_git")
-      + "external/github.com/xxgreg/mustache"
-      + "@" + Var("mustache_rev"),
   Var("dart_root") + "/third_party/pkg/oauth2":
       Var("dart_git") + "oauth2.git" + "@" + Var("oauth2_rev"),
   Var("dart_root") + "/third_party/pkg_tested/package_config":
diff --git a/pkg/analysis_server/lib/plugin/edit/fix/fix_dart.dart b/pkg/analysis_server/lib/plugin/edit/fix/fix_dart.dart
index 50658b4..4792bed 100644
--- a/pkg/analysis_server/lib/plugin/edit/fix/fix_dart.dart
+++ b/pkg/analysis_server/lib/plugin/edit/fix/fix_dart.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'package:analysis_server/plugin/edit/fix/fix_core.dart';
 import 'package:analysis_server/src/services/correction/fix/dart/top_level_declarations.dart';
 import 'package:analyzer/dart/analysis/results.dart';
diff --git a/pkg/analysis_server/lib/src/lsp/client_configuration.dart b/pkg/analysis_server/lib/src/lsp/client_configuration.dart
index fb2fa13..26ad2d0 100644
--- a/pkg/analysis_server/lib/src/lsp/client_configuration.dart
+++ b/pkg/analysis_server/lib/src/lsp/client_configuration.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 /// Wraps the client (editor) configuration to provide stronger typing and
 /// handling of default values where a setting has not been supplied.
 class LspClientConfiguration {
diff --git a/pkg/analysis_server/lib/src/lsp/dartdoc.dart b/pkg/analysis_server/lib/src/lsp/dartdoc.dart
index cc8f07f..fb84180 100644
--- a/pkg/analysis_server/lib/src/lsp/dartdoc.dart
+++ b/pkg/analysis_server/lib/src/lsp/dartdoc.dart
@@ -2,13 +2,11 @@
 // 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 = 2.9
-
 final _dartdocCodeBlockSections = RegExp(r'(```\w+) +\w+');
 final _dartdocDirectives =
     RegExp(r'(\n *{@.*?}$)|(^{@.*?}\n)', multiLine: true);
 
-String cleanDartdoc(String doc) {
+String? cleanDartdoc(String? doc) {
   if (doc == null) {
     return null;
   }
@@ -19,7 +17,7 @@
   // docs contain.
   doc = doc.replaceAllMapped(
     _dartdocCodeBlockSections,
-    (match) => match.group(1),
+    (match) => match.group(1)!,
   );
 
   return doc;
diff --git a/pkg/analysis_server/lib/src/lsp/json_parsing.dart b/pkg/analysis_server/lib/src/lsp/json_parsing.dart
index 412c96c..f396dde 100644
--- a/pkg/analysis_server/lib/src/lsp/json_parsing.dart
+++ b/pkg/analysis_server/lib/src/lsp/json_parsing.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:collection';
 
 final nullLspJsonReporter = _NullLspJsonReporter();
@@ -18,13 +16,13 @@
   /// being validated.
   final ListQueue<String> path = ListQueue<String>();
 
-  LspJsonReporter([String initialField]) {
+  LspJsonReporter([String? initialField]) {
     if (initialField != null) {
       path.add(initialField);
     }
   }
 
-  /// Pops the last field off the stack to become the current gield.
+  /// Pops the last field off the stack to become the current field.
   void pop() => path.removeLast();
 
   /// Pushes the current field onto a stack to allow reporting errors in child
diff --git a/pkg/analysis_server/lib/src/server/crash_reporting_attachments.dart b/pkg/analysis_server/lib/src/server/crash_reporting_attachments.dart
index 790ccab..0648968 100644
--- a/pkg/analysis_server/lib/src/server/crash_reporting_attachments.dart
+++ b/pkg/analysis_server/lib/src/server/crash_reporting_attachments.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'package:analyzer/instrumentation/service.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart' show ExceptionResult;
 
diff --git a/pkg/analysis_server/lib/src/server/diagnostic_server.dart b/pkg/analysis_server/lib/src/server/diagnostic_server.dart
index 7d5586a..4a0a27a0 100644
--- a/pkg/analysis_server/lib/src/server/diagnostic_server.dart
+++ b/pkg/analysis_server/lib/src/server/diagnostic_server.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 /// A handle to start, and return the current port of, a diagnostic server.
 abstract class DiagnosticServer {
   /// Return the port of the diagnostic web server. If the server is not running
diff --git a/pkg/analysis_server/lib/src/server/features.dart b/pkg/analysis_server/lib/src/server/features.dart
index 65668bd..fd02aa1 100644
--- a/pkg/analysis_server/lib/src/server/features.dart
+++ b/pkg/analysis_server/lib/src/server/features.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 /// The set of features enabled in a server session.
 ///
 /// When some features are not enabled, the server might avoid doing work
diff --git a/pkg/analysis_server/lib/src/server/sdk_configuration.dart b/pkg/analysis_server/lib/src/server/sdk_configuration.dart
index b2ac8bf..c296772 100644
--- a/pkg/analysis_server/lib/src/server/sdk_configuration.dart
+++ b/pkg/analysis_server/lib/src/server/sdk_configuration.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:convert';
 import 'dart:io';
 
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/relevance_tables.g.dart b/pkg/analysis_server/lib/src/services/completion/dart/relevance_tables.g.dart
index 22f1ab7..d3b69d7 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/relevance_tables.g.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/relevance_tables.g.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-//
 // This file has been automatically generated. Please do not edit it manually.
 // To regenerate the file, use the script
 // "pkg/analysis_server/tool/completion_metrics/relevance_table_generator.dart",
diff --git a/pkg/analysis_server/lib/src/services/completion/filtering/fuzzy_matcher.dart b/pkg/analysis_server/lib/src/services/completion/filtering/fuzzy_matcher.dart
index 765c39a..3b3b71d 100644
--- a/pkg/analysis_server/lib/src/services/completion/filtering/fuzzy_matcher.dart
+++ b/pkg/analysis_server/lib/src/services/completion/filtering/fuzzy_matcher.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:math' as math;
 
 /// Character role in a candidate string.
@@ -85,10 +83,12 @@
   MatchStyle matchStyle;
 
   /// The lowercase version of the pattern.
-  String patternLower;
+  // Initialized in the constructor.
+  String patternLower = '';
 
   /// The first three characters of the lowercase version of the pattern.
-  String patternShort;
+  // Initialized in the constructor.
+  String patternShort = '';
 
   /// The length of the last matched candidate.
   int lastCandidateLen = 0;
@@ -109,24 +109,27 @@
   ///
   /// The zero bit of the score value keeps track of where we came from (1 if
   /// the previous character matched, and 0 otherwise).
-  List<List<int>> table;
+  List<List<int>> table = [];
 
   /// The offset of the "previous symbol matched" table on the pattern axis.
-  int matchesLayerOffset;
+  // Initialized in the constructor.
+  int matchesLayerOffset = 0;
 
   /// Pre-allocated memory for storing the role of each character in the
   /// candidate string.
   List<CharRole> candidateRoles = List.filled(maxInputSize, CharRole.NONE);
 
   /// The role of each character in the pattern.
-  List<CharRole> patternRoles;
+  List<CharRole> patternRoles = [];
 
   /// A flag indicating whether scoring should be case-sensitive. Mix-case
   /// patterns turn on case-sensitive scoring.
-  bool caseSensitive;
+  // Initialized in the constructor.
+  bool caseSensitive = false;
 
   /// Normalizes scores for the pattern length.
-  double scoreScale;
+  // Initialized in the constructor.
+  double scoreScale = 0.0;
 
   /// Initialize a newly created matcher to match the [pattern] using the given
   /// [matchStyle].
@@ -143,7 +146,6 @@
     }
     matchesLayerOffset = pattern.length + 1;
 
-    table = [];
     for (var i = 0; i <= maxInputSize; i++) {
       table.add(List.filled(2 * matchesLayerOffset, 0));
     }
diff --git a/pkg/analysis_server/test/integration/analysis/navigation_test.dart b/pkg/analysis_server/test/integration/analysis/navigation_test.dart
index 7d217d2..23f6e7c 100644
--- a/pkg/analysis_server/test/integration/analysis/navigation_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/navigation_test.dart
@@ -116,7 +116,7 @@
     checkLocal('function(() => localVariable.field)',
         'function(FunctionTypeAlias parameter)', ElementKind.FUNCTION);
     checkLocal('FunctionTypeAlias parameter', 'FunctionTypeAlias();',
-        ElementKind.FUNCTION_TYPE_ALIAS);
+        ElementKind.TYPE_ALIAS);
     checkLocal('field)', 'field = (', ElementKind.GETTER);
     checkRemote("'dart:async'", r'async\.dart$', ElementKind.LIBRARY);
     checkLocal(
diff --git a/pkg/analysis_server/test/integration/coverage_test.dart b/pkg/analysis_server/test/integration/coverage_test.dart
index db49f18..73caa7a 100644
--- a/pkg/analysis_server/test/integration/coverage_test.dart
+++ b/pkg/analysis_server/test/integration/coverage_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:io';
 
 import 'package:analyzer_plugin/src/utilities/string_utilities.dart';
diff --git a/pkg/analysis_server/test/integration/execution/delete_context_test.dart b/pkg/analysis_server/test/integration/execution/delete_context_test.dart
index 4087c06..121ba2e 100644
--- a/pkg/analysis_server/test/integration/execution/delete_context_test.dart
+++ b/pkg/analysis_server/test/integration/execution/delete_context_test.dart
@@ -18,13 +18,12 @@
   Future<void> test_delete() async {
     var pathname = sourcePath('lib/main.dart');
     writeFile(pathname, '// dummy');
-    writeFile(sourcePath('.packages'), 'foo:lib/');
     standardAnalysisSetup();
 
     var contextId = (await sendExecutionCreateContext(sourceDirectory.path)).id;
 
     var result =
-        await sendExecutionMapUri(contextId, uri: 'package:foo/main.dart');
+        await sendExecutionMapUri(contextId, uri: 'package:test/main.dart');
     expect(result.file, pathname);
 
     expect(await sendExecutionDeleteContext(contextId), isNull);
@@ -32,7 +31,7 @@
     // After the delete, expect this to fail.
     try {
       result =
-          await sendExecutionMapUri(contextId, uri: 'package:foo/main.dart');
+          await sendExecutionMapUri(contextId, uri: 'package:test/main.dart');
       fail('expected exception after context delete');
     } on ServerErrorMessage catch (message) {
       expect(message.error['code'], 'INVALID_PARAMETER');
diff --git a/pkg/analysis_server/test/integration/execution/map_uri_test.dart b/pkg/analysis_server/test/integration/execution/map_uri_test.dart
index a5a200b..e98032f 100644
--- a/pkg/analysis_server/test/integration/execution/map_uri_test.dart
+++ b/pkg/analysis_server/test/integration/execution/map_uri_test.dart
@@ -18,20 +18,19 @@
   Future<void> test_mapUri() async {
     var pathname = sourcePath('lib/main.dart');
     writeFile(pathname, '// dummy');
-    writeFile(sourcePath('.packages'), 'foo:lib/');
     standardAnalysisSetup();
 
     var contextId = (await sendExecutionCreateContext(sourceDirectory.path)).id;
 
     {
       var result =
-          await sendExecutionMapUri(contextId, uri: 'package:foo/main.dart');
+          await sendExecutionMapUri(contextId, uri: 'package:test/main.dart');
       expect(result.file, pathname);
     }
 
     {
       var result = await sendExecutionMapUri(contextId, file: pathname);
-      expect(result.uri, 'package:foo/main.dart');
+      expect(result.uri, 'package:test/main.dart');
     }
   }
 }
diff --git a/pkg/analysis_server/test/integration/kythe/get_kythe_entries_test.dart b/pkg/analysis_server/test/integration/kythe/get_kythe_entries_test.dart
index a4a3a5f..00719b3 100644
--- a/pkg/analysis_server/test/integration/kythe/get_kythe_entries_test.dart
+++ b/pkg/analysis_server/test/integration/kythe/get_kythe_entries_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
diff --git a/pkg/analysis_server/test/integration/kythe/test_all.dart b/pkg/analysis_server/test/integration/kythe/test_all.dart
index f63a340..c50b940 100644
--- a/pkg/analysis_server/test/integration/kythe/test_all.dart
+++ b/pkg/analysis_server/test/integration/kythe/test_all.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'get_kythe_entries_test.dart' as get_kythe_entries_test;
diff --git a/pkg/analysis_server/test/integration/support/integration_tests.dart b/pkg/analysis_server/test/integration/support/integration_tests.dart
index b135280..5b1c58d 100644
--- a/pkg/analysis_server/test/integration/support/integration_tests.dart
+++ b/pkg/analysis_server/test/integration/support/integration_tests.dart
@@ -9,8 +9,10 @@
 
 import 'package:analysis_server/protocol/protocol_constants.dart';
 import 'package:analysis_server/protocol/protocol_generated.dart';
+import 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:path/path.dart';
+import 'package:path/path.dart' as pkg_path;
 import 'package:test/test.dart';
 
 import 'integration_test_methods.dart';
@@ -167,6 +169,7 @@
     sourceDirectory = Directory(Directory.systemTemp
         .createTempSync('analysisServer')
         .resolveSymbolicLinksSync());
+    writeTestPackageConfig();
 
     onAnalysisErrors.listen((AnalysisErrorsParams params) {
       currentAnalysisErrors[params.file] = params.errors;
@@ -256,6 +259,40 @@
     file.writeAsStringSync(contents);
     return file.resolveSymbolicLinksSync();
   }
+
+  void writePackageConfig(
+    String path, {
+    required PackageConfigFileBuilder config,
+  }) {
+    writeFile(
+      path,
+      config.toContent(
+        toUriStr: (path) => '${pkg_path.toUri(path)}',
+      ),
+    );
+  }
+
+  void writeTestPackageConfig({
+    PackageConfigFileBuilder? config,
+    String? languageVersion,
+  }) {
+    if (config == null) {
+      config = PackageConfigFileBuilder();
+    } else {
+      config = config.copy();
+    }
+
+    config.add(
+      name: 'test',
+      rootPath: sourceDirectory.path,
+      languageVersion: languageVersion,
+    );
+
+    writePackageConfig(
+      sourcePath('.dart_tool/package_config.json'),
+      config: config,
+    );
+  }
 }
 
 /// Wrapper class for Matcher which doesn't create the underlying Matcher object
diff --git a/pkg/analysis_server/test/tool/lsp_spec/markdown_test.dart b/pkg/analysis_server/test/tool/lsp_spec/markdown_test.dart
index 6589b50..bf968e7 100644
--- a/pkg/analysis_server/test/tool/lsp_spec/markdown_test.dart
+++ b/pkg/analysis_server/test/tool/lsp_spec/markdown_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'package:test/test.dart';
 
 import '../../../tool/lsp_spec/markdown.dart';
diff --git a/pkg/analysis_server/tool/code_completion/relevance_table_generator.dart b/pkg/analysis_server/tool/code_completion/relevance_table_generator.dart
index 856594d..004c776 100644
--- a/pkg/analysis_server/tool/code_completion/relevance_table_generator.dart
+++ b/pkg/analysis_server/tool/code_completion/relevance_table_generator.dart
@@ -1595,8 +1595,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.
 
-// @dart = 2.9
-//
 // This file has been automatically generated. Please do not edit it manually.
 // To regenerate the file, use the script
 // "pkg/analysis_server/tool/completion_metrics/relevance_table_generator.dart",
diff --git a/pkg/analysis_server/tool/lsp_spec/markdown.dart b/pkg/analysis_server/tool/lsp_spec/markdown.dart
index 70582e0..cf56d33 100644
--- a/pkg/analysis_server/tool/lsp_spec/markdown.dart
+++ b/pkg/analysis_server/tool/lsp_spec/markdown.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 final _methodNamesPattern = RegExp(
     r'''_(?:Notification|Request):?_:?(?:\r?\n)+\* method: ['`](.*?)[`'],?\r?\n''',
     multiLine: true);
@@ -13,7 +11,7 @@
 List<String> extractMethodNames(String spec) {
   return _methodNamesPattern
       .allMatches(spec)
-      .map((m) => m.group(1).trim())
+      .map((m) => m.group(1)!.trim())
       .toList();
 }
 
@@ -22,6 +20,6 @@
 List<String> extractTypeScriptBlocks(String text) {
   return _typeScriptBlockPattern
       .allMatches(text)
-      .map((m) => m.group(1).trim())
+      .map((m) => m.group(1)!.trim())
       .toList();
 }
diff --git a/pkg/analysis_server_client/test/all.dart b/pkg/analysis_server_client/test/all.dart
index d510ab2..bd97ea7 100644
--- a/pkg/analysis_server_client/test/all.dart
+++ b/pkg/analysis_server_client/test/all.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'live_test.dart' as live;
 import 'server_test.dart' as server;
 import 'verify_sorted_test.dart' as verify_sorted;
diff --git a/pkg/analysis_server_client/test/verify_sorted_test.dart b/pkg/analysis_server_client/test/verify_sorted_test.dart
index 6841a86..5a19d51 100644
--- a/pkg/analysis_server_client/test/verify_sorted_test.dart
+++ b/pkg/analysis_server_client/test/verify_sorted_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/services/correction/sort_members.dart';
 import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
 import 'package:analyzer/dart/analysis/results.dart';
diff --git a/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_shared.dart b/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_shared.dart
new file mode 100644
index 0000000..9ae2415
--- /dev/null
+++ b/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_shared.dart
@@ -0,0 +1,966 @@
+// Copyright (c) 2021, 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 = 2.9
+
+library dev_compiler.test.expression_compiler;
+
+import 'package:test/test.dart';
+import 'expression_compiler_e2e_suite.dart';
+
+const simpleClassSource = '''
+extension NumberParsing on String {
+  int parseInt() {
+    return int.parse(this) + 1;
+  }
+}
+
+class C {
+  static int staticField = 1;
+  static int _staticField = 2;
+  static int _unusedStaticField = 3;
+  int field;
+  int _field;
+  int _unusedField = 4;
+
+  C(this.field, this._field) {
+    int y = 1;
+    // Breakpoint: constructorBP
+    var nop;
+  }
+
+  int methodFieldAccess(int x) {
+    // Breakpoint: methodBP
+    var inScope = 1;
+    {
+      var innerInScope = global + staticField + field;
+      // Breakpoint: innerScopeBP
+      var innerNotInScope = 2;
+    }
+    var notInScope = 3;
+    return x + _field + _staticField;
+  }
+
+  Future<int> asyncMethod(int x) async {
+    return x + _field + _staticField;
+  }
+}
+
+int global = 42;
+
+main() {
+  int x = 15;
+  var c = C(5, 6);
+  // Breakpoint: globalFunctionBP
+  c.methodFieldAccess(10);
+}
+''';
+
+void runSharedTests(SetupCompilerOptions setup, TestDriver driver) {
+  group('Expression compiler scope collection tests', () {
+    var source = simpleClassSource;
+
+    setUpAll(() async {
+      await driver.initSource(setup, source);
+    });
+
+    tearDownAll(() async {
+      await driver.cleanupTest();
+    });
+
+    test('local in scope', () async {
+      await driver.check(
+          breakpointId: 'innerScopeBP',
+          expression: 'inScope',
+          expectedResult: '1');
+    });
+
+    test('local in inner scope', () async {
+      await driver.check(
+          breakpointId: 'innerScopeBP',
+          expression: 'innerInScope',
+          expectedResult: '48');
+    });
+
+    test('global in scope', () async {
+      await driver.check(
+          breakpointId: 'innerScopeBP',
+          expression: 'global',
+          expectedResult: '42');
+    });
+
+    test('static field in scope', () async {
+      await driver.check(
+          breakpointId: 'innerScopeBP',
+          expression: 'staticField',
+          expectedResult: '1');
+    });
+
+    test('field in scope', () async {
+      await driver.check(
+          breakpointId: 'innerScopeBP',
+          expression: 'field',
+          expectedResult: '5');
+    });
+
+    test('parameter in scope', () async {
+      await driver.check(
+          breakpointId: 'innerScopeBP', expression: 'x', expectedResult: '10');
+    });
+
+    test('local not in scope', () async {
+      await driver.check(
+          breakpointId: 'innerScopeBP',
+          expression: 'notInScope',
+          expectedError: "Error: The getter 'notInScope' isn't defined for the"
+              " class 'C'.");
+    });
+
+    test('local not in inner scope', () async {
+      await driver.check(
+          breakpointId: 'innerScopeBP',
+          expression: 'innerNotInScope',
+          expectedError:
+              "Error: The getter 'innerNotInScope' isn't defined for the"
+              " class 'C'.");
+    });
+  });
+
+  group('Expression compiler extension symbols tests', () {
+    var source = '''
+        main() {
+          List<int> list = [];
+          list.add(0);
+          // Breakpoint: bp
+        }
+        ''';
+
+    setUpAll(() async {
+      await driver.initSource(setup, source);
+    });
+
+    tearDownAll(() async {
+      await driver.cleanupTest();
+    });
+
+    test('extension symbol used only in expression compilation', () async {
+      await driver.check(
+          breakpointId: 'bp', expression: 'list.first', expectedResult: '0');
+    });
+
+    test('extension symbol used in original compilation', () async {
+      await driver.check(
+          breakpointId: 'bp',
+          expression: '() { list.add(1); return list.last; }()',
+          expectedResult: '1');
+    });
+  });
+
+  group('Expression compiler tests in extension method:', () {
+    var source = '''
+        extension NumberParsing on String {
+          int parseInt() {
+            var ret = int.parse(this);
+            // Breakpoint: bp
+            return ret;
+          }
+        }
+        main() => "1234".parseInt();
+      ''';
+
+    setUpAll(() async {
+      await driver.initSource(setup, source);
+    });
+
+    tearDownAll(() {
+      driver.cleanupTest();
+    });
+
+    test('compilation error', () async {
+      await driver.check(
+          breakpointId: 'bp',
+          expression: 'typo',
+          expectedError: "Error: Getter not found: 'typo'");
+    });
+
+    test('local (trimmed scope)', () async {
+      await driver.check(
+          breakpointId: 'bp', expression: 'ret', expectedResult: '1234');
+    });
+
+    test('this (full scope)', () async {
+      // Note: this currently fails due to
+      // - incremental compiler not mapping 'this' from user input to '#this'
+      // - incremental compiler not allowing #this as a parameter name
+      await driver.check(
+          breakpointId: 'bp',
+          expression: 'this',
+          expectedError: "Error: Expected identifier, but got 'this'");
+    });
+  });
+
+  group('Expression compiler tests in static function:', () {
+    var source = '''
+        int foo(int x, {int y: 0}) {
+          int z = 3;
+          // Breakpoint: bp
+          return x + y + z;
+        }
+
+        main() => foo(1, y: 2);
+        ''';
+
+    setUpAll(() async {
+      await driver.initSource(setup, source);
+    });
+
+    tearDownAll(() {
+      driver.cleanupTest();
+    });
+
+    test('compilation error', () async {
+      await driver.check(
+          breakpointId: 'bp',
+          expression: 'typo',
+          expectedError: "Getter not found: \'typo\'");
+    });
+
+    test('local', () async {
+      await driver.check(
+          breakpointId: 'bp', expression: 'x', expectedResult: '1');
+    });
+
+    test('formal', () async {
+      await driver.check(
+          breakpointId: 'bp', expression: 'y', expectedResult: '2');
+    });
+
+    test('named formal', () async {
+      await driver.check(
+          breakpointId: 'bp', expression: 'z', expectedResult: '3');
+    });
+
+    test('function', () async {
+      await driver
+          .check(breakpointId: 'bp', expression: 'main', expectedResult: '''
+              function main() {
+                return test.foo(1, {y: 2});
+              }''');
+    });
+  });
+
+  group('Expression compiler tests in method:', () {
+    var source = simpleClassSource;
+
+    setUpAll(() async {
+      await driver.initSource(setup, source);
+    });
+
+    tearDownAll(() {
+      driver.cleanupTest();
+    });
+
+    test('compilation error', () async {
+      await driver.check(
+          breakpointId: 'methodBP',
+          expression: 'typo',
+          expectedError: "The getter 'typo' isn't defined for the class 'C'");
+    });
+
+    test('local', () async {
+      await driver.check(
+          breakpointId: 'methodBP', expression: 'x', expectedResult: '10');
+    });
+
+    test('this', () async {
+      await driver.check(
+          breakpointId: 'methodBP',
+          expression: 'this',
+          expectedResult:
+              'test.C.new {Symbol(_unusedField): 4, Symbol(C.field): 5,'
+              ' Symbol(_field): 6}');
+    });
+
+    test('expression using locals', () async {
+      await driver.check(
+          breakpointId: 'methodBP', expression: 'x + 1', expectedResult: '11');
+    });
+
+    test('expression using static fields', () async {
+      await driver.check(
+          breakpointId: 'methodBP',
+          expression: 'x + staticField',
+          expectedResult: '11');
+    });
+
+    test('expression using private static fields', () async {
+      await driver.check(
+          breakpointId: 'methodBP',
+          expression: 'x + _staticField',
+          expectedResult: '12');
+    });
+
+    test('expression using fields', () async {
+      await driver.check(
+          breakpointId: 'methodBP',
+          expression: 'x + field',
+          expectedResult: '15');
+    });
+
+    test('expression using private fields', () async {
+      await driver.check(
+          breakpointId: 'methodBP',
+          expression: 'x + _field',
+          expectedResult: '16');
+    });
+
+    test('expression using globals', () async {
+      await driver.check(
+          breakpointId: 'methodBP',
+          expression: 'x + global',
+          expectedResult: '52');
+    });
+
+    test('expression using fields not referred to in the original  code',
+        () async {
+      await driver.check(
+          breakpointId: 'methodBP',
+          expression: '_unusedField + _unusedStaticField',
+          expectedResult: '7');
+    });
+
+    test('private field modification', () async {
+      await driver.check(
+          breakpointId: 'methodBP',
+          expression: '_field = 2',
+          expectedResult: '2');
+    });
+
+    test('field modification', () async {
+      await driver.check(
+          breakpointId: 'methodBP',
+          expression: 'field = 3',
+          expectedResult: '3');
+    });
+
+    test('private static field modification', () async {
+      await driver.check(
+          breakpointId: 'methodBP',
+          expression: '_staticField = 4',
+          expectedResult: '4');
+    });
+
+    test('static field modification', () async {
+      await driver.check(
+          breakpointId: 'methodBP',
+          expression: 'staticField = 5',
+          expectedResult: '5');
+    });
+  });
+
+  group('Expression compiler tests in global function:', () {
+    var source = simpleClassSource;
+
+    setUpAll(() async {
+      await driver.initSource(setup, source);
+    });
+
+    tearDownAll(() {
+      driver.cleanupTest();
+    });
+
+    test('compilation error', () async {
+      await driver.check(
+          breakpointId: 'globalFunctionBP',
+          expression: 'typo',
+          expectedError: "Getter not found: 'typo'.");
+    });
+
+    test('local with primitive type', () async {
+      await driver.check(
+          breakpointId: 'globalFunctionBP',
+          expression: 'x',
+          expectedResult: '15');
+    });
+
+    test('local object', () async {
+      await driver.check(
+          breakpointId: 'globalFunctionBP',
+          expression: 'c',
+          expectedResult:
+              'test.C.new {Symbol(_unusedField): 4, Symbol(C.field): 5, '
+              'Symbol(_field): 6}');
+    });
+
+    test('create new object', () async {
+      await driver.check(
+          breakpointId: 'globalFunctionBP',
+          expression: 'C(3, 4)',
+          expectedResult:
+              'test.C.new {Symbol(_unusedField): 4, Symbol(C.field): 3, '
+              'Symbol(_field): 4}');
+    });
+
+    test('access field of new object', () async {
+      await driver.check(
+          breakpointId: 'globalFunctionBP',
+          expression: 'C(3, 4)._field',
+          expectedResult: '4');
+    });
+
+    test('access static field', () async {
+      await driver.check(
+          breakpointId: 'globalFunctionBP',
+          expression: 'C.staticField',
+          expectedResult: '1');
+    });
+
+    test('expression using private static fields', () async {
+      await driver.check(
+          breakpointId: 'globalFunctionBP',
+          expression: 'C._staticField',
+          expectedError: "Error: Getter not found: '_staticField'.");
+    });
+
+    test('access field', () async {
+      await driver.check(
+          breakpointId: 'globalFunctionBP',
+          expression: 'c.field',
+          expectedResult: '5');
+    });
+
+    test('access private field', () async {
+      await driver.check(
+          breakpointId: 'globalFunctionBP',
+          expression: 'c._field',
+          expectedResult: '6');
+    });
+
+    test('method call', () async {
+      await driver.check(
+          breakpointId: 'globalFunctionBP',
+          expression: 'c.methodFieldAccess(2)',
+          expectedResult: '10');
+    });
+
+    test('async method call', () async {
+      await driver.check(
+          breakpointId: 'globalFunctionBP',
+          expression: 'c.asyncMethod(2)',
+          expectedResult: '_Future.new {Symbol(_state): 1, '
+              'Symbol(_resultOrListeners): null, '
+              'Symbol(_zone): _RootZone {}');
+    });
+
+    test('extension method call', () async {
+      await driver.check(
+          breakpointId: 'globalFunctionBP',
+          expression: '"1234".parseInt()',
+          expectedResult: '1235');
+    });
+
+    test('private field modification', () async {
+      await driver.check(
+          breakpointId: 'globalFunctionBP',
+          expression: 'c._field = 10',
+          expectedResult: '10');
+    });
+
+    test('field modification', () async {
+      await driver.check(
+          breakpointId: 'globalFunctionBP',
+          expression: 'c._field = 11',
+          expectedResult: '11');
+    });
+
+    test('private static field modification', () async {
+      await driver.check(
+          breakpointId: 'globalFunctionBP',
+          expression: 'C._staticField = 2',
+          expectedError: "Setter not found: '_staticField'.");
+    });
+
+    test('static field modification', () async {
+      await driver.check(
+          breakpointId: 'globalFunctionBP',
+          expression: 'C.staticField = 20',
+          expectedResult: '20');
+    });
+
+    test('call global function from core library', () async {
+      await driver.check(
+          breakpointId: 'globalFunctionBP',
+          expression: 'identical(1, 1)',
+          expectedResult: 'true');
+    });
+  });
+
+  group('Expression compiler tests in constructor:', () {
+    var source = simpleClassSource;
+
+    setUpAll(() async {
+      await driver.initSource(setup, source);
+    });
+
+    tearDownAll(() {
+      driver.cleanupTest();
+    });
+
+    test('compilation error', () async {
+      await driver.check(
+          breakpointId: 'constructorBP',
+          expression: 'typo',
+          expectedError: "The getter 'typo' isn't defined for the class 'C'");
+    });
+
+    test('local', () async {
+      await driver.check(
+          breakpointId: 'constructorBP', expression: 'y', expectedResult: '1');
+    });
+
+    test('this', () async {
+      await driver.check(
+          breakpointId: 'constructorBP',
+          expression: 'this',
+          expectedResult:
+              'test.C.new {Symbol(_unusedField): 4, Symbol(C.field): 5,'
+              ' Symbol(_field): 6}');
+    });
+
+    test('expression using locals', () async {
+      await driver.check(
+          breakpointId: 'constructorBP',
+          expression: 'y + 1',
+          expectedResult: '2');
+    });
+
+    test('expression using static fields', () async {
+      await driver.check(
+          breakpointId: 'constructorBP',
+          expression: 'y + staticField',
+          expectedResult: '2');
+    });
+
+    test('expression using private static fields', () async {
+      await driver.check(
+          breakpointId: 'constructorBP',
+          expression: 'y + _staticField',
+          expectedResult: '3');
+    });
+
+    test('expression using fields', () async {
+      await driver.check(
+          breakpointId: 'constructorBP',
+          expression: 'y + field',
+          expectedResult: '6');
+    });
+
+    test('expression using private fields', () async {
+      await driver.check(
+          breakpointId: 'constructorBP',
+          expression: 'y + _field',
+          expectedResult: '7');
+    });
+
+    test('expression using globals', () async {
+      await driver.check(
+          breakpointId: 'constructorBP',
+          expression: 'y + global',
+          expectedResult: '43');
+    });
+
+    test('method call', () async {
+      await driver.check(
+          breakpointId: 'constructorBP',
+          expression: 'methodFieldAccess(2)',
+          expectedResult: '10');
+    });
+
+    test('async method call', () async {
+      await driver.check(
+          breakpointId: 'constructorBP',
+          expression: 'asyncMethod(2)',
+          expectedResult: '_Future.new {Symbol(_state): 1, '
+              'Symbol(_resultOrListeners): null, '
+              'Symbol(_zone): _RootZone {}');
+    });
+
+    test('extension method call', () async {
+      await driver.check(
+          breakpointId: 'constructorBP',
+          expression: '"1234".parseInt()',
+          expectedResult: '1235');
+    });
+
+    test('private field modification', () async {
+      await driver.check(
+          breakpointId: 'constructorBP',
+          expression: '_field = 2',
+          expectedResult: '2');
+    });
+
+    test('field modification', () async {
+      await driver.check(
+          breakpointId: 'constructorBP',
+          expression: 'field = 2',
+          expectedResult: '2');
+    });
+
+    test('private static field modification', () async {
+      await driver.check(
+          breakpointId: 'constructorBP',
+          expression: '_staticField = 2',
+          expectedResult: '2');
+    });
+
+    test('static field modification', () async {
+      await driver.check(
+          breakpointId: 'constructorBP',
+          expression: 'staticField = 2',
+          expectedResult: '2');
+    });
+  });
+
+  group('Expression compiler tests in async method:', () {
+    var source = '''
+        class C {
+          static int staticField = 1;
+          static int _staticField = 2;
+          int _field;
+          int field;
+
+          C(this.field, this._field);
+          Future<int> asyncMethod(int x) async {
+            // Breakpoint: bp
+            return x + global + _field + field + staticField + _staticField;
+          }
+        }
+
+        Future<int> entrypoint() async {
+          var c = C(5, 7);
+          // Breakpoint: bp1
+          return await c.asyncMethod(1);
+        }
+
+        int global = 42;
+        void main() async {
+          await entrypoint();
+        }
+        ''';
+
+    setUpAll(() async {
+      await driver.initSource(setup, source);
+    });
+
+    tearDownAll(() {
+      driver.cleanupTest();
+    });
+
+    test('compilation error', () async {
+      await driver.check(
+          breakpointId: 'bp',
+          expression: 'typo',
+          expectedError: "The getter 'typo' isn't defined for the class 'C'");
+    });
+
+    test('local', () async {
+      await driver.check(
+          breakpointId: 'bp', expression: 'x', expectedResult: '1');
+    });
+
+    test('this', () async {
+      await driver.check(
+          breakpointId: 'bp',
+          expression: 'this',
+          expectedResult: 'test.C.new {Symbol(C.field): 5, Symbol(_field): 7}');
+    });
+
+    test('awaited method call', () async {
+      await driver.check(
+          breakpointId: 'bp1',
+          expression: 'c.asyncMethod(1)',
+          expectedResult: '_Future.new {Symbol(_state): 1, '
+              'Symbol(_resultOrListeners): null, '
+              'Symbol(_zone): _RootZone {}');
+    }, skip: "'await' is not yet supported in expression evaluation.");
+
+    test('awaited method call', () async {
+      await driver.check(
+          breakpointId: 'bp1',
+          expression: 'await c.asyncMethod(1)',
+          expectedResult: '58');
+    }, skip: "'await' is not yet supported in expression evaluation.");
+  });
+
+  group('Expression compiler tests in closures:', () {
+    var source = '''
+        void globalFunction() {
+        int x = 15;
+
+        var outerClosure = (int y) {
+          var closureCaptureInner = (int z) {
+            // Breakpoint: bp
+            var temp = x + y + z;
+            return;
+          };
+          closureCaptureInner(0);
+        };
+
+        outerClosure(3);
+        return;
+      }
+
+      main() => globalFunction();
+      ''';
+
+    setUpAll(() async {
+      await driver.initSource(setup, source);
+    });
+
+    tearDownAll(() {
+      driver.cleanupTest();
+    });
+
+    test('compilation error', () async {
+      await driver.check(
+          breakpointId: 'bp',
+          expression: 'typo',
+          expectedError: "Getter not found: 'typo'.");
+    });
+
+    test('expression using captured variables', () async {
+      await driver.check(
+          breakpointId: 'bp', expression: r"'$y+$z'", expectedResult: '3+0');
+    });
+
+    test('expression using uncaptured variables', () async {
+      await driver.check(
+          breakpointId: 'bp',
+          expression: r"'$x+$y+$z'",
+          expectedResult: '15+3+0');
+    });
+  });
+
+  group('Expression compiler tests in method with no type use:', () {
+    var source = '''
+        abstract class Key {
+          const factory Key(String value) = ValueKey;
+          const Key.empty();
+        }
+
+        abstract class LocalKey extends Key {
+          const LocalKey() : super.empty();
+        }
+
+        class ValueKey implements LocalKey {
+          const ValueKey(this.value);
+          final String value;
+        }
+
+        class MyClass {
+          const MyClass(this._t);
+          final int _t;
+        }
+
+        int bar(int p) {
+          return p;
+        }
+
+        String baz(String t) {
+          return t;
+        }
+
+        String main() {
+          var k = Key('t');
+          MyClass c = MyClass(0);
+          int p = 1;
+          const t = 1;
+
+          // Breakpoint: bp
+          return '\$c, \$k, \$t';
+        }
+        ''';
+
+    setUpAll(() async {
+      await driver.initSource(setup, source);
+    });
+
+    tearDownAll(() {
+      driver.cleanupTest();
+    });
+
+    test('call function not using type', () async {
+      await driver.check(
+          breakpointId: 'bp', expression: 'bar(p)', expectedResult: '1');
+    });
+
+    test('call function using type', () async {
+      await driver.check(
+          breakpointId: 'bp', expression: "baz('\$p')", expectedResult: '1');
+    });
+
+    test('evaluate new const expression', () async {
+      await driver.check(
+          breakpointId: 'bp',
+          expression: 'const MyClass(1)',
+          expectedResult: 'MyClass {Symbol(MyClass._t): 1}');
+    });
+
+    test('evaluate optimized const expression', () async {
+      await driver.check(
+          breakpointId: 'bp', expression: 't', expectedResult: '1');
+    },
+        skip: 'Cannot compile constants optimized away by the frontend. '
+            'Issue: https://github.com/dart-lang/sdk/issues/41999');
+
+    test('evaluate factory constructor call', () async {
+      await driver.check(
+          breakpointId: 'bp',
+          expression: "Key('t')",
+          expectedResult: 'test.ValueKey.new {Symbol(ValueKey.value): t}');
+    });
+
+    test('evaluate const factory constructor call', () async {
+      await driver.check(
+          breakpointId: 'bp',
+          expression: "const Key('t')",
+          expectedResult: 'ValueKey {Symbol(ValueKey.value): t}');
+    });
+  });
+
+  group('Expression compiler tests in simple loops:', () {
+    var source = '''
+        void globalFunction() {
+          int x = 15;
+          for(int i = 0; i < 10; i++) {
+            // Breakpoint: bp
+            var calculation = '\$i+\$x';
+          };
+        }
+
+        main() => globalFunction();
+        ''';
+
+    setUpAll(() async {
+      await driver.initSource(setup, source);
+    });
+
+    tearDownAll(() {
+      driver.cleanupTest();
+    });
+
+    test('expression using local', () async {
+      await driver.check(
+          breakpointId: 'bp', expression: 'x', expectedResult: '15');
+    });
+
+    test('expression using loop variable', () async {
+      await driver.check(
+          breakpointId: 'bp', expression: 'i', expectedResult: '0');
+    });
+  });
+
+  group('Expression compiler tests in conditional:', () {
+    var source = '''
+        int globalFunction(int x) {
+          if (x == 1) {
+            int y = 3;
+            // Breakpoint: thenBP
+            var calculation = '\$y+\$x';
+          } else {
+            int z = 4;
+            // Breakpoint: elseBP
+            var calculation = '\$z+\$x';
+          }
+          // Breakpoint: postBP
+          return 0;
+        }
+
+        void main() {
+          globalFunction(1);
+          globalFunction(2);
+        }
+        ''';
+
+    setUpAll(() async {
+      await driver.initSource(setup, source);
+    });
+
+    tearDownAll(() {
+      driver.cleanupTest();
+    });
+
+    test('(then) expression using local', () async {
+      await driver.check(
+          breakpointId: 'thenBP', expression: 'y', expectedResult: '3');
+    });
+
+    test('(then) expression using local out of scope', () async {
+      await driver.check(
+          breakpointId: 'thenBP',
+          expression: 'z',
+          expectedError: "Error: Getter not found: 'z'");
+    });
+
+    test('(else) expression using local', () async {
+      await driver.check(
+          breakpointId: 'elseBP', expression: 'z', expectedResult: '4');
+    });
+
+    test('(else) expression using local out of scope', () async {
+      await driver.check(
+          breakpointId: 'elseBP',
+          expression: 'y',
+          expectedError: "Error: Getter not found: 'y'");
+    });
+
+    test('(post) expression using local', () async {
+      await driver.check(
+          breakpointId: 'postBP', expression: 'x', expectedResult: '1');
+    });
+
+    test('(post) expression using local out of scope', () async {
+      await driver.check(
+          breakpointId: 'postBP',
+          expression: 'z',
+          expectedError: "Error: Getter not found: 'z'");
+    });
+
+    test('(post) expression using local out of scope', () async {
+      await driver.check(
+          breakpointId: 'postBP',
+          expression: 'y',
+          expectedError: "Error: Getter not found: 'y'");
+    });
+  });
+
+  group('Expression compiler tests in iterator loops:', () {
+    var source = '''
+        int globalFunction() {
+          var l = <String>['1', '2', '3'];
+
+          for (var e in l) {
+            // Breakpoint: bp
+            var calculation = '\$e';
+          };
+          return 0;
+        }
+
+        main() => globalFunction();
+        ''';
+
+    setUpAll(() async {
+      await driver.initSource(setup, source);
+    });
+
+    tearDownAll(() {
+      driver.cleanupTest();
+    });
+
+    test('expression loop variable', () async {
+      await driver.check(
+          breakpointId: 'bp', expression: 'e', expectedResult: '1');
+    });
+  });
+}
diff --git a/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_sound_test.dart b/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_sound_test.dart
new file mode 100644
index 0000000..f67ae6a9
--- /dev/null
+++ b/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_sound_test.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2021, 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 = 2.9
+
+library dev_compiler.test.expression_compiler;
+
+import 'package:test/test.dart';
+import 'expression_compiler_e2e_shared.dart';
+import 'expression_compiler_e2e_suite.dart';
+
+void main() async {
+  var driver = await TestDriver.init();
+  var setup = SetupCompilerOptions(soundNullSafety: true);
+
+  group('(Sound null safety)', () {
+    tearDownAll(() {
+      driver.finish();
+    });
+
+    runSharedTests(setup, driver);
+  });
+}
diff --git a/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_suite.dart b/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_suite.dart
new file mode 100644
index 0000000..25f75c3
--- /dev/null
+++ b/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_suite.dart
@@ -0,0 +1,603 @@
+// Copyright (c) 2021, 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 = 2.9
+
+library dev_compiler.test.expression_compiler;
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:io' show Directory, File, Platform;
+
+import 'package:browser_launcher/browser_launcher.dart' as browser;
+import 'package:cli_util/cli_util.dart';
+import 'package:dev_compiler/dev_compiler.dart';
+import 'package:dev_compiler/src/compiler/module_builder.dart';
+import 'package:dev_compiler/src/kernel/module_metadata.dart';
+import 'package:front_end/src/api_unstable/ddc.dart' as fe;
+import 'package:front_end/src/compute_platform_binaries_location.dart' as fe;
+import 'package:front_end/src/fasta/incremental_serializer.dart' as fe;
+import 'package:kernel/ast.dart' show Component, Library;
+import 'package:kernel/target/targets.dart';
+import 'package:path/path.dart' as p;
+import 'package:source_maps/parser.dart' as source_maps;
+import 'package:source_maps/source_maps.dart' as source_maps;
+import 'package:test/test.dart';
+import 'package:webkit_inspection_protocol/webkit_inspection_protocol.dart'
+    as wip;
+
+class DevelopmentIncrementalCompiler extends fe.IncrementalCompiler {
+  Uri entryPoint;
+
+  DevelopmentIncrementalCompiler(fe.CompilerOptions options, this.entryPoint,
+      [Uri initializeFrom,
+      bool outlineOnly,
+      fe.IncrementalSerializer incrementalSerializer])
+      : super(
+            fe.CompilerContext(
+                fe.ProcessedOptions(options: options, inputs: [entryPoint])),
+            initializeFrom,
+            outlineOnly,
+            incrementalSerializer);
+
+  DevelopmentIncrementalCompiler.fromComponent(fe.CompilerOptions options,
+      this.entryPoint, Component componentToInitializeFrom,
+      [bool outlineOnly, fe.IncrementalSerializer incrementalSerializer])
+      : super.fromComponent(
+            fe.CompilerContext(
+                fe.ProcessedOptions(options: options, inputs: [entryPoint])),
+            componentToInitializeFrom,
+            outlineOnly,
+            incrementalSerializer);
+}
+
+class SetupCompilerOptions {
+  static final sdkRoot = fe.computePlatformBinariesLocation();
+  static final sdkUnsoundSummaryPath =
+      p.join(sdkRoot.toFilePath(), 'ddc_sdk.dill');
+  static final sdkSoundSummaryPath =
+      p.join(sdkRoot.toFilePath(), 'ddc_outline_sound.dill');
+  static final librariesSpecificationUri =
+      p.join(p.dirname(p.dirname(getSdkPath())), 'libraries.json');
+  static final String dartUnsoundComment = '// @dart = 2.9';
+  static final String dartSoundComment = '//';
+
+  final String dartLangComment;
+  final List<String> errors = [];
+  final List<String> diagnosticMessages = [];
+  final ModuleFormat moduleFormat;
+  final fe.CompilerOptions options;
+  final bool soundNullSafety;
+
+  static fe.CompilerOptions _getOptions(bool soundNullSafety) {
+    var options = fe.CompilerOptions()
+      ..verbose = false // set to true for debugging
+      ..sdkRoot = sdkRoot
+      ..target = DevCompilerTarget(TargetFlags())
+      ..librariesSpecificationUri = p.toUri('sdk/lib/libraries.json')
+      ..omitPlatform = true
+      ..sdkSummary =
+          p.toUri(soundNullSafety ? sdkSoundSummaryPath : sdkUnsoundSummaryPath)
+      ..environmentDefines = const {}
+      ..nnbdMode = soundNullSafety ? fe.NnbdMode.Strong : fe.NnbdMode.Weak;
+    return options;
+  }
+
+  SetupCompilerOptions(
+      {this.soundNullSafety = true, this.moduleFormat = ModuleFormat.amd})
+      : options = _getOptions(soundNullSafety),
+        dartLangComment =
+            soundNullSafety ? dartSoundComment : dartUnsoundComment {
+    options.onDiagnostic = (fe.DiagnosticMessage m) {
+      diagnosticMessages.addAll(m.plainTextFormatted);
+      if (m.severity == fe.Severity.error) {
+        errors.addAll(m.plainTextFormatted);
+      }
+    };
+  }
+}
+
+class TestCompilationResult {
+  final String result;
+  final bool isSuccess;
+
+  TestCompilationResult(this.result, this.isSuccess);
+}
+
+class TestCompiler {
+  final SetupCompilerOptions setup;
+  Component component;
+  ExpressionCompiler evaluator;
+  ModuleMetadata metadata;
+  source_maps.SingleMapping sourceMap;
+
+  TestCompiler(this.setup);
+
+  Future<TestCompiler> init({Uri input, Uri output, Uri packages}) async {
+    // Initialize the incremental compiler and module component.
+    // TODO: extend this for multi-module compilations by storing separate
+    // compilers/components/names per module.
+    setup.options.packagesFileUri = packages;
+    var compiler = DevelopmentIncrementalCompiler(setup.options, input);
+    component = await compiler.computeDelta();
+    component.computeCanonicalNames();
+
+    // Initialize DDC.
+    var moduleName = '${p.basenameWithoutExtension(output.toFilePath())}';
+
+    var classHierarchy = compiler.getClassHierarchy();
+    var compilerOptions = SharedCompilerOptions(
+        replCompile: true,
+        moduleName: moduleName,
+        soundNullSafety: setup.soundNullSafety);
+    var coreTypes = compiler.getCoreTypes();
+
+    final importToSummary = Map<Library, Component>.identity();
+    final summaryToModule = Map<Component, String>.identity();
+    for (var lib in component.libraries) {
+      importToSummary[lib] = component;
+    }
+    summaryToModule[component] = moduleName;
+
+    var kernel2jsCompiler = ProgramCompiler(component, classHierarchy,
+        compilerOptions, importToSummary, summaryToModule,
+        coreTypes: coreTypes);
+    var module = kernel2jsCompiler.emitModule(component);
+
+    // Perform a full compile, writing the compiled JS + sourcemap.
+    var code = jsProgramToCode(
+      module,
+      setup.moduleFormat,
+      inlineSourceMap: true,
+      buildSourceMap: true,
+      emitDebugMetadata: true,
+      jsUrl: '$output',
+      mapUrl: '$output.map',
+      component: component,
+    );
+    metadata = code.metadata;
+    sourceMap = source_maps.SingleMapping.fromJson(code.sourceMap);
+    var codeBytes = utf8.encode(code.code);
+    var sourceMapBytes = utf8.encode(json.encode(code.sourceMap));
+
+    File('${output.toFilePath()}').writeAsBytesSync(codeBytes);
+    File('${output.toFilePath()}.map').writeAsBytesSync(sourceMapBytes);
+
+    // Save the expression evaluator for future evaluations.
+    evaluator = ExpressionCompiler(
+      setup.options,
+      setup.moduleFormat,
+      setup.errors,
+      compiler,
+      kernel2jsCompiler,
+      component,
+    );
+
+    if (setup.errors.isNotEmpty) {
+      throw Exception('Compilation failed with: ${setup.errors}');
+    }
+    setup.diagnosticMessages.clear();
+
+    return this;
+  }
+
+  Future<TestCompilationResult> compileExpression(
+      {Uri input,
+      int line,
+      int column,
+      Map<String, String> scope,
+      String expression}) async {
+    var libraryUri = metadataForLibraryUri(input);
+    var jsExpression = await evaluator.compileExpressionToJs(
+        libraryUri.importUri, line, column, scope, expression);
+    if (setup.errors.isNotEmpty) {
+      jsExpression = setup.errors.toString().replaceAll(
+          RegExp(
+              r'org-dartlang-debug:synthetic_debug_expression:[0-9]*:[0-9]*:'),
+          '');
+
+      return TestCompilationResult(jsExpression, false);
+    }
+
+    return TestCompilationResult(jsExpression, true);
+  }
+
+  LibraryMetadata metadataForLibraryUri(Uri libraryUri) =>
+      metadata.libraries.entries
+          .firstWhere((entry) => entry.value.fileUri == '$libraryUri')
+          .value;
+}
+
+class TestDriver {
+  SetupCompilerOptions setup;
+  String source;
+  Directory chromeDir;
+  Directory testDir;
+  String moduleFormatString;
+  Uri htmlBootstrapper;
+  Uri input;
+  Uri output;
+  Uri packagesFile;
+  browser.Chrome chrome;
+  wip.WipDebugger debugger;
+  wip.WipConnection connection;
+  TestCompiler compiler;
+
+  TestDriver._();
+
+  static Future<TestDriver> init() async {
+    var driver = TestDriver._();
+    await driver.initChrome();
+    return driver;
+  }
+
+  /// Initializes a Chrome browser instance, tab connection, and debugger.
+  ///
+  /// Should be called once after creating TestDriver.
+  Future<void> initChrome() async {
+    // Create a temporary directory for holding Chrome tests.
+    var systemTempDir = Directory.systemTemp;
+    chromeDir = await systemTempDir.createTemp('ddc_eval_test_anchor');
+
+    // Start Chrome on an empty page with a single empty tab.
+    chrome = await browser.Chrome.startWithDebugPort(['about:blank'],
+        userDataDir: chromeDir.uri.toFilePath(), headless: true);
+
+    // Connect to the first 'normal' tab.
+    var tab = await chrome.chromeConnection
+        .getTab((tab) => !tab.isBackgroundPage && !tab.isChromeExtension);
+    connection = await tab.connect();
+    debugger = connection.debugger;
+  }
+
+  /// Must be called when testing a new Dart program.
+  ///
+  /// Depends on SDK artifacts (such as the sound and unsound dart_sdk.js
+  /// files) generated from the 'dartdevc_test' target.
+  Future<void> initSource(SetupCompilerOptions setup, String source) async {
+    // Prepend Dart nullability comment.
+    source = '${setup.dartLangComment}\n\n$source';
+    this.setup = setup;
+    this.source = source;
+    testDir = await chromeDir.createTemp('ddc_eval_test');
+    var buildDir = p.dirname(p.dirname(p.dirname(Platform.resolvedExecutable)));
+    var scriptPath = Platform.script.normalizePath().toFilePath();
+    var ddcPath = p.dirname(p.dirname(p.dirname(scriptPath)));
+    output = testDir.uri.resolve('test.js');
+    input = testDir.uri.resolve('test.dart');
+    File(input.toFilePath())
+      ..createSync()
+      ..writeAsStringSync(source);
+
+    packagesFile = testDir.uri.resolve('package_config.json');
+    File(packagesFile.toFilePath())
+      ..createSync()
+      ..writeAsStringSync('''
+      {
+        "configVersion": 2,
+        "packages": [
+          {
+            "name": "eval_test",
+            "rootUri": "./",
+            "packageUri": "./"
+          }
+        ]
+      }
+      ''');
+
+    // Initialize DDC and the incremental compiler, then perform a full compile.
+    compiler = await TestCompiler(setup)
+        .init(input: input, output: output, packages: packagesFile);
+
+    htmlBootstrapper = testDir.uri.resolve('bootstrapper.html');
+    var bootstrapFile = File(htmlBootstrapper.toFilePath())..createSync();
+    var moduleName = compiler.metadata.name;
+    var mainLibraryName = compiler.metadataForLibraryUri(input).name;
+
+    switch (setup.moduleFormat) {
+      case ModuleFormat.ddc:
+        moduleFormatString = 'ddc';
+        var dartSdkPath = escaped(p.join(
+            buildDir,
+            'gen',
+            'utils',
+            'dartdevc',
+            setup.soundNullSafety ? 'sound' : 'kernel',
+            'legacy',
+            'dart_sdk.js'));
+        var dartLibraryPath =
+            escaped(p.join(ddcPath, 'lib', 'js', 'legacy', 'dart_library.js'));
+        var outputPath = escaped(output.toFilePath());
+        bootstrapFile.writeAsStringSync('''
+<script src='$dartLibraryPath'></script>
+<script src='$dartSdkPath'></script>
+<script src='$outputPath'></script>
+<script>
+  'use strict';
+  var sound = ${setup.soundNullSafety};
+  var sdk = dart_library.import('dart_sdk');
+
+  if (!sound) {
+    sdk.dart.weakNullSafetyWarnings(false);
+    sdk.dart.weakNullSafetyErrors(false);
+  }
+  sdk.dart.nonNullAsserts(true);
+  sdk.dart.nativeNonNullAsserts(true);
+  sdk._debugger.registerDevtoolsFormatter();
+  dart_library.start('$moduleName', '$mainLibraryName');
+</script>
+''');
+        break;
+      case ModuleFormat.amd:
+        moduleFormatString = 'amd';
+        var dartSdkPath = escaped(p.join(buildDir, 'gen', 'utils', 'dartdevc',
+            setup.soundNullSafety ? 'sound' : 'kernel', 'amd', 'dart_sdk'));
+        var requirePath = escaped(p.join(buildDir, 'dart-sdk', 'lib',
+            'dev_compiler', 'kernel', 'amd', 'require.js'));
+        var outputPath = escaped(p.withoutExtension(output.toFilePath()));
+        bootstrapFile.writeAsStringSync('''
+<script src='$requirePath'></script>
+<script>
+  require.config({
+    paths: {
+        'dart_sdk': '$dartSdkPath',
+        '$moduleName': '$outputPath'
+    },
+    waitSeconds: 15
+  });
+  var sound = ${setup.soundNullSafety};
+
+  require(['dart_sdk', '$moduleName'],
+        function(sdk, app) {
+    'use strict';
+
+    if (!sound) {
+    sdk.dart.weakNullSafetyWarnings(false);
+    sdk.dart.weakNullSafetyErrors(false);
+    }
+    sdk.dart.nonNullAsserts(true);
+    sdk.dart.nativeNonNullAsserts(true);
+    sdk._debugger.registerDevtoolsFormatter();
+    app.$mainLibraryName.main([]);
+  });
+</script>
+''');
+
+        break;
+      default:
+        throw Exception(
+            'Unsupported module format for SDK evaluation tests: ${setup.moduleFormat}');
+    }
+
+    await debugger.enable();
+
+    // Pause as soon as the test file loads but before it executes.
+    var urlRegex = '.*${libraryUriToJsIdentifier(output)}.*';
+    await debugger.sendCommand('Debugger.setBreakpointByUrl', params: {
+      'urlRegex': urlRegex,
+      'lineNumber': 0,
+    });
+  }
+
+  void finish() async {
+    await chrome?.close();
+    // Chrome takes a while to free its claim on chromeDir, so wait a bit.
+    await Future.delayed(const Duration(milliseconds: 500));
+    chromeDir?.deleteSync(recursive: true);
+  }
+
+  Future<void> cleanupTest() async {
+    setup.diagnosticMessages.clear();
+    setup.errors.clear();
+    await debugger.disable();
+  }
+
+  Future<void> check(
+      {String breakpointId,
+      String expression,
+      String expectedError,
+      String expectedResult}) async {
+    assert(expectedError == null || expectedResult == null,
+        'Cannot expect both an error and result.');
+
+    // The next two pause events will correspond to:
+    // 1) the initial preemptive breakpoint and
+    // 2) the breakpoint at the specified ID
+    final pauseController = StreamController<wip.DebuggerPausedEvent>();
+    var pauseSub = debugger.onPaused.listen(pauseController.add);
+
+    final scriptController = StreamController<wip.ScriptParsedEvent>();
+    var scriptSub = debugger.onScriptParsed.listen((event) {
+      if ('${event.script.url}' == '$output') {
+        scriptController.add(event);
+      }
+    });
+
+    // Navigate from the empty page and immediately pause on the preemptive
+    // breakpoint.
+    await connection.page.navigate('$htmlBootstrapper');
+
+    // Poll until the script is found, or timeout after a few seconds.
+    var script = (await scriptController.stream.first.timeout(
+            const Duration(seconds: 5),
+            onTimeout: () => throw Exception(
+                'Unable to find JS script corresponding to test file $output in ${debugger.scripts}.')))
+        .script;
+    await scriptSub.cancel();
+    await scriptController.close();
+
+    // Breakpoint at the first WIP location mapped from its Dart line.
+    var dartLine = _findBreakpointLine(breakpointId);
+    var location = await _jsLocationFromDartLine(script, dartLine);
+    var bp = await debugger.setBreakpoint(location);
+
+    // Continue to the next breakpoint, ignoring the first pause event since it
+    // corresponds to the preemptive URI breakpoint made prior to page
+    // navigation.
+    await debugger.resume();
+    final event = await pauseController.stream
+        .skip(1)
+        .timeout(const Duration(seconds: 5),
+            onTimeout: (event) => throw Exception(
+                'Unable to find JS preemptive pause event in $output.'))
+        .first
+        .timeout(const Duration(seconds: 5),
+            onTimeout: () => throw Exception(
+                'Unable to find JS pause event corresponding to line ($dartLine -> $location) in $output.'));
+    await pauseSub.cancel();
+    await pauseController.close();
+
+    // Retrieve the call frame and its scope variables.
+    var frame = event.getCallFrames().first;
+    var scope = await _collectScopeVariables(frame);
+
+    // Perform an incremental compile.
+    var result = await compiler.compileExpression(
+        input: input,
+        line: dartLine,
+        column: 1,
+        scope: scope,
+        expression: expression);
+
+    if (expectedError != null) {
+      expect(
+          result,
+          const TypeMatcher<TestCompilationResult>()
+              .having((_) => result.result, 'result', _matches(expectedError)));
+      setup.diagnosticMessages.clear();
+      setup.errors.clear();
+      return;
+    }
+
+    if (!result.isSuccess) {
+      throw Exception(
+          'Unexpected expression evaluation failure:\n${result.result}');
+    }
+
+    var evalResult = await debugger.evaluateOnCallFrame(
+        frame.callFrameId, result.result,
+        returnByValue: false);
+
+    await debugger.removeBreakpoint(bp.breakpointId);
+    var value = await stringifyRemoteObject(evalResult);
+
+    expect(
+        result,
+        const TypeMatcher<TestCompilationResult>()
+            .having((_) => '$value', 'result', _matches(expectedResult)));
+  }
+
+  /// Generate simple string representation of a RemoteObject that closely
+  /// resembles Chrome's console output.
+  ///
+  /// Examples:
+  /// Class: t.C.new {Symbol(C.field): 5, Symbol(_field): 7}
+  /// Function: function main() {
+  ///             return test.foo(1, {y: 2});
+  ///           }
+  Future<String> stringifyRemoteObject(wip.RemoteObject obj) async {
+    String str;
+    switch (obj.type) {
+      case 'function':
+        str = obj.description;
+        break;
+      case 'object':
+        if (obj.subtype == 'null') {
+          return 'null';
+        }
+        var properties =
+            await connection.runtime.getProperties(obj, ownProperties: true);
+        var filteredProps = <String, String>{};
+        for (var prop in properties) {
+          if (prop.value != null && prop.name != '__proto__') {
+            filteredProps[prop.name] = await stringifyRemoteObject(prop.value);
+          }
+        }
+        str = '${obj.description} $filteredProps';
+        break;
+      default:
+        str = '${obj.value}';
+        break;
+    }
+    return str;
+  }
+
+  /// Collects local JS variables visible at a breakpoint during evaluation.
+  ///
+  /// Adapted from webdev/dwds/lib/src/services/expression_evaluator.dart.
+  Future<Map<String, String>> _collectScopeVariables(
+      wip.WipCallFrame frame) async {
+    var jsScope = <String, String>{};
+
+    for (var scope in filterScopes(frame)) {
+      var response = await connection.runtime
+          .getProperties(scope.object, ownProperties: true);
+      for (var prop in response) {
+        var propKey = '${prop.name}';
+        var propValue = '${prop.value.value}';
+        jsScope[propKey] = propValue == 'null' ? propKey : propValue;
+      }
+    }
+    return jsScope;
+  }
+
+  /// Used for matching error text emitted during expression evaluation.
+  Matcher _matches(String text) {
+    var unindented = RegExp.escape(text).replaceAll(RegExp('[ ]+'), '[ ]*');
+    return matches(RegExp(unindented, multiLine: true));
+  }
+
+  /// Finds the line number in [source] matching [breakpointId].
+  ///
+  /// A breakpoint ID is found by looking for a line that ends with a comment
+  /// of exactly this form: `// Breakpoint: <id>`.
+  ///
+  /// Throws if it can't find the matching line.
+  ///
+  /// Adapted from webdev/blob/master/dwds/test/fixtures/context.dart.
+  int _findBreakpointLine(String breakpointId) {
+    var lines = LineSplitter.split(source).toList();
+    var lineNumber =
+        lines.indexWhere((l) => l.endsWith('// Breakpoint: $breakpointId'));
+    if (lineNumber == -1) {
+      throw StateError(
+          'Unable to find breakpoint in $input with id: $breakpointId');
+    }
+    return lineNumber + 1;
+  }
+
+  /// Finds the corresponding JS WipLocation for a given line in Dart.
+  Future<wip.WipLocation> _jsLocationFromDartLine(
+      wip.WipScript script, int dartLine) async {
+    var inputSourceUrl = input.pathSegments.last;
+    for (var lineEntry in compiler.sourceMap.lines) {
+      for (var entry in lineEntry.entries) {
+        if (entry.sourceUrlId != null &&
+            entry.sourceLine == dartLine &&
+            compiler.sourceMap.urls[entry.sourceUrlId] == inputSourceUrl) {
+          return wip.WipLocation.fromValues(script.scriptId, lineEntry.line);
+        }
+      }
+    }
+    throw StateError(
+        'Unable to extract WIP Location from ${script.url} for Dart line $dartLine.');
+  }
+}
+
+/// Filters the provided frame scopes to those that are pertinent for Dart
+/// debugging.
+///
+/// Copied from webdev/dwds/lib/src/debugging/dart_scope.dart.
+List<wip.WipScope> filterScopes(wip.WipCallFrame frame) {
+  var scopes = frame.getScopeChain().toList();
+  // Remove outer scopes up to and including the Dart SDK.
+  while (
+      scopes.isNotEmpty && !(scopes.last.name?.startsWith('load__') ?? false)) {
+    scopes.removeLast();
+  }
+  if (scopes.isNotEmpty) scopes.removeLast();
+  return scopes;
+}
+
+String escaped(String path) => path.replaceAll('\\', '\\\\');
diff --git a/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_test.dart b/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_test.dart
deleted file mode 100644
index 95d2fb0..0000000
--- a/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_test.dart
+++ /dev/null
@@ -1,1140 +0,0 @@
-// Copyright (c) 2021, 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 = 2.9
-
-library dev_compiler.test.expression_compiler;
-
-import 'dart:async';
-import 'dart:convert';
-import 'dart:io' show Directory, File, Platform;
-
-import 'package:browser_launcher/browser_launcher.dart' as browser;
-import 'package:cli_util/cli_util.dart';
-import 'package:dev_compiler/dev_compiler.dart';
-import 'package:dev_compiler/src/compiler/module_builder.dart';
-import 'package:dev_compiler/src/kernel/module_metadata.dart';
-import 'package:front_end/src/api_unstable/ddc.dart' as fe;
-import 'package:front_end/src/compute_platform_binaries_location.dart' as fe;
-import 'package:front_end/src/fasta/incremental_serializer.dart' as fe;
-import 'package:kernel/ast.dart' show Component, Library;
-import 'package:kernel/target/targets.dart';
-import 'package:path/path.dart' as p;
-import 'package:source_maps/parser.dart' as source_maps;
-import 'package:source_maps/source_maps.dart' as source_maps;
-import 'package:test/test.dart';
-import 'package:webkit_inspection_protocol/webkit_inspection_protocol.dart'
-    as wip;
-
-class DevelopmentIncrementalCompiler extends fe.IncrementalCompiler {
-  Uri entryPoint;
-
-  DevelopmentIncrementalCompiler(fe.CompilerOptions options, this.entryPoint,
-      [Uri initializeFrom,
-      bool outlineOnly,
-      fe.IncrementalSerializer incrementalSerializer])
-      : super(
-            fe.CompilerContext(
-                fe.ProcessedOptions(options: options, inputs: [entryPoint])),
-            initializeFrom,
-            outlineOnly,
-            incrementalSerializer);
-
-  DevelopmentIncrementalCompiler.fromComponent(fe.CompilerOptions options,
-      this.entryPoint, Component componentToInitializeFrom,
-      [bool outlineOnly, fe.IncrementalSerializer incrementalSerializer])
-      : super.fromComponent(
-            fe.CompilerContext(
-                fe.ProcessedOptions(options: options, inputs: [entryPoint])),
-            componentToInitializeFrom,
-            outlineOnly,
-            incrementalSerializer);
-}
-
-class SetupCompilerOptions {
-  static final sdkRoot = fe.computePlatformBinariesLocation();
-  static final sdkUnsoundSummaryPath =
-      p.join(sdkRoot.toFilePath(), 'ddc_sdk.dill');
-  static final sdkSoundSummaryPath =
-      p.join(sdkRoot.toFilePath(), 'ddc_outline_sound.dill');
-  static final librariesSpecificationUri =
-      p.join(p.dirname(p.dirname(getSdkPath())), 'libraries.json');
-  static final String dartUnsoundComment = '// @dart = 2.9';
-  static final String dartSoundComment = '//';
-
-  final String dartLangComment;
-  final List<String> errors = [];
-  final List<String> diagnosticMessages = [];
-  final ModuleFormat moduleFormat;
-  final fe.CompilerOptions options;
-  final bool soundNullSafety;
-
-  static fe.CompilerOptions _getOptions(bool soundNullSafety) {
-    var options = fe.CompilerOptions()
-      ..verbose = false // set to true for debugging
-      ..sdkRoot = sdkRoot
-      ..target = DevCompilerTarget(TargetFlags())
-      ..librariesSpecificationUri = p.toUri('sdk/lib/libraries.json')
-      ..omitPlatform = true
-      ..sdkSummary =
-          p.toUri(soundNullSafety ? sdkSoundSummaryPath : sdkUnsoundSummaryPath)
-      ..environmentDefines = const {}
-      ..nnbdMode = soundNullSafety ? fe.NnbdMode.Strong : fe.NnbdMode.Weak;
-    return options;
-  }
-
-  SetupCompilerOptions(
-      {this.soundNullSafety = true, this.moduleFormat = ModuleFormat.amd})
-      : options = _getOptions(soundNullSafety),
-        dartLangComment =
-            soundNullSafety ? dartSoundComment : dartUnsoundComment {
-    options.onDiagnostic = (fe.DiagnosticMessage m) {
-      diagnosticMessages.addAll(m.plainTextFormatted);
-      if (m.severity == fe.Severity.error) {
-        errors.addAll(m.plainTextFormatted);
-      }
-    };
-  }
-}
-
-class TestCompilationResult {
-  final String result;
-  final bool isSuccess;
-
-  TestCompilationResult(this.result, this.isSuccess);
-}
-
-class TestCompiler {
-  final SetupCompilerOptions setup;
-  Component component;
-  ExpressionCompiler evaluator;
-  ModuleMetadata metadata;
-  source_maps.SingleMapping sourceMap;
-
-  TestCompiler(this.setup);
-
-  Future<TestCompiler> init({Uri input, Uri output, Uri packages}) async {
-    // Initialize the incremental compiler and module component.
-    // TODO: extend this for multi-module compilations by storing separate
-    // compilers/components/names per module.
-    setup.options.packagesFileUri = packages;
-    var compiler = DevelopmentIncrementalCompiler(setup.options, input);
-    component = await compiler.computeDelta();
-    component.computeCanonicalNames();
-
-    // Initialize DDC.
-    var moduleName = '${p.basenameWithoutExtension(output.toFilePath())}';
-
-    var classHierarchy = compiler.getClassHierarchy();
-    var compilerOptions = SharedCompilerOptions(
-        replCompile: true,
-        moduleName: moduleName,
-        soundNullSafety: setup.soundNullSafety);
-    var coreTypes = compiler.getCoreTypes();
-
-    final importToSummary = Map<Library, Component>.identity();
-    final summaryToModule = Map<Component, String>.identity();
-    for (var lib in component.libraries) {
-      importToSummary[lib] = component;
-    }
-    summaryToModule[component] = moduleName;
-
-    var kernel2jsCompiler = ProgramCompiler(component, classHierarchy,
-        compilerOptions, importToSummary, summaryToModule,
-        coreTypes: coreTypes);
-    var module = kernel2jsCompiler.emitModule(component);
-
-    // Perform a full compile, writing the compiled JS + sourcemap.
-    var code = jsProgramToCode(
-      module,
-      setup.moduleFormat,
-      inlineSourceMap: true,
-      buildSourceMap: true,
-      emitDebugMetadata: true,
-      jsUrl: '$output',
-      mapUrl: '$output.map',
-      component: component,
-    );
-    metadata = code.metadata;
-    sourceMap = source_maps.SingleMapping.fromJson(code.sourceMap);
-    var codeBytes = utf8.encode(code.code);
-    var sourceMapBytes = utf8.encode(json.encode(code.sourceMap));
-
-    File('${output.toFilePath()}').writeAsBytesSync(codeBytes);
-    File('${output.toFilePath()}.map').writeAsBytesSync(sourceMapBytes);
-
-    // Save the expression evaluator for future evaluations.
-    evaluator = ExpressionCompiler(
-      setup.options,
-      setup.moduleFormat,
-      setup.errors,
-      compiler,
-      kernel2jsCompiler,
-      component,
-    );
-
-    if (setup.errors.isNotEmpty) {
-      throw Exception('Compilation failed with: ${setup.errors}');
-    }
-    setup.diagnosticMessages.clear();
-
-    return this;
-  }
-
-  Future<TestCompilationResult> compileExpression(
-      {Uri input,
-      int line,
-      int column,
-      Map<String, String> scope,
-      String expression}) async {
-    var libraryUri = metadataForLibraryUri(input);
-    var jsExpression = await evaluator.compileExpressionToJs(
-        libraryUri.importUri, line, column, scope, expression);
-    if (setup.errors.isNotEmpty) {
-      jsExpression = setup.errors.toString().replaceAll(
-          RegExp(
-              r'org-dartlang-debug:synthetic_debug_expression:[0-9]*:[0-9]*:'),
-          '');
-
-      return TestCompilationResult(jsExpression, false);
-    }
-
-    return TestCompilationResult(jsExpression, true);
-  }
-
-  LibraryMetadata metadataForLibraryUri(Uri libraryUri) =>
-      metadata.libraries.entries
-          .firstWhere((entry) => entry.value.fileUri == '$libraryUri')
-          .value;
-}
-
-class TestDriver {
-  SetupCompilerOptions setup;
-  String source;
-  Directory chromeDir;
-  Directory testDir;
-  String moduleFormatString;
-  Uri htmlBootstrapper;
-  Uri input;
-  Uri output;
-  Uri packagesFile;
-  browser.Chrome chrome;
-  wip.WipDebugger debugger;
-  wip.WipConnection connection;
-  TestCompiler compiler;
-
-  TestDriver._();
-
-  static Future<TestDriver> init(SetupCompilerOptions setup) async {
-    var driver = TestDriver._();
-    await driver.initChrome();
-    return driver;
-  }
-
-  /// Initializes a Chrome browser instance, tab connection, and debugger.
-  ///
-  /// Should be called once after creating TestDriver.
-  Future<void> initChrome() async {
-    // Create a temporary directory for holding Chrome tests.
-    var systemTempDir = Directory.systemTemp;
-    chromeDir = await systemTempDir.createTemp('ddc_eval_test_anchor');
-
-    // Start Chrome on an empty page with a single empty tab.
-    chrome = await browser.Chrome.startWithDebugPort(['about:blank'],
-        userDataDir: chromeDir.uri.toFilePath(), headless: true);
-
-    // Connect to the first 'normal' tab.
-    var tab = await chrome.chromeConnection
-        .getTab((tab) => !tab.isBackgroundPage && !tab.isChromeExtension);
-    connection = await tab.connect();
-    debugger = connection.debugger;
-  }
-
-  /// Must be called when testing a new Dart program.
-  ///
-  /// Depends on SDK artifacts (such as the sound and unsound dart_sdk.js
-  /// files) generated from the 'dartdevc_test' target.
-  Future<void> initSource(SetupCompilerOptions setup, String source) async {
-    // Prepend Dart nullability comment.
-    source = '${setup.dartLangComment}\n\n$source';
-    this.setup = setup;
-    this.source = source;
-    testDir = await chromeDir.createTemp('ddc_eval_test');
-    var buildDir = p.dirname(p.dirname(p.dirname(Platform.resolvedExecutable)));
-    var scriptPath = Platform.script.normalizePath().toFilePath();
-    var ddcPath = p.dirname(p.dirname(p.dirname(scriptPath)));
-    output = testDir.uri.resolve('test.js');
-    input = testDir.uri.resolve('test.dart');
-    File(input.toFilePath())
-      ..createSync()
-      ..writeAsStringSync(source);
-
-    packagesFile = testDir.uri.resolve('package_config.json');
-    File(packagesFile.toFilePath())
-      ..createSync()
-      ..writeAsStringSync('''
-      {
-        "configVersion": 2,
-        "packages": [
-          {
-            "name": "eval_test",
-            "rootUri": "./",
-            "packageUri": "./"
-          }
-        ]
-      }
-      ''');
-
-    // Initialize DDC and the incremental compiler, then perform a full compile.
-    compiler = await TestCompiler(setup)
-        .init(input: input, output: output, packages: packagesFile);
-
-    htmlBootstrapper = testDir.uri.resolve('bootstrapper.html');
-    var bootstrapFile = File(htmlBootstrapper.toFilePath())..createSync();
-    var moduleName = compiler.metadata.name;
-    var mainLibraryName = compiler.metadataForLibraryUri(input).name;
-
-    switch (setup.moduleFormat) {
-      case ModuleFormat.ddc:
-        moduleFormatString = 'ddc';
-        var dartSdkPath = escaped(p.join(
-            buildDir,
-            'gen',
-            'utils',
-            'dartdevc',
-            setup.soundNullSafety ? 'sound' : 'kernel',
-            'legacy',
-            'dart_sdk.js'));
-        var dartLibraryPath =
-            escaped(p.join(ddcPath, 'lib', 'js', 'legacy', 'dart_library.js'));
-        var outputPath = escaped(output.toFilePath());
-        bootstrapFile.writeAsStringSync('''
-<script src='$dartLibraryPath'></script>
-<script src='$dartSdkPath'></script>
-<script src='$outputPath'></script>
-<script>
-  'use strict';
-  var sound = ${setup.soundNullSafety};
-  var sdk = dart_library.import('dart_sdk');
-
-  if (!sound) {
-    sdk.dart.weakNullSafetyWarnings(false);
-    sdk.dart.weakNullSafetyErrors(false);
-  }
-  sdk.dart.nonNullAsserts(true);
-  sdk.dart.nativeNonNullAsserts(true);
-  sdk._debugger.registerDevtoolsFormatter();
-  dart_library.start('$moduleName', '$mainLibraryName');
-</script>
-''');
-        break;
-      case ModuleFormat.amd:
-        moduleFormatString = 'amd';
-        var dartSdkPath = escaped(p.join(buildDir, 'gen', 'utils', 'dartdevc',
-            setup.soundNullSafety ? 'sound' : 'kernel', 'amd', 'dart_sdk'));
-        var requirePath = escaped(p.join(buildDir, 'dart-sdk', 'lib',
-            'dev_compiler', 'kernel', 'amd', 'require.js'));
-        var outputPath = escaped(p.withoutExtension(output.toFilePath()));
-        bootstrapFile.writeAsStringSync('''
-<script src='$requirePath'></script>
-<script>
-  require.config({
-    paths: {
-        'dart_sdk': '$dartSdkPath',
-        '$moduleName': '$outputPath'
-    },
-    waitSeconds: 15
-  });
-  var sound = ${setup.soundNullSafety};
-
-  require(['dart_sdk', '$moduleName'],
-        function(sdk, app) {
-    'use strict';
-
-    if (!sound) {
-    sdk.dart.weakNullSafetyWarnings(false);
-    sdk.dart.weakNullSafetyErrors(false);
-    }
-    sdk.dart.nonNullAsserts(true);
-    sdk.dart.nativeNonNullAsserts(true);
-    sdk._debugger.registerDevtoolsFormatter();
-    app.$mainLibraryName.main([]);
-  });
-</script>
-''');
-
-        break;
-      default:
-        throw Exception(
-            'Unsupported module format for SDK evaluation tests: ${setup.moduleFormat}');
-    }
-
-    await debugger.enable();
-
-    // Pause as soon as the test file loads but before it executes.
-    var urlRegex = '.*${libraryUriToJsIdentifier(output)}.*';
-    await debugger.sendCommand('Debugger.setBreakpointByUrl', params: {
-      'urlRegex': urlRegex,
-      'lineNumber': 0,
-    });
-  }
-
-  void finish() async {
-    await chrome?.close();
-    // Chrome takes a while to free its claim on chromeDir, so wait a bit.
-    await Future.delayed(const Duration(milliseconds: 500));
-    chromeDir?.deleteSync(recursive: true);
-  }
-
-  Future<void> cleanupTest() async {
-    setup.diagnosticMessages.clear();
-    setup.errors.clear();
-    await debugger.disable();
-  }
-
-  Future<void> check(
-      {String breakpointId,
-      String expression,
-      String expectedError,
-      String expectedResult}) async {
-    assert(expectedError == null || expectedResult == null,
-        'Cannot expect both an error and result.');
-
-    var subs = <StreamSubscription>[];
-    final controller = StreamController<wip.DebuggerPausedEvent>();
-    subs.add(debugger.onPaused.listen(controller.add));
-
-    // Navigate from the empty page and immediately pause on the preemptive
-    // breakpoint.
-    await connection.page.navigate('$htmlBootstrapper');
-    await Future.delayed(const Duration(milliseconds: 500));
-
-    // TODO: We use lastWhere since the debugger accumulates scriptIds across
-    // tests. We can use firstWhere if we clear debugger.scripts - perhaps by
-    // disabling and enabling the debugger.
-    final script = debugger.scripts.entries
-        .lastWhere((entry) => entry.value.url.endsWith('test.js'),
-            orElse: () => throw Exception(
-                'Unable to find JS script corresponding to test file $output in ${debugger.scripts}.'))
-        .value;
-
-    // Breakpoint at the first WIP location mapped from its Dart line.
-    var dartLine = _findBreakpointLine(breakpointId);
-    var location = await _jsLocationFromDartLine(script, dartLine);
-    var bp = await debugger.setBreakpoint(location);
-
-    // Continue to the next breakpoint, ignoring the first pause event since it
-    // corresponds to the preemptive URI breakpoint made prior to page
-    // navigation.
-    await debugger.resume();
-    final event = await controller.stream.skip(1).first;
-
-    // Retrieve the call frame and its scope variables.
-    var frame = event.getCallFrames().first;
-    var scope = await _collectScopeVariables(frame);
-
-    // Perform an incremental compile.
-    var result = await compiler.compileExpression(
-        input: input,
-        line: dartLine,
-        column: 1,
-        scope: scope,
-        expression: expression);
-
-    if (expectedError != null) {
-      expect(
-          result,
-          const TypeMatcher<TestCompilationResult>()
-              .having((_) => result.result, 'result', _matches(expectedError)));
-      setup.diagnosticMessages.clear();
-      setup.errors.clear();
-      return;
-    }
-
-    if (!result.isSuccess) {
-      throw Exception(
-          'Unexpected expression evaluation failure:\n${result.result}');
-    }
-
-    var evalResult = await debugger.evaluateOnCallFrame(
-        frame.callFrameId, result.result,
-        returnByValue: false);
-
-    await debugger.removeBreakpoint(bp.breakpointId);
-    var value = await stringifyRemoteObject(evalResult);
-
-    expect(
-        result,
-        const TypeMatcher<TestCompilationResult>()
-            .having((_) => '$value', 'result', _matches(expectedResult)));
-  }
-
-  /// Generate simple string representation of a RemoteObject that closely
-  /// resembles Chrome's console output.
-  ///
-  /// Examples:
-  /// Class: t.C.new {Symbol(C.field): 5, Symbol(_field): 7}
-  /// Function: function main() {
-  ///             return test.foo(1, {y: 2});
-  ///           }
-  Future<String> stringifyRemoteObject(wip.RemoteObject obj) async {
-    String str;
-    switch (obj.type) {
-      case 'function':
-        str = obj.description;
-        break;
-      case 'object':
-        if (obj.subtype == 'null') {
-          return 'null';
-        }
-        var properties =
-            await connection.runtime.getProperties(obj, ownProperties: true);
-        var filteredProps = <String, String>{};
-        for (var prop in properties) {
-          if (prop.value != null && prop.name != '__proto__') {
-            filteredProps[prop.name] = await stringifyRemoteObject(prop.value);
-          }
-        }
-        str = '${obj.description} $filteredProps';
-        break;
-      default:
-        str = '${obj.value}';
-        break;
-    }
-    return str;
-  }
-
-  /// Collects local JS variables visible at a breakpoint during evaluation.
-  ///
-  /// Adapted from webdev/dwds/lib/src/services/expression_evaluator.dart.
-  Future<Map<String, String>> _collectScopeVariables(
-      wip.WipCallFrame frame) async {
-    var jsScope = <String, String>{};
-
-    for (var scope in filterScopes(frame)) {
-      var response = await connection.runtime
-          .getProperties(scope.object, ownProperties: true);
-      for (var prop in response) {
-        var propKey = '${prop.name}';
-        var propValue = '${prop.value.value}';
-        jsScope[propKey] = propValue == 'null' ? propKey : propValue;
-      }
-    }
-    return jsScope;
-  }
-
-  /// Used for matching error text emitted during expression evaluation.
-  Matcher _matches(String text) {
-    var unindented = RegExp.escape(text).replaceAll(RegExp('[ ]+'), '[ ]*');
-    return matches(RegExp(unindented, multiLine: true));
-  }
-
-  /// Finds the line number in [source] matching [breakpointId].
-  ///
-  /// A breakpoint ID is found by looking for a line that ends with a comment
-  /// of exactly this form: `// Breakpoint: <id>`.
-  ///
-  /// Throws if it can't find the matching line.
-  ///
-  /// Adapted from webdev/blob/master/dwds/test/fixtures/context.dart.
-  int _findBreakpointLine(String breakpointId) {
-    var lines = LineSplitter.split(source).toList();
-    var lineNumber =
-        lines.indexWhere((l) => l.endsWith('// Breakpoint: $breakpointId'));
-    if (lineNumber == -1) {
-      throw StateError(
-          'Unable to find breakpoint in $input with id: $breakpointId');
-    }
-    return lineNumber + 1;
-  }
-
-  /// Finds the corresponding JS WipLocation for a given line in Dart.
-  Future<wip.WipLocation> _jsLocationFromDartLine(
-      wip.WipScript script, int dartLine) async {
-    var inputSourceUrl = input.pathSegments.last;
-    for (var lineEntry in compiler.sourceMap.lines) {
-      for (var entry in lineEntry.entries) {
-        if (entry.sourceUrlId != null &&
-            entry.sourceLine == dartLine &&
-            compiler.sourceMap.urls[entry.sourceUrlId] == inputSourceUrl) {
-          return wip.WipLocation.fromValues(script.scriptId, lineEntry.line);
-        }
-      }
-    }
-    throw StateError(
-        'Unable to extract WIP Location from ${script.url} for Dart line $dartLine.');
-  }
-}
-
-/// Filters the provided frame scopes to those that are pertinent for Dart
-/// debugging.
-///
-/// Copied from webdev/dwds/lib/src/debugging/dart_scope.dart.
-List<wip.WipScope> filterScopes(wip.WipCallFrame frame) {
-  var scopes = frame.getScopeChain().toList();
-  // Remove outer scopes up to and including the Dart SDK.
-  while (
-      scopes.isNotEmpty && !(scopes.last.name?.startsWith('load__') ?? false)) {
-    scopes.removeLast();
-  }
-  if (scopes.isNotEmpty) scopes.removeLast();
-  return scopes;
-}
-
-String escaped(String path) => path.replaceAll('\\', '\\\\');
-
-void main() async {
-  group('Unsound null safety:', () {
-    var setup = SetupCompilerOptions(soundNullSafety: false);
-    TestDriver driver;
-
-    setUpAll(() async {
-      driver = await TestDriver.init(setup);
-    });
-
-    tearDownAll(() {
-      driver.finish();
-    });
-
-    group('Expression compiler extension symbols tests', () {
-      var source = '''
-        main() {
-          List<int> list = [];
-          list.add(0);
-          // Breakpoint: bp
-        }
-        ''';
-
-      setUpAll(() async {
-        await driver.initSource(setup, source);
-      });
-
-      tearDownAll(() async {
-        await driver.cleanupTest();
-      });
-
-      test('extension symbol used only in expression compilation', () async {
-        await driver.check(
-            breakpointId: 'bp', expression: 'list.first', expectedResult: '0');
-      });
-
-      test('extension symbol used in original compilation', () async {
-        await driver.check(
-            breakpointId: 'bp',
-            expression: '() { list.add(1); return list.last; }()',
-            expectedResult: '1');
-      });
-    });
-
-    group('Expression compiler scope collection tests', () {
-      var source = '''
-        class C {
-          static int staticField = 0;
-          int field;
-
-          C(this.field);
-
-          void methodFieldAccess(int x) {
-            var inScope = 1;
-            {
-              var innerInScope = global + staticField + field;
-              // Breakpoint: bp
-              var innerNotInScope = 2;
-            }
-            var notInScope = 3;
-          }
-        }
-
-        int global = 42;
-        main() => C(4).methodFieldAccess(5);
-        ''';
-
-      setUpAll(() async {
-        await driver.initSource(setup, source);
-      });
-
-      tearDownAll(() async {
-        await driver.cleanupTest();
-      });
-
-      test('local in scope', () async {
-        await driver.check(
-            breakpointId: 'bp', expression: 'inScope', expectedResult: '1');
-      });
-
-      test('local in inner scope', () async {
-        await driver.check(
-            breakpointId: 'bp',
-            expression: 'innerInScope',
-            expectedResult: '46');
-      });
-
-      test('global in scope', () async {
-        await driver.check(
-            breakpointId: 'bp', expression: 'global', expectedResult: '42');
-      });
-
-      test('static field in scope', () async {
-        await driver.check(
-            breakpointId: 'bp', expression: 'staticField', expectedResult: '0');
-      });
-
-      test('field in scope', () async {
-        await driver.check(
-            breakpointId: 'bp', expression: 'field', expectedResult: '4');
-      });
-
-      test('parameter in scope', () async {
-        await driver.check(
-            breakpointId: 'bp', expression: 'x', expectedResult: '5');
-      });
-
-      test('local not in scope', () async {
-        await driver.check(
-            breakpointId: 'bp',
-            expression: 'notInScope',
-            expectedError:
-                "Error: The getter 'notInScope' isn't defined for the"
-                " class 'C'.");
-      });
-
-      test('local not in inner scope', () async {
-        await driver.check(
-            breakpointId: 'bp',
-            expression: 'innerNotInScope',
-            expectedError:
-                "Error: The getter 'innerNotInScope' isn't defined for the"
-                " class 'C'.");
-      });
-    });
-
-    group('Expression compiler tests in extension method:', () {
-      var source = '''
-        extension NumberParsing on String {
-          int parseInt() {
-            var ret = int.parse(this);
-            // Breakpoint: bp
-            return ret;
-          }
-        }
-        main() => "1234".parseInt();
-      ''';
-
-      setUpAll(() async {
-        await driver.initSource(setup, source);
-      });
-
-      tearDownAll(() {
-        driver.cleanupTest();
-      });
-
-      test('compilation error', () async {
-        await driver.check(
-            breakpointId: 'bp',
-            expression: 'typo',
-            expectedError: "Error: Getter not found: 'typo'");
-      });
-
-      test('local (trimmed scope)', () async {
-        await driver.check(
-            breakpointId: 'bp', expression: 'ret', expectedResult: '1234');
-      });
-
-      test('this (full scope)', () async {
-        // Note: this currently fails due to
-        // - incremental compiler not mapping 'this' from user input to '#this'
-        // - incremental compiler not allowing #this as a parameter name
-        await driver.check(
-            breakpointId: 'bp',
-            expression: 'this',
-            expectedError: "Error: Expected identifier, but got 'this'");
-      });
-    });
-
-    group('Expression compiler tests in static function:', () {
-      var source = '''
-        int foo(int x, {int y}) {
-          int z = 3;
-          // Breakpoint: bp
-          return x + y + z;
-        }
-
-        main() => foo(1, y: 2);
-        ''';
-
-      setUpAll(() async {
-        await driver.initSource(setup, source);
-      });
-
-      tearDownAll(() {
-        driver.cleanupTest();
-      });
-
-      test('compilation error', () async {
-        await driver.check(
-            breakpointId: 'bp',
-            expression: 'typo',
-            expectedError: "Getter not found: \'typo\'");
-      });
-
-      test('local', () async {
-        await driver.check(
-            breakpointId: 'bp', expression: 'x', expectedResult: '1');
-      });
-
-      test('formal', () async {
-        await driver.check(
-            breakpointId: 'bp', expression: 'y', expectedResult: '2');
-      });
-
-      test('named formal', () async {
-        await driver.check(
-            breakpointId: 'bp', expression: 'z', expectedResult: '3');
-      });
-
-      test('function', () async {
-        await driver
-            .check(breakpointId: 'bp', expression: 'main', expectedResult: '''
-              function main() {
-                return test.foo(1, {y: 2});
-              }''');
-      });
-    });
-
-    group('Expression compiler tests in method:', () {
-      var source = '''
-          extension NumberParsing on String {
-            int parseInt() {
-              return int.parse(this) + 1;
-            }
-          }
-
-          class C {
-            static int staticField = 1;
-            static int _staticField = 2;
-            static int _unusedStaticField = 3;
-            int field;
-            int _field;
-            int _unusedField = 4;
-
-            C(this.field, this._field);
-
-            int methodFieldAccess(int x) {
-              // Breakpoint: bp
-              return x + _field + _staticField;
-            }
-          }
-
-          void entrypoint() {
-            var c = C(5, 7);
-            // Breakpoint: bp1
-            c.methodFieldAccess(10);
-          }
-
-          int global = 42;
-          main() => entrypoint();
-          ''';
-
-      setUpAll(() async {
-        await driver.initSource(setup, source);
-      });
-
-      tearDownAll(() {
-        driver.cleanupTest();
-      });
-
-      test('compilation error', () async {
-        await driver.check(
-            breakpointId: 'bp',
-            expression: 'typo',
-            expectedError: "The getter 'typo' isn't defined for the class 'C'");
-      });
-
-      test('local', () async {
-        await driver.check(
-            breakpointId: 'bp', expression: 'x', expectedResult: '10');
-      });
-
-      test('this', () async {
-        await driver.check(
-            breakpointId: 'bp',
-            expression: 'this',
-            expectedResult:
-                'test.C.new {Symbol(_unusedField): 4, Symbol(C.field): 5,'
-                ' Symbol(_field): 7}');
-      });
-
-      test('expression using locals', () async {
-        await driver.check(
-            breakpointId: 'bp', expression: 'x + 1', expectedResult: '11');
-      });
-
-      test('expression using static fields', () async {
-        await driver.check(
-            breakpointId: 'bp',
-            expression: 'x + staticField',
-            expectedResult: '11');
-      });
-
-      test('expression using private static fields', () async {
-        await driver.check(
-            breakpointId: 'bp',
-            expression: 'x + _staticField',
-            expectedResult: '12');
-      });
-
-      test('expression using fields', () async {
-        await driver.check(
-            breakpointId: 'bp', expression: 'x + field', expectedResult: '15');
-      });
-
-      test('expression using private fields', () async {
-        await driver.check(
-            breakpointId: 'bp', expression: 'x + _field', expectedResult: '17');
-      });
-
-      test('expression using globals', () async {
-        await driver.check(
-            breakpointId: 'bp', expression: 'x + global', expectedResult: '52');
-      });
-
-      test('expression using fields not referred to in the original  code',
-          () async {
-        await driver.check(
-            breakpointId: 'bp',
-            expression: '_unusedField + _unusedStaticField',
-            expectedResult: '7');
-      });
-
-      test('method call', () async {
-        await driver.check(
-            breakpointId: 'bp1',
-            expression: 'c.methodFieldAccess(2)',
-            expectedResult: '11');
-      });
-
-      test('extension method call', () async {
-        await driver.check(
-            breakpointId: 'bp1',
-            expression: '"1234".parseInt()',
-            expectedResult: '1235');
-      });
-
-      test('private field modification', () async {
-        await driver.check(
-            breakpointId: 'bp',
-            expression: '() {_field = 2; return _field;}()',
-            expectedResult: '2');
-      });
-
-      test('field modification', () async {
-        await driver.check(
-            breakpointId: 'bp',
-            expression: '() {field = 3; return field;}()',
-            expectedResult: '3');
-      });
-
-      test('private static field modification', () async {
-        await driver.check(
-            breakpointId: 'bp',
-            expression: '() {_staticField = 4; return _staticField;}()',
-            expectedResult: '4');
-      });
-
-      test('static field modification', () async {
-        await driver.check(
-            breakpointId: 'bp',
-            expression: '() {staticField = 5; return staticField;}()',
-            expectedResult: '5');
-      });
-    });
-
-    group('Expression compiler tests in async method:', () {
-      var source = '''
-        class C {
-          static int staticField = 1;
-          static int _staticField = 2;
-          int _field;
-          int field;
-
-          C(this.field, this._field);
-          Future<int> asyncMethod(int x) async {
-            // Breakpoint: bp
-            return x + global + _field + field + staticField + _staticField;
-          }
-        }
-
-        void entrypoint() async {
-          var c = C(5, 7);
-          // Breakpoint: bp1
-          var nop;
-          await c.asyncMethod(1);
-        }
-
-        int global = 42;
-        main() async => await entrypoint();
-        ''';
-
-      setUpAll(() async {
-        await driver.initSource(setup, source);
-      });
-
-      tearDownAll(() {
-        driver.cleanupTest();
-      });
-
-      test('compilation error', () async {
-        await driver.check(
-            breakpointId: 'bp',
-            expression: 'typo',
-            expectedError: "The getter 'typo' isn't defined for the class 'C'");
-      });
-
-      test('local', () async {
-        await driver.check(
-            breakpointId: 'bp', expression: 'x', expectedResult: '1');
-      });
-
-      test('this', () async {
-        await driver.check(
-            breakpointId: 'bp',
-            expression: 'this',
-            expectedResult:
-                'test.C.new {Symbol(C.field): 5, Symbol(_field): 7}');
-      });
-
-      test('async method call', () async {
-        await driver.check(
-            breakpointId: 'bp1',
-            expression: 'await c.asyncMethod(1)',
-            expectedResult: '58');
-      }, skip: "'await' is not yet supported in expression evaluation.");
-    });
-  });
-
-  group('Sound null safety:', () {
-    var setup = SetupCompilerOptions(soundNullSafety: false);
-    TestDriver driver;
-
-    setUpAll(() async {
-      driver = await TestDriver.init(setup);
-    });
-
-    tearDownAll(() {
-      driver.finish();
-    });
-
-    group('Expression compiler extension symbols tests', () {
-      var source = '''
-        main() {
-          List<int> list = [];
-          list.add(0);
-          // Breakpoint: bp
-        }
-        ''';
-
-      setUpAll(() async {
-        await driver.initSource(setup, source);
-      });
-
-      tearDownAll(() async {
-        await driver.cleanupTest();
-      });
-
-      test('extension symbol used only in expression compilation', () async {
-        await driver.check(
-            breakpointId: 'bp', expression: 'list.first', expectedResult: '0');
-      });
-
-      test('extension symbol used in original compilation', () async {
-        await driver.check(
-            breakpointId: 'bp',
-            expression: '() { list.add(1); return list.last; }()',
-            expectedResult: '1');
-      });
-    });
-
-    group('Expression compiler scope collection tests', () {
-      var source = '''
-        class C {
-          C(this.field);
-
-          void methodFieldAccess(int x) {
-            var inScope = 1;
-            {
-              var innerInScope = global + staticField + field;
-              // Breakpoint: bp
-              var innerNotInScope = 2;
-            }
-            var notInScope = 3;
-          }
-
-          static int staticField = 0;
-          int field;
-        }
-
-        int global = 42;
-        main() => C(4).methodFieldAccess(5);
-        ''';
-
-      setUpAll(() async {
-        await driver.initSource(setup, source);
-      });
-
-      tearDownAll(() async {
-        await driver.cleanupTest();
-      });
-
-      test('local in scope', () async {
-        await driver.check(
-            breakpointId: 'bp', expression: 'inScope', expectedResult: '1');
-      });
-
-      test('local in inner scope', () async {
-        await driver.check(
-            breakpointId: 'bp',
-            expression: 'innerInScope',
-            expectedResult: '46');
-      });
-
-      test('global in scope', () async {
-        await driver.check(
-            breakpointId: 'bp', expression: 'global', expectedResult: '42');
-      });
-
-      test('static field in scope', () async {
-        await driver.check(
-            breakpointId: 'bp', expression: 'staticField', expectedResult: '0');
-      });
-
-      test('field in scope', () async {
-        await driver.check(
-            breakpointId: 'bp', expression: 'field', expectedResult: '4');
-      });
-
-      test('parameter in scope', () async {
-        await driver.check(
-            breakpointId: 'bp', expression: 'x', expectedResult: '5');
-      });
-
-      test('local not in scope', () async {
-        await driver.check(
-            breakpointId: 'bp',
-            expression: 'notInScope',
-            expectedError:
-                "Error: The getter 'notInScope' isn't defined for the"
-                " class 'C'.");
-      });
-
-      test('local not in inner scope', () async {
-        await driver.check(
-            breakpointId: 'bp',
-            expression: 'innerNotInScope',
-            expectedError:
-                "Error: The getter 'innerNotInScope' isn't defined for the"
-                " class 'C'.");
-      });
-    });
-  });
-}
diff --git a/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_unsound_test.dart b/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_unsound_test.dart
new file mode 100644
index 0000000..7ac4ce7
--- /dev/null
+++ b/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_unsound_test.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2021, 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 = 2.9
+
+library dev_compiler.test.expression_compiler;
+
+import 'package:test/test.dart';
+import 'expression_compiler_e2e_shared.dart';
+import 'expression_compiler_e2e_suite.dart';
+
+void main() async {
+  var driver = await TestDriver.init();
+  var setup = SetupCompilerOptions(soundNullSafety: false);
+
+  group('(Unsound null safety)', () {
+    tearDownAll(() {
+      driver.finish();
+    });
+
+    runSharedTests(setup, driver);
+  });
+}
diff --git a/pkg/dev_compiler/test/expression_compiler/expression_compiler_test.dart b/pkg/dev_compiler/test/expression_compiler/expression_compiler_test.dart
index 588797a..17e60eb 100644
--- a/pkg/dev_compiler/test/expression_compiler/expression_compiler_test.dart
+++ b/pkg/dev_compiler/test/expression_compiler/expression_compiler_test.dart
@@ -461,1127 +461,6 @@
           });
         });
 
-        group('Expression compiler scope collection tests', () {
-          var source = '''
-          ${options.dartLangComment}
-
-          class C {
-            C(int this.field);
-
-            int methodFieldAccess(int x) {
-              var inScope = 1;
-              {
-                var innerInScope = global + staticField + field;
-                /* evaluation placeholder */
-                print(innerInScope);
-                var innerNotInScope = 2;
-              }
-              var notInScope = 3;
-            }
-
-            static int staticField = 0;
-            int field;
-          }
-
-          int global = 42;
-          main() => 0;
-          ''';
-
-          TestDriver driver;
-
-          setUp(() {
-            driver = TestDriver(options, source);
-          });
-
-          tearDown(() {
-            driver.delete();
-          });
-
-          test('local in scope', () async {
-            await driver.check(
-                scope: <String, String>{'inScope': '1', 'innerInScope': '0'},
-                expression: 'inScope',
-                expectedResult: '''
-            (function(inScope, innerInScope) {
-              return inScope;
-            }.bind(this)(
-              1,
-              0
-            ))
-            ''');
-          });
-
-          test('local in inner scope', () async {
-            await driver.check(
-                scope: <String, String>{'inScope': '1', 'innerInScope': '0'},
-                expression: 'innerInScope',
-                expectedResult: '''
-            (function(inScope, innerInScope) {
-              return innerInScope;
-            }.bind(this)(
-              1,
-              0
-            ))
-            ''');
-          });
-
-          test('global in scope', () async {
-            await driver.check(
-                scope: <String, String>{'inScope': '1', 'innerInScope': '0'},
-                expression: 'global',
-                expectedResult: '''
-            (function(inScope, innerInScope) {
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return foo.global;
-            }.bind(this)(
-              1,
-              0
-            ))
-            ''');
-          });
-
-          test('static field in scope', () async {
-            await driver.check(
-                scope: <String, String>{'inScope': '1', 'innerInScope': '0'},
-                expression: 'staticField',
-                expectedResult: '''
-            (function(inScope, innerInScope) {
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return foo.C.staticField;
-            }.bind(this)(
-              1,
-              0
-            ))
-            ''');
-          });
-
-          test('field in scope', () async {
-            await driver.check(
-                scope: <String, String>{'inScope': '1', 'innerInScope': '0'},
-                expression: 'field',
-                expectedResult: '''
-            (function(inScope, innerInScope) {
-              return this.field;
-            }.bind(this)(
-              1,
-              0
-            ))
-            ''');
-          });
-
-          test('local not in scope', () async {
-            await driver.check(
-                scope: <String, String>{'inScope': '1', 'innerInScope': '0'},
-                expression: 'notInScope',
-                expectedError:
-                    "Error: The getter 'notInScope' isn't defined for the class 'C'.");
-          });
-
-          test('local not in inner scope', () async {
-            await driver.check(
-                scope: <String, String>{'inScope': '1', 'innerInScope': '0'},
-                expression: 'innerNotInScope',
-                expectedError:
-                    "Error: The getter 'innerNotInScope' isn't defined for the class 'C'.");
-          });
-        });
-
-        group('Expression compiler tests in extension method:', () {
-          var source = '''
-          ${options.dartLangComment}
-          extension NumberParsing on String {
-            int parseInt() {
-              var ret = int.parse(this);
-              /* evaluation placeholder */
-              return ret;
-            }
-          }
-          main() => 0;
-          ''';
-
-          TestDriver driver;
-
-          setUp(() {
-            driver = TestDriver(options, source);
-          });
-
-          tearDown(() {
-            driver.delete();
-          });
-
-          test('compilation error', () async {
-            await driver.check(
-                scope: <String, String>{'ret': '1234'},
-                expression: 'typo',
-                expectedError: "Error: Getter not found: 'typo'");
-          });
-
-          test('local (trimmed scope)', () async {
-            // Test that current expression evaluation works in extension methods.
-            //
-            // Note: the actual scope is {#this, ret}, but #this is effectively
-            // removed in the expression compilator because it does not exist
-            // in JavaScript code.
-            // See (full scope) tests for what will the evaluation will look like
-            // when the mapping from dart symbols to JavaScipt symbols is added.
-            await driver.check(
-                scope: <String, String>{'ret': '1234'},
-                expression: 'ret',
-                expectedResult: '''
-            (function(ret) {
-              return ret;
-            }(
-              1234
-            ))
-            ''');
-          });
-
-          test('local (full scope)', () async {
-            // Test evalution in extension methods in the future when the mapping
-            // from kernel symbols to dartdevc symbols is added.
-            //
-            // Note: this currently fails due to
-            // - incremental compiler not allowing #this as a parameter name
-            await driver.check(
-                scope: <String, String>{'ret': '1234', '#this': 'this'},
-                expression: 'ret',
-                expectedError:
-                    "Illegal parameter name '#this' found during expression compilation.");
-          });
-
-          test('this (full scope)', () async {
-            // Test evalution in extension methods in the future when the mapping
-            // from kernel symbols to dartdevc symbols is added.
-            //
-            // Note: this currently fails due to
-            // - incremental compiler not allowing #this as a parameter name
-            // - incremental compiler not mapping 'this' from user input to '#this'
-            await driver.check(
-                scope: <String, String>{'ret': '1234', '#this': 'this'},
-                expression: 'this',
-                expectedError:
-                    "Illegal parameter name '#this' found during expression compilation.");
-          });
-        });
-
-        group('Expression compiler tests in static function:', () {
-          var source = '''
-          ${options.dartLangComment}
-          int foo(int x, {int y}) {
-            int z = 0;
-            /* evaluation placeholder */
-            return x + y + z;
-          }
-
-          main() => 0;
-          ''';
-
-          TestDriver driver;
-
-          setUp(() {
-            driver = TestDriver(options, source);
-          });
-
-          tearDown(() {
-            driver.delete();
-          });
-
-          test('compilation error', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'y': '2', 'z': '3'},
-                expression: 'typo',
-                expectedError: "Getter not found: \'typo\'");
-          });
-
-          test('local', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'y': '2', 'z': '3'},
-                expression: 'x',
-                expectedResult: '''
-            (function(x, y, z) {
-              return x;
-            }(
-              1,
-              2,
-              3
-            ))
-            ''');
-          });
-
-          test('formal', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'y': '2', 'z': '3'},
-                expression: 'y',
-                expectedResult: '''
-            (function(x, y, z) {
-              return y;
-            }(
-              1,
-              2,
-              3
-            ))
-            ''');
-          });
-
-          test('named formal', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'y': '2', 'z': '3'},
-                expression: 'z',
-                expectedResult: '''
-            (function(x, y, z) {
-              return z;
-            }(
-              1,
-              2,
-              3
-            ))
-            ''');
-          });
-
-          test('function', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'y': '2', 'z': '3'},
-                expression: 'main',
-                expectedResult: '''
-            (function(x, y, z) {
-              const dart_sdk = ${options.loadModule}('dart_sdk');
-              const dart = dart_sdk.dart;
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              var T = {
-                VoidTodynamic: () => (T.VoidTodynamic = dart.constFn(dart.fnType(dart.dynamic, [])))()
-              };
-              const CT = Object.create(null);
-              dart.defineLazy(CT, {
-                get C0() {
-                  return C[0] = dart.fn(foo.main, T.VoidTodynamic());
-                }
-              }, false);
-              var C = [void 0];
-              return C[0] || CT.C0;
-            }(
-              1,
-              2,
-              3
-            ))
-            ''');
-          });
-        });
-
-        group('Expression compiler tests in method:', () {
-          var source = '''
-          ${options.dartLangComment}
-          extension NumberParsing on String {
-            int parseInt() {
-              return int.parse(this);
-            }
-          }
-
-          int global = 42;
-
-          class C {
-            C(int this.field, int this._field);
-
-            static int staticField = 0;
-            static int _staticField = 1;
-
-            int _field;
-            int field;
-
-            int methodFieldAccess(int x) {
-              /* evaluation placeholder */
-              return x + _field + _staticField;
-            }
-
-            Future<int> asyncMethod(int x) async {
-              return x;
-            }
-          }
-
-          main() => 0;
-          ''';
-
-          TestDriver driver;
-
-          setUp(() {
-            driver = TestDriver(options, source);
-          });
-
-          tearDown(() {
-            driver.delete();
-          });
-
-          test('compilation error', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'typo',
-                expectedError:
-                    "The getter 'typo' isn't defined for the class 'C'");
-          });
-
-          test('local', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'x',
-                expectedResult: '''
-            (function(x) {
-              return x;
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('this', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'this',
-                expectedResult: '''
-            (function(x) {
-              return this;
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('expression using locals', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'x + 1',
-                expectedResult: '''
-            (function(x) {
-              const dart_sdk = ${options.loadModule}('dart_sdk');
-              const dart = dart_sdk.dart;
-              return dart.notNull(x) + 1;
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('expression using static fields', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'x + staticField',
-                expectedResult: '''
-            (function(x) {
-              const dart_sdk = ${options.loadModule}('dart_sdk');
-              const dart = dart_sdk.dart;
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return dart.notNull(x) + dart.notNull(foo.C.staticField);
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('expression using private static fields', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'x + _staticField',
-                expectedResult: '''
-            (function(x) {
-              const dart_sdk = ${options.loadModule}('dart_sdk');
-              const dart = dart_sdk.dart;
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return dart.notNull(x) + dart.notNull(foo.C._staticField);
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('expression using fields', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'x + field',
-                expectedResult: '''
-            (function(x) {
-              const dart_sdk = ${options.loadModule}('dart_sdk');
-              const dart = dart_sdk.dart;
-              return dart.notNull(x) + dart.notNull(this.field);
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('expression using private fields', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'x + _field',
-                expectedResult: '''
-            (function(x) {
-              const dart_sdk = ${options.loadModule}('dart_sdk');
-              const dart = dart_sdk.dart;
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              var S = {_field\$1: dart.privateName(foo, "_field")};
-              return dart.notNull(x) + dart.notNull(this[S._field\$1]);
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('expression using globals', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'x + global',
-                expectedResult: '''
-            (function(x) {
-              const dart_sdk = ${options.loadModule}('dart_sdk');
-              const dart = dart_sdk.dart;
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return dart.notNull(x) + dart.notNull(foo.global);
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('method call', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'methodFieldAccess(2)',
-                expectedResult: '''
-            (function(x) {
-              return this.methodFieldAccess(2);
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('async method call', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'asyncMethod(2)',
-                expectedResult: '''
-            (function(x) {
-              return this.asyncMethod(2);
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('extension method call', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: '"1234".parseInt()',
-                expectedResult: '''
-            (function(x) {
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return foo['NumberParsing|parseInt']("1234");
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('private field modification', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: '_field = 2',
-                expectedResult: '''
-            (function(x) {
-              const dart_sdk = ${options.loadModule}('dart_sdk');
-              const dart = dart_sdk.dart;
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              var S = {_field\$1: dart.privateName(foo, "_field")};
-              return this[S._field\$1] = 2;
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('field modification', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'field = 2',
-                expectedResult: '''
-            (function(x) {
-              return this.field = 2;
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('private static field modification', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: '_staticField = 2',
-                expectedResult: '''
-            (function(x) {
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return foo.C._staticField = 2;
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('static field modification', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'staticField = 2',
-                expectedResult: '''
-            (function(x) {
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return foo.C.staticField = 2;
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-        });
-
-        group('Expression compiler tests in method with no field access:', () {
-          var source = '''
-          ${options.dartLangComment}
-          extension NumberParsing on String {
-            int parseInt() {
-              return int.parse(this);
-            }
-          }
-
-          int global = 42;
-
-          class C {
-            C(int this.field, int this._field);
-
-            static int staticField = 0;
-            static int _staticField = 1;
-
-            int _field;
-            int field;
-
-            int methodNoFieldAccess(int x) {
-              /* evaluation placeholder */
-              return x;
-            }
-
-            Future<int> asyncMethod(int x) async {
-              return x;
-            }
-          }
-
-          main() => 0;
-          ''';
-
-          TestDriver driver;
-          setUp(() {
-            driver = TestDriver(options, source);
-          });
-
-          tearDown(() {
-            driver.delete();
-          });
-
-          test('compilation error', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'typo',
-                expectedError:
-                    "The getter 'typo' isn't defined for the class 'C'");
-          });
-
-          test('expression using static fields', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'x + staticField',
-                expectedResult: '''
-            (function(x) {
-              const dart_sdk = ${options.loadModule}('dart_sdk');
-              const dart = dart_sdk.dart;
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return dart.notNull(x) + dart.notNull(foo.C.staticField);
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('expression using private static fields', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'x + _staticField',
-                expectedResult: '''
-            (function(x) {
-              const dart_sdk = ${options.loadModule}('dart_sdk');
-              const dart = dart_sdk.dart;
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return dart.notNull(x) + dart.notNull(foo.C._staticField);
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('expression using fields', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'x + field',
-                expectedResult: '''
-            (function(x) {
-              const dart_sdk = ${options.loadModule}('dart_sdk');
-              const dart = dart_sdk.dart;
-              return dart.notNull(x) + dart.notNull(this.field);
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('expression using private fields', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'x + _field',
-                expectedResult: '''
-            (function(x) {
-              const dart_sdk = ${options.loadModule}('dart_sdk');
-              const dart = dart_sdk.dart;
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              var S = {_field\$1: dart.privateName(foo, "_field")};
-              return dart.notNull(x) + dart.notNull(this[S._field\$1]);
-            }.bind(this)(
-            1
-            ))
-            ''');
-          });
-
-          test('private field modification', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: '_field = 2',
-                expectedResult: '''
-            (function(x) {
-              const dart_sdk = ${options.loadModule}('dart_sdk');
-              const dart = dart_sdk.dart;
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              var S = {_field\$1: dart.privateName(foo, "_field")};
-              return this[S._field\$1] = 2;
-            }.bind(this)(
-            1
-            ))
-            ''');
-          });
-
-          test('field modification', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'field = 2',
-                expectedResult: '''
-            (function(x) {
-              return this.field = 2;
-            }.bind(this)(
-            1
-            ))
-            ''');
-          });
-
-          test('private static field modification', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: '_staticField = 2',
-                expectedResult: '''
-            (function(x) {
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return foo.C._staticField = 2;
-            }.bind(this)(
-            1
-            ))
-            ''');
-          });
-
-          test('static field modification', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'staticField = 2',
-                expectedResult: '''
-            (function(x) {
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return foo.C.staticField = 2;
-            }.bind(this)(
-            1
-            ))
-            ''');
-          });
-        });
-
-        group('Expression compiler tests in async method:', () {
-          var source = '''
-          ${options.dartLangComment}
-          class C {
-            C(int this.field, int this._field);
-
-            int _field;
-            int field;
-
-            Future<int> asyncMethod(int x) async {
-              /* evaluation placeholder */
-              return x;
-            }
-          }
-
-          main() => 0;
-          ''';
-
-          TestDriver driver;
-          setUp(() {
-            driver = TestDriver(options, source);
-          });
-
-          tearDown(() {
-            driver.delete();
-          });
-
-          test('compilation error', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'typo',
-                expectedError:
-                    "The getter 'typo' isn't defined for the class 'C'");
-          });
-
-          test('local', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'x',
-                expectedResult: '''
-            (function(x) {
-              return x;
-            }.bind(this)(
-            1
-            ))
-            ''');
-          });
-
-          test('this', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'this',
-                expectedResult: '''
-            (function(x) {
-              return this;
-            }.bind(this)(
-            1
-            ))
-            ''');
-          });
-        });
-
-        group('Expression compiler tests in global function:', () {
-          var source = '''
-          ${options.dartLangComment}
-          extension NumberParsing on String {
-            int parseInt() {
-              return int.parse(this);
-            }
-          }
-
-          int global = 42;
-
-          class C {
-            C(int this.field, int this._field);
-
-            static int staticField = 0;
-            static int _staticField = 1;
-
-            int _field;
-            int field;
-
-            int methodFieldAccess(int x) {
-              return (x + _field + _staticField);
-            }
-            int methodFieldAccess(int x) {
-              return (x)
-            }
-
-            Future<int> asyncMethod(int x) async {
-              return x;
-            }
-          }
-
-          int main() {
-            int x = 15;
-            var c = C(1, 2);
-            /* evaluation placeholder */
-            return 0;
-          }
-          ''';
-
-          TestDriver driver;
-          setUp(() {
-            driver = TestDriver(options, source);
-          });
-
-          tearDown(() {
-            driver.delete();
-          });
-
-          test('compilation error', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null'},
-                expression: 'typo',
-                expectedError: "Getter not found: 'typo'.");
-          });
-
-          test('local with primitive type', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null'},
-                expression: 'x',
-                expectedResult: '''
-            (function(x, c) {
-              return x;
-            }(
-              1,
-              null
-            ))
-            ''');
-          });
-
-          test('local object', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null'},
-                expression: 'c',
-                expectedResult: '''
-            (function(x, c) {
-              return c;
-            }(
-              1,
-              null
-            ))
-            ''');
-          });
-
-          test('create new object', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null'},
-                expression: 'C(1,3)',
-                expectedResult: '''
-              (function(x, c) {
-                const foo\$46dart = ${options.loadModule}('foo.dart');
-                const foo = foo\$46dart.foo;
-                return new foo.C.new(1, 3);
-              }(
-                1,
-                null
-              ))
-              ''');
-          });
-
-          test('access field of new object', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null'},
-                expression: 'C(1,3)._field',
-                expectedResult: '''
-            (function(x, c) {
-              const dart_sdk = ${options.loadModule}('dart_sdk');
-              const dart = dart_sdk.dart;
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              var S = {_field\$1: dart.privateName(foo, "_field")};
-              return new foo.C.new(1, 3)[S._field\$1];
-            }(
-              1,
-              null
-            ))
-            ''');
-          });
-
-          test('access static field', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null'},
-                expression: 'C.staticField',
-                expectedResult: '''
-            (function(x, c) {
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return foo.C.staticField;
-            }(
-              1,
-              null
-            ))
-            ''');
-          });
-
-          test('expression using private static fields', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null'},
-                expression: 'C._staticField',
-                expectedError: "Error: Getter not found: '_staticField'.");
-          });
-
-          test('access field', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null'},
-                expression: 'c.field',
-                expectedResult: '''
-            (function(x, c) {
-              return c.field;
-            }(
-              1,
-              null
-            ))
-            ''');
-          });
-
-          test('access private field', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null'},
-                expression: 'c._field',
-                expectedResult: '''
-            (function(x, c) {
-              const dart_sdk = ${options.loadModule}('dart_sdk');
-              const dart = dart_sdk.dart;
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              var S = {_field\$1: dart.privateName(foo, "_field")};
-              return c[S._field\$1];
-            }(
-              1,
-              null
-            ))
-            ''');
-          });
-
-          test('method call', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null'},
-                expression: 'c.methodFieldAccess(2)',
-                expectedResult: '''
-            (function(x, c) {
-              return c.methodFieldAccess(2);
-            }(
-              1,
-              null
-            ))
-            ''');
-          });
-
-          test('async method call', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null'},
-                expression: 'c.asyncMethod(2)',
-                expectedResult: '''
-            (function(x, c) {
-              return c.asyncMethod(2);
-            }(
-              1,
-              null
-            ))
-            ''');
-          });
-
-          test('extension method call', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null'},
-                expression: '"1234".parseInt()',
-                expectedResult: '''
-            (function(x, c) {
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return foo['NumberParsing|parseInt']("1234");
-            }(
-              1,
-              null
-            ))
-            ''');
-          });
-
-          test('private field modification', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null'},
-                expression: 'c._field = 2',
-                expectedResult: '''
-            (function(x, c) {
-              const dart_sdk = ${options.loadModule}('dart_sdk');
-              const dart = dart_sdk.dart;
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              var S = {_field\$1: dart.privateName(foo, "_field")};
-              return c[S._field\$1] = 2;
-            }(
-              1,
-              null
-            ))
-            ''');
-          });
-
-          test('field modification', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null'},
-                expression: 'c.field = 2',
-                expectedResult: '''
-            (function(x, c) {
-              return c.field = 2;
-            }(
-              1,
-              null
-            ))
-            ''');
-          });
-
-          test('private static field modification', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null'},
-                expression: 'C._staticField = 2',
-                expectedError: "Setter not found: '_staticField'.");
-          });
-
-          test('static field modification', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null'},
-                expression: 'C.staticField = 2',
-                expectedResult: '''
-            (function(x, c) {
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return foo.C.staticField = 2;
-            }(
-              1,
-              null
-            ))
-            ''');
-          });
-
-          test('call global function from core library', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null'},
-                expression: 'print(x)',
-                expectedResult: '''
-            (function(x, c) {
-              const dart_sdk = ${options.loadModule}('dart_sdk');
-              const core = dart_sdk.core;
-              return core.print(x);
-            }(
-              1,
-              null
-            ))
-            ''');
-          });
-        });
-
         group('Expression compiler tests in closures:', () {
           var source = '''
           ${options.dartLangComment}
@@ -1669,713 +548,6 @@
           });
         });
 
-        group('Expression compiler tests in method with no type use:', () {
-          var source = '''
-        ${options.dartLangComment}
-          abstract class Key {
-            const factory Key(String value) = ValueKey;
-            const Key.empty();
-          }
-
-          abstract class LocalKey extends Key {
-            const LocalKey() : super.empty();
-          }
-
-          class ValueKey implements LocalKey {
-            const ValueKey(this.value);
-            final String value;
-          }
-
-          class MyClass {
-            const MyClass(this._t);
-            final int _t;
-          }
-
-          int bar(int p){
-            return p;
-          }
-          int baz(String t){
-            return t;
-          }
-          void main() {
-            var k = Key('t');
-            MyClass c = MyClass(0);
-            int p = 1;
-            const t = 1;
-
-            /* evaluation placeholder */
-            print('\$c, \$k, \$t');
-          }
-          ''';
-
-          TestDriver driver;
-          setUp(() {
-            driver = TestDriver(options, source);
-          });
-
-          tearDown(() {
-            driver.delete();
-          });
-
-          test('call function not using type', () async {
-            await driver.check(
-                scope: <String, String>{'p': '1'},
-                expression: 'bar(p)',
-                expectedResult: '''
-            (function(p) {
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return foo.bar(p);
-            }(
-              1
-            ))
-            ''');
-          });
-
-          test('call function using type', () async {
-            await driver.check(
-                scope: <String, String>{'p': '0'},
-                expression: 'baz(p as String)',
-                expectedResult: '''
-            (function(p) {
-              const dart_sdk = ${options.loadModule}('dart_sdk');
-              const core = dart_sdk.core;
-              const dart = dart_sdk.dart;
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              var T = {
-                StringL: () => (T.StringL = dart.constFn(dart.legacy(core.String)))()
-              };
-              return foo.baz(T.StringL().as(p));
-            }(
-              0
-            ))
-            ''');
-          });
-
-          test('evaluate new const expression', () async {
-            await driver.check(
-                scope: <String, String>{'p': '1'},
-                expression: 'const MyClass(1)',
-                expectedResult: '''
-            (function(p) {
-              const dart_sdk = ${options.loadModule}('dart_sdk');
-              const dart = dart_sdk.dart;
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              var S = {MyClass__t: dart.privateName(foo, "MyClass._t")};
-              const CT = Object.create(null);
-              dart.defineLazy(CT, {
-                get C0() {
-                  return C[0] = dart.const({
-                    __proto__: foo.MyClass.prototype,
-                    [S.MyClass__t]: 1
-                  });
-                }
-              }, false);
-              var C = [void 0];
-              return C[0] || CT.C0;
-            }(
-              1
-            ))
-            ''');
-          });
-
-          test('evaluate optimized const expression', () async {
-            await driver.check(
-                scope: <String, String>{},
-                expression: 't',
-                expectedResult: '''
-            (function() {
-              return 1;
-            }(
-            ))
-            ''');
-          },
-              skip: 'Cannot compile constants optimized away by the frontend. '
-                  'Issue: https://github.com/dart-lang/sdk/issues/41999');
-
-          test('evaluate factory constructor call', () async {
-            await driver.check(
-                scope: <String, String>{'p': '1'},
-                expression: "Key('t')",
-                expectedResult: '''
-            (function(p) {
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return new foo.ValueKey.new("t");
-            }(
-              1
-            ))
-            ''');
-          });
-
-          test('evaluate const factory constructor call', () async {
-            await driver.check(
-                scope: <String, String>{'p': '1'},
-                expression: "const Key('t')",
-                expectedResult: '''
-            (function(p) {
-              const dart_sdk = ${options.loadModule}('dart_sdk');
-              const dart = dart_sdk.dart;
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              var S = {ValueKey_value: dart.privateName(foo, "ValueKey.value")};
-              const CT = Object.create(null);
-              dart.defineLazy(CT, {
-                get C0() {
-                  return C[0] = dart.const({
-                    __proto__: foo.ValueKey.prototype,
-                    [S.ValueKey_value]: "t"
-                  });
-                }
-              }, false);
-              var C = [void 0];
-              return C[0] || CT.C0;
-            }(
-              1
-            ))
-            ''');
-          });
-        });
-
-        group('Expression compiler tests in constructor:', () {
-          var source = '''
-          ${options.dartLangComment}
-          extension NumberParsing on String {
-            int parseInt() {
-              return int.parse(this);
-            }
-          }
-
-          int global = 42;
-
-          class C {
-            C(int this.field, int this._field) {
-              int x = 1;
-              /* evaluation placeholder */
-              print(this.field);
-            }
-
-            static int staticField = 0;
-            static int _staticField = 1;
-
-            int _field;
-            int field;
-
-            int methodFieldAccess(int t) {
-              return t + _field + _staticField;
-            }
-
-            Future<int> asyncMethod(int t) async {
-              return t;
-            }
-          }
-
-          main() => 0;
-          ''';
-
-          TestDriver driver;
-
-          setUp(() {
-            driver = TestDriver(options, source);
-          });
-
-          tearDown(() {
-            driver.delete();
-          });
-
-          test('compilation error', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'typo',
-                expectedError:
-                    "The getter 'typo' isn't defined for the class 'C'");
-          });
-
-          test('local', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'x',
-                expectedResult: '''
-            (function(x) {
-              return x;
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('this', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'this',
-                expectedResult: '''
-            (function(x) {
-              return this;
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('expression using locals', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'x + 1',
-                expectedResult: '''
-            (function(x) {
-              const dart_sdk = ${options.loadModule}('dart_sdk');
-              const dart = dart_sdk.dart;
-              return dart.notNull(x) + 1;
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('expression using static fields', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'x + staticField',
-                expectedResult: '''
-            (function(x) {
-              const dart_sdk = ${options.loadModule}('dart_sdk');
-              const dart = dart_sdk.dart;
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return dart.notNull(x) + dart.notNull(foo.C.staticField);
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('expression using private static fields', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'x + _staticField',
-                expectedResult: '''
-            (function(x) {
-              const dart_sdk = ${options.loadModule}('dart_sdk');
-              const dart = dart_sdk.dart;
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return dart.notNull(x) + dart.notNull(foo.C._staticField);
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('expression using fields', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'x + field',
-                expectedResult: '''
-            (function(x) {
-              const dart_sdk = ${options.loadModule}('dart_sdk');
-              const dart = dart_sdk.dart;
-              return dart.notNull(x) + dart.notNull(this.field);
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('expression using private fields', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'x + _field',
-                expectedResult: '''
-            (function(x) {
-              const dart_sdk = ${options.loadModule}('dart_sdk');
-              const dart = dart_sdk.dart;
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              var S = {_field\$1: dart.privateName(foo, "_field")};
-              return dart.notNull(x) + dart.notNull(this[S._field\$1]);
-            }.bind(this)(
-                1
-            ))
-            ''');
-          });
-
-          test('expression using globals', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'x + global',
-                expectedResult: '''
-            (function(x) {
-              const dart_sdk = ${options.loadModule}('dart_sdk');
-              const dart = dart_sdk.dart;
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return dart.notNull(x) + dart.notNull(foo.global);
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('method call', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'methodFieldAccess(2)',
-                expectedResult: '''
-            (function(x) {
-              return this.methodFieldAccess(2);
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('async method call', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'asyncMethod(2)',
-                expectedResult: '''
-            (function(x) {
-              return this.asyncMethod(2);
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('extension method call', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: '"1234".parseInt()',
-                expectedResult: '''
-            (function(x) {
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return foo['NumberParsing|parseInt']("1234");
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('private field modification', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: '_field = 2',
-                expectedResult: '''
-            (function(x) {
-              const dart_sdk = ${options.loadModule}('dart_sdk');
-              const dart = dart_sdk.dart;
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              var S = {_field\$1: dart.privateName(foo, "_field")};
-              return this[S._field\$1] = 2;
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('field modification', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'field = 2',
-                expectedResult: '''
-            (function(x) {
-              return this.field = 2;
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('private static field modification', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: '_staticField = 2',
-                expectedResult: '''
-            (function(x) {
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return foo.C._staticField = 2;
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('static field modification', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'staticField = 2',
-                expectedResult: '''
-            (function(x) {
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return foo.C.staticField = 2;
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-        });
-
-        group('Expression compiler tests in simple loops:', () {
-          var source = '''
-          ${options.dartLangComment}
-          int globalFunction() {
-            int x = 15;
-            var c = C(1, 2);
-
-            for(int i = 0; i < 10; i++) {
-              /* evaluation placeholder */
-              print('\$i+\$x');
-            };
-            return 0;
-          }
-
-          main() => 0;
-          ''';
-
-          TestDriver driver;
-          setUp(() {
-            driver = TestDriver(options, source);
-          });
-
-          tearDown(() {
-            driver.delete();
-          });
-
-          test('expression using local', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null', 'i': '0'},
-                expression: 'x',
-                expectedResult: '''
-            (function(x, c, i) {
-              return x;
-            }(
-              1,
-              null,
-              0
-            ))
-            ''');
-          });
-
-          test('expression using loop variable', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null', 'i': '0'},
-                expression: 'i',
-                expectedResult: '''
-            (function(x, c, i) {
-              return i;
-            }(
-              1,
-              null,
-              0
-            ))
-            ''');
-          });
-        });
-
-        group('Expression compiler tests in iterator loops:', () {
-          var source = '''
-          ${options.dartLangComment}
-          int globalFunction() {
-            var l = <String>['1', '2', '3'];
-
-            for(var e in l) {
-              /* evaluation placeholder */
-              print(e);
-            };
-            return 0;
-          }
-
-          main() => 0;
-          ''';
-
-          TestDriver driver;
-          setUp(() {
-            driver = TestDriver(options, source);
-          });
-
-          tearDown(() {
-            driver.delete();
-          });
-
-          test('expression loop variable', () async {
-            await driver.check(
-                scope: <String, String>{'l': 'null', 'e': '1'},
-                expression: 'e',
-                expectedResult: '''
-            (function(l, e) {
-              return e;
-            }(
-              null,
-              1
-            ))
-            ''');
-          });
-        });
-
-        group('Expression compiler tests in conditional (then):', () {
-          var source = '''
-          ${options.dartLangComment}
-          int globalFunction() {
-            int x = 1;
-            var c = C(1, 2);
-
-            if (x == 14) {
-              int y = 3;
-              /* evaluation placeholder */
-              print('\$y+\$x');
-            } else {
-              int z = 3;
-              print('\$z+\$x');
-            }
-            return 0;
-          }
-
-          main() => 0;
-          ''';
-
-          TestDriver driver;
-          setUp(() {
-            driver = TestDriver(options, source);
-          });
-
-          tearDown(() {
-            driver.delete();
-          });
-
-          test('expression using local', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null', 'y': '3'},
-                expression: 'y',
-                expectedResult: '''
-            (function(x, c, y) {
-              return y;
-            }(
-              1,
-              null,
-              3
-            ))
-            ''');
-          });
-
-          test('expression using local out of scope', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null', 'y': '3'},
-                expression: 'z',
-                expectedError: "Error: Getter not found: 'z'");
-          });
-        });
-
-        group('Expression compiler tests in conditional (else):', () {
-          var source = '''
-          ${options.dartLangComment}
-          int globalFunction() {
-            int x = 1;
-            var c = C(1, 2);
-
-            if (x == 14) {
-              int y = 3;
-              print('\$y+\$x');
-            } else {
-              int z = 3;
-              /* evaluation placeholder */
-              print('\$z+\$x');
-            }
-            return 0;
-          }
-
-          main() => 0;
-          ''';
-
-          TestDriver driver;
-          setUp(() {
-            driver = TestDriver(options, source);
-          });
-
-          tearDown(() {
-            driver.delete();
-          });
-
-          test('expression using local', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null', 'z': '3'},
-                expression: 'z',
-                expectedResult: '''
-            (function(x, c, z) {
-              return z;
-            }(
-              1,
-              null,
-              3
-            ))
-            ''');
-          });
-
-          test('expression using local out of scope', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null', 'z': '3'},
-                expression: 'y',
-                expectedError: "Error: Getter not found: 'y'");
-          });
-        });
-
-        group('Expression compiler tests after conditionals:', () {
-          var source = '''
-          ${options.dartLangComment}
-          int globalFunction() {
-            int x = 1;
-            var c = C(1, 2);
-
-            if (x == 14) {
-              int y = 3;
-              print('\$y+\$x');
-            } else {
-              int z = 3;
-              print('\$z+\$x');
-            }
-            /* evaluation placeholder */
-            return 0;
-          }
-
-          main() => 0;
-          ''';
-
-          TestDriver driver;
-          setUp(() {
-            driver = TestDriver(options, source);
-          });
-
-          tearDown(() {
-            driver.delete();
-          });
-
-          test('expression using local', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null'},
-                expression: 'x',
-                expectedResult: '''
-          (function(x, c) {
-            return x;
-          }(
-            1,
-            null
-          ))
-          ''');
-          });
-
-          test('expression using local out of scope', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null'},
-                expression: 'z',
-                expectedError: "Error: Getter not found: 'z'");
-          });
-        });
-
         group(
             'Expression compiler tests for interactions with module containers:',
             () {
@@ -2762,1111 +934,6 @@
           });
         });
 
-        group('Expression compiler scope collection tests', () {
-          var source = '''
-          ${options.dartLangComment}
-
-          class C {
-            C(int this.field);
-
-            int methodFieldAccess(int x) {
-              var inScope = 1;
-              {
-                var innerInScope = global + staticField + field;
-                /* evaluation placeholder */
-                print(innerInScope);
-                var innerNotInScope = 2;
-              }
-              var notInScope = 3;
-            }
-
-            static int staticField = 0;
-            int field;
-          }
-
-          int global = 42;
-          main() => 0;
-          ''';
-
-          TestDriver driver;
-
-          setUp(() {
-            driver = TestDriver(options, source);
-          });
-
-          tearDown(() {
-            driver.delete();
-          });
-
-          test('local in scope', () async {
-            await driver.check(
-                scope: <String, String>{'inScope': '1', 'innerInScope': '0'},
-                expression: 'inScope',
-                expectedResult: '''
-            (function(inScope, innerInScope) {
-              return inScope;
-            }.bind(this)(
-              1,
-              0
-            ))
-            ''');
-          });
-
-          test('local in inner scope', () async {
-            await driver.check(
-                scope: <String, String>{'inScope': '1', 'innerInScope': '0'},
-                expression: 'innerInScope',
-                expectedResult: '''
-            (function(inScope, innerInScope) {
-              return innerInScope;
-            }.bind(this)(
-              1,
-              0
-            ))
-            ''');
-          });
-
-          test('global in scope', () async {
-            await driver.check(
-                scope: <String, String>{'inScope': '1', 'innerInScope': '0'},
-                expression: 'global',
-                expectedResult: '''
-            (function(inScope, innerInScope) {
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return foo.global;
-            }.bind(this)(
-              1,
-              0
-            ))
-            ''');
-          });
-
-          test('static field in scope', () async {
-            await driver.check(
-                scope: <String, String>{'inScope': '1', 'innerInScope': '0'},
-                expression: 'staticField',
-                expectedResult: '''
-            (function(inScope, innerInScope) {
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return foo.C.staticField;
-            }.bind(this)(
-              1,
-              0
-            ))
-            ''');
-          });
-
-          test('field in scope', () async {
-            await driver.check(
-                scope: <String, String>{'inScope': '1', 'innerInScope': '0'},
-                expression: 'field',
-                expectedResult: '''
-            (function(inScope, innerInScope) {
-              return this.field;
-            }.bind(this)(
-              1,
-              0
-            ))
-            ''');
-          });
-
-          test('local not in scope', () async {
-            await driver.check(
-                scope: <String, String>{'inScope': '1', 'innerInScope': '0'},
-                expression: 'notInScope',
-                expectedError:
-                    "Error: The getter 'notInScope' isn't defined for the class 'C'.");
-          });
-
-          test('local not in inner scope', () async {
-            await driver.check(
-                scope: <String, String>{'inScope': '1', 'innerInScope': '0'},
-                expression: 'innerNotInScope',
-                expectedError:
-                    "Error: The getter 'innerNotInScope' isn't defined for the class 'C'.");
-          });
-        });
-
-        group('Expression compiler tests in extension method:', () {
-          var source = '''
-          ${options.dartLangComment}
-          extension NumberParsing on String {
-            int parseInt() {
-              var ret = int.parse(this);
-              /* evaluation placeholder */
-              return ret;
-            }
-          }
-          main() => 0;
-          ''';
-
-          TestDriver driver;
-
-          setUp(() {
-            driver = TestDriver(options, source);
-          });
-
-          tearDown(() {
-            driver.delete();
-          });
-
-          test('compilation error', () async {
-            await driver.check(
-                scope: <String, String>{'ret': '1234'},
-                expression: 'typo',
-                expectedError: "Error: Getter not found: 'typo'");
-          });
-
-          test('local (trimmed scope)', () async {
-            // Test that current expression evaluation works in extension methods.
-            //
-            // Note: the actual scope is {#this, ret}, but #this is effectively
-            // removed in the expression compilator because it does not exist
-            // in JavaScript code.
-            // See (full scope) tests for what will the evaluation will look like
-            // when the mapping from dart symbols to JavaScipt symbols is added.
-            await driver.check(
-                scope: <String, String>{'ret': '1234'},
-                expression: 'ret',
-                expectedResult: '''
-            (function(ret) {
-              return ret;
-            }(
-              1234
-            ))
-            ''');
-          });
-
-          test('local (full scope)', () async {
-            // Test evalution in extension methods in the future when the mapping
-            // from kernel symbols to dartdevc symbols is added.
-            //
-            // Note: this currently fails due to
-            // - incremental compiler not allowing #this as a parameter name
-            await driver.check(
-                scope: <String, String>{'ret': '1234', '#this': 'this'},
-                expression: 'ret',
-                expectedError:
-                    "Illegal parameter name '#this' found during expression compilation.");
-          });
-
-          test('this (full scope)', () async {
-            // Test evalution in extension methods in the future when the mapping
-            // from kernel symbols to dartdevc symbols is added.
-            //
-            // Note: this currently fails due to
-            // - incremental compiler not allowing #this as a parameter name
-            // - incremental compiler not mapping 'this' from user input to '#this'
-            await driver.check(
-                scope: <String, String>{'ret': '1234', '#this': 'this'},
-                expression: 'this',
-                expectedError:
-                    "Illegal parameter name '#this' found during expression compilation.");
-          });
-        });
-
-        group('Expression compiler tests in static function:', () {
-          var source = '''
-          ${options.dartLangComment}
-          int foo(int x, {int y}) {
-            int z = 0;
-            /* evaluation placeholder */
-            return x + y + z;
-          }
-
-          main() => 0;
-          ''';
-
-          TestDriver driver;
-
-          setUp(() {
-            driver = TestDriver(options, source);
-          });
-
-          tearDown(() {
-            driver.delete();
-          });
-
-          test('compilation error', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'y': '2', 'z': '3'},
-                expression: 'typo',
-                expectedError: "Getter not found: \'typo\'");
-          });
-
-          test('local', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'y': '2', 'z': '3'},
-                expression: 'x',
-                expectedResult: '''
-            (function(x, y, z) {
-              return x;
-            }(
-              1,
-              2,
-              3
-            ))
-            ''');
-          });
-
-          test('formal', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'y': '2', 'z': '3'},
-                expression: 'y',
-                expectedResult: '''
-            (function(x, y, z) {
-              return y;
-            }(
-              1,
-              2,
-              3
-            ))
-            ''');
-          });
-
-          test('named formal', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'y': '2', 'z': '3'},
-                expression: 'z',
-                expectedResult: '''
-            (function(x, y, z) {
-              return z;
-            }(
-              1,
-              2,
-              3
-            ))
-            ''');
-          });
-
-          test('function', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'y': '2', 'z': '3'},
-                expression: 'main',
-                expectedResult: '''
-            (function(x, y, z) {
-              const dart_sdk = ${options.loadModule}('dart_sdk');
-              const dart = dart_sdk.dart;
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              var T = {
-                VoidTodynamic: () => (T.VoidTodynamic = dart.constFn(dart.fnType(dart.dynamic, [])))()
-              };
-              const CT = Object.create(null);
-              dart.defineLazy(CT, {
-                get C0() {
-                  return C[0] = dart.fn(foo.main, T.VoidTodynamic());
-                }
-              }, false);
-              var C = [void 0];
-              return C[0] || CT.C0;
-            }(
-              1,
-              2,
-              3
-            ))
-            ''');
-          });
-        });
-
-        group('Expression compiler tests in method:', () {
-          var source = '''
-          ${options.dartLangComment}
-          extension NumberParsing on String {
-            int parseInt() {
-              return int.parse(this);
-            }
-          }
-
-          int global = 42;
-
-          class C {
-            C(int this.field, int this._field);
-
-            static int staticField = 0;
-            static int _staticField = 1;
-
-            int _field;
-            int field;
-
-            int methodFieldAccess(int x) {
-              /* evaluation placeholder */
-              return x + _field + _staticField;
-            }
-
-            Future<int> asyncMethod(int x) async {
-              return x;
-            }
-          }
-
-          main() => 0;
-          ''';
-
-          TestDriver driver;
-
-          setUp(() {
-            driver = TestDriver(options, source);
-          });
-
-          tearDown(() {
-            driver.delete();
-          });
-
-          test('compilation error', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'typo',
-                expectedError:
-                    "The getter 'typo' isn't defined for the class 'C'");
-          });
-
-          test('local', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'x',
-                expectedResult: '''
-            (function(x) {
-              return x;
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('this', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'this',
-                expectedResult: '''
-            (function(x) {
-              return this;
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('expression using locals', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'x + 1',
-                expectedResult: '''
-            (function(x) {
-              return x + 1;
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('expression using static fields', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'x + staticField',
-                expectedResult: '''
-            (function(x) {
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return x + foo.C.staticField;
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('expression using private static fields', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'x + _staticField',
-                expectedResult: '''
-            (function(x) {
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return x + foo.C._staticField;
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('expression using fields', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'x + field',
-                expectedResult: '''
-            (function(x) {
-              return x + this.field;
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('expression using private fields', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'x + _field',
-                expectedResult: '''
-            (function(x) {
-              const dart_sdk = ${options.loadModule}('dart_sdk');
-              const dart = dart_sdk.dart;
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              var S = {_field\$1: dart.privateName(foo, "_field")};
-              return x + this[S._field\$1];
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('expression using globals', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'x + global',
-                expectedResult: '''
-            (function(x) {
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return x + foo.global;
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('method call', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'methodFieldAccess(2)',
-                expectedResult: '''
-            (function(x) {
-              return this.methodFieldAccess(2);
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('async method call', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'asyncMethod(2)',
-                expectedResult: '''
-            (function(x) {
-              return this.asyncMethod(2);
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('extension method call', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: '"1234".parseInt()',
-                expectedResult: '''
-            (function(x) {
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return foo['NumberParsing|parseInt']("1234");
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('private field modification', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: '_field = 2',
-                expectedResult: '''
-            (function(x) {
-              const dart_sdk = ${options.loadModule}('dart_sdk');
-              const dart = dart_sdk.dart;
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              var S = {_field\$1: dart.privateName(foo, "_field")};
-              return this[S._field\$1] = 2;
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('field modification', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'field = 2',
-                expectedResult: '''
-            (function(x) {
-              return this.field = 2;
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('private static field modification', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: '_staticField = 2',
-                expectedResult: '''
-            (function(x) {
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return foo.C._staticField = 2;
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('static field modification', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'staticField = 2',
-                expectedResult: '''
-            (function(x) {
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return foo.C.staticField = 2;
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-        });
-
-        group('Expression compiler tests in method with no field access:', () {
-          var source = '''
-          ${options.dartLangComment}
-          extension NumberParsing on String {
-            int parseInt() {
-              return int.parse(this);
-            }
-          }
-
-          int global = 42;
-
-          class C {
-            C(int this.field, int this._field);
-
-            static int staticField = 0;
-            static int _staticField = 1;
-
-            int _field;
-            int field;
-
-            int methodNoFieldAccess(int x) {
-              /* evaluation placeholder */
-              return x;
-            }
-
-            Future<int> asyncMethod(int x) async {
-              return x;
-            }
-          }
-
-          main() => 0;
-          ''';
-
-          TestDriver driver;
-          setUp(() {
-            driver = TestDriver(options, source);
-          });
-
-          tearDown(() {
-            driver.delete();
-          });
-
-          test('compilation error', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'typo',
-                expectedError:
-                    "The getter 'typo' isn't defined for the class 'C'");
-          });
-
-          test('expression using static fields', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'x + staticField',
-                expectedResult: '''
-            (function(x) {
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return x + foo.C.staticField;
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('expression using private static fields', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'x + _staticField',
-                expectedResult: '''
-            (function(x) {
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return x + foo.C._staticField;
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('expression using fields', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'x + field',
-                expectedResult: '''
-            (function(x) {
-              return x + this.field;
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('expression using private fields', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'x + _field',
-                expectedResult: '''
-            (function(x) {
-              const dart_sdk = ${options.loadModule}('dart_sdk');
-              const dart = dart_sdk.dart;
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              var S = {_field\$1: dart.privateName(foo, "_field")};
-              return x + this[S._field\$1];
-            }.bind(this)(
-            1
-            ))
-            ''');
-          });
-
-          test('private field modification', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: '_field = 2',
-                expectedResult: '''
-            (function(x) {
-              const dart_sdk = ${options.loadModule}('dart_sdk');
-              const dart = dart_sdk.dart;
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              var S = {_field\$1: dart.privateName(foo, "_field")};
-              return this[S._field\$1] = 2;
-            }.bind(this)(
-            1
-            ))
-            ''');
-          });
-
-          test('field modification', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'field = 2',
-                expectedResult: '''
-            (function(x) {
-              return this.field = 2;
-            }.bind(this)(
-            1
-            ))
-            ''');
-          });
-
-          test('private static field modification', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: '_staticField = 2',
-                expectedResult: '''
-            (function(x) {
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return foo.C._staticField = 2;
-            }.bind(this)(
-            1
-            ))
-            ''');
-          });
-
-          test('static field modification', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'staticField = 2',
-                expectedResult: '''
-            (function(x) {
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return foo.C.staticField = 2;
-            }.bind(this)(
-            1
-            ))
-            ''');
-          });
-        });
-
-        group('Expression compiler tests in async method:', () {
-          var source = '''
-          ${options.dartLangComment}
-          class C {
-            C(int this.field, int this._field);
-
-            int _field;
-            int field;
-
-            Future<int> asyncMethod(int x) async {
-              /* evaluation placeholder */
-              return x;
-            }
-          }
-
-          main() => 0;
-          ''';
-
-          TestDriver driver;
-          setUp(() {
-            driver = TestDriver(options, source);
-          });
-
-          tearDown(() {
-            driver.delete();
-          });
-
-          test('compilation error', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'typo',
-                expectedError:
-                    "The getter 'typo' isn't defined for the class 'C'");
-          });
-
-          test('local', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'x',
-                expectedResult: '''
-            (function(x) {
-              return x;
-            }.bind(this)(
-            1
-            ))
-            ''');
-          });
-
-          test('this', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'this',
-                expectedResult: '''
-            (function(x) {
-              return this;
-            }.bind(this)(
-            1
-            ))
-            ''');
-          });
-        });
-
-        group('Expression compiler tests in global function:', () {
-          var source = '''
-          ${options.dartLangComment}
-          extension NumberParsing on String {
-            int parseInt() {
-              return int.parse(this);
-            }
-          }
-
-          int global = 42;
-
-          class C {
-            C(int this.field, int this._field);
-
-            static int staticField = 0;
-            static int _staticField = 1;
-
-            int _field;
-            int field;
-
-            int methodFieldAccess(int x) {
-              return (x + _field + _staticField);
-            }
-            int methodFieldAccess(int x) {
-              return (x)
-            }
-
-            Future<int> asyncMethod(int x) async {
-              return x;
-            }
-          }
-
-          int main() {
-            int x = 15;
-            var c = C(1, 2);
-            /* evaluation placeholder */
-            return 0;
-          }
-          ''';
-
-          TestDriver driver;
-          setUp(() {
-            driver = TestDriver(options, source);
-          });
-
-          tearDown(() {
-            driver.delete();
-          });
-
-          test('compilation error', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null'},
-                expression: 'typo',
-                expectedError: "Getter not found: 'typo'.");
-          });
-
-          test('local with primitive type', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null'},
-                expression: 'x',
-                expectedResult: '''
-            (function(x, c) {
-              return x;
-            }(
-              1,
-              null
-            ))
-            ''');
-          });
-
-          test('local object', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null'},
-                expression: 'c',
-                expectedResult: '''
-            (function(x, c) {
-              return c;
-            }(
-              1,
-              null
-            ))
-            ''');
-          });
-
-          test('create new object', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null'},
-                expression: 'C(1,3)',
-                expectedResult: '''
-            (function(x, c) {
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return new foo.C.new(1, 3);
-            }(
-              1,
-              null
-            ))
-            ''');
-          });
-
-          test('access field of new object', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null'},
-                expression: 'C(1,3)._field',
-                expectedResult: '''
-            (function(x, c) {
-              const dart_sdk = ${options.loadModule}('dart_sdk');
-              const dart = dart_sdk.dart;
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              var S = {_field\$1: dart.privateName(foo, "_field")};
-              return new foo.C.new(1, 3)[S._field\$1];
-            }(
-              1,
-              null
-            ))
-            ''');
-          });
-
-          test('access static field', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null'},
-                expression: 'C.staticField',
-                expectedResult: '''
-            (function(x, c) {
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return foo.C.staticField;
-            }(
-              1,
-              null
-            ))
-            ''');
-          });
-
-          test('expression using private static fields', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null'},
-                expression: 'C._staticField',
-                expectedError: "Error: Getter not found: '_staticField'.");
-          });
-
-          test('access field', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null'},
-                expression: 'c.field',
-                expectedResult: '''
-            (function(x, c) {
-              return c.field;
-            }(
-              1,
-              null
-            ))
-            ''');
-          });
-
-          test('access private field', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null'},
-                expression: 'c._field',
-                expectedResult: '''
-            (function(x, c) {
-              const dart_sdk = ${options.loadModule}('dart_sdk');
-              const dart = dart_sdk.dart;
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              var S = {_field\$1: dart.privateName(foo, "_field")};
-              return c[S._field\$1];
-            }(
-                1,
-                null
-            ))
-            ''');
-          });
-
-          test('method call', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null'},
-                expression: 'c.methodFieldAccess(2)',
-                expectedResult: '''
-            (function(x, c) {
-              return c.methodFieldAccess(2);
-            }(
-              1,
-              null
-            ))
-            ''');
-          });
-
-          test('async method call', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null'},
-                expression: 'c.asyncMethod(2)',
-                expectedResult: '''
-            (function(x, c) {
-              return c.asyncMethod(2);
-            }(
-              1,
-              null
-            ))
-            ''');
-          });
-
-          test('extension method call', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null'},
-                expression: '"1234".parseInt()',
-                expectedResult: '''
-            (function(x, c) {
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return foo['NumberParsing|parseInt']("1234");
-            }(
-              1,
-              null
-            ))
-            ''');
-          });
-
-          test('private field modification', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null'},
-                expression: 'c._field = 2',
-                expectedResult: '''
-            (function(x, c) {
-              const dart_sdk = ${options.loadModule}('dart_sdk');
-              const dart = dart_sdk.dart;
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              var S = {_field\$1: dart.privateName(foo, "_field")};
-              return c[S._field\$1] = 2;
-            }(
-              1,
-              null
-            ))
-            ''');
-          });
-
-          test('field modification', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null'},
-                expression: 'c.field = 2',
-                expectedResult: '''
-            (function(x, c) {
-              return c.field = 2;
-            }(
-              1,
-              null
-            ))
-            ''');
-          });
-
-          test('private static field modification', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null'},
-                expression: 'C._staticField = 2',
-                expectedError: "Setter not found: '_staticField'.");
-          });
-
-          test('static field modification', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null'},
-                expression: 'C.staticField = 2',
-                expectedResult: '''
-            (function(x, c) {
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return foo.C.staticField = 2;
-            }(
-              1,
-              null
-            ))
-            ''');
-          });
-
-          test('call global function from core library', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null'},
-                expression: 'print(x)',
-                expectedResult: '''
-            (function(x, c) {
-              const dart_sdk = ${options.loadModule}('dart_sdk');
-              const core = dart_sdk.core;
-              return core.print(x);
-            }(
-              1,
-              null
-            ))
-            ''');
-          });
-        });
-
         group('Expression compiler tests in closures:', () {
           var source = '''
           ${options.dartLangComment}
@@ -3954,699 +1021,6 @@
           });
         });
 
-        group('Expression compiler tests in method with no type use:', () {
-          var source = '''
-          ${options.dartLangComment}
-          abstract class Key {
-            const factory Key(String value) = ValueKey;
-            const Key.empty();
-          }
-
-          abstract class LocalKey extends Key {
-            const LocalKey() : super.empty();
-          }
-
-          class ValueKey implements LocalKey {
-            const ValueKey(this.value);
-            final String value;
-          }
-
-          class MyClass {
-            const MyClass(this._t);
-            final int _t;
-          }
-
-          int bar(int p){
-            return p;
-          }
-          int baz(String t){
-            return t;
-          }
-          void main() {
-            var k = Key('t');
-            MyClass c = MyClass(0);
-            int p = 1;
-            const t = 1;
-
-            /* evaluation placeholder */
-            print('\$c, \$k, \$t');
-          }
-          ''';
-
-          TestDriver driver;
-          setUp(() {
-            driver = TestDriver(options, source);
-          });
-
-          tearDown(() {
-            driver.delete();
-          });
-
-          test('call function not using type', () async {
-            await driver.check(
-                scope: <String, String>{'p': '1'},
-                expression: 'bar(p)',
-                expectedResult: '''
-            (function(p) {
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return foo.bar(p);
-            }(
-              1
-            ))
-            ''');
-          });
-
-          test('call function using type', () async {
-            await driver.check(
-                scope: <String, String>{'p': '0'},
-                expression: 'baz(p as String)',
-                expectedResult: '''
-            (function(p) {
-              const dart_sdk = ${options.loadModule}('dart_sdk');
-              const core = dart_sdk.core;
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return foo.baz(core.String.as(p));
-            }(
-              0
-            ))
-            ''');
-          });
-
-          test('evaluate new const expression', () async {
-            await driver.check(
-                scope: <String, String>{'p': '1'},
-                expression: 'const MyClass(1)',
-                expectedResult: '''
-            (function(p) {
-              const dart_sdk = ${options.loadModule}('dart_sdk');
-              const dart = dart_sdk.dart;
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              var S = {MyClass__t: dart.privateName(foo, "MyClass._t")};
-              const CT = Object.create(null);
-              dart.defineLazy(CT, {
-                get C0() {
-                  return C[0] = dart.const({
-                    __proto__: foo.MyClass.prototype,
-                    [S.MyClass__t]: 1
-                  });
-                }
-              }, false);
-              var C = [void 0];
-              return C[0] || CT.C0;
-            }(
-              1
-            ))
-            ''');
-          });
-
-          test('evaluate optimized const expression', () async {
-            await driver.check(
-                scope: <String, String>{},
-                expression: 't',
-                expectedResult: '''
-            (function() {
-              return 1;
-            }(
-            ))
-            ''');
-          },
-              skip: 'Cannot compile constants optimized away by the frontend. '
-                  'Issue: https://github.com/dart-lang/sdk/issues/41999');
-
-          test('evaluate factory constructor call', () async {
-            await driver.check(
-                scope: <String, String>{'p': '1'},
-                expression: "Key('t')",
-                expectedResult: '''
-            (function(p) {
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return new foo.ValueKey.new("t");
-            }(
-              1
-            ))
-            ''');
-          });
-
-          test('evaluate const factory constructor call', () async {
-            await driver.check(
-                scope: <String, String>{'p': '1'},
-                expression: "const Key('t')",
-                expectedResult: '''
-            (function(p) {
-              const dart_sdk = ${options.loadModule}('dart_sdk');
-              const dart = dart_sdk.dart;
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              var S = {ValueKey_value: dart.privateName(foo, "ValueKey.value")};
-              const CT = Object.create(null);
-              dart.defineLazy(CT, {
-                get C0() {
-                  return C[0] = dart.const({
-                    __proto__: foo.ValueKey.prototype,
-                    [S.ValueKey_value]: "t"
-                  });
-                }
-              }, false);
-              var C = [void 0];
-              return C[0] || CT.C0;
-            }(
-              1
-            ))
-            ''');
-          });
-        });
-
-        group('Expression compiler tests in constructor:', () {
-          var source = '''
-          ${options.dartLangComment}
-          extension NumberParsing on String {
-            int parseInt() {
-              return int.parse(this);
-            }
-          }
-
-          int global = 42;
-
-          class C {
-            C(int this.field, int this._field) {
-              int x = 1;
-              /* evaluation placeholder */
-              print(this.field);
-            }
-
-            static int staticField = 0;
-            static int _staticField = 1;
-
-            int _field;
-            int field;
-
-            int methodFieldAccess(int t) {
-              return t + _field + _staticField;
-            }
-
-            Future<int> asyncMethod(int t) async {
-              return t;
-            }
-          }
-
-          main() => 0;
-          ''';
-
-          TestDriver driver;
-
-          setUp(() {
-            driver = TestDriver(options, source);
-          });
-
-          tearDown(() {
-            driver.delete();
-          });
-
-          test('compilation error', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'typo',
-                expectedError:
-                    "The getter 'typo' isn't defined for the class 'C'");
-          });
-
-          test('local', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'x',
-                expectedResult: '''
-            (function(x) {
-              return x;
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('this', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'this',
-                expectedResult: '''
-            (function(x) {
-              return this;
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('expression using locals', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'x + 1',
-                expectedResult: '''
-            (function(x) {
-              return x + 1;
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('expression using static fields', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'x + staticField',
-                expectedResult: '''
-            (function(x) {
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return x + foo.C.staticField;
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('expression using private static fields', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'x + _staticField',
-                expectedResult: '''
-            (function(x) {
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return x + foo.C._staticField;
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('expression using fields', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'x + field',
-                expectedResult: '''
-            (function(x) {
-              return x + this.field;
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('expression using private fields', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'x + _field',
-                expectedResult: '''
-            (function(x) {
-              const dart_sdk = ${options.loadModule}('dart_sdk');
-              const dart = dart_sdk.dart;
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              var S = {_field\$1: dart.privateName(foo, "_field")};
-              return x + this[S._field\$1];
-            }.bind(this)(
-                1
-            ))
-            ''');
-          });
-
-          test('expression using globals', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'x + global',
-                expectedResult: '''
-            (function(x) {
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return x + foo.global;
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('method call', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'methodFieldAccess(2)',
-                expectedResult: '''
-            (function(x) {
-              return this.methodFieldAccess(2);
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('async method call', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'asyncMethod(2)',
-                expectedResult: '''
-            (function(x) {
-              return this.asyncMethod(2);
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('extension method call', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: '"1234".parseInt()',
-                expectedResult: '''
-            (function(x) {
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return foo['NumberParsing|parseInt']("1234");
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('private field modification', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: '_field = 2',
-                expectedResult: '''
-          (function(x) {
-            const dart_sdk = ${options.loadModule}('dart_sdk');
-            const dart = dart_sdk.dart;
-            const foo\$46dart = ${options.loadModule}('foo.dart');
-            const foo = foo\$46dart.foo;
-            var S = {_field\$1: dart.privateName(foo, "_field")};
-            return this[S._field\$1] = 2;
-          }.bind(this)(
-            1
-          ))
-          ''');
-          });
-
-          test('field modification', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'field = 2',
-                expectedResult: '''
-            (function(x) {
-              return this.field = 2;
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('private static field modification', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: '_staticField = 2',
-                expectedResult: '''
-            (function(x) {
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return foo.C._staticField = 2;
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-
-          test('static field modification', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1'},
-                expression: 'staticField = 2',
-                expectedResult: '''
-            (function(x) {
-              const foo\$46dart = ${options.loadModule}('foo.dart');
-              const foo = foo\$46dart.foo;
-              return foo.C.staticField = 2;
-            }.bind(this)(
-              1
-            ))
-            ''');
-          });
-        });
-
-        group('Expression compiler tests in loops:', () {
-          var source = '''
-          ${options.dartLangComment}
-          int globalFunction() {
-            int x = 15;
-            var c = C(1, 2);
-
-            for(int i = 0; i < 10; i++) {
-              /* evaluation placeholder */
-              print('\$i+\$x');
-            };
-            return 0;
-          }
-
-          main() => 0;
-          ''';
-
-          TestDriver driver;
-          setUp(() {
-            driver = TestDriver(options, source);
-          });
-
-          tearDown(() {
-            driver.delete();
-          });
-
-          test('expression using local', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null', 'i': '0'},
-                expression: 'x',
-                expectedResult: '''
-            (function(x, c, i) {
-              return x;
-            }(
-              1,
-              null,
-              0
-            ))
-            ''');
-          });
-
-          test('expression using loop variable', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null', 'i': '0'},
-                expression: 'i',
-                expectedResult: '''
-            (function(x, c, i) {
-              return i;
-            }(
-              1,
-              null,
-              0
-            ))
-            ''');
-          });
-        });
-
-        group('Expression compiler tests in iterator loops:', () {
-          var source = '''
-          ${options.dartLangComment}
-          int globalFunction() {
-            var l = <String>['1', '2', '3'];
-
-            for(var e in l) {
-              /* evaluation placeholder */
-              print(e);
-            };
-            return 0;
-          }
-
-          main() => 0;
-          ''';
-
-          TestDriver driver;
-          setUp(() {
-            driver = TestDriver(options, source);
-          });
-
-          tearDown(() {
-            driver.delete();
-          });
-
-          test('expression loop variable', () async {
-            await driver.check(
-                scope: <String, String>{'l': 'null', 'e': '1'},
-                expression: 'e',
-                expectedResult: '''
-            (function(l, e) {
-              return e;
-            }(
-              null,
-              1
-            ))
-            ''');
-          });
-        });
-
-        group('Expression compiler tests in conditional (then):', () {
-          var source = '''
-          ${options.dartLangComment}
-          int globalFunction() {
-            int x = 1;
-            var c = C(1, 2);
-
-            if (x == 14) {
-              int y = 3;
-              /* evaluation placeholder */
-              print('\$y+\$x');
-            } else {
-              int z = 3;
-              print('\$z+\$x');
-            }
-            return 0;
-          }
-
-          main() => 0;
-          ''';
-
-          TestDriver driver;
-          setUp(() {
-            driver = TestDriver(options, source);
-          });
-
-          tearDown(() {
-            driver.delete();
-          });
-
-          test('expression using local', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null', 'y': '3'},
-                expression: 'y',
-                expectedResult: '''
-            (function(x, c, y) {
-              return y;
-            }(
-              1,
-              null,
-              3
-            ))
-            ''');
-          });
-
-          test('expression using local out of scope', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null', 'y': '3'},
-                expression: 'z',
-                expectedError: "Error: Getter not found: 'z'");
-          });
-        });
-
-        group('Expression compiler tests in conditional (else):', () {
-          var source = '''
-          ${options.dartLangComment}
-          int globalFunction() {
-            int x = 1;
-            var c = C(1, 2);
-
-            if (x == 14) {
-              int y = 3;
-              print('\$y+\$x');
-            } else {
-              int z = 3;
-              /* evaluation placeholder */
-              print('\$z+\$x');
-            }
-            return 0;
-          }
-
-          main() => 0;
-          ''';
-
-          TestDriver driver;
-          setUp(() {
-            driver = TestDriver(options, source);
-          });
-
-          tearDown(() {
-            driver.delete();
-          });
-
-          test('expression using local', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null', 'z': '3'},
-                expression: 'z',
-                expectedResult: '''
-            (function(x, c, z) {
-              return z;
-            }(
-              1,
-              null,
-              3
-            ))
-            ''');
-          });
-
-          test('expression using local out of scope', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null', 'z': '3'},
-                expression: 'y',
-                expectedError: "Error: Getter not found: 'y'");
-          });
-        });
-
-        group('Expression compiler tests after conditionals:', () {
-          var source = '''
-          ${options.dartLangComment}
-          int globalFunction() {
-            int x = 1;
-            var c = C(1, 2);
-
-            if (x == 14) {
-              int y = 3;
-              print('\$y+\$x');
-            } else {
-              int z = 3;
-              print('\$z+\$x');
-            }
-            /* evaluation placeholder */
-            return 0;
-          }
-
-          main() => 0;
-          ''';
-
-          TestDriver driver;
-          setUp(() {
-            driver = TestDriver(options, source);
-          });
-
-          tearDown(() {
-            driver.delete();
-          });
-
-          test('expression using local', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null'},
-                expression: 'x',
-                expectedResult: '''
-            (function(x, c) {
-              return x;
-            }(
-              1,
-              null
-            ))
-            ''');
-          });
-
-          test('expression using local out of scope', () async {
-            await driver.check(
-                scope: <String, String>{'x': '1', 'c': 'null'},
-                expression: 'z',
-                expectedError: "Error: Getter not found: 'z'");
-          });
-        });
-
         group('Expression compiler tests in generic method:', () {
           var source = '''
           ${options.dartLangComment}
diff --git a/pkg/test_runner/lib/src/command_output.dart b/pkg/test_runner/lib/src/command_output.dart
index 0f9738e..09134bb 100644
--- a/pkg/test_runner/lib/src/command_output.dart
+++ b/pkg/test_runner/lib/src/command_output.dart
@@ -551,18 +551,57 @@
 class AnalysisCommandOutput extends CommandOutput with _StaticErrorOutput {
   static void parseErrors(String stderr, List<StaticError> errors,
       [List<StaticError> warnings]) {
-    for (var error in AnalyzerError.parseStderr(stderr)) {
-      var staticError = StaticError(ErrorSource.analyzer, error.errorCode,
-          line: error.line, column: error.column, length: error.length);
+    var jsonData = json.decode(stderr) as Map<String, dynamic>;
+    var version = jsonData['version'];
+    if (version != 1) {
+      DebugLogger.error('Unexpected analyzer JSON data version: $version');
+      throw UnimplementedError();
+    }
+    for (var diagnostic in jsonData['diagnostics'] as List<dynamic>) {
+      var diagnosticMap = diagnostic as Map<String, dynamic>;
+      var location = diagnosticMap['location'] as Map<String, dynamic>;
+      var file = location['file'] as String;
+      var type = diagnosticMap['type'] as String;
+      var code = (diagnosticMap['code'] as String).toUpperCase();
+      var staticError =
+          _decodeStaticError(ErrorSource.analyzer, '$type.$code', location);
+      var contextMessages = diagnosticMap['contextMessages'] as List<dynamic>;
+      for (var contextMessage in contextMessages ?? const []) {
+        var contextMessageMap = contextMessage as Map<String, dynamic>;
+        var contextLocation =
+            contextMessageMap['location'] as Map<String, dynamic>;
+        if (contextLocation['file'] == file) {
+          staticError.contextMessages.add(_decodeStaticError(
+              ErrorSource.context,
+              contextMessageMap['message'] as String,
+              contextLocation));
+        } else {
+          DebugLogger.warning(
+              "Context messages in other files not currently supported.");
+        }
+      }
 
-      if (error.severity == 'ERROR') {
+      var severity = diagnosticMap['severity'] as String;
+      if (severity == 'ERROR') {
         errors.add(staticError);
-      } else if (error.severity == 'WARNING') {
+      } else if (severity == 'WARNING') {
         warnings?.add(staticError);
       }
     }
   }
 
+  static StaticError _decodeStaticError(
+      ErrorSource errorSource, String message, Map<String, dynamic> location) {
+    var locationRange = location['range'] as Map<String, dynamic>;
+    var locationRangeStart = locationRange['start'] as Map<String, dynamic>;
+    var locationRangeEnd = locationRange['end'] as Map<String, dynamic>;
+    return StaticError(errorSource, message,
+        line: locationRangeStart['line'] as int,
+        column: locationRangeStart['column'] as int,
+        length: (locationRangeEnd['offset'] as int) -
+            (locationRangeStart['offset'] as int));
+  }
+
   AnalysisCommandOutput(
       Command command,
       int exitCode,
@@ -584,6 +623,23 @@
     if (hasTimedOut) return Expectation.timeout;
     if (hasNonUtf8) return Expectation.nonUtf8Error;
 
+    List<StaticError> errors;
+    try {
+      errors = this.errors;
+    } catch (_) {
+      // This can happen in at least two scenarios:
+      // - The analyzer output was too long so it got truncated (so the
+      //   resulting output was ill-formed).  See also
+      //   https://github.com/dart-lang/sdk/issues/44493.
+      // - The analyzer did not find a file to analyze at the specified
+      //   location, so it generated the output "No dart files found at
+      //   <path>.dart" (which is not valid JSON).  See
+      //   https://github.com/dart-lang/sdk/issues/45556.
+      // TODO(paulberry,rnystrom): remove this logic once the two above bugs are
+      // fixed.
+      return Expectation.crash;
+    }
+
     // If it's a static error test, validate the exact errors.
     if (testCase.testFile.isStaticErrorTest) {
       return _validateExpectedErrors(testCase);
@@ -628,6 +684,23 @@
     if (hasTimedOut) return Expectation.timeout;
     if (hasNonUtf8) return Expectation.nonUtf8Error;
 
+    List<StaticError> errors;
+    try {
+      errors = this.errors;
+    } catch (_) {
+      // This can happen in at least two scenarios:
+      // - The analyzer output was too long so it got truncated (so the
+      //   resulting output was ill-formed).  See also
+      //   https://github.com/dart-lang/sdk/issues/44493.
+      // - The analyzer did not find a file to analyze at the specified
+      //   location, so it generated the output "No dart files found at
+      //   <path>.dart" (which is not valid JSON).  See
+      //   https://github.com/dart-lang/sdk/issues/45556.
+      // TODO(paulberry,rnystrom): remove this logic once the two above bugs are
+      // fixed.
+      return Expectation.crash;
+    }
+
     // If it's a static error test, validate the exact errors.
     if (testCase.testFile.isStaticErrorTest) {
       return _validateExpectedErrors(testCase);
@@ -1363,7 +1436,14 @@
     // Handle static error test output specially. We don't want to show the raw
     // stdout if we can give the user the parsed expectations instead.
     if (testCase.testFile.isStaticErrorTest && !hasCrashed && !hasTimedOut) {
-      _validateExpectedErrors(testCase, output);
+      try {
+        _validateExpectedErrors(testCase, output);
+      } catch (_) {
+        // In the event of a crash trying to compute errors, go ahead and give
+        // the raw output.
+        super.describe(testCase, progress, output);
+        return;
+      }
     }
 
     // Don't show the "raw" output unless something strange happened or the
diff --git a/pkg/test_runner/lib/src/test_suite.dart b/pkg/test_runner/lib/src/test_suite.dart
index c27f66b..1f9253f 100644
--- a/pkg/test_runner/lib/src/test_suite.dart
+++ b/pkg/test_runner/lib/src/test_suite.dart
@@ -980,7 +980,7 @@
     }
     args.addAll(additionalOptions(testFile.path));
     if (configuration.compiler == Compiler.dart2analyzer) {
-      args.add('--format=machine');
+      args.add('--format=json');
       args.add('--no-hints');
     }
 
diff --git a/pkg/test_runner/tool/update_static_error_tests.dart b/pkg/test_runner/tool/update_static_error_tests.dart
index ed9bad5..9758107 100644
--- a/pkg/test_runner/tool/update_static_error_tests.dart
+++ b/pkg/test_runner/tool/update_static_error_tests.dart
@@ -230,7 +230,7 @@
   // mode.
   var result = await Process.run(_analyzerPath, [
     ...options,
-    "--format=machine",
+    "--format=json",
     path,
   ]);
 
diff --git a/runtime/lib/regexp.cc b/runtime/lib/regexp.cc
index 3e0e337..6c10d7d 100644
--- a/runtime/lib/regexp.cc
+++ b/runtime/lib/regexp.cc
@@ -85,7 +85,7 @@
   const RegExp& regexp = RegExp::CheckedHandle(zone, arguments->NativeArgAt(0));
   ASSERT(!regexp.IsNull());
   if (regexp.is_initialized()) {
-    return regexp.num_bracket_expressions();
+    return Smi::New(regexp.num_bracket_expressions());
   }
   const String& pattern = String::Handle(regexp.pattern());
   const String& errmsg =
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index 6073695..9d182ed 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -1432,10 +1432,10 @@
           Map(param->untag()->parameterized_class_id_);
     } else if (obj->IsType()) {
       TypePtr type = Type::RawCast(obj);
-      ObjectPtr id = type->untag()->type_class_id_;
+      ObjectPtr id = type->untag()->type_class_id();
       if (!id->IsHeapObject()) {
-        type->untag()->type_class_id_ =
-            Smi::New(Map(Smi::Value(Smi::RawCast(id))));
+        type->untag()->set_type_class_id(
+            Smi::New(Map(Smi::Value(Smi::RawCast(id)))));
       }
     } else {
       intptr_t old_cid = obj->GetClassId();
diff --git a/runtime/vm/clustered_snapshot.cc b/runtime/vm/clustered_snapshot.cc
index 4a63843..a94e18a 100644
--- a/runtime/vm/clustered_snapshot.cc
+++ b/runtime/vm/clustered_snapshot.cc
@@ -3804,12 +3804,12 @@
 
     PushFromTo(type);
 
-    if (type->untag()->type_class_id_->IsHeapObject()) {
+    if (type->untag()->type_class_id()->IsHeapObject()) {
       // Type class is still an unresolved class.
       UNREACHABLE();
     }
 
-    SmiPtr raw_type_class_id = Smi::RawCast(type->untag()->type_class_id_);
+    SmiPtr raw_type_class_id = Smi::RawCast(type->untag()->type_class_id());
     ClassPtr type_class =
         s->isolate_group()->class_table()->At(Smi::Value(raw_type_class_id));
     s->Push(type_class);
@@ -3844,7 +3844,7 @@
   // inserted into the canonical_types set.
   // Keep in sync with Type::Canonicalize.
   virtual bool IsInCanonicalSet(Serializer* s, TypePtr type) {
-    SmiPtr raw_type_class_id = Smi::RawCast(type->untag()->type_class_id_);
+    SmiPtr raw_type_class_id = Smi::RawCast(type->untag()->type_class_id());
     ClassPtr type_class =
         s->isolate_group()->class_table()->At(Smi::Value(raw_type_class_id));
     if (type_class->untag()->declaration_type() != type) {
@@ -4627,7 +4627,7 @@
       TypedDataPtr data = objects_[i];
       s->AssignRef(data);
       AutoTraceObject(data);
-      const intptr_t length = Smi::Value(data->untag()->length_);
+      const intptr_t length = Smi::Value(data->untag()->length());
       s->WriteUnsigned(length);
       target_memory_size_ +=
           compiler::target::TypedData::InstanceSize(length * element_size);
@@ -4640,7 +4640,7 @@
     for (intptr_t i = 0; i < count; i++) {
       TypedDataPtr data = objects_[i];
       AutoTraceObject(data);
-      const intptr_t length = Smi::Value(data->untag()->length_);
+      const intptr_t length = Smi::Value(data->untag()->length());
       s->WriteUnsigned(length);
       uint8_t* cdata = reinterpret_cast<uint8_t*>(data->untag()->data());
       s->WriteBytes(cdata, length * element_size);
@@ -4805,7 +4805,7 @@
     for (intptr_t i = 0; i < count; i++) {
       ExternalTypedDataPtr data = objects_[i];
       AutoTraceObject(data);
-      const intptr_t length = Smi::Value(data->untag()->length_);
+      const intptr_t length = Smi::Value(data->untag()->length());
       s->WriteUnsigned(length);
       uint8_t* cdata = reinterpret_cast<uint8_t*>(data->untag()->data_);
       s->Align(ExternalTypedData::kDataSerializationAlignment);
@@ -5296,7 +5296,7 @@
       OneByteStringPtr str = objects_[i];
       s->AssignRef(str);
       AutoTraceObject(str);
-      const intptr_t length = Smi::Value(str->untag()->length_);
+      const intptr_t length = Smi::Value(str->untag()->length());
       s->WriteUnsigned(length);
       target_memory_size_ +=
           compiler::target::OneByteString::InstanceSize(length);
@@ -5308,7 +5308,7 @@
     for (intptr_t i = 0; i < count; i++) {
       OneByteStringPtr str = objects_[i];
       AutoTraceObject(str);
-      const intptr_t length = Smi::Value(str->untag()->length_);
+      const intptr_t length = Smi::Value(str->untag()->length());
       ASSERT(length <= compiler::target::kSmiMax);
       s->WriteUnsigned(length);
       s->WriteBytes(str->untag()->data(), length);
@@ -5406,7 +5406,7 @@
       TwoByteStringPtr str = objects_[i];
       s->AssignRef(str);
       AutoTraceObject(str);
-      const intptr_t length = Smi::Value(str->untag()->length_);
+      const intptr_t length = Smi::Value(str->untag()->length());
       s->WriteUnsigned(length);
       target_memory_size_ +=
           compiler::target::TwoByteString::InstanceSize(length);
@@ -5418,7 +5418,7 @@
     for (intptr_t i = 0; i < count; i++) {
       TwoByteStringPtr str = objects_[i];
       AutoTraceObject(str);
-      const intptr_t length = Smi::Value(str->untag()->length_);
+      const intptr_t length = Smi::Value(str->untag()->length());
       ASSERT(length <= (compiler::target::kSmiMax / 2));
       s->WriteUnsigned(length);
       s->WriteBytes(reinterpret_cast<uint8_t*>(str->untag()->data()),
diff --git a/runtime/vm/compiler/asm_intrinsifier_arm64.cc b/runtime/vm/compiler/asm_intrinsifier_arm64.cc
index eede391..91c8e54 100644
--- a/runtime/vm/compiler/asm_intrinsifier_arm64.cc
+++ b/runtime/vm/compiler/asm_intrinsifier_arm64.cc
@@ -1457,7 +1457,7 @@
 void AsmIntrinsifier::Type_getHashCode(Assembler* assembler,
                                        Label* normal_ir_body) {
   __ ldr(R0, Address(SP, 0 * target::kWordSize));
-  __ ldr(R0, FieldAddress(R0, target::Type::hash_offset()));
+  __ LoadCompressed(R0, FieldAddress(R0, target::Type::hash_offset()));
   __ cbz(normal_ir_body, R0);
   __ ret();
   // Hash not yet computed.
@@ -1479,9 +1479,11 @@
   __ b(normal_ir_body, NE);
 
   // Check if types are syntactically equal.
-  __ ldr(R3, FieldAddress(R1, target::Type::type_class_id_offset()));
+  __ LoadCompressedSmi(R3,
+                       FieldAddress(R1, target::Type::type_class_id_offset()));
   __ SmiUntag(R3);
-  __ ldr(R4, FieldAddress(R2, target::Type::type_class_id_offset()));
+  __ LoadCompressedSmi(R4,
+                       FieldAddress(R2, target::Type::type_class_id_offset()));
   __ SmiUntag(R4);
   EquivalentClassIds(assembler, normal_ir_body, &equiv_cids, &not_equal, R3, R4,
                      R0);
@@ -1521,7 +1523,7 @@
 void AsmIntrinsifier::FunctionType_getHashCode(Assembler* assembler,
                                                Label* normal_ir_body) {
   __ ldr(R0, Address(SP, 0 * target::kWordSize));
-  __ ldr(R0, FieldAddress(R0, target::FunctionType::hash_offset()));
+  __ LoadCompressed(R0, FieldAddress(R0, target::FunctionType::hash_offset()));
   __ cbz(normal_ir_body, R0);
   __ ret();
   // Hash not yet computed.
@@ -1572,10 +1574,11 @@
                                             Label* return_true,
                                             Label* return_false) {
   __ SmiUntag(R1);
-  __ ldr(R8, FieldAddress(R0, target::String::length_offset()));  // this.length
+  __ LoadCompressedSmi(
+      R8, FieldAddress(R0, target::String::length_offset()));  // this.length
   __ SmiUntag(R8);
-  __ ldr(R9,
-         FieldAddress(R2, target::String::length_offset()));  // other.length
+  __ LoadCompressedSmi(
+      R9, FieldAddress(R2, target::String::length_offset()));  // other.length
   __ SmiUntag(R9);
 
   // if (other.length == 0) return true;
@@ -1682,7 +1685,7 @@
   __ ldr(R0, Address(SP, 1 * target::kWordSize));  // String.
   __ BranchIfNotSmi(R1, normal_ir_body);           // Index is not a Smi.
   // Range check.
-  __ ldr(R2, FieldAddress(R0, target::String::length_offset()));
+  __ LoadCompressedSmi(R2, FieldAddress(R0, target::String::length_offset()));
   __ cmp(R1, Operand(R2));
   __ b(normal_ir_body, CS);  // Runtime throws exception.
 
@@ -1719,7 +1722,7 @@
 void AsmIntrinsifier::StringBaseIsEmpty(Assembler* assembler,
                                         Label* normal_ir_body) {
   __ ldr(R0, Address(SP, 0 * target::kWordSize));
-  __ ldr(R0, FieldAddress(R0, target::String::length_offset()));
+  __ LoadCompressedSmi(R0, FieldAddress(R0, target::String::length_offset()));
   __ cmp(R0, Operand(target::ToRawSmi(0)), kObjectBytes);
   __ LoadObject(R0, CastHandle<Object>(TrueObject()));
   __ LoadObject(TMP, CastHandle<Object>(FalseObject()));
@@ -1738,7 +1741,7 @@
   __ ret();  // Return if already computed.
 
   __ Bind(&compute_hash);
-  __ ldr(R2, FieldAddress(R1, target::String::length_offset()));
+  __ LoadCompressedSmi(R2, FieldAddress(R1, target::String::length_offset()));
   __ SmiUntag(R2);
 
   Label done;
@@ -1873,7 +1876,7 @@
   }
 
   // Set the length field using the saved length (R6).
-  __ StoreIntoObjectNoBarrier(
+  __ StoreCompressedIntoObjectNoBarrier(
       R0, FieldAddress(R0, target::String::length_offset()), R6);
   __ b(ok);
 }
@@ -2008,8 +2011,8 @@
   __ b(normal_ir_body, NE);
 
   // Have same length?
-  __ ldr(R2, FieldAddress(R0, target::String::length_offset()));
-  __ ldr(R3, FieldAddress(R1, target::String::length_offset()));
+  __ LoadCompressedSmi(R2, FieldAddress(R0, target::String::length_offset()));
+  __ LoadCompressedSmi(R3, FieldAddress(R1, target::String::length_offset()));
   __ CompareObjectRegisters(R2, R3);
   __ b(&is_false, NE);
 
@@ -2085,9 +2088,13 @@
   __ ldr(R1, Address(SP, kStringParamOffset));
   __ LoadClassId(R1, R1);
   __ AddImmediate(R1, -kOneByteStringCid);
+#if !defined(DART_COMPRESSED_POINTERS)
   __ add(R1, R2, Operand(R1, LSL, target::kWordSizeLog2));
-  __ ldr(R0, FieldAddress(R1, target::RegExp::function_offset(kOneByteStringCid,
-                                                              sticky)));
+#else
+  __ add(R1, R2, Operand(R1, LSL, target::kWordSizeLog2 - 1));
+#endif
+  __ LoadCompressed(R0, FieldAddress(R1, target::RegExp::function_offset(
+                                             kOneByteStringCid, sticky)));
 
   // Registers are now set up for the lazy compile stub. It expects the function
   // in R0, the argument descriptor in R4, and IC-Data in R5.
diff --git a/runtime/vm/compiler/asm_intrinsifier_x64.cc b/runtime/vm/compiler/asm_intrinsifier_x64.cc
index cf4fcb3..c47d307 100644
--- a/runtime/vm/compiler/asm_intrinsifier_x64.cc
+++ b/runtime/vm/compiler/asm_intrinsifier_x64.cc
@@ -1308,7 +1308,7 @@
 void AsmIntrinsifier::Type_getHashCode(Assembler* assembler,
                                        Label* normal_ir_body) {
   __ movq(RAX, Address(RSP, +1 * target::kWordSize));  // Type object.
-  __ movq(RAX, FieldAddress(RAX, target::Type::hash_offset()));
+  __ LoadCompressed(RAX, FieldAddress(RAX, target::Type::hash_offset()));
   ASSERT(kSmiTag == 0);
   ASSERT(kSmiTagShift == 1);
   __ testq(RAX, RAX);
@@ -1334,9 +1334,11 @@
   __ j(NOT_EQUAL, normal_ir_body);
 
   // Check if types are syntactically equal.
-  __ movq(RDI, FieldAddress(RCX, target::Type::type_class_id_offset()));
+  __ LoadCompressedSmi(RDI,
+                       FieldAddress(RCX, target::Type::type_class_id_offset()));
   __ SmiUntag(RDI);
-  __ movq(RSI, FieldAddress(RDX, target::Type::type_class_id_offset()));
+  __ LoadCompressedSmi(RSI,
+                       FieldAddress(RDX, target::Type::type_class_id_offset()));
   __ SmiUntag(RSI);
   EquivalentClassIds(assembler, normal_ir_body, &equiv_cids, &not_equal, RDI,
                      RSI, RAX);
@@ -1374,7 +1376,8 @@
 void AsmIntrinsifier::FunctionType_getHashCode(Assembler* assembler,
                                                Label* normal_ir_body) {
   __ movq(RAX, Address(RSP, +1 * target::kWordSize));  // FunctionType object.
-  __ movq(RAX, FieldAddress(RAX, target::FunctionType::hash_offset()));
+  __ LoadCompressed(RAX,
+                    FieldAddress(RAX, target::FunctionType::hash_offset()));
   ASSERT(kSmiTag == 0);
   ASSERT(kSmiTagShift == 1);
   __ testq(RAX, RAX);
@@ -1423,9 +1426,9 @@
                                             Label* return_true,
                                             Label* return_false) {
   __ SmiUntag(RBX);
-  __ movq(R8, FieldAddress(RAX, target::String::length_offset()));
+  __ LoadCompressedSmi(R8, FieldAddress(RAX, target::String::length_offset()));
   __ SmiUntag(R8);
-  __ movq(R9, FieldAddress(RCX, target::String::length_offset()));
+  __ LoadCompressedSmi(R9, FieldAddress(RCX, target::String::length_offset()));
   __ SmiUntag(R9);
 
   // if (other.length == 0) return true;
@@ -1530,7 +1533,7 @@
   __ testq(RCX, Immediate(kSmiTagMask));
   __ j(NOT_ZERO, normal_ir_body);  // Non-smi index.
   // Range check.
-  __ cmpq(RCX, FieldAddress(RAX, target::String::length_offset()));
+  __ OBJ(cmp)(RCX, FieldAddress(RAX, target::String::length_offset()));
   // Runtime throws exception.
   __ j(ABOVE_EQUAL, normal_ir_body);
   __ CompareClassId(RAX, kOneByteStringCid);
@@ -1570,7 +1573,7 @@
   Label is_true;
   // Get length.
   __ movq(RAX, Address(RSP, +1 * target::kWordSize));  // String object.
-  __ movq(RAX, FieldAddress(RAX, target::String::length_offset()));
+  __ LoadCompressedSmi(RAX, FieldAddress(RAX, target::String::length_offset()));
   __ OBJ(cmp)(RAX, Immediate(target::ToRawSmi(0)));
   __ j(EQUAL, &is_true, Assembler::kNearJump);
   __ LoadObject(RAX, CastHandle<Object>(FalseObject()));
@@ -1594,7 +1597,7 @@
 
   __ Bind(&compute_hash);
   // Hash not yet computed, use algorithm of class StringHasher.
-  __ movq(RCX, FieldAddress(RBX, target::String::length_offset()));
+  __ LoadCompressedSmi(RCX, FieldAddress(RBX, target::String::length_offset()));
   __ SmiUntag(RCX);
   __ xorq(RAX, RAX);
   __ xorq(RDI, RDI);
@@ -1736,7 +1739,7 @@
 
   // Set the length field.
   __ popq(RDI);
-  __ StoreIntoObjectNoBarrier(
+  __ StoreCompressedIntoObjectNoBarrier(
       RAX, FieldAddress(RAX, target::String::length_offset()), RDI);
   __ jmp(ok, Assembler::kNearJump);
 
@@ -1865,7 +1868,7 @@
   __ j(NOT_EQUAL, normal_ir_body, Assembler::kNearJump);
 
   // Have same length?
-  __ movq(RDI, FieldAddress(RAX, target::String::length_offset()));
+  __ LoadCompressedSmi(RDI, FieldAddress(RAX, target::String::length_offset()));
   __ OBJ(cmp)(RDI, FieldAddress(RCX, target::String::length_offset()));
   __ j(NOT_EQUAL, &is_false, Assembler::kNearJump);
 
@@ -1934,9 +1937,15 @@
   __ movq(RDI, Address(RSP, kStringParamOffset));
   __ LoadClassId(RDI, RDI);
   __ SubImmediate(RDI, Immediate(kOneByteStringCid));
+#if !defined(DART_COMPRESSED_POINTERS)
   __ movq(RAX, FieldAddress(
                    RBX, RDI, TIMES_8,
                    target::RegExp::function_offset(kOneByteStringCid, sticky)));
+#else
+  __ LoadCompressed(RAX, FieldAddress(RBX, RDI, TIMES_4,
+                                      target::RegExp::function_offset(
+                                          kOneByteStringCid, sticky)));
+#endif
 
   // Registers are now set up for the lazy compile stub. It expects the function
   // in RAX, the argument descriptor in R10, and IC-Data in RCX.
diff --git a/runtime/vm/compiler/assembler/assembler_arm.h b/runtime/vm/compiler/assembler/assembler_arm.h
index 3a221a5..68bcae0 100644
--- a/runtime/vm/compiler/assembler/assembler_arm.h
+++ b/runtime/vm/compiler/assembler/assembler_arm.h
@@ -389,6 +389,9 @@
   void Jump(const Address& address) { Branch(address); }
 
   void LoadField(Register dst, FieldAddress address) { ldr(dst, address); }
+  void LoadCompressedField(Register dst, FieldAddress address) {
+    LoadField(dst, address);
+  }
   void LoadMemoryValue(Register dst, Register base, int32_t offset) {
     LoadFromOffset(dst, base, offset);
   }
@@ -1026,6 +1029,9 @@
   void PopNativeCalleeSavedRegisters();
 
   void CompareRegisters(Register rn, Register rm) { cmp(rn, Operand(rm)); }
+  void CompareObjectRegisters(Register rn, Register rm) {
+    CompareRegisters(rn, rm);
+  }
   // Branches to the given label if the condition holds.
   // [distance] is ignored on ARM.
   void BranchIf(Condition condition,
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.cc b/runtime/vm/compiler/assembler/assembler_arm64.cc
index ff0820b..c54c816 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm64.cc
@@ -924,9 +924,7 @@
   vmuls(vd, vd, VTMP);
 }
 
-void Assembler::LoadCompressed(Register dest,
-                               const Address& slot,
-                               CanBeSmi can_value_be_smi) {
+void Assembler::LoadCompressed(Register dest, const Address& slot) {
 #if !defined(DART_COMPRESSED_POINTERS)
   ldr(dest, slot);
 #else
@@ -935,6 +933,20 @@
 #endif
 }
 
+void Assembler::LoadCompressedSmi(Register dest, const Address& slot) {
+#if !defined(DART_COMPRESSED_POINTERS)
+  ldr(dest, slot);
+#else
+  ldr(dest, slot, kUnsignedFourBytes);  // Zero-extension.
+#endif
+#if defined(DEBUG)
+  Label done;
+  BranchIfSmi(dest, &done);
+  Stop("Expected Smi");
+  Bind(&done);
+#endif
+}
+
 // Preserves object and value registers.
 void Assembler::StoreIntoObjectFilter(Register object,
                                       Register value,
@@ -985,10 +997,38 @@
   }
 }
 
+void Assembler::StoreCompressedIntoObjectOffset(Register object,
+                                                int32_t offset,
+                                                Register value,
+                                                CanBeSmi value_can_be_smi) {
+  if (Address::CanHoldOffset(offset - kHeapObjectTag)) {
+    StoreCompressedIntoObject(object, FieldAddress(object, offset), value,
+                              value_can_be_smi);
+  } else {
+    AddImmediate(TMP, object, offset - kHeapObjectTag);
+    StoreCompressedIntoObject(object, Address(TMP), value, value_can_be_smi);
+  }
+}
+
 void Assembler::StoreIntoObject(Register object,
                                 const Address& dest,
                                 Register value,
                                 CanBeSmi can_be_smi) {
+  str(value, dest);
+  StoreBarrier(object, value, can_be_smi);
+}
+
+void Assembler::StoreCompressedIntoObject(Register object,
+                                          const Address& dest,
+                                          Register value,
+                                          CanBeSmi can_be_smi) {
+  str(value, dest, kObjectBytes);
+  StoreBarrier(object, value, can_be_smi);
+}
+
+void Assembler::StoreBarrier(Register object,
+                             Register value,
+                             CanBeSmi can_be_smi) {
   const bool spill_lr = lr_state().LRContainsReturnAddress();
   // x.slot = x. Barrier should have be removed at the IL level.
   ASSERT(object != value);
@@ -999,8 +1039,6 @@
   ASSERT(value != TMP);
   ASSERT(value != TMP2);
 
-  str(value, dest);
-
   // In parallel, test whether
   //  - object is old and not remembered and value is new, or
   //  - object is old and value is old and not marked and concurrent marking is
@@ -1124,6 +1162,25 @@
   // No store buffer update.
 }
 
+void Assembler::StoreCompressedIntoObjectNoBarrier(Register object,
+                                                   const Address& dest,
+                                                   Register value) {
+  str(value, dest, kObjectBytes);
+#if defined(DEBUG)
+  Label done;
+  StoreIntoObjectFilter(object, value, &done, kValueCanBeSmi, kJumpToNoUpdate);
+
+  ldr(TMP, FieldAddress(object, target::Object::tags_offset(), kByte),
+      kUnsignedByte);
+  tsti(TMP, Immediate(1 << target::UntaggedObject::kOldAndNotRememberedBit));
+  b(&done, ZERO);
+
+  Stop("Store buffer update is required");
+  Bind(&done);
+#endif  // defined(DEBUG)
+  // No store buffer update.
+}
+
 void Assembler::StoreIntoObjectOffsetNoBarrier(Register object,
                                                int32_t offset,
                                                Register value) {
@@ -1135,6 +1192,18 @@
   }
 }
 
+void Assembler::StoreCompressedIntoObjectOffsetNoBarrier(Register object,
+                                                         int32_t offset,
+                                                         Register value) {
+  if (Address::CanHoldOffset(offset - kHeapObjectTag)) {
+    StoreCompressedIntoObjectNoBarrier(object, FieldAddress(object, offset),
+                                       value);
+  } else {
+    AddImmediate(TMP, object, offset - kHeapObjectTag);
+    StoreCompressedIntoObjectNoBarrier(object, Address(TMP), value);
+  }
+}
+
 void Assembler::StoreIntoObjectNoBarrier(Register object,
                                          const Address& dest,
                                          const Object& value) {
@@ -1149,6 +1218,20 @@
   }
 }
 
+void Assembler::StoreCompressedIntoObjectNoBarrier(Register object,
+                                                   const Address& dest,
+                                                   const Object& value) {
+  ASSERT(IsOriginalObject(value));
+  ASSERT(IsNotTemporaryScopedHandle(value));
+  // No store buffer update.
+  if (IsSameObject(compiler::NullObject(), value)) {
+    str(NULL_REG, dest, kObjectBytes);
+  } else {
+    LoadObject(TMP2, value);
+    str(TMP2, dest, kObjectBytes);
+  }
+}
+
 void Assembler::StoreIntoObjectOffsetNoBarrier(Register object,
                                                int32_t offset,
                                                const Object& value) {
@@ -1160,6 +1243,18 @@
   }
 }
 
+void Assembler::StoreCompressedIntoObjectOffsetNoBarrier(Register object,
+                                                         int32_t offset,
+                                                         const Object& value) {
+  if (Address::CanHoldOffset(offset - kHeapObjectTag)) {
+    StoreCompressedIntoObjectNoBarrier(object, FieldAddress(object, offset),
+                                       value);
+  } else {
+    AddImmediate(TMP, object, offset - kHeapObjectTag);
+    StoreCompressedIntoObjectNoBarrier(object, Address(TMP), value);
+  }
+}
+
 void Assembler::StoreInternalPointer(Register object,
                                      const Address& dest,
                                      Register value) {
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.h b/runtime/vm/compiler/assembler/assembler_arm64.h
index 1682a69..fdfe351 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.h
+++ b/runtime/vm/compiler/assembler/assembler_arm64.h
@@ -547,6 +547,9 @@
   }
 
   void LoadField(Register dst, FieldAddress address) { ldr(dst, address); }
+  void LoadCompressedField(Register dst, FieldAddress address) {
+    LoadCompressed(dst, address);
+  }
   void LoadMemoryValue(Register dst, Register base, int32_t offset) {
     LoadFromOffset(dst, base, offset, kEightBytes);
   }
@@ -1744,9 +1747,8 @@
     kValueCanBeSmi,
   };
 
-  void LoadCompressed(Register dest,
-                      const Address& slot,
-                      CanBeSmi can_value_be_smi = kValueCanBeSmi);
+  void LoadCompressed(Register dest, const Address& slot);
+  void LoadCompressedSmi(Register dest, const Address& slot);
 
   // Store into a heap object and apply the generational and incremental write
   // barriers. All stores into heap objects must pass through this function or,
@@ -1757,6 +1759,11 @@
                        const Address& dest,
                        Register value,
                        CanBeSmi can_value_be_smi = kValueCanBeSmi);
+  void StoreCompressedIntoObject(Register object,
+                                 const Address& dest,
+                                 Register value,
+                                 CanBeSmi can_value_be_smi = kValueCanBeSmi);
+  void StoreBarrier(Register object, Register value, CanBeSmi can_value_be_smi);
   void StoreIntoArray(Register object,
                       Register slot,
                       Register value,
@@ -1766,18 +1773,35 @@
                              int32_t offset,
                              Register value,
                              CanBeSmi can_value_be_smi = kValueCanBeSmi);
+  void StoreCompressedIntoObjectOffset(
+      Register object,
+      int32_t offset,
+      Register value,
+      CanBeSmi can_value_be_smi = kValueCanBeSmi);
   void StoreIntoObjectNoBarrier(Register object,
                                 const Address& dest,
                                 Register value);
+  void StoreCompressedIntoObjectNoBarrier(Register object,
+                                          const Address& dest,
+                                          Register value);
   void StoreIntoObjectOffsetNoBarrier(Register object,
                                       int32_t offset,
                                       Register value);
+  void StoreCompressedIntoObjectOffsetNoBarrier(Register object,
+                                                int32_t offset,
+                                                Register value);
   void StoreIntoObjectNoBarrier(Register object,
                                 const Address& dest,
                                 const Object& value);
+  void StoreCompressedIntoObjectNoBarrier(Register object,
+                                          const Address& dest,
+                                          const Object& value);
   void StoreIntoObjectOffsetNoBarrier(Register object,
                                       int32_t offset,
                                       const Object& value);
+  void StoreCompressedIntoObjectOffsetNoBarrier(Register object,
+                                                int32_t offset,
+                                                const Object& value);
 
   // Stores a non-tagged value into a heap object.
   void StoreInternalPointer(Register object,
diff --git a/runtime/vm/compiler/assembler/assembler_ia32.h b/runtime/vm/compiler/assembler/assembler_ia32.h
index fecfe5a1..a46152c 100644
--- a/runtime/vm/compiler/assembler/assembler_ia32.h
+++ b/runtime/vm/compiler/assembler/assembler_ia32.h
@@ -572,6 +572,9 @@
 
   void Ret() { ret(); }
   void CompareRegisters(Register a, Register b);
+  void CompareObjectRegisters(Register a, Register b) {
+    CompareRegisters(a, b);
+  }
   void BranchIf(Condition condition,
                 Label* label,
                 JumpDistance distance = kFarJump) {
@@ -599,6 +602,9 @@
                  OperandSize sz = kFourBytes) {
     LoadFromOffset(dst, address, sz);
   }
+  void LoadCompressedField(Register dst, const FieldAddress& address) {
+    LoadField(dst, address);
+  }
   void LoadFieldFromOffset(Register reg,
                            Register base,
                            int32_t offset,
@@ -607,9 +613,8 @@
   }
   void LoadCompressedFieldFromOffset(Register reg,
                                      Register base,
-                                     int32_t offset,
-                                     OperandSize sz = kFourBytes) {
-    LoadFieldFromOffset(reg, base, offset, sz);
+                                     int32_t offset) {
+    LoadFieldFromOffset(reg, base, offset);
   }
   void LoadIndexedPayload(Register dst,
                           Register base,
diff --git a/runtime/vm/compiler/assembler/assembler_x64.cc b/runtime/vm/compiler/assembler/assembler_x64.cc
index d1ab4a7..274a5d8 100644
--- a/runtime/vm/compiler/assembler/assembler_x64.cc
+++ b/runtime/vm/compiler/assembler/assembler_x64.cc
@@ -1360,9 +1360,7 @@
   }
 }
 
-void Assembler::LoadCompressed(Register dest,
-                               const Address& slot,
-                               CanBeSmi can_value_be_smi) {
+void Assembler::LoadCompressed(Register dest, const Address& slot) {
 #if !defined(DART_COMPRESSED_POINTERS)
   movq(dest, slot);
 #else
@@ -1371,6 +1369,20 @@
 #endif
 }
 
+void Assembler::LoadCompressedSmi(Register dest, const Address& slot) {
+#if !defined(DART_COMPRESSED_POINTERS)
+  movq(dest, slot);
+#else
+  movl(dest, slot);  // Zero-extension.
+#endif
+#if defined(DEBUG)
+  Label done;
+  BranchIfSmi(dest, &done);
+  Stop("Expected Smi");
+  Bind(&done);
+#endif
+}
+
 // Destroys the value register.
 void Assembler::StoreIntoObjectFilter(Register object,
                                       Register value,
@@ -1413,13 +1425,26 @@
                                 const Address& dest,
                                 Register value,
                                 CanBeSmi can_be_smi) {
+  movq(dest, value);
+  StoreBarrier(object, value, can_be_smi);
+}
+
+void Assembler::StoreCompressedIntoObject(Register object,
+                                          const Address& dest,
+                                          Register value,
+                                          CanBeSmi can_be_smi) {
+  OBJ(mov)(dest, value);
+  StoreBarrier(object, value, can_be_smi);
+}
+
+void Assembler::StoreBarrier(Register object,
+                             Register value,
+                             CanBeSmi can_be_smi) {
   // x.slot = x. Barrier should have be removed at the IL level.
   ASSERT(object != value);
   ASSERT(object != TMP);
   ASSERT(value != TMP);
 
-  movq(dest, value);
-
   // In parallel, test whether
   //  - object is old and not remembered and value is new, or
   //  - object is old and value is old and not marked and concurrent marking is
@@ -1523,12 +1548,39 @@
   // No store buffer update.
 }
 
+void Assembler::StoreCompressedIntoObjectNoBarrier(Register object,
+                                                   const Address& dest,
+                                                   Register value) {
+  OBJ(mov)(dest, value);
+#if defined(DEBUG)
+  Label done;
+  pushq(value);
+  StoreIntoObjectFilter(object, value, &done, kValueCanBeSmi, kJumpToNoUpdate);
+
+  testb(FieldAddress(object, target::Object::tags_offset()),
+        Immediate(1 << target::UntaggedObject::kOldAndNotRememberedBit));
+  j(ZERO, &done, Assembler::kNearJump);
+
+  Stop("Store buffer update is required");
+  Bind(&done);
+  popq(value);
+#endif  // defined(DEBUG)
+  // No store buffer update.
+}
+
 void Assembler::StoreIntoObjectNoBarrier(Register object,
                                          const Address& dest,
                                          const Object& value) {
   StoreObject(dest, value);
 }
 
+void Assembler::StoreCompressedIntoObjectNoBarrier(Register object,
+                                                   const Address& dest,
+                                                   const Object& value) {
+  LoadObject(TMP, value);
+  StoreCompressedIntoObjectNoBarrier(object, dest, TMP);
+}
+
 void Assembler::StoreInternalPointer(Register object,
                                      const Address& dest,
                                      Register value) {
@@ -1551,6 +1603,11 @@
   movq(dest, zero);
 }
 
+void Assembler::ZeroInitCompressedSmiField(const Address& dest) {
+  Immediate zero(target::ToRawSmi(0));
+  OBJ(mov)(dest, zero);
+}
+
 void Assembler::IncrementSmiField(const Address& dest, int64_t increment) {
   // Note: FlowGraphCompiler::EdgeCounterIncrementSizeInBytes depends on
   // the length of this instruction sequence.
diff --git a/runtime/vm/compiler/assembler/assembler_x64.h b/runtime/vm/compiler/assembler/assembler_x64.h
index a855106..75822c0 100644
--- a/runtime/vm/compiler/assembler/assembler_x64.h
+++ b/runtime/vm/compiler/assembler/assembler_x64.h
@@ -782,9 +782,8 @@
     kValueCanBeSmi,
   };
 
-  void LoadCompressed(Register dest,
-                      const Address& slot,
-                      CanBeSmi can_value_be_smi = kValueCanBeSmi);
+  void LoadCompressed(Register dest, const Address& slot);
+  void LoadCompressedSmi(Register dest, const Address& slot);
 
   // Store into a heap object and apply the generational and incremental write
   // barriers. All stores into heap objects must pass through this function or,
@@ -795,6 +794,14 @@
                        const Address& dest,  // Where we are storing into.
                        Register value,       // Value we are storing.
                        CanBeSmi can_be_smi = kValueCanBeSmi);
+  void StoreCompressedIntoObject(
+      Register object,      // Object we are storing into.
+      const Address& dest,  // Where we are storing into.
+      Register value,       // Value we are storing.
+      CanBeSmi can_be_smi = kValueCanBeSmi);
+  void StoreBarrier(Register object,  // Object we are storing into.
+                    Register value,   // Value we are storing.
+                    CanBeSmi can_be_smi);
   void StoreIntoArray(Register object,  // Object we are storing into.
                       Register slot,    // Where we are storing into.
                       Register value,   // Value we are storing.
@@ -803,9 +810,15 @@
   void StoreIntoObjectNoBarrier(Register object,
                                 const Address& dest,
                                 Register value);
+  void StoreCompressedIntoObjectNoBarrier(Register object,
+                                          const Address& dest,
+                                          Register value);
   void StoreIntoObjectNoBarrier(Register object,
                                 const Address& dest,
                                 const Object& value);
+  void StoreCompressedIntoObjectNoBarrier(Register object,
+                                          const Address& dest,
+                                          const Object& value);
 
   // Stores a non-tagged value into a heap object.
   void StoreInternalPointer(Register object,
@@ -815,6 +828,7 @@
   // Stores a Smi value into a heap object field that always contains a Smi.
   void StoreIntoSmiField(const Address& dest, Register value);
   void ZeroInitSmiField(const Address& dest);
+  void ZeroInitCompressedSmiField(const Address& dest);
   // Increments a Smi field. Leaves flags in same state as an 'addq'.
   void IncrementSmiField(const Address& dest, int64_t increment);
 
@@ -933,6 +947,9 @@
                  OperandSize sz = kEightBytes) {
     LoadFromOffset(dst, address, sz);
   }
+  void LoadCompressedField(Register dst, FieldAddress address) {
+    LoadCompressed(dst, address);
+  }
   void LoadFieldFromOffset(Register dst,
                            Register base,
                            int32_t offset,
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.cc b/runtime/vm/compiler/backend/flow_graph_compiler.cc
index 0a08391..da51b20 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.cc
@@ -2543,8 +2543,9 @@
     __ LoadCompressedFieldFromOffset(
         kScratch1Reg, kScratch1Reg,
         compiler::target::Class::super_type_offset());
-    __ LoadFieldFromOffset(kScratch1Reg, kScratch1Reg,
-                           compiler::target::Type::type_class_id_offset());
+    __ LoadCompressedFieldFromOffset(
+        kScratch1Reg, kScratch1Reg,
+        compiler::target::Type::type_class_id_offset());
     __ CompareImmediate(kScratch1Reg, Smi::RawValue(type_class.id()));
     __ BranchIf(EQUAL, is_instance_lbl);
   }
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
index 0f32cf2..888f4f1 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
@@ -751,7 +751,7 @@
     // Stub returns result in flags (result of a cmp, we need Z computed).
     __ PopPair(right, left);
   } else {
-    __ CompareRegisters(left, right);
+    __ CompareObjectRegisters(left, right);
   }
   return EQ;
 }
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
index e0b9329..11cfcb6 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
@@ -744,7 +744,7 @@
     __ popq(right);
     __ popq(left);
   } else {
-    __ CompareRegisters(left, right);
+    __ CompareObjectRegisters(left, right);
   }
   return EQUAL;
 }
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index 40f38ab..9b15447 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -5539,10 +5539,11 @@
     if (index_cid != kSmiCid) {
       __ BranchIfNotSmi(index, slow_path->entry_label());
     }
+    __ CompareObjectRegisters(index, length);
   } else {
     ASSERT(representation() == kUnboxedInt64);
+    __ CompareRegisters(index, length);
   }
-  __ CompareRegisters(index, length);
   __ BranchIf(UNSIGNED_GREATER_EQUAL, slow_path->entry_label());
 }
 
diff --git a/runtime/vm/compiler/backend/il_arm64.cc b/runtime/vm/compiler/backend/il_arm64.cc
index 84bcb80..3bab356 100644
--- a/runtime/vm/compiler/backend/il_arm64.cc
+++ b/runtime/vm/compiler/backend/il_arm64.cc
@@ -1511,7 +1511,8 @@
   ASSERT(cid_ == kOneByteStringCid);
   const Register str = locs()->in(0).reg();
   const Register result = locs()->out(0).reg();
-  __ LoadFieldFromOffset(result, str, String::length_offset());
+  __ LoadCompressedSmi(result,
+                       compiler::FieldAddress(str, String::length_offset()));
   __ ldr(TMP,
          compiler::FieldAddress(str, OneByteString::data_offset(),
                                 compiler::kByte),
@@ -2364,7 +2365,7 @@
     // offset_reg contains offset already corrected by -kHeapObjectTag that is
     // why we use Address instead of FieldAddress.
     __ ldr(TMP, compiler::Address(value_reg, offset_reg));
-    __ CompareRegisters(length_reg, TMP);
+    __ CompareObjectRegisters(length_reg, TMP);
 
     if (deopt == NULL) {
       __ b(&ok, EQ);
@@ -2665,19 +2666,34 @@
     __ Bind(&store_pointer);
   }
 
-  ASSERT(!slot().is_compressed());  // Unimplemented.
+  const bool compressed = slot().is_compressed();
   if (ShouldEmitStoreBarrier()) {
     const Register value_reg = locs()->in(1).reg();
-    __ StoreIntoObjectOffset(instance_reg, offset_in_bytes, value_reg,
-                             CanValueBeSmi());
+    if (!compressed) {
+      __ StoreIntoObjectOffset(instance_reg, offset_in_bytes, value_reg,
+                               CanValueBeSmi());
+    } else {
+      __ StoreCompressedIntoObjectOffset(instance_reg, offset_in_bytes,
+                                         value_reg, CanValueBeSmi());
+    }
   } else {
     if (locs()->in(1).IsConstant()) {
-      __ StoreIntoObjectOffsetNoBarrier(instance_reg, offset_in_bytes,
-                                        locs()->in(1).constant());
+      if (!compressed) {
+        __ StoreIntoObjectOffsetNoBarrier(instance_reg, offset_in_bytes,
+                                          locs()->in(1).constant());
+      } else {
+        __ StoreCompressedIntoObjectOffsetNoBarrier(
+            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);
+      if (!compressed) {
+        __ StoreIntoObjectOffsetNoBarrier(instance_reg, offset_in_bytes,
+                                          value_reg);
+      } else {
+        __ StoreCompressedIntoObjectOffsetNoBarrier(instance_reg,
+                                                    offset_in_bytes, value_reg);
+      }
     }
   }
   __ Bind(&skip_store);
diff --git a/runtime/vm/compiler/backend/il_x64.cc b/runtime/vm/compiler/backend/il_x64.cc
index ed081c7..da435ce3 100644
--- a/runtime/vm/compiler/backend/il_x64.cc
+++ b/runtime/vm/compiler/backend/il_x64.cc
@@ -1391,6 +1391,15 @@
   Register char_code = locs()->in(0).reg();
   Register result = locs()->out(0).reg();
 
+#if defined(DART_COMPRESSED_POINTERS)
+  // The upper half of a compressed Smi contains undefined bits, but no x64
+  // addressing mode will ignore these bits. Assume that the index is
+  // non-negative and clear the upper bits, which is shorter than
+  // sign-extension (movsxd). Note: we don't bother to ensure index is a
+  // writable input because any other instructions using it must also not
+  // rely on the upper bits.
+  __ orl(char_code, char_code);
+#endif
   __ movq(result,
           compiler::Address(THR, Thread::predefined_symbols_address_offset()));
   __ movq(result,
@@ -1411,7 +1420,8 @@
   Register str = locs()->in(0).reg();
   Register result = locs()->out(0).reg();
   compiler::Label is_one, done;
-  __ movq(result, compiler::FieldAddress(str, String::length_offset()));
+  __ LoadCompressedSmi(result,
+                       compiler::FieldAddress(str, String::length_offset()));
   __ cmpq(result, compiler::Immediate(Smi::RawValue(1)));
   __ j(EQUAL, &is_one, compiler::Assembler::kNearJump);
   __ movq(result, compiler::Immediate(Smi::RawValue(-1)));
@@ -2392,7 +2402,8 @@
     // value's class matches guarded class id of the field.
     // offset_reg contains offset already corrected by -kHeapObjectTag that is
     // why we use Address instead of FieldAddress.
-    __ cmpq(length_reg, compiler::Address(value_reg, offset_reg, TIMES_1, 0));
+    __ OBJ(cmp)(length_reg,
+                compiler::Address(value_reg, offset_reg, TIMES_1, 0));
 
     if (deopt == NULL) {
       __ j(EQUAL, &ok);
@@ -2735,22 +2746,40 @@
     __ Bind(&store_pointer);
   }
 
-  ASSERT(!slot().is_compressed());  // Unimplemented.
+  const bool compressed = slot().is_compressed();
   if (ShouldEmitStoreBarrier()) {
     Register value_reg = locs()->in(1).reg();
-    __ StoreIntoObject(instance_reg,
-                       compiler::FieldAddress(instance_reg, offset_in_bytes),
-                       value_reg, CanValueBeSmi());
+    if (!compressed) {
+      __ StoreIntoObject(instance_reg,
+                         compiler::FieldAddress(instance_reg, offset_in_bytes),
+                         value_reg, CanValueBeSmi());
+    } else {
+      __ StoreCompressedIntoObject(
+          instance_reg, compiler::FieldAddress(instance_reg, offset_in_bytes),
+          value_reg, CanValueBeSmi());
+    }
   } else {
     if (locs()->in(1).IsConstant()) {
-      __ StoreIntoObjectNoBarrier(
-          instance_reg, compiler::FieldAddress(instance_reg, offset_in_bytes),
-          locs()->in(1).constant());
+      if (!compressed) {
+        __ StoreIntoObjectNoBarrier(
+            instance_reg, compiler::FieldAddress(instance_reg, offset_in_bytes),
+            locs()->in(1).constant());
+      } else {
+        __ StoreCompressedIntoObjectNoBarrier(
+            instance_reg, compiler::FieldAddress(instance_reg, offset_in_bytes),
+            locs()->in(1).constant());
+      }
     } else {
       Register value_reg = locs()->in(1).reg();
-      __ StoreIntoObjectNoBarrier(
-          instance_reg, compiler::FieldAddress(instance_reg, offset_in_bytes),
-          value_reg);
+      if (!compressed) {
+        __ StoreIntoObjectNoBarrier(
+            instance_reg, compiler::FieldAddress(instance_reg, offset_in_bytes),
+            value_reg);
+      } else {
+        __ StoreCompressedIntoObjectNoBarrier(
+            instance_reg, compiler::FieldAddress(instance_reg, offset_in_bytes),
+            value_reg);
+      }
     }
   }
   __ Bind(&skip_store);
diff --git a/runtime/vm/compiler/backend/slot.cc b/runtime/vm/compiler/backend/slot.cc
index 7c16944..75fccf8 100644
--- a/runtime/vm/compiler/backend/slot.cc
+++ b/runtime/vm/compiler/backend/slot.cc
@@ -128,6 +128,8 @@
   (IsNullableBit::encode(true) | IsImmutableBit::encode(true) |                \
    IsCompressedBit::encode(true))
 #define NULLABLE_FIELD_VAR (IsNullableBit::encode(true))
+#define NULLABLE_FIELD_VAR_COMPRESSED                                          \
+  (IsNullableBit::encode(true) | IsCompressedBit::encode(true))
 #define DEFINE_NULLABLE_BOXED_NATIVE_FIELD(ClassName, UnderlyingType,          \
                                            FieldName, cid, mutability)         \
   Slot(Kind::k##ClassName##_##FieldName, NULLABLE_FIELD_##mutability,          \
@@ -144,6 +146,7 @@
 #define NONNULLABLE_FIELD_FINAL_COMPRESSED                                     \
   (Slot::IsImmutableBit::encode(true) | Slot::IsCompressedBit::encode(true))
 #define NONNULLABLE_FIELD_VAR (0)
+#define NONNULLABLE_FIELD_VAR_COMPRESSED (Slot::IsCompressedBit::encode(true))
 #define DEFINE_NONNULLABLE_BOXED_NATIVE_FIELD(ClassName, UnderlyingType,       \
                                               FieldName, cid, mutability)      \
   Slot(Kind::k##ClassName##_##FieldName, NONNULLABLE_FIELD_##mutability,       \
@@ -208,9 +211,10 @@
 
 const Slot& Slot::GetTypeArgumentsSlotAt(Thread* thread, intptr_t offset) {
   ASSERT(offset != Class::kNoTypeArguments);
-  return SlotCache::Instance(thread).Canonicalize(Slot(
-      Kind::kTypeArguments, IsImmutableBit::encode(true), kTypeArgumentsCid,
-      offset, ":type_arguments", /*static_type=*/nullptr, kTagged));
+  return SlotCache::Instance(thread).Canonicalize(
+      Slot(Kind::kTypeArguments, IsImmutableBit::encode(true),
+           kTypeArgumentsCid, offset, ":type_arguments",
+           /*static_type=*/nullptr, kTagged));
 }
 
 const Slot& Slot::GetTypeArgumentsSlotFor(Thread* thread, const Class& cls) {
diff --git a/runtime/vm/compiler/backend/slot.h b/runtime/vm/compiler/backend/slot.h
index 655b10c..8a776de 100644
--- a/runtime/vm/compiler/backend/slot.h
+++ b/runtime/vm/compiler/backend/slot.h
@@ -60,8 +60,9 @@
   V(Closure, UntaggedClosure, function_type_arguments, TypeArguments, FINAL)   \
   V(ClosureData, UntaggedClosureData, default_type_arguments, TypeArguments,   \
     FINAL_COMPRESSED)                                                          \
-  V(Type, UntaggedType, arguments, TypeArguments, FINAL)                       \
-  V(FunctionType, UntaggedFunctionType, type_parameters, TypeArguments, FINAL) \
+  V(Type, UntaggedType, arguments, TypeArguments, FINAL_COMPRESSED)            \
+  V(FunctionType, UntaggedFunctionType, type_parameters, TypeArguments,        \
+    FINAL_COMPRESSED)                                                          \
   V(WeakProperty, UntaggedWeakProperty, key, Dynamic, VAR)                     \
   V(WeakProperty, UntaggedWeakProperty, value, Dynamic, VAR)
 
@@ -84,14 +85,17 @@
   V(Closure, UntaggedClosure, context, Context, FINAL)                         \
   V(Closure, UntaggedClosure, hash, Context, VAR)                              \
   V(Function, UntaggedFunction, data, Dynamic, FINAL_COMPRESSED)               \
-  V(FunctionType, UntaggedFunctionType, parameter_names, Array, FINAL)         \
-  V(FunctionType, UntaggedFunctionType, parameter_types, Array, FINAL)         \
+  V(FunctionType, UntaggedFunctionType, parameter_names, Array,                \
+    FINAL_COMPRESSED)                                                          \
+  V(FunctionType, UntaggedFunctionType, parameter_types, Array,                \
+    FINAL_COMPRESSED)                                                          \
   V(GrowableObjectArray, UntaggedGrowableObjectArray, length, Smi, VAR)        \
   V(GrowableObjectArray, UntaggedGrowableObjectArray, data, Array, VAR)        \
-  V(TypedDataBase, UntaggedTypedDataBase, length, Smi, FINAL)                  \
-  V(TypedDataView, UntaggedTypedDataView, offset_in_bytes, Smi, FINAL)         \
-  V(TypedDataView, UntaggedTypedDataView, data, Dynamic, FINAL)                \
-  V(String, UntaggedString, length, Smi, FINAL)                                \
+  V(TypedDataBase, UntaggedTypedDataBase, length, Smi, FINAL_COMPRESSED)       \
+  V(TypedDataView, UntaggedTypedDataView, offset_in_bytes, Smi,                \
+    FINAL_COMPRESSED)                                                          \
+  V(TypedDataView, UntaggedTypedDataView, data, Dynamic, FINAL_COMPRESSED)     \
+  V(String, UntaggedString, length, Smi, FINAL_COMPRESSED)                     \
   V(LinkedHashMap, UntaggedLinkedHashMap, index, TypedDataUint32Array, VAR)    \
   V(LinkedHashMap, UntaggedLinkedHashMap, data, Array, VAR)                    \
   V(LinkedHashMap, UntaggedLinkedHashMap, hash_mask, Smi, VAR)                 \
@@ -103,10 +107,12 @@
   V(ArgumentsDescriptor, UntaggedArray, size, Smi, FINAL)                      \
   V(PointerBase, UntaggedPointerBase, data_field, Dynamic, FINAL)              \
   V(TypeArguments, UntaggedTypeArguments, length, Smi, FINAL)                  \
-  V(TypeParameter, UntaggedTypeParameter, bound, Dynamic, FINAL)               \
-  V(TypeParameter, UntaggedTypeParameter, name, Dynamic, FINAL)                \
-  V(UnhandledException, UntaggedUnhandledException, exception, Dynamic, FINAL) \
-  V(UnhandledException, UntaggedUnhandledException, stacktrace, Dynamic, FINAL)
+  V(TypeParameter, UntaggedTypeParameter, bound, Dynamic, FINAL_COMPRESSED)    \
+  V(TypeParameter, UntaggedTypeParameter, name, Dynamic, FINAL_COMPRESSED)     \
+  V(UnhandledException, UntaggedUnhandledException, exception, Dynamic,        \
+    FINAL_COMPRESSED)                                                          \
+  V(UnhandledException, UntaggedUnhandledException, stacktrace, Dynamic,       \
+    FINAL_COMPRESSED)
 
 // List of slots that correspond to unboxed fields of native objects in the
 // following format:
diff --git a/runtime/vm/compiler/runtime_api.cc b/runtime/vm/compiler/runtime_api.cc
index 63fa7d6..4db6350 100644
--- a/runtime/vm/compiler/runtime_api.cc
+++ b/runtime/vm/compiler/runtime_api.cc
@@ -816,7 +816,13 @@
 #endif  // defined(TARGET_ARCH_IA32)
 
 word RegExp::function_offset(classid_t cid, bool sticky) {
+#if !defined(DART_COMPRESSED_POINTERS)
   return TranslateOffsetInWords(dart::RegExp::function_offset(cid, sticky));
+#else
+  // TODO(rmacnak): TranslateOffsetInWords doesn't account for, say, header
+  // being 1 word and slots being half words.
+  return dart::RegExp::function_offset(cid, sticky);
+#endif
 }
 
 const word Symbols::kNumberOfOneCharCodeSymbols =
diff --git a/runtime/vm/compiler/runtime_offsets_extracted.h b/runtime/vm/compiler/runtime_offsets_extracted.h
index 3b346df..0f37245 100644
--- a/runtime/vm/compiler/runtime_offsets_extracted.h
+++ b/runtime/vm/compiler/runtime_offsets_extracted.h
@@ -2540,39 +2540,39 @@
 static constexpr dart::compiler::target::word TimelineStream_enabled_offset =
     16;
 static constexpr dart::compiler::target::word TwoByteString_data_offset = 16;
-static constexpr dart::compiler::target::word Type_arguments_offset = 32;
-static constexpr dart::compiler::target::word Type_hash_offset = 40;
-static constexpr dart::compiler::target::word Type_type_class_id_offset = 24;
-static constexpr dart::compiler::target::word Type_type_state_offset = 48;
-static constexpr dart::compiler::target::word Type_nullability_offset = 49;
-static constexpr dart::compiler::target::word FunctionType_hash_offset = 56;
+static constexpr dart::compiler::target::word Type_arguments_offset = 24;
+static constexpr dart::compiler::target::word Type_hash_offset = 28;
+static constexpr dart::compiler::target::word Type_type_class_id_offset = 20;
+static constexpr dart::compiler::target::word Type_type_state_offset = 32;
+static constexpr dart::compiler::target::word Type_nullability_offset = 33;
+static constexpr dart::compiler::target::word FunctionType_hash_offset = 36;
 static constexpr dart::compiler::target::word
-    FunctionType_packed_fields_offset = 64;
+    FunctionType_packed_fields_offset = 40;
 static constexpr dart::compiler::target::word
-    FunctionType_parameter_types_offset = 40;
+    FunctionType_parameter_types_offset = 28;
 static constexpr dart::compiler::target::word
-    FunctionType_parameter_names_offset = 48;
+    FunctionType_parameter_names_offset = 32;
 static constexpr dart::compiler::target::word
-    FunctionType_type_parameters_offset = 24;
+    FunctionType_type_parameters_offset = 20;
 static constexpr dart::compiler::target::word
-    TypeParameter_parameterized_class_id_offset = 56;
-static constexpr dart::compiler::target::word TypeParameter_index_offset = 60;
+    TypeParameter_parameterized_class_id_offset = 36;
+static constexpr dart::compiler::target::word TypeParameter_index_offset = 40;
 static constexpr dart::compiler::target::word TypeParameter_nullability_offset =
-    63;
+    43;
 static constexpr dart::compiler::target::word
     TypeArguments_instantiations_offset = 8;
 static constexpr dart::compiler::target::word TypeArguments_length_offset = 16;
 static constexpr dart::compiler::target::word TypeArguments_nullability_offset =
     32;
 static constexpr dart::compiler::target::word TypeArguments_types_offset = 40;
-static constexpr dart::compiler::target::word TypeParameter_bound_offset = 40;
-static constexpr dart::compiler::target::word TypeParameter_flags_offset = 62;
-static constexpr dart::compiler::target::word TypeParameter_name_offset = 24;
-static constexpr dart::compiler::target::word TypeRef_type_offset = 24;
+static constexpr dart::compiler::target::word TypeParameter_bound_offset = 28;
+static constexpr dart::compiler::target::word TypeParameter_flags_offset = 42;
+static constexpr dart::compiler::target::word TypeParameter_name_offset = 20;
+static constexpr dart::compiler::target::word TypeRef_type_offset = 20;
 static constexpr dart::compiler::target::word TypedDataBase_length_offset = 16;
-static constexpr dart::compiler::target::word TypedDataView_data_offset = 24;
+static constexpr dart::compiler::target::word TypedDataView_data_offset = 20;
 static constexpr dart::compiler::target::word
-    TypedDataView_offset_in_bytes_offset = 32;
+    TypedDataView_offset_in_bytes_offset = 24;
 static constexpr dart::compiler::target::word TypedData_data_offset = 24;
 static constexpr dart::compiler::target::word
     UnhandledException_exception_offset = 8;
@@ -2633,7 +2633,7 @@
 static constexpr dart::compiler::target::word Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Float64x2_InstanceSize = 24;
 static constexpr dart::compiler::target::word Function_InstanceSize = 96;
-static constexpr dart::compiler::target::word FunctionType_InstanceSize = 72;
+static constexpr dart::compiler::target::word FunctionType_InstanceSize = 48;
 static constexpr dart::compiler::target::word FutureOr_InstanceSize = 16;
 static constexpr dart::compiler::target::word GrowableObjectArray_InstanceSize =
     32;
@@ -2649,7 +2649,7 @@
     64;
 static constexpr dart::compiler::target::word LanguageError_InstanceSize = 32;
 static constexpr dart::compiler::target::word Library_InstanceSize = 104;
-static constexpr dart::compiler::target::word LibraryPrefix_InstanceSize = 40;
+static constexpr dart::compiler::target::word LibraryPrefix_InstanceSize = 24;
 static constexpr dart::compiler::target::word LinkedHashMap_InstanceSize = 56;
 static constexpr dart::compiler::target::word LocalVarDescriptors_InstanceSize =
     16;
@@ -2668,14 +2668,14 @@
 static constexpr dart::compiler::target::word PatchClass_InstanceSize = 32;
 static constexpr dart::compiler::target::word PcDescriptors_HeaderSize = 16;
 static constexpr dart::compiler::target::word Pointer_InstanceSize = 24;
-static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 40;
-static constexpr dart::compiler::target::word RegExp_InstanceSize = 120;
+static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 24;
+static constexpr dart::compiler::target::word RegExp_InstanceSize = 80;
 static constexpr dart::compiler::target::word Script_InstanceSize = 72;
 static constexpr dart::compiler::target::word SendPort_InstanceSize = 24;
 static constexpr dart::compiler::target::word SingleTargetCache_InstanceSize =
     32;
 static constexpr dart::compiler::target::word Smi_InstanceSize = 8;
-static constexpr dart::compiler::target::word StackTrace_InstanceSize = 40;
+static constexpr dart::compiler::target::word StackTrace_InstanceSize = 24;
 static constexpr dart::compiler::target::word String_InstanceSize = 16;
 static constexpr dart::compiler::target::word SubtypeTestCache_InstanceSize =
     16;
@@ -2683,13 +2683,13 @@
 static constexpr dart::compiler::target::word
     TransferableTypedData_InstanceSize = 8;
 static constexpr dart::compiler::target::word TwoByteString_InstanceSize = 16;
-static constexpr dart::compiler::target::word Type_InstanceSize = 56;
+static constexpr dart::compiler::target::word Type_InstanceSize = 40;
 static constexpr dart::compiler::target::word TypeArguments_InstanceSize = 40;
-static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 64;
-static constexpr dart::compiler::target::word TypeRef_InstanceSize = 32;
+static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 48;
+static constexpr dart::compiler::target::word TypeRef_InstanceSize = 24;
 static constexpr dart::compiler::target::word TypedData_InstanceSize = 24;
 static constexpr dart::compiler::target::word TypedDataBase_InstanceSize = 24;
-static constexpr dart::compiler::target::word TypedDataView_InstanceSize = 40;
+static constexpr dart::compiler::target::word TypedDataView_InstanceSize = 32;
 static constexpr dart::compiler::target::word UnhandledException_InstanceSize =
     16;
 static constexpr dart::compiler::target::word UnlinkedCall_InstanceSize = 32;
@@ -3079,39 +3079,39 @@
 static constexpr dart::compiler::target::word TimelineStream_enabled_offset =
     16;
 static constexpr dart::compiler::target::word TwoByteString_data_offset = 16;
-static constexpr dart::compiler::target::word Type_arguments_offset = 32;
-static constexpr dart::compiler::target::word Type_hash_offset = 40;
-static constexpr dart::compiler::target::word Type_type_class_id_offset = 24;
-static constexpr dart::compiler::target::word Type_type_state_offset = 48;
-static constexpr dart::compiler::target::word Type_nullability_offset = 49;
-static constexpr dart::compiler::target::word FunctionType_hash_offset = 56;
+static constexpr dart::compiler::target::word Type_arguments_offset = 24;
+static constexpr dart::compiler::target::word Type_hash_offset = 28;
+static constexpr dart::compiler::target::word Type_type_class_id_offset = 20;
+static constexpr dart::compiler::target::word Type_type_state_offset = 32;
+static constexpr dart::compiler::target::word Type_nullability_offset = 33;
+static constexpr dart::compiler::target::word FunctionType_hash_offset = 36;
 static constexpr dart::compiler::target::word
-    FunctionType_packed_fields_offset = 64;
+    FunctionType_packed_fields_offset = 40;
 static constexpr dart::compiler::target::word
-    FunctionType_parameter_types_offset = 40;
+    FunctionType_parameter_types_offset = 28;
 static constexpr dart::compiler::target::word
-    FunctionType_parameter_names_offset = 48;
+    FunctionType_parameter_names_offset = 32;
 static constexpr dart::compiler::target::word
-    FunctionType_type_parameters_offset = 24;
+    FunctionType_type_parameters_offset = 20;
 static constexpr dart::compiler::target::word
-    TypeParameter_parameterized_class_id_offset = 56;
-static constexpr dart::compiler::target::word TypeParameter_index_offset = 60;
+    TypeParameter_parameterized_class_id_offset = 36;
+static constexpr dart::compiler::target::word TypeParameter_index_offset = 40;
 static constexpr dart::compiler::target::word TypeParameter_nullability_offset =
-    63;
+    43;
 static constexpr dart::compiler::target::word
     TypeArguments_instantiations_offset = 8;
 static constexpr dart::compiler::target::word TypeArguments_length_offset = 16;
 static constexpr dart::compiler::target::word TypeArguments_nullability_offset =
     32;
 static constexpr dart::compiler::target::word TypeArguments_types_offset = 40;
-static constexpr dart::compiler::target::word TypeParameter_bound_offset = 40;
-static constexpr dart::compiler::target::word TypeParameter_flags_offset = 62;
-static constexpr dart::compiler::target::word TypeParameter_name_offset = 24;
-static constexpr dart::compiler::target::word TypeRef_type_offset = 24;
+static constexpr dart::compiler::target::word TypeParameter_bound_offset = 28;
+static constexpr dart::compiler::target::word TypeParameter_flags_offset = 42;
+static constexpr dart::compiler::target::word TypeParameter_name_offset = 20;
+static constexpr dart::compiler::target::word TypeRef_type_offset = 20;
 static constexpr dart::compiler::target::word TypedDataBase_length_offset = 16;
-static constexpr dart::compiler::target::word TypedDataView_data_offset = 24;
+static constexpr dart::compiler::target::word TypedDataView_data_offset = 20;
 static constexpr dart::compiler::target::word
-    TypedDataView_offset_in_bytes_offset = 32;
+    TypedDataView_offset_in_bytes_offset = 24;
 static constexpr dart::compiler::target::word TypedData_data_offset = 24;
 static constexpr dart::compiler::target::word
     UnhandledException_exception_offset = 8;
@@ -3173,7 +3173,7 @@
 static constexpr dart::compiler::target::word Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Float64x2_InstanceSize = 24;
 static constexpr dart::compiler::target::word Function_InstanceSize = 96;
-static constexpr dart::compiler::target::word FunctionType_InstanceSize = 72;
+static constexpr dart::compiler::target::word FunctionType_InstanceSize = 48;
 static constexpr dart::compiler::target::word FutureOr_InstanceSize = 16;
 static constexpr dart::compiler::target::word GrowableObjectArray_InstanceSize =
     32;
@@ -3189,7 +3189,7 @@
     64;
 static constexpr dart::compiler::target::word LanguageError_InstanceSize = 32;
 static constexpr dart::compiler::target::word Library_InstanceSize = 104;
-static constexpr dart::compiler::target::word LibraryPrefix_InstanceSize = 40;
+static constexpr dart::compiler::target::word LibraryPrefix_InstanceSize = 24;
 static constexpr dart::compiler::target::word LinkedHashMap_InstanceSize = 56;
 static constexpr dart::compiler::target::word LocalVarDescriptors_InstanceSize =
     16;
@@ -3208,14 +3208,14 @@
 static constexpr dart::compiler::target::word PatchClass_InstanceSize = 32;
 static constexpr dart::compiler::target::word PcDescriptors_HeaderSize = 16;
 static constexpr dart::compiler::target::word Pointer_InstanceSize = 24;
-static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 40;
-static constexpr dart::compiler::target::word RegExp_InstanceSize = 120;
+static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 24;
+static constexpr dart::compiler::target::word RegExp_InstanceSize = 80;
 static constexpr dart::compiler::target::word Script_InstanceSize = 72;
 static constexpr dart::compiler::target::word SendPort_InstanceSize = 24;
 static constexpr dart::compiler::target::word SingleTargetCache_InstanceSize =
     32;
 static constexpr dart::compiler::target::word Smi_InstanceSize = 8;
-static constexpr dart::compiler::target::word StackTrace_InstanceSize = 40;
+static constexpr dart::compiler::target::word StackTrace_InstanceSize = 24;
 static constexpr dart::compiler::target::word String_InstanceSize = 16;
 static constexpr dart::compiler::target::word SubtypeTestCache_InstanceSize =
     16;
@@ -3223,13 +3223,13 @@
 static constexpr dart::compiler::target::word
     TransferableTypedData_InstanceSize = 8;
 static constexpr dart::compiler::target::word TwoByteString_InstanceSize = 16;
-static constexpr dart::compiler::target::word Type_InstanceSize = 56;
+static constexpr dart::compiler::target::word Type_InstanceSize = 40;
 static constexpr dart::compiler::target::word TypeArguments_InstanceSize = 40;
-static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 64;
-static constexpr dart::compiler::target::word TypeRef_InstanceSize = 32;
+static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 48;
+static constexpr dart::compiler::target::word TypeRef_InstanceSize = 24;
 static constexpr dart::compiler::target::word TypedData_InstanceSize = 24;
 static constexpr dart::compiler::target::word TypedDataBase_InstanceSize = 24;
-static constexpr dart::compiler::target::word TypedDataView_InstanceSize = 40;
+static constexpr dart::compiler::target::word TypedDataView_InstanceSize = 32;
 static constexpr dart::compiler::target::word UnhandledException_InstanceSize =
     16;
 static constexpr dart::compiler::target::word UnlinkedCall_InstanceSize = 32;
@@ -5738,39 +5738,39 @@
 static constexpr dart::compiler::target::word TimelineStream_enabled_offset =
     16;
 static constexpr dart::compiler::target::word TwoByteString_data_offset = 16;
-static constexpr dart::compiler::target::word Type_arguments_offset = 32;
-static constexpr dart::compiler::target::word Type_hash_offset = 40;
-static constexpr dart::compiler::target::word Type_type_class_id_offset = 24;
-static constexpr dart::compiler::target::word Type_type_state_offset = 48;
-static constexpr dart::compiler::target::word Type_nullability_offset = 49;
-static constexpr dart::compiler::target::word FunctionType_hash_offset = 56;
+static constexpr dart::compiler::target::word Type_arguments_offset = 24;
+static constexpr dart::compiler::target::word Type_hash_offset = 28;
+static constexpr dart::compiler::target::word Type_type_class_id_offset = 20;
+static constexpr dart::compiler::target::word Type_type_state_offset = 32;
+static constexpr dart::compiler::target::word Type_nullability_offset = 33;
+static constexpr dart::compiler::target::word FunctionType_hash_offset = 36;
 static constexpr dart::compiler::target::word
-    FunctionType_packed_fields_offset = 64;
+    FunctionType_packed_fields_offset = 40;
 static constexpr dart::compiler::target::word
-    FunctionType_parameter_types_offset = 40;
+    FunctionType_parameter_types_offset = 28;
 static constexpr dart::compiler::target::word
-    FunctionType_parameter_names_offset = 48;
+    FunctionType_parameter_names_offset = 32;
 static constexpr dart::compiler::target::word
-    FunctionType_type_parameters_offset = 24;
+    FunctionType_type_parameters_offset = 20;
 static constexpr dart::compiler::target::word
-    TypeParameter_parameterized_class_id_offset = 56;
-static constexpr dart::compiler::target::word TypeParameter_index_offset = 60;
+    TypeParameter_parameterized_class_id_offset = 36;
+static constexpr dart::compiler::target::word TypeParameter_index_offset = 40;
 static constexpr dart::compiler::target::word TypeParameter_nullability_offset =
-    63;
+    43;
 static constexpr dart::compiler::target::word
     TypeArguments_instantiations_offset = 8;
 static constexpr dart::compiler::target::word TypeArguments_length_offset = 16;
 static constexpr dart::compiler::target::word TypeArguments_nullability_offset =
     32;
 static constexpr dart::compiler::target::word TypeArguments_types_offset = 40;
-static constexpr dart::compiler::target::word TypeParameter_bound_offset = 40;
-static constexpr dart::compiler::target::word TypeParameter_flags_offset = 62;
-static constexpr dart::compiler::target::word TypeParameter_name_offset = 24;
-static constexpr dart::compiler::target::word TypeRef_type_offset = 24;
+static constexpr dart::compiler::target::word TypeParameter_bound_offset = 28;
+static constexpr dart::compiler::target::word TypeParameter_flags_offset = 42;
+static constexpr dart::compiler::target::word TypeParameter_name_offset = 20;
+static constexpr dart::compiler::target::word TypeRef_type_offset = 20;
 static constexpr dart::compiler::target::word TypedDataBase_length_offset = 16;
-static constexpr dart::compiler::target::word TypedDataView_data_offset = 24;
+static constexpr dart::compiler::target::word TypedDataView_data_offset = 20;
 static constexpr dart::compiler::target::word
-    TypedDataView_offset_in_bytes_offset = 32;
+    TypedDataView_offset_in_bytes_offset = 24;
 static constexpr dart::compiler::target::word TypedData_data_offset = 24;
 static constexpr dart::compiler::target::word
     UnhandledException_exception_offset = 8;
@@ -5828,7 +5828,7 @@
 static constexpr dart::compiler::target::word Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Float64x2_InstanceSize = 24;
 static constexpr dart::compiler::target::word Function_InstanceSize = 96;
-static constexpr dart::compiler::target::word FunctionType_InstanceSize = 72;
+static constexpr dart::compiler::target::word FunctionType_InstanceSize = 48;
 static constexpr dart::compiler::target::word FutureOr_InstanceSize = 16;
 static constexpr dart::compiler::target::word GrowableObjectArray_InstanceSize =
     32;
@@ -5844,7 +5844,7 @@
     64;
 static constexpr dart::compiler::target::word LanguageError_InstanceSize = 32;
 static constexpr dart::compiler::target::word Library_InstanceSize = 104;
-static constexpr dart::compiler::target::word LibraryPrefix_InstanceSize = 40;
+static constexpr dart::compiler::target::word LibraryPrefix_InstanceSize = 24;
 static constexpr dart::compiler::target::word LinkedHashMap_InstanceSize = 56;
 static constexpr dart::compiler::target::word LocalVarDescriptors_InstanceSize =
     16;
@@ -5863,14 +5863,14 @@
 static constexpr dart::compiler::target::word PatchClass_InstanceSize = 32;
 static constexpr dart::compiler::target::word PcDescriptors_HeaderSize = 16;
 static constexpr dart::compiler::target::word Pointer_InstanceSize = 24;
-static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 24;
-static constexpr dart::compiler::target::word RegExp_InstanceSize = 120;
+static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 16;
+static constexpr dart::compiler::target::word RegExp_InstanceSize = 80;
 static constexpr dart::compiler::target::word Script_InstanceSize = 64;
 static constexpr dart::compiler::target::word SendPort_InstanceSize = 24;
 static constexpr dart::compiler::target::word SingleTargetCache_InstanceSize =
     32;
 static constexpr dart::compiler::target::word Smi_InstanceSize = 8;
-static constexpr dart::compiler::target::word StackTrace_InstanceSize = 40;
+static constexpr dart::compiler::target::word StackTrace_InstanceSize = 24;
 static constexpr dart::compiler::target::word String_InstanceSize = 16;
 static constexpr dart::compiler::target::word SubtypeTestCache_InstanceSize =
     16;
@@ -5878,13 +5878,13 @@
 static constexpr dart::compiler::target::word
     TransferableTypedData_InstanceSize = 8;
 static constexpr dart::compiler::target::word TwoByteString_InstanceSize = 16;
-static constexpr dart::compiler::target::word Type_InstanceSize = 56;
+static constexpr dart::compiler::target::word Type_InstanceSize = 40;
 static constexpr dart::compiler::target::word TypeArguments_InstanceSize = 40;
-static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 64;
-static constexpr dart::compiler::target::word TypeRef_InstanceSize = 32;
+static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 48;
+static constexpr dart::compiler::target::word TypeRef_InstanceSize = 24;
 static constexpr dart::compiler::target::word TypedData_InstanceSize = 24;
 static constexpr dart::compiler::target::word TypedDataBase_InstanceSize = 24;
-static constexpr dart::compiler::target::word TypedDataView_InstanceSize = 40;
+static constexpr dart::compiler::target::word TypedDataView_InstanceSize = 32;
 static constexpr dart::compiler::target::word UnhandledException_InstanceSize =
     16;
 static constexpr dart::compiler::target::word UnlinkedCall_InstanceSize = 32;
@@ -6271,39 +6271,39 @@
 static constexpr dart::compiler::target::word TimelineStream_enabled_offset =
     16;
 static constexpr dart::compiler::target::word TwoByteString_data_offset = 16;
-static constexpr dart::compiler::target::word Type_arguments_offset = 32;
-static constexpr dart::compiler::target::word Type_hash_offset = 40;
-static constexpr dart::compiler::target::word Type_type_class_id_offset = 24;
-static constexpr dart::compiler::target::word Type_type_state_offset = 48;
-static constexpr dart::compiler::target::word Type_nullability_offset = 49;
-static constexpr dart::compiler::target::word FunctionType_hash_offset = 56;
+static constexpr dart::compiler::target::word Type_arguments_offset = 24;
+static constexpr dart::compiler::target::word Type_hash_offset = 28;
+static constexpr dart::compiler::target::word Type_type_class_id_offset = 20;
+static constexpr dart::compiler::target::word Type_type_state_offset = 32;
+static constexpr dart::compiler::target::word Type_nullability_offset = 33;
+static constexpr dart::compiler::target::word FunctionType_hash_offset = 36;
 static constexpr dart::compiler::target::word
-    FunctionType_packed_fields_offset = 64;
+    FunctionType_packed_fields_offset = 40;
 static constexpr dart::compiler::target::word
-    FunctionType_parameter_types_offset = 40;
+    FunctionType_parameter_types_offset = 28;
 static constexpr dart::compiler::target::word
-    FunctionType_parameter_names_offset = 48;
+    FunctionType_parameter_names_offset = 32;
 static constexpr dart::compiler::target::word
-    FunctionType_type_parameters_offset = 24;
+    FunctionType_type_parameters_offset = 20;
 static constexpr dart::compiler::target::word
-    TypeParameter_parameterized_class_id_offset = 56;
-static constexpr dart::compiler::target::word TypeParameter_index_offset = 60;
+    TypeParameter_parameterized_class_id_offset = 36;
+static constexpr dart::compiler::target::word TypeParameter_index_offset = 40;
 static constexpr dart::compiler::target::word TypeParameter_nullability_offset =
-    63;
+    43;
 static constexpr dart::compiler::target::word
     TypeArguments_instantiations_offset = 8;
 static constexpr dart::compiler::target::word TypeArguments_length_offset = 16;
 static constexpr dart::compiler::target::word TypeArguments_nullability_offset =
     32;
 static constexpr dart::compiler::target::word TypeArguments_types_offset = 40;
-static constexpr dart::compiler::target::word TypeParameter_bound_offset = 40;
-static constexpr dart::compiler::target::word TypeParameter_flags_offset = 62;
-static constexpr dart::compiler::target::word TypeParameter_name_offset = 24;
-static constexpr dart::compiler::target::word TypeRef_type_offset = 24;
+static constexpr dart::compiler::target::word TypeParameter_bound_offset = 28;
+static constexpr dart::compiler::target::word TypeParameter_flags_offset = 42;
+static constexpr dart::compiler::target::word TypeParameter_name_offset = 20;
+static constexpr dart::compiler::target::word TypeRef_type_offset = 20;
 static constexpr dart::compiler::target::word TypedDataBase_length_offset = 16;
-static constexpr dart::compiler::target::word TypedDataView_data_offset = 24;
+static constexpr dart::compiler::target::word TypedDataView_data_offset = 20;
 static constexpr dart::compiler::target::word
-    TypedDataView_offset_in_bytes_offset = 32;
+    TypedDataView_offset_in_bytes_offset = 24;
 static constexpr dart::compiler::target::word TypedData_data_offset = 24;
 static constexpr dart::compiler::target::word
     UnhandledException_exception_offset = 8;
@@ -6362,7 +6362,7 @@
 static constexpr dart::compiler::target::word Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Float64x2_InstanceSize = 24;
 static constexpr dart::compiler::target::word Function_InstanceSize = 96;
-static constexpr dart::compiler::target::word FunctionType_InstanceSize = 72;
+static constexpr dart::compiler::target::word FunctionType_InstanceSize = 48;
 static constexpr dart::compiler::target::word FutureOr_InstanceSize = 16;
 static constexpr dart::compiler::target::word GrowableObjectArray_InstanceSize =
     32;
@@ -6378,7 +6378,7 @@
     64;
 static constexpr dart::compiler::target::word LanguageError_InstanceSize = 32;
 static constexpr dart::compiler::target::word Library_InstanceSize = 104;
-static constexpr dart::compiler::target::word LibraryPrefix_InstanceSize = 40;
+static constexpr dart::compiler::target::word LibraryPrefix_InstanceSize = 24;
 static constexpr dart::compiler::target::word LinkedHashMap_InstanceSize = 56;
 static constexpr dart::compiler::target::word LocalVarDescriptors_InstanceSize =
     16;
@@ -6397,14 +6397,14 @@
 static constexpr dart::compiler::target::word PatchClass_InstanceSize = 32;
 static constexpr dart::compiler::target::word PcDescriptors_HeaderSize = 16;
 static constexpr dart::compiler::target::word Pointer_InstanceSize = 24;
-static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 24;
-static constexpr dart::compiler::target::word RegExp_InstanceSize = 120;
+static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 16;
+static constexpr dart::compiler::target::word RegExp_InstanceSize = 80;
 static constexpr dart::compiler::target::word Script_InstanceSize = 64;
 static constexpr dart::compiler::target::word SendPort_InstanceSize = 24;
 static constexpr dart::compiler::target::word SingleTargetCache_InstanceSize =
     32;
 static constexpr dart::compiler::target::word Smi_InstanceSize = 8;
-static constexpr dart::compiler::target::word StackTrace_InstanceSize = 40;
+static constexpr dart::compiler::target::word StackTrace_InstanceSize = 24;
 static constexpr dart::compiler::target::word String_InstanceSize = 16;
 static constexpr dart::compiler::target::word SubtypeTestCache_InstanceSize =
     16;
@@ -6412,13 +6412,13 @@
 static constexpr dart::compiler::target::word
     TransferableTypedData_InstanceSize = 8;
 static constexpr dart::compiler::target::word TwoByteString_InstanceSize = 16;
-static constexpr dart::compiler::target::word Type_InstanceSize = 56;
+static constexpr dart::compiler::target::word Type_InstanceSize = 40;
 static constexpr dart::compiler::target::word TypeArguments_InstanceSize = 40;
-static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 64;
-static constexpr dart::compiler::target::word TypeRef_InstanceSize = 32;
+static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 48;
+static constexpr dart::compiler::target::word TypeRef_InstanceSize = 24;
 static constexpr dart::compiler::target::word TypedData_InstanceSize = 24;
 static constexpr dart::compiler::target::word TypedDataBase_InstanceSize = 24;
-static constexpr dart::compiler::target::word TypedDataView_InstanceSize = 40;
+static constexpr dart::compiler::target::word TypedDataView_InstanceSize = 32;
 static constexpr dart::compiler::target::word UnhandledException_InstanceSize =
     16;
 static constexpr dart::compiler::target::word UnlinkedCall_InstanceSize = 32;
@@ -8636,27 +8636,27 @@
     AOT_TimelineStream_enabled_offset = 16;
 static constexpr dart::compiler::target::word AOT_TwoByteString_data_offset =
     16;
-static constexpr dart::compiler::target::word AOT_Type_arguments_offset = 32;
-static constexpr dart::compiler::target::word AOT_Type_hash_offset = 40;
+static constexpr dart::compiler::target::word AOT_Type_arguments_offset = 24;
+static constexpr dart::compiler::target::word AOT_Type_hash_offset = 28;
 static constexpr dart::compiler::target::word AOT_Type_type_class_id_offset =
-    24;
-static constexpr dart::compiler::target::word AOT_Type_type_state_offset = 48;
-static constexpr dart::compiler::target::word AOT_Type_nullability_offset = 49;
-static constexpr dart::compiler::target::word AOT_FunctionType_hash_offset = 56;
+    20;
+static constexpr dart::compiler::target::word AOT_Type_type_state_offset = 32;
+static constexpr dart::compiler::target::word AOT_Type_nullability_offset = 33;
+static constexpr dart::compiler::target::word AOT_FunctionType_hash_offset = 36;
 static constexpr dart::compiler::target::word
-    AOT_FunctionType_packed_fields_offset = 64;
+    AOT_FunctionType_packed_fields_offset = 40;
 static constexpr dart::compiler::target::word
-    AOT_FunctionType_parameter_types_offset = 40;
+    AOT_FunctionType_parameter_types_offset = 28;
 static constexpr dart::compiler::target::word
-    AOT_FunctionType_parameter_names_offset = 48;
+    AOT_FunctionType_parameter_names_offset = 32;
 static constexpr dart::compiler::target::word
-    AOT_FunctionType_type_parameters_offset = 24;
+    AOT_FunctionType_type_parameters_offset = 20;
 static constexpr dart::compiler::target::word
-    AOT_TypeParameter_parameterized_class_id_offset = 56;
+    AOT_TypeParameter_parameterized_class_id_offset = 36;
 static constexpr dart::compiler::target::word AOT_TypeParameter_index_offset =
-    60;
+    40;
 static constexpr dart::compiler::target::word
-    AOT_TypeParameter_nullability_offset = 63;
+    AOT_TypeParameter_nullability_offset = 43;
 static constexpr dart::compiler::target::word
     AOT_TypeArguments_instantiations_offset = 8;
 static constexpr dart::compiler::target::word AOT_TypeArguments_length_offset =
@@ -8666,18 +8666,18 @@
 static constexpr dart::compiler::target::word AOT_TypeArguments_types_offset =
     40;
 static constexpr dart::compiler::target::word AOT_TypeParameter_bound_offset =
-    40;
+    28;
 static constexpr dart::compiler::target::word AOT_TypeParameter_flags_offset =
-    62;
+    42;
 static constexpr dart::compiler::target::word AOT_TypeParameter_name_offset =
-    24;
-static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 24;
+    20;
+static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 20;
 static constexpr dart::compiler::target::word AOT_TypedDataBase_length_offset =
     16;
 static constexpr dart::compiler::target::word AOT_TypedDataView_data_offset =
-    24;
+    20;
 static constexpr dart::compiler::target::word
-    AOT_TypedDataView_offset_in_bytes_offset = 32;
+    AOT_TypedDataView_offset_in_bytes_offset = 24;
 static constexpr dart::compiler::target::word AOT_TypedData_data_offset = 24;
 static constexpr dart::compiler::target::word
     AOT_UnhandledException_exception_offset = 8;
@@ -8745,7 +8745,7 @@
 static constexpr dart::compiler::target::word AOT_Float64x2_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Function_InstanceSize = 64;
 static constexpr dart::compiler::target::word AOT_FunctionType_InstanceSize =
-    72;
+    48;
 static constexpr dart::compiler::target::word AOT_FutureOr_InstanceSize = 16;
 static constexpr dart::compiler::target::word
     AOT_GrowableObjectArray_InstanceSize = 32;
@@ -8763,7 +8763,7 @@
     32;
 static constexpr dart::compiler::target::word AOT_Library_InstanceSize = 96;
 static constexpr dart::compiler::target::word AOT_LibraryPrefix_InstanceSize =
-    40;
+    24;
 static constexpr dart::compiler::target::word AOT_LinkedHashMap_InstanceSize =
     56;
 static constexpr dart::compiler::target::word
@@ -8786,14 +8786,14 @@
 static constexpr dart::compiler::target::word AOT_PatchClass_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_PcDescriptors_HeaderSize = 16;
 static constexpr dart::compiler::target::word AOT_Pointer_InstanceSize = 24;
-static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 40;
-static constexpr dart::compiler::target::word AOT_RegExp_InstanceSize = 120;
+static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 24;
+static constexpr dart::compiler::target::word AOT_RegExp_InstanceSize = 80;
 static constexpr dart::compiler::target::word AOT_Script_InstanceSize = 56;
 static constexpr dart::compiler::target::word AOT_SendPort_InstanceSize = 24;
 static constexpr dart::compiler::target::word
     AOT_SingleTargetCache_InstanceSize = 32;
 static constexpr dart::compiler::target::word AOT_Smi_InstanceSize = 8;
-static constexpr dart::compiler::target::word AOT_StackTrace_InstanceSize = 40;
+static constexpr dart::compiler::target::word AOT_StackTrace_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_String_InstanceSize = 16;
 static constexpr dart::compiler::target::word
     AOT_SubtypeTestCache_InstanceSize = 16;
@@ -8802,17 +8802,17 @@
     AOT_TransferableTypedData_InstanceSize = 8;
 static constexpr dart::compiler::target::word AOT_TwoByteString_InstanceSize =
     16;
-static constexpr dart::compiler::target::word AOT_Type_InstanceSize = 56;
+static constexpr dart::compiler::target::word AOT_Type_InstanceSize = 40;
 static constexpr dart::compiler::target::word AOT_TypeArguments_InstanceSize =
     40;
 static constexpr dart::compiler::target::word AOT_TypeParameter_InstanceSize =
-    64;
-static constexpr dart::compiler::target::word AOT_TypeRef_InstanceSize = 32;
+    48;
+static constexpr dart::compiler::target::word AOT_TypeRef_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_TypedData_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_TypedDataBase_InstanceSize =
     24;
 static constexpr dart::compiler::target::word AOT_TypedDataView_InstanceSize =
-    40;
+    32;
 static constexpr dart::compiler::target::word
     AOT_UnhandledException_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_UnlinkedCall_InstanceSize =
@@ -9234,27 +9234,27 @@
     AOT_TimelineStream_enabled_offset = 16;
 static constexpr dart::compiler::target::word AOT_TwoByteString_data_offset =
     16;
-static constexpr dart::compiler::target::word AOT_Type_arguments_offset = 32;
-static constexpr dart::compiler::target::word AOT_Type_hash_offset = 40;
+static constexpr dart::compiler::target::word AOT_Type_arguments_offset = 24;
+static constexpr dart::compiler::target::word AOT_Type_hash_offset = 28;
 static constexpr dart::compiler::target::word AOT_Type_type_class_id_offset =
-    24;
-static constexpr dart::compiler::target::word AOT_Type_type_state_offset = 48;
-static constexpr dart::compiler::target::word AOT_Type_nullability_offset = 49;
-static constexpr dart::compiler::target::word AOT_FunctionType_hash_offset = 56;
+    20;
+static constexpr dart::compiler::target::word AOT_Type_type_state_offset = 32;
+static constexpr dart::compiler::target::word AOT_Type_nullability_offset = 33;
+static constexpr dart::compiler::target::word AOT_FunctionType_hash_offset = 36;
 static constexpr dart::compiler::target::word
-    AOT_FunctionType_packed_fields_offset = 64;
+    AOT_FunctionType_packed_fields_offset = 40;
 static constexpr dart::compiler::target::word
-    AOT_FunctionType_parameter_types_offset = 40;
+    AOT_FunctionType_parameter_types_offset = 28;
 static constexpr dart::compiler::target::word
-    AOT_FunctionType_parameter_names_offset = 48;
+    AOT_FunctionType_parameter_names_offset = 32;
 static constexpr dart::compiler::target::word
-    AOT_FunctionType_type_parameters_offset = 24;
+    AOT_FunctionType_type_parameters_offset = 20;
 static constexpr dart::compiler::target::word
-    AOT_TypeParameter_parameterized_class_id_offset = 56;
+    AOT_TypeParameter_parameterized_class_id_offset = 36;
 static constexpr dart::compiler::target::word AOT_TypeParameter_index_offset =
-    60;
+    40;
 static constexpr dart::compiler::target::word
-    AOT_TypeParameter_nullability_offset = 63;
+    AOT_TypeParameter_nullability_offset = 43;
 static constexpr dart::compiler::target::word
     AOT_TypeArguments_instantiations_offset = 8;
 static constexpr dart::compiler::target::word AOT_TypeArguments_length_offset =
@@ -9264,18 +9264,18 @@
 static constexpr dart::compiler::target::word AOT_TypeArguments_types_offset =
     40;
 static constexpr dart::compiler::target::word AOT_TypeParameter_bound_offset =
-    40;
+    28;
 static constexpr dart::compiler::target::word AOT_TypeParameter_flags_offset =
-    62;
+    42;
 static constexpr dart::compiler::target::word AOT_TypeParameter_name_offset =
-    24;
-static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 24;
+    20;
+static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 20;
 static constexpr dart::compiler::target::word AOT_TypedDataBase_length_offset =
     16;
 static constexpr dart::compiler::target::word AOT_TypedDataView_data_offset =
-    24;
+    20;
 static constexpr dart::compiler::target::word
-    AOT_TypedDataView_offset_in_bytes_offset = 32;
+    AOT_TypedDataView_offset_in_bytes_offset = 24;
 static constexpr dart::compiler::target::word AOT_TypedData_data_offset = 24;
 static constexpr dart::compiler::target::word
     AOT_UnhandledException_exception_offset = 8;
@@ -9344,7 +9344,7 @@
 static constexpr dart::compiler::target::word AOT_Float64x2_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Function_InstanceSize = 64;
 static constexpr dart::compiler::target::word AOT_FunctionType_InstanceSize =
-    72;
+    48;
 static constexpr dart::compiler::target::word AOT_FutureOr_InstanceSize = 16;
 static constexpr dart::compiler::target::word
     AOT_GrowableObjectArray_InstanceSize = 32;
@@ -9362,7 +9362,7 @@
     32;
 static constexpr dart::compiler::target::word AOT_Library_InstanceSize = 96;
 static constexpr dart::compiler::target::word AOT_LibraryPrefix_InstanceSize =
-    40;
+    24;
 static constexpr dart::compiler::target::word AOT_LinkedHashMap_InstanceSize =
     56;
 static constexpr dart::compiler::target::word
@@ -9385,14 +9385,14 @@
 static constexpr dart::compiler::target::word AOT_PatchClass_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_PcDescriptors_HeaderSize = 16;
 static constexpr dart::compiler::target::word AOT_Pointer_InstanceSize = 24;
-static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 40;
-static constexpr dart::compiler::target::word AOT_RegExp_InstanceSize = 120;
+static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 24;
+static constexpr dart::compiler::target::word AOT_RegExp_InstanceSize = 80;
 static constexpr dart::compiler::target::word AOT_Script_InstanceSize = 56;
 static constexpr dart::compiler::target::word AOT_SendPort_InstanceSize = 24;
 static constexpr dart::compiler::target::word
     AOT_SingleTargetCache_InstanceSize = 32;
 static constexpr dart::compiler::target::word AOT_Smi_InstanceSize = 8;
-static constexpr dart::compiler::target::word AOT_StackTrace_InstanceSize = 40;
+static constexpr dart::compiler::target::word AOT_StackTrace_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_String_InstanceSize = 16;
 static constexpr dart::compiler::target::word
     AOT_SubtypeTestCache_InstanceSize = 16;
@@ -9401,17 +9401,17 @@
     AOT_TransferableTypedData_InstanceSize = 8;
 static constexpr dart::compiler::target::word AOT_TwoByteString_InstanceSize =
     16;
-static constexpr dart::compiler::target::word AOT_Type_InstanceSize = 56;
+static constexpr dart::compiler::target::word AOT_Type_InstanceSize = 40;
 static constexpr dart::compiler::target::word AOT_TypeArguments_InstanceSize =
     40;
 static constexpr dart::compiler::target::word AOT_TypeParameter_InstanceSize =
-    64;
-static constexpr dart::compiler::target::word AOT_TypeRef_InstanceSize = 32;
+    48;
+static constexpr dart::compiler::target::word AOT_TypeRef_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_TypedData_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_TypedDataBase_InstanceSize =
     24;
 static constexpr dart::compiler::target::word AOT_TypedDataView_InstanceSize =
-    40;
+    32;
 static constexpr dart::compiler::target::word
     AOT_UnhandledException_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_UnlinkedCall_InstanceSize =
@@ -11604,27 +11604,27 @@
     AOT_TimelineStream_enabled_offset = 16;
 static constexpr dart::compiler::target::word AOT_TwoByteString_data_offset =
     16;
-static constexpr dart::compiler::target::word AOT_Type_arguments_offset = 32;
-static constexpr dart::compiler::target::word AOT_Type_hash_offset = 40;
+static constexpr dart::compiler::target::word AOT_Type_arguments_offset = 24;
+static constexpr dart::compiler::target::word AOT_Type_hash_offset = 28;
 static constexpr dart::compiler::target::word AOT_Type_type_class_id_offset =
-    24;
-static constexpr dart::compiler::target::word AOT_Type_type_state_offset = 48;
-static constexpr dart::compiler::target::word AOT_Type_nullability_offset = 49;
-static constexpr dart::compiler::target::word AOT_FunctionType_hash_offset = 56;
+    20;
+static constexpr dart::compiler::target::word AOT_Type_type_state_offset = 32;
+static constexpr dart::compiler::target::word AOT_Type_nullability_offset = 33;
+static constexpr dart::compiler::target::word AOT_FunctionType_hash_offset = 36;
 static constexpr dart::compiler::target::word
-    AOT_FunctionType_packed_fields_offset = 64;
+    AOT_FunctionType_packed_fields_offset = 40;
 static constexpr dart::compiler::target::word
-    AOT_FunctionType_parameter_types_offset = 40;
+    AOT_FunctionType_parameter_types_offset = 28;
 static constexpr dart::compiler::target::word
-    AOT_FunctionType_parameter_names_offset = 48;
+    AOT_FunctionType_parameter_names_offset = 32;
 static constexpr dart::compiler::target::word
-    AOT_FunctionType_type_parameters_offset = 24;
+    AOT_FunctionType_type_parameters_offset = 20;
 static constexpr dart::compiler::target::word
-    AOT_TypeParameter_parameterized_class_id_offset = 56;
+    AOT_TypeParameter_parameterized_class_id_offset = 36;
 static constexpr dart::compiler::target::word AOT_TypeParameter_index_offset =
-    60;
+    40;
 static constexpr dart::compiler::target::word
-    AOT_TypeParameter_nullability_offset = 63;
+    AOT_TypeParameter_nullability_offset = 43;
 static constexpr dart::compiler::target::word
     AOT_TypeArguments_instantiations_offset = 8;
 static constexpr dart::compiler::target::word AOT_TypeArguments_length_offset =
@@ -11634,18 +11634,18 @@
 static constexpr dart::compiler::target::word AOT_TypeArguments_types_offset =
     40;
 static constexpr dart::compiler::target::word AOT_TypeParameter_bound_offset =
-    40;
+    28;
 static constexpr dart::compiler::target::word AOT_TypeParameter_flags_offset =
-    62;
+    42;
 static constexpr dart::compiler::target::word AOT_TypeParameter_name_offset =
-    24;
-static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 24;
+    20;
+static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 20;
 static constexpr dart::compiler::target::word AOT_TypedDataBase_length_offset =
     16;
 static constexpr dart::compiler::target::word AOT_TypedDataView_data_offset =
-    24;
+    20;
 static constexpr dart::compiler::target::word
-    AOT_TypedDataView_offset_in_bytes_offset = 32;
+    AOT_TypedDataView_offset_in_bytes_offset = 24;
 static constexpr dart::compiler::target::word AOT_TypedData_data_offset = 24;
 static constexpr dart::compiler::target::word
     AOT_UnhandledException_exception_offset = 8;
@@ -11710,7 +11710,7 @@
 static constexpr dart::compiler::target::word AOT_Float64x2_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Function_InstanceSize = 64;
 static constexpr dart::compiler::target::word AOT_FunctionType_InstanceSize =
-    72;
+    48;
 static constexpr dart::compiler::target::word AOT_FutureOr_InstanceSize = 16;
 static constexpr dart::compiler::target::word
     AOT_GrowableObjectArray_InstanceSize = 32;
@@ -11728,7 +11728,7 @@
     32;
 static constexpr dart::compiler::target::word AOT_Library_InstanceSize = 96;
 static constexpr dart::compiler::target::word AOT_LibraryPrefix_InstanceSize =
-    40;
+    24;
 static constexpr dart::compiler::target::word AOT_LinkedHashMap_InstanceSize =
     56;
 static constexpr dart::compiler::target::word
@@ -11751,14 +11751,14 @@
 static constexpr dart::compiler::target::word AOT_PatchClass_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_PcDescriptors_HeaderSize = 16;
 static constexpr dart::compiler::target::word AOT_Pointer_InstanceSize = 24;
-static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 24;
-static constexpr dart::compiler::target::word AOT_RegExp_InstanceSize = 120;
+static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 16;
+static constexpr dart::compiler::target::word AOT_RegExp_InstanceSize = 80;
 static constexpr dart::compiler::target::word AOT_Script_InstanceSize = 56;
 static constexpr dart::compiler::target::word AOT_SendPort_InstanceSize = 24;
 static constexpr dart::compiler::target::word
     AOT_SingleTargetCache_InstanceSize = 32;
 static constexpr dart::compiler::target::word AOT_Smi_InstanceSize = 8;
-static constexpr dart::compiler::target::word AOT_StackTrace_InstanceSize = 40;
+static constexpr dart::compiler::target::word AOT_StackTrace_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_String_InstanceSize = 16;
 static constexpr dart::compiler::target::word
     AOT_SubtypeTestCache_InstanceSize = 16;
@@ -11767,17 +11767,17 @@
     AOT_TransferableTypedData_InstanceSize = 8;
 static constexpr dart::compiler::target::word AOT_TwoByteString_InstanceSize =
     16;
-static constexpr dart::compiler::target::word AOT_Type_InstanceSize = 56;
+static constexpr dart::compiler::target::word AOT_Type_InstanceSize = 40;
 static constexpr dart::compiler::target::word AOT_TypeArguments_InstanceSize =
     40;
 static constexpr dart::compiler::target::word AOT_TypeParameter_InstanceSize =
-    64;
-static constexpr dart::compiler::target::word AOT_TypeRef_InstanceSize = 32;
+    48;
+static constexpr dart::compiler::target::word AOT_TypeRef_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_TypedData_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_TypedDataBase_InstanceSize =
     24;
 static constexpr dart::compiler::target::word AOT_TypedDataView_InstanceSize =
-    40;
+    32;
 static constexpr dart::compiler::target::word
     AOT_UnhandledException_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_UnlinkedCall_InstanceSize =
@@ -12195,27 +12195,27 @@
     AOT_TimelineStream_enabled_offset = 16;
 static constexpr dart::compiler::target::word AOT_TwoByteString_data_offset =
     16;
-static constexpr dart::compiler::target::word AOT_Type_arguments_offset = 32;
-static constexpr dart::compiler::target::word AOT_Type_hash_offset = 40;
+static constexpr dart::compiler::target::word AOT_Type_arguments_offset = 24;
+static constexpr dart::compiler::target::word AOT_Type_hash_offset = 28;
 static constexpr dart::compiler::target::word AOT_Type_type_class_id_offset =
-    24;
-static constexpr dart::compiler::target::word AOT_Type_type_state_offset = 48;
-static constexpr dart::compiler::target::word AOT_Type_nullability_offset = 49;
-static constexpr dart::compiler::target::word AOT_FunctionType_hash_offset = 56;
+    20;
+static constexpr dart::compiler::target::word AOT_Type_type_state_offset = 32;
+static constexpr dart::compiler::target::word AOT_Type_nullability_offset = 33;
+static constexpr dart::compiler::target::word AOT_FunctionType_hash_offset = 36;
 static constexpr dart::compiler::target::word
-    AOT_FunctionType_packed_fields_offset = 64;
+    AOT_FunctionType_packed_fields_offset = 40;
 static constexpr dart::compiler::target::word
-    AOT_FunctionType_parameter_types_offset = 40;
+    AOT_FunctionType_parameter_types_offset = 28;
 static constexpr dart::compiler::target::word
-    AOT_FunctionType_parameter_names_offset = 48;
+    AOT_FunctionType_parameter_names_offset = 32;
 static constexpr dart::compiler::target::word
-    AOT_FunctionType_type_parameters_offset = 24;
+    AOT_FunctionType_type_parameters_offset = 20;
 static constexpr dart::compiler::target::word
-    AOT_TypeParameter_parameterized_class_id_offset = 56;
+    AOT_TypeParameter_parameterized_class_id_offset = 36;
 static constexpr dart::compiler::target::word AOT_TypeParameter_index_offset =
-    60;
+    40;
 static constexpr dart::compiler::target::word
-    AOT_TypeParameter_nullability_offset = 63;
+    AOT_TypeParameter_nullability_offset = 43;
 static constexpr dart::compiler::target::word
     AOT_TypeArguments_instantiations_offset = 8;
 static constexpr dart::compiler::target::word AOT_TypeArguments_length_offset =
@@ -12225,18 +12225,18 @@
 static constexpr dart::compiler::target::word AOT_TypeArguments_types_offset =
     40;
 static constexpr dart::compiler::target::word AOT_TypeParameter_bound_offset =
-    40;
+    28;
 static constexpr dart::compiler::target::word AOT_TypeParameter_flags_offset =
-    62;
+    42;
 static constexpr dart::compiler::target::word AOT_TypeParameter_name_offset =
-    24;
-static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 24;
+    20;
+static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 20;
 static constexpr dart::compiler::target::word AOT_TypedDataBase_length_offset =
     16;
 static constexpr dart::compiler::target::word AOT_TypedDataView_data_offset =
-    24;
+    20;
 static constexpr dart::compiler::target::word
-    AOT_TypedDataView_offset_in_bytes_offset = 32;
+    AOT_TypedDataView_offset_in_bytes_offset = 24;
 static constexpr dart::compiler::target::word AOT_TypedData_data_offset = 24;
 static constexpr dart::compiler::target::word
     AOT_UnhandledException_exception_offset = 8;
@@ -12302,7 +12302,7 @@
 static constexpr dart::compiler::target::word AOT_Float64x2_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Function_InstanceSize = 64;
 static constexpr dart::compiler::target::word AOT_FunctionType_InstanceSize =
-    72;
+    48;
 static constexpr dart::compiler::target::word AOT_FutureOr_InstanceSize = 16;
 static constexpr dart::compiler::target::word
     AOT_GrowableObjectArray_InstanceSize = 32;
@@ -12320,7 +12320,7 @@
     32;
 static constexpr dart::compiler::target::word AOT_Library_InstanceSize = 96;
 static constexpr dart::compiler::target::word AOT_LibraryPrefix_InstanceSize =
-    40;
+    24;
 static constexpr dart::compiler::target::word AOT_LinkedHashMap_InstanceSize =
     56;
 static constexpr dart::compiler::target::word
@@ -12343,14 +12343,14 @@
 static constexpr dart::compiler::target::word AOT_PatchClass_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_PcDescriptors_HeaderSize = 16;
 static constexpr dart::compiler::target::word AOT_Pointer_InstanceSize = 24;
-static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 24;
-static constexpr dart::compiler::target::word AOT_RegExp_InstanceSize = 120;
+static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 16;
+static constexpr dart::compiler::target::word AOT_RegExp_InstanceSize = 80;
 static constexpr dart::compiler::target::word AOT_Script_InstanceSize = 56;
 static constexpr dart::compiler::target::word AOT_SendPort_InstanceSize = 24;
 static constexpr dart::compiler::target::word
     AOT_SingleTargetCache_InstanceSize = 32;
 static constexpr dart::compiler::target::word AOT_Smi_InstanceSize = 8;
-static constexpr dart::compiler::target::word AOT_StackTrace_InstanceSize = 40;
+static constexpr dart::compiler::target::word AOT_StackTrace_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_String_InstanceSize = 16;
 static constexpr dart::compiler::target::word
     AOT_SubtypeTestCache_InstanceSize = 16;
@@ -12359,17 +12359,17 @@
     AOT_TransferableTypedData_InstanceSize = 8;
 static constexpr dart::compiler::target::word AOT_TwoByteString_InstanceSize =
     16;
-static constexpr dart::compiler::target::word AOT_Type_InstanceSize = 56;
+static constexpr dart::compiler::target::word AOT_Type_InstanceSize = 40;
 static constexpr dart::compiler::target::word AOT_TypeArguments_InstanceSize =
     40;
 static constexpr dart::compiler::target::word AOT_TypeParameter_InstanceSize =
-    64;
-static constexpr dart::compiler::target::word AOT_TypeRef_InstanceSize = 32;
+    48;
+static constexpr dart::compiler::target::word AOT_TypeRef_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_TypedData_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_TypedDataBase_InstanceSize =
     24;
 static constexpr dart::compiler::target::word AOT_TypedDataView_InstanceSize =
-    40;
+    32;
 static constexpr dart::compiler::target::word
     AOT_UnhandledException_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_UnlinkedCall_InstanceSize =
diff --git a/runtime/vm/compiler/stub_code_compiler.cc b/runtime/vm/compiler/stub_code_compiler.cc
index b41e1f9..bbcdc8c 100644
--- a/runtime/vm/compiler/stub_code_compiler.cc
+++ b/runtime/vm/compiler/stub_code_compiler.cc
@@ -321,7 +321,7 @@
   // instantiation may result in a top type.
   // Function types cannot be top types.
   __ BranchIf(NOT_EQUAL, &done);
-  __ LoadField(
+  __ LoadCompressedField(
       scratch2_reg,
       compiler::FieldAddress(scratch1_reg,
                              compiler::target::Type::type_class_id_offset()));
@@ -351,9 +351,10 @@
   __ Ret();
   // An uncommon case, so off the main trunk of the function.
   __ Bind(&unwrap_future_or);
-  __ LoadField(scratch2_reg,
-               compiler::FieldAddress(
-                   scratch1_reg, compiler::target::Type::arguments_offset()));
+  __ LoadCompressedField(
+      scratch2_reg,
+      compiler::FieldAddress(scratch1_reg,
+                             compiler::target::Type::arguments_offset()));
   __ CompareObject(scratch2_reg, Object::null_object());
   // If the arguments are null, then unwrapping gives dynamic, a top type.
   __ BranchIf(EQUAL, &is_top_type, compiler::Assembler::kNearJump);
@@ -441,16 +442,17 @@
     // FutureOr is a special case because it may have the non-nullable bit set,
     // but FutureOr<T> functions as the union of T and Future<T>, so it must be
     // unwrapped to see if T is nullable.
-    __ LoadField(
+    __ LoadCompressedField(
         kScratchReg,
         compiler::FieldAddress(kCurrentTypeReg,
                                compiler::target::Type::type_class_id_offset()));
     __ SmiUntag(kScratchReg);
     __ CompareImmediate(kScratchReg, kFutureOrCid);
     __ BranchIf(NOT_EQUAL, &done);
-    __ LoadField(kScratchReg, compiler::FieldAddress(
-                                  kCurrentTypeReg,
-                                  compiler::target::Type::arguments_offset()));
+    __ LoadCompressedField(
+        kScratchReg,
+        compiler::FieldAddress(kCurrentTypeReg,
+                               compiler::target::Type::arguments_offset()));
     __ CompareObject(kScratchReg, Object::null_object());
     // If the arguments are null, then unwrapping gives the dynamic type,
     // which can take null.
diff --git a/runtime/vm/compiler/stub_code_compiler_arm64.cc b/runtime/vm/compiler/stub_code_compiler_arm64.cc
index e6f79d9..bc5eb6a 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm64.cc
@@ -3638,7 +3638,7 @@
     /* R0: new object start as a tagged pointer. */
     /* R1: new object end address. */
     __ mov(R2, AllocateTypedDataArrayABI::kLengthReg); /* Array length. */
-    __ StoreIntoObjectNoBarrier(
+    __ StoreCompressedIntoObjectNoBarrier(
         R0, FieldAddress(R0, target::TypedDataBase::length_offset()), R2);
     /* Initialize all array elements to 0. */
     /* R0: new object start as a tagged pointer. */
diff --git a/runtime/vm/compiler/stub_code_compiler_x64.cc b/runtime/vm/compiler/stub_code_compiler_x64.cc
index a6425ad..8d2987a 100644
--- a/runtime/vm/compiler/stub_code_compiler_x64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_x64.cc
@@ -2380,7 +2380,7 @@
     // because we only emit calls to this stub when it is not null.
     __ movq(RCX,
             FieldAddress(RBX, target::ICData::receivers_static_type_offset()));
-    __ movq(RCX, FieldAddress(RCX, target::Type::arguments_offset()));
+    __ LoadCompressed(RCX, FieldAddress(RCX, target::Type::arguments_offset()));
     // RAX contains an offset to type arguments in words as a smi,
     // hence TIMES_4. RDX is guaranteed to be non-smi because it is expected
     // to have type arguments.
@@ -3593,7 +3593,7 @@
     /* RAX: new object start as a tagged pointer. */
     /* RCX: new object end address. */
     __ popq(RDI); /* Array length. */
-    __ StoreIntoObjectNoBarrier(
+    __ StoreCompressedIntoObjectNoBarrier(
         RAX, FieldAddress(RAX, target::TypedDataBase::length_offset()), RDI);
     /* Initialize all array elements to 0. */
     /* RAX: new object start as a tagged pointer. */
diff --git a/runtime/vm/heap/compactor.cc b/runtime/vm/heap/compactor.cc
index 7006f3e..462a9d2 100644
--- a/runtime/vm/heap/compactor.cc
+++ b/runtime/vm/heap/compactor.cc
@@ -275,7 +275,7 @@
     for (intptr_t i = 0; i < length; ++i) {
       auto raw_view = typed_data_views_[i];
       const classid_t cid =
-          raw_view->untag()->typed_data_->GetClassIdMayBeSmi();
+          raw_view->untag()->typed_data()->GetClassIdMayBeSmi();
 
       // If we have external typed data we can simply return, since the backing
       // store lives in C-heap and will not move. Otherwise we have to update
@@ -668,12 +668,12 @@
 }
 
 void GCCompactor::VisitTypedDataViewPointers(TypedDataViewPtr view,
-                                             ObjectPtr* first,
-                                             ObjectPtr* last) {
+                                             CompressedObjectPtr* first,
+                                             CompressedObjectPtr* last) {
   // First we forward all fields of the typed data view.
-  ObjectPtr old_backing = view->untag()->typed_data_;
-  VisitPointers(first, last);
-  ObjectPtr new_backing = view->untag()->typed_data_;
+  ObjectPtr old_backing = view->untag()->typed_data();
+  VisitCompressedPointers(view->heap_base(), first, last);
+  ObjectPtr new_backing = view->untag()->typed_data();
 
   const bool backing_moved = old_backing != new_backing;
   if (backing_moved) {
@@ -694,9 +694,9 @@
     // The backing store didn't move, we therefore don't need to update the
     // inner pointer.
     if (view->untag()->data_ == 0) {
-      ASSERT(RawSmiValue(view->untag()->offset_in_bytes_) == 0 &&
-             RawSmiValue(view->untag()->length_) == 0 &&
-             view->untag()->typed_data_ == Object::null());
+      ASSERT(RawSmiValue(view->untag()->offset_in_bytes()) == 0 &&
+             RawSmiValue(view->untag()->length()) == 0 &&
+             view->untag()->typed_data() == Object::null());
     }
   }
 }
diff --git a/runtime/vm/heap/compactor.h b/runtime/vm/heap/compactor.h
index 9dfa96d..164c214 100644
--- a/runtime/vm/heap/compactor.h
+++ b/runtime/vm/heap/compactor.h
@@ -40,8 +40,8 @@
   void ForwardPointer(ObjectPtr* ptr);
   void ForwardCompressedPointer(uword heap_base, CompressedObjectPtr* ptr);
   void VisitTypedDataViewPointers(TypedDataViewPtr view,
-                                  ObjectPtr* first,
-                                  ObjectPtr* last);
+                                  CompressedObjectPtr* first,
+                                  CompressedObjectPtr* last);
   void VisitPointers(ObjectPtr* first, ObjectPtr* last);
   void VisitCompressedPointers(uword heap_base,
                                CompressedObjectPtr* first,
diff --git a/runtime/vm/heap/scavenger.cc b/runtime/vm/heap/scavenger.cc
index 6f0b4c3..bdc785c 100644
--- a/runtime/vm/heap/scavenger.cc
+++ b/runtime/vm/heap/scavenger.cc
@@ -122,8 +122,8 @@
         delayed_weak_properties_(WeakProperty::null()) {}
 
   virtual void VisitTypedDataViewPointers(TypedDataViewPtr view,
-                                          ObjectPtr* first,
-                                          ObjectPtr* last) {
+                                          CompressedObjectPtr* first,
+                                          CompressedObjectPtr* last) {
     // TypedDataViews require extra processing to update their
     // PointerBase::data_ pointer. If the underlying typed data is external, no
     // update is needed. If the underlying typed data is internal, the pointer
@@ -140,11 +140,11 @@
         view->untag()->data_ != view->untag()->DataFieldForInternalTypedData();
 
     // Forward all fields of the typed data view.
-    VisitPointers(first, last);
+    VisitCompressedPointers(view->heap_base(), first, last);
 
     if (view->untag()->data_ == nullptr) {
-      ASSERT(RawSmiValue(view->untag()->offset_in_bytes_) == 0 &&
-             RawSmiValue(view->untag()->length_) == 0);
+      ASSERT(RawSmiValue(view->untag()->offset_in_bytes()) == 0 &&
+             RawSmiValue(view->untag()->length()) == 0);
       ASSERT(is_external);
       return;
     }
@@ -156,7 +156,7 @@
     ASSERT(IsTypedDataViewClassId(view->GetClassIdMayBeSmi()));
 
     // Validate that the backing store is not a forwarding word.
-    TypedDataBasePtr td = view->untag()->typed_data_;
+    TypedDataBasePtr td = view->untag()->typed_data();
     ASSERT(td->IsHeapObject());
     const uword td_header =
         *reinterpret_cast<uword*>(UntaggedObject::ToAddr(td));
diff --git a/runtime/vm/image_snapshot.cc b/runtime/vm/image_snapshot.cc
index 25ace1d..f20022e 100644
--- a/runtime/vm/image_snapshot.cc
+++ b/runtime/vm/image_snapshot.cc
@@ -535,9 +535,9 @@
       RELEASE_ASSERT(String::GetCachedHash(str.ptr()) != 0);
       RELEASE_ASSERT(str.IsOneByteString() || str.IsTwoByteString());
 
-      stream->WriteTargetWord(static_cast<uword>(str.ptr()->untag()->length_));
+      stream->WriteTargetWord(static_cast<uword>(str.ptr()->untag()->length()));
 #if !defined(HASH_IN_OBJECT_HEADER)
-      stream->WriteTargetWord(static_cast<uword>(str.ptr()->untag()->hash_));
+      stream->WriteTargetWord(static_cast<uword>(str.ptr()->untag()->hash()));
 #endif
       ASSERT_EQUAL(stream->Position() - object_start,
                    compiler::target::String::InstanceSize());
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 9cf9ba7..6eff1b4 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -9994,7 +9994,7 @@
 FunctionTypePtr FunctionType::New(Heap::Space space) {
   ObjectPtr raw =
       Object::Allocate(FunctionType::kClassId, FunctionType::InstanceSize(),
-                       space, /*compressed*/ false);
+                       space, /*compressed*/ true);
   return static_cast<FunctionTypePtr>(raw);
 }
 
@@ -20616,7 +20616,7 @@
 
 TypePtr Type::New(Heap::Space space) {
   ObjectPtr raw = Object::Allocate(Type::kClassId, Type::InstanceSize(), space,
-                                   /*compressed*/ false);
+                                   /*compressed*/ true);
   return static_cast<TypePtr>(raw);
 }
 
@@ -21011,7 +21011,7 @@
 
 TypeRefPtr TypeRef::New() {
   ObjectPtr raw = Object::Allocate(TypeRef::kClassId, TypeRef::InstanceSize(),
-                                   Heap::kOld, /*compressed*/ false);
+                                   Heap::kOld, /*compressed*/ true);
   return static_cast<TypeRefPtr>(raw);
 }
 
@@ -21518,7 +21518,7 @@
 TypeParameterPtr TypeParameter::New() {
   ObjectPtr raw =
       Object::Allocate(TypeParameter::kClassId, TypeParameter::InstanceSize(),
-                       Heap::kOld, /*compressed*/ false);
+                       Heap::kOld, /*compressed*/ true);
   return static_cast<TypeParameterPtr>(raw);
 }
 
@@ -23190,7 +23190,7 @@
   {
     ObjectPtr raw = Object::Allocate(OneByteString::kClassId,
                                      OneByteString::InstanceSize(len), space,
-                                     /*compressed*/ false);
+                                     /*compressed*/ true);
     NoSafepointScope no_safepoint;
     OneByteStringPtr result = static_cast<OneByteStringPtr>(raw);
     result->untag()->set_length(Smi::New(len));
@@ -23398,7 +23398,7 @@
   {
     ObjectPtr raw = Object::Allocate(TwoByteString::kClassId,
                                      TwoByteString::InstanceSize(len), space,
-                                     /*compressed*/ false);
+                                     /*compressed*/ true);
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.SetLength(len);
@@ -23555,7 +23555,7 @@
   {
     ObjectPtr raw = Object::Allocate(ExternalOneByteString::kClassId,
                                      ExternalOneByteString::InstanceSize(),
-                                     space, /*compressed*/ false);
+                                     space, /*compressed*/ true);
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.SetLength(len);
@@ -23585,7 +23585,7 @@
   {
     ObjectPtr raw = Object::Allocate(ExternalTwoByteString::kClassId,
                                      ExternalTwoByteString::InstanceSize(),
-                                     space, /*compressed*/ false);
+                                     space, /*compressed*/ true);
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.SetLength(len);
@@ -24306,7 +24306,7 @@
     const intptr_t length_in_bytes = len * ElementSizeInBytes(class_id);
     ObjectPtr raw =
         Object::Allocate(class_id, TypedData::InstanceSize(length_in_bytes),
-                         space, /*compressed*/ false);
+                         space, /*compressed*/ true);
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.SetLength(len);
@@ -24353,7 +24353,7 @@
   {
     ObjectPtr raw =
         Object::Allocate(class_id, ExternalTypedData::InstanceSize(), space,
-                         /*compressed*/ false);
+                         /*compressed*/ true);
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.SetLength(len);
@@ -24375,7 +24375,7 @@
   auto& result = TypedDataView::Handle();
   {
     ObjectPtr raw = Object::Allocate(class_id, TypedDataView::InstanceSize(),
-                                     space, /*compressed*/ false);
+                                     space, /*compressed*/ true);
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.Clear();
@@ -24497,7 +24497,7 @@
   {
     ObjectPtr raw =
         Object::Allocate(ReceivePort::kClassId, ReceivePort::InstanceSize(),
-                         space, /*compressed*/ false);
+                         space, /*compressed*/ true);
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.untag()->set_send_port(send_port.ptr());
@@ -24802,7 +24802,7 @@
   {
     ObjectPtr raw =
         Object::Allocate(StackTrace::kClassId, StackTrace::InstanceSize(),
-                         space, /*compressed*/ false);
+                         space, /*compressed*/ true);
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -24822,7 +24822,7 @@
   {
     ObjectPtr raw =
         Object::Allocate(StackTrace::kClassId, StackTrace::InstanceSize(),
-                         space, /*compressed*/ false);
+                         space, /*compressed*/ true);
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -25128,7 +25128,29 @@
 void RegExp::set_function(intptr_t cid,
                           bool sticky,
                           const Function& value) const {
-  StorePointer(FunctionAddr(cid, sticky), value.ptr());
+  if (sticky) {
+    switch (cid) {
+      case kOneByteStringCid:
+        return untag()->set_one_byte_sticky(value.ptr());
+      case kTwoByteStringCid:
+        return untag()->set_two_byte_sticky(value.ptr());
+      case kExternalOneByteStringCid:
+        return untag()->set_external_one_byte_sticky(value.ptr());
+      case kExternalTwoByteStringCid:
+        return untag()->set_external_two_byte_sticky(value.ptr());
+    }
+  } else {
+    switch (cid) {
+      case kOneByteStringCid:
+        return untag()->set_one_byte(value.ptr());
+      case kTwoByteStringCid:
+        return untag()->set_two_byte(value.ptr());
+      case kExternalOneByteStringCid:
+        return untag()->set_external_one_byte(value.ptr());
+      case kExternalTwoByteStringCid:
+        return untag()->set_external_two_byte(value.ptr());
+    }
+  }
 }
 
 void RegExp::set_bytecode(bool is_one_byte,
@@ -25149,16 +25171,8 @@
   }
 }
 
-void RegExp::set_num_bracket_expressions(SmiPtr value) const {
-  untag()->set_num_bracket_expressions(value);
-}
-
-void RegExp::set_num_bracket_expressions(const Smi& value) const {
-  untag()->set_num_bracket_expressions(value.ptr());
-}
-
 void RegExp::set_num_bracket_expressions(intptr_t value) const {
-  untag()->set_num_bracket_expressions(Smi::New(value));
+  untag()->num_bracket_expressions_ = value;
 }
 
 void RegExp::set_capture_name_map(const Array& array) const {
@@ -25169,11 +25183,12 @@
   RegExp& result = RegExp::Handle();
   {
     ObjectPtr raw = Object::Allocate(RegExp::kClassId, RegExp::InstanceSize(),
-                                     space, /*compressed*/ false);
+                                     space, /*compressed*/ true);
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.set_type(kUninitialized);
     result.set_flags(RegExpFlags());
+    result.set_num_bracket_expressions(-1);
     result.set_num_registers(/*is_one_byte=*/false, -1);
     result.set_num_registers(/*is_one_byte=*/true, -1);
   }
@@ -25299,7 +25314,7 @@
   {
     ObjectPtr raw = Object::Allocate(MirrorReference::kClassId,
                                      MirrorReference::InstanceSize(), space,
-                                     /*compressed*/ false);
+                                     /*compressed*/ true);
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -25337,7 +25352,7 @@
   // No tag with label exists, create and register with isolate tag table.
   {
     ObjectPtr raw = Object::Allocate(UserTag::kClassId, UserTag::InstanceSize(),
-                                     space, /*compressed*/ false);
+                                     space, /*compressed*/ true);
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 6848241..4f4fb6c 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -10982,18 +10982,18 @@
   }
 
   StringPtr pattern() const { return untag()->pattern(); }
-  SmiPtr num_bracket_expressions() const {
-    return untag()->num_bracket_expressions();
+  intptr_t num_bracket_expressions() const {
+    return untag()->num_bracket_expressions_;
   }
   ArrayPtr capture_name_map() const { return untag()->capture_name_map(); }
 
   TypedDataPtr bytecode(bool is_one_byte, bool sticky) const {
     if (sticky) {
-      return TypedData::RawCast(is_one_byte ? untag()->one_byte_sticky_
-                                            : untag()->two_byte_sticky_);
+      return TypedData::RawCast(is_one_byte ? untag()->one_byte_sticky()
+                                            : untag()->two_byte_sticky());
     } else {
-      return TypedData::RawCast(is_one_byte ? untag()->one_byte_
-                                            : untag()->two_byte_);
+      return TypedData::RawCast(is_one_byte ? untag()->one_byte()
+                                            : untag()->two_byte());
     }
   }
 
@@ -11026,13 +11026,33 @@
     return -1;
   }
 
-  FunctionPtr* FunctionAddr(intptr_t cid, bool sticky) const {
-    return reinterpret_cast<FunctionPtr*>(
-        FieldAddrAtOffset(function_offset(cid, sticky)));
-  }
-
   FunctionPtr function(intptr_t cid, bool sticky) const {
-    return *FunctionAddr(cid, sticky);
+    if (sticky) {
+      switch (cid) {
+        case kOneByteStringCid:
+          return static_cast<FunctionPtr>(untag()->one_byte_sticky());
+        case kTwoByteStringCid:
+          return static_cast<FunctionPtr>(untag()->two_byte_sticky());
+        case kExternalOneByteStringCid:
+          return static_cast<FunctionPtr>(untag()->external_one_byte_sticky());
+        case kExternalTwoByteStringCid:
+          return static_cast<FunctionPtr>(untag()->external_two_byte_sticky());
+      }
+    } else {
+      switch (cid) {
+        case kOneByteStringCid:
+          return static_cast<FunctionPtr>(untag()->one_byte());
+        case kTwoByteStringCid:
+          return static_cast<FunctionPtr>(untag()->two_byte());
+        case kExternalOneByteStringCid:
+          return static_cast<FunctionPtr>(untag()->external_one_byte());
+        case kExternalTwoByteStringCid:
+          return static_cast<FunctionPtr>(untag()->external_two_byte());
+      }
+    }
+
+    UNREACHABLE();
+    return Function::null();
   }
 
   void set_pattern(const String& pattern) const;
@@ -11426,7 +11446,7 @@
 
 inline intptr_t FunctionType::Hash() const {
   ASSERT(IsFinalized());
-  intptr_t result = Smi::Value(untag()->hash_);
+  intptr_t result = Smi::Value(untag()->hash());
   if (result != 0) {
     return result;
   }
diff --git a/runtime/vm/object_graph.cc b/runtime/vm/object_graph.cc
index 4963b07..c9b0bf3 100644
--- a/runtime/vm/object_graph.cc
+++ b/runtime/vm/object_graph.cc
@@ -905,7 +905,7 @@
                           sizeof(double));
     } else if (cid == kOneByteStringCid) {
       OneByteStringPtr str = static_cast<OneByteStringPtr>(obj);
-      intptr_t len = Smi::Value(str->untag()->length_);
+      intptr_t len = Smi::Value(str->untag()->length());
       intptr_t trunc_len = Utils::Minimum(len, kMaxStringElements);
       writer_->WriteUnsigned(kLatin1Data);
       writer_->WriteUnsigned(len);
@@ -913,7 +913,7 @@
       writer_->WriteBytes(&str->untag()->data()[0], trunc_len);
     } else if (cid == kExternalOneByteStringCid) {
       ExternalOneByteStringPtr str = static_cast<ExternalOneByteStringPtr>(obj);
-      intptr_t len = Smi::Value(str->untag()->length_);
+      intptr_t len = Smi::Value(str->untag()->length());
       intptr_t trunc_len = Utils::Minimum(len, kMaxStringElements);
       writer_->WriteUnsigned(kLatin1Data);
       writer_->WriteUnsigned(len);
@@ -921,7 +921,7 @@
       writer_->WriteBytes(&str->untag()->external_data_[0], trunc_len);
     } else if (cid == kTwoByteStringCid) {
       TwoByteStringPtr str = static_cast<TwoByteStringPtr>(obj);
-      intptr_t len = Smi::Value(str->untag()->length_);
+      intptr_t len = Smi::Value(str->untag()->length());
       intptr_t trunc_len = Utils::Minimum(len, kMaxStringElements);
       writer_->WriteUnsigned(kUTF16Data);
       writer_->WriteUnsigned(len);
@@ -929,7 +929,7 @@
       writer_->WriteBytes(&str->untag()->data()[0], trunc_len * 2);
     } else if (cid == kExternalTwoByteStringCid) {
       ExternalTwoByteStringPtr str = static_cast<ExternalTwoByteStringPtr>(obj);
-      intptr_t len = Smi::Value(str->untag()->length_);
+      intptr_t len = Smi::Value(str->untag()->length());
       intptr_t trunc_len = Utils::Minimum(len, kMaxStringElements);
       writer_->WriteUnsigned(kUTF16Data);
       writer_->WriteUnsigned(len);
@@ -953,11 +953,11 @@
     } else if (IsTypedDataClassId(cid)) {
       writer_->WriteUnsigned(kLengthData);
       writer_->WriteUnsigned(
-          Smi::Value(static_cast<TypedDataPtr>(obj)->untag()->length_));
+          Smi::Value(static_cast<TypedDataPtr>(obj)->untag()->length()));
     } else if (IsExternalTypedDataClassId(cid)) {
       writer_->WriteUnsigned(kLengthData);
-      writer_->WriteUnsigned(
-          Smi::Value(static_cast<ExternalTypedDataPtr>(obj)->untag()->length_));
+      writer_->WriteUnsigned(Smi::Value(
+          static_cast<ExternalTypedDataPtr>(obj)->untag()->length()));
     } else if (cid == kFunctionCid) {
       writer_->WriteUnsigned(kNameData);
       ScrubAndWriteUtf8(static_cast<FunctionPtr>(obj)->untag()->name());
diff --git a/runtime/vm/raw_object.cc b/runtime/vm/raw_object.cc
index 18db2fd..7fb0ce7 100644
--- a/runtime/vm/raw_object.cc
+++ b/runtime/vm/raw_object.cc
@@ -131,14 +131,14 @@
     case kOneByteStringCid: {
       const OneByteStringPtr raw_string =
           static_cast<const OneByteStringPtr>(this);
-      intptr_t string_length = Smi::Value(raw_string->untag()->length_);
+      intptr_t string_length = Smi::Value(raw_string->untag()->length());
       instance_size = OneByteString::InstanceSize(string_length);
       break;
     }
     case kTwoByteStringCid: {
       const TwoByteStringPtr raw_string =
           static_cast<const TwoByteStringPtr>(this);
-      intptr_t string_length = Smi::Value(raw_string->untag()->length_);
+      intptr_t string_length = Smi::Value(raw_string->untag()->length());
       instance_size = TwoByteString::InstanceSize(string_length);
       break;
     }
@@ -160,7 +160,7 @@
 #define SIZE_FROM_CLASS(clazz) case kTypedData##clazz##Cid:
       CLASS_LIST_TYPED_DATA(SIZE_FROM_CLASS) {
         const TypedDataPtr raw_obj = static_cast<const TypedDataPtr>(this);
-        intptr_t array_len = Smi::Value(raw_obj->untag()->length_);
+        intptr_t array_len = Smi::Value(raw_obj->untag()->length());
         intptr_t lengthInBytes =
             array_len * TypedData::ElementSizeInBytes(class_id);
         instance_size = TypedData::InstanceSize(lengthInBytes);
@@ -460,7 +460,7 @@
       Type##Ptr raw_obj, ObjectPointerVisitor* visitor) {                      \
     /* Make sure that we got here with the tagged pointer as this. */          \
     ASSERT(raw_obj->IsHeapObject());                                           \
-    ASSERT_UNCOMPRESSED(Type);                                                 \
+    ASSERT_COMPRESSED(Type);                                                   \
     visitor->VisitTypedDataViewPointers(raw_obj, raw_obj->untag()->from(),     \
                                         raw_obj->untag()->to());               \
     return Type::InstanceSize();                                               \
@@ -535,13 +535,13 @@
 COMPRESSED_VISITOR(Namespace)
 COMPRESSED_VISITOR(KernelProgramInfo)
 COMPRESSED_VISITOR(WeakSerializationReference)
-REGULAR_VISITOR(Type)
-REGULAR_VISITOR(FunctionType)
-REGULAR_VISITOR(TypeRef)
-REGULAR_VISITOR(TypeParameter)
+COMPRESSED_VISITOR(Type)
+COMPRESSED_VISITOR(FunctionType)
+COMPRESSED_VISITOR(TypeRef)
+COMPRESSED_VISITOR(TypeParameter)
 COMPRESSED_VISITOR(Function)
 REGULAR_VISITOR(Closure)
-REGULAR_VISITOR(LibraryPrefix)
+COMPRESSED_VISITOR(LibraryPrefix)
 REGULAR_VISITOR(SingleTargetCache)
 REGULAR_VISITOR(UnlinkedCall)
 REGULAR_VISITOR(MonomorphicSmiableCall)
@@ -551,18 +551,18 @@
 COMPRESSED_VISITOR(LanguageError)
 COMPRESSED_VISITOR(UnhandledException)
 COMPRESSED_VISITOR(UnwindError)
-REGULAR_VISITOR(ExternalOneByteString)
-REGULAR_VISITOR(ExternalTwoByteString)
+COMPRESSED_VISITOR(ExternalOneByteString)
+COMPRESSED_VISITOR(ExternalTwoByteString)
 REGULAR_VISITOR(GrowableObjectArray)
 REGULAR_VISITOR(LinkedHashMap)
-REGULAR_VISITOR(ExternalTypedData)
+COMPRESSED_VISITOR(ExternalTypedData)
 TYPED_DATA_VIEW_VISITOR(TypedDataView)
-REGULAR_VISITOR(ReceivePort)
-REGULAR_VISITOR(StackTrace)
-REGULAR_VISITOR(RegExp)
+COMPRESSED_VISITOR(ReceivePort)
+COMPRESSED_VISITOR(StackTrace)
+COMPRESSED_VISITOR(RegExp)
 REGULAR_VISITOR(WeakProperty)
-REGULAR_VISITOR(MirrorReference)
-REGULAR_VISITOR(UserTag)
+COMPRESSED_VISITOR(MirrorReference)
+COMPRESSED_VISITOR(UserTag)
 REGULAR_VISITOR(SubtypeTestCache)
 COMPRESSED_VISITOR(LoadingUnit)
 VARIABLE_VISITOR(TypeArguments, Smi::Value(raw_obj->untag()->length_))
@@ -570,9 +570,10 @@
 VARIABLE_COMPRESSED_VISITOR(ExceptionHandlers, raw_obj->untag()->num_entries_)
 VARIABLE_VISITOR(Context, raw_obj->untag()->num_variables_)
 VARIABLE_VISITOR(Array, Smi::Value(raw_obj->untag()->length()))
-VARIABLE_VISITOR(TypedData,
-                 TypedData::ElementSizeInBytes(raw_obj->GetClassId()) *
-                     Smi::Value(raw_obj->untag()->length_))
+VARIABLE_COMPRESSED_VISITOR(
+    TypedData,
+    TypedData::ElementSizeInBytes(raw_obj->GetClassId()) *
+        Smi::Value(raw_obj->untag()->length()))
 VARIABLE_COMPRESSED_VISITOR(ContextScope, raw_obj->untag()->num_variables_)
 NULL_VISITOR(Mint)
 NULL_VISITOR(Double)
@@ -583,7 +584,7 @@
 NULL_VISITOR(Capability)
 NULL_VISITOR(SendPort)
 NULL_VISITOR(TransferableTypedData)
-REGULAR_VISITOR(Pointer)
+COMPRESSED_VISITOR(Pointer)
 NULL_VISITOR(DynamicLibrary)
 VARIABLE_NULL_VISITOR(Instructions, Instructions::Size(raw_obj))
 VARIABLE_NULL_VISITOR(InstructionsSection, InstructionsSection::Size(raw_obj))
@@ -591,8 +592,8 @@
 VARIABLE_NULL_VISITOR(CodeSourceMap, raw_obj->untag()->length_)
 VARIABLE_NULL_VISITOR(CompressedStackMaps,
                       CompressedStackMaps::PayloadSizeOf(raw_obj))
-VARIABLE_NULL_VISITOR(OneByteString, Smi::Value(raw_obj->untag()->length_))
-VARIABLE_NULL_VISITOR(TwoByteString, Smi::Value(raw_obj->untag()->length_))
+VARIABLE_NULL_VISITOR(OneByteString, Smi::Value(raw_obj->untag()->length()))
+VARIABLE_NULL_VISITOR(TwoByteString, Smi::Value(raw_obj->untag()->length()))
 // Abstract types don't have their visitor called.
 UNREACHABLE_VISITOR(AbstractType)
 UNREACHABLE_VISITOR(CallSiteData)
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 5776c38..b24f93e 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -2368,19 +2368,22 @@
 class UntaggedLibraryPrefix : public UntaggedInstance {
   RAW_HEAP_OBJECT_IMPLEMENTATION(LibraryPrefix);
 
-  VISIT_FROM(ObjectPtr, name)
-  POINTER_FIELD(StringPtr, name)       // Library prefix name.
-  POINTER_FIELD(ArrayPtr, imports)     // Libraries imported with this prefix.
-  POINTER_FIELD(LibraryPtr, importer)  // Library which declares this prefix.
-  VISIT_TO(ObjectPtr, importer)
-  ObjectPtr* to_snapshot(Snapshot::Kind kind) {
+  VISIT_FROM(CompressedObjectPtr, name)
+  // Library prefix name.
+  COMPRESSED_POINTER_FIELD(StringPtr, name)
+  // Libraries imported with this prefix.
+  COMPRESSED_POINTER_FIELD(ArrayPtr, imports)
+  // Library which declares this prefix.
+  COMPRESSED_POINTER_FIELD(LibraryPtr, importer)
+  VISIT_TO(CompressedObjectPtr, importer)
+  CompressedObjectPtr* to_snapshot(Snapshot::Kind kind) {
     switch (kind) {
       case Snapshot::kFullAOT:
-        return reinterpret_cast<ObjectPtr*>(&imports_);
+        return reinterpret_cast<CompressedObjectPtr*>(&imports_);
       case Snapshot::kFull:
       case Snapshot::kFullCore:
       case Snapshot::kFullJIT:
-        return reinterpret_cast<ObjectPtr*>(&importer_);
+        return reinterpret_cast<CompressedObjectPtr*>(&importer_);
       case Snapshot::kMessage:
       case Snapshot::kNone:
       case Snapshot::kInvalid:
@@ -2428,7 +2431,7 @@
   static constexpr intptr_t kTypeStateBitSize = 2;
 
   uword type_test_stub_entry_point_;  // Accessed from generated code.
-  POINTER_FIELD(
+  COMPRESSED_POINTER_FIELD(
       CodePtr,
       type_test_stub)  // Must be the last field, since subclasses use it
                        // in their VISIT_FROM.
@@ -2444,15 +2447,15 @@
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(Type);
 
-  VISIT_FROM(ObjectPtr, type_test_stub)
-  POINTER_FIELD(SmiPtr, type_class_id)
-  POINTER_FIELD(TypeArgumentsPtr, arguments)
-  POINTER_FIELD(SmiPtr, hash)
-  VISIT_TO(ObjectPtr, hash)
+  VISIT_FROM(CompressedObjectPtr, type_test_stub)
+  COMPRESSED_POINTER_FIELD(SmiPtr, type_class_id)
+  COMPRESSED_POINTER_FIELD(TypeArgumentsPtr, arguments)
+  COMPRESSED_POINTER_FIELD(SmiPtr, hash)
+  VISIT_TO(CompressedObjectPtr, hash)
   uint8_t type_state_;
   uint8_t nullability_;
 
-  ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
+  CompressedObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 
   friend class CidRewriteVisitor;
   friend class UntaggedTypeArguments;
@@ -2462,13 +2465,14 @@
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(FunctionType);
 
-  VISIT_FROM(ObjectPtr, type_test_stub)
-  POINTER_FIELD(TypeArgumentsPtr, type_parameters)  // Array of TypeParameter.
-  POINTER_FIELD(AbstractTypePtr, result_type)
-  POINTER_FIELD(ArrayPtr, parameter_types)
-  POINTER_FIELD(ArrayPtr, parameter_names);
-  POINTER_FIELD(SmiPtr, hash)
-  VISIT_TO(ObjectPtr, hash)
+  VISIT_FROM(CompressedObjectPtr, type_test_stub)
+  // Array of TypeParameter.
+  COMPRESSED_POINTER_FIELD(TypeArgumentsPtr, type_parameters)
+  COMPRESSED_POINTER_FIELD(AbstractTypePtr, result_type)
+  COMPRESSED_POINTER_FIELD(ArrayPtr, parameter_types)
+  COMPRESSED_POINTER_FIELD(ArrayPtr, parameter_names);
+  COMPRESSED_POINTER_FIELD(SmiPtr, hash)
+  VISIT_TO(CompressedObjectPtr, hash)
   uint32_t packed_fields_;  // Number of parent type args and own parameters.
   uint8_t type_state_;
   uint8_t nullability_;
@@ -2515,7 +2519,7 @@
                 "a Smi on the target architecture");
 
  private:
-  ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
+  CompressedObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 
   friend class Function;
 };
@@ -2524,27 +2528,27 @@
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(TypeRef);
 
-  VISIT_FROM(ObjectPtr, type_test_stub)
-  POINTER_FIELD(AbstractTypePtr, type)  // The referenced type.
-  VISIT_TO(ObjectPtr, type)
-  ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
+  VISIT_FROM(CompressedObjectPtr, type_test_stub)
+  COMPRESSED_POINTER_FIELD(AbstractTypePtr, type)  // The referenced type.
+  VISIT_TO(CompressedObjectPtr, type)
+  CompressedObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 };
 
 class UntaggedTypeParameter : public UntaggedAbstractType {
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(TypeParameter);
 
-  VISIT_FROM(ObjectPtr, type_test_stub)
-  POINTER_FIELD(StringPtr, name)
-  POINTER_FIELD(SmiPtr, hash)
-  POINTER_FIELD(AbstractTypePtr,
-                bound)  // ObjectType if no explicit bound specified.
+  VISIT_FROM(CompressedObjectPtr, type_test_stub)
+  COMPRESSED_POINTER_FIELD(StringPtr, name)
+  COMPRESSED_POINTER_FIELD(SmiPtr, hash)
+  // ObjectType if no explicit bound specified.
+  COMPRESSED_POINTER_FIELD(AbstractTypePtr, bound)
   // The instantiation to bounds of this parameter as calculated by the CFE.
   //
   // TODO(dartbug.com/43901): Once a separate TypeParameters class has been
   // added, move these there and remove them from TypeParameter objects.
-  POINTER_FIELD(AbstractTypePtr, default_argument)
-  VISIT_TO(ObjectPtr, default_argument)
+  COMPRESSED_POINTER_FIELD(AbstractTypePtr, default_argument)
+  VISIT_TO(CompressedObjectPtr, default_argument)
   ClassIdTagType parameterized_class_id_;  // Or kFunctionCid for function tp.
   // TODO(regis): Can we use uint8_t twice below? Or keep uint16_t?
   // Warning: BuildTypeParameterTypeTestStub assumes uint16_t.
@@ -2562,7 +2566,7 @@
   static constexpr intptr_t kFlagsBitSize = GenericCovariantImplBit::kNextBit;
 
  private:
-  ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
+  CompressedObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 
   friend class CidRewriteVisitor;
 };
@@ -2653,13 +2657,13 @@
   RAW_HEAP_OBJECT_IMPLEMENTATION(String);
 
  protected:
-  VISIT_FROM(ObjectPtr, length)
-  SMI_FIELD(SmiPtr, length)
+  VISIT_FROM(CompressedObjectPtr, length)
+  COMPRESSED_SMI_FIELD(SmiPtr, length)
 #if !defined(HASH_IN_OBJECT_HEADER)
-  SMI_FIELD(SmiPtr, hash)
-  VISIT_TO(ObjectPtr, hash)
+  COMPRESSED_SMI_FIELD(SmiPtr, hash)
+  VISIT_TO(CompressedObjectPtr, hash)
 #else
-  VISIT_TO(ObjectPtr, length)
+  VISIT_TO(CompressedObjectPtr, length)
 #endif
 
  private:
@@ -2728,7 +2732,7 @@
  protected:
   // The length of the view in element sizes (obtainable via
   // [TypedDataBase::ElementSizeInBytes]).
-  SMI_FIELD(SmiPtr, length);
+  COMPRESSED_SMI_FIELD(SmiPtr, length);
 
  private:
   friend class UntaggedTypedDataView;
@@ -2747,8 +2751,8 @@
   void RecomputeDataField() { data_ = internal_data(); }
 
  protected:
-  VISIT_FROM(ObjectPtr, length)
-  VISIT_TO_LENGTH(ObjectPtr, &length_)
+  VISIT_FROM(CompressedObjectPtr, length)
+  VISIT_TO_LENGTH(CompressedObjectPtr, &length_)
 
   // Variable length data follows here.
 
@@ -2782,7 +2786,7 @@
  public:
   // Recompute [data_] based on internal/external [typed_data_].
   void RecomputeDataField() {
-    const intptr_t offset_in_bytes = RawSmiValue(offset_in_bytes_);
+    const intptr_t offset_in_bytes = RawSmiValue(this->offset_in_bytes());
     uint8_t* payload = typed_data()->untag()->data_;
     data_ = payload + offset_in_bytes;
   }
@@ -2798,7 +2802,7 @@
   }
 
   uint8_t* DataFieldForInternalTypedData() const {
-    const intptr_t offset_in_bytes = RawSmiValue(offset_in_bytes_);
+    const intptr_t offset_in_bytes = RawSmiValue(this->offset_in_bytes());
     uint8_t* payload =
         reinterpret_cast<uint8_t*>(UntaggedObject::ToAddr(typed_data()) +
                                    UntaggedTypedData::payload_offset());
@@ -2808,12 +2812,12 @@
   void ValidateInnerPointer() {
     if (typed_data()->untag()->GetClassId() == kNullCid) {
       // The view object must have gotten just initialized.
-      if (data_ != nullptr || RawSmiValue(offset_in_bytes_) != 0 ||
-          RawSmiValue(length_) != 0) {
+      if (data_ != nullptr || RawSmiValue(offset_in_bytes()) != 0 ||
+          RawSmiValue(length()) != 0) {
         FATAL("RawTypedDataView has invalid inner pointer.");
       }
     } else {
-      const intptr_t offset_in_bytes = RawSmiValue(offset_in_bytes_);
+      const intptr_t offset_in_bytes = RawSmiValue(this->offset_in_bytes());
       uint8_t* payload = typed_data()->untag()->data_;
       if ((payload + offset_in_bytes) != data_) {
         FATAL("RawTypedDataView has invalid inner pointer.");
@@ -2822,11 +2826,11 @@
   }
 
  protected:
-  VISIT_FROM(ObjectPtr, length)
-  POINTER_FIELD(TypedDataBasePtr, typed_data)
-  SMI_FIELD(SmiPtr, offset_in_bytes)
-  VISIT_TO(ObjectPtr, offset_in_bytes)
-  ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
+  VISIT_FROM(CompressedObjectPtr, length)
+  COMPRESSED_POINTER_FIELD(TypedDataBasePtr, typed_data)
+  COMPRESSED_SMI_FIELD(SmiPtr, offset_in_bytes)
+  VISIT_TO(CompressedObjectPtr, offset_in_bytes)
+  CompressedObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 
   friend class Api;
   friend class Object;
@@ -3002,16 +3006,16 @@
   RAW_HEAP_OBJECT_IMPLEMENTATION(ExternalTypedData);
 
  protected:
-  VISIT_FROM(ObjectPtr, length)
-  VISIT_TO(ObjectPtr, length)
+  VISIT_FROM(CompressedObjectPtr, length)
+  VISIT_TO(CompressedObjectPtr, length)
 };
 
 class UntaggedPointer : public UntaggedPointerBase {
   RAW_HEAP_OBJECT_IMPLEMENTATION(Pointer);
 
-  VISIT_FROM(ObjectPtr, type_arguments)
-  POINTER_FIELD(TypeArgumentsPtr, type_arguments)
-  VISIT_TO(ObjectPtr, type_arguments)
+  VISIT_FROM(CompressedObjectPtr, type_arguments)
+  COMPRESSED_POINTER_FIELD(TypeArgumentsPtr, type_arguments)
+  VISIT_TO(CompressedObjectPtr, type_arguments)
 
   friend class Pointer;
 };
@@ -3043,15 +3047,15 @@
 class UntaggedReceivePort : public UntaggedInstance {
   RAW_HEAP_OBJECT_IMPLEMENTATION(ReceivePort);
 
-  VISIT_FROM(ObjectPtr, send_port)
-  POINTER_FIELD(SendPortPtr, send_port)
-  POINTER_FIELD(InstancePtr, handler)
+  VISIT_FROM(CompressedObjectPtr, send_port)
+  COMPRESSED_POINTER_FIELD(SendPortPtr, send_port)
+  COMPRESSED_POINTER_FIELD(InstancePtr, handler)
 #if !defined(PRODUCT)
-  POINTER_FIELD(StringPtr, debug_name)
-  POINTER_FIELD(StackTracePtr, allocation_location)
-  VISIT_TO(ObjectPtr, allocation_location)
+  COMPRESSED_POINTER_FIELD(StringPtr, debug_name)
+  COMPRESSED_POINTER_FIELD(StackTracePtr, allocation_location)
+  VISIT_TO(CompressedObjectPtr, allocation_location)
 #else
-  VISIT_TO(ObjectPtr, handler)
+  VISIT_TO(CompressedObjectPtr, handler)
 #endif  // !defined(PRODUCT)
 };
 
@@ -3067,15 +3071,16 @@
 class UntaggedStackTrace : public UntaggedInstance {
   RAW_HEAP_OBJECT_IMPLEMENTATION(StackTrace);
 
-  VISIT_FROM(ObjectPtr, async_link)
-  POINTER_FIELD(StackTracePtr,
-                async_link);  // Link to parent async stack trace.
-  POINTER_FIELD(ArrayPtr,
-                code_array);  // Code object for each frame in the stack trace.
-  POINTER_FIELD(TypedDataPtr, pc_offset_array);  // Offset of PC for each frame.
+  VISIT_FROM(CompressedObjectPtr, async_link)
+  // Link to parent async stack trace.
+  COMPRESSED_POINTER_FIELD(StackTracePtr, async_link);
+  // Code object for each frame in the stack trace.
+  COMPRESSED_POINTER_FIELD(ArrayPtr, code_array);
+  // Offset of PC for each frame.
+  COMPRESSED_POINTER_FIELD(TypedDataPtr, pc_offset_array);
 
-  VISIT_TO(ObjectPtr, pc_offset_array)
-  ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
+  VISIT_TO(CompressedObjectPtr, pc_offset_array)
+  CompressedObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 
   // False for pre-allocated stack trace (used in OOM and Stack overflow).
   bool expand_inlined_;
@@ -3089,20 +3094,22 @@
 class UntaggedRegExp : public UntaggedInstance {
   RAW_HEAP_OBJECT_IMPLEMENTATION(RegExp);
 
-  VISIT_FROM(ObjectPtr, num_bracket_expressions)
-  POINTER_FIELD(SmiPtr, num_bracket_expressions)
-  POINTER_FIELD(ArrayPtr, capture_name_map)
-  POINTER_FIELD(StringPtr, pattern)   // Pattern to be used for matching.
-  POINTER_FIELD(ObjectPtr, one_byte)  // FunctionPtr or TypedDataPtr
-  POINTER_FIELD(ObjectPtr, two_byte)
-  POINTER_FIELD(ObjectPtr, external_one_byte)
-  POINTER_FIELD(ObjectPtr, external_two_byte)
-  POINTER_FIELD(ObjectPtr, one_byte_sticky)
-  POINTER_FIELD(ObjectPtr, two_byte_sticky)
-  POINTER_FIELD(ObjectPtr, external_one_byte_sticky)
-  POINTER_FIELD(ObjectPtr, external_two_byte_sticky)
-  VISIT_TO(ObjectPtr, external_two_byte_sticky)
-  ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
+  VISIT_FROM(CompressedObjectPtr, capture_name_map)
+  COMPRESSED_POINTER_FIELD(ArrayPtr, capture_name_map)
+  // Pattern to be used for matching.
+  COMPRESSED_POINTER_FIELD(StringPtr, pattern)
+  COMPRESSED_POINTER_FIELD(ObjectPtr, one_byte)  // FunctionPtr or TypedDataPtr
+  COMPRESSED_POINTER_FIELD(ObjectPtr, two_byte)
+  COMPRESSED_POINTER_FIELD(ObjectPtr, external_one_byte)
+  COMPRESSED_POINTER_FIELD(ObjectPtr, external_two_byte)
+  COMPRESSED_POINTER_FIELD(ObjectPtr, one_byte_sticky)
+  COMPRESSED_POINTER_FIELD(ObjectPtr, two_byte_sticky)
+  COMPRESSED_POINTER_FIELD(ObjectPtr, external_one_byte_sticky)
+  COMPRESSED_POINTER_FIELD(ObjectPtr, external_two_byte_sticky)
+  VISIT_TO(CompressedObjectPtr, external_two_byte_sticky)
+  CompressedObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
+
+  intptr_t num_bracket_expressions_;
 
   // The same pattern may use different amount of registers if compiled
   // for a one-byte target than a two-byte target. For example, we do not
@@ -3144,18 +3151,18 @@
 class UntaggedMirrorReference : public UntaggedInstance {
   RAW_HEAP_OBJECT_IMPLEMENTATION(MirrorReference);
 
-  VISIT_FROM(ObjectPtr, referent)
-  POINTER_FIELD(ObjectPtr, referent)
-  VISIT_TO(ObjectPtr, referent)
+  VISIT_FROM(CompressedObjectPtr, referent)
+  COMPRESSED_POINTER_FIELD(ObjectPtr, referent)
+  VISIT_TO(CompressedObjectPtr, referent)
 };
 
 // UserTag are used by the profiler to track Dart script state.
 class UntaggedUserTag : public UntaggedInstance {
   RAW_HEAP_OBJECT_IMPLEMENTATION(UserTag);
 
-  VISIT_FROM(ObjectPtr, label)
-  POINTER_FIELD(StringPtr, label)
-  VISIT_TO(ObjectPtr, label)
+  VISIT_FROM(CompressedObjectPtr, label)
+  COMPRESSED_POINTER_FIELD(StringPtr, label)
+  VISIT_TO(CompressedObjectPtr, label)
 
   // Isolate unique tag.
   uword tag_;
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index c6c8955..414430b 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -101,8 +101,8 @@
   reader->EnqueueTypePostprocessing(type);
 
   // Set all the object fields.
-  READ_OBJECT_FIELDS(type, type.ptr()->untag()->from(),
-                     type.ptr()->untag()->to(), as_reference);
+  READ_COMPRESSED_OBJECT_FIELDS(type, type.ptr()->untag()->from(),
+                                type.ptr()->untag()->to(), as_reference);
 
   // Read in the type class.
   (*reader->ClassHandle()) =
@@ -166,7 +166,7 @@
   // Write out all the object pointer fields.
   ASSERT(type_class_id() != Object::null());
   SnapshotWriterVisitor visitor(writer, as_reference);
-  visitor.VisitPointers(from(), to());
+  visitor.VisitCompressedPointers(heap_base(), from(), to());
 
   // Write out the type class.
   writer->WriteObjectImpl(type_class, as_reference);
@@ -187,8 +187,8 @@
   reader->EnqueueTypePostprocessing(type_ref);
 
   // Set all the object fields.
-  READ_OBJECT_FIELDS(type_ref, type_ref.ptr()->untag()->from(),
-                     type_ref.ptr()->untag()->to(), kAsReference);
+  READ_COMPRESSED_OBJECT_FIELDS(type_ref, type_ref.ptr()->untag()->from(),
+                                type_ref.ptr()->untag()->to(), kAsReference);
 
   // Fill in the type testing stub.
   Code& code = *reader->CodeHandle();
@@ -213,7 +213,7 @@
 
   // Write out all the object pointer fields.
   SnapshotWriterVisitor visitor(writer, kAsReference);
-  visitor.VisitPointers(from(), to());
+  visitor.VisitCompressedPointers(heap_base(), from(), to());
 }
 
 TypeParameterPtr TypeParameter::ReadFrom(SnapshotReader* reader,
@@ -238,8 +238,9 @@
   reader->EnqueueTypePostprocessing(type_parameter);
 
   // Set all the object fields.
-  READ_OBJECT_FIELDS(type_parameter, type_parameter.ptr()->untag()->from(),
-                     type_parameter.ptr()->untag()->to(), kAsReference);
+  READ_COMPRESSED_OBJECT_FIELDS(
+      type_parameter, type_parameter.ptr()->untag()->from(),
+      type_parameter.ptr()->untag()->to(), kAsReference);
 
   // Read in the parameterized class.
   (*reader->ClassHandle()) =
@@ -287,7 +288,7 @@
 
   // Write out all the object pointer fields.
   SnapshotWriterVisitor visitor(writer, kAsReference);
-  visitor.VisitPointers(from(), to());
+  visitor.VisitCompressedPointers(heap_base(), from(), to());
 
   // Write out the parameterized class (or Function if cid == kFunctionCid).
   ClassPtr param_class =
@@ -1375,7 +1376,7 @@
                                 bool as_reference) {
   ASSERT(writer != NULL);
   intptr_t cid = this->GetClassId();
-  intptr_t length = Smi::Value(length_);  // In elements.
+  intptr_t length = Smi::Value(this->length());  // In elements.
   intptr_t external_cid;
   intptr_t bytes;
   switch (cid) {
@@ -1449,7 +1450,7 @@
     // Write as external.
     writer->WriteIndexedObject(external_cid);
     writer->WriteTags(writer->GetObjectTags(this));
-    writer->Write<ObjectPtr>(length_);
+    writer->Write<ObjectPtr>(this->length());
     uint8_t* data = reinterpret_cast<uint8_t*>(this->data());
     void* passed_data = malloc(bytes);
     memmove(passed_data, data, bytes);
@@ -1462,7 +1463,7 @@
     // Write as internal.
     writer->WriteIndexedObject(cid);
     writer->WriteTags(writer->GetObjectTags(this));
-    writer->Write<ObjectPtr>(length_);
+    writer->Write<ObjectPtr>(this->length());
     uint8_t* data = reinterpret_cast<uint8_t*>(this->data());
     writer->Align(Zone::kAlignment);
     writer->WriteBytes(data, bytes);
@@ -1475,7 +1476,7 @@
                                         bool as_reference) {
   ASSERT(writer != NULL);
   intptr_t cid = this->GetClassId();
-  intptr_t length = Smi::Value(length_);  // In elements.
+  intptr_t length = Smi::Value(this->length());  // In elements.
   intptr_t bytes;
   switch (cid) {
     case kExternalTypedDataInt8ArrayCid:
@@ -1531,7 +1532,7 @@
   // Write as external.
   writer->WriteIndexedObject(cid);
   writer->WriteTags(writer->GetObjectTags(this));
-  writer->Write<ObjectPtr>(length_);
+  writer->Write<ObjectPtr>(this->length());
   uint8_t* data = reinterpret_cast<uint8_t*>(data_);
   void* passed_data = malloc(bytes);
   memmove(passed_data, data, bytes);
@@ -1547,7 +1548,7 @@
                                     Snapshot::Kind kind,
                                     bool as_reference) {
   // Views have always a backing store.
-  ASSERT(typed_data_ != Object::null());
+  ASSERT(typed_data() != Object::null());
 
   // Write out the serialization header value for this object.
   writer->WriteInlinedObjectHeader(object_id);
@@ -1557,9 +1558,9 @@
   writer->WriteTags(writer->GetObjectTags(this));
 
   // Write members.
-  writer->Write<ObjectPtr>(offset_in_bytes_);
-  writer->Write<ObjectPtr>(length_);
-  writer->WriteObjectImpl(typed_data_, as_reference);
+  writer->Write<ObjectPtr>(offset_in_bytes());
+  writer->Write<ObjectPtr>(length());
+  writer->WriteObjectImpl(typed_data(), as_reference);
 }
 
 TypedDataViewPtr TypedDataView::ReadFrom(SnapshotReader* reader,
@@ -1713,14 +1714,13 @@
   reader->AddBackRef(object_id, &regex, kIsDeserialized);
 
   // Read and Set all the other fields.
-  *reader->SmiHandle() ^= reader->ReadObjectImpl(kAsInlinedObject);
-  regex.set_num_bracket_expressions(*reader->SmiHandle());
-
   *reader->ArrayHandle() ^= reader->ReadObjectImpl(kAsInlinedObject);
   regex.set_capture_name_map(*reader->ArrayHandle());
   *reader->StringHandle() ^= reader->ReadObjectImpl(kAsInlinedObject);
   regex.set_pattern(*reader->StringHandle());
 
+  regex.StoreNonPointer(&regex.untag()->num_bracket_expressions_,
+                        reader->Read<int32_t>());
   regex.StoreNonPointer(&regex.untag()->num_one_byte_registers_,
                         reader->Read<int32_t>());
   regex.StoreNonPointer(&regex.untag()->num_two_byte_registers_,
@@ -1751,9 +1751,9 @@
   writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out all the other fields.
-  writer->WriteObjectImpl(num_bracket_expressions_, kAsInlinedObject);
-  writer->WriteObjectImpl(capture_name_map_, kAsInlinedObject);
-  writer->WriteObjectImpl(pattern_, kAsInlinedObject);
+  writer->WriteObjectImpl(capture_name_map(), kAsInlinedObject);
+  writer->WriteObjectImpl(pattern(), kAsInlinedObject);
+  writer->Write<int32_t>(num_bracket_expressions_);
   writer->Write<int32_t>(num_one_byte_registers_);
   writer->Write<int32_t>(num_two_byte_registers_);
   writer->Write<int8_t>(type_flags_);
diff --git a/runtime/vm/regexp_assembler_bytecode.cc b/runtime/vm/regexp_assembler_bytecode.cc
index 4d8841f..708297a 100644
--- a/runtime/vm/regexp_assembler_bytecode.cc
+++ b/runtime/vm/regexp_assembler_bytecode.cc
@@ -465,7 +465,7 @@
   ASSERT(regexp.num_registers(is_one_byte) != -1);
 
   return regexp.num_registers(is_one_byte) +
-         (Smi::Value(regexp.num_bracket_expressions()) + 1) * 2;
+         (regexp.num_bracket_expressions() + 1) * 2;
 }
 
 static IrregexpInterpreter::IrregexpResult ExecRaw(const RegExp& regexp,
@@ -478,12 +478,9 @@
   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;
+  int number_of_capture_registers = (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
@@ -533,7 +530,7 @@
               required_registers, zone);
 
   if (result == IrregexpInterpreter::RE_SUCCESS) {
-    intptr_t capture_count = Smi::Value(regexp.num_bracket_expressions());
+    intptr_t capture_count = regexp.num_bracket_expressions();
     intptr_t capture_register_count = (capture_count + 1) * 2;
     ASSERT(required_registers >= capture_register_count);
 
diff --git a/runtime/vm/tagged_pointer.h b/runtime/vm/tagged_pointer.h
index 8c11bf8..b0cb20d 100644
--- a/runtime/vm/tagged_pointer.h
+++ b/runtime/vm/tagged_pointer.h
@@ -191,9 +191,13 @@
   ObjectPtr Decompress(uword heap_base) const { return *this; }
   ObjectPtr DecompressSmi() const { return *this; }
   uword heap_base() const {
+    // TODO(rmacnak): Why does Windows have trouble linking GetClassId used
+    // here?
+#if !defined(HOST_OS_WINDOWS)
     ASSERT(IsHeapObject());
     ASSERT(!IsInstructions());
     ASSERT(!IsInstructionsSection());
+#endif
     return tagged_pointer_ & kHeapBaseMask;
   }
 
diff --git a/runtime/vm/visitor.h b/runtime/vm/visitor.h
index 8365418..fd2a78c 100644
--- a/runtime/vm/visitor.h
+++ b/runtime/vm/visitor.h
@@ -28,9 +28,9 @@
   //
   // Range of pointers to visit 'first' <= pointer <= 'last'.
   virtual void VisitTypedDataViewPointers(TypedDataViewPtr view,
-                                          ObjectPtr* first,
-                                          ObjectPtr* last) {
-    VisitPointers(first, last);
+                                          CompressedObjectPtr* first,
+                                          CompressedObjectPtr* last) {
+    VisitCompressedPointers(view->heap_base(), first, last);
   }
 
   // Range of pointers to visit 'first' <= pointer <= 'last'.
diff --git a/tools/VERSION b/tools/VERSION
index 5d714ab..043770a 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 13
 PATCH 0
-PRERELEASE 203
+PRERELEASE 204
 PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index c244d73..8527b24 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -3389,7 +3389,8 @@
           "name": "build dart",
           "script": "tools/build.py",
           "arguments": [
-            "create_sdk"
+            "create_sdk",
+            "dartdevc_test"
           ]
         },
         {