Version 2.18.0-165.0.dev

Merge commit 'cd4cc0d577ed961a32eb29d12feac4feeb772ad8' into 'dev'
diff --git a/DEPS b/DEPS
index 7ed2184..b6c119a 100644
--- a/DEPS
+++ b/DEPS
@@ -113,7 +113,6 @@
   "fixnum_rev": "3bfc2ed1eea7e7acb79ad4f17392f92c816fc5ce",
   "glob_rev": "e10eb2407c58427144004458ef85c9bbf7286e56",
   "html_rev": "f108bce59d136c584969fd24a5006914796cf213",
-  "http_io_rev": "405fc79233b4a3d4bb079ebf438bb2caf2f49355",
   "http_multi_server_rev": "35a3b947256768426090e3b1f5132e4fc23c175d",
   "http_parser_rev": "9126ee04e77fd8e4e2e6435b503ee4dd708d7ddc",
   "http_rev": "2993ea5dff5ffb066b4a35c707e7a2b8dcfa17c2",
@@ -340,8 +339,6 @@
       Var("dart_git") + "html.git" + "@" + Var("html_rev"),
   Var("dart_root") + "/third_party/pkg/http":
       Var("dart_git") + "http.git" + "@" + Var("http_rev"),
-  Var("dart_root") + "/third_party/pkg_tested/http_io":
-    Var("dart_git") + "http_io.git" + "@" + Var("http_io_rev"),
   Var("dart_root") + "/third_party/pkg/http_multi_server":
       Var("dart_git") + "http_multi_server.git" +
       "@" + Var("http_multi_server_rev"),
diff --git a/pkg/analyzer/lib/src/dart/micro/resolve_file.dart b/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
index 3b94d9b..4c83abd 100644
--- a/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
+++ b/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
@@ -12,6 +12,7 @@
 import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer/src/analysis_options/analysis_options_provider.dart';
 import 'package:analyzer/src/context/packages.dart';
+import 'package:analyzer/src/dart/analysis/cache.dart';
 import 'package:analyzer/src/dart/analysis/context_root.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart' show ErrorEncoding;
 import 'package:analyzer/src/dart/analysis/experiments.dart';
@@ -126,6 +127,10 @@
   @visibleForTesting
   final Map<String, ResolvedLibraryResult> cachedResults = {};
 
