[vm] Cleanup experimental createUriForKernelBlob API

This API was added in https://dart-review.googlesource.com/c/sdk/+/232682
in order to support one of the strategies for running macros,
but it is no longer needed.

TEST=ci

Change-Id: I8da233932351f27fd5dfd01b66f481195d7ca0e1
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/407540
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Johnni Winther <johnniwinther@google.com>
diff --git a/pkg/frontend_server/test/frontend_server_test.dart b/pkg/frontend_server/test/frontend_server_test.dart
index 97f69f6..ddd8d88 100644
--- a/pkg/frontend_server/test/frontend_server_test.dart
+++ b/pkg/frontend_server/test/frontend_server_test.dart
@@ -1773,11 +1773,6 @@
         }
       }
 
-      Uri registerKernelBlob(Uint8List bytes) {
-        bytes = new Uint8List.fromList(bytes);
-        return (Isolate.current as dynamic).createUriForKernelBlob(bytes);
-      }
-
       Future<void> runWithServer(
         Future<void> Function(RequestChannel) f,
       ) async {
@@ -1941,11 +1936,6 @@
             );
 
             expect(kernelBytes, hasLength(greaterThan(200)));
-            final Uri kernelUri = registerKernelBlob(kernelBytes);
-
-            final ReceivePort receivePort = new ReceivePort();
-            await Isolate.spawnUri(kernelUri, [], receivePort.sendPort);
-            expect(await receivePort.first, 42);
           });
         });
       });
diff --git a/runtime/bin/dfe.cc b/runtime/bin/dfe.cc
index 12e2546..6df2314 100644
--- a/runtime/bin/dfe.cc
+++ b/runtime/bin/dfe.cc
@@ -9,7 +9,6 @@
 #include "bin/error_exit.h"
 #include "bin/exe_utils.h"
 #include "bin/file.h"
-#include "bin/lockers.h"
 #include "bin/platform.h"
 #include "bin/snapshot_utils.h"
 #include "bin/utils.h"
@@ -67,9 +66,7 @@
       use_incremental_compiler_(false),
       frontend_filename_(nullptr),
       application_kernel_buffer_(nullptr),
