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: |