| Index: runtime/vm/isolate.h | 
| diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h | 
| index c2fc95554d71e231affe824e2d343fce1bd32818..b418fd6fec65f34c19cb88c74d6a6411a11fd56c 100644 | 
| --- a/runtime/vm/isolate.h | 
| +++ b/runtime/vm/isolate.h | 
| @@ -35,6 +35,7 @@ class HandleVisitor; | 
| class Heap; | 
| class ICData; | 
| class IsolateProfilerData; | 
| +class IsolateReloadContext; | 
| class IsolateSpawnState; | 
| class Log; | 
| class MessageHandler; | 
| @@ -47,12 +48,12 @@ class RawInstance; | 
| class RawArray; | 
| class RawContext; | 
| class RawDouble; | 
| +class RawError; | 
| +class RawField; | 
| class RawGrowableObjectArray; | 
| class RawMint; | 
| class RawObject; | 
| class RawInteger; | 
| -class RawError; | 
| -class RawField; | 
| class RawFloat32x4; | 
| class RawInt32x4; | 
| class RawUserTag; | 
| @@ -91,6 +92,18 @@ class NoOOBMessageScope : public StackResource { | 
| }; | 
|  | 
|  | 
| +// Disallow isolate reload. | 
| +class NoReloadScope : public StackResource { | 
| + public: | 
| +  NoReloadScope(Isolate* isolate, Thread* thread); | 
| +  ~NoReloadScope(); | 
| + | 
| + private: | 
| +  Isolate* isolate_; | 
| +  DISALLOW_COPY_AND_ASSIGN(NoReloadScope); | 
| +}; | 
| + | 
| + | 
| class Isolate : public BaseIsolate { | 
| public: | 
| // Keep both these enums in sync with isolate_patch.dart. | 
| @@ -150,6 +163,9 @@ class Isolate : public BaseIsolate { | 
| return OFFSET_OF(Isolate, class_table_); | 
| } | 
|  | 
| +  // Prefers old classes when we are in the middle of a reload. | 
| +  RawClass* GetClassForHeapWalkAt(intptr_t cid); | 
| + | 
| static intptr_t ic_miss_code_offset() { | 
| return OFFSET_OF(Isolate, ic_miss_code_); | 
| } | 
| @@ -237,6 +253,10 @@ class Isolate : public BaseIsolate { | 
|  | 
| // Marks all libraries as loaded. | 
| void DoneLoading(); | 
| +  void DoneFinalizing(); | 
| + | 
| +  void OnStackReload(); | 
| +  void ReloadSources(bool test_mode = false); | 
|  | 
| bool MakeRunnable(); | 
| void Run(); | 
| @@ -388,6 +408,22 @@ class Isolate : public BaseIsolate { | 
| background_compiler_ = value; | 
| } | 
|  | 
| +  void enable_background_compiler() { | 
| +    background_compiler_disabled_depth_--; | 
| +    if (background_compiler_disabled_depth_ < 0) { | 
| +      FATAL("Mismatched number of calls to disable_background_compiler and " | 
| +            "enable_background_compiler."); | 
| +    } | 
| +  } | 
| + | 
| +  void disable_background_compiler() { | 
| +    background_compiler_disabled_depth_++; | 
| +  } | 
| + | 
| +  bool is_background_compiler_disabled() const { | 
| +    return background_compiler_disabled_depth_ > 0; | 
| +  } | 
| + | 
| void UpdateLastAllocationProfileAccumulatorResetTimestamp() { | 
| last_allocationprofile_accumulator_reset_timestamp_ = | 
| OS::GetCurrentTimeMillis(); | 
| @@ -432,6 +468,22 @@ class Isolate : public BaseIsolate { | 
| return &vm_tag_counters_; | 
| } | 
|  | 
| +  bool IsReloading() const { | 
| +    return reload_context_ != NULL; | 
| +  } | 
| + | 
| +  IsolateReloadContext* reload_context() { | 
| +    return reload_context_; | 
| +  } | 
| + | 
| +  bool HasAttemptedReload() const { | 
| +    return has_attempted_reload_; | 
| +  } | 
| + | 
| +  bool CanReload() const; | 
| + | 
| +  void ReportReloadError(const Error& error); | 
| + | 
| uword user_tag() const { | 
| return user_tag_; | 
| } | 
| @@ -717,6 +769,7 @@ class Isolate : public BaseIsolate { | 
|  | 
| // Background compilation. | 
| BackgroundCompiler* background_compiler_; | 
| +  intptr_t background_compiler_disabled_depth_; | 
|  | 
| // We use 6 list entries for each pending service extension calls. | 
| enum { | 
| @@ -769,6 +822,11 @@ class Isolate : public BaseIsolate { | 
| Monitor* spawn_count_monitor_; | 
| intptr_t spawn_count_; | 
|  | 
| +  // Has a reload ever been attempted? | 
| +  bool has_attempted_reload_; | 
| +  intptr_t no_reload_scope_depth_;  // we can only reload when this is 0. | 
| +  IsolateReloadContext* reload_context_; | 
| + | 
| #define ISOLATE_METRIC_VARIABLE(type, variable, name, unit)                    \ | 
| type metric_##variable##_; | 
| ISOLATE_METRIC_LIST(ISOLATE_METRIC_VARIABLE); | 
| @@ -795,12 +853,15 @@ class Isolate : public BaseIsolate { | 
| REUSABLE_HANDLE_LIST(REUSABLE_FRIEND_DECLARATION) | 
| #undef REUSABLE_FRIEND_DECLARATION | 
|  | 
| +  friend class Become;  // VisitObjectPointers | 
| friend class GCMarker;  // VisitObjectPointers | 
| friend class SafepointHandler; | 
| friend class Scavenger;  // VisitObjectPointers | 
| friend class ServiceIsolate; | 
| friend class Thread; | 
| friend class Timeline; | 
| +  friend class NoReloadScope;  // reload_block | 
| + | 
|  | 
| DISALLOW_COPY_AND_ASSIGN(Isolate); | 
| }; | 
|  |