Chromium Code Reviews| Index: runtime/vm/native_api_impl.cc |
| diff --git a/runtime/vm/native_api_impl.cc b/runtime/vm/native_api_impl.cc |
| index a6688976e9924ee175f08f01754ad6959514374d..b0189366eb2261d31cde055071f089ec40ddbde4 100644 |
| --- a/runtime/vm/native_api_impl.cc |
| +++ b/runtime/vm/native_api_impl.cc |
| @@ -15,6 +15,8 @@ |
| namespace dart { |
| +DECLARE_FLAG(bool, load_deferred_eagerly); |
| + |
| // --- Message sending/receiving from native code --- |
| static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) { |
| @@ -103,6 +105,12 @@ DART_EXPORT Dart_Handle Dart_CompileAll() { |
| return result; |
| } |
| +static uint8_t* ApiReallocate(uint8_t* ptr, |
| + intptr_t old_size, |
| + intptr_t new_size) { |
| + return Api::TopScope(Isolate::Current())->zone()->Realloc<uint8_t>( |
| + ptr, old_size, new_size); |
| +} |
| DART_EXPORT Dart_Handle Dart_Precompile() { |
| Isolate* isolate = Isolate::Current(); |
| @@ -116,4 +124,49 @@ DART_EXPORT Dart_Handle Dart_Precompile() { |
| return result; |
| } |
| +DART_EXPORT Dart_Handle Dart_CreatePrecompiledSnapshot( |
| + uint8_t** vm_isolate_snapshot_buffer, |
| + intptr_t* vm_isolate_snapshot_size, |
| + uint8_t** isolate_snapshot_buffer, |
| + intptr_t* isolate_snapshot_size, |
| + uint8_t** instructions_snapshot_buffer, |
| + intptr_t* instructions_snapshot_size) { |
| + ASSERT(FLAG_load_deferred_eagerly); |
|
siva
2015/09/01 20:58:49
instead of asserting like this why not do what we
rmacnak
2015/09/01 23:43:47
That's in the embedder before loading. Here it is
|
| + Thread* thread = Thread::Current(); |
| + Isolate* isolate = thread->isolate(); |
| + DARTSCOPE(isolate); |
| + if (vm_isolate_snapshot_buffer != NULL && |
| + vm_isolate_snapshot_size == NULL) { |
| + RETURN_NULL_ERROR(vm_isolate_snapshot_size); |
| + } |
| + if (isolate_snapshot_buffer == NULL) { |
| + RETURN_NULL_ERROR(isolate_snapshot_buffer); |
| + } |
| + if (isolate_snapshot_size == NULL) { |
| + RETURN_NULL_ERROR(isolate_snapshot_size); |
| + } |
| + if (instructions_snapshot_buffer == NULL) { |
| + RETURN_NULL_ERROR(instructions_snapshot_buffer); |
| + } |
| + if (instructions_snapshot_size == NULL) { |
| + RETURN_NULL_ERROR(instructions_snapshot_size); |
| + } |
| + // Finalize all classes if needed. |
| + Dart_Handle state = Api::CheckAndFinalizePendingClasses(isolate); |
| + if (::Dart_IsError(state)) { |
| + return state; |
| + } |
| + isolate->heap()->CollectAllGarbage(); |
| + PrecompiledSnapshotWriter writer(vm_isolate_snapshot_buffer, |
| + isolate_snapshot_buffer, |
| + instructions_snapshot_buffer, |
| + ApiReallocate); |
| + writer.WriteFullSnapshot(); |
| + *vm_isolate_snapshot_size = writer.VmIsolateSnapshotSize(); |
|
siva
2015/09/01 20:58:49
if vm_isoolate_snapshot_buffer is NULL this could
rmacnak
2015/09/01 23:43:47
Now requiring vm_isolate_snapshot_buffer to be non
|
| + *isolate_snapshot_size = writer.IsolateSnapshotSize(); |
| + *instructions_snapshot_size = writer.InstructionsSnapshotSize(); |
| + |
| + return Api::Success(); |
| +} |
| + |
| } // namespace dart |