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

Unified Diff: runtime/vm/dart.cc

Issue 2622053002: Refactor snapshots pieces to include a section for loading instructions into the heap of a regular … (Closed)
Patch Set: . Created 3 years, 11 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.h ('k') | runtime/vm/dart_api_impl.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/dart.cc
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index 57f5cbe759f160cb13e4894006d30ffca83a1c70..c72d43104572293fa4a5516a4dec2576bce43253 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -48,9 +48,7 @@ int64_t Dart::start_time_micros_ = 0;
ThreadPool* Dart::thread_pool_ = NULL;
DebugInfo* Dart::pprof_symbol_generator_ = NULL;
ReadOnlyHandles* Dart::predefined_handles_ = NULL;
-Snapshot::Kind Dart::snapshot_kind_ = Snapshot::kInvalid;
-const uint8_t* Dart::instructions_snapshot_buffer_ = NULL;
-const uint8_t* Dart::data_snapshot_buffer_ = NULL;
+Snapshot::Kind Dart::vm_snapshot_kind_ = Snapshot::kInvalid;
Dart_ThreadExitCallback Dart::thread_exit_callback_ = NULL;
Dart_FileOpenCallback Dart::file_open_callback_ = NULL;
Dart_FileReadCallback Dart::file_read_callback_ = NULL;
@@ -124,7 +122,6 @@ static void CheckOffsets() {
char* Dart::InitOnce(const uint8_t* vm_isolate_snapshot,
const uint8_t* instructions_snapshot,
- const uint8_t* data_snapshot,
Dart_IsolateCreateCallback create,
Dart_IsolateShutdownCallback shutdown,
Dart_ThreadExitCallback thread_exit,
@@ -213,10 +210,10 @@ char* Dart::InitOnce(const uint8_t* vm_isolate_snapshot,
if (snapshot == NULL) {
return strdup("Invalid vm isolate snapshot seen");
}
- snapshot_kind_ = snapshot->kind();
+ vm_snapshot_kind_ = snapshot->kind();
- if (Snapshot::IncludesCode(snapshot_kind_)) {
- if (snapshot_kind_ == Snapshot::kAppAOT) {
+ if (Snapshot::IncludesCode(vm_snapshot_kind_)) {
+ if (vm_snapshot_kind_ == Snapshot::kAppAOT) {
#if defined(DART_PRECOMPILED_RUNTIME)
vm_isolate_->set_compilation_allowed(false);
if (!FLAG_precompiled_runtime) {
@@ -229,10 +226,7 @@ char* Dart::InitOnce(const uint8_t* vm_isolate_snapshot,
if (instructions_snapshot == NULL) {
return strdup("Missing instructions snapshot");
}
- if (data_snapshot == NULL) {
- return strdup("Missing rodata snapshot");
- }
- } else if (Snapshot::IsFull(snapshot_kind_)) {
+ } else if (Snapshot::IsFull(vm_snapshot_kind_)) {
#if defined(DART_PRECOMPILED_RUNTIME)
return strdup("Precompiled runtime requires a precompiled snapshot");
#else
@@ -241,16 +235,8 @@ char* Dart::InitOnce(const uint8_t* vm_isolate_snapshot,
} else {
return strdup("Invalid vm isolate snapshot seen");
}
- if (instructions_snapshot != NULL) {
- vm_isolate_->SetupInstructionsSnapshotPage(instructions_snapshot);
- }
- if (instructions_snapshot != NULL) {
- vm_isolate_->SetupDataSnapshotPage(data_snapshot);
- }
- VmIsolateSnapshotReader reader(snapshot->kind(), snapshot->content(),
- snapshot->length(), instructions_snapshot,
- data_snapshot, T);
- const Error& error = Error::Handle(reader.ReadVmIsolateSnapshot());
+ FullSnapshotReader reader(snapshot, instructions_snapshot, T);
+ const Error& error = Error::Handle(reader.ReadVMSnapshot());
if (!error.IsNull()) {
// Must copy before leaving the zone.
return strdup(error.ToErrorCString());
@@ -281,7 +267,7 @@ char* Dart::InitOnce(const uint8_t* vm_isolate_snapshot,
#elif !defined(DART_NO_SNAPSHOT)
return strdup("Missing vm isolate snapshot");
#else
- snapshot_kind_ = Snapshot::kNone;
+ vm_snapshot_kind_ = Snapshot::kNone;
StubCode::InitOnce();
Symbols::InitOnce(vm_isolate_);
#endif
@@ -504,7 +490,17 @@ Isolate* Dart::CreateIsolate(const char* name_prefix,
}
-RawError* Dart::InitializeIsolate(const uint8_t* snapshot_buffer,
+static bool IsSnapshotCompatible(Snapshot::Kind vm_kind,
+ Snapshot::Kind isolate_kind) {
+ if (vm_kind == isolate_kind) return true;
+ if (vm_kind == Snapshot::kCore && isolate_kind == Snapshot::kAppJIT)
+ return true;
+ return Snapshot::IsFull(isolate_kind);
+}
+
+
+RawError* Dart::InitializeIsolate(const uint8_t* snapshot_data,
+ const uint8_t* snapshot_instructions,
intptr_t snapshot_length,
kernel::Program* kernel_program,
void* data) {
@@ -529,33 +525,28 @@ RawError* Dart::InitializeIsolate(const uint8_t* snapshot_buffer,
if (!error.IsNull()) {
return error.raw();
}
- if ((snapshot_buffer != NULL) && kernel_program == NULL) {
+ if ((snapshot_data != NULL) && kernel_program == NULL) {
// Read the snapshot and setup the initial state.
NOT_IN_PRODUCT(TimelineDurationScope tds(T, Timeline::GetIsolateStream(),
"IsolateSnapshotReader"));
// TODO(turnidge): Remove once length is not part of the snapshot.
- const Snapshot* snapshot = Snapshot::SetupFromBuffer(snapshot_buffer);
+ const Snapshot* snapshot = Snapshot::SetupFromBuffer(snapshot_data);
if (snapshot == NULL) {
const String& message = String::Handle(String::New("Invalid snapshot"));
return ApiError::New(message);
}
- if (snapshot->kind() != snapshot_kind_ &&
- !((snapshot->kind() == Snapshot::kAppJIT) &&
- (snapshot_kind_ == Snapshot::kCore))) {
- const String& message = String::Handle(
- String::NewFormatted("Invalid snapshot kind: got '%s', expected '%s'",
- Snapshot::KindToCString(snapshot->kind()),
- Snapshot::KindToCString(snapshot_kind_)));
+ if (!IsSnapshotCompatible(vm_snapshot_kind_, snapshot->kind())) {
+ const String& message = String::Handle(String::NewFormatted(
+ "Incompatible snapshot kinds: vm '%s', isolate '%s'",
+ Snapshot::KindToCString(vm_snapshot_kind_),
+ Snapshot::KindToCString(snapshot->kind())));
return ApiError::New(message);
}
- ASSERT(Snapshot::IsFull(snapshot->kind()));
if (FLAG_trace_isolates) {
OS::Print("Size of isolate snapshot = %" Pd "\n", snapshot->length());
}
- IsolateSnapshotReader reader(
- snapshot->kind(), snapshot->content(), snapshot->length(),
- Dart::instructions_snapshot_buffer(), Dart::data_snapshot_buffer(), T);
- const Error& error = Error::Handle(reader.ReadFullSnapshot());
+ FullSnapshotReader reader(snapshot, snapshot_instructions, T);
+ const Error& error = Error::Handle(reader.ReadIsolateSnapshot());
if (!error.IsNull()) {
return error.raw();
}
@@ -572,7 +563,7 @@ RawError* Dart::InitializeIsolate(const uint8_t* snapshot_buffer,
MegamorphicCacheTable::PrintSizes(I);
}
} else {
- if ((snapshot_kind_ != Snapshot::kNone) && kernel_program == NULL) {
+ if ((vm_snapshot_kind_ != Snapshot::kNone) && kernel_program == NULL) {
const String& message =
String::Handle(String::New("Missing isolate snapshot"));
return ApiError::New(message);
@@ -603,7 +594,7 @@ RawError* Dart::InitializeIsolate(const uint8_t* snapshot_buffer,
Code::Handle(I->object_store()->megamorphic_miss_code());
I->set_ic_miss_code(miss_code);
- if ((snapshot_buffer == NULL) || (kernel_program != NULL)) {
+ if ((snapshot_data == NULL) || (kernel_program != NULL)) {
const Error& error = Error::Handle(I->object_store()->PreallocateObjects());
if (!error.IsNull()) {
return error.raw();
« no previous file with comments | « runtime/vm/dart.h ('k') | runtime/vm/dart_api_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698