| Index: runtime/vm/dart.cc
 | 
| diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
 | 
| index cd7dbde9f15319d29d4dfcf006c73250d589489d..8f5fcfeaa0249c0822c43dec450d0b4bd7eef527 100644
 | 
| --- a/runtime/vm/dart.cc
 | 
| +++ b/runtime/vm/dart.cc
 | 
| @@ -47,6 +47,7 @@ int64_t Dart::start_time_ = 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;
 | 
|  Dart_ThreadExitCallback Dart::thread_exit_callback_ = NULL;
 | 
| @@ -131,15 +132,6 @@ const char* Dart::InitOnce(const uint8_t* vm_isolate_snapshot,
 | 
|    if (vm_isolate_ != NULL || !Flags::Initialized()) {
 | 
|      return "VM already initialized or flags not initialized.";
 | 
|    }
 | 
| -#if defined(DART_PRECOMPILED_RUNTIME)
 | 
| -  if (instructions_snapshot == NULL) {
 | 
| -    return "Precompiled runtime requires a precompiled snapshot";
 | 
| -  }
 | 
| -#else
 | 
| -  if (instructions_snapshot != NULL) {
 | 
| -    return "JIT runtime cannot run a precompiled snapshot";
 | 
| -  }
 | 
| -#endif
 | 
|    set_thread_exit_callback(thread_exit);
 | 
|    SetFileCallbacks(file_open, file_read, file_write, file_close);
 | 
|    set_entropy_source_callback(entropy_source);
 | 
| @@ -178,14 +170,12 @@ const char* Dart::InitOnce(const uint8_t* vm_isolate_snapshot,
 | 
|      ASSERT(vm_isolate_ == NULL);
 | 
|      ASSERT(Flags::Initialized());
 | 
|      const bool is_vm_isolate = true;
 | 
| -    const bool precompiled = instructions_snapshot != NULL;
 | 
|  
 | 
|      // Setup default flags for the VM isolate.
 | 
|      Dart_IsolateFlags api_flags;
 | 
|      Isolate::FlagsInitialize(&api_flags);
 | 
|      vm_isolate_ = Isolate::Init("vm-isolate", api_flags, is_vm_isolate);
 | 
|      start_time_ = vm_isolate_->start_time();
 | 
| -    vm_isolate_->set_compilation_allowed(!precompiled);
 | 
|      // Verify assumptions about executing in the VM isolate.
 | 
|      ASSERT(vm_isolate_ == Isolate::Current());
 | 
|      ASSERT(vm_isolate_ == Thread::Current()->isolate());
 | 
| @@ -200,24 +190,48 @@ const char* Dart::InitOnce(const uint8_t* vm_isolate_snapshot,
 | 
|      Object::InitOnce(vm_isolate_);
 | 
|      ArgumentsDescriptor::InitOnce();
 | 
|      ICData::InitOnce();
 | 
| -    // When precompiled the stub code is initialized from the snapshot.
 | 
| -    if (!precompiled) {
 | 
| -      StubCode::InitOnce();
 | 
| -    }
 | 
|      if (vm_isolate_snapshot != NULL) {
 | 
|        NOT_IN_PRODUCT(TimelineDurationScope tds(Timeline::GetVMStream(),
 | 
|                                                 "VMIsolateSnapshot"));
 | 
| -      if (instructions_snapshot != NULL) {
 | 
| -        vm_isolate_->SetupInstructionsSnapshotPage(instructions_snapshot);
 | 
| -      }
 | 
| -      if (data_snapshot != NULL) {
 | 
| -        vm_isolate_->SetupDataSnapshotPage(data_snapshot);
 | 
| -      }
 | 
|        const Snapshot* snapshot = Snapshot::SetupFromBuffer(vm_isolate_snapshot);
 | 
|        if (snapshot == NULL) {
 | 
| -        return "Invalid vm isolate snapshot seen.";
 | 
| +        return "Invalid vm isolate snapshot seen";
 | 
| +      }
 | 
| +      snapshot_kind_ = snapshot->kind();
 | 
| +      if (Snapshot::IncludesCode(snapshot_kind_)) {
 | 
| +        if (snapshot_kind_ == Snapshot::kAppNoJIT) {
 | 
| +#if defined(DART_PRECOMPILED_RUNTIME)
 | 
| +          vm_isolate_->set_compilation_allowed(false);
 | 
| +          if (!FLAG_precompiled_runtime) {
 | 
| +            return "Flag --precompilation was not specified";
 | 
| +          }
 | 
| +#else
 | 
| +          return "JIT runtime cannot run a precompiled snapshot";
 | 
| +#endif
 | 
| +        }
 | 
| +        if (instructions_snapshot == NULL) {
 | 
| +          return "Missing instructions snapshot";
 | 
| +        }
 | 
| +        if (data_snapshot == NULL) {
 | 
| +          return "Missing rodata snapshot";
 | 
| +        }
 | 
| +        vm_isolate_->SetupInstructionsSnapshotPage(instructions_snapshot);
 | 
| +        vm_isolate_->SetupDataSnapshotPage(data_snapshot);
 | 
| +      } else if (Snapshot::IsFull(snapshot_kind_)) {
 | 
| +#if defined(DART_PRECOMPILED_RUNTIME)
 | 
| +        return "Precompiled runtime requires a precompiled snapshot";
 | 
| +#else
 | 
| +        if (instructions_snapshot != NULL) {
 | 
| +          return "Unexpected instructions snapshot";
 | 
| +        }
 | 
| +        if (data_snapshot != NULL) {
 | 
| +          return "Unexpected rodata snapshot";
 | 
| +        }
 | 
| +        StubCode::InitOnce();
 | 
| +#endif
 | 
| +      } else {
 | 
| +        return "Invalid vm isolate snapshot seen";
 | 
|        }
 | 
| -      ASSERT(Snapshot::IsFull(snapshot->kind()));
 | 
|        VmIsolateSnapshotReader reader(snapshot->kind(),
 | 
|                                       snapshot->content(),
 | 
|                                       snapshot->length(),
 | 
| @@ -226,7 +240,7 @@ const char* Dart::InitOnce(const uint8_t* vm_isolate_snapshot,
 | 
|                                       T);
 | 
|        const Error& error = Error::Handle(reader.ReadVmIsolateSnapshot());
 | 
|        if (!error.IsNull()) {
 | 
| -        return error.ToCString();
 | 
| +        return error.ToErrorCString();
 | 
|        }
 | 
|        NOT_IN_PRODUCT(if (tds.enabled()) {
 | 
|          tds.SetNumArguments(2);
 | 
| @@ -247,7 +261,13 @@ const char* Dart::InitOnce(const uint8_t* vm_isolate_snapshot,
 | 
|          OS::Print("VM Isolate: Symbol table capacity : %" Pd "\n", capacity);
 | 
|        }
 | 
|      } else {
 | 
| +#if defined(DART_PRECOMPILED_RUNTIME)
 | 
| +      return "Precompiled runtime requires a precompiled snapshot";
 | 
| +#else
 | 
| +      snapshot_kind_ = Snapshot::kNone;
 | 
| +      StubCode::InitOnce();
 | 
|        Symbols::InitOnce(vm_isolate_);
 | 
| +#endif
 | 
|      }
 | 
|      // We need to initialize the constants here for the vm isolate thread due to
 | 
|      // bootstrapping issues.
 | 
| @@ -487,6 +507,7 @@ RawError* Dart::InitializeIsolate(const uint8_t* snapshot_buffer, void* data) {
 | 
|        return ApiError::New(message);
 | 
|      }
 | 
|      ASSERT(Snapshot::IsFull(snapshot->kind()));
 | 
| +    ASSERT(snapshot->kind() == snapshot_kind_);
 | 
|      if (FLAG_trace_isolates) {
 | 
|        OS::Print("Size of isolate snapshot = %" Pd "\n", snapshot->length());
 | 
|      }
 | 
| @@ -511,6 +532,7 @@ RawError* Dart::InitializeIsolate(const uint8_t* snapshot_buffer, void* data) {
 | 
|        MegamorphicCacheTable::PrintSizes(I);
 | 
|      }
 | 
|    } else {
 | 
| +    ASSERT(snapshot_kind_ == Snapshot::kNone);
 | 
|      // Populate the isolate's symbol table with all symbols from the
 | 
|      // VM isolate. We do this so that when we generate a full snapshot
 | 
|      // for the isolate we have a unified symbol table that we can then
 | 
| @@ -530,7 +552,7 @@ RawError* Dart::InitializeIsolate(const uint8_t* snapshot_buffer, void* data) {
 | 
|  #if !defined(DART_PRECOMPILED_RUNTIME)
 | 
|    // When running precompiled, the megamorphic miss function/code comes from the
 | 
|    // snapshot.
 | 
| -  if (!Dart::IsRunningPrecompiledCode()) {
 | 
| +  if (!Snapshot::IncludesCode(Dart::snapshot_kind())) {
 | 
|      MegamorphicCacheTable::InitMissHandler(I);
 | 
|    }
 | 
|  #endif
 | 
| 
 |