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()); |
} |