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