-      application_kernel_buffer_size_(0),
-      kernel_blobs_(&SimpleHashMap::SameStringValue, 4),
-      kernel_blobs_lock_() {}
+      application_kernel_buffer_size_(0) {}
 
 DFE::~DFE() {
   if (frontend_filename_ != nullptr) {
@@ -80,9 +77,6 @@
   free(application_kernel_buffer_);
   application_kernel_buffer_ = nullptr;
   application_kernel_buffer_size_ = 0;
-
-  kernel_blobs_.Clear(
-      [](void* value) { delete reinterpret_cast<KernelBlob*>(value); });
 }
 
 void DFE::Init() {
@@ -242,19 +236,14 @@
                      const AppSnapshot* app_snapshot,
                      uint8_t** kernel_buffer,
                      intptr_t* kernel_buffer_size,
-                     bool decode_uri,
-                     std::shared_ptr<uint8_t>* kernel_blob_ptr) {
+                     bool decode_uri) const {
   int64_t start = Dart_TimelineGetMicros();
   if (!TryReadKernelFile(script_uri, app_snapshot, kernel_buffer,
-                         kernel_buffer_size, decode_uri, kernel_blob_ptr)) {
+                         kernel_buffer_size, decode_uri)) {
     return;
   }
   if (!Dart_IsKernel(*kernel_buffer, *kernel_buffer_size)) {
-    if (kernel_blob_ptr != nullptr && *kernel_blob_ptr) {
-      *kernel_blob_ptr = nullptr;
-    } else {
-      free(*kernel_buffer);
-    }
+    free(*kernel_buffer);
     *kernel_buffer = nullptr;
     *kernel_buffer_size = -1;
   }
@@ -438,20 +427,10 @@
                             const AppSnapshot* app_snapshot,
                             uint8_t** kernel_ir,
                             intptr_t* kernel_ir_size,
-                            bool decode_uri,
-                            std::shared_ptr<uint8_t>* kernel_blob_ptr) {
+                            bool decode_uri) const {
   *kernel_ir = nullptr;
   *kernel_ir_size = -1;
 
-  if (decode_uri && kernel_blob_ptr != nullptr) {
-    *kernel_blob_ptr = TryFindKernelBlob(script_uri, kernel_ir_size);
-    if (*kernel_blob_ptr) {
-      *kernel_ir = kernel_blob_ptr->get();
-      ASSERT(DartUtils::SniffForMagicNumber(*kernel_ir, *kernel_ir_size) ==
-             DartUtils::kKernelMagicNumber);
-      return true;
-    }
-  }
   if (app_snapshot == nullptr || app_snapshot->IsKernel() ||
       app_snapshot->IsKernelList()) {
     uint8_t* buffer;
@@ -479,72 +458,5 @@
   return false;
 }
 
-const char* DFE::RegisterKernelBlob(const uint8_t* kernel_buffer,
-                                    intptr_t kernel_buffer_size) {
-  ASSERT(DartUtils::SniffForMagicNumber(kernel_buffer, kernel_buffer_size) ==
-         DartUtils::kKernelMagicNumber);
-  uint8_t* buffer_copy = reinterpret_cast<uint8_t*>(malloc(kernel_buffer_size));
-  if (buffer_copy == nullptr) {
-    return nullptr;
-  }
-  memmove(buffer_copy, kernel_buffer, kernel_buffer_size);
-
-  MutexLocker ml(&kernel_blobs_lock_);
-  ++kernel_blob_counter_;
-  char* uri =
-      Utils::SCreate("dart-kernel-blob://blob%" Pd, kernel_blob_counter_);
-  KernelBlob* blob = new KernelBlob(uri, buffer_copy, kernel_buffer_size);
-
-  const uint32_t hash = SimpleHashMap::StringHash(uri);
-  SimpleHashMap::Entry* entry =
-      kernel_blobs_.Lookup(uri, hash, /*insert=*/true);
-  ASSERT(entry != nullptr);
-  ASSERT(entry->value == nullptr);
-  entry->value = blob;
-
-  return uri;
-}
-
-std::shared_ptr<uint8_t> DFE::TryFindKernelBlob(const char* uri,
-                                                intptr_t* kernel_length) {
-  *kernel_length = -1;
-
-  MutexLocker ml(&kernel_blobs_lock_);
-  if (kernel_blob_counter_ == 0) {
-    return nullptr;
-  }
-
-  // This const_cast is safe as this 'key' is only used to find entry, not add.
-  void* key = const_cast<char*>(uri);
-  const uint32_t hash = SimpleHashMap::StringHash(uri);
-  SimpleHashMap::Entry* entry =
-      kernel_blobs_.Lookup(key, hash, /*insert=*/false);
-  if (entry == nullptr) {
-    return nullptr;
-  }
-
-  KernelBlob* blob = reinterpret_cast<KernelBlob*>(entry->value);
-  *kernel_length = blob->size();
-  return blob->buffer();
-}
-
-void DFE::UnregisterKernelBlob(const char* uri) {
-  MutexLocker ml(&kernel_blobs_lock_);
-
-  // This const_cast is safe as this 'key' is only used to find entry, not add.
-  void* key = const_cast<char*>(uri);
-  const uint32_t hash = SimpleHashMap::StringHash(uri);
-  SimpleHashMap::Entry* entry =
-      kernel_blobs_.Lookup(key, hash, /*insert=*/false);
-  if (entry == nullptr) {
-    return;
-  }
-
-  KernelBlob* blob = reinterpret_cast<KernelBlob*>(entry->value);
-  entry->value = nullptr;
-  kernel_blobs_.Remove(key, hash);
-  delete blob;
-}
-
 }  // namespace bin
 }  // namespace dart
diff --git a/runtime/bin/dfe.h b/runtime/bin/dfe.h
index 9b0e4c5..3a5f1aa 100644
--- a/runtime/bin/dfe.h
+++ b/runtime/bin/dfe.h
@@ -7,12 +7,10 @@
 
 #include <memory>
 
-#include "bin/thread.h"
 #include "include/dart_api.h"
 #include "include/dart_native_api.h"
 #include "platform/assert.h"
 #include "platform/globals.h"
-#include "platform/hashmap.h"
 #include "platform/utils.h"
 
 namespace dart {
@@ -97,16 +95,12 @@
   // Returns an in memory kernel representation of the specified script is a
   // valid kernel file, sets 'kernel_buffer' to nullptr otherwise.
   //
-  // If 'kernel_blob_ptr' is not nullptr, then this function can also
-  // read kernel blobs. In such case it sets 'kernel_blob_ptr'
-  // to a shared pointer which owns the kernel buffer.
-  // Otherwise, the caller is responsible for free()ing 'kernel_buffer'.
+  // The caller is responsible for free()ing 'kernel_buffer'.
   void ReadScript(const char* script_uri,
                   const AppSnapshot* app_snapshot,
                   uint8_t** kernel_buffer,
                   intptr_t* kernel_buffer_size,
-                  bool decode_uri = true,
-                  std::shared_ptr<uint8_t>* kernel_blob_ptr = nullptr);
+                  bool decode_uri = true) const;
 
   bool KernelServiceDillAvailable() const;
 
@@ -114,17 +108,13 @@
   // Returns `true` if successful and sets 'kernel_buffer' and 'kernel_length'
   // to be the kernel IR contents.
   //
-  // If 'kernel_blob_ptr' is not nullptr, then this function can also
-  // read kernel blobs. In such case it sets 'kernel_blob_ptr'
-  // to a shared pointer which owns the kernel buffer.
-  // Otherwise, the caller is responsible for free()ing 'kernel_buffer'
+  // The caller is responsible for free()ing 'kernel_buffer'
   // if `true` was returned.
   bool TryReadKernelFile(const char* script_uri,
                          const AppSnapshot* app_snapshot,
                          uint8_t** kernel_buffer,
                          intptr_t* kernel_buffer_size,
-                         bool decode_uri = true,
-                         std::shared_ptr<uint8_t>* kernel_blob_ptr = nullptr);
+                         bool decode_uri = true) const;
 
   // We distinguish between "intent to use Dart frontend" vs "can actually
   // use Dart frontend". The method UseDartFrontend tells us about the
@@ -137,22 +127,6 @@
   void LoadKernelService(const uint8_t** kernel_service_buffer,
                          intptr_t* kernel_service_buffer_size);
 
-  // Registers given kernel blob and returns blob URI which
-  // can be used in TryReadKernelFile later to load the given kernel.
-  // Data from [kernel_buffer] is copied, it doesn't need to stay alive.
-  // Returns nullptr if failed to allocate memory.
-  const char* RegisterKernelBlob(const uint8_t* kernel_buffer,
-                                 intptr_t kernel_buffer_size);
-
-  // Looks for kernel blob using the given [uri].
-  // Returns non-null pointer to the kernel blob if successful and
-  // sets [kernel_length].
-  std::shared_ptr<uint8_t> TryFindKernelBlob(const char* uri,
-                                             intptr_t* kernel_length);
-
-  // Unregisters kernel blob with given URI.
-  void UnregisterKernelBlob(const char* uri);
-
  private:
   bool use_dfe_;
   bool use_incremental_compiler_;
@@ -164,33 +138,11 @@
   uint8_t* application_kernel_buffer_;
   intptr_t application_kernel_buffer_size_;
 
-  // Registry of kernel blobs. Maps URI (char *) to KernelBlob.
-  SimpleHashMap kernel_blobs_;
-  intptr_t kernel_blob_counter_ = 0;
-  Mutex kernel_blobs_lock_;
-
   void InitKernelServiceAndPlatformDills();
 
   DISALLOW_COPY_AND_ASSIGN(DFE);
 };
 
-class KernelBlob {
- public:
-  // Takes ownership over [uri] and [buffer].
-  KernelBlob(char* uri, uint8_t* buffer, intptr_t size)
-      : uri_(uri), buffer_(buffer, std::free), size_(size) {}
-
-  std::shared_ptr<uint8_t> buffer() { return buffer_; }
-  intptr_t size() const { return size_; }
-
- private:
-  CStringUniquePtr uri_;
-  std::shared_ptr<uint8_t> buffer_;
-  const intptr_t size_;
-
-  DISALLOW_COPY_AND_ASSIGN(KernelBlob);
-};
-
 class PathSanitizer {
  public:
   explicit PathSanitizer(const char* path);
diff --git a/runtime/bin/isolate_data.h b/runtime/bin/isolate_data.h
index 9bd5f06..e82b2ec 100644
--- a/runtime/bin/isolate_data.h
+++ b/runtime/bin/isolate_data.h
@@ -66,16 +66,6 @@
     kernel_buffer_size_ = size;
   }
 
-  // Associate the given kernel buffer with this IsolateGroupData and give it
-  // ownership of the buffer. The buffer is already owned by another
-  // IsolateGroupData.
-  void SetKernelBufferAlreadyOwned(std::shared_ptr<uint8_t> buffer,
-                                   intptr_t size) {
-    ASSERT(kernel_buffer_.get() == nullptr);
-    kernel_buffer_ = std::move(buffer);
-    kernel_buffer_size_ = size;
-  }
-
   const char* resolved_packages_config() const {
     return resolved_packages_config_;
   }
diff --git a/runtime/bin/main_impl.cc b/runtime/bin/main_impl.cc
index 40f5db8..29fbeb9 100644
--- a/runtime/bin/main_impl.cc
+++ b/runtime/bin/main_impl.cc
@@ -696,7 +696,6 @@
   int64_t start = Dart_TimelineGetMicros();
   ASSERT(script_uri != nullptr);
   uint8_t* kernel_buffer = nullptr;
-  std::shared_ptr<uint8_t> kernel_buffer_ptr;
   intptr_t kernel_buffer_size = 0;
   AppSnapshot* app_snapshot = nullptr;
 
@@ -762,8 +761,7 @@
 
   if (kernel_buffer == nullptr && !isolate_run_app_snapshot) {
     dfe.ReadScript(script_uri, app_snapshot, &kernel_buffer,
-                   &kernel_buffer_size, /*decode_uri=*/true,
-                   &kernel_buffer_ptr);
+                   &kernel_buffer_size, /*decode_uri=*/true);
   }
   PathSanitizer script_uri_sanitizer(script_uri);
   PathSanitizer packages_config_sanitizer(packages_config);
@@ -772,13 +770,8 @@
   auto isolate_group_data = new IsolateGroupData(
       script_uri, packages_config, app_snapshot, isolate_run_app_snapshot);
   if (kernel_buffer != nullptr) {
-    if (kernel_buffer_ptr) {
-      isolate_group_data->SetKernelBufferAlreadyOwned(
-          std::move(kernel_buffer_ptr), kernel_buffer_size);
-    } else {
-      isolate_group_data->SetKernelBufferNewlyOwned(kernel_buffer,
-                                                    kernel_buffer_size);
-    }
+    isolate_group_data->SetKernelBufferNewlyOwned(kernel_buffer,
+                                                  kernel_buffer_size);
   }
 
   Dart_Isolate isolate = nullptr;
@@ -896,16 +889,6 @@
                                           error, &exit_code);
 }
 
-#if !defined(DART_PRECOMPILED_RUNTIME)
-static const char* RegisterKernelBlob(const uint8_t* kernel_buffer,
-                                      intptr_t kernel_buffer_size) {
-  return dfe.RegisterKernelBlob(kernel_buffer, kernel_buffer_size);
-}
-static void UnregisterKernelBlob(const char* kernel_blob_uri) {
-  dfe.UnregisterKernelBlob(kernel_blob_uri);
-}
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
 static void OnIsolateShutdown(void* isolate_group_data, void* isolate_data) {
   Dart_EnterScope();
   Dart_Handle sticky_error = Dart_GetStickyError();
@@ -1399,10 +1382,6 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
   init_params.start_kernel_isolate =
       dfe.UseDartFrontend() && dfe.CanUseDartFrontend();
-  if (init_params.start_kernel_isolate) {
-    init_params.register_kernel_blob = RegisterKernelBlob;
-    init_params.unregister_kernel_blob = UnregisterKernelBlob;
-  }
 #else
   init_params.start_kernel_isolate = false;
 #endif
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index 1d83c90..6f73d7f 100644
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -837,7 +837,7 @@
  * The current version of the Dart_InitializeFlags. Should be incremented every
  * time Dart_InitializeFlags changes in a binary incompatible way.
  */
-#define DART_INITIALIZE_PARAMS_CURRENT_VERSION (0x00000008)
+#define DART_INITIALIZE_PARAMS_CURRENT_VERSION (0x00000009)
 
 /** Forward declaration */
 struct Dart_CodeObserver;
@@ -864,36 +864,6 @@
 } Dart_CodeObserver;
 
 /**
- * Optional callback provided by the embedder that is used by the VM to
- * implement registration of kernel blobs for the subsequent Isolate.spawnUri
- * If no callback is provided, the registration of kernel blobs will throw
- * an error.
- *
- * \param kernel_buffer A buffer which contains a kernel program. Callback
- *                      should copy the contents of `kernel_buffer` as
- *                      it may be freed immediately after registration.
- * \param kernel_buffer_size The size of `kernel_buffer`.
- *
- * \return A C string representing URI which can be later used
- *         to spawn a new isolate. This C String should be scope allocated
- *         or owned by the embedder.
- *         Returns NULL if embedder runs out of memory.
- */
-typedef const char* (*Dart_RegisterKernelBlobCallback)(
-    const uint8_t* kernel_buffer,
-    intptr_t kernel_buffer_size);
-
-/**
- * Optional callback provided by the embedder that is used by the VM to
- * unregister kernel blobs.
- * If no callback is provided, the unregistration of kernel blobs will throw
- * an error.
- *
- * \param kernel_blob_uri URI of the kernel blob to unregister.
- */
-typedef void (*Dart_UnregisterKernelBlobCallback)(const char* kernel_blob_uri);
-
-/**
  * Describes how to initialize the VM. Used with Dart_Initialize.
  */
 typedef struct {
@@ -971,16 +941,6 @@
    */
   Dart_CodeObserver* code_observer;
 
-  /**
-   * Kernel blob registration callback function. See Dart_RegisterKernelBlobCallback.
-   */
-  Dart_RegisterKernelBlobCallback register_kernel_blob;
-
-  /**
-   * Kernel blob unregistration callback function. See Dart_UnregisterKernelBlobCallback.
-   */
-  Dart_UnregisterKernelBlobCallback unregister_kernel_blob;
-
 #if defined(__Fuchsia__)
   /**
    * The resource needed to use zx_vmo_replace_as_executable. Can be
diff --git a/runtime/lib/isolate.cc b/runtime/lib/isolate.cc
index 3e3ba4d..53d56b6 100644
--- a/runtime/lib/isolate.cc
+++ b/runtime/lib/isolate.cc
@@ -1249,53 +1249,6 @@
   return root_lib.url();
 }
 
-DEFINE_NATIVE_ENTRY(Isolate_registerKernelBlob, 0, 1) {
-  GET_NON_NULL_NATIVE_ARGUMENT(TypedData, kernel_blob,
-                               arguments->NativeArgAt(0));
-  auto register_kernel_blob_callback = Isolate::RegisterKernelBlobCallback();
-  if (register_kernel_blob_callback == nullptr) {
-    Exceptions::ThrowUnsupportedError(
-        "Registration of kernel blobs is not supported by this Dart embedder.");
-  }
-  bool is_kernel = false;
-  {
-    NoSafepointScope no_safepoint;
-    is_kernel =
-        Dart_IsKernel(reinterpret_cast<uint8_t*>(kernel_blob.DataAddr(0)),
-                      kernel_blob.LengthInBytes());
-  }
-  if (!is_kernel) {
-    const auto& error = String::Handle(
-        zone, String::New("kernelBlob doesn\'t contain a valid kernel.\n"));
-    Exceptions::ThrowArgumentError(error);
-    UNREACHABLE();
-  }
-  const char* uri = nullptr;
-  {
-    NoSafepointScope no_safepoint;
-    uri = register_kernel_blob_callback(
-        reinterpret_cast<uint8_t*>(kernel_blob.DataAddr(0)),
-        kernel_blob.LengthInBytes());
-  }
-  if (uri == nullptr) {
-    Exceptions::ThrowOOM();
-  }
-  return String::New(uri);
-}
-
-DEFINE_NATIVE_ENTRY(Isolate_unregisterKernelBlob, 0, 1) {
-  GET_NON_NULL_NATIVE_ARGUMENT(String, kernel_blob_uri,
-                               arguments->NativeArgAt(0));
-  auto unregister_kernel_blob_callback =
-      Isolate::UnregisterKernelBlobCallback();
-  if (unregister_kernel_blob_callback == nullptr) {
-    Exceptions::ThrowUnsupportedError(
-        "Registration of kernel blobs is not supported by this Dart embedder.");
-  }
-  unregister_kernel_blob_callback(kernel_blob_uri.ToCString());
-  return Object::null();
-}
-
 DEFINE_NATIVE_ENTRY(Isolate_sendOOB, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(SendPort, port, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Array, msg, arguments->NativeArgAt(1));
diff --git a/runtime/tests/vm/dart/spawn_uri_from_kernel_blob_script.dart b/runtime/tests/vm/dart/spawn_uri_from_kernel_blob_script.dart
deleted file mode 100644
index 43a200d..0000000
--- a/runtime/tests/vm/dart/spawn_uri_from_kernel_blob_script.dart
+++ /dev/null
@@ -1,11 +0,0 @@
-// 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:convert";
-import "dart:isolate";
-
-main(List<String> args, SendPort replyPort) {
-  final String encoded = base64.encode(args[0].codeUnits);
-  replyPort.send(String.fromCharCodes(base64.decode(encoded)));
-}
diff --git a/runtime/tests/vm/dart/spawn_uri_from_kernel_blob_test.dart b/runtime/tests/vm/dart/spawn_uri_from_kernel_blob_test.dart
deleted file mode 100644
index 1c9397b..0000000
--- a/runtime/tests/vm/dart/spawn_uri_from_kernel_blob_test.dart
+++ /dev/null
@@ -1,63 +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.
-
-// OtherResources=spawn_uri_from_kernel_blob_script.dart
-
-// Test for Isolate.createUriForKernelBlob and subsequent Isolate.spawnUri.
-
-import 'dart:io' show Platform;
-import 'dart:isolate' show Isolate, ReceivePort;
-
-import "package:expect/expect.dart";
-import "package:expect/variations.dart" show unsoundNullSafety;
-import 'package:front_end/src/api_unstable/vm.dart'
-    show CompilerOptions, DiagnosticMessage, kernelForProgram, NnbdMode;
-import 'package:kernel/kernel.dart';
-import 'package:kernel/target/targets.dart';
-import 'package:vm/modular/target/vm.dart' show VmTarget;
-
-import 'snapshot_test_helper.dart';
-
-main() async {
-  final sourceUri =
-      Platform.script.resolve('spawn_uri_from_kernel_blob_script.dart');
-  final options = new CompilerOptions()
-    ..target = VmTarget(TargetFlags())
-    ..additionalDills = <Uri>[Uri.file(platformDill)]
-    ..environmentDefines = {}
-    ..nnbdMode = unsoundNullSafety ? NnbdMode.Weak : NnbdMode.Strong
-    ..onDiagnostic = (DiagnosticMessage message) {
-      Expect.fail(
-          "Compilation error: ${message.plainTextFormatted.join('\n')}");
-    };
-  final Component component =
-      (await kernelForProgram(sourceUri, options))!.component!;
-  final kernelBlob = writeComponentToBytes(component);
-
-  final kernelBlobUri =
-      (Isolate.current as dynamic).createUriForKernelBlob(kernelBlob);
-
-  print('URI: $kernelBlobUri');
-
-  for (int i = 0; i < 2; ++i) {
-    final receivePort = ReceivePort();
-    receivePort.listen((message) {
-      Expect.equals(message, 'Hello');
-      print('ok');
-      receivePort.close();
-    });
-
-    await Isolate.spawnUri(kernelBlobUri, ['Hello'], receivePort.sendPort);
-  }
-
-  (Isolate.current as dynamic).unregisterKernelBlobUri(kernelBlobUri);
-
-  try {
-    await Isolate.spawnUri(kernelBlobUri, ['Hello'], null);
-    Expect.fail(
-        "Isolate.spawnUri didn't complete with error after unregisterKernelBlobUri");
-  } catch (e) {
-    print('Got exception: $e');
-  }
-}
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index b2dea92..7f3bf68 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -74,7 +74,6 @@
 dart/kernel_determinism_test: SkipByDesign # Test needs to run from source
 dart/minimal_kernel_test: SkipByDesign # Test needs to run from source
 dart/snapshot_depfile_test: SkipByDesign # Test needs to run from source
-dart/spawn_uri_from_kernel_blob_test: SkipByDesign # Only run in JIT.
 
 [ $compiler == dartkp ]
 dart/await_type_check_with_dynamic_loading_test: SkipByDesign # Uses dart:mirrors.
diff --git a/runtime/vm/bootstrap_natives.h b/runtime/vm/bootstrap_natives.h
index ad01540..67b33db 100644
--- a/runtime/vm/bootstrap_natives.h
+++ b/runtime/vm/bootstrap_natives.h
@@ -250,8 +250,6 @@
   V(Isolate_getCurrentRootUriStr, 0)                                           \
   V(Isolate_getDebugName, 1)                                                   \
   V(Isolate_getPortAndCapabilitiesOfCurrentIsolate, 0)                         \
-  V(Isolate_registerKernelBlob, 1)                                             \
-  V(Isolate_unregisterKernelBlob, 1)                                           \
   V(Isolate_sendOOB, 2)                                                        \
   V(Isolate_spawnFunction, 10)                                                 \
   V(Isolate_spawnUri, 12)                                                      \
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index 6c02a5a..0aac4a2 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -499,8 +499,6 @@
   Isolate::SetShutdownCallback(params->shutdown_isolate);
   Isolate::SetCleanupCallback(params->cleanup_isolate);
   Isolate::SetGroupCleanupCallback(params->cleanup_group);
-  Isolate::SetRegisterKernelBlobCallback(params->register_kernel_blob);
-  Isolate::SetUnregisterKernelBlobCallback(params->unregister_kernel_blob);
 
   return nullptr;
 }
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index 7f5baf6..79308e2 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -1815,8 +1815,6 @@
   shutdown_callback_ = nullptr;
   cleanup_callback_ = nullptr;
   cleanup_group_callback_ = nullptr;
-  register_kernel_blob_callback_ = nullptr;
-  unregister_kernel_blob_callback_ = nullptr;
   if (isolate_creation_monitor_ == nullptr) {
     isolate_creation_monitor_ = new Monitor();
   }
@@ -2692,10 +2690,6 @@
 Dart_IsolateShutdownCallback Isolate::shutdown_callback_ = nullptr;
 Dart_IsolateCleanupCallback Isolate::cleanup_callback_ = nullptr;
 Dart_IsolateGroupCleanupCallback Isolate::cleanup_group_callback_ = nullptr;
-Dart_RegisterKernelBlobCallback Isolate::register_kernel_blob_callback_ =
-    nullptr;
-Dart_UnregisterKernelBlobCallback Isolate::unregister_kernel_blob_callback_ =
-    nullptr;
 
 Random* IsolateGroup::isolate_group_random_ = nullptr;
 Monitor* Isolate::isolate_creation_monitor_ = nullptr;
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index 202727b..d373680 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -1228,20 +1228,6 @@
   static Dart_IsolateGroupCleanupCallback GroupCleanupCallback() {
     return cleanup_group_callback_;
   }
-  static void SetRegisterKernelBlobCallback(
-      Dart_RegisterKernelBlobCallback cb) {
-    register_kernel_blob_callback_ = cb;
-  }
-  static Dart_RegisterKernelBlobCallback RegisterKernelBlobCallback() {
-    return register_kernel_blob_callback_;
-  }
-  static void SetUnregisterKernelBlobCallback(
-      Dart_UnregisterKernelBlobCallback cb) {
-    unregister_kernel_blob_callback_ = cb;
-  }
-  static Dart_UnregisterKernelBlobCallback UnregisterKernelBlobCallback() {
-    return unregister_kernel_blob_callback_;
-  }
 
 #if !defined(PRODUCT)
   // This method first ensures that the default Service ID zone for this isolate
@@ -1729,8 +1715,6 @@
   static Dart_IsolateShutdownCallback shutdown_callback_;
   static Dart_IsolateCleanupCallback cleanup_callback_;
   static Dart_IsolateGroupCleanupCallback cleanup_group_callback_;
-  static Dart_RegisterKernelBlobCallback register_kernel_blob_callback_;
-  static Dart_UnregisterKernelBlobCallback unregister_kernel_blob_callback_;
 
 #if !defined(PRODUCT)
   static void WakePauseEventHandler(Dart_Isolate isolate);
diff --git a/sdk/lib/_internal/vm/lib/isolate_patch.dart b/sdk/lib/_internal/vm/lib/isolate_patch.dart
index 8f835a1..ebb7cc74 100644
--- a/sdk/lib/_internal/vm/lib/isolate_patch.dart
+++ b/sdk/lib/_internal/vm/lib/isolate_patch.dart
@@ -742,33 +742,6 @@
     }
     _exit(finalMessagePort, message);
   }
-
-  /**
-   * Creates an Uri representing the script which was compiled into kernel
-   * binary in [kernelBlob].
-   * The resulting Uri can be used for the subsequent spawnUri calls.
-   * Such spawnUri will start an isolate which would run the given
-   * compiled script in [kernelBlob].
-   */
-  /*static*/
-  Uri createUriForKernelBlob(Uint8List kernelBlob) {
-    return Uri.parse(_registerKernelBlob(kernelBlob));
-  }
-
-  /**
-   * Unregisters kernel blob previously registered with
-   * [createUriForKernelBlob] and frees underlying resources.
-   */
-  /*static*/
-  void unregisterKernelBlobUri(Uri kernelBlobUri) {
-    _unregisterKernelBlob(kernelBlobUri.toString());
-  }
-
-  @pragma("vm:external-name", "Isolate_registerKernelBlob")
-  external static String _registerKernelBlob(Uint8List kernelBlob);
-
-  @pragma("vm:external-name", "Isolate_unregisterKernelBlob")
-  external static void _unregisterKernelBlob(String kernelBlobUri);
 }
 
 @patch