| Index: src/heap/heap.h | 
| diff --git a/src/heap/heap.h b/src/heap/heap.h | 
| index dcf7bdea0ac812972304bd382d52b0a1f4c5eff2..1f573f77c4e1ef313903a913d7452546033b6167 100644 | 
| --- a/src/heap/heap.h | 
| +++ b/src/heap/heap.h | 
| @@ -1452,21 +1452,68 @@ class Heap { | 
| void TraceObjectStat(const char* name, int count, int size, double time); | 
| void CheckpointObjectStats(); | 
|  | 
| -  // We don't use a LockGuard here since we want to lock the heap | 
| -  // only when FLAG_concurrent_recompilation is true. | 
| +  struct StrongRootsList { | 
| +    Object** start_; | 
| +    Object** end_; | 
| +    StrongRootsList* next_; | 
| +  }; | 
| + | 
| +  void RegisterStrongRoots(Object** start, Object** end) { | 
| +    StrongRootsList* list = new StrongRootsList(); | 
| +    list->next_ = strong_roots_list_; | 
| +    list->start_ = start; | 
| +    list->end_ = end; | 
| +    strong_roots_list_ = list; | 
| +  } | 
| + | 
| +  void UnregisterStrongRoots(Object** start) { | 
| +    StrongRootsList* prev = NULL; | 
| +    for (StrongRootsList* list = strong_roots_list_; list; list = list->next_) { | 
| +      if (list->start_ == start) { | 
| +        if (prev) { | 
| +          prev->next_ = list->next_; | 
| +        } else { | 
| +          strong_roots_list_ = list->next_; | 
| +        } | 
| +        delete list; | 
| +      } | 
| +      prev = list; | 
| +    } | 
| +  } | 
| + | 
| +  // Taking this lock prevents the GC from entering a phase that relocates | 
| +  // object references. | 
| class RelocationLock { | 
| public: | 
| explicit RelocationLock(Heap* heap) : heap_(heap) { | 
| heap_->relocation_mutex_.Lock(); | 
| } | 
|  | 
| - | 
| ~RelocationLock() { heap_->relocation_mutex_.Unlock(); } | 
|  | 
| private: | 
| Heap* heap_; | 
| }; | 
|  | 
| +  // An optional version of the above lock that can be used for some critical | 
| +  // sections on the mutator thread; only safe since the GC currently does not | 
| +  // do concurrent compaction. | 
| +  class OptionalRelocationLock { | 
| +   public: | 
| +    explicit OptionalRelocationLock(Heap* heap, bool concurrent) | 
| +        : heap_(heap), concurrent_(concurrent) { | 
| +      if (concurrent_) heap_->relocation_mutex_.Lock(); | 
| +    } | 
| + | 
| +    ~OptionalRelocationLock() { | 
| +      if (concurrent_) heap_->relocation_mutex_.Unlock(); | 
| +    } | 
| + | 
| +   private: | 
| +    Heap* heap_; | 
| +    bool concurrent_; | 
| +  }; | 
| + | 
| void AddWeakObjectToCodeDependency(Handle<HeapObject> obj, | 
| Handle<DependentCode> dep); | 
|  | 
| @@ -2152,6 +2199,8 @@ class Heap { | 
|  | 
| bool concurrent_sweeping_enabled_; | 
|  | 
| +  StrongRootsList* strong_roots_list_; | 
| + | 
| friend class AlwaysAllocateScope; | 
| friend class Deserializer; | 
| friend class Factory; | 
|  |