Version 2.18.0-177.0.dev

Merge commit '6970e0907bf2cabe0d3e5da0846616d3ce972471' into 'dev'
diff --git a/pkg/dart2wasm/lib/dispatch_table.dart b/pkg/dart2wasm/lib/dispatch_table.dart
index f257241..06c6347 100644
--- a/pkg/dart2wasm/lib/dispatch_table.dart
+++ b/pkg/dart2wasm/lib/dispatch_table.dart
@@ -294,7 +294,7 @@
 
   void output() {
     w.Module m = translator.m;
-    w.Table wasmTable = m.addTable(table.length);
+    w.DefinedTable wasmTable = m.addTable(w.RefType.func(), table.length);
     for (int i = 0; i < table.length; i++) {
       Reference? target = table[i];
       if (target != null) {
diff --git a/pkg/front_end/lib/src/api_unstable/bazel_worker.dart b/pkg/front_end/lib/src/api_unstable/bazel_worker.dart
index 217bb40..f30a919 100644
--- a/pkg/front_end/lib/src/api_unstable/bazel_worker.dart
+++ b/pkg/front_end/lib/src/api_unstable/bazel_worker.dart
@@ -60,9 +60,9 @@
 Future<InitializedCompilerState> initializeIncrementalCompiler(
     InitializedCompilerState? oldState,
     Set<String> tags,
-    Uri sdkSummary,
-    Uri packagesFile,
-    Uri librariesSpecificationUri,
+    Uri? sdkSummary,
+    Uri? packagesFile,
+    Uri? librariesSpecificationUri,
     List<Uri> additionalDills,
     Map<Uri, List<int>> workerInputDigests,
     Target target,
@@ -100,9 +100,9 @@
 
 InitializedCompilerState initializeCompiler(
   InitializedCompilerState? oldState,
-  Uri sdkSummary,
-  Uri librariesSpecificationUri,
-  Uri packagesFile,
+  Uri? sdkSummary,
+  Uri? librariesSpecificationUri,
+  Uri? packagesFile,
   List<Uri> additionalDills,
   Target target,
   FileSystem fileSystem,
diff --git a/pkg/front_end/lib/src/api_unstable/modular_incremental_compilation.dart b/pkg/front_end/lib/src/api_unstable/modular_incremental_compilation.dart
index 346a4ae..88b68de 100644
--- a/pkg/front_end/lib/src/api_unstable/modular_incremental_compilation.dart
+++ b/pkg/front_end/lib/src/api_unstable/modular_incremental_compilation.dart
@@ -40,9 +40,9 @@
     InitializedCompilerState? oldState,
     Set<String> tags,
     List<Component> outputLoadedAdditionalDills,
-    Uri sdkSummary,
-    Uri packagesFile,
-    Uri librariesSpecificationUri,
+    Uri? sdkSummary,
+    Uri? packagesFile,
+    Uri? librariesSpecificationUri,
     List<Uri> additionalDills,
     Map<Uri, List<int>> workerInputDigests,
     Target target,
@@ -59,8 +59,9 @@
   bool isRetry = false;
   while (true) {
     try {
-      final List<int>? sdkDigest = workerInputDigests[sdkSummary];
-      if (sdkDigest == null) {
+      final List<int>? sdkDigest =
+          sdkSummary == null ? null : workerInputDigests[sdkSummary];
+      if (sdkDigest == null && sdkSummary != null) {
         throw new StateError("Expected to get digest for $sdkSummary");
       }
 
@@ -69,7 +70,8 @@
       Map<Uri, Uri> workerInputCacheLibs =
           oldState?.workerInputCacheLibs ?? new Map<Uri, Uri>();
 
-      WorkerInputComponent? cachedSdkInput = workerInputCache[sdkSummary];
+      WorkerInputComponent? cachedSdkInput =
+          sdkSummary == null ? null : workerInputCache[sdkSummary];
 
       IncrementalCompiler incrementalCompiler;
       CompilerOptions options;
@@ -84,8 +86,9 @@
               explicitExperimentalFlags) ||
           !equalMaps(oldState.options.environmentDefines, environmentDefines) ||
           !equalSets(oldState.tags, tags) ||
-          cachedSdkInput == null ||
-          !digestsEqual(cachedSdkInput.digest, sdkDigest)) {
+          (sdkSummary != null &&
+              (cachedSdkInput == null ||
+                  !digestsEqual(cachedSdkInput.digest, sdkDigest)))) {
         // No - or immediately not correct - previous state.
         // We'll load a new sdk, anything loaded already will have a wrong root.
         workerInputCache.clear();
@@ -107,28 +110,30 @@
           ..nnbdMode = nnbdMode;
 
         processedOpts = new ProcessedOptions(options: options);
-        cachedSdkInput = new WorkerInputComponent(
-            sdkDigest, (await processedOpts.loadSdkSummary(null))!);
-        workerInputCache[sdkSummary] = cachedSdkInput;
-        for (Library lib in cachedSdkInput.component.libraries) {
-          if (workerInputCacheLibs.containsKey(lib.importUri)) {
-            throw new StateError("Duplicate sources in sdk.");
+        if (sdkSummary != null && sdkDigest != null) {
+          cachedSdkInput = new WorkerInputComponent(
+              sdkDigest, (await processedOpts.loadSdkSummary(null))!);
+          workerInputCache[sdkSummary] = cachedSdkInput;
+          for (Library lib in cachedSdkInput.component.libraries) {
+            if (workerInputCacheLibs.containsKey(lib.importUri)) {
+              throw new StateError("Duplicate sources in sdk.");
+            }
+            workerInputCacheLibs[lib.importUri] = sdkSummary;
           }
-          workerInputCacheLibs[lib.importUri] = sdkSummary;
         }
 
         incrementalCompiler = new IncrementalCompiler.fromComponent(
             new CompilerContext(processedOpts),
-            cachedSdkInput.component,
+            cachedSdkInput?.component,
             outlineOnly);
       } else {
         options = oldState.options;
         processedOpts = oldState.processedOpts;
-        Component sdkComponent = cachedSdkInput.component;
+        Component? sdkComponent = cachedSdkInput?.component;
 
         // Make sure the canonical name root knows about the sdk - otherwise we
         // won't be able to link to it when loading more outlines.
-        sdkComponent.adoptChildren();
+        sdkComponent?.adoptChildren();
 
         // TODO(jensj): This is - at least currently - necessary,
         // although it's not entirely obvious why.
@@ -149,7 +154,7 @@
       }
 
       // Then read all the input summary components.
-      CanonicalName nameRoot = cachedSdkInput.component.root;
+      CanonicalName? nameRoot = cachedSdkInput?.component.root;
       Map<Uri, Uri>? libraryToInputDill;
       if (trackNeededDillLibraries) {
         libraryToInputDill = new Map<Uri, Uri>();
diff --git a/pkg/frontend_server/lib/compute_kernel.dart b/pkg/frontend_server/lib/compute_kernel.dart
index 2c70e9d..918c891 100644
--- a/pkg/frontend_server/lib/compute_kernel.dart
+++ b/pkg/frontend_server/lib/compute_kernel.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.8
-
 /// A library to invoke the CFE to compute kernel summary files.
 ///
 /// Used by `utils/bazel/kernel_worker.dart`.
@@ -119,7 +117,7 @@
 
 class ComputeKernelResult {
   final bool succeeded;
-  final fe.InitializedCompilerState previousState;
+  final fe.InitializedCompilerState? previousState;
 
   ComputeKernelResult(this.succeeded, this.previousState);
 }
@@ -134,9 +132,9 @@
 /// Returns whether or not the summary was successfully output.
 Future<ComputeKernelResult> computeKernel(List<String> args,
     {bool isWorker: false,
-    StringBuffer outputBuffer,
-    Map<Uri, List<int>> inputDigests,
-    fe.InitializedCompilerState previousState}) async {
+    StringBuffer? outputBuffer,
+    Map<Uri, List<int>>? inputDigests,
+    fe.InitializedCompilerState? previousState}) async {
   inputDigests ??= <Uri, List<int>>{};
   dynamic out = outputBuffer ?? stderr;
   bool succeeded = true;
@@ -172,7 +170,7 @@
   // TODO(sigmund,jakemac): make target mandatory. We allow null to be backwards
   // compatible while we migrate existing clients of this tool.
   var targetName =
-      (parsedArgs['target'] as String) ?? (summaryOnly ? 'ddc' : 'vm');
+      (parsedArgs['target'] as String?) ?? (summaryOnly ? 'ddc' : 'vm');
   var targetFlags = new TargetFlags(
       trackWidgetCreation: trackWidgetCreation,
       enableNullSafety: nnbdMode == fe.NnbdMode.Strong);
@@ -225,6 +223,7 @@
       break;
     default:
       out.writeln('error: unsupported target: $targetName');
+      return ComputeKernelResult(false, previousState);
   }
 
   List<Uri> linkedInputs =
@@ -239,6 +238,7 @@
   var environmentDefines = _parseEnvironmentDefines(parsedArgs['define']);
   var verbose = parsedArgs['verbose'] as bool;
   var verbosity = fe.Verbosity.parseArgument(parsedArgs['verbosity']);
+  Uri? sdkSummaryUri = toUriNullable(parsedArgs['dart-sdk-summary']);
 
   if (parsedArgs['use-incremental-compiler']) {
     usingIncrementalCompiler = true;
@@ -248,7 +248,9 @@
     // fake input digests).
     if (!isWorker && inputDigests.isEmpty) {
       previousState = null;
-      inputDigests[toUri(parsedArgs['dart-sdk-summary'])] = const [0];
+      if (sdkSummaryUri != null) {
+        inputDigests[sdkSummaryUri] = const [0];
+      }
       for (Uri uri in summaryInputs) {
         inputDigests[uri] = const [0];
       }
@@ -265,9 +267,9 @@
           "multiRootScheme=${fileSystem.markerScheme}",
           "multiRootRoots=${fileSystem.roots}",
         },
-        toUri(parsedArgs['dart-sdk-summary']),
-        toUri(parsedArgs['packages-file']),
-        toUri(parsedArgs['libraries-file']),
+        sdkSummaryUri,
+        toUriNullable(parsedArgs['packages-file']),
+        toUriNullable(parsedArgs['libraries-file']),
         [...summaryInputs, ...linkedInputs],
         inputDigests,
         target,
@@ -282,9 +284,9 @@
     state = fe.initializeCompiler(
         // TODO(sigmund): pass an old state once we can make use of it.
         null,
-        toUri(parsedArgs['dart-sdk-summary']),
-        toUri(parsedArgs['libraries-file']),
-        toUri(parsedArgs['packages-file']),
+        sdkSummaryUri,
+        toUriNullable(parsedArgs['libraries-file']),
+        toUriNullable(parsedArgs['packages-file']),
         [...summaryInputs, ...linkedInputs],
         target,
         fileSystem,
@@ -360,12 +362,12 @@
     }
   }
 
-  List<int> kernel;
+  List<int>? kernel;
   bool wroteUsedDills = false;
   if (usingIncrementalCompiler) {
     state.options.onDiagnostic = onDiagnostic;
     IncrementalCompilerResult incrementalCompilerResult =
-        await state.incrementalCompiler.computeDelta(
+        await state.incrementalCompiler!.computeDelta(
             entryPoints: sources,
             fullComponent: true,
             trackNeededDillLibraries: recordUsedInputs);
@@ -373,9 +375,9 @@
 
     if (recordUsedInputs) {
       Set<Uri> usedOutlines = {};
-      for (Library lib in incrementalCompilerResult.neededDillLibraries) {
+      for (Library lib in incrementalCompilerResult.neededDillLibraries!) {
         if (lib.importUri.isScheme("dart")) continue;
-        Uri uri = state.libraryToInputDill[lib.importUri];
+        Uri? uri = state.libraryToInputDill![lib.importUri];
         if (uri == null) {
           throw new StateError("Library ${lib.importUri} was recorded as used, "
               "but was not in the list of known libraries.");
@@ -388,7 +390,7 @@
       wroteUsedDills = true;
     }
 
-    kernel = await state.incrementalCompiler.context.runInContext((_) {
+    kernel = await state.incrementalCompiler!.context.runInContext((_) {
       if (summaryOnly) {
         incrementalComponent.uriToSource.clear();
         incrementalComponent.problemsAsJson = null;
@@ -412,13 +414,15 @@
     kernel = await fe.compileSummary(state, sources, onDiagnostic,
         includeOffsets: false);
   } else {
-    Component component = await fe
+    Component? component = await fe
         .compileComponent(state, sources, onDiagnostic, buildSummary: summary);
-    kernel = fe.serializeComponent(component,
-        filter: excludeNonSources
-            ? (library) => sources.contains(library.importUri)
-            : null,
-        includeOffsets: true);
+    if (component != null) {
+      kernel = fe.serializeComponent(component,
+          filter: excludeNonSources
+              ? (library) => sources.contains(library.importUri)
+              : null,
+          includeOffsets: true);
+    }
   }
   state.options.onDiagnostic = null; // See http://dartbug.com/36983.
 
@@ -467,8 +471,12 @@
       : super(targetFlags);
 }
 
-Uri toUri(String uriString) {
+Uri? toUriNullable(String? uriString) {
   if (uriString == null) return null;
+  return toUri(uriString);
+}
+
+Uri toUri(String uriString) {
   // Windows-style paths use '\', so convert them to '/' in case they've been
   // concatenated with Unix-style paths.
   return Uri.base.resolve(uriString.replaceAll("\\", "/"));
diff --git a/pkg/frontend_server/lib/src/strong_components.dart b/pkg/frontend_server/lib/src/strong_components.dart
index 0711f2d..a436b7c 100644
--- a/pkg/frontend_server/lib/src/strong_components.dart
+++ b/pkg/frontend_server/lib/src/strong_components.dart
@@ -2,7 +2,6 @@
 // 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:kernel/ast.dart';
 import 'package:kernel/util/graph.dart';
 
@@ -45,7 +44,7 @@
   final Uri mainUri;
 
   /// The filesystem instance for resolving files.
-  final FileSystem fileSystem;
+  final FileSystem? fileSystem;
 
   /// The set of libraries for each module URI.
   ///
@@ -68,10 +67,13 @@
     }
     // If we don't have a file uri, just use the first library in the
     // component.
-    Library entrypoint = component.libraries.firstWhere(
-        (Library library) =>
-            library.fileUri == mainUri || library.importUri == mainUri,
-        orElse: () => null);
+    Library? entrypoint;
+    for (Library library in component.libraries) {
+      if (library.fileUri == mainUri || library.importUri == mainUri) {
+        entrypoint = library;
+        break;
+      }
+    }
 
     if (entrypoint == null) {
       throw Exception('Could not find entrypoint ${mainUri} in Component.');
diff --git a/pkg/frontend_server/test/src/strong_components_test.dart b/pkg/frontend_server/test/src/strong_components_test.dart
index 2281e82..9bb6596 100644
--- a/pkg/frontend_server/test/src/strong_components_test.dart
+++ b/pkg/frontend_server/test/src/strong_components_test.dart
@@ -2,7 +2,6 @@
 // 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:frontend_server/src/strong_components.dart';
 import 'package:kernel/ast.dart';
 import 'package:test/test.dart';
diff --git a/pkg/vm_service/test/async_single_step_exception_test.dart b/pkg/vm_service/test/async_single_step_exception_test.dart
index 3a093de..31f5394 100644
--- a/pkg/vm_service/test/async_single_step_exception_test.dart
+++ b/pkg/vm_service/test/async_single_step_exception_test.dart
@@ -1,20 +1,18 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-//
-// VMOptions=--lazy-async-stacks
 
 import 'dart:developer';
 import 'common/service_test_common.dart';
 import 'common/test_helper.dart';
 
-const LINE_A = 20;
-const LINE_B = 21;
-const LINE_C = 26;
-const LINE_D = 28;
-const LINE_E = 31;
-const LINE_F = 34;
-const LINE_G = 36;
+const LINE_A = 18;
+const LINE_B = 19;
+const LINE_C = 24;
+const LINE_D = 26;
+const LINE_E = 29;
+const LINE_F = 32;
+const LINE_G = 34;
 
 helper() async {
   print('helper'); // LINE_A.
diff --git a/pkg/vm_service/test/async_single_step_into_test.dart b/pkg/vm_service/test/async_single_step_into_test.dart
index 604e00b..e5f77f7 100644
--- a/pkg/vm_service/test/async_single_step_into_test.dart
+++ b/pkg/vm_service/test/async_single_step_into_test.dart
@@ -1,17 +1,15 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-//
-// VMOptions=--lazy-async-stacks
 
 import 'dart:developer';
 import 'common/service_test_common.dart';
 import 'common/test_helper.dart';
 
-const LINE_A = 17;
-const LINE_B = 18;
-const LINE_C = 23;
-const LINE_D = 24;
+const LINE_A = 15;
+const LINE_B = 16;
+const LINE_C = 21;
+const LINE_D = 22;
 
 helper() async {
   print('helper'); // LINE_A.
diff --git a/pkg/vm_service/test/async_single_step_out_test.dart b/pkg/vm_service/test/async_single_step_out_test.dart
index 71f9517..c3da030 100644
--- a/pkg/vm_service/test/async_single_step_out_test.dart
+++ b/pkg/vm_service/test/async_single_step_out_test.dart
@@ -1,18 +1,16 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-//
-// VMOptions=--lazy-async-stacks
 
 import 'dart:developer';
 import 'common/service_test_common.dart';
 import 'common/test_helper.dart';
 
-const LINE_A = 18;
-const LINE_B = 19;
-const LINE_C = 24;
-const LINE_D = 25;
-const LINE_E = 26;
+const LINE_A = 16;
+const LINE_B = 17;
+const LINE_C = 22;
+const LINE_D = 23;
+const LINE_E = 24;
 
 helper() async {
   print('helper'); // LINE_A.
diff --git a/pkg/vm_service/test/async_star_single_step_into_test.dart b/pkg/vm_service/test/async_star_single_step_into_test.dart
index be3eba7..e722bbb 100644
--- a/pkg/vm_service/test/async_star_single_step_into_test.dart
+++ b/pkg/vm_service/test/async_star_single_step_into_test.dart
@@ -1,20 +1,18 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-//
-// VMOptions=--lazy-async-stacks
 
 import 'dart:developer';
 import 'common/service_test_common.dart';
 import 'common/test_helper.dart';
 
-const LINE_A = 20;
-const LINE_B = 21;
-const LINE_C = 25;
-const LINE_D = 29;
-const LINE_E = 35;
-const LINE_F = 36;
-const LINE_G = 27;
+const LINE_A = 18;
+const LINE_B = 19;
+const LINE_C = 23;
+const LINE_D = 27;
+const LINE_E = 33;
+const LINE_F = 34;
+const LINE_G = 25;
 
 foobar() async* {
   yield 1; // LINE_A.
diff --git a/pkg/vm_service/test/async_star_step_out_test.dart b/pkg/vm_service/test/async_star_step_out_test.dart
index 41d387f..b1eba2a 100644
--- a/pkg/vm_service/test/async_star_step_out_test.dart
+++ b/pkg/vm_service/test/async_star_step_out_test.dart
@@ -1,22 +1,20 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-//
-// VMOptions=--lazy-async-stacks
 
 import 'dart:developer';
 import 'common/service_test_common.dart';
 import 'common/test_helper.dart';
 
-const LINE_A = 22;
-const LINE_B = 23;
-const LINE_C = 27;
-const LINE_D = 31;
-const LINE_E = 38;
-const LINE_F = 39;
-const LINE_G = 40;
-const LINE_H = 29;
-const LINE_I = 33;
+const LINE_A = 20;
+const LINE_B = 21;
+const LINE_C = 25;
+const LINE_D = 29;
+const LINE_E = 36;
+const LINE_F = 37;
+const LINE_G = 38;
+const LINE_H = 27;
+const LINE_I = 31;
 
 foobar() async* {
   yield 1; // LINE_A.
diff --git a/pkg/vm_service/test/async_step_out_test.dart b/pkg/vm_service/test/async_step_out_test.dart
index e08ae35..7f37fe6 100644
--- a/pkg/vm_service/test/async_step_out_test.dart
+++ b/pkg/vm_service/test/async_step_out_test.dart
@@ -1,19 +1,17 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-//
-// VMOptions=--lazy-async-stacks
 
 import 'dart:developer';
 import 'common/service_test_common.dart';
 import 'common/test_helper.dart';
 
-const LINE_A = 19;
-const LINE_B = 20;
-const LINE_C = 21;
-const LINE_D = 26;
-const LINE_E = 27;
-const LINE_F = 28;
+const LINE_A = 17;
+const LINE_B = 18;
+const LINE_C = 19;
+const LINE_D = 24;
+const LINE_E = 25;
+const LINE_F = 26;
 
 helper() async {
   await null; // LINE_A.
diff --git a/pkg/vm_service/test/awaiter_async_stack_contents_2_test.dart b/pkg/vm_service/test/awaiter_async_stack_contents_2_test.dart
index 5cd7443..f5fb8d0 100644
--- a/pkg/vm_service/test/awaiter_async_stack_contents_2_test.dart
+++ b/pkg/vm_service/test/awaiter_async_stack_contents_2_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// VMOptions=--async-debugger --verbose-debug --lazy-async-stacks
+// VMOptions=--async-debugger --verbose-debug
 
 import 'dart:developer';
 import 'package:test/test.dart';
diff --git a/pkg/vm_service/test/awaiter_async_stack_contents_test.dart b/pkg/vm_service/test/awaiter_async_stack_contents_test.dart
index ac8ab8c..497a9f8 100644
--- a/pkg/vm_service/test/awaiter_async_stack_contents_test.dart
+++ b/pkg/vm_service/test/awaiter_async_stack_contents_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// VMOptions=--async-debugger --verbose-debug --lazy-async-stacks
+// VMOptions=--async-debugger --verbose-debug
 
 import 'dart:developer';
 import 'package:test/test.dart';
diff --git a/pkg/vm_service/test/causal_async_stack_contents_test.dart b/pkg/vm_service/test/causal_async_stack_contents_test.dart
index b28ece5..aad6986 100644
--- a/pkg/vm_service/test/causal_async_stack_contents_test.dart
+++ b/pkg/vm_service/test/causal_async_stack_contents_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// VMOptions=--lazy-async-stacks --verbose_debug
+// VMOptions=--verbose_debug
 
 import 'dart:developer';
 import 'package:test/test.dart';
diff --git a/pkg/vm_service/test/causal_async_stack_presence_test.dart b/pkg/vm_service/test/causal_async_stack_presence_test.dart
index 48bf16e..5eb2c46 100644
--- a/pkg/vm_service/test/causal_async_stack_presence_test.dart
+++ b/pkg/vm_service/test/causal_async_stack_presence_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// VMOptions=--lazy-async-stacks --verbose_debug
+// VMOptions=--verbose_debug
 
 import 'dart:developer';
 import 'package:test/test.dart';
diff --git a/pkg/vm_service/test/causal_async_star_stack_contents_test.dart b/pkg/vm_service/test/causal_async_star_stack_contents_test.dart
index 80f0a2d..3d0e892 100644
--- a/pkg/vm_service/test/causal_async_star_stack_contents_test.dart
+++ b/pkg/vm_service/test/causal_async_star_stack_contents_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// VMOptions=--lazy-async-stacks --verbose_debug
+// VMOptions=--verbose_debug
 
 import 'dart:developer';
 import 'package:test/test.dart';
diff --git a/pkg/vm_service/test/causal_async_star_stack_presence_test.dart b/pkg/vm_service/test/causal_async_star_stack_presence_test.dart
index 5ba0a7d..15dba5a 100644
--- a/pkg/vm_service/test/causal_async_star_stack_presence_test.dart
+++ b/pkg/vm_service/test/causal_async_star_stack_presence_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// VMOptions=--lazy-async-stacks --verbose_debug
+// VMOptions=--verbose_debug
 
 import 'dart:developer';
 import 'package:test/test.dart';
diff --git a/pkg/vm_service/test/common/test_helper.dart b/pkg/vm_service/test/common/test_helper.dart
index 9f46c4d..5363e31 100644
--- a/pkg/vm_service/test/common/test_helper.dart
+++ b/pkg/vm_service/test/common/test_helper.dart
@@ -17,7 +17,7 @@
 export 'service_test_common.dart' show IsolateTest, VMTest;
 
 /// The extra arguments to use
-const List<String> extraDebuggingArgs = ['--lazy-async-stacks'];
+const List<String> extraDebuggingArgs = [];
 
 /// Will be set to the http address of the VM's service protocol before
 /// any tests are invoked.
diff --git a/pkg/vm_service/test/eval_issue_49209_test.dart b/pkg/vm_service/test/eval_issue_49209_test.dart
new file mode 100644
index 0000000..a0bbd56
--- /dev/null
+++ b/pkg/vm_service/test/eval_issue_49209_test.dart
@@ -0,0 +1,49 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:developer';
+import 'package:test/test.dart';
+import 'package:vm_service/vm_service.dart';
+import 'common/service_test_common.dart';
+import 'common/test_helper.dart';
+
+void testFunction() {
+  final a = A<C>();
+  print(a.runtimeType);
+  debugger();
+}
+
+class A<T> {
+  A();
+}
+
+class B<T> {
+  final T data;
+  B(this.data);
+}
+
+class C extends B<C> {
+  C(C data) : super(data);
+}
+
+var tests = <IsolateTest>[
+  hasStoppedAtBreakpoint,
+
+  // Evaluate against top frame.
+  (VmService service, IsolateRef isolateRef) async {
+    final isolateId = isolateRef.id!;
+    var topFrame = 0;
+    final dynamic result = await service.evaluateInFrame(
+        isolateId, topFrame, 'a.runtimeType.toString()');
+    print(result);
+    expect(result.valueAsString, equals("A<C>"));
+  },
+];
+
+main([args = const <String>[]]) => runIsolateTests(
+      args,
+      tests,
+      'eval_issue_49209_test.dart',
+      testeeConcurrent: testFunction,
+    );
diff --git a/pkg/vm_service/test/get_stack_test.dart b/pkg/vm_service/test/get_stack_test.dart
index f1df2ba..d1b42d3 100644
--- a/pkg/vm_service/test/get_stack_test.dart
+++ b/pkg/vm_service/test/get_stack_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// VMOptions=--lazy-async-stacks --verbose_debug
+// VMOptions=--verbose_debug
 
 import 'dart:developer';
 
@@ -95,7 +95,7 @@
   (VmService service, IsolateRef isolateRef) async {
     final result = await service.getStack(isolateRef.id!);
 
-    expect(result.frames, hasLength(10));
+    expect(result.frames, hasLength(6));
     expect(result.asyncCausalFrames, hasLength(26));
     expect(result.awaiterFrames, hasLength(13));
 
@@ -105,10 +105,6 @@
       [equals('Regular'), anything], // Internal mech. ..
       [equals('Regular'), anything],
       [equals('Regular'), anything],
-      [equals('Regular'), anything],
-      [equals('Regular'), anything],
-      [equals('Regular'), anything],
-      [equals('Regular'), anything],
       [equals('Regular'), endsWith(' _RawReceivePortImpl._handleMessage')],
     ]);
 
diff --git a/pkg/wasm_builder/lib/src/module.dart b/pkg/wasm_builder/lib/src/module.dart
index f75618e..592b304 100644
--- a/pkg/wasm_builder/lib/src/module.dart
+++ b/pkg/wasm_builder/lib/src/module.dart
@@ -27,6 +27,7 @@
   BaseFunction? startFunction = null;
 
   bool anyFunctionsDefined = false;
+  bool anyTablesDefined = false;
   bool anyMemoriesDefined = false;
   bool anyGlobalsDefined = false;
   bool dataReferencedFromGlobalInitializer = false;
@@ -48,6 +49,7 @@
   /// All module imports (functions and globals).
   Iterable<Import> get imports => functions
       .whereType<Import>()
+      .followedBy(tables.whereType<Import>())
       .followedBy(memories.whereType<Import>())
       .followedBy(globals.whereType<Import>());
 
@@ -55,6 +57,9 @@
   Iterable<DefinedFunction> get definedFunctions =>
       functions.whereType<DefinedFunction>();
 
+  /// All tables defined in the module.
+  Iterable<DefinedTable> get definedTables => tables.whereType<DefinedTable>();
+
   /// All memories defined in the module.
   Iterable<DefinedMemory> get definedMemories =>
       memories.whereType<DefinedMemory>();
@@ -123,8 +128,9 @@
   }
 
   /// Add a new table to the module.
-  Table addTable(int minSize, [int? maxSize]) {
-    final table = Table(tables.length, minSize, maxSize);
+  DefinedTable addTable(RefType type, int minSize, [int? maxSize]) {
+    anyTablesDefined = true;
+    final table = DefinedTable(tables.length, type, minSize, maxSize);
     tables.add(table);
     return table;
   }
@@ -191,6 +197,22 @@
     return function;
   }
 
+  /// Import a table into the module.
+  ///
+  /// All imported tables must be specified before any tables are declared
+  /// using [Module.addTable].
+  ImportedTable importTable(
+      String module, String name, RefType type, int minSize,
+      [int? maxSize]) {
+    if (anyTablesDefined) {
+      throw "All table imports must be specified before any definitions.";
+    }
+    final table =
+        ImportedTable(module, name, tables.length, type, minSize, maxSize);
+    tables.add(table);
+    return table;
+  }
+
   /// Import a memory into the module.
   ///
   /// All imported memories must be specified before any memories are declared
@@ -233,6 +255,20 @@
     _addExport(FunctionExport(name, function));
   }
 
+  /// Export a table from the module.
+  ///
+  /// All exports must have unique names.
+  void exportTable(String name, Table table) {
+    _addExport(TableExport(name, table));
+  }
+
+  /// Export a memory from the module.
+  ///
+  /// All exports must have unique names.
+  void exportMemory(String name, Memory memory) {
+    _addExport(MemoryExport(name, memory));
+  }
+
   /// Export a global variable from the module.
   ///
   /// All exports must have unique names.
@@ -303,7 +339,7 @@
   }
 }
 
-/// An (imported or defined) Wasm function.
+/// An (imported or defined) function.
 abstract class BaseFunction {
   final int index;
   final FunctionType type;
@@ -313,7 +349,7 @@
   BaseFunction(this.index, this.type, this.functionName);
 }
 
-/// A function defined in the module.
+/// A function defined in a module.
 class DefinedFunction extends BaseFunction
     with SerializerMixin
     implements Serializable {
@@ -323,9 +359,8 @@
   /// The body of the function.
   late final Instructions body;
 
-  DefinedFunction(Module module, int index, FunctionType type,
-      [String? functionName])
-      : super(index, type, functionName) {
+  DefinedFunction(Module module, super.index, super.type,
+      [super.functionName]) {
     for (ValueType paramType in type.inputs) {
       addLocal(paramType);
     }
@@ -380,23 +415,18 @@
   String toString() => "$index";
 }
 
-/// A table in a module.
+/// An (imported or defined) table.
 class Table implements Serializable {
   final int index;
+  final RefType type;
   final int minSize;
   final int? maxSize;
-  final List<BaseFunction?> elements;
 
-  Table(this.index, this.minSize, this.maxSize)
-      : elements = List.filled(minSize, null);
-
-  void setElement(int index, BaseFunction function) {
-    elements[index] = function;
-  }
+  Table(this.index, this.type, this.minSize, this.maxSize);
 
   @override
   void serialize(Serializer s) {
-    s.writeByte(0x70); // funcref
+    s.write(type);
     if (maxSize == null) {
       s.writeByte(0x00);
       s.writeUnsigned(minSize);
@@ -408,7 +438,21 @@
   }
 }
 
-/// A memory in a module.
+/// A table defined in a module.
+class DefinedTable extends Table {
+  final List<BaseFunction?> elements;
+
+  DefinedTable(super.index, super.type, super.minSize, super.maxSize)
+      : elements = List.filled(minSize, null);
+
+  void setElement(int index, BaseFunction function) {
+    assert(type == RefType.func(),
+        "Elements are only supported for funcref tables");
+    elements[index] = function;
+  }
+}
+
+/// An (imported or defined) memory.
 class Memory {
   final int index;
   final bool shared;
@@ -438,9 +482,9 @@
   }
 }
 
+/// A memory defined in a module.
 class DefinedMemory extends Memory implements Serializable {
-  DefinedMemory(int index, bool shared, int minSize, int? maxSize)
-      : super(index, shared, minSize, maxSize);
+  DefinedMemory(super.index, super.shared, super.minSize, super.maxSize);
 
   @override
   void serialize(Serializer s) => _serializeLimits(s);
@@ -507,7 +551,7 @@
   }
 }
 
-/// An (imported or defined) global variable in a module.
+/// An (imported or defined) global variable.
 abstract class Global {
   final int index;
   final GlobalType type;
@@ -518,14 +562,13 @@
   String toString() => "$index";
 }
 
-/// A global variable defined in the module.
+/// A global variable defined in a module.
 class DefinedGlobal extends Global implements Serializable {
   final Instructions initializer;
 
-  DefinedGlobal(Module module, int index, GlobalType type)
+  DefinedGlobal(Module module, super.index, super.type)
       : initializer =
-            Instructions(module, [type.type], isGlobalInitializer: true),
-        super(index, type);
+            Instructions(module, [type.type], isGlobalInitializer: true);
 
   @override
   void serialize(Serializer s) {
@@ -535,7 +578,7 @@
   }
 }
 
-/// Any import (function or global).
+/// Any import (function, table, memory or global).
 abstract class Import implements Serializable {
   String get module;
   String get name;
@@ -546,9 +589,8 @@
   final String module;
   final String name;
 
-  ImportedFunction(this.module, this.name, int index, FunctionType type,
-      [String? functionName])
-      : super(index, type, functionName);
+  ImportedFunction(this.module, this.name, super.index, super.type,
+      [super.functionName]);
 
   @override
   void serialize(Serializer s) {
@@ -562,14 +604,30 @@
   String toString() => "$module.$name";
 }
 
+/// An imported table.
+class ImportedTable extends Table implements Import {
+  final String module;
+  final String name;
+
+  ImportedTable(this.module, this.name, super.index, super.type, super.minSize,
+      super.maxSize);
+
+  @override
+  void serialize(Serializer s) {
+    s.writeName(module);
+    s.writeName(name);
+    s.writeByte(0x01);
+    super.serialize(s);
+  }
+}
+
 /// An imported memory.
 class ImportedMemory extends Memory implements Import {
   final String module;
   final String name;
 
-  ImportedMemory(
-      this.module, this.name, int index, bool shared, int minSize, int? maxSize)
-      : super(index, shared, minSize, maxSize);
+  ImportedMemory(this.module, this.name, super.index, super.shared,
+      super.minSize, super.maxSize);
 
   @override
   void serialize(Serializer s) {
@@ -585,8 +643,7 @@
   final String module;
   final String name;
 
-  ImportedGlobal(this.module, this.name, int index, GlobalType type)
-      : super(index, type);
+  ImportedGlobal(this.module, this.name, super.index, super.type);
 
   @override
   void serialize(Serializer s) {
@@ -606,7 +663,7 @@
 class FunctionExport extends Export {
   final BaseFunction function;
 
-  FunctionExport(String name, this.function) : super(name);
+  FunctionExport(super.name, this.function);
 
   @override
   void serialize(Serializer s) {
@@ -616,10 +673,36 @@
   }
 }
 
+class TableExport extends Export {
+  final Table table;
+
+  TableExport(super.name, this.table);
+
+  @override
+  void serialize(Serializer s) {
+    s.writeName(name);
+    s.writeByte(0x01);
+    s.writeUnsigned(table.index);
+  }
+}
+
+class MemoryExport extends Export {
+  final Memory memory;
+
+  MemoryExport(super.name, this.memory);
+
+  @override
+  void serialize(Serializer s) {
+    s.writeName(name);
+    s.writeByte(0x02);
+    s.writeUnsigned(memory.index);
+  }
+}
+
 class GlobalExport extends Export {
   final Global global;
 
-  GlobalExport(String name, this.global) : super(name);
+  GlobalExport(super.name, this.global);
 
   @override
   void serialize(Serializer s) {
@@ -651,7 +734,7 @@
 }
 
 class TypeSection extends Section {
-  TypeSection(Module module) : super(module);
+  TypeSection(super.module);
 
   @override
   int get id => 1;
@@ -669,7 +752,7 @@
 }
 
 class ImportSection extends Section {
-  ImportSection(Module module) : super(module);
+  ImportSection(super.module);
 
   @override
   int get id => 2;
@@ -684,7 +767,7 @@
 }
 
 class FunctionSection extends Section {
-  FunctionSection(Module module) : super(module);
+  FunctionSection(super.module);
 
   @override
   int get id => 3;
@@ -702,22 +785,22 @@
 }
 
 class TableSection extends Section {
-  TableSection(Module module) : super(module);
+  TableSection(super.module);
 
   @override
   int get id => 4;
 
   @override
-  bool get isNotEmpty => module.tables.isNotEmpty;
+  bool get isNotEmpty => module.definedTables.isNotEmpty;
 
   @override
   void serializeContents() {
-    writeList(module.tables);
+    writeList(module.definedTables.toList());
   }
 }
 
 class MemorySection extends Section {
-  MemorySection(Module module) : super(module);
+  MemorySection(super.module);
 
   @override
   int get id => 5;
@@ -732,7 +815,7 @@
 }
 
 class TagSection extends Section {
-  TagSection(Module module) : super(module);
+  TagSection(super.module);
 
   @override
   int get id => 13;
@@ -747,7 +830,7 @@
 }
 
 class GlobalSection extends Section {
-  GlobalSection(Module module) : super(module);
+  GlobalSection(super.module);
 
   @override
   int get id => 6;
@@ -762,7 +845,7 @@
 }
 
 class ExportSection extends Section {
-  ExportSection(Module module) : super(module);
+  ExportSection(super.module);
 
   @override
   int get id => 7;
@@ -777,7 +860,7 @@
 }
 
 class StartSection extends Section {
-  StartSection(Module module) : super(module);
+  StartSection(super.module);
 
   @override
   int get id => 8;
@@ -800,10 +883,18 @@
 
   @override
   void serialize(Serializer s) {
-    s.writeUnsigned(table.index);
+    if (table.index != 0) {
+      s.writeByte(0x02);
+      s.writeUnsigned(table.index);
+    } else {
+      s.writeByte(0x00);
+    }
     s.writeByte(0x41); // i32.const
     s.writeSigned(startIndex);
     s.writeByte(0x0B); // end
+    if (table.index != 0) {
+      s.writeByte(0x00); // elemkind
+    }
     s.writeUnsigned(entries.length);
     for (var entry in entries) {
       s.writeUnsigned(entry.index);
@@ -812,21 +903,21 @@
 }
 
 class ElementSection extends Section {
-  ElementSection(Module module) : super(module);
+  ElementSection(super.module);
 
   @override
   int get id => 9;
 
   @override
   bool get isNotEmpty =>
-      module.tables.any((table) => table.elements.any((e) => e != null));
+      module.definedTables.any((table) => table.elements.any((e) => e != null));
 
   @override
   void serializeContents() {
     // Group nonempty element entries into contiguous stretches and serialize
     // each stretch as an element.
     List<_Element> elements = [];
-    for (Table table in module.tables) {
+    for (DefinedTable table in module.definedTables) {
       _Element? current = null;
       for (int i = 0; i < table.elements.length; i++) {
         BaseFunction? function = table.elements[i];
@@ -846,7 +937,7 @@
 }
 
 class DataCountSection extends Section {
-  DataCountSection(Module module) : super(module);
+  DataCountSection(super.module);
 
   @override
   int get id => 12;
@@ -861,7 +952,7 @@
 }
 
 class CodeSection extends Section {
-  CodeSection(Module module) : super(module);
+  CodeSection(super.module);
 
   @override
   int get id => 10;
@@ -876,7 +967,7 @@
 }
 
 class DataSection extends Section {
-  DataSection(Module module) : super(module);
+  DataSection(super.module);
 
   @override
   int get id => 11;
@@ -891,14 +982,14 @@
 }
 
 abstract class CustomSection extends Section {
-  CustomSection(Module module) : super(module);
+  CustomSection(super.module);
 
   @override
   int get id => 0;
 }
 
 class NameSection extends CustomSection {
-  NameSection(Module module) : super(module);
+  NameSection(super.module);
 
   @override
   bool get isNotEmpty => module.functionNameCount > 0;
diff --git a/pkg/wasm_builder/lib/src/types.dart b/pkg/wasm_builder/lib/src/types.dart
index 84494d3..8ed1f68 100644
--- a/pkg/wasm_builder/lib/src/types.dart
+++ b/pkg/wasm_builder/lib/src/types.dart
@@ -415,8 +415,7 @@
   final List<ValueType> inputs;
   final List<ValueType> outputs;
 
-  FunctionType(this.inputs, this.outputs, {HeapType? superType})
-      : super(superType: superType);
+  FunctionType(this.inputs, this.outputs, {super.superType});
 
   @override
   bool isStructuralSubtypeOf(HeapType other) {
@@ -454,7 +453,7 @@
 abstract class DataType extends DefType {
   final String name;
 
-  DataType(this.name, {HeapType? superType}) : super(superType: superType);
+  DataType(this.name, {super.superType});
 
   @override
   String toString() => name;
@@ -464,8 +463,7 @@
 class StructType extends DataType {
   final List<FieldType> fields = [];
 
-  StructType(String name, {Iterable<FieldType>? fields, HeapType? superType})
-      : super(name, superType: superType) {
+  StructType(super.name, {Iterable<FieldType>? fields, super.superType}) {
     if (fields != null) this.fields.addAll(fields);
   }
 
@@ -499,8 +497,7 @@
 class ArrayType extends DataType {
   late final FieldType elementType;
 
-  ArrayType(String name, {FieldType? elementType, HeapType? superType})
-      : super(name, superType: superType) {
+  ArrayType(super.name, {FieldType? elementType, super.superType}) {
     if (elementType != null) this.elementType = elementType;
   }
 
@@ -530,7 +527,7 @@
   final T type;
   final bool mutable;
 
-  _WithMutability(this.type, this.mutable);
+  _WithMutability(this.type, {required this.mutable});
 
   @override
   void serialize(Serializer s) {
@@ -546,14 +543,14 @@
 ///
 /// It consists of a type and a mutability.
 class GlobalType extends _WithMutability<ValueType> {
-  GlobalType(ValueType type, {bool mutable = true}) : super(type, mutable);
+  GlobalType(super.type, {super.mutable = true});
 }
 
 /// A type for a struct field or an array element.
 ///
 /// It consists of a type and a mutability.
 class FieldType extends _WithMutability<StorageType> {
-  FieldType(StorageType type, {bool mutable = true}) : super(type, mutable);
+  FieldType(super.type, {super.mutable = true});
 
   /// The `i8` storage type as a field type.
   FieldType.i8({bool mutable: true}) : this(PackedType.i8, mutable: mutable);
diff --git a/pkg/wasm_builder/lib/wasm_builder.dart b/pkg/wasm_builder/lib/wasm_builder.dart
index 7dfeb68..7ad807b 100644
--- a/pkg/wasm_builder/lib/wasm_builder.dart
+++ b/pkg/wasm_builder/lib/wasm_builder.dart
@@ -7,10 +7,15 @@
         DataSegment,
         DefinedFunction,
         DefinedGlobal,
+        DefinedMemory,
+        DefinedTable,
         BaseFunction,
         Global,
+        Import,
         ImportedFunction,
         ImportedGlobal,
+        ImportedMemory,
+        ImportedTable,
         Local,
         Memory,
         Module,
diff --git a/pkg/wasm_builder/pubspec.yaml b/pkg/wasm_builder/pubspec.yaml
index a4286a4..3d59b5a 100644
--- a/pkg/wasm_builder/pubspec.yaml
+++ b/pkg/wasm_builder/pubspec.yaml
@@ -4,4 +4,4 @@
 description: Generate binary Wasm modules
 
 environment:
-  sdk: '>=2.12.0'
+  sdk: '>=2.17.0'
diff --git a/runtime/bin/analyze_snapshot.cc b/runtime/bin/analyze_snapshot.cc
index 1eb4c14c..5a9011e 100644
--- a/runtime/bin/analyze_snapshot.cc
+++ b/runtime/bin/analyze_snapshot.cc
@@ -52,7 +52,6 @@
 "following default flags:                                                    \n"
 "--enable_mirrors=false                                                      \n"
 "--background_compilation                                                    \n"
-"--lazy_async_stacks                                                         \n"
 "--precompilation                                                            \n"
 "                                                                            \n"
 "\n");
@@ -157,7 +156,6 @@
   if (vm_options.count() == 0) {
     vm_options.AddArgument("--enable_mirrors=false");
     vm_options.AddArgument("--background_compilation");
-    vm_options.AddArgument("--lazy_async_stacks");
     vm_options.AddArgument("--precompilation");
   }
 
diff --git a/runtime/lib/stacktrace.cc b/runtime/lib/stacktrace.cc
index da73ef8..af80ae5 100644
--- a/runtime/lib/stacktrace.cc
+++ b/runtime/lib/stacktrace.cc
@@ -34,8 +34,9 @@
   return StackTrace::New(code_array, pc_offset_array);
 }
 
-static StackTracePtr CurrentSyncStackTraceLazy(Thread* thread,
-                                               intptr_t skip_frames = 1) {
+// Gets current stack trace for `thread`.
+static StackTracePtr CurrentStackTrace(Thread* thread,
+                                       intptr_t skip_frames = 1) {
   Zone* zone = thread->zone();
 
   const auto& code_array = GrowableObjectArray::ZoneHandle(
@@ -43,54 +44,19 @@
   GrowableArray<uword> pc_offset_array;
 
   // Collect the frames.
-  StackTraceUtils::CollectFramesLazy(thread, code_array, &pc_offset_array,
-                                     skip_frames);
+  StackTraceUtils::CollectFrames(thread, code_array, &pc_offset_array,
+                                 skip_frames);
 
   return CreateStackTraceObject(zone, code_array, pc_offset_array);
 }
 
-static StackTracePtr CurrentSyncStackTrace(Thread* thread,
-                                           intptr_t skip_frames = 1) {
-  Zone* zone = thread->zone();
-  const Function& null_function = Function::ZoneHandle(zone);
-
-  // Determine how big the stack trace is.
-  const intptr_t stack_trace_length =
-      StackTraceUtils::CountFrames(thread, skip_frames, null_function, nullptr);
-
-  // Allocate once.
-  const Array& code_array =
-      Array::ZoneHandle(zone, Array::New(stack_trace_length));
-  const TypedData& pc_offset_array = TypedData::ZoneHandle(
-      zone, TypedData::New(kUintPtrCid, stack_trace_length));
-
-  // Collect the frames.
-  const intptr_t collected_frames_count = StackTraceUtils::CollectFrames(
-      thread, code_array, pc_offset_array, 0, stack_trace_length, skip_frames);
-
-  ASSERT(collected_frames_count == stack_trace_length);
-
-  return StackTrace::New(code_array, pc_offset_array);
-}
-
-// Gets current stack trace for `thread`.
-static StackTracePtr CurrentStackTrace(Thread* thread,
-                                       bool for_async_function,
-                                       intptr_t skip_frames = 1) {
-  if (FLAG_lazy_async_stacks) {
-    return CurrentSyncStackTraceLazy(thread, skip_frames);
-  }
-  // Return the synchronous stack trace.
-  return CurrentSyncStackTrace(thread, skip_frames);
-}
-
 StackTracePtr GetStackTraceForException() {
   Thread* thread = Thread::Current();
-  return CurrentStackTrace(thread, false, 0);
+  return CurrentStackTrace(thread, 0);
 }
 
 DEFINE_NATIVE_ENTRY(StackTrace_current, 0, 0) {
-  return CurrentStackTrace(thread, false);
+  return CurrentStackTrace(thread);
 }
 
 static void AppendFrames(const GrowableObjectArray& code_list,
diff --git a/runtime/observatory/tests/service/async_single_step_exception_test.dart b/runtime/observatory/tests/service/async_single_step_exception_test.dart
index 544ba6f..2d9d6fb 100644
--- a/runtime/observatory/tests/service/async_single_step_exception_test.dart
+++ b/runtime/observatory/tests/service/async_single_step_exception_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// VMOptions=--async-debugger --verbose-debug --lazy-async-stacks
+// VMOptions=--async-debugger --verbose-debug
 
 import 'dart:developer';
 import 'service_test_common.dart';
diff --git a/runtime/observatory/tests/service/async_single_step_into_test.dart b/runtime/observatory/tests/service/async_single_step_into_test.dart
index 7477840..2685cac 100644
--- a/runtime/observatory/tests/service/async_single_step_into_test.dart
+++ b/runtime/observatory/tests/service/async_single_step_into_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// VMOptions=--async-debugger --verbose-debug --lazy-async-stacks
+// VMOptions=--async-debugger --verbose-debug
 
 import 'dart:developer';
 import 'service_test_common.dart';
diff --git a/runtime/observatory/tests/service/async_single_step_out_test.dart b/runtime/observatory/tests/service/async_single_step_out_test.dart
index e93c274..bf09b4d 100644
--- a/runtime/observatory/tests/service/async_single_step_out_test.dart
+++ b/runtime/observatory/tests/service/async_single_step_out_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// VMOptions=--async-debugger --verbose-debug --lazy-async-stacks
+// VMOptions=--async-debugger --verbose-debug
 
 import 'dart:developer';
 import 'service_test_common.dart';
diff --git a/runtime/observatory/tests/service/async_star_single_step_into_test.dart b/runtime/observatory/tests/service/async_star_single_step_into_test.dart
index ac8e6ba..1a3c2ad 100644
--- a/runtime/observatory/tests/service/async_star_single_step_into_test.dart
+++ b/runtime/observatory/tests/service/async_star_single_step_into_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// VMOptions=--async-debugger --verbose-debug --lazy-async-stacks
+// VMOptions=--async-debugger --verbose-debug
 
 import 'dart:developer';
 import 'service_test_common.dart';
diff --git a/runtime/observatory/tests/service/async_star_step_out_test.dart b/runtime/observatory/tests/service/async_star_step_out_test.dart
index 6e73174..f408caa 100644
--- a/runtime/observatory/tests/service/async_star_step_out_test.dart
+++ b/runtime/observatory/tests/service/async_star_step_out_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// VMOptions=--async-debugger --verbose-debug --lazy-async-stacks
+// VMOptions=--async-debugger --verbose-debug
 
 import 'dart:developer';
 import 'service_test_common.dart';
diff --git a/runtime/observatory/tests/service/async_step_out_test.dart b/runtime/observatory/tests/service/async_step_out_test.dart
index 4cce826..5359d1e 100644
--- a/runtime/observatory/tests/service/async_step_out_test.dart
+++ b/runtime/observatory/tests/service/async_step_out_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// VMOptions=--async-debugger --verbose-debug --lazy-async-stacks
+// VMOptions=--async-debugger --verbose-debug
 
 import 'dart:developer';
 import 'service_test_common.dart';
diff --git a/runtime/observatory/tests/service/awaiter_async_stack_contents_2_test.dart b/runtime/observatory/tests/service/awaiter_async_stack_contents_2_test.dart
index b2d2165..8016216 100644
--- a/runtime/observatory/tests/service/awaiter_async_stack_contents_2_test.dart
+++ b/runtime/observatory/tests/service/awaiter_async_stack_contents_2_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// VMOptions=--async-debugger --verbose-debug --lazy-async-stacks
+// VMOptions=--async-debugger --verbose-debug
 
 import 'dart:developer';
 import 'package:observatory/models.dart' as M;
diff --git a/runtime/observatory/tests/service/awaiter_async_stack_contents_test.dart b/runtime/observatory/tests/service/awaiter_async_stack_contents_test.dart
index 77eeed2..e3ea09c 100644
--- a/runtime/observatory/tests/service/awaiter_async_stack_contents_test.dart
+++ b/runtime/observatory/tests/service/awaiter_async_stack_contents_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// VMOptions=--async-debugger --verbose-debug --lazy-async-stacks
+// VMOptions=--async-debugger --verbose-debug
 
 import 'dart:developer';
 import 'package:observatory/models.dart' as M;
diff --git a/runtime/observatory/tests/service/causal_async_stack_contents_test.dart b/runtime/observatory/tests/service/causal_async_stack_contents_test.dart
index 3e4a8eb..6401df0 100644
--- a/runtime/observatory/tests/service/causal_async_stack_contents_test.dart
+++ b/runtime/observatory/tests/service/causal_async_stack_contents_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// VMOptions=--lazy-async-stacks --verbose_debug
+// VMOptions=--verbose_debug
 
 import 'dart:developer';
 import 'package:observatory/models.dart' as M;
diff --git a/runtime/observatory/tests/service/causal_async_stack_presence_test.dart b/runtime/observatory/tests/service/causal_async_stack_presence_test.dart
index 01331cd..008447e 100644
--- a/runtime/observatory/tests/service/causal_async_stack_presence_test.dart
+++ b/runtime/observatory/tests/service/causal_async_stack_presence_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// VMOptions=--lazy-async-stacks --verbose_debug
+// VMOptions=--verbose_debug
 
 import 'dart:developer';
 import 'package:observatory/service_io.dart';
diff --git a/runtime/observatory/tests/service/causal_async_star_stack_contents_test.dart b/runtime/observatory/tests/service/causal_async_star_stack_contents_test.dart
index 8d66a17a..d9f4a85 100644
--- a/runtime/observatory/tests/service/causal_async_star_stack_contents_test.dart
+++ b/runtime/observatory/tests/service/causal_async_star_stack_contents_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// VMOptions=--lazy-async-stacks --verbose_debug
+// VMOptions=--verbose_debug
 
 import 'dart:developer';
 import 'package:observatory/models.dart' as M;
diff --git a/runtime/observatory/tests/service/causal_async_star_stack_presence_test.dart b/runtime/observatory/tests/service/causal_async_star_stack_presence_test.dart
index 9b605cb..4015c42 100644
--- a/runtime/observatory/tests/service/causal_async_star_stack_presence_test.dart
+++ b/runtime/observatory/tests/service/causal_async_star_stack_presence_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// VMOptions=--lazy-async-stacks --verbose_debug
+// VMOptions=--verbose_debug
 
 import 'dart:developer';
 import 'package:observatory/service_io.dart';
diff --git a/runtime/observatory/tests/service/get_stack_limit_rpc_test.dart b/runtime/observatory/tests/service/get_stack_limit_rpc_test.dart
index b3e47e2..f8decf0 100644
--- a/runtime/observatory/tests/service/get_stack_limit_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_stack_limit_rpc_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.
 
-// VMOptions=--lazy-async-stacks
-
 import 'dart:async';
 import 'dart:developer';
 
@@ -53,7 +51,7 @@
     var frames = stack['frames'];
     var asyncFrames = stack['asyncCausalFrames'];
     var awaiterFrames = stack['awaiterFrames'];
-    expect(frames.length, greaterThanOrEqualTo(20));
+    expect(frames.length, greaterThanOrEqualTo(12));
     expect(asyncFrames.length, greaterThan(frames.length));
     expect(awaiterFrames.length, greaterThan(frames.length));
     expect(stack['truncated'], false);
diff --git a/runtime/observatory/tests/service/next_through_simple_async_test.dart b/runtime/observatory/tests/service/next_through_simple_async_test.dart
index bc2c3d5..7985874 100644
--- a/runtime/observatory/tests/service/next_through_simple_async_test.dart
+++ b/runtime/observatory/tests/service/next_through_simple_async_test.dart
@@ -1,14 +1,12 @@
 // Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-//
-// VMOptions=--lazy-async-stacks
 
 import 'test_helper.dart';
 import 'service_test_common.dart';
 import 'dart:io';
 
-const int LINE_A = 14;
+const int LINE_A = 12;
 const String file = "next_through_simple_async_test.dart";
 
 code() async {  // LINE_A
diff --git a/runtime/observatory/tests/service/next_through_simple_async_with_returns_test.dart b/runtime/observatory/tests/service/next_through_simple_async_with_returns_test.dart
index 9a3f234..f402762 100644
--- a/runtime/observatory/tests/service/next_through_simple_async_with_returns_test.dart
+++ b/runtime/observatory/tests/service/next_through_simple_async_with_returns_test.dart
@@ -1,14 +1,12 @@
 // Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-//
-// VMOptions=--lazy-async-stacks
 
 import 'test_helper.dart';
 import 'service_test_common.dart';
 import 'dart:io';
 
-const int LINE_A = 14;
+const int LINE_A = 12;
 const String file = "next_through_simple_async_with_returns_test.dart";
 
 code() async {  // LINE_A
diff --git a/runtime/observatory/tests/service/pause_on_unhandled_async_exceptions2_test.dart b/runtime/observatory/tests/service/pause_on_unhandled_async_exceptions2_test.dart
index 67f6901..4d06f0b 100644
--- a/runtime/observatory/tests/service/pause_on_unhandled_async_exceptions2_test.dart
+++ b/runtime/observatory/tests/service/pause_on_unhandled_async_exceptions2_test.dart
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// VMOptions=--async_debugger --lazy-async-stacks
-// VMOptions=--async_debugger --lazy-async-stacks --optimization-counter-threshold=5
+// VMOptions=--async_debugger
+// VMOptions=--async_debugger --optimization-counter-threshold=5
 
 import 'package:observatory/service_io.dart';
 import 'package:observatory/models.dart' as M;
diff --git a/runtime/observatory/tests/service/pause_on_unhandled_async_exceptions_test.dart b/runtime/observatory/tests/service/pause_on_unhandled_async_exceptions_test.dart
index fe636dd..1770b56 100644
--- a/runtime/observatory/tests/service/pause_on_unhandled_async_exceptions_test.dart
+++ b/runtime/observatory/tests/service/pause_on_unhandled_async_exceptions_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// VMOptions=--async_debugger --lazy-async-stacks
+// VMOptions=--async_debugger
 
 import 'package:observatory/service_io.dart';
 import 'package:observatory/models.dart' as M;
diff --git a/runtime/observatory/tests/service/test_helper.dart b/runtime/observatory/tests/service/test_helper.dart
index bf6ce73..02a6b0a 100644
--- a/runtime/observatory/tests/service/test_helper.dart
+++ b/runtime/observatory/tests/service/test_helper.dart
@@ -23,7 +23,7 @@
     const String.fromEnvironment('SERVICE_RESPONSE_SIZES_DIR');
 
 /// The extra arguments to use
-const List<String> extraDebuggingArgs = ['--lazy-async-stacks'];
+const List<String> extraDebuggingArgs = [];
 
 /// Will be set to the http address of the VM's service protocol before
 /// any tests are invoked.
diff --git a/runtime/observatory_2/tests/service_2/async_single_step_exception_test.dart b/runtime/observatory_2/tests/service_2/async_single_step_exception_test.dart
index 9982e0c..fcfdbc9 100644
--- a/runtime/observatory_2/tests/service_2/async_single_step_exception_test.dart
+++ b/runtime/observatory_2/tests/service_2/async_single_step_exception_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// VMOptions=--async-debugger --verbose-debug --lazy-async-stacks
+// VMOptions=--async-debugger --verbose-debug
 
 import 'dart:developer';
 import 'service_test_common.dart';
diff --git a/runtime/observatory_2/tests/service_2/async_single_step_into_test.dart b/runtime/observatory_2/tests/service_2/async_single_step_into_test.dart
index 7477840..2685cac 100644
--- a/runtime/observatory_2/tests/service_2/async_single_step_into_test.dart
+++ b/runtime/observatory_2/tests/service_2/async_single_step_into_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// VMOptions=--async-debugger --verbose-debug --lazy-async-stacks
+// VMOptions=--async-debugger --verbose-debug
 
 import 'dart:developer';
 import 'service_test_common.dart';
diff --git a/runtime/observatory_2/tests/service_2/async_single_step_out_test.dart b/runtime/observatory_2/tests/service_2/async_single_step_out_test.dart
index e93c274..bf09b4d 100644
--- a/runtime/observatory_2/tests/service_2/async_single_step_out_test.dart
+++ b/runtime/observatory_2/tests/service_2/async_single_step_out_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// VMOptions=--async-debugger --verbose-debug --lazy-async-stacks
+// VMOptions=--async-debugger --verbose-debug
 
 import 'dart:developer';
 import 'service_test_common.dart';
diff --git a/runtime/observatory_2/tests/service_2/async_star_single_step_into_test.dart b/runtime/observatory_2/tests/service_2/async_star_single_step_into_test.dart
index ac8e6ba..1a3c2ad 100644
--- a/runtime/observatory_2/tests/service_2/async_star_single_step_into_test.dart
+++ b/runtime/observatory_2/tests/service_2/async_star_single_step_into_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// VMOptions=--async-debugger --verbose-debug --lazy-async-stacks
+// VMOptions=--async-debugger --verbose-debug
 
 import 'dart:developer';
 import 'service_test_common.dart';
diff --git a/runtime/observatory_2/tests/service_2/async_star_step_out_test.dart b/runtime/observatory_2/tests/service_2/async_star_step_out_test.dart
index 6e73174..f408caa 100644
--- a/runtime/observatory_2/tests/service_2/async_star_step_out_test.dart
+++ b/runtime/observatory_2/tests/service_2/async_star_step_out_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// VMOptions=--async-debugger --verbose-debug --lazy-async-stacks
+// VMOptions=--async-debugger --verbose-debug
 
 import 'dart:developer';
 import 'service_test_common.dart';
diff --git a/runtime/observatory_2/tests/service_2/async_step_out_test.dart b/runtime/observatory_2/tests/service_2/async_step_out_test.dart
index 4cce826..5359d1e 100644
--- a/runtime/observatory_2/tests/service_2/async_step_out_test.dart
+++ b/runtime/observatory_2/tests/service_2/async_step_out_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// VMOptions=--async-debugger --verbose-debug --lazy-async-stacks
+// VMOptions=--async-debugger --verbose-debug
 
 import 'dart:developer';
 import 'service_test_common.dart';
diff --git a/runtime/observatory_2/tests/service_2/awaiter_async_stack_contents_2_test.dart b/runtime/observatory_2/tests/service_2/awaiter_async_stack_contents_2_test.dart
index 0df05fd..55ccaa1 100644
--- a/runtime/observatory_2/tests/service_2/awaiter_async_stack_contents_2_test.dart
+++ b/runtime/observatory_2/tests/service_2/awaiter_async_stack_contents_2_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// VMOptions=--async-debugger --verbose-debug --lazy-async-stacks
+// VMOptions=--async-debugger --verbose-debug
 
 import 'dart:developer';
 import 'package:observatory_2/models.dart' as M;
diff --git a/runtime/observatory_2/tests/service_2/awaiter_async_stack_contents_test.dart b/runtime/observatory_2/tests/service_2/awaiter_async_stack_contents_test.dart
index 9e0f8f3..792d7d4 100644
--- a/runtime/observatory_2/tests/service_2/awaiter_async_stack_contents_test.dart
+++ b/runtime/observatory_2/tests/service_2/awaiter_async_stack_contents_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// VMOptions=--async-debugger --verbose-debug --lazy-async-stacks
+// VMOptions=--async-debugger --verbose-debug
 
 import 'dart:developer';
 import 'package:observatory_2/models.dart' as M;
diff --git a/runtime/observatory_2/tests/service_2/causal_async_stack_contents_test.dart b/runtime/observatory_2/tests/service_2/causal_async_stack_contents_test.dart
index 7523c0f..c80155c 100644
--- a/runtime/observatory_2/tests/service_2/causal_async_stack_contents_test.dart
+++ b/runtime/observatory_2/tests/service_2/causal_async_stack_contents_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// VMOptions=--lazy-async-stacks --verbose_debug
+// VMOptions=--verbose_debug
 
 import 'dart:developer';
 import 'package:observatory_2/models.dart' as M;
diff --git a/runtime/observatory_2/tests/service_2/causal_async_stack_presence_test.dart b/runtime/observatory_2/tests/service_2/causal_async_stack_presence_test.dart
index cd9ef6a..71cc1c8 100644
--- a/runtime/observatory_2/tests/service_2/causal_async_stack_presence_test.dart
+++ b/runtime/observatory_2/tests/service_2/causal_async_stack_presence_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// VMOptions=--lazy-async-stacks --verbose_debug
+// VMOptions=--verbose_debug
 
 import 'dart:developer';
 import 'package:observatory_2/service_io.dart';
diff --git a/runtime/observatory_2/tests/service_2/causal_async_star_stack_contents_test.dart b/runtime/observatory_2/tests/service_2/causal_async_star_stack_contents_test.dart
index 5044d57..5f715f8 100644
--- a/runtime/observatory_2/tests/service_2/causal_async_star_stack_contents_test.dart
+++ b/runtime/observatory_2/tests/service_2/causal_async_star_stack_contents_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// VMOptions=--lazy-async-stacks --verbose_debug
+// VMOptions=--verbose_debug
 
 import 'dart:developer';
 import 'package:observatory_2/models.dart' as M;
diff --git a/runtime/observatory_2/tests/service_2/causal_async_star_stack_presence_test.dart b/runtime/observatory_2/tests/service_2/causal_async_star_stack_presence_test.dart
index 8acf40d..fa3eb74 100644
--- a/runtime/observatory_2/tests/service_2/causal_async_star_stack_presence_test.dart
+++ b/runtime/observatory_2/tests/service_2/causal_async_star_stack_presence_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// VMOptions=--lazy-async-stacks --verbose_debug
+// VMOptions=--verbose_debug
 
 import 'dart:developer';
 import 'package:observatory_2/service_io.dart';
diff --git a/runtime/observatory_2/tests/service_2/get_stack_limit_rpc_test.dart b/runtime/observatory_2/tests/service_2/get_stack_limit_rpc_test.dart
index dc9f253..8570a28 100644
--- a/runtime/observatory_2/tests/service_2/get_stack_limit_rpc_test.dart
+++ b/runtime/observatory_2/tests/service_2/get_stack_limit_rpc_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.
 
-// VMOptions=--lazy-async-stacks
-
 import 'dart:async';
 import 'dart:developer';
 
@@ -53,7 +51,7 @@
     var frames = stack['frames'];
     var asyncFrames = stack['asyncCausalFrames'];
     var awaiterFrames = stack['awaiterFrames'];
-    expect(frames.length, greaterThanOrEqualTo(20));
+    expect(frames.length, greaterThanOrEqualTo(12));
     expect(asyncFrames.length, greaterThan(frames.length));
     expect(awaiterFrames.length, greaterThan(frames.length));
     expect(stack['truncated'], false);
diff --git a/runtime/observatory_2/tests/service_2/next_through_simple_async_test.dart b/runtime/observatory_2/tests/service_2/next_through_simple_async_test.dart
index bc2c3d5..7985874 100644
--- a/runtime/observatory_2/tests/service_2/next_through_simple_async_test.dart
+++ b/runtime/observatory_2/tests/service_2/next_through_simple_async_test.dart
@@ -1,14 +1,12 @@
 // Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-//
-// VMOptions=--lazy-async-stacks
 
 import 'test_helper.dart';
 import 'service_test_common.dart';
 import 'dart:io';
 
-const int LINE_A = 14;
+const int LINE_A = 12;
 const String file = "next_through_simple_async_test.dart";
 
 code() async {  // LINE_A
diff --git a/runtime/observatory_2/tests/service_2/next_through_simple_async_with_returns_test.dart b/runtime/observatory_2/tests/service_2/next_through_simple_async_with_returns_test.dart
index 9a3f234..f402762 100644
--- a/runtime/observatory_2/tests/service_2/next_through_simple_async_with_returns_test.dart
+++ b/runtime/observatory_2/tests/service_2/next_through_simple_async_with_returns_test.dart
@@ -1,14 +1,12 @@
 // Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-//
-// VMOptions=--lazy-async-stacks
 
 import 'test_helper.dart';
 import 'service_test_common.dart';
 import 'dart:io';
 
-const int LINE_A = 14;
+const int LINE_A = 12;
 const String file = "next_through_simple_async_with_returns_test.dart";
 
 code() async {  // LINE_A
diff --git a/runtime/observatory_2/tests/service_2/pause_on_unhandled_async_exceptions2_test.dart b/runtime/observatory_2/tests/service_2/pause_on_unhandled_async_exceptions2_test.dart
index 50d9537..05f2e22 100644
--- a/runtime/observatory_2/tests/service_2/pause_on_unhandled_async_exceptions2_test.dart
+++ b/runtime/observatory_2/tests/service_2/pause_on_unhandled_async_exceptions2_test.dart
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// VMOptions=--async_debugger --lazy-async-stacks
-// VMOptions=--async_debugger --lazy-async-stacks --optimization-counter-threshold=5
+// VMOptions=--async_debugger
+// VMOptions=--async_debugger --optimization-counter-threshold=5
 
 import 'package:observatory_2/service_io.dart';
 import 'package:observatory_2/models.dart' as M;
diff --git a/runtime/observatory_2/tests/service_2/pause_on_unhandled_async_exceptions_test.dart b/runtime/observatory_2/tests/service_2/pause_on_unhandled_async_exceptions_test.dart
index d179cb6..58dff1f 100644
--- a/runtime/observatory_2/tests/service_2/pause_on_unhandled_async_exceptions_test.dart
+++ b/runtime/observatory_2/tests/service_2/pause_on_unhandled_async_exceptions_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// VMOptions=--async_debugger --lazy-async-stacks
+// VMOptions=--async_debugger
 
 import 'package:observatory_2/service_io.dart';
 import 'package:observatory_2/models.dart' as M;
diff --git a/runtime/observatory_2/tests/service_2/test_helper.dart b/runtime/observatory_2/tests/service_2/test_helper.dart
index b2667bf..881b6b6 100644
--- a/runtime/observatory_2/tests/service_2/test_helper.dart
+++ b/runtime/observatory_2/tests/service_2/test_helper.dart
@@ -25,7 +25,7 @@
     const String.fromEnvironment('SERVICE_RESPONSE_SIZES_DIR');
 
 /// The extra arguments to use
-const List<String> extraDebuggingArgs = ['--lazy-async-stacks'];
+const List<String> extraDebuggingArgs = [];
 
 /// Will be set to the http address of the VM's service protocol before
 /// any tests are invoked.
diff --git a/runtime/tests/vm/dart/causal_stacks/async_throws_stack_lazy_non_symbolic_test.dart b/runtime/tests/vm/dart/causal_stacks/async_throws_stack_lazy_non_symbolic_test.dart
index d131340..67efb30 100644
--- a/runtime/tests/vm/dart/causal_stacks/async_throws_stack_lazy_non_symbolic_test.dart
+++ b/runtime/tests/vm/dart/causal_stacks/async_throws_stack_lazy_non_symbolic_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// VMOptions=--dwarf-stack-traces --save-debugging-info=async_lazy_debug.so --lazy-async-stacks
+// VMOptions=--dwarf-stack-traces --save-debugging-info=async_lazy_debug.so
 
 import 'dart:async';
 import 'dart:io';
diff --git a/runtime/tests/vm/dart/causal_stacks/async_throws_stack_lazy_test.dart b/runtime/tests/vm/dart/causal_stacks/async_throws_stack_lazy_test.dart
index 26805f1..830b54a 100644
--- a/runtime/tests/vm/dart/causal_stacks/async_throws_stack_lazy_test.dart
+++ b/runtime/tests/vm/dart/causal_stacks/async_throws_stack_lazy_test.dart
@@ -1,8 +1,6 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-//
-// VMOptions=--lazy-async-stacks
 
 import 'dart:async';
 
diff --git a/runtime/tests/vm/dart/causal_stacks/async_throws_stack_no_causal_non_symbolic_test.dart b/runtime/tests/vm/dart/causal_stacks/async_throws_stack_no_causal_non_symbolic_test.dart
deleted file mode 100644
index c9dbb09..0000000
--- a/runtime/tests/vm/dart/causal_stacks/async_throws_stack_no_causal_non_symbolic_test.dart
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-//
-// VMOptions=--dwarf-stack-traces --save-debugging-info=async_no_causal_debug.so --no-lazy-async-stacks
-
-import 'dart:async';
-import 'dart:io';
-
-import 'utils.dart';
-
-Future<void> main(List<String> args) async {
-  // We won't have access to the debugging info file on Android.
-  if (Platform.isAndroid) return;
-
-  await doTestsNoCausalNoLazy('async_no_causal_debug.so');
-}
diff --git a/runtime/tests/vm/dart/causal_stacks/async_throws_stack_no_causal_test.dart b/runtime/tests/vm/dart/causal_stacks/async_throws_stack_no_causal_test.dart
deleted file mode 100644
index 84848c9..0000000
--- a/runtime/tests/vm/dart/causal_stacks/async_throws_stack_no_causal_test.dart
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-//
-// VMOptions=--no-lazy-async-stacks
-
-import 'dart:async';
-
-import 'utils.dart';
-
-Future<void> main(List<String> args) async => await doTestsNoCausalNoLazy();
diff --git a/runtime/tests/vm/dart/causal_stacks/flutter_regress_100441_test.dart b/runtime/tests/vm/dart/causal_stacks/flutter_regress_100441_test.dart
index b5ff8ad..effb0aa 100644
--- a/runtime/tests/vm/dart/causal_stacks/flutter_regress_100441_test.dart
+++ b/runtime/tests/vm/dart/causal_stacks/flutter_regress_100441_test.dart
@@ -1,8 +1,6 @@
 // Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-//
-// VMOptions=--lazy-async-stacks
 
 import 'dart:async';
 
diff --git a/runtime/tests/vm/dart/causal_stacks/utils.dart b/runtime/tests/vm/dart/causal_stacks/utils.dart
index 584fd6d..2269e31 100644
--- a/runtime/tests/vm/dart/causal_stacks/utils.dart
+++ b/runtime/tests/vm/dart/causal_stacks/utils.dart
@@ -302,209 +302,6 @@
 // Test "Suites":
 // ----
 
-// For: --no-lazy-async-stacks
-Future<void> doTestsNoCausalNoLazy([String? debugInfoFilename]) async {
-  {
-    final expected = const <String>[
-      r'^#0      throwSync \(.*/utils.dart:16(:3)?\)$',
-      r'^#1      allYield3 \(.*/utils.dart:39(:3)?\)$',
-      r'^#2      _RootZone.runUnary \(.+\)$',
-      // The rest are internal frames which we don't really care about.
-      IGNORE_REMAINING_STACK,
-    ];
-    await doTestAwait(allYield, expected, debugInfoFilename);
-    await doTestAwaitThen(allYield, expected, debugInfoFilename);
-    await doTestAwaitCatchError(allYield, expected, debugInfoFilename);
-  }
-
-  {
-    final expected = const <String>[
-      r'^#0      throwSync \(.*/utils.dart:16(:3)?\)$',
-      r'^#1      noYields3 \(.*/utils.dart:54(:3)?\)$',
-      r'^#2      noYields2 \(.*/utils.dart:50(:9)?\)$',
-      r'^#3      noYields \(.*/utils.dart:46(:9)?\)$',
-    ];
-    final postfix = const <String>[
-      r'^#5      doTestsNoCausalNoLazy ',
-      r'^#6      _RootZone.runUnary \(.+\)$',
-      // The rest are internal frames which we don't really care about.
-      IGNORE_REMAINING_STACK,
-    ];
-    await 0; // Don't let the `await do..`s chain together.
-    await doTestAwait(
-        noYields,
-        expected +
-            const <String>[
-              r'^#4      doTestAwait ',
-            ] +
-            postfix,
-        debugInfoFilename);
-    await 0; // Don't let the `await do..`s chain together.
-    await doTestAwaitThen(
-        noYields,
-        expected +
-            const <String>[
-              r'^#4      doTestAwaitThen ',
-            ] +
-            postfix,
-        debugInfoFilename);
-    await 0; // Don't let the `await do..`s chain together.
-    await doTestAwaitCatchError(
-        noYields,
-        expected +
-            const <String>[
-              r'^#4      doTestAwaitCatchError ',
-            ] +
-            postfix,
-        debugInfoFilename);
-  }
-
-  {
-    final expected = const <String>[
-      r'^#0      throwAsync \(.*/utils.dart:21(:3)?\)$',
-      r'^#1      _RootZone.runUnary \(.+\)$',
-      // The rest are internal frames which we don't really care about.
-      IGNORE_REMAINING_STACK,
-    ];
-    await doTestAwait(mixedYields, expected, debugInfoFilename);
-    await doTestAwaitThen(mixedYields, expected, debugInfoFilename);
-    await doTestAwaitCatchError(mixedYields, expected, debugInfoFilename);
-  }
-
-  {
-    final expected = const <String>[
-      r'^#0      throwAsync \(.*/utils.dart:21(:3)?\)$',
-      r'^#1      _RootZone.runUnary \(.+\)$',
-      // The rest are internal frames which we don't really care about.
-      IGNORE_REMAINING_STACK,
-    ];
-    await doTestAwait(syncSuffix, expected, debugInfoFilename);
-    await doTestAwaitThen(syncSuffix, expected, debugInfoFilename);
-    await doTestAwaitCatchError(syncSuffix, expected, debugInfoFilename);
-  }
-
-  {
-    final expected = const <String>[
-      r'^#0      throwAsync \(.*/utils.dart:21(:3)?\)$',
-      r'^#1      _RootZone.runUnary \(.+\)$',
-      // The rest are internal frames which we don't really care about.
-      IGNORE_REMAINING_STACK,
-    ];
-    await doTestAwait(nonAsyncNoStack, expected, debugInfoFilename);
-    await doTestAwaitThen(nonAsyncNoStack, expected, debugInfoFilename);
-    await doTestAwaitCatchError(nonAsyncNoStack, expected, debugInfoFilename);
-  }
-
-  {
-    final expected = const <String>[
-      r'^#0      throwSync \(.+/utils.dart:16(:3)?\)$',
-      r'^#1      asyncStarThrowSync \(.+/utils.dart:112(:11)?\)$',
-      r'^#2      _RootZone.runUnary \(.+\)$',
-      // The rest are internal frames which we don't really care about.
-      IGNORE_REMAINING_STACK,
-    ];
-    await doTestAwait(
-        awaitEveryAsyncStarThrowSync, expected, debugInfoFilename);
-    await doTestAwaitThen(
-        awaitEveryAsyncStarThrowSync, expected, debugInfoFilename);
-    await doTestAwaitCatchError(
-        awaitEveryAsyncStarThrowSync, expected, debugInfoFilename);
-  }
-
-  {
-    final expected = const <String>[
-      r'^#0      throwAsync \(.*/utils.dart:21(:3)?\)$',
-      r'^#1      _RootZone.runUnary \(.+\)$',
-      // The rest are internal frames which we don't really care about.
-      IGNORE_REMAINING_STACK,
-    ];
-    await doTestAwait(
-        awaitEveryAsyncStarThrowAsync, expected, debugInfoFilename);
-    await doTestAwaitThen(
-        awaitEveryAsyncStarThrowAsync, expected, debugInfoFilename);
-    await doTestAwaitCatchError(
-        awaitEveryAsyncStarThrowAsync, expected, debugInfoFilename);
-  }
-
-  {
-    final expected = const <String>[
-      r'^#0      throwAsync \(.*/utils.dart:21(:3)?\)$',
-      r'^#1      _RootZone.runUnary \(.+\)$',
-      // The rest are internal frames which we don't really care about.
-      IGNORE_REMAINING_STACK,
-    ];
-    await doTestAwait(listenAsyncStarThrowAsync, expected, debugInfoFilename);
-    await doTestAwaitThen(
-        listenAsyncStarThrowAsync, expected, debugInfoFilename);
-    await doTestAwaitCatchError(
-        listenAsyncStarThrowAsync, expected, debugInfoFilename);
-  }
-
-  {
-    final expected = const <String>[
-      r'#0      throwSync \(.*/utils.dart:16(:3)?\)$',
-      r'#1      allYield3 \(.*/utils.dart:39(:3)?\)$',
-      r'#2      _rootRunUnary \(.+\)$',
-      // The rest are internal frames which we don't really care about.
-      IGNORE_REMAINING_STACK,
-    ];
-    await doTestAwait(customErrorZone, expected, debugInfoFilename);
-    await doTestAwaitThen(customErrorZone, expected, debugInfoFilename);
-    await doTestAwaitCatchError(customErrorZone, expected, debugInfoFilename);
-  }
-
-  {
-    final expected = const <String>[
-      r'#0      throwAsync \(.*/utils.dart:21(:3)?\)$',
-      r'^#1      _RootZone.runUnary \(.+\)$',
-      // The rest are internal frames which we don't really care about.
-      IGNORE_REMAINING_STACK,
-    ];
-    await doTestAwait(awaitTimeout, expected, debugInfoFilename);
-    await doTestAwaitThen(awaitTimeout, expected, debugInfoFilename);
-    await doTestAwaitCatchError(awaitTimeout, expected, debugInfoFilename);
-  }
-
-  {
-    final expected = const <String>[
-      r'#0      throwAsync \(.*/utils.dart:21(:3)?\)$',
-      r'^#1      _RootZone.runUnary \(.+\)$',
-      // The rest are internal frames which we don't really care about.
-      IGNORE_REMAINING_STACK,
-    ];
-    await doTestAwait(awaitWait, expected, debugInfoFilename);
-    await doTestAwaitThen(awaitWait, expected, debugInfoFilename);
-    await doTestAwaitCatchError(awaitWait, expected, debugInfoFilename);
-  }
-
-  {
-    final expected = const <String>[
-      r'^#0      throwAsync \(.*/utils.dart:21(:3)?\)$',
-      r'^#1      _RootZone.runUnary \(.+\)$',
-      // The rest are internal frames which we don't really care about.
-      IGNORE_REMAINING_STACK,
-    ];
-    await doTestAwait(futureSyncWhenComplete, expected, debugInfoFilename);
-    await doTestAwaitThen(futureSyncWhenComplete, expected, debugInfoFilename);
-    await doTestAwaitCatchError(
-        futureSyncWhenComplete, expected, debugInfoFilename);
-  }
-
-  {
-    final expected = const <String>[
-      r'^#0      throwSync \(.*/utils.dart:16(:3)?\)$',
-      r'^#1      futureThen.<anonymous closure> \(.*/utils.dart:187(:5)?\)$',
-      r'^#2      _RootZone.runUnary \(.+\)$',
-      // The rest are internal frames which we don't really care about.
-      IGNORE_REMAINING_STACK,
-    ];
-    await doTestAwait(futureThen, expected, debugInfoFilename);
-    await doTestAwaitThen(futureThen, expected, debugInfoFilename);
-    await doTestAwaitCatchError(futureThen, expected, debugInfoFilename);
-  }
-}
-
-// For: --lazy-async-stacks
 Future<void> doTestsLazy([String? debugInfoFilename]) async {
   // allYield
   {
diff --git a/runtime/tests/vm/dart/regress40189_test.dart b/runtime/tests/vm/dart/regress40189_test.dart
index f857e5b..f37839a 100644
--- a/runtime/tests/vm/dart/regress40189_test.dart
+++ b/runtime/tests/vm/dart/regress40189_test.dart
@@ -1,8 +1,6 @@
 // Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-//
-// VMOptions=--lazy-async-stacks
 
 import "package:expect/expect.dart";
 
diff --git a/runtime/tests/vm/dart_2/causal_stacks/async_throws_stack_lazy_non_symbolic_test.dart b/runtime/tests/vm/dart_2/causal_stacks/async_throws_stack_lazy_non_symbolic_test.dart
index d4d9e46..af20a8f 100644
--- a/runtime/tests/vm/dart_2/causal_stacks/async_throws_stack_lazy_non_symbolic_test.dart
+++ b/runtime/tests/vm/dart_2/causal_stacks/async_throws_stack_lazy_non_symbolic_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// VMOptions=--dwarf-stack-traces --save-debugging-info=async_lazy_debug.so --lazy-async-stacks
+// VMOptions=--dwarf-stack-traces --save-debugging-info=async_lazy_debug.so
 
 // @dart = 2.9
 
diff --git a/runtime/tests/vm/dart_2/causal_stacks/async_throws_stack_lazy_test.dart b/runtime/tests/vm/dart_2/causal_stacks/async_throws_stack_lazy_test.dart
index ff202c8..00c1459 100644
--- a/runtime/tests/vm/dart_2/causal_stacks/async_throws_stack_lazy_test.dart
+++ b/runtime/tests/vm/dart_2/causal_stacks/async_throws_stack_lazy_test.dart
@@ -1,8 +1,6 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-//
-// VMOptions=--lazy-async-stacks
 
 // @dart = 2.9
 
diff --git a/runtime/tests/vm/dart_2/causal_stacks/async_throws_stack_no_causal_non_symbolic_test.dart b/runtime/tests/vm/dart_2/causal_stacks/async_throws_stack_no_causal_non_symbolic_test.dart
deleted file mode 100644
index a84014e..0000000
--- a/runtime/tests/vm/dart_2/causal_stacks/async_throws_stack_no_causal_non_symbolic_test.dart
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-//
-// VMOptions=--dwarf-stack-traces --save-debugging-info=async_no_causal_debug.so --no-lazy-async-stacks
-
-// @dart = 2.9
-
-import 'dart:async';
-import 'dart:io';
-
-import 'utils.dart';
-
-Future<void> main(List<String> args) async {
-  // We won't have access to the debugging info file on Android.
-  if (Platform.isAndroid) return;
-
-  await doTestsNoCausalNoLazy('async_no_causal_debug.so');
-}
diff --git a/runtime/tests/vm/dart_2/causal_stacks/async_throws_stack_no_causal_test.dart b/runtime/tests/vm/dart_2/causal_stacks/async_throws_stack_no_causal_test.dart
deleted file mode 100644
index 3afda58..0000000
--- a/runtime/tests/vm/dart_2/causal_stacks/async_throws_stack_no_causal_test.dart
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-//
-// VMOptions=--no-lazy-async-stacks
-
-// @dart = 2.9
-
-import 'dart:async';
-
-import 'utils.dart';
-
-Future<void> main(List<String> args) async => await doTestsNoCausalNoLazy();
diff --git a/runtime/tests/vm/dart_2/causal_stacks/flutter_regress_100441_test.dart b/runtime/tests/vm/dart_2/causal_stacks/flutter_regress_100441_test.dart
index 2d4d2ef..e6a749d 100644
--- a/runtime/tests/vm/dart_2/causal_stacks/flutter_regress_100441_test.dart
+++ b/runtime/tests/vm/dart_2/causal_stacks/flutter_regress_100441_test.dart
@@ -1,8 +1,6 @@
 // Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-//
-// VMOptions=--lazy-async-stacks
 
 // @dart = 2.9
 import 'dart:async';
diff --git a/runtime/tests/vm/dart_2/causal_stacks/utils.dart b/runtime/tests/vm/dart_2/causal_stacks/utils.dart
index 5ae06ed..d7c80d1 100644
--- a/runtime/tests/vm/dart_2/causal_stacks/utils.dart
+++ b/runtime/tests/vm/dart_2/causal_stacks/utils.dart
@@ -304,209 +304,6 @@
 // Test "Suites":
 // ----
 
-// For: --no-lazy-async-stacks
-Future<void> doTestsNoCausalNoLazy([String debugInfoFilename]) async {
-  {
-    final expected = const <String>[
-      r'^#0      throwSync \(.*/utils.dart:18(:3)?\)$',
-      r'^#1      allYield3 \(.*/utils.dart:41(:3)?\)$',
-      r'^#2      _RootZone.runUnary \(.+\)$',
-      // The rest are internal frames which we don't really care about.
-      IGNORE_REMAINING_STACK,
-    ];
-    await doTestAwait(allYield, expected, debugInfoFilename);
-    await doTestAwaitThen(allYield, expected, debugInfoFilename);
-    await doTestAwaitCatchError(allYield, expected, debugInfoFilename);
-  }
-
-  {
-    final expected = const <String>[
-      r'^#0      throwSync \(.*/utils.dart:18(:3)?\)$',
-      r'^#1      noYields3 \(.*/utils.dart:56(:3)?\)$',
-      r'^#2      noYields2 \(.*/utils.dart:52(:9)?\)$',
-      r'^#3      noYields \(.*/utils.dart:48(:9)?\)$',
-    ];
-    final postfix = const <String>[
-      r'^#5      doTestsNoCausalNoLazy ',
-      r'^#6      _RootZone.runUnary ',
-      // The rest are internal frames which we don't really care about.
-      IGNORE_REMAINING_STACK,
-    ];
-    await 0; // Don't let the `await do..`s chain together.
-    await doTestAwait(
-        noYields,
-        expected +
-            const <String>[
-              r'^#4      doTestAwait ',
-            ] +
-            postfix,
-        debugInfoFilename);
-    await 0; // Don't let the `await do..`s chain together.
-    await doTestAwaitThen(
-        noYields,
-        expected +
-            const <String>[
-              r'^#4      doTestAwaitThen ',
-            ] +
-            postfix,
-        debugInfoFilename);
-    await 0; // Don't let the `await do..`s chain together.
-    await doTestAwaitCatchError(
-        noYields,
-        expected +
-            const <String>[
-              r'^#4      doTestAwaitCatchError ',
-            ] +
-            postfix,
-        debugInfoFilename);
-  }
-
-  {
-    final expected = const <String>[
-      r'^#0      throwAsync \(.*/utils.dart:23(:3)?\)$',
-      r'^#1      _RootZone.runUnary \(.+\)$',
-      // The rest are internal frames which we don't really care about.
-      IGNORE_REMAINING_STACK,
-    ];
-    await doTestAwait(mixedYields, expected, debugInfoFilename);
-    await doTestAwaitThen(mixedYields, expected, debugInfoFilename);
-    await doTestAwaitCatchError(mixedYields, expected, debugInfoFilename);
-  }
-
-  {
-    final expected = const <String>[
-      r'^#0      throwAsync \(.*/utils.dart:23(:3)?\)$',
-      r'^#1      _RootZone.runUnary \(.+\)$',
-      // The rest are internal frames which we don't really care about.
-      IGNORE_REMAINING_STACK,
-    ];
-    await doTestAwait(syncSuffix, expected, debugInfoFilename);
-    await doTestAwaitThen(syncSuffix, expected, debugInfoFilename);
-    await doTestAwaitCatchError(syncSuffix, expected, debugInfoFilename);
-  }
-
-  {
-    final expected = const <String>[
-      r'^#0      throwAsync \(.*/utils.dart:23(:3)?\)$',
-      r'^#1      _RootZone.runUnary \(.+\)$',
-      // The rest are internal frames which we don't really care about.
-      IGNORE_REMAINING_STACK,
-    ];
-    await doTestAwait(nonAsyncNoStack, expected, debugInfoFilename);
-    await doTestAwaitThen(nonAsyncNoStack, expected, debugInfoFilename);
-    await doTestAwaitCatchError(nonAsyncNoStack, expected, debugInfoFilename);
-  }
-
-  {
-    final expected = const <String>[
-      r'^#0      throwSync \(.+/utils.dart:18(:3)?\)$',
-      r'^#1      asyncStarThrowSync \(.+/utils.dart:114(:11)?\)$',
-      r'^#2      _RootZone.runUnary \(.+\)$',
-      // The rest are internal frames which we don't really care about.
-      IGNORE_REMAINING_STACK,
-    ];
-    await doTestAwait(
-        awaitEveryAsyncStarThrowSync, expected, debugInfoFilename);
-    await doTestAwaitThen(
-        awaitEveryAsyncStarThrowSync, expected, debugInfoFilename);
-    await doTestAwaitCatchError(
-        awaitEveryAsyncStarThrowSync, expected, debugInfoFilename);
-  }
-
-  {
-    final expected = const <String>[
-      r'^#0      throwAsync \(.*/utils.dart:23(:3)?\)$',
-      r'^#1      _RootZone.runUnary \(.+\)$',
-      // The rest are internal frames which we don't really care about.
-      IGNORE_REMAINING_STACK,
-    ];
-    await doTestAwait(
-        awaitEveryAsyncStarThrowAsync, expected, debugInfoFilename);
-    await doTestAwaitThen(
-        awaitEveryAsyncStarThrowAsync, expected, debugInfoFilename);
-    await doTestAwaitCatchError(
-        awaitEveryAsyncStarThrowAsync, expected, debugInfoFilename);
-  }
-
-  {
-    final expected = const <String>[
-      r'^#0      throwAsync \(.*/utils.dart:23(:3)?\)$',
-      r'^#1      _RootZone.runUnary \(.+\)$',
-      // The rest are internal frames which we don't really care about.
-      IGNORE_REMAINING_STACK,
-    ];
-    await doTestAwait(listenAsyncStarThrowAsync, expected, debugInfoFilename);
-    await doTestAwaitThen(
-        listenAsyncStarThrowAsync, expected, debugInfoFilename);
-    await doTestAwaitCatchError(
-        listenAsyncStarThrowAsync, expected, debugInfoFilename);
-  }
-
-  {
-    final expected = const <String>[
-      r'#0      throwSync \(.*/utils.dart:18(:3)?\)$',
-      r'#1      allYield3 \(.*/utils.dart:41(:3)?\)$',
-      r'#2      _rootRunUnary ',
-      // The rest are internal frames which we don't really care about.
-      IGNORE_REMAINING_STACK,
-    ];
-    await doTestAwait(customErrorZone, expected, debugInfoFilename);
-    await doTestAwaitThen(customErrorZone, expected, debugInfoFilename);
-    await doTestAwaitCatchError(customErrorZone, expected, debugInfoFilename);
-  }
-
-  {
-    final expected = const <String>[
-      r'#0      throwAsync \(.*/utils.dart:23(:3)?\)$',
-      r'^#1      _RootZone.runUnary \(.+\)$',
-      // The rest are internal frames which we don't really care about.
-      IGNORE_REMAINING_STACK,
-    ];
-    await doTestAwait(awaitTimeout, expected, debugInfoFilename);
-    await doTestAwaitThen(awaitTimeout, expected, debugInfoFilename);
-    await doTestAwaitCatchError(awaitTimeout, expected, debugInfoFilename);
-  }
-
-  {
-    final expected = const <String>[
-      r'#0      throwAsync \(.*/utils.dart:23(:3)?\)$',
-      r'^#1      _RootZone.runUnary \(.+\)$',
-      // The rest are internal frames which we don't really care about.
-      IGNORE_REMAINING_STACK,
-    ];
-    await doTestAwait(awaitWait, expected, debugInfoFilename);
-    await doTestAwaitThen(awaitWait, expected, debugInfoFilename);
-    await doTestAwaitCatchError(awaitWait, expected, debugInfoFilename);
-  }
-
-  {
-    final expected = const <String>[
-      r'^#0      throwAsync \(.*/utils.dart:23(:3)?\)$',
-      r'^#1      _RootZone.runUnary \(.+\)$',
-      // The rest are internal frames which we don't really care about.
-      IGNORE_REMAINING_STACK,
-    ];
-    await doTestAwait(futureSyncWhenComplete, expected, debugInfoFilename);
-    await doTestAwaitThen(futureSyncWhenComplete, expected, debugInfoFilename);
-    await doTestAwaitCatchError(
-        futureSyncWhenComplete, expected, debugInfoFilename);
-  }
-
-  {
-    final expected = const <String>[
-      r'^#0      throwSync \(.*/utils.dart:18(:3)?\)$',
-      r'^#1      futureThen.<anonymous closure> \(.*/utils.dart:189(:5)?\)$',
-      r'^#2      _RootZone.runUnary \(.+\)$',
-      // The rest are internal frames which we don't really care about.
-      IGNORE_REMAINING_STACK,
-    ];
-    await doTestAwait(futureThen, expected, debugInfoFilename);
-    await doTestAwaitThen(futureThen, expected, debugInfoFilename);
-    await doTestAwaitCatchError(futureThen, expected, debugInfoFilename);
-  }
-}
-
-// For: --lazy-async-stacks
 Future<void> doTestsLazy([String debugInfoFilename]) async {
   // allYield
   {
diff --git a/runtime/tests/vm/dart_2/regress40189_test.dart b/runtime/tests/vm/dart_2/regress40189_test.dart
index cbc9f45..348e1ec 100644
--- a/runtime/tests/vm/dart_2/regress40189_test.dart
+++ b/runtime/tests/vm/dart_2/regress40189_test.dart
@@ -1,8 +1,6 @@
 // Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-//
-// VMOptions=--lazy-async-stacks
 
 // @dart = 2.9
 
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index 529c56d..0ccfd45 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -5639,7 +5639,7 @@
           // Note: Is..() methods use the modifiers set above, so order
           // matters.
           if (function.IsAsyncClosure() || function.IsAsyncGenClosure()) {
-            function.set_is_inlinable(!FLAG_lazy_async_stacks);
+            function.set_is_inlinable(false);
           }
           ASSERT(!function.IsCompactAsyncFunction());
           ASSERT(!function.IsCompactAsyncStarFunction());
diff --git a/runtime/vm/compiler/frontend/scope_builder.cc b/runtime/vm/compiler/frontend/scope_builder.cc
index 5151145..2db5f8f 100644
--- a/runtime/vm/compiler/frontend/scope_builder.cc
+++ b/runtime/vm/compiler/frontend/scope_builder.cc
@@ -1384,7 +1384,7 @@
   // Lift the special async vars out of the function body scope, into the
   // outer function declaration scope.
   // This way we can allocate them in the outermost context at fixed indices,
-  // allowing support for --lazy-async-stacks implementation to find awaiters.
+  // allowing support for async stack traces implementation to find awaiters.
   if (name.Equals(Symbols::AwaitJumpVar()) ||
       name.Equals(Symbols::AsyncFuture()) || name.Equals(Symbols::is_sync()) ||
       name.Equals(Symbols::Controller())) {
diff --git a/runtime/vm/compiler/jit/compiler.cc b/runtime/vm/compiler/jit/compiler.cc
index 5dacd56..bcfe3c9 100644
--- a/runtime/vm/compiler/jit/compiler.cc
+++ b/runtime/vm/compiler/jit/compiler.cc
@@ -102,7 +102,6 @@
     FLAG_reorder_basic_blocks = true;
     FLAG_use_field_guards = false;
     FLAG_use_cha_deopt = false;
-    FLAG_lazy_async_stacks = true;
 
 #if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
     // Set flags affecting runtime accordingly for gen_snapshot.
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index 31cc36f..ec145d7 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -1966,13 +1966,6 @@
 }
 
 DebuggerStackTrace* DebuggerStackTrace::CollectAsyncCausal() {
-  if (FLAG_lazy_async_stacks) {
-    return CollectAsyncLazy();
-  }
-  return nullptr;
-}
-
-DebuggerStackTrace* DebuggerStackTrace::CollectAsyncLazy() {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   Isolate* isolate = thread->isolate();
@@ -1996,9 +1989,8 @@
                                   &inlined_code, &deopt_frame);
   };
 
-  StackTraceUtils::CollectFramesLazy(thread, code_array, &pc_offset_array,
-                                     /*skip_frames=*/0, &on_sync_frame,
-                                     &has_async);
+  StackTraceUtils::CollectFrames(thread, code_array, &pc_offset_array,
+                                 /*skip_frames=*/0, &on_sync_frame, &has_async);
 
   // If the entire stack is sync, return no (async) trace.
   if (!has_async) {
@@ -4072,31 +4064,29 @@
   }
 
   // We need to manually set a synthetic breakpoint for async_op before entry.
-  if (FLAG_lazy_async_stacks) {
-    // async and async* functions always contain synthetic async_ops.
-    if ((frame->function().IsAsyncFunction() ||
-         frame->function().IsAsyncGenerator()) &&
-        !frame->function().IsSuspendableFunction()) {
-      ASSERT(!frame->GetSavedCurrentContext().IsNull());
-      ASSERT(frame->GetSavedCurrentContext().num_variables() >
-             Context::kAsyncFutureIndex);
+  // async and async* functions always contain synthetic async_ops.
+  if ((frame->function().IsAsyncFunction() ||
+       frame->function().IsAsyncGenerator()) &&
+      !frame->function().IsSuspendableFunction()) {
+    ASSERT(!frame->GetSavedCurrentContext().IsNull());
+    ASSERT(frame->GetSavedCurrentContext().num_variables() >
+           Context::kAsyncFutureIndex);
 
-      const Object& async_future = Object::Handle(
-          frame->GetSavedCurrentContext().At(Context::kAsyncFutureIndex));
+    const Object& async_future = Object::Handle(
+        frame->GetSavedCurrentContext().At(Context::kAsyncFutureIndex));
 
-      // Only set breakpoint when entering async_op the first time.
-      // :async_future should be uninitialised at this point:
-      if (async_future.IsNull()) {
-        const Function& async_op = Function::Handle(
-            ClosureFunctionsCache::GetUniqueInnerClosure(frame->function()));
-        if (!async_op.IsNull()) {
-          SetBreakpointAtAsyncOp(async_op);
-          // After setting the breakpoint we stop stepping and continue the
-          // debugger until the next breakpoint, to step over all the
-          // synthetic code.
-          Continue();
-          return Error::null();
-        }
+    // Only set breakpoint when entering async_op the first time.
+    // :async_future should be uninitialised at this point:
+    if (async_future.IsNull()) {
+      const Function& async_op = Function::Handle(
+          ClosureFunctionsCache::GetUniqueInnerClosure(frame->function()));
+      if (!async_op.IsNull()) {
+        SetBreakpointAtAsyncOp(async_op);
+        // After setting the breakpoint we stop stepping and continue the
+        // debugger until the next breakpoint, to step over all the
+        // synthetic code.
+        Continue();
+        return Error::null();
       }
     }
   }
diff --git a/runtime/vm/debugger.h b/runtime/vm/debugger.h
index 47e701f..56dfd6d 100644
--- a/runtime/vm/debugger.h
+++ b/runtime/vm/debugger.h
@@ -524,7 +524,6 @@
                         Array* deopt_frame);
 
   static DebuggerStackTrace* CollectAsyncCausal();
-  static DebuggerStackTrace* CollectAsyncLazy();
 
   ZoneGrowableArray<ActivationFrame*> trace_;
 
diff --git a/runtime/vm/flag_list.h b/runtime/vm/flag_list.h
index 462413c..46a7bd5 100644
--- a/runtime/vm/flag_list.h
+++ b/runtime/vm/flag_list.h
@@ -64,7 +64,6 @@
   P(code_comments, bool, false, "Include comments into code and disassembly.") \
   P(dwarf_stack_traces_mode, bool, false,                                      \
     "Use --[no-]dwarf-stack-traces instead.")                                  \
-  P(lazy_async_stacks, bool, true, "Reconstruct async stacks from listeners")  \
   P(lazy_dispatchers, bool, true, "Generate dispatchers lazily")               \
   R(dedup_instructions, true, bool, false,                                     \
     "Canonicalize instructions when precompiling.")
@@ -135,6 +134,7 @@
   P(idle_duration_micros, int, 500 * kMicrosecondsPerMillisecond,              \
     "Allow idle tasks to run for this long.")                                  \
   P(interpret_irregexp, bool, false, "Use irregexp bytecode interpreter")      \
+  P(lazy_async_stacks, bool, true, "Obsolete, ignored.")                       \
   P(link_natives_lazily, bool, false, "Link native calls lazily")              \
   R(log_marker_tasks, false, bool, false,                                      \
     "Log debugging information for old gen GC marking tasks.")                 \
diff --git a/runtime/vm/kernel_loader.cc b/runtime/vm/kernel_loader.cc
index ee8d3a6..e37a681 100644
--- a/runtime/vm/kernel_loader.cc
+++ b/runtime/vm/kernel_loader.cc
@@ -2056,17 +2056,17 @@
     switch (function_node_helper.dart_async_marker_) {
       case FunctionNodeHelper::kSyncStar:
         function.set_modifier(UntaggedFunction::kSyncGen);
-        function.set_is_visible(!FLAG_lazy_async_stacks);
+        function.set_is_visible(false);
         break;
       case FunctionNodeHelper::kAsync:
         function.set_modifier(UntaggedFunction::kAsync);
-        function.set_is_inlinable(!FLAG_lazy_async_stacks);
-        function.set_is_visible(!FLAG_lazy_async_stacks);
+        function.set_is_inlinable(false);
+        function.set_is_visible(false);
         break;
       case FunctionNodeHelper::kAsyncStar:
         function.set_modifier(UntaggedFunction::kAsyncGen);
-        function.set_is_inlinable(!FLAG_lazy_async_stacks);
-        function.set_is_visible(!FLAG_lazy_async_stacks);
+        function.set_is_inlinable(false);
+        function.set_is_visible(false);
         break;
       default:
         // no special modifier
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index c056360..85cf403 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -2881,6 +2881,13 @@
     output.Add(instance);
     return;
   }
+  if (type.IsTypeRef()) {
+    // A TypeRef is used to break cycles in the representation of types
+    // calling type class on it will cause an infinite recursion.
+    // We use null instead.
+    output.Add(instance);
+    return;
+  }
   const Class& cls = Class::Handle(type.type_class());
   const Library& lib = Library::Handle(zone, cls.library());
 
diff --git a/runtime/vm/stack_trace.cc b/runtime/vm/stack_trace.cc
index 671f58b..21ab60e 100644
--- a/runtime/vm/stack_trace.cc
+++ b/runtime/vm/stack_trace.cc
@@ -627,7 +627,7 @@
   }
 }
 
-void StackTraceUtils::CollectFramesLazy(
+void StackTraceUtils::CollectFrames(
     Thread* thread,
     const GrowableObjectArray& code_array,
     GrowableArray<uword>* pc_offset_array,
@@ -696,85 +696,4 @@
   return;
 }
 
-intptr_t StackTraceUtils::CountFrames(Thread* thread,
-                                      int skip_frames,
-                                      const Function& async_function,
-                                      bool* sync_async_end) {
-  Zone* zone = thread->zone();
-  intptr_t frame_count = 0;
-  DartFrameIterator frames(thread, StackFrameIterator::kNoCrossThreadIteration);
-  StackFrame* frame = frames.NextFrame();
-  ASSERT(frame != nullptr);  // We expect to find a dart invocation frame.
-  Function& function = Function::Handle(zone);
-  Code& code = Code::Handle(zone);
-  Closure& closure = Closure::Handle(zone);
-  const bool async_function_is_null = async_function.IsNull();
-
-  ASSERT(async_function_is_null || sync_async_end != nullptr);
-
-  for (; frame != nullptr; frame = frames.NextFrame()) {
-    if (skip_frames > 0) {
-      skip_frames--;
-      continue;
-    }
-    code = frame->LookupDartCode();
-    function = code.function();
-
-    frame_count++;
-
-    const bool function_is_null = function.IsNull();
-
-    if (!async_function_is_null && !function_is_null &&
-        function.parent_function() != Function::null()) {
-      if (async_function.ptr() == function.parent_function()) {
-        if (function.IsAsyncClosure() || function.IsAsyncGenClosure()) {
-          ObjectPtr* last_caller_obj =
-              reinterpret_cast<ObjectPtr*>(frame->GetCallerSp());
-          closure = FindClosureInFrame(last_caller_obj, function);
-          if (!closure.IsNull() &&
-              CallerClosureFinder::IsRunningAsync(closure)) {
-            *sync_async_end = false;
-            return frame_count;
-          }
-        }
-        break;
-      }
-    }
-  }
-
-  if (!async_function_is_null) {
-    *sync_async_end = true;
-  }
-
-  return frame_count;
-}
-
-intptr_t StackTraceUtils::CollectFrames(Thread* thread,
-                                        const Array& code_array,
-                                        const TypedData& pc_offset_array,
-                                        intptr_t array_offset,
-                                        intptr_t count,
-                                        int skip_frames) {
-  Zone* zone = thread->zone();
-  DartFrameIterator frames(thread, StackFrameIterator::kNoCrossThreadIteration);
-  StackFrame* frame = frames.NextFrame();
-  ASSERT(frame != NULL);  // We expect to find a dart invocation frame.
-  Code& code = Code::Handle(zone);
-  intptr_t collected_frames_count = 0;
-  for (; (frame != NULL) && (collected_frames_count < count);
-       frame = frames.NextFrame()) {
-    if (skip_frames > 0) {
-      skip_frames--;
-      continue;
-    }
-    code = frame->LookupDartCode();
-    const intptr_t pc_offset = frame->pc() - code.PayloadStart();
-    code_array.SetAt(array_offset, code);
-    pc_offset_array.SetUintPtr(array_offset * kWordSize, pc_offset);
-    array_offset++;
-    collected_frames_count++;
-  }
-  return collected_frames_count;
-}
-
 }  // namespace dart
diff --git a/runtime/vm/stack_trace.h b/runtime/vm/stack_trace.h
index 37df069..cfd558c 100644
--- a/runtime/vm/stack_trace.h
+++ b/runtime/vm/stack_trace.h
@@ -144,46 +144,17 @@
   /// hit which has yielded before (i.e. is not in sync-async case).
   ///
   /// From there on finds the closure of the async/async* frame and starts
-  /// traversing the listeners:
-  ///     while (closure != null) {
-  ///       yield_index = closure.context[Context::kAsyncJumpVarIndex]
-  ///       pc = closure.function.code.pc_descriptors.LookupPcFromYieldIndex(
-  ///           yield_index);
-  ///       <emit pc in frame>
-  ///       closure = closure.context[Context::kAsyncCompleterVarIndex]._future
-  ///           ._resultOrListeners.callback;
-  ///     }
+  /// traversing the listeners.
   ///
   /// If [on_sync_frames] is non-nullptr, it will be called for every
   /// synchronous frame which is collected.
-  static void CollectFramesLazy(
+  static void CollectFrames(
       Thread* thread,
       const GrowableObjectArray& code_array,
       GrowableArray<uword>* pc_offset_array,
       int skip_frames,
       std::function<void(StackFrame*)>* on_sync_frames = nullptr,
       bool* has_async = nullptr);
-
-  /// Counts the number of stack frames.
-  /// Skips over the first |skip_frames|.
-  /// If |async_function| is not null, stops at the function that has
-  /// |async_function| as its parent, and records in 'sync_async_end' whether
-  /// |async_function| was called synchronously.
-  static intptr_t CountFrames(Thread* thread,
-                              int skip_frames,
-                              const Function& async_function,
-                              bool* sync_async_end);
-
-  /// Collects |count| frames into |code_array| and |pc_offset_array|.
-  /// Writing begins at |array_offset|.
-  /// Skips over the first |skip_frames|.
-  /// Returns the number of frames collected.
-  static intptr_t CollectFrames(Thread* thread,
-                                const Array& code_array,
-                                const TypedData& pc_offset_array,
-                                intptr_t array_offset,
-                                intptr_t count,
-                                int skip_frames);
 };
 
 }  // namespace dart
diff --git a/sdk/lib/_internal/vm/lib/async_patch.dart b/sdk/lib/_internal/vm/lib/async_patch.dart
index 238cbb6..8e1d110 100644
--- a/sdk/lib/_internal/vm/lib/async_patch.dart
+++ b/sdk/lib/_internal/vm/lib/async_patch.dart
@@ -372,15 +372,69 @@
     }
   }
 
+  @pragma("vm:invisible")
+  @pragma("vm:prefer-inline")
+  void _awaitCompletedFuture(_Future future) {
+    assert(future._isComplete);
+    final zone = Zone._current;
+    if (future._hasError) {
+      @pragma("vm:invisible")
+      void run() {
+        final AsyncError asyncError =
+            unsafeCast<AsyncError>(future._resultOrListeners);
+        zone.runBinary(
+            unsafeCast<dynamic Function(Object, StackTrace)>(_errorCallback),
+            asyncError.error,
+            asyncError.stackTrace);
+      }
+
+      zone.scheduleMicrotask(run);
+    } else {
+      @pragma("vm:invisible")
+      void run() {
+        zone.runUnary(unsafeCast<dynamic Function(dynamic)>(_thenCallback),
+            future._resultOrListeners);
+      }
+
+      zone.scheduleMicrotask(run);
+    }
+  }
+
+  @pragma("vm:invisible")
+  @pragma("vm:prefer-inline")
+  void _awaitNotFuture(Object? object) {
+    final zone = Zone._current;
+    @pragma("vm:invisible")
+    void run() {
+      zone.runUnary(
+          unsafeCast<dynamic Function(dynamic)>(_thenCallback), object);
+    }
+
+    zone.scheduleMicrotask(run);
+  }
+
   @pragma("vm:entry-point", "call")
   @pragma("vm:invisible")
   Object? _await(Object? object) {
-    if (_trace) print('_awaitAsync (object=$object)');
+    if (_trace) print('_await (object=$object)');
     if (_thenCallback == null) {
       _createAsyncCallbacks();
     }
-    _awaitHelper(object, unsafeCast<dynamic Function(dynamic)>(_thenCallback),
-        unsafeCast<dynamic Function(Object, StackTrace)>(_errorCallback));
+    if (object is _Future) {
+      if (object._isComplete) {
+        _awaitCompletedFuture(object);
+      } else {
+        object._thenAwait<dynamic>(
+            unsafeCast<dynamic Function(dynamic)>(_thenCallback),
+            unsafeCast<dynamic Function(Object, StackTrace)>(_errorCallback));
+      }
+    } else if (object is! Future) {
+      _awaitNotFuture(object);
+    } else {
+      object.then(unsafeCast<dynamic Function(dynamic)>(_thenCallback),
+          onError:
+              unsafeCast<dynamic Function(Object, StackTrace)>(_errorCallback));
+    }
     return _functionData;
   }
 
@@ -392,14 +446,16 @@
           'returnValue=$returnValue)');
     }
     _Future future;
-    bool isSync = true;
     if (suspendState is _SuspendState) {
       future = unsafeCast<_Future>(suspendState._functionData);
     } else {
       future = unsafeCast<_Future>(suspendState);
-      isSync = false;
     }
-    _completeOnAsyncReturn(future, returnValue, isSync);
+    if (returnValue is Future) {
+      future._asyncCompleteUnchecked(returnValue);
+    } else {
+      future._completeWithValue(returnValue);
+    }
     return future;
   }
 
@@ -412,14 +468,12 @@
           'returnValue=$returnValue)');
     }
     _Future future;
-    bool isSync = true;
     if (suspendState is _SuspendState) {
       future = unsafeCast<_Future>(suspendState._functionData);
     } else {
       future = unsafeCast<_Future>(suspendState);
-      isSync = false;
     }
-    _completeWithNoFutureOnAsyncReturn(future, returnValue, isSync);
+    future._completeWithValue(returnValue);
     return future;
   }
 
diff --git a/tests/language/vm/lazy_async_exception_stack2_test.dart b/tests/language/vm/lazy_async_exception_stack2_test.dart
index bd9b8d5..9368e75 100644
--- a/tests/language/vm/lazy_async_exception_stack2_test.dart
+++ b/tests/language/vm/lazy_async_exception_stack2_test.dart
@@ -1,8 +1,6 @@
 // Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-//
-// VMOptions=--lazy-async-stacks
 
 import 'package:async_helper/async_minitest.dart';
 
diff --git a/tests/language/vm/lazy_async_exception_stack_test.dart b/tests/language/vm/lazy_async_exception_stack_test.dart
index 9b9705e..8811343 100644
--- a/tests/language/vm/lazy_async_exception_stack_test.dart
+++ b/tests/language/vm/lazy_async_exception_stack_test.dart
@@ -1,8 +1,6 @@
 // Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-//
-// VMOptions=--lazy-async-stacks
 
 import 'package:async_helper/async_minitest.dart';
 
@@ -36,8 +34,8 @@
     } catch (e, st) {
       expect(
           h.stringContainsInOrder(st.toString(), [
-            'thrower', '.dart:12', // no auto-format.
-            'generator', '.dart:21', // no auto-format.
+            'thrower', '.dart:10', // no auto-format.
+            'generator', '.dart:19', // no auto-format.
             '<asynchronous suspension>', // no auto-format.
             'foo', '.dart', // no auto-format.
             'main',
@@ -74,8 +72,8 @@
     } catch (e, st) {
       expect(
           h.stringContainsInOrder(st.toString(), [
-            'thrower', '.dart:12', // no auto-format.
-            'main.<anonymous closure>', '.dart:73', // no auto-format.
+            'thrower', '.dart:10', // no auto-format.
+            'main.<anonymous closure>', '.dart:71', // no auto-format.
           ]),
           isTrue);
     }
diff --git a/tests/language_2/vm/lazy_async_exception_stack2_test.dart b/tests/language_2/vm/lazy_async_exception_stack2_test.dart
index 81df6ce..9cff86a 100644
--- a/tests/language_2/vm/lazy_async_exception_stack2_test.dart
+++ b/tests/language_2/vm/lazy_async_exception_stack2_test.dart
@@ -1,8 +1,6 @@
 // Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-//
-// VMOptions=--lazy-async-stacks
 
 // @dart = 2.9
 
diff --git a/tests/language_2/vm/lazy_async_exception_stack_test.dart b/tests/language_2/vm/lazy_async_exception_stack_test.dart
index 46ee9ff..f037568 100644
--- a/tests/language_2/vm/lazy_async_exception_stack_test.dart
+++ b/tests/language_2/vm/lazy_async_exception_stack_test.dart
@@ -1,8 +1,6 @@
 // Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-//
-// VMOptions=--lazy-async-stacks
 
 // @dart = 2.9
 
@@ -38,8 +36,8 @@
     } catch (e, st) {
       expect(
           h.stringContainsInOrder(st.toString(), [
-            'thrower', '.dart:14', // no auto-format.
-            'generator', '.dart:23', // no auto-format.
+            'thrower', '.dart:12', // no auto-format.
+            'generator', '.dart:21', // no auto-format.
             '<asynchronous suspension>', // no auto-format.
             'foo', '.dart', // no auto-format.
             'main',
@@ -76,8 +74,8 @@
     } catch (e, st) {
       expect(
           h.stringContainsInOrder(st.toString(), [
-            'thrower', '.dart:14', // no auto-format.
-            'main.<anonymous closure>', '.dart:75', // no auto-format.
+            'thrower', '.dart:12', // no auto-format.
+            'main.<anonymous closure>', '.dart:73', // no auto-format.
           ]),
           isTrue);
     }
diff --git a/tests/standalone/lazy_async_stack_test.dart b/tests/standalone/lazy_async_stack_test.dart
index 652edb3..810f1ac 100644
--- a/tests/standalone/lazy_async_stack_test.dart
+++ b/tests/standalone/lazy_async_stack_test.dart
@@ -1,8 +1,6 @@
 // Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-//
-// VMOptions=--lazy-async-stacks
 
 import "package:expect/expect.dart";
 
diff --git a/tests/standalone_2/lazy_async_stack_test.dart b/tests/standalone_2/lazy_async_stack_test.dart
index 5066215..707d5ee 100644
--- a/tests/standalone_2/lazy_async_stack_test.dart
+++ b/tests/standalone_2/lazy_async_stack_test.dart
@@ -1,8 +1,6 @@
 // Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-//
-// VMOptions=--lazy-async-stacks
 
 // @dart = 2.9
 
diff --git a/tools/VERSION b/tools/VERSION
index 7e37bbe..4ffdc59 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 18
 PATCH 0
-PRERELEASE 176
+PRERELEASE 177
 PRERELEASE_PATCH 0
\ No newline at end of file