Make KernelWorker support running in an isolate.

Change-Id: I9a6ab96bbd7901b3f61b3769b40c76fd36b90071
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/106340
Reviewed-by: Jake Macdonald <jakemac@google.com>
Commit-Queue: David Morgan <davidmorgan@google.com>
diff --git a/utils/bazel/kernel_worker.dart b/utils/bazel/kernel_worker.dart
index 5cd62a0..3ca1729 100644
--- a/utils/bazel/kernel_worker.dart
+++ b/utils/bazel/kernel_worker.dart
@@ -11,6 +11,7 @@
 
 import 'dart:async';
 import 'dart:io';
+import 'dart:isolate';
 
 import 'package:args/args.dart';
 import 'package:bazel_worker/bazel_worker.dart';
@@ -24,7 +25,9 @@
 import 'package:vm/target/flutter_runner.dart';
 import 'package:compiler/src/kernel/dart2js_target.dart';
 
-main(List<String> args) async {
+/// [sendPort] may be passed in when started in an isolate. If provided, it is
+/// used for bazel worker communication instead of stdin/stdout.
+main(List<String> args, SendPort sendPort) async {
   args = preprocessArgs(args);
 
   if (args.contains('--persistent_worker')) {
@@ -32,7 +35,7 @@
       throw new StateError(
           "unexpected args, expected only --persistent-worker but got: $args");
     }
-    await new KernelWorker().run();
+    await new KernelWorker(sendPort: sendPort).run();
   } else {
     var result = await computeKernel(args);
     if (!result.succeeded) {
@@ -45,6 +48,14 @@
 class KernelWorker extends AsyncWorkerLoop {
   fe.InitializedCompilerState previousState;
 
+  /// If [sendPort] is provided it is used for bazel worker communication
+  /// instead of stdin/stdout.
+  KernelWorker({SendPort sendPort})
+      : super(
+            connection: sendPort == null
+                ? null
+                : SendPortAsyncWorkerConnection(sendPort));
+
   Future<WorkResponse> performRequest(WorkRequest request) async {
     var outputBuffer = new StringBuffer();
     var response = new WorkResponse()..exitCode = 0;