From ba7b8e2c8c48f3ae3eda4508d4076d00b4644358 Mon Sep 17 00:00:00 2001 From: Greg Clayton Date: Sat, 26 Jan 2013 23:54:29 +0000 Subject: [PATCH] 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 --- lldb/source/Commands/CommandObjectExpression.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/lldb/source/Commands/CommandObjectExpression.cpp b/lldb/source/Commands/CommandObjectExpression.cpp index 703e13563327..9c4c05d2410c 100644 --- a/lldb/source/Commands/CommandObjectExpression.cpp +++ b/lldb/source/Commands/CommandObjectExpression.cpp @@ -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;