Add an API to unwind from a hand-called expression.

This is just an SB API way of doing "thread return -x".
<rdar://problem/27110360>

llvm-svn: 274822
This commit is contained in:
Jim Ingham 2016-07-08 02:12:05 +00:00
parent 0160063aeb
commit 4ac8e93a4e
3 changed files with 36 additions and 0 deletions

View File

@ -150,6 +150,9 @@ public:
SBError
ReturnFromFrame (SBFrame &frame, SBValue &return_value);
SBError
UnwindInnermostExpression();
//--------------------------------------------------------------------------
/// LLDB currently supports process centric debugging which means when any
/// thread in a process stops, all other threads are stopped. The Suspend()

View File

@ -259,6 +259,14 @@ public:
SBError
ReturnFromFrame (SBFrame &frame, SBValue &return_value);
%feature("autodoc", "
Unwind the stack frames from the innermost expression evaluation.
This API is equivalent to 'thread return -x'.
") UnwindInnermostExpression;
SBError
UnwindInnermostExpression();
%feature("docstring", "
//--------------------------------------------------------------------------
/// LLDB currently supports process centric debugging which means when any

View File

@ -1249,6 +1249,31 @@ SBThread::ReturnFromFrame (SBFrame &frame, SBValue &return_value)
return sb_error;
}
SBError
SBThread::UnwindInnermostExpression()
{
SBError sb_error;
Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
std::unique_lock<std::recursive_mutex> lock;
ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
if (log)
log->Printf ("SBThread(%p)::UnwindExpressionEvaluation",
static_cast<void*>(exe_ctx.GetThreadPtr()));
if (exe_ctx.HasThreadScope())
{
Thread *thread = exe_ctx.GetThreadPtr();
sb_error.SetError (thread->UnwindInnermostExpression());
if (sb_error.Success())
thread->SetSelectedFrameByIndex(0, false);
}
return sb_error;
}
bool
SBThread::Suspend()