| Index: src/heap/heap.cc | 
| diff --git a/src/heap/heap.cc b/src/heap/heap.cc | 
| index 39bd6b2663529a44021ab196d9da31a91a710ab4..a37815297142b8f5509058cbf0ba86d8f89d9bbc 100644 | 
| --- a/src/heap/heap.cc | 
| +++ b/src/heap/heap.cc | 
| @@ -71,7 +71,7 @@ class IdleScavengeObserver : public AllocationObserver { | 
| Heap::Heap() | 
| : amount_of_external_allocated_memory_(0), | 
| amount_of_external_allocated_memory_at_last_global_gc_(0), | 
| -      isolate_(NULL), | 
| +      isolate_(nullptr), | 
| code_range_size_(0), | 
| // semispace_size_ should be a power of 2 and old_generation_size_ should | 
| // be a multiple of Page::kPageSize. | 
| @@ -136,6 +136,7 @@ Heap::Heap() | 
| last_gc_time_(0.0), | 
| scavenge_collector_(nullptr), | 
| mark_compact_collector_(nullptr), | 
| +      memory_allocator_(nullptr), | 
| store_buffer_(this), | 
| incremental_marking_(nullptr), | 
| gc_idle_time_handler_(nullptr), | 
| @@ -225,7 +226,7 @@ size_t Heap::CommittedPhysicalMemory() { | 
| intptr_t Heap::CommittedMemoryExecutable() { | 
| if (!HasBeenSetUp()) return 0; | 
|  | 
| -  return isolate()->memory_allocator()->SizeExecutable(); | 
| +  return memory_allocator()->SizeExecutable(); | 
| } | 
|  | 
|  | 
| @@ -296,7 +297,7 @@ GarbageCollector Heap::SelectGarbageCollector(AllocationSpace space, | 
| // and does not count available bytes already in the old space or code | 
| // space.  Undercounting is safe---we may get an unrequested full GC when | 
| // a scavenge would have succeeded. | 
| -  if (isolate_->memory_allocator()->MaxAvailable() <= new_space_.Size()) { | 
| +  if (memory_allocator()->MaxAvailable() <= new_space_.Size()) { | 
| isolate_->counters() | 
| ->gc_compactor_caused_by_oldspace_exhaustion() | 
| ->Increment(); | 
| @@ -339,8 +340,8 @@ void Heap::PrintShortHeapStatistics() { | 
| PrintIsolate(isolate_, "Memory allocator,   used: %6" V8_PTR_PREFIX | 
| "d KB" | 
| ", available: %6" V8_PTR_PREFIX "d KB\n", | 
| -               isolate_->memory_allocator()->Size() / KB, | 
| -               isolate_->memory_allocator()->Available() / KB); | 
| +               memory_allocator()->Size() / KB, | 
| +               memory_allocator()->Available() / KB); | 
| PrintIsolate(isolate_, "New space,          used: %6" V8_PTR_PREFIX | 
| "d KB" | 
| ", available: %6" V8_PTR_PREFIX | 
| @@ -3373,8 +3374,9 @@ AllocationResult Heap::AllocateCode(int object_size, bool immovable) { | 
| result->set_map_no_write_barrier(code_map()); | 
| Code* code = Code::cast(result); | 
| DCHECK(IsAligned(bit_cast<intptr_t>(code->address()), kCodeAlignment)); | 
| -  DCHECK(isolate_->code_range() == NULL || !isolate_->code_range()->valid() || | 
| -         isolate_->code_range()->contains(code->address()) || | 
| +  DCHECK(memory_allocator()->code_range() == NULL || | 
| +         !memory_allocator()->code_range()->valid() || | 
| +         memory_allocator()->code_range()->contains(code->address()) || | 
| object_size <= code_space()->AreaSize()); | 
| code->set_gc_metadata(Smi::FromInt(0)); | 
| code->set_ic_age(global_ic_age_); | 
| @@ -3399,8 +3401,9 @@ AllocationResult Heap::CopyCode(Code* code) { | 
|  | 
| // Relocate the copy. | 
| DCHECK(IsAligned(bit_cast<intptr_t>(new_code->address()), kCodeAlignment)); | 
| -  DCHECK(isolate_->code_range() == NULL || !isolate_->code_range()->valid() || | 
| -         isolate_->code_range()->contains(code->address()) || | 
| +  DCHECK(memory_allocator()->code_range() == NULL || | 
| +         !memory_allocator()->code_range()->valid() || | 
| +         memory_allocator()->code_range()->contains(code->address()) || | 
| obj_size <= code_space()->AreaSize()); | 
| new_code->Relocate(new_addr - old_addr); | 
| // We have to iterate over the object and process its pointers when black | 
| @@ -3468,8 +3471,9 @@ AllocationResult Heap::CopyCode(Code* code, Vector<byte> reloc_info) { | 
|  | 
| // Relocate the copy. | 
| DCHECK(IsAligned(bit_cast<intptr_t>(new_code->address()), kCodeAlignment)); | 
| -  DCHECK(isolate_->code_range() == NULL || !isolate_->code_range()->valid() || | 
| -         isolate_->code_range()->contains(code->address()) || | 
| +  DCHECK(memory_allocator()->code_range() == NULL || | 
| +         !memory_allocator()->code_range()->valid() || | 
| +         memory_allocator()->code_range()->contains(code->address()) || | 
| new_obj_size <= code_space()->AreaSize()); | 
|  | 
| new_code->Relocate(new_addr - old_addr); | 
| @@ -4514,7 +4518,7 @@ void Heap::ReportHeapStatistics(const char* title) { | 
| PrintF("\n"); | 
|  | 
| PrintF("Heap statistics : "); | 
| -  isolate_->memory_allocator()->ReportStatistics(); | 
| +  memory_allocator()->ReportStatistics(); | 
| PrintF("To space : "); | 
| new_space_.ReportStatistics(); | 
| PrintF("Old space : "); | 
| @@ -4531,7 +4535,7 @@ void Heap::ReportHeapStatistics(const char* title) { | 
| #endif  // DEBUG | 
|  | 
| bool Heap::Contains(HeapObject* value) { | 
| -  if (isolate_->memory_allocator()->IsOutsideAllocatedSpace(value->address())) { | 
| +  if (memory_allocator()->IsOutsideAllocatedSpace(value->address())) { | 
| return false; | 
| } | 
| return HasBeenSetUp() && | 
| @@ -4541,7 +4545,7 @@ bool Heap::Contains(HeapObject* value) { | 
| } | 
|  | 
| bool Heap::ContainsSlow(Address addr) { | 
| -  if (isolate_->memory_allocator()->IsOutsideAllocatedSpace(addr)) { | 
| +  if (memory_allocator()->IsOutsideAllocatedSpace(addr)) { | 
| return false; | 
| } | 
| return HasBeenSetUp() && | 
| @@ -4551,7 +4555,7 @@ bool Heap::ContainsSlow(Address addr) { | 
| } | 
|  | 
| bool Heap::InSpace(HeapObject* value, AllocationSpace space) { | 
| -  if (isolate_->memory_allocator()->IsOutsideAllocatedSpace(value->address())) { | 
| +  if (memory_allocator()->IsOutsideAllocatedSpace(value->address())) { | 
| return false; | 
| } | 
| if (!HasBeenSetUp()) return false; | 
| @@ -4573,7 +4577,7 @@ bool Heap::InSpace(HeapObject* value, AllocationSpace space) { | 
| } | 
|  | 
| bool Heap::InSpaceSlow(Address addr, AllocationSpace space) { | 
| -  if (isolate_->memory_allocator()->IsOutsideAllocatedSpace(addr)) { | 
| +  if (memory_allocator()->IsOutsideAllocatedSpace(addr)) { | 
| return false; | 
| } | 
| if (!HasBeenSetUp()) return false; | 
| @@ -5014,12 +5018,11 @@ void Heap::RecordStats(HeapStats* stats, bool take_snapshot) { | 
| *stats->map_space_capacity = map_space_->Capacity(); | 
| *stats->lo_space_size = lo_space_->Size(); | 
| isolate_->global_handles()->RecordStats(stats); | 
| -  *stats->memory_allocator_size = isolate()->memory_allocator()->Size(); | 
| +  *stats->memory_allocator_size = memory_allocator()->Size(); | 
| *stats->memory_allocator_capacity = | 
| -      isolate()->memory_allocator()->Size() + | 
| -      isolate()->memory_allocator()->Available(); | 
| +      memory_allocator()->Size() + memory_allocator()->Available(); | 
| *stats->os_error = base::OS::GetLastError(); | 
| -  isolate()->memory_allocator()->Available(); | 
| +  memory_allocator()->Available(); | 
| if (take_snapshot) { | 
| HeapIterator iterator(this); | 
| for (HeapObject* obj = iterator.next(); obj != NULL; | 
| @@ -5254,7 +5257,9 @@ bool Heap::SetUp() { | 
| base::CallOnce(&initialize_gc_once, &InitializeGCOnce); | 
|  | 
| // Set up memory allocator. | 
| -  if (!isolate_->memory_allocator()->SetUp(MaxReserved(), MaxExecutableSize())) | 
| +  memory_allocator_ = new MemoryAllocator(isolate_); | 
| +  if (!memory_allocator_->SetUp(MaxReserved(), MaxExecutableSize(), | 
| +                                code_range_size_)) | 
| return false; | 
|  | 
| // Initialize incremental marking. | 
| @@ -5271,8 +5276,6 @@ bool Heap::SetUp() { | 
| if (old_space_ == NULL) return false; | 
| if (!old_space_->SetUp()) return false; | 
|  | 
| -  if (!isolate_->code_range()->SetUp(code_range_size_)) return false; | 
| - | 
| // Initialize the code space, set its maximum capacity to the old | 
| // generation size. It needs executable memory. | 
| code_space_ = new OldSpace(this, CODE_SPACE, EXECUTABLE); | 
| @@ -5512,7 +5515,7 @@ void Heap::TearDown() { | 
|  | 
| store_buffer()->TearDown(); | 
|  | 
| -  isolate_->memory_allocator()->TearDown(); | 
| +  memory_allocator()->TearDown(); | 
|  | 
| StrongRootsList* next = NULL; | 
| for (StrongRootsList* list = strong_roots_list_; list; list = next) { | 
| @@ -5520,6 +5523,9 @@ void Heap::TearDown() { | 
| delete list; | 
| } | 
| strong_roots_list_ = NULL; | 
| + | 
| +  delete memory_allocator_; | 
| +  memory_allocator_ = nullptr; | 
| } | 
|  | 
|  | 
| @@ -6319,7 +6325,7 @@ void Heap::WaitUntilUnmappingOfFreeChunksCompleted() { | 
| void Heap::QueueMemoryChunkForFree(MemoryChunk* chunk) { | 
| // PreFree logically frees the memory chunk. However, the actual freeing | 
| // will happen on a separate thread sometime later. | 
| -  isolate_->memory_allocator()->PreFreeMemory(chunk); | 
| +  memory_allocator()->PreFreeMemory(chunk); | 
|  | 
| // The chunks added to this queue will be freed by a concurrent thread. | 
| chunk->set_next_chunk(chunks_queued_for_free_); | 
| @@ -6352,7 +6358,7 @@ void Heap::FreeQueuedChunks(MemoryChunk* list_head) { | 
| MemoryChunk* chunk; | 
| for (chunk = list_head; chunk != NULL; chunk = next) { | 
| next = chunk->next_chunk(); | 
| -    isolate_->memory_allocator()->PerformFreeMemory(chunk); | 
| +    memory_allocator()->PerformFreeMemory(chunk); | 
| } | 
| } | 
|  | 
|  |