+  /// The cache of error results.
+  final Cache<String, Uint8List> _errorResultsCache =
+      Cache(128 * 1024, (bytes) => bytes.length);
+
   FileResolver({
     required this.logger,
     required this.resourceProvider,
@@ -250,30 +255,28 @@
       var errorsSignatureBuilder = ApiSignature();
       errorsSignatureBuilder.addBytes(file.libraryCycle.signature);
       errorsSignatureBuilder.addBytes(file.digest);
-      var errorsSignature = errorsSignatureBuilder.toByteList();
+      final errorsKey = '${errorsSignatureBuilder.toHex()}.errors';
 
-      var errorsKey = '${file.path}.errors';
-      var bytes = byteStore.get(errorsKey, errorsSignature)?.bytes;
-      List<AnalysisError>? errors;
+      final List<AnalysisError> errors;
+      final bytes = _errorResultsCache.get(errorsKey);
       if (bytes != null) {
         var data = CiderUnitErrors.fromBuffer(bytes);
         errors = data.errors.map((error) {
           return ErrorEncoding.decode(file.source, error)!;
         }).toList();
-      }
-
-      if (errors == null) {
+      } else {
         var unitResult = await resolve2(
           path: path,
           performance: performance,
         );
         errors = unitResult.errors;
 
-        bytes = CiderUnitErrorsBuilder(
-          signature: errorsSignature,
-          errors: errors.map(ErrorEncoding.encode).toList(),
-        ).toBuffer();
-        bytes = byteStore.putGet(errorsKey, errorsSignature, bytes).bytes;
+        _errorResultsCache.put(
+          errorsKey,
+          CiderUnitErrorsBuilder(
+            errors: errors.map(ErrorEncoding.encode).toList(),
+          ).toBuffer(),
+        );
       }
 
       return ErrorsResultImpl(
diff --git a/pkg/analyzer/lib/src/summary/format.dart b/pkg/analyzer/lib/src/summary/format.dart
index 34f8996..8718728 100644
--- a/pkg/analyzer/lib/src/summary/format.dart
+++ b/pkg/analyzer/lib/src/summary/format.dart
@@ -3217,7 +3217,6 @@
     with _CiderUnitErrorsMixin
     implements idl.CiderUnitErrors {
   List<AnalysisDriverUnitErrorBuilder>? _errors;
-  List<int>? _signature;
 
   @override
   List<AnalysisDriverUnitErrorBuilder> get errors =>
@@ -3227,19 +3226,8 @@
     this._errors = value;
   }
 
-  @override
-  List<int> get signature => _signature ??= <int>[];
-
-  /// The hash signature of this data.
-  set signature(List<int> value) {
-    assert(value.every((e) => e >= 0));
-    this._signature = value;
-  }
-
-  CiderUnitErrorsBuilder(
-      {List<AnalysisDriverUnitErrorBuilder>? errors, List<int>? signature})
-      : _errors = errors,
-        _signature = signature;
+  CiderUnitErrorsBuilder({List<AnalysisDriverUnitErrorBuilder>? errors})
+      : _errors = errors;
 
   /// Flush [informative] data recursively.
   void flushInformative() {
@@ -3248,15 +3236,6 @@
 
   /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signatureSink) {
-    var signature = this._signature;
-    if (signature == null) {
-      signatureSink.addInt(0);
-    } else {
-      signatureSink.addInt(signature.length);
-      for (var x in signature) {
-        signatureSink.addInt(x);
-      }
-    }
     var errors = this._errors;
     if (errors == null) {
       signatureSink.addInt(0);
@@ -3275,22 +3254,14 @@
 
   fb.Offset finish(fb.Builder fbBuilder) {
     fb.Offset? offset_errors;
-    fb.Offset? offset_signature;
     var errors = _errors;
     if (!(errors == null || errors.isEmpty)) {
       offset_errors =
           fbBuilder.writeList(errors.map((b) => b.finish(fbBuilder)).toList());
     }
-    var signature = _signature;
-    if (!(signature == null || signature.isEmpty)) {
-      offset_signature = fbBuilder.writeListUint32(signature);
-    }
     fbBuilder.startTable();
     if (offset_errors != null) {
-      fbBuilder.addOffset(1, offset_errors);
-    }
-    if (offset_signature != null) {
-      fbBuilder.addOffset(0, offset_signature);
+      fbBuilder.addOffset(0, offset_errors);
     }
     return fbBuilder.endTable();
   }
@@ -3318,19 +3289,12 @@
   _CiderUnitErrorsImpl(this._bc, this._bcOffset);
 
   List<idl.AnalysisDriverUnitError>? _errors;
-  List<int>? _signature;
 
   @override
   List<idl.AnalysisDriverUnitError> get errors {
     return _errors ??= const fb.ListReader<idl.AnalysisDriverUnitError>(
             _AnalysisDriverUnitErrorReader())
-        .vTableGet(_bc, _bcOffset, 1, const <idl.AnalysisDriverUnitError>[]);
-  }
-
-  @override
-  List<int> get signature {
-    return _signature ??=
-        const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 0, const <int>[]);
+        .vTableGet(_bc, _bcOffset, 0, const <idl.AnalysisDriverUnitError>[]);
   }
 }
 
@@ -3342,17 +3306,12 @@
     if (local_errors.isNotEmpty) {
       result["errors"] = local_errors.map((value) => value.toJson()).toList();
     }
-    var local_signature = signature;
-    if (local_signature.isNotEmpty) {
-      result["signature"] = local_signature;
-    }
     return result;
   }
 
   @override
   Map<String, Object?> toMap() => {
         "errors": errors,
-        "signature": signature,
       };
 
   @override
diff --git a/pkg/analyzer/lib/src/summary/format.fbs b/pkg/analyzer/lib/src/summary/format.fbs
index 5d58b75..8db2631 100644
--- a/pkg/analyzer/lib/src/summary/format.fbs
+++ b/pkg/analyzer/lib/src/summary/format.fbs
@@ -403,10 +403,7 @@
 
 /// Errors for a single unit.
 table CiderUnitErrors {
-  errors:[AnalysisDriverUnitError] (id: 1);
-
-  /// The hash signature of this data.
-  signature:[uint] (id: 0);
+  errors:[AnalysisDriverUnitError] (id: 0);
 }
 
 table DiagnosticMessage {
diff --git a/pkg/analyzer/lib/src/summary/idl.dart b/pkg/analyzer/lib/src/summary/idl.dart
index b5f6b8f..13be95e 100644
--- a/pkg/analyzer/lib/src/summary/idl.dart
+++ b/pkg/analyzer/lib/src/summary/idl.dart
@@ -427,12 +427,8 @@
   factory CiderUnitErrors.fromBuffer(List<int> buffer) =>
       generated.readCiderUnitErrors(buffer);
 
-  @Id(1)
-  List<AnalysisDriverUnitError> get errors;
-
-  /// The hash signature of this data.
   @Id(0)
-  List<int> get signature;
+  List<AnalysisDriverUnitError> get errors;
 }
 
 abstract class DiagnosticMessage extends base.SummaryClass {
diff --git a/pkg/analyzer/test/src/dart/micro/file_resolution.dart b/pkg/analyzer/test/src/dart/micro/file_resolution.dart
index d9c67b6..f664ce3 100644
--- a/pkg/analyzer/test/src/dart/micro/file_resolution.dart
+++ b/pkg/analyzer/test/src/dart/micro/file_resolution.dart
@@ -35,6 +35,11 @@
 
   Folder get sdkRoot => newFolder('/sdk');
 
+  File get testFile => getFile(testFilePath);
+
+  @override
+  String get testFilePath => _testFile;
+
   @override
   void addTestFile(String content) {
     newFile(_testFile, content);
diff --git a/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart b/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart
index ffc3b74..4f726b3 100644
--- a/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart
+++ b/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dart/error/syntactic_errors.dart';
@@ -691,79 +692,56 @@
   }
 
   test_getErrors_reuse() async {
-    addTestFile('var a = b;');
-
-    var path = convertPath('/workspace/dart/test/lib/test.dart');
+    newFile(testFilePath, 'var a = b;');
 
     // No resolved files yet.
-    expect(fileResolver.testView!.resolvedLibraries, isEmpty);
+    _assertResolvedFiles([]);
 
     // No cached, will resolve once.
     expect((await getTestErrors()).errors, hasLength(1));
-    expect(fileResolver.testView!.resolvedLibraries, [path]);
+    _assertResolvedFiles([testFile]);
 
     // Has cached, will be not resolved again.
     expect((await getTestErrors()).errors, hasLength(1));
-    expect(fileResolver.testView!.resolvedLibraries, [path]);
+    _assertResolvedFiles([]);
 
-    // New resolver.
-    // Still has cached, will be not resolved.
-    createFileResolver();
+    // Change the file, will be resolved again.
+    newFile(testFilePath, 'var a = c;');
+    fileResolver.changeFile(testFile.path);
     expect((await getTestErrors()).errors, hasLength(1));
-    expect(fileResolver.testView!.resolvedLibraries, <Object>[]);
-
-    // Change the file, new resolver.
-    // With changed file the previously cached result cannot be used.
-    addTestFile('var a = c;');
-    createFileResolver();
-    expect((await getTestErrors()).errors, hasLength(1));
-    expect(fileResolver.testView!.resolvedLibraries, [path]);
-
-    // New resolver.
-    // Still has cached, will be not resolved.
-    createFileResolver();
-    expect((await getTestErrors()).errors, hasLength(1));
-    expect(fileResolver.testView!.resolvedLibraries, <Object>[]);
+    _assertResolvedFiles([testFile]);
   }
 
   test_getErrors_reuse_changeDependency() async {
-    newFile('/workspace/dart/test/lib/a.dart', r'''
+    final a = newFile('/workspace/dart/test/lib/a.dart', r'''
 var a = 0;
 ''');
 
-    addTestFile(r'''
+    newFile(testFilePath, r'''
 import 'a.dart';
 var b = a.foo;
 ''');
 
-    var path = convertPath('/workspace/dart/test/lib/test.dart');
-
     // No resolved files yet.
-    expect(fileResolver.testView!.resolvedLibraries, isEmpty);
+    _assertResolvedFiles([]);
 
     // No cached, will resolve once.
     expect((await getTestErrors()).errors, hasLength(1));
-    expect(fileResolver.testView!.resolvedLibraries, [path]);
+    _assertResolvedFiles([testFile]);
 
     // Has cached, will be not resolved again.
     expect((await getTestErrors()).errors, hasLength(1));
-    expect(fileResolver.testView!.resolvedLibraries, [path]);
+    _assertResolvedFiles([]);
 
-    // Change the dependency, new resolver.
+    // Change the dependency.
     // The signature of the result is different.
     // The previously cached result cannot be used.
-    newFile('/workspace/dart/test/lib/a.dart', r'''
+    newFile(a.path, r'''
 var a = 4.2;
 ''');
-    createFileResolver();
+    fileResolver.changeFile(a.path);
     expect((await getTestErrors()).errors, hasLength(1));
-    expect(fileResolver.testView!.resolvedLibraries, [path]);
-
-    // New resolver.
-    // Still has cached, will be not resolved.
-    createFileResolver();
-    expect((await getTestErrors()).errors, hasLength(1));
-    expect(fileResolver.testView!.resolvedLibraries, <Object>[]);
+    _assertResolvedFiles([testFile]);
   }
 
   test_getFilesWithTopLevelDeclarations_cached() async {
@@ -1097,25 +1075,23 @@
   }
 
   test_resolveFile_cache() async {
-    var path = convertPath('/workspace/dart/test/lib/test.dart');
-    newFile(path, 'var a = 0;');
+    newFile(testFilePath, 'var a = 0;');
 
     // No resolved files yet.
-    var testView = fileResolver.testView!;
-    expect(testView.resolvedLibraries, isEmpty);
+    _assertResolvedFiles([]);
 
-    await resolveFile2(path);
+    await resolveFile2(testFile.path);
     var result1 = result;
 
     // The file was resolved.
-    expect(testView.resolvedLibraries, [path]);
+    _assertResolvedFiles([testFile]);
 
     // The result is cached.
-    expect(fileResolver.cachedResults, contains(path));
+    expect(fileResolver.cachedResults, contains(testFile.path));
 
     // Ask again, no changes, not resolved.
-    await resolveFile2(path);
-    expect(testView.resolvedLibraries, [path]);
+    await resolveFile2(testFile.path);
+    _assertResolvedFiles([]);
 
     // The same result was returned.
     expect(result, same(result1));
@@ -1125,36 +1101,33 @@
     fileResolver.changeFile(a_path);
 
     // The was a change to a file, no matter which, resolve again.
-    await resolveFile2(path);
-    expect(testView.resolvedLibraries, [path, path]);
+    await resolveFile2(testFile.path);
+    _assertResolvedFiles([testFile]);
 
     // Get should get a new result.
     expect(result, isNot(same(result1)));
   }
 
   test_resolveFile_dontCache_whenForCompletion() async {
-    var a_path = convertPath('/workspace/dart/test/lib/a.dart');
-    newFile(a_path, r'''
+    final a = newFile('/workspace/dart/test/lib/a.dart', r'''
 part 'b.dart';
 ''');
 
-    var b_path = convertPath('/workspace/dart/test/lib/b.dart');
-    newFile(b_path, r'''
+    final b = newFile('/workspace/dart/test/lib/b.dart', r'''
 part of 'a.dart';
 ''');
 
     // No resolved files yet.
-    var testView = fileResolver.testView!;
-    expect(testView.resolvedLibraries, isEmpty);
+    _assertResolvedFiles([]);
 
     await fileResolver.resolve2(
-      path: b_path,
+      path: b.path,
       completionLine: 0,
       completionColumn: 0,
     );
 
-    // The file was resolved.
-    expect(testView.resolvedLibraries, [a_path]);
+    // The library was resolved.
+    _assertResolvedFiles([a]);
 
     // The completion location was set, so not units are resolved.
     // So, the result should not be cached.
@@ -1281,6 +1254,17 @@
     expect(fileResolver.fsState!.testView.removedPaths, matcher);
   }
 
+  void _assertResolvedFiles(
+    List<File> expected, {
+    bool andClear = true,
+  }) {
+    final actual = fileResolver.testView!.resolvedLibraries;
+    expect(actual, expected.map((e) => e.path).toList());
+    if (andClear) {
+      actual.clear();
+    }
+  }
+
   Future<Element> _findElement(int offset, String filePath) async {
     var resolvedUnit = await fileResolver.resolve2(path: filePath);
     var node = NodeLocator(offset).searchWithin(resolvedUnit.unit);
diff --git a/pkg/front_end/test/fasta/testing/suite.dart b/pkg/front_end/test/fasta/testing/suite.dart
index 53269b2..a72f199 100644
--- a/pkg/front_end/test/fasta/testing/suite.dart
+++ b/pkg/front_end/test/fasta/testing/suite.dart
@@ -829,52 +829,55 @@
       return pass(result);
     }
 
-    FolderOptions folderOptions =
-        context.computeFolderOptions(result.description);
-    Map<ExperimentalFlag, bool> experimentalFlags = folderOptions
-        .computeExplicitExperimentalFlags(context.explicitExperimentalFlags);
-    switch (folderOptions.target) {
-      case "vm":
-        if (context._platforms.isEmpty) {
-          throw "Executed `Run` step before initializing the context.";
-        }
-        File generated = new File.fromUri(result.outputUri!);
-        StdioProcess process;
-        try {
-          var args = <String>[];
+    File generated = new File.fromUri(result.outputUri!);
+    try {
+      FolderOptions folderOptions =
+          context.computeFolderOptions(result.description);
+      Map<ExperimentalFlag, bool> experimentalFlags = folderOptions
+          .computeExplicitExperimentalFlags(context.explicitExperimentalFlags);
+      switch (folderOptions.target) {
+        case "vm":
+          if (context._platforms.isEmpty) {
+            throw "Executed `Run` step before initializing the context.";
+          }
+          List<String> args = <String>[];
           if (experimentalFlags[ExperimentalFlag.nonNullable] == true) {
             if (context.soundNullSafety) {
               args.add("--sound-null-safety");
             }
           }
           args.add(generated.path);
-          process = await StdioProcess.run(context.vm.toFilePath(), args);
+          StdioProcess process =
+              await StdioProcess.run(context.vm.toFilePath(), args);
           print(process.output);
-        } finally {
-          await generated.parent.delete(recursive: true);
-        }
-        Result<int> runResult = process.toResult();
-        if (result.component.mode == NonNullableByDefaultCompiledMode.Invalid) {
-          // In this case we expect and want a runtime error.
-          if (runResult.outcome == ExpectationSet.Default["RuntimeError"]) {
-            // We convert this to pass because that's exactly what we'd expect.
-            return pass(result);
-          } else {
-            // Different outcome - that's a failure!
-            return new Result<ComponentResult>(result,
-                ExpectationSet.Default["MissingRuntimeError"], runResult.error);
+          Result<int> runResult = process.toResult();
+          if (result.component.mode ==
+              NonNullableByDefaultCompiledMode.Invalid) {
+            // In this case we expect and want a runtime error.
+            if (runResult.outcome == ExpectationSet.Default["RuntimeError"]) {
+              // We convert this to pass because that's exactly what we'd expect.
+              return pass(result);
+            } else {
+              // Different outcome - that's a failure!
+              return new Result<ComponentResult>(
+                  result,
+                  ExpectationSet.Default["MissingRuntimeError"],
+                  runResult.error);
+            }
           }
-        }
-        return new Result<ComponentResult>(
-            result, runResult.outcome, runResult.error);
-      case "none":
-      case "dart2js":
-      case "dartdevc":
-        // TODO(johnniwinther): Support running dart2js and/or dartdevc.
-        return pass(result);
-      default:
-        throw new ArgumentError(
-            "Unsupported run target '${folderOptions.target}'.");
+          return new Result<ComponentResult>(
+              result, runResult.outcome, runResult.error);
+        case "none":
+        case "dart2js":
+        case "dartdevc":
+          // TODO(johnniwinther): Support running dart2js and/or dartdevc.
+          return pass(result);
+        default:
+          throw new ArgumentError(
+              "Unsupported run target '${folderOptions.target}'.");
+      }
+    } finally {
+      await generated.parent.delete(recursive: true);
     }
   }
 }
diff --git a/pkg/front_end/test/utils/kernel_chain.dart b/pkg/front_end/test/utils/kernel_chain.dart
index 93beea1..b0941a1 100644
--- a/pkg/front_end/test/utils/kernel_chain.dart
+++ b/pkg/front_end/test/utils/kernel_chain.dart
@@ -455,8 +455,28 @@
     ByteSink sink = new ByteSink();
     bool good = false;
     try {
-      // TODO(johnniwinther,jensj): Avoid serializing the sdk.
-      new BinaryPrinter(sink).writeComponentFile(component);
+      // Avoid serializing the sdk.
+      component.computeCanonicalNames();
+      Component userCode = new Component(
+          nameRoot: component.root,
+          uriToSource: new Map<Uri, Source>.from(component.uriToSource));
+      userCode.setMainMethodAndMode(
+          component.mainMethodName, true, component.mode);
+      for (Library library in component.libraries) {
+        if (library.importUri.isScheme("dart")) {
+          if (result.isUserLibrary(library)) {
+            // dart:test, test:extra etc as used will say yes to being a user
+            // library.
+          } else if (library.isSynthetic) {
+            // OK --- serialize that.
+          } else {
+            // Skip serialization of "real" platform libraries.
+            continue;
+          }
+        }
+        userCode.libraries.add(library);
+      }
+      new BinaryPrinter(sink).writeComponentFile(userCode);
       good = true;
     } catch (e, s) {
       return fail(result, e, s);
diff --git a/runtime/vm/app_snapshot.cc b/runtime/vm/app_snapshot.cc
index 2b20b44..c88a31f 100644
--- a/runtime/vm/app_snapshot.cc
+++ b/runtime/vm/app_snapshot.cc
@@ -1027,12 +1027,33 @@
       if (kind != Snapshot::kFullAOT) {
         NOT_IN_PRECOMPILED(
             WriteCompressedField(func, positional_parameter_names));
+      }
+
+#if defined(DART_PRECOMPILER) && !defined(PRODUCT)
+      TokenPosition token_pos = func->untag()->token_pos_;
+      if (kind == Snapshot::kFullAOT) {
+        // We use then token_pos property to store the line number
+        // in AOT snapshots.
+        intptr_t line = -1;
+        const Function& function = Function::Handle(func);
+        const Script& script = Script::Handle(function.script());
+        if (!script.IsNull()) {
+          script.GetTokenLocation(token_pos, &line, nullptr);
+        }
+        token_pos = line == -1 ? TokenPosition::kNoSource
+                               : TokenPosition::Deserialize(line);
+      }
+      s->WriteTokenPosition(token_pos);
+#else
+      if (kind != Snapshot::kFullAOT) {
         s->WriteTokenPosition(func->untag()->token_pos_);
+      }
+#endif
+      if (kind != Snapshot::kFullAOT) {
         s->WriteTokenPosition(func->untag()->end_token_pos_);
         s->Write<uint32_t>(func->untag()->kernel_offset_);
         s->Write<uint32_t>(func->untag()->packed_fields_);
       }
-
       s->Write<uint32_t>(func->untag()->kind_tag_);
     }
   }
@@ -1188,12 +1209,18 @@
       ASSERT(kind != Snapshot::kFullAOT);
       func->untag()->positional_parameter_names_ =
           static_cast<ArrayPtr>(d.ReadRef());
+#endif
+#if !defined(DART_PRECOMPILED_RUNTIME) ||                                      \
+    (defined(DART_PRECOMPILED_RUNTIME) && !defined(PRODUCT))
       func->untag()->token_pos_ = d.ReadTokenPosition();
+#endif
+#if !defined(DART_PRECOMPILED_RUNTIME)
       func->untag()->end_token_pos_ = d.ReadTokenPosition();
       func->untag()->kernel_offset_ = d.Read<uint32_t>();
       func->untag()->unboxed_parameters_info_.Reset();
       func->untag()->packed_fields_ = d.Read<uint32_t>();
 #endif
+
       func->untag()->kind_tag_ = d.Read<uint32_t>();
 #if !defined(DART_PRECOMPILED_RUNTIME)
       func->untag()->usage_counter_ = 0;
diff --git a/runtime/vm/compiler/runtime_offsets_extracted.h b/runtime/vm/compiler/runtime_offsets_extracted.h
index 39650ff..c3a19ca 100644
--- a/runtime/vm/compiler/runtime_offsets_extracted.h
+++ b/runtime/vm/compiler/runtime_offsets_extracted.h
@@ -10102,7 +10102,7 @@
 static constexpr dart::compiler::target::word AOT_Function_data_offset = 24;
 static constexpr dart::compiler::target::word
     AOT_Function_entry_point_offset[] = {4, 8};
-static constexpr dart::compiler::target::word AOT_Function_kind_tag_offset = 36;
+static constexpr dart::compiler::target::word AOT_Function_kind_tag_offset = 40;
 static constexpr dart::compiler::target::word AOT_Function_signature_offset =
     20;
 static constexpr dart::compiler::target::word
@@ -10563,7 +10563,7 @@
     24;
 static constexpr dart::compiler::target::word AOT_Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Float64x2_InstanceSize = 24;
-static constexpr dart::compiler::target::word AOT_Function_InstanceSize = 40;
+static constexpr dart::compiler::target::word AOT_Function_InstanceSize = 44;
 static constexpr dart::compiler::target::word AOT_FunctionType_InstanceSize =
     40;
 static constexpr dart::compiler::target::word AOT_FutureOr_InstanceSize = 8;
@@ -10798,7 +10798,7 @@
 static constexpr dart::compiler::target::word AOT_Function_data_offset = 48;
 static constexpr dart::compiler::target::word
     AOT_Function_entry_point_offset[] = {8, 16};
-static constexpr dart::compiler::target::word AOT_Function_kind_tag_offset = 72;
+static constexpr dart::compiler::target::word AOT_Function_kind_tag_offset = 76;
 static constexpr dart::compiler::target::word AOT_Function_signature_offset =
     40;
 static constexpr dart::compiler::target::word
@@ -11500,7 +11500,7 @@
 static constexpr dart::compiler::target::word AOT_Function_data_offset = 48;
 static constexpr dart::compiler::target::word
     AOT_Function_entry_point_offset[] = {8, 16};
-static constexpr dart::compiler::target::word AOT_Function_kind_tag_offset = 72;
+static constexpr dart::compiler::target::word AOT_Function_kind_tag_offset = 76;
 static constexpr dart::compiler::target::word AOT_Function_signature_offset =
     40;
 static constexpr dart::compiler::target::word
@@ -12199,7 +12199,7 @@
 static constexpr dart::compiler::target::word AOT_Function_data_offset = 36;
 static constexpr dart::compiler::target::word
     AOT_Function_entry_point_offset[] = {8, 16};
-static constexpr dart::compiler::target::word AOT_Function_kind_tag_offset = 48;
+static constexpr dart::compiler::target::word AOT_Function_kind_tag_offset = 52;
 static constexpr dart::compiler::target::word AOT_Function_signature_offset =
     32;
 static constexpr dart::compiler::target::word
@@ -12897,7 +12897,7 @@
 static constexpr dart::compiler::target::word AOT_Function_data_offset = 36;
 static constexpr dart::compiler::target::word
     AOT_Function_entry_point_offset[] = {8, 16};
-static constexpr dart::compiler::target::word AOT_Function_kind_tag_offset = 48;
+static constexpr dart::compiler::target::word AOT_Function_kind_tag_offset = 52;
 static constexpr dart::compiler::target::word AOT_Function_signature_offset =
     32;
 static constexpr dart::compiler::target::word
@@ -13596,7 +13596,7 @@
 static constexpr dart::compiler::target::word AOT_Function_data_offset = 24;
 static constexpr dart::compiler::target::word
     AOT_Function_entry_point_offset[] = {4, 8};
-static constexpr dart::compiler::target::word AOT_Function_kind_tag_offset = 36;
+static constexpr dart::compiler::target::word AOT_Function_kind_tag_offset = 40;
 static constexpr dart::compiler::target::word AOT_Function_signature_offset =
     20;
 static constexpr dart::compiler::target::word
@@ -14059,7 +14059,7 @@
     24;
 static constexpr dart::compiler::target::word AOT_Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Float64x2_InstanceSize = 24;
-static constexpr dart::compiler::target::word AOT_Function_InstanceSize = 40;
+static constexpr dart::compiler::target::word AOT_Function_InstanceSize = 44;
 static constexpr dart::compiler::target::word AOT_FunctionType_InstanceSize =
     40;
 static constexpr dart::compiler::target::word AOT_FutureOr_InstanceSize = 8;
@@ -14294,7 +14294,7 @@
 static constexpr dart::compiler::target::word AOT_Function_data_offset = 48;
 static constexpr dart::compiler::target::word
     AOT_Function_entry_point_offset[] = {8, 16};
-static constexpr dart::compiler::target::word AOT_Function_kind_tag_offset = 72;
+static constexpr dart::compiler::target::word AOT_Function_kind_tag_offset = 76;
 static constexpr dart::compiler::target::word AOT_Function_signature_offset =
     40;
 static constexpr dart::compiler::target::word
diff --git a/runtime/vm/json_stream.cc b/runtime/vm/json_stream.cc
index 1d6e8ac..5e3fe1e 100644
--- a/runtime/vm/json_stream.cc
+++ b/runtime/vm/json_stream.cc
@@ -542,6 +542,16 @@
   AddLocation(script, token_pos);
 }
 
+void JSONObject::AddLocationLine(const Script& script, intptr_t line) const {
+  JSONObject location(this, "location");
+  location.AddProperty("type", "SourceLocation");
+  location.AddProperty("script", script);
+  location.AddProperty("tokenPos", TokenPosition::kNoSource);
+  if (line > 0) {
+    location.AddProperty("line", line);
+  }
+}
+
 void JSONObject::AddUnresolvedLocation(
     const BreakpointLocation* bpt_loc) const {
   ASSERT(!bpt_loc->IsResolved());
diff --git a/runtime/vm/json_stream.h b/runtime/vm/json_stream.h
index 3a6b523..21e0064 100644
--- a/runtime/vm/json_stream.h
+++ b/runtime/vm/json_stream.h
@@ -376,6 +376,7 @@
       TokenPosition end_token_pos = TokenPosition::kNoSource) const;
 
   void AddLocation(const BreakpointLocation* bpt_loc) const;
+  void AddLocationLine(const Script& script, intptr_t line) const;
 
   void AddUnresolvedLocation(const BreakpointLocation* bpt_loc) const;
 
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 52de6b1..3526a5c 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -9693,7 +9693,7 @@
   }
   if (IsImplicitGetterOrSetter()) {
     const auto& field = Field::Handle(accessor_field());
-    return field.Script();
+    return field.IsNull() ? Script::null() : field.Script();
   }
   Object& data = Object::Handle(this->data());
   if (data.IsArray()) {
@@ -9716,9 +9716,7 @@
   }
   if (IsClosureFunction()) {
     const Function& function = Function::Handle(parent_function());
-#if defined(DART_PRECOMPILED_RUNTIME)
     if (function.IsNull()) return Script::null();
-#endif
     return function.script();
   }
   ASSERT(obj.IsClass());
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 17080ec..06fae2d 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -3138,6 +3138,17 @@
 #endif
   }
 
+#if !defined(PRODUCT) &&                                                       \
+    (defined(DART_PRECOMPILER) || defined(DART_PRECOMPILED_RUNTIME))
+  int32_t line() const {
+    return untag()->token_pos_.Serialize();
+  }
+
+  void set_line(int32_t line) const {
+    StoreNonPointer(&untag()->token_pos_, TokenPosition::Deserialize(line));
+  }
+#endif
+
   // Returns the size of the source for this function.
   intptr_t SourceSize() const;
 
diff --git a/runtime/vm/object_service.cc b/runtime/vm/object_service.cc
index 0653fe4..fd957bc 100644
--- a/runtime/vm/object_service.cc
+++ b/runtime/vm/object_service.cc
@@ -346,7 +346,13 @@
 
   const Script& script = Script::Handle(this->script());
   if (!script.IsNull()) {
+#if defined(DART_PRECOMPILED_RUNTIME)
+    // Token position information is stripped in AOT snapshots, but the line
+    // number is still included.
+    jsobj.AddLocationLine(script, line());
+#else
     jsobj.AddLocation(script, token_pos(), end_token_pos());
+#endif  // defined(DART_PRECOMPILED_RUNTIME)
   }
 
   if (ref) {
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index d590114..eb60d27 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -1325,7 +1325,14 @@
   VISIT_TO(unoptimized_code);
 
   UnboxedParameterBitmap unboxed_parameters_info_;
+#endif
+
+#if !defined(DART_PRECOMPILED_RUNTIME) ||                                      \
+    (defined(DART_PRECOMPILED_RUNTIME) && !defined(PRODUCT))
   TokenPosition token_pos_;
+#endif
+
+#if !defined(DART_PRECOMPILED_RUNTIME)
   TokenPosition end_token_pos_;
 #endif
 
diff --git a/tools/VERSION b/tools/VERSION
index 01fed72..9d216f3 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 18
 PATCH 0
-PRERELEASE 164
+PRERELEASE 165
 PRERELEASE_PATCH 0
\ No newline at end of file