Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(523)

Unified Diff: runtime/vm/dart_api_impl.cc

Issue 1938653002: JIT precompilated snapshots. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/dart.cc ('k') | runtime/vm/megamorphic_cache_table.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/dart_api_impl.cc
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 9dcaa4b3fee1d0dea533754dbcc75454e53ea837..2b78fe5c032d4aef7af3a3f4d5a9233d9f794fef 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -1148,9 +1148,6 @@ DART_EXPORT char* Dart_Initialize(
Dart_FileCloseCallback file_close,
Dart_EntropySource entropy_source,
Dart_GetVMServiceAssetsArchive get_service_assets) {
- if ((instructions_snapshot != NULL) && !FLAG_precompiled_runtime) {
- return strdup("Flag --precompilation was not specified.");
- }
if (interrupt != NULL) {
return strdup("Dart_Initialize: "
"Setting of interrupt callback is not supported.");
@@ -3829,7 +3826,7 @@ DART_EXPORT Dart_Handle Dart_New(Dart_Handle type,
}
if (constructor.IsGenerativeConstructor()) {
#if defined(DEBUG)
- if (!cls.is_allocated() && Dart::IsRunningPrecompiledCode()) {
+ if (!cls.is_allocated() && (Dart::snapshot_kind() == Snapshot::kAppNoJIT)) {
return Api::NewError("Precompilation dropped '%s'", cls.ToCString());
}
#endif
@@ -3924,7 +3921,7 @@ DART_EXPORT Dart_Handle Dart_Allocate(Dart_Handle type) {
}
const Class& cls = Class::Handle(Z, type_obj.type_class());
#if defined(DEBUG)
- if (!cls.is_allocated() && Dart::IsRunningPrecompiledCode()) {
+ if (!cls.is_allocated() && (Dart::snapshot_kind() == Snapshot::kAppNoJIT)) {
return Api::NewError("Precompilation dropped '%s'", cls.ToCString());
}
#endif
@@ -3954,7 +3951,7 @@ DART_EXPORT Dart_Handle Dart_AllocateWithNativeFields(
}
const Class& cls = Class::Handle(Z, type_obj.type_class());
#if defined(DEBUG)
- if (!cls.is_allocated() && Dart::IsRunningPrecompiledCode()) {
+ if (!cls.is_allocated() && (Dart::snapshot_kind() == Snapshot::kAppNoJIT)) {
return Api::NewError("Precompilation dropped '%s'", cls.ToCString());
}
#endif
@@ -6121,10 +6118,13 @@ DART_EXPORT Dart_Handle Dart_CreatePrecompiledSnapshotAssembly(
AssemblyInstructionsWriter instructions_writer(assembly_buffer,
ApiReallocate,
2 * MB /* initial_size */);
- PrecompiledSnapshotWriter writer(vm_isolate_snapshot_buffer,
- isolate_snapshot_buffer,
- ApiReallocate,
- &instructions_writer);
+ FullSnapshotWriter writer(Snapshot::kAppNoJIT,
+ vm_isolate_snapshot_buffer,
+ isolate_snapshot_buffer,
+ ApiReallocate,
+ &instructions_writer,
+ false /* vm_isolate_is_symbolic */);
+
writer.WriteFullSnapshot();
*vm_isolate_snapshot_size = writer.VmIsolateSnapshotSize();
*isolate_snapshot_size = writer.IsolateSnapshotSize();
@@ -6180,10 +6180,13 @@ DART_EXPORT Dart_Handle Dart_CreatePrecompiledSnapshotBlob(
rodata_blob_buffer,
ApiReallocate,
2 * MB /* initial_size */);
- PrecompiledSnapshotWriter writer(vm_isolate_snapshot_buffer,
- isolate_snapshot_buffer,
- ApiReallocate,
- &instructions_writer);
+ FullSnapshotWriter writer(Snapshot::kAppNoJIT,
+ vm_isolate_snapshot_buffer,
+ isolate_snapshot_buffer,
+ ApiReallocate,
+ &instructions_writer,
+ false /* vm_isolate_is_symbolic */);
+
writer.WriteFullSnapshot();
*vm_isolate_snapshot_size = writer.VmIsolateSnapshotSize();
*isolate_snapshot_size = writer.IsolateSnapshotSize();
@@ -6195,8 +6198,105 @@ DART_EXPORT Dart_Handle Dart_CreatePrecompiledSnapshotBlob(
#endif // DART_PRECOMPILER
+DART_EXPORT Dart_Handle Dart_PrecompileJIT() {
+ API_TIMELINE_BEGIN_END;
+ DARTSCOPE(Thread::Current());
+ Isolate* I = T->isolate();
+ Dart_Handle result = Api::CheckAndFinalizePendingClasses(T);
+ if (::Dart_IsError(result)) {
+ return result;
+ }
+ CHECK_CALLBACK_STATE(T);
+ GrowableObjectArray& libraries =
+ GrowableObjectArray::Handle(Z, I->object_store()->libraries());
+ Library& lib = Library::Handle(Z);
+ Class& cls = Class::Handle(Z);
+ Error& error = Error::Handle(Z);
+ for (intptr_t i = 0; i < libraries.Length(); i++) {
+ lib ^= libraries.At(i);
+ ClassDictionaryIterator it(lib, ClassDictionaryIterator::kIteratePrivate);
+ while (it.HasNext()) {
+ cls = it.GetNextClass();
+ if (cls.IsDynamicClass()) {
+ continue; // class 'dynamic' is in the read-only VM isolate.
+ }
+ error = cls.EnsureIsFinalized(T);
+ if (!error.IsNull()) {
+ return Api::NewHandle(T, error.raw());
+ }
+ }
+ }
+ return Api::Success();
+}
+
+
+DART_EXPORT Dart_Handle Dart_CreatePrecompiledJITSnapshotBlob(
+ 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_blob_buffer,
+ intptr_t* instructions_blob_size,
+ uint8_t** rodata_blob_buffer,
+ intptr_t* rodata_blob_size) {
+ ASSERT(FLAG_load_deferred_eagerly);
+ API_TIMELINE_DURATION;
+ DARTSCOPE(Thread::Current());
+ Isolate* I = T->isolate();
+ if (vm_isolate_snapshot_buffer == NULL) {
+ RETURN_NULL_ERROR(vm_isolate_snapshot_buffer);
+ }
+ if (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_blob_buffer == NULL) {
+ RETURN_NULL_ERROR(instructions_blob_buffer);
+ }
+ if (instructions_blob_size == NULL) {
+ RETURN_NULL_ERROR(instructions_blob_size);
+ }
+ if (rodata_blob_buffer == NULL) {
+ RETURN_NULL_ERROR(instructions_blob_buffer);
+ }
+ if (rodata_blob_size == NULL) {
+ RETURN_NULL_ERROR(instructions_blob_size);
+ }
+ // Finalize all classes if needed.
+ Dart_Handle state = Api::CheckAndFinalizePendingClasses(T);
+ if (::Dart_IsError(state)) {
+ return state;
+ }
+ I->heap()->CollectAllGarbage();
+ I->StopBackgroundCompiler();
+
+ BlobInstructionsWriter instructions_writer(instructions_blob_buffer,
+ rodata_blob_buffer,
+ ApiReallocate,
+ 2 * MB /* initial_size */);
+ FullSnapshotWriter writer(Snapshot::kAppWithJIT,
+ vm_isolate_snapshot_buffer,
+ isolate_snapshot_buffer,
+ ApiReallocate,
+ &instructions_writer,
+ false /* vm_isolate_is_symbolic */);
+ writer.WriteFullSnapshot();
+ *vm_isolate_snapshot_size = writer.VmIsolateSnapshotSize();
+ *isolate_snapshot_size = writer.IsolateSnapshotSize();
+ *instructions_blob_size = instructions_writer.InstructionsBlobSize();
+ *rodata_blob_size = instructions_writer.RodataBlobSize();
+
+ return Api::Success();
+}
+
+
DART_EXPORT bool Dart_IsRunningPrecompiledCode() {
- return Dart::IsRunningPrecompiledCode();
+ return Snapshot::IncludesCode(Dart::snapshot_kind());
}
} // namespace dart
« no previous file with comments | « runtime/vm/dart.cc ('k') | runtime/vm/megamorphic_cache_table.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698