| Index: src/heap/spaces.cc | 
| diff --git a/src/heap/spaces.cc b/src/heap/spaces.cc | 
| index d2e908bb00e58c0c35e4acfa3688af23923d1cc5..52ebde844f8af97ce6b578381d47569fe0fcc909 100644 | 
| --- a/src/heap/spaces.cc | 
| +++ b/src/heap/spaces.cc | 
| @@ -1509,7 +1509,8 @@ void NewSpace::UpdateInlineAllocationLimit(int size_in_bytes) { | 
| Address high = to_space_.page_high(); | 
| Address new_top = allocation_info_.top() + size_in_bytes; | 
| allocation_info_.set_limit(Min(new_top, high)); | 
| -  } else if (top_on_previous_step_ == 0) { | 
| +  } else if (inline_allocation_observers_paused_ || | 
| +             top_on_previous_step_ == 0) { | 
| // Normal limit is the end of the current page. | 
| allocation_info_.set_limit(to_space_.page_high()); | 
| } else { | 
| @@ -1602,6 +1603,7 @@ bool NewSpace::EnsureAllocation(int size_in_bytes, | 
|  | 
|  | 
| void NewSpace::StartNextInlineAllocationStep() { | 
| +  DCHECK(!inline_allocation_observers_paused_); | 
| top_on_previous_step_ = | 
| inline_allocation_observers_.length() ? allocation_info_.top() : 0; | 
| UpdateInlineAllocationLimit(0); | 
| @@ -1636,6 +1638,22 @@ void NewSpace::RemoveInlineAllocationObserver( | 
| } | 
|  | 
|  | 
| +void NewSpace::PauseInlineAllocationObservers() { | 
| +  // Do a step to account for memory allocated so far. | 
| +  InlineAllocationStep(top(), top()); | 
| +  inline_allocation_observers_paused_ = true; | 
| +  top_on_previous_step_ = 0; | 
| +  UpdateInlineAllocationLimit(0); | 
| +} | 
| + | 
| + | 
| +void NewSpace::ResumeInlineAllocationObservers() { | 
| +  DCHECK(top_on_previous_step_ == 0); | 
| +  inline_allocation_observers_paused_ = false; | 
| +  StartNextInlineAllocationStep(); | 
| +} | 
| + | 
| + | 
| void NewSpace::InlineAllocationStep(Address top, Address new_top) { | 
| if (top_on_previous_step_) { | 
| int bytes_allocated = static_cast<int>(top - top_on_previous_step_); | 
|  |