| Index: runtime/vm/dart_api_impl.cc
 | 
| diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
 | 
| index 22c739305beae65933db4a48f90786656b2a7a3b..5e4f4cb7c3919a1be614737f6c78c920bdef039a 100644
 | 
| --- a/runtime/vm/dart_api_impl.cc
 | 
| +++ b/runtime/vm/dart_api_impl.cc
 | 
| @@ -1240,11 +1240,10 @@ static Dart_Isolate CreateIsolate(const char* script_uri,
 | 
|                                    const char* main,
 | 
|                                    const uint8_t* snapshot_buffer,
 | 
|                                    intptr_t snapshot_length,
 | 
| -                                  bool from_kernel,
 | 
| +                                  kernel::Program* kernel_program,
 | 
|                                    Dart_IsolateFlags* flags,
 | 
|                                    void* callback_data,
 | 
|                                    char** error) {
 | 
| -  ASSERT(!from_kernel || (snapshot_buffer != NULL));
 | 
|    CHECK_NO_ISOLATE(Isolate::Current());
 | 
|    char* isolate_name = BuildIsolateName(script_uri, main);
 | 
|  
 | 
| @@ -1270,10 +1269,10 @@ static Dart_Isolate CreateIsolate(const char* script_uri,
 | 
|      Dart_EnterScope();
 | 
|      const Error& error_obj = Error::Handle(
 | 
|          Z, Dart::InitializeIsolate(snapshot_buffer, snapshot_length,
 | 
| -                                   from_kernel, callback_data));
 | 
| +                                   kernel_program, callback_data));
 | 
|      if (error_obj.IsNull()) {
 | 
|  #if defined(DART_NO_SNAPSHOT) && !defined(PRODUCT)
 | 
| -      if (FLAG_check_function_fingerprints && !from_kernel) {
 | 
| +      if (FLAG_check_function_fingerprints && kernel_program == NULL) {
 | 
|          Library::CheckFunctionFingerprints();
 | 
|        }
 | 
|  #endif  // defined(DART_NO_SNAPSHOT) && !defined(PRODUCT).
 | 
| @@ -1302,20 +1301,19 @@ DART_EXPORT Dart_Isolate Dart_CreateIsolate(const char* script_uri,
 | 
|                                              Dart_IsolateFlags* flags,
 | 
|                                              void* callback_data,
 | 
|                                              char** error) {
 | 
| -  return CreateIsolate(script_uri, main, snapshot_buffer, -1, false, flags,
 | 
| +  return CreateIsolate(script_uri, main, snapshot_buffer, -1, NULL, flags,
 | 
|                         callback_data, error);
 | 
|  }
 | 
|  
 | 
|  
 | 
| -DART_EXPORT Dart_Isolate
 | 
| -Dart_CreateIsolateFromKernel(const char* script_uri,
 | 
| -                             const char* main,
 | 
| -                             const uint8_t* kernel_file,
 | 
| -                             intptr_t kernel_length,
 | 
| -                             Dart_IsolateFlags* flags,
 | 
| -                             void* callback_data,
 | 
| -                             char** error) {
 | 
| -  return CreateIsolate(script_uri, main, kernel_file, kernel_length, true,
 | 
| +DART_EXPORT Dart_Isolate Dart_CreateIsolateFromKernel(const char* script_uri,
 | 
| +                                                      const char* main,
 | 
| +                                                      void* kernel_program,
 | 
| +                                                      Dart_IsolateFlags* flags,
 | 
| +                                                      void* callback_data,
 | 
| +                                                      char** error) {
 | 
| +  return CreateIsolate(script_uri, main, NULL, -1,
 | 
| +                       reinterpret_cast<kernel::Program*>(kernel_program),
 | 
|                         flags, callback_data, error);
 | 
|  }
 | 
|  
 | 
| @@ -5350,9 +5348,23 @@ DART_EXPORT Dart_Handle Dart_LoadScriptFromSnapshot(const uint8_t* buffer,
 | 
|  }
 | 
|  
 | 
|  
 | 
| -DART_EXPORT Dart_Handle Dart_LoadKernel(const uint8_t* buffer,
 | 
| +DART_EXPORT void* Dart_ReadKernelBinary(const uint8_t* buffer,
 | 
|                                          intptr_t buffer_len) {
 | 
|    API_TIMELINE_DURATION;
 | 
| +
 | 
| +#if defined(DART_PRECOMPILED_RUNTIME)
 | 
| +  UNREACHABLE();
 | 
| +  return NULL;
 | 
| +#else
 | 
| +  kernel::Program* program =
 | 
| +      ReadPrecompiledKernelFromBuffer(buffer, buffer_len);
 | 
| +  return program;
 | 
| +#endif
 | 
| +}
 | 
| +
 | 
| +
 | 
| +DART_EXPORT Dart_Handle Dart_LoadKernel(void* kernel_program) {
 | 
| +  API_TIMELINE_DURATION;
 | 
|    DARTSCOPE(Thread::Current());
 | 
|    StackZone zone(T);
 | 
|  
 | 
| @@ -5371,9 +5383,12 @@ DART_EXPORT Dart_Handle Dart_LoadKernel(const uint8_t* buffer,
 | 
|    CHECK_CALLBACK_STATE(T);
 | 
|    CHECK_COMPILATION_ALLOWED(I);
 | 
|  
 | 
| -  // TODO(27588): Memory leak!
 | 
| -  kernel::KernelReader* reader = new kernel::KernelReader(buffer, buffer_len);
 | 
| -  const Object& tmp = reader->ReadProgram();
 | 
| +  // NOTE: Now the VM owns the [kernel_program] memory!  Currently we do not
 | 
| +  // free it because (similar to the token stream) it will be used to repeatedly
 | 
| +  // run the `kernel::FlowGraphBuilder()`.
 | 
| +  kernel::KernelReader reader(
 | 
| +      reinterpret_cast<kernel::Program*>(kernel_program));
 | 
| +  const Object& tmp = reader.ReadProgram();
 | 
|    if (tmp.IsError()) {
 | 
|      return Api::NewHandle(T, tmp.raw());
 | 
|    }
 | 
| 
 |