Make sure that multi-line expressions don't create a default target. We recently switched to using a built-in m_exe_ctx when running commands in the DoExecute() so that we can have common code where commands can required having a valid target/process/thread/frame by specifying flags, this caused multi-line expression to always create a new dummy target because m_exe_ctx gets cleared when DoExecute exits. A new input reader has been pushed to handle the input for the expression, which will get popped off and then it was checking the target in m_exe_ctx (which was cleared).

llvm-svn: 173596
This commit is contained in:
Greg Clayton 2013-01-26 23:54:29 +00:00
parent b95b3f128b
commit ba7b8e2c8c
1 changed files with 9 additions and 4 deletions

View File

@ -314,7 +314,12 @@ CommandObjectExpression::EvaluateExpression
CommandReturnObject *result
)
{
Target *target = m_exe_ctx.GetTargetPtr();
// Don't use m_exe_ctx as this might be called asynchronously
// after the command object DoExecute has finished when doing
// multi-line expression that use an input reader...
ExecutionContext exe_ctx (m_interpreter.GetExecutionContext());
Target *target = exe_ctx.GetTargetPtr();
if (!target)
target = Host::GetDummyTarget(m_interpreter.GetDebugger()).get();
@ -337,7 +342,7 @@ CommandObjectExpression::EvaluateExpression
.SetTimeoutUsec(m_command_options.timeout);
exe_results = target->EvaluateExpression (expr,
m_exe_ctx.GetFramePtr(),
exe_ctx.GetFramePtr(),
result_valobj_sp,
options);
@ -347,7 +352,7 @@ CommandObjectExpression::EvaluateExpression
uint32_t start_frame = 0;
uint32_t num_frames = 1;
uint32_t num_frames_with_source = 0;
Thread *thread = m_exe_ctx.GetThreadPtr();
Thread *thread = exe_ctx.GetThreadPtr();
if (thread)
{
thread->GetStatus (result->GetOutputStream(),
@ -357,7 +362,7 @@ CommandObjectExpression::EvaluateExpression
}
else
{
Process *process = m_exe_ctx.GetProcessPtr();
Process *process = exe_ctx.GetProcessPtr();
if (process)
{
bool only_threads_with_stop_reason = true;