| Index: src/debug/debug.cc | 
| diff --git a/src/debug/debug.cc b/src/debug/debug.cc | 
| index 495e162f28194ce34034dcdf5139934728642a9d..948cf41f0373c7f7142564e4fece13c9114a57f0 100644 | 
| --- a/src/debug/debug.cc | 
| +++ b/src/debug/debug.cc | 
| @@ -479,6 +479,7 @@ void Debug::ThreadInit() { | 
| thread_local_.target_fp_ = 0; | 
| thread_local_.step_in_enabled_ = false; | 
| thread_local_.return_value_ = Handle<Object>(); | 
| +  clear_suspended_generator(); | 
| // TODO(isolates): frames_are_dropped_? | 
| base::NoBarrier_Store(&thread_local_.current_debug_scope_, | 
| static_cast<base::AtomicWord>(0)); | 
| @@ -486,25 +487,24 @@ void Debug::ThreadInit() { | 
|  | 
|  | 
| char* Debug::ArchiveDebug(char* storage) { | 
| -  char* to = storage; | 
| -  MemCopy(to, reinterpret_cast<char*>(&thread_local_), sizeof(ThreadLocal)); | 
| +  // Simply reset state. Don't archive anything. | 
| ThreadInit(); | 
| return storage + ArchiveSpacePerThread(); | 
| } | 
|  | 
|  | 
| char* Debug::RestoreDebug(char* storage) { | 
| -  char* from = storage; | 
| -  MemCopy(reinterpret_cast<char*>(&thread_local_), from, sizeof(ThreadLocal)); | 
| +  // Simply reset state. Don't restore anything. | 
| +  ThreadInit(); | 
| return storage + ArchiveSpacePerThread(); | 
| } | 
|  | 
| +int Debug::ArchiveSpacePerThread() { return 0; } | 
|  | 
| -int Debug::ArchiveSpacePerThread() { | 
| -  return sizeof(ThreadLocal); | 
| +void Debug::Iterate(ObjectVisitor* v) { | 
| +  v->VisitPointer(&thread_local_.suspended_generator_); | 
| } | 
|  | 
| - | 
| DebugInfoListNode::DebugInfoListNode(DebugInfo* debug_info): next_(NULL) { | 
| // Globalize the request debug info object and make it weak. | 
| GlobalHandles* global_handles = debug_info->GetIsolate()->global_handles(); | 
| @@ -940,6 +940,17 @@ void Debug::PrepareStepIn(Handle<JSFunction> function) { | 
| } | 
| } | 
|  | 
| +void Debug::PrepareStepInSuspendedGenerator() { | 
| +  if (!is_active()) return; | 
| +  if (in_debug_scope()) return; | 
| +  DCHECK(has_suspended_generator()); | 
| +  thread_local_.last_step_action_ = StepIn; | 
| +  thread_local_.step_in_enabled_ = true; | 
| +  Handle<JSFunction> function( | 
| +      JSGeneratorObject::cast(thread_local_.suspended_generator_)->function()); | 
| +  FloodWithOneShot(function); | 
| +  clear_suspended_generator(); | 
| +} | 
|  | 
| void Debug::PrepareStepOnThrow() { | 
| if (!is_active()) return; | 
| @@ -1041,6 +1052,8 @@ void Debug::PrepareStep(StepAction step_action) { | 
| debug_info->abstract_code()->SourceStatementPosition( | 
| summary.code_offset()); | 
| thread_local_.last_fp_ = frame->UnpaddedFP(); | 
| +  // No longer perform the current async step. | 
| +  clear_suspended_generator(); | 
|  | 
| switch (step_action) { | 
| case StepNone: | 
| @@ -1385,6 +1398,13 @@ bool Debug::PrepareFunctionForBreakPoints(Handle<SharedFunctionInfo> shared) { | 
| return true; | 
| } | 
|  | 
| +void Debug::RecordAsyncFunction(Handle<JSGeneratorObject> generator_object) { | 
| +  if (last_step_action() <= StepOut) return; | 
| +  DCHECK(!has_suspended_generator()); | 
| +  DCHECK(generator_object->function()->shared()->is_async()); | 
| +  thread_local_.suspended_generator_ = *generator_object; | 
| +  ClearStepping(); | 
| +} | 
|  | 
| class SharedFunctionInfoFinder { | 
| public: | 
|  |