Version 2.14.0-155.0.dev

Merge commit '10cabb4d08709515d5034e42b16cab2fcfbb4af4' into 'dev'
diff --git a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
index ed754b3..73824a7 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
@@ -2162,6 +2162,18 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeDeprecateDartExt = messageDeprecateDartExt;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageDeprecateDartExt = const MessageCode(
+    "DeprecateDartExt",
+    severity: Severity.info,
+    message:
+        r"""Dart native extensions are deprecated and will be removed in the 2.15 release of Dart SDK.""",
+    tip:
+        r"""Migrate to using FFI instead (https://dart.dev/guides/libraries/c-interop)""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
         Message Function(
             int count, int count2, num _num1, num _num2, num _num3)>
diff --git a/pkg/analyzer/lib/src/dart/micro/resolve_file.dart b/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
index 6ce2ccd..8696184 100644
--- a/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
+++ b/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
@@ -447,8 +447,16 @@
         completionPath: path,
         performance: performance,
       );
-      var result =
-          libraryUnit.units!.firstWhere((element) => element.path == path);
+      var result = libraryUnit.units!
+          .firstWhereOrNull((element) => element.path == path);
+      // TODO(scheglov) Fix and remove.
+      if (result == null) {
+        throw StateError('''
+libraryFile.path: ${libraryFile.path}
+path: $path
+units: ${libraryUnit.units!.map((e) => '(${e.uri} = ${e.path})').toList()}
+''');
+      }
       return result;
     });
   }
diff --git a/pkg/analyzer/lib/src/generated/element_resolver.dart b/pkg/analyzer/lib/src/generated/element_resolver.dart
index 1da17d4..87c0e77 100644
--- a/pkg/analyzer/lib/src/generated/element_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/element_resolver.dart
@@ -83,10 +83,6 @@
   /// The element for the library containing the compilation unit being visited.
   final LibraryElement _definingLibrary;
 
-  /// Whether constant evaluation errors should be reported during resolution.
-  @Deprecated('This field is no longer used')
-  final bool reportConstEvaluationErrors;
-
   /// Helper for resolving properties on types.
   final TypePropertyResolver _typePropertyResolver;
 
@@ -95,8 +91,7 @@
   /// Initialize a newly created visitor to work for the given [_resolver] to
   /// resolve the nodes in a compilation unit.
   ElementResolver(this._resolver,
-      {this.reportConstEvaluationErrors = true,
-      MigratableAstInfoProvider migratableAstInfoProvider =
+      {MigratableAstInfoProvider migratableAstInfoProvider =
           const MigratableAstInfoProvider()})
       : _definingLibrary = _resolver.definingLibrary,
         _typePropertyResolver = _resolver.typePropertyResolver {
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 0aefca2..b8101a1 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -275,7 +275,6 @@
       AnalysisErrorListener errorListener,
       {FeatureSet? featureSet,
       Scope? nameScope,
-      bool reportConstEvaluationErrors = true,
       FlowAnalysisHelper? flowAnalysisHelper})
       : this._(
             inheritanceManager,
@@ -287,7 +286,6 @@
             featureSet ??
                 definingLibrary.context.analysisOptions.contextFeatures,
             nameScope,
-            reportConstEvaluationErrors,
             flowAnalysisHelper,
             const MigratableAstInfoProvider(),
             null);
@@ -301,7 +299,6 @@
       AnalysisErrorListener errorListener,
       FeatureSet featureSet,
       Scope? nameScope,
-      bool reportConstEvaluationErrors,
       this.flowAnalysis,
       this._migratableAstInfoProvider,
       MigrationResolutionHooks? migrationResolutionHooks)
@@ -371,7 +368,6 @@
       flowAnalysis,
     );
     elementResolver = ElementResolver(this,
-        reportConstEvaluationErrors: reportConstEvaluationErrors,
         migratableAstInfoProvider: _migratableAstInfoProvider);
     inferenceContext = InferenceContext._(this);
     typeAnalyzer = StaticTypeAnalyzer(this, migrationResolutionHooks);
@@ -2413,7 +2409,6 @@
             errorListener,
             featureSet,
             null,
-            true,
             FlowAnalysisHelperForMigration(
                 typeSystem, migrationResolutionHooks, true),
             migrationResolutionHooks,
diff --git a/pkg/analyzer/lib/src/summary2/ast_resolver.dart b/pkg/analyzer/lib/src/summary2/ast_resolver.dart
index 87dfa28..83100d7 100644
--- a/pkg/analyzer/lib/src/summary2/ast_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_resolver.dart
@@ -48,7 +48,6 @@
     _errorListener,
     featureSet: _featureSet,
     nameScope: _nameScope,
-    reportConstEvaluationErrors: false,
     flowAnalysisHelper: _flowAnalysis,
   );
 
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index b09820a..91da0d0 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -722,6 +722,7 @@
     String nativePath;
     const String nativeExtensionScheme = "dart-ext:";
     if (uri.startsWith(nativeExtensionScheme)) {
+      addProblem(messageDeprecateDartExt, charOffset, noLength, fileUri);
       String strippedUri = uri.substring(nativeExtensionScheme.length);
       if (strippedUri.startsWith("package")) {
         resolvedUri = resolve(this.importUri, strippedUri,
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index c890c30..709f244 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -174,6 +174,8 @@
 DeferredExtensionImport/part_wrapped_script: Fail
 DeferredPrefixDuplicated/example: Fail
 DeferredTypeAnnotation/example: Fail
+DeprecateDartExt/analyzerCode: Fail
+DeprecateDartExt/part_wrapped_script: Fail # Example uses import declaration.
 DillOutlineSummary/analyzerCode: Fail
 DillOutlineSummary/example: Fail
 DirectiveAfterDeclaration/part_wrapped_script1: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index b00bab2..c411adb 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -5180,3 +5180,10 @@
   script: |
     // @dart=2.9
     main() {}
+
+DeprecateDartExt:
+  template: "Dart native extensions are deprecated and will be removed in the 2.15 release of Dart SDK."
+  tip: "Migrate to using FFI instead (https://dart.dev/guides/libraries/c-interop)"
+  severity: INFO
+  script: |
+    import 'dart-ext:foo.dart';
diff --git a/pkg/front_end/test/spell_checking_list_messages.txt b/pkg/front_end/test/spell_checking_list_messages.txt
index 4d51529..808f9f1 100644
--- a/pkg/front_end/test/spell_checking_list_messages.txt
+++ b/pkg/front_end/test/spell_checking_list_messages.txt
@@ -34,6 +34,7 @@
 ffi
 flutter_runner
 futureor
+guides
 h
 https
 interop
@@ -42,6 +43,7 @@
 libraries.json
 list.filled
 loadlibrary
+migrate
 name.#name
 name.stack
 nameokempty
diff --git a/pkg/front_end/testcases/general/external_import.dart.weak.expect b/pkg/front_end/testcases/general/external_import.dart.weak.expect
index 0a7d177..36d348d1 100644
--- a/pkg/front_end/testcases/general/external_import.dart.weak.expect
+++ b/pkg/front_end/testcases/general/external_import.dart.weak.expect
@@ -2,6 +2,24 @@
 @#C4
 @#C6
 library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/external_import.dart:7:1: Info: Dart native extensions are deprecated and will be removed in the 2.15 release of Dart SDK.
+// Migrate to using FFI instead (https://dart.dev/guides/libraries/c-interop)
+// import 'dart-ext:here';
+// ^
+//
+// pkg/front_end/testcases/general/external_import.dart:8:1: Info: Dart native extensions are deprecated and will be removed in the 2.15 release of Dart SDK.
+// Migrate to using FFI instead (https://dart.dev/guides/libraries/c-interop)
+// import 'dart-ext:foo/../there';
+// ^
+//
+// pkg/front_end/testcases/general/external_import.dart:9:1: Info: Dart native extensions are deprecated and will be removed in the 2.15 release of Dart SDK.
+// Migrate to using FFI instead (https://dart.dev/guides/libraries/c-interop)
+// import 'dart-ext:/usr/local/somewhere';
+// ^
+//
 import self as self;
 import "dart:_internal" as _in;
 
diff --git a/pkg/front_end/testcases/general/external_import.dart.weak.outline.expect b/pkg/front_end/testcases/general/external_import.dart.weak.outline.expect
index c82b9e6..046113e 100644
--- a/pkg/front_end/testcases/general/external_import.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/external_import.dart.weak.outline.expect
@@ -2,6 +2,24 @@
 @dart._internal::ExternalName::•("dart-ext:foo/../there")
 @dart._internal::ExternalName::•("dart-ext:/usr/local/somewhere")
 library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/external_import.dart:7:1: Info: Dart native extensions are deprecated and will be removed in the 2.15 release of Dart SDK.
+// Migrate to using FFI instead (https://dart.dev/guides/libraries/c-interop)
+// import 'dart-ext:here';
+// ^
+//
+// pkg/front_end/testcases/general/external_import.dart:8:1: Info: Dart native extensions are deprecated and will be removed in the 2.15 release of Dart SDK.
+// Migrate to using FFI instead (https://dart.dev/guides/libraries/c-interop)
+// import 'dart-ext:foo/../there';
+// ^
+//
+// pkg/front_end/testcases/general/external_import.dart:9:1: Info: Dart native extensions are deprecated and will be removed in the 2.15 release of Dart SDK.
+// Migrate to using FFI instead (https://dart.dev/guides/libraries/c-interop)
+// import 'dart-ext:/usr/local/somewhere';
+// ^
+//
 import self as self;
 import "dart:_internal" as _in;
 
diff --git a/pkg/front_end/testcases/general/external_import.dart.weak.transformed.expect b/pkg/front_end/testcases/general/external_import.dart.weak.transformed.expect
index 0a7d177..36d348d1 100644
--- a/pkg/front_end/testcases/general/external_import.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/external_import.dart.weak.transformed.expect
@@ -2,6 +2,24 @@
 @#C4
 @#C6
 library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/external_import.dart:7:1: Info: Dart native extensions are deprecated and will be removed in the 2.15 release of Dart SDK.
+// Migrate to using FFI instead (https://dart.dev/guides/libraries/c-interop)
+// import 'dart-ext:here';
+// ^
+//
+// pkg/front_end/testcases/general/external_import.dart:8:1: Info: Dart native extensions are deprecated and will be removed in the 2.15 release of Dart SDK.
+// Migrate to using FFI instead (https://dart.dev/guides/libraries/c-interop)
+// import 'dart-ext:foo/../there';
+// ^
+//
+// pkg/front_end/testcases/general/external_import.dart:9:1: Info: Dart native extensions are deprecated and will be removed in the 2.15 release of Dart SDK.
+// Migrate to using FFI instead (https://dart.dev/guides/libraries/c-interop)
+// import 'dart-ext:/usr/local/somewhere';
+// ^
+//
 import self as self;
 import "dart:_internal" as _in;
 
diff --git a/runtime/tests/concurrency/stress_test_list.json b/runtime/tests/concurrency/stress_test_list.json
index 4044c33..502555d 100644
--- a/runtime/tests/concurrency/stress_test_list.json
+++ b/runtime/tests/concurrency/stress_test_list.json
@@ -2696,7 +2696,6 @@
     "../../../tests/language/unsorted/cyclic_default_values_test.dart",
     "../../../tests/language/unsorted/default_implementation_test.dart",
     "../../../tests/language/unsorted/default_init_test.dart",
-    "../../../tests/language/unsorted/disassemble_test.dart",
     "../../../tests/language/unsorted/efficient_length_warning_test.dart",
     "../../../tests/language/unsorted/emit_const_fields_test.dart",
     "../../../tests/language/unsorted/expect_test.dart",
@@ -6059,7 +6058,6 @@
     "../../../tests/language_2/unsorted/cyclic_default_values_test.dart",
     "../../../tests/language_2/unsorted/default_implementation_test.dart",
     "../../../tests/language_2/unsorted/default_init_test.dart",
-    "../../../tests/language_2/unsorted/disassemble_test.dart",
     "../../../tests/language_2/unsorted/efficient_length_warning_test.dart",
     "../../../tests/language_2/unsorted/emit_const_fields_test.dart",
     "../../../tests/language_2/unsorted/expect_test.dart",
diff --git a/runtime/tests/vm/dart/disassemble_aot_test.dart b/runtime/tests/vm/dart/disassemble_aot_test.dart
new file mode 100644
index 0000000..1ad2312
--- /dev/null
+++ b/runtime/tests/vm/dart/disassemble_aot_test.dart
@@ -0,0 +1,48 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Tests proper object recognition in disassembler.
+import 'dart:async';
+import 'dart:io';
+
+import 'package:expect/expect.dart';
+import 'package:path/path.dart' as path;
+
+import 'use_flag_test_helper.dart';
+
+Future<void> main(List<String> args) async {
+  if (Platform.isAndroid) {
+    return; // SDK tree and gen_snapshot not available on the test device.
+  }
+
+  final buildDir = path.dirname(Platform.executable);
+  final sdkDir = path.dirname(path.dirname(buildDir));
+  final platformDill = path.join(buildDir, 'vm_platform_strong.dill');
+  final genSnapshot = path.join(buildDir, 'gen_snapshot');
+
+  await withTempDir('disassemble_aot', (String tempDir) async {
+    final scriptDill = path.join(tempDir, 'out.dill');
+
+    // Compile script to Kernel IR.
+    await run('pkg/vm/tool/gen_kernel', <String>[
+      '--aot',
+      '--platform=$platformDill',
+      '-o',
+      scriptDill,
+      Platform.script.toString(),
+    ]);
+
+    // Run the AOT compiler with the disassemble flags set.
+    final elfFile = path.join(tempDir, 'aot.snapshot');
+    await Future.wait(<Future>[
+      run(genSnapshot, <String>[
+        '--snapshot-kind=app-aot-elf',
+        '--disassemble',
+        '--always_generate_trampolines_for_testing',
+        '--elf=$elfFile',
+        scriptDill,
+      ]),
+    ]);
+  });
+}
diff --git a/runtime/tests/vm/dart/disassemble_determinism_test.dart b/runtime/tests/vm/dart/disassemble_determinism_test.dart
index 1ff1091..682787c 100644
--- a/runtime/tests/vm/dart/disassemble_determinism_test.dart
+++ b/runtime/tests/vm/dart/disassemble_determinism_test.dart
@@ -33,22 +33,28 @@
     return; // Our IA32 code is not position independent.
   }
 
-  final result1 = await runDart('GENERATE DISASSEMBLY 1', [
-    '--deterministic',
-    '--disassemble',
-    '--disassemble-relative',
-    Platform.script.toFilePath(),
-    '--child'
-  ]);
+  final result1 = await runDart(
+      'GENERATE DISASSEMBLY 1',
+      [
+        '--deterministic',
+        '--disassemble',
+        '--disassemble-relative',
+        Platform.script.toFilePath(),
+        '--child'
+      ],
+      printOut: false);
   final asm1 = result1.processResult.stderr;
 
-  final result2 = await runDart('GENERATE DISASSEMBLY 2', [
-    '--deterministic',
-    '--disassemble',
-    '--disassemble-relative',
-    Platform.script.toFilePath(),
-    '--child'
-  ]);
+  final result2 = await runDart(
+      'GENERATE DISASSEMBLY 2',
+      [
+        '--deterministic',
+        '--disassemble',
+        '--disassemble-relative',
+        Platform.script.toFilePath(),
+        '--child'
+      ],
+      printOut: false);
   final asm2 = result2.processResult.stderr;
 
   Expect.isTrue(
diff --git a/runtime/tests/vm/dart/snapshot_test_helper.dart b/runtime/tests/vm/dart/snapshot_test_helper.dart
index 1f61650..80d3344 100644
--- a/runtime/tests/vm/dart/snapshot_test_helper.dart
+++ b/runtime/tests/vm/dart/snapshot_test_helper.dart
@@ -58,12 +58,14 @@
 final String checkedInDartVM =
     p.join("tools", "sdks", "dart-sdk", "bin", "dart${executableSuffix}");
 
-Future<Result> runDart(String prefix, List<String> arguments) {
+Future<Result> runDart(String prefix, List<String> arguments,
+    {bool printOut: true}) {
   final augmentedArguments = <String>[]
     ..addAll(Platform.executableArguments)
     ..add('--verbosity=warning')
     ..addAll(arguments);
-  return runBinary(prefix, Platform.executable, augmentedArguments);
+  return runBinary(prefix, Platform.executable, augmentedArguments,
+      printOut: printOut);
 }
 
 Future<Result> runGenKernel(String prefix, List<String> arguments) {
@@ -89,21 +91,23 @@
 }
 
 Future<Result> runBinary(String prefix, String binary, List<String> arguments,
-    {Map<String, String>? environment, bool runInShell: false}) async {
+    {Map<String, String>? environment,
+    bool runInShell: false,
+    bool printOut: true}) async {
   print("+ $binary " + arguments.join(" "));
   final processResult = await Process.run(binary, arguments,
       environment: environment, runInShell: runInShell);
   final result =
       new Result('[$prefix] ${binary} ${arguments.join(' ')}', processResult);
 
-  if (processResult.stdout.isNotEmpty) {
+  if (printOut && processResult.stdout.isNotEmpty) {
     print('''
 
 Command stdout:
 ${processResult.stdout}''');
   }
 
-  if (processResult.stderr.isNotEmpty) {
+  if (printOut && processResult.stderr.isNotEmpty) {
     print('''
 
 Command stderr:
diff --git a/runtime/tests/vm/dart_2/disassemble_aot_test.dart b/runtime/tests/vm/dart_2/disassemble_aot_test.dart
new file mode 100644
index 0000000..1ad2312
--- /dev/null
+++ b/runtime/tests/vm/dart_2/disassemble_aot_test.dart
@@ -0,0 +1,48 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Tests proper object recognition in disassembler.
+import 'dart:async';
+import 'dart:io';
+
+import 'package:expect/expect.dart';
+import 'package:path/path.dart' as path;
+
+import 'use_flag_test_helper.dart';
+
+Future<void> main(List<String> args) async {
+  if (Platform.isAndroid) {
+    return; // SDK tree and gen_snapshot not available on the test device.
+  }
+
+  final buildDir = path.dirname(Platform.executable);
+  final sdkDir = path.dirname(path.dirname(buildDir));
+  final platformDill = path.join(buildDir, 'vm_platform_strong.dill');
+  final genSnapshot = path.join(buildDir, 'gen_snapshot');
+
+  await withTempDir('disassemble_aot', (String tempDir) async {
+    final scriptDill = path.join(tempDir, 'out.dill');
+
+    // Compile script to Kernel IR.
+    await run('pkg/vm/tool/gen_kernel', <String>[
+      '--aot',
+      '--platform=$platformDill',
+      '-o',
+      scriptDill,
+      Platform.script.toString(),
+    ]);
+
+    // Run the AOT compiler with the disassemble flags set.
+    final elfFile = path.join(tempDir, 'aot.snapshot');
+    await Future.wait(<Future>[
+      run(genSnapshot, <String>[
+        '--snapshot-kind=app-aot-elf',
+        '--disassemble',
+        '--always_generate_trampolines_for_testing',
+        '--elf=$elfFile',
+        scriptDill,
+      ]),
+    ]);
+  });
+}
diff --git a/runtime/tests/vm/dart_2/disassemble_determinism_test.dart b/runtime/tests/vm/dart_2/disassemble_determinism_test.dart
index 1ff1091..682787c 100644
--- a/runtime/tests/vm/dart_2/disassemble_determinism_test.dart
+++ b/runtime/tests/vm/dart_2/disassemble_determinism_test.dart
@@ -33,22 +33,28 @@
     return; // Our IA32 code is not position independent.
   }
 
-  final result1 = await runDart('GENERATE DISASSEMBLY 1', [
-    '--deterministic',
-    '--disassemble',
-    '--disassemble-relative',
-    Platform.script.toFilePath(),
-    '--child'
-  ]);
+  final result1 = await runDart(
+      'GENERATE DISASSEMBLY 1',
+      [
+        '--deterministic',
+        '--disassemble',
+        '--disassemble-relative',
+        Platform.script.toFilePath(),
+        '--child'
+      ],
+      printOut: false);
   final asm1 = result1.processResult.stderr;
 
-  final result2 = await runDart('GENERATE DISASSEMBLY 2', [
-    '--deterministic',
-    '--disassemble',
-    '--disassemble-relative',
-    Platform.script.toFilePath(),
-    '--child'
-  ]);
+  final result2 = await runDart(
+      'GENERATE DISASSEMBLY 2',
+      [
+        '--deterministic',
+        '--disassemble',
+        '--disassemble-relative',
+        Platform.script.toFilePath(),
+        '--child'
+      ],
+      printOut: false);
   final asm2 = result2.processResult.stderr;
 
   Expect.isTrue(
diff --git a/runtime/tests/vm/dart_2/snapshot_test_helper.dart b/runtime/tests/vm/dart_2/snapshot_test_helper.dart
index 476b205..ddbd803 100644
--- a/runtime/tests/vm/dart_2/snapshot_test_helper.dart
+++ b/runtime/tests/vm/dart_2/snapshot_test_helper.dart
@@ -58,12 +58,14 @@
 final String checkedInDartVM =
     p.join("tools", "sdks", "dart-sdk", "bin", "dart${executableSuffix}");
 
-Future<Result> runDart(String prefix, List<String> arguments) {
+Future<Result> runDart(String prefix, List<String> arguments,
+    {bool printOut: true}) {
   final augmentedArguments = <String>[]
     ..addAll(Platform.executableArguments)
     ..add('--verbosity=warning')
     ..addAll(arguments);
-  return runBinary(prefix, Platform.executable, augmentedArguments);
+  return runBinary(prefix, Platform.executable, augmentedArguments,
+      printOut: printOut);
 }
 
 Future<Result> runGenKernel(String prefix, List<String> arguments) {
@@ -89,21 +91,23 @@
 }
 
 Future<Result> runBinary(String prefix, String binary, List<String> arguments,
-    {Map<String, String> environment, bool runInShell: false}) async {
+    {Map<String, String> environment,
+    bool runInShell: false,
+    bool printOut: true}) async {
   print("+ $binary " + arguments.join(" "));
   final processResult = await Process.run(binary, arguments,
       environment: environment, runInShell: runInShell);
   final result =
       new Result('[$prefix] ${binary} ${arguments.join(' ')}', processResult);
 
-  if (processResult.stdout.isNotEmpty) {
+  if (printOut && processResult.stdout.isNotEmpty) {
     print('''
 
 Command stdout:
 ${processResult.stdout}''');
   }
 
-  if (processResult.stderr.isNotEmpty) {
+  if (printOut && processResult.stderr.isNotEmpty) {
     print('''
 
 Command stderr:
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index 6003995..ee4e386 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -30,6 +30,10 @@
 dart_2/stack_overflow_shared_test: Pass, Slow # Uses --shared-slow-path-triggers-gc flag.
 dart_2/use_bare_instructions_flag_test: Pass, Slow # Spawns several subprocesses
 
+[ $arch == ia32 ]
+dart/disassemble_aot_test: SkipByDesign # IA32 does not support AOT.
+dart_2/disassemble_aot_test: SkipByDesign # IA32 does not support AOT.
+
 [ $builder_tag == asan ]
 dart/transferable_throws_oom_test: SkipByDesign # This test tries to allocate too much memory on purpose. Still dartbug.com/37188
 dart_2/transferable_throws_oom_test: SkipByDesign # This test tries to allocate too much memory on purpose. Still dartbug.com/37188
@@ -99,8 +103,10 @@
 
 [ $compiler != dartkp ]
 dart/base_il_serialization: SkipByDesign # Serialization currently supported only when compiling with --aot.
+dart/disassemble_aot_test: SkipByDesign # runs gen snapshot.
 dart/entrypoints/aot/*: SkipByDesign # These tests should only run on AOT.
 dart_2/base_il_serialization: SkipByDesign # Serialization currently supported only when compiling with --aot.
+dart_2/disassemble_aot_test: SkipByDesign # runs gen snapshot.
 dart_2/entrypoints/aot/*: SkipByDesign # These tests should only run on AOT.
 
 [ $compiler == fasta ]
diff --git a/tests/language/language.status b/tests/language/language.status
index 02f2ef4..f0b144b 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -37,6 +37,9 @@
 stack_trace/demangle_ctors_test: SkipByDesign # Names are not scrubbed.
 type/checks_in_factory_method_test: SkipByDesign # Requires checked mode.
 
+[ $runtime != vm ]
+unsorted/disassemble_test: Skip # VM only test
+
 [ $compiler != dart2analyzer && $compiler != fasta ]
 identifier/built_in_type_annotation_test/*: SkipByDesign # Analyzer/CFE only tests.
 
diff --git a/tests/language/language_kernel.status b/tests/language/language_kernel.status
index 71b36a0..a0fb2d7 100644
--- a/tests/language/language_kernel.status
+++ b/tests/language/language_kernel.status
@@ -6,10 +6,12 @@
 [ $compiler == app_jitk ]
 main/no_main_test/01: Crash
 number/web_int_literals_test/*: SkipByDesign # Test applies only to JavaScript targets
+unsorted/disassemble_test: SkipByDesign # Tested in JIT mode.
 vm/regress_27671_test: SkipByDesign # Relies on string comparison of exception message which may return '<optimized out>'
 
 [ $compiler == dartkp ]
 number/web_int_literals_test/*: SkipByDesign # Test applies only to JavaScript targets
+unsorted/disassemble_test: SkipByDesign # JIT only test
 
 [ $compiler == fasta ]
 number/web_int_literals_test/*: SkipByDesign # Test applies only to JavaScript targets
diff --git a/tests/language/unsorted/disassemble_test.dart b/tests/language/unsorted/disassemble_test.dart
index bc3b032..2618d1e 100644
--- a/tests/language/unsorted/disassemble_test.dart
+++ b/tests/language/unsorted/disassemble_test.dart
@@ -2,15 +2,31 @@
 // 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=--disassemble
-// VMOptions=--disassemble --always_generate_trampolines_for_testing
-
 // Tests proper object recognition in disassembler.
+import 'dart:async';
+import 'dart:io';
+import "package:expect/expect.dart";
+
+Future runBinary(String binary, List<String> arguments) async {
+  print("+ $binary " + arguments.join(" "));
+  final result = await Process.run(binary, arguments);
+  return result;
+}
 
 f(x) {
   return "foo";
 }
 
-main() {
-  print(f(0));
+Future<void> main(List<String> args) async {
+  if (args.contains('--child')) {
+    print(f(0));
+    return;
+  }
+  if (Platform.executable.contains("Product")) {
+    return; // No disassembler in product mode.
+  }
+
+  final result = await runBinary(Platform.executable,
+      ['--disassemble', Platform.script.toFilePath(), '--child']);
+  Expect.equals(0, result.exitCode);
 }
diff --git a/tests/language_2/language_2.status b/tests/language_2/language_2.status
index 536cc7a..4cb75ed 100644
--- a/tests/language_2/language_2.status
+++ b/tests/language_2/language_2.status
@@ -31,6 +31,9 @@
 stack_trace/demangle_ctors_test: SkipByDesign # Names are not scrubbed.
 type/checks_in_factory_method_test: SkipByDesign # Requires checked mode.
 
+[ $runtime != vm ]
+unsorted/disassemble_test: Skip # VM only test
+
 [ $compiler != dart2analyzer && $compiler != fasta ]
 identifier/built_in_type_annotation_test/*: SkipByDesign # Analyzer/CFE only tests.
 
diff --git a/tests/language_2/unsorted/disassemble_test.dart b/tests/language_2/unsorted/disassemble_test.dart
index e4a9efa..b011929 100644
--- a/tests/language_2/unsorted/disassemble_test.dart
+++ b/tests/language_2/unsorted/disassemble_test.dart
@@ -4,15 +4,31 @@
 
 // @dart = 2.9
 
-// VMOptions=--disassemble
-// VMOptions=--disassemble --always_generate_trampolines_for_testing
-
 // Tests proper object recognition in disassembler.
+import 'dart:async';
+import 'dart:io';
+import "package:expect/expect.dart";
+
+Future runBinary(String binary, List<String> arguments) async {
+  print("+ $binary " + arguments.join(" "));
+  final result = await Process.run(binary, arguments);
+  return result;
+}
 
 f(x) {
   return "foo";
 }
 
-main() {
-  print(f(0));
+Future<void> main(List<String> args) async {
+  if (args.contains('--child')) {
+    print(f(0));
+    return;
+  }
+  if (Platform.executable.contains("Product")) {
+    return; // No disassembler in product mode.
+  }
+
+  final result = await runBinary(Platform.executable,
+      ['--disassemble', Platform.script.toFilePath(), '--child']);
+  Expect.equals(0, result.exitCode);
 }
diff --git a/tools/VERSION b/tools/VERSION
index 762f723..245eac3 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 14
 PATCH 0
-PRERELEASE 154
+PRERELEASE 155
 PRERELEASE_PATCH 0
\ No newline at end of file