summaryrefslogtreecommitdiff
path: root/lldb/source/Commands/CommandObjectExpression.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Commands/CommandObjectExpression.cpp')
-rw-r--r--lldb/source/Commands/CommandObjectExpression.cpp105
1 files changed, 56 insertions, 49 deletions
diff --git a/lldb/source/Commands/CommandObjectExpression.cpp b/lldb/source/Commands/CommandObjectExpression.cpp
index db90dde98eff5..b23adb087b497 100644
--- a/lldb/source/Commands/CommandObjectExpression.cpp
+++ b/lldb/source/Commands/CommandObjectExpression.cpp
@@ -1,4 +1,4 @@
-//===-- CommandObjectExpression.cpp -----------------------------*- C++ -*-===//
+//===-- CommandObjectExpression.cpp ---------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
@@ -311,7 +311,12 @@ void CommandObjectExpression::HandleCompletion(CompletionRequest &request) {
target = &GetDummyTarget();
unsigned cursor_pos = request.GetRawCursorPos();
- llvm::StringRef code = request.GetRawLine();
+ // Get the full user input including the suffix. The suffix is necessary
+ // as OptionsWithRaw will use it to detect if the cursor is cursor is in the
+ // argument part of in the raw input part of the arguments. If we cut of
+ // of the suffix then "expr -arg[cursor] --" would interpret the "-arg" as
+ // the raw input (as the "--" is hidden in the suffix).
+ llvm::StringRef code = request.GetRawLineWithUnusedSuffix();
const std::size_t original_code_size = code.size();
@@ -357,29 +362,13 @@ CanBeUsedForElementCountPrinting(ValueObject &valobj) {
return Status();
}
-bool CommandObjectExpression::EvaluateExpression(llvm::StringRef expr,
- Stream *output_stream,
- Stream *error_stream,
- CommandReturnObject *result) {
- // 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 = &GetDummyTarget();
-
- lldb::ValueObjectSP result_valobj_sp;
- bool keep_in_memory = true;
- StackFrame *frame = exe_ctx.GetFramePtr();
-
+EvaluateExpressionOptions
+CommandObjectExpression::GetEvalOptions(const Target &target) {
EvaluateExpressionOptions options;
options.SetCoerceToId(m_varobj_options.use_objc);
options.SetUnwindOnError(m_command_options.unwind_on_error);
options.SetIgnoreBreakpoints(m_command_options.ignore_breakpoints);
- options.SetKeepInMemory(keep_in_memory);
+ options.SetKeepInMemory(true);
options.SetUseDynamic(m_varobj_options.use_dynamic);
options.SetTryAllThreads(m_command_options.try_all_threads);
options.SetDebug(m_command_options.debug);
@@ -391,11 +380,12 @@ bool CommandObjectExpression::EvaluateExpression(llvm::StringRef expr,
bool auto_apply_fixits;
if (m_command_options.auto_apply_fixits == eLazyBoolCalculate)
- auto_apply_fixits = target->GetEnableAutoApplyFixIts();
+ auto_apply_fixits = target.GetEnableAutoApplyFixIts();
else
auto_apply_fixits = m_command_options.auto_apply_fixits == eLazyBoolYes;
options.SetAutoApplyFixIts(auto_apply_fixits);
+ options.SetRetriesWithFixIts(target.GetNumberOfRetriesWithFixits());
if (m_command_options.top_level)
options.SetExecutionPolicy(eExecutionPolicyTopLevel);
@@ -410,17 +400,36 @@ bool CommandObjectExpression::EvaluateExpression(llvm::StringRef expr,
options.SetTimeout(std::chrono::microseconds(m_command_options.timeout));
else
options.SetTimeout(llvm::None);
+ return options;
+}
+bool CommandObjectExpression::EvaluateExpression(llvm::StringRef expr,
+ Stream &output_stream,
+ Stream &error_stream,
+ CommandReturnObject &result) {
+ // 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 = &GetDummyTarget();
+
+ lldb::ValueObjectSP result_valobj_sp;
+ StackFrame *frame = exe_ctx.GetFramePtr();
+
+ const EvaluateExpressionOptions options = GetEvalOptions(*target);
ExpressionResults success = target->EvaluateExpression(
expr, frame, result_valobj_sp, options, &m_fixed_expression);
// We only tell you about the FixIt if we applied it. The compiler errors
// will suggest the FixIt if it parsed.
- if (error_stream && !m_fixed_expression.empty() &&
- target->GetEnableNotifyAboutFixIts()) {
+ if (!m_fixed_expression.empty() && target->GetEnableNotifyAboutFixIts()) {
if (success == eExpressionCompleted)
- error_stream->Printf(" Fix-it applied, fixed expression was: \n %s\n",
- m_fixed_expression.c_str());
+ error_stream.Printf(" Fix-it applied, fixed expression was: \n %s\n",
+ m_fixed_expression.c_str());
}
if (result_valobj_sp) {
@@ -434,10 +443,10 @@ bool CommandObjectExpression::EvaluateExpression(llvm::StringRef expr,
if (m_varobj_options.elem_count > 0) {
Status error(CanBeUsedForElementCountPrinting(*result_valobj_sp));
if (error.Fail()) {
- result->AppendErrorWithFormat(
+ result.AppendErrorWithFormat(
"expression cannot be used with --element-count %s\n",
error.AsCString(""));
- result->SetStatus(eReturnStatusFailed);
+ result.SetStatus(eReturnStatusFailed);
return false;
}
}
@@ -447,41 +456,39 @@ bool CommandObjectExpression::EvaluateExpression(llvm::StringRef expr,
options.SetVariableFormatDisplayLanguage(
result_valobj_sp->GetPreferredDisplayLanguage());
- result_valobj_sp->Dump(*output_stream, options);
+ result_valobj_sp->Dump(output_stream, options);
- if (result)
- result->SetStatus(eReturnStatusSuccessFinishResult);
+ result.SetStatus(eReturnStatusSuccessFinishResult);
}
} else {
if (result_valobj_sp->GetError().GetError() ==
UserExpression::kNoResult) {
if (format != eFormatVoid && GetDebugger().GetNotifyVoid()) {
- error_stream->PutCString("(void)\n");
+ error_stream.PutCString("(void)\n");
}
- if (result)
- result->SetStatus(eReturnStatusSuccessFinishResult);
+ result.SetStatus(eReturnStatusSuccessFinishResult);
} else {
const char *error_cstr = result_valobj_sp->GetError().AsCString();
if (error_cstr && error_cstr[0]) {
const size_t error_cstr_len = strlen(error_cstr);
const bool ends_with_newline = error_cstr[error_cstr_len - 1] == '\n';
if (strstr(error_cstr, "error:") != error_cstr)
- error_stream->PutCString("error: ");
- error_stream->Write(error_cstr, error_cstr_len);
+ error_stream.PutCString("error: ");
+ error_stream.Write(error_cstr, error_cstr_len);
if (!ends_with_newline)
- error_stream->EOL();
+ error_stream.EOL();
} else {
- error_stream->PutCString("error: unknown error\n");
+ error_stream.PutCString("error: unknown error\n");
}
- if (result)
- result->SetStatus(eReturnStatusFailed);
+ result.SetStatus(eReturnStatusFailed);
}
}
}
- return true;
+ return (success != eExpressionSetupError &&
+ success != eExpressionParseError);
}
void CommandObjectExpression::IOHandlerInputComplete(IOHandler &io_handler,
@@ -493,7 +500,9 @@ void CommandObjectExpression::IOHandlerInputComplete(IOHandler &io_handler,
StreamFileSP output_sp = io_handler.GetOutputStreamFileSP();
StreamFileSP error_sp = io_handler.GetErrorStreamFileSP();
- EvaluateExpression(line.c_str(), output_sp.get(), error_sp.get());
+ CommandReturnObject return_obj(
+ GetCommandInterpreter().GetDebugger().GetUseColor());
+ EvaluateExpression(line.c_str(), *output_sp, *error_sp, return_obj);
if (output_sp)
output_sp->Flush();
if (error_sp)
@@ -535,7 +544,7 @@ void CommandObjectExpression::GetMultilineExpression() {
"Enter expressions, then terminate with an empty line to evaluate:\n");
output_sp->Flush();
}
- debugger.PushIOHandler(io_handler_sp);
+ debugger.RunIOHandlerAsync(io_handler_sp);
}
static EvaluateExpressionOptions
@@ -622,10 +631,8 @@ bool CommandObjectExpression::DoExecute(llvm::StringRef command,
}
IOHandlerSP io_handler_sp(repl_sp->GetIOHandler());
-
io_handler_sp->SetIsDone(false);
-
- debugger.PushIOHandler(io_handler_sp);
+ debugger.RunIOHandlerAsync(io_handler_sp);
} else {
repl_error.SetErrorStringWithFormat(
"Couldn't create a REPL for %s",
@@ -643,8 +650,8 @@ bool CommandObjectExpression::DoExecute(llvm::StringRef command,
}
Target &target = GetSelectedOrDummyTarget();
- if (EvaluateExpression(expr, &(result.GetOutputStream()),
- &(result.GetErrorStream()), &result)) {
+ if (EvaluateExpression(expr, result.GetOutputStream(),
+ result.GetErrorStream(), result)) {
if (!m_fixed_expression.empty() && target.GetEnableNotifyAboutFixIts()) {
CommandHistory &history = m_interpreter.GetCommandHistory();
@@ -654,7 +661,7 @@ bool CommandObjectExpression::DoExecute(llvm::StringRef command,
std::string fixed_command("expression ");
if (args.HasArgs()) {
// Add in any options that might have been in the original command:
- fixed_command.append(args.GetArgStringWithDelimiter());
+ fixed_command.append(std::string(args.GetArgStringWithDelimiter()));
fixed_command.append(m_fixed_expression);
} else
fixed_command.append(m_fixed_expression);