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