-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[lldb][nfc] Factor out repeated code in DWIM Print #85669
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
@llvm/pr-subscribers-lldb Author: Felipe de Azevedo Piovezan (felipepiovezan) ChangesThe code that prints ValueObjects is duplicated across two different cases of the dwim-print command, and a subsequent commit will add a third case. As such, this commit factors out the common code into a lambda. A free function was considered, but there is too much function-local context required in that. We also reword some of the comments so that they stop counting cases, making it easier to add other cases later. Full diff: https://github.com/llvm/llvm-project/pull/85669.diff 1 Files Affected:
diff --git a/lldb/source/Commands/CommandObjectDWIMPrint.cpp b/lldb/source/Commands/CommandObjectDWIMPrint.cpp
index b183cb423111fb..300647a98b6b95 100644
--- a/lldb/source/Commands/CommandObjectDWIMPrint.cpp
+++ b/lldb/source/Commands/CommandObjectDWIMPrint.cpp
@@ -130,7 +130,20 @@ void CommandObjectDWIMPrint::DoExecute(StringRef command,
}
};
- // First, try `expr` as the name of a frame variable.
+ // Dump `valobj` according to whether `po` was requested or not.
+ auto dump_val_object = [&](ValueObject &valobj) {
+ if (is_po) {
+ StreamString temp_result_stream;
+ valobj.Dump(temp_result_stream, dump_options);
+ llvm::StringRef output = temp_result_stream.GetString();
+ maybe_add_hint(output);
+ result.GetOutputStream() << output;
+ } else {
+ valobj.Dump(result.GetOutputStream(), dump_options);
+ }
+ };
+
+ // Try `expr` as the name of a frame variable.
if (frame) {
auto valobj_sp = frame->FindVariable(ConstString(expr));
if (valobj_sp && valobj_sp->GetError().Success()) {
@@ -147,21 +160,13 @@ void CommandObjectDWIMPrint::DoExecute(StringRef command,
flags, expr);
}
- if (is_po) {
- StreamString temp_result_stream;
- valobj_sp->Dump(temp_result_stream, dump_options);
- llvm::StringRef output = temp_result_stream.GetString();
- maybe_add_hint(output);
- result.GetOutputStream() << output;
- } else {
- valobj_sp->Dump(result.GetOutputStream(), dump_options);
- }
+ dump_val_object(*valobj_sp);
result.SetStatus(eReturnStatusSuccessFinishResult);
return;
}
}
- // Second, also lastly, try `expr` as a source expression to evaluate.
+ // Try `expr` as a source expression to evaluate.
{
auto *exe_scope = m_exe_ctx.GetBestExecutionContextScope();
ValueObjectSP valobj_sp;
@@ -187,17 +192,8 @@ void CommandObjectDWIMPrint::DoExecute(StringRef command,
expr);
}
- if (valobj_sp->GetError().GetError() != UserExpression::kNoResult) {
- if (is_po) {
- StreamString temp_result_stream;
- valobj_sp->Dump(temp_result_stream, dump_options);
- llvm::StringRef output = temp_result_stream.GetString();
- maybe_add_hint(output);
- result.GetOutputStream() << output;
- } else {
- valobj_sp->Dump(result.GetOutputStream(), dump_options);
- }
- }
+ if (valobj_sp->GetError().GetError() != UserExpression::kNoResult)
+ dump_val_object(*valobj_sp);
if (suppress_result)
if (auto result_var_sp =
|
@@ -130,7 +130,20 @@ void CommandObjectDWIMPrint::DoExecute(StringRef command, | |||
} | |||
}; | |||
|
|||
// First, try `expr` as the name of a frame variable. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- I'd prefer to leave the "first", "second", "third" comments. I want to be explicit that there's an order of attempts.
- You'll need to rebase, I made a change last week that introduce some comments and code that you may need to incorporate.
0480765
to
ddc9c22
Compare
The code that prints ValueObjects is duplicated across two different cases of the dwim-print command, and a subsequent commit will add a third case. As such, this commit factors out the common code into a lambda. A free function was considered, but there is too much function-local context required in that. We also reword some of the comments so that they stop counting cases, making it easier to add other cases later.
ddc9c22
to
baa85a2
Compare
Rebased, address review comments |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
one request, and then looks good, thanks.
@@ -129,6 +129,19 @@ void CommandObjectDWIMPrint::DoExecute(StringRef command, | |||
} | |||
}; | |||
|
|||
// Dump `valobj` according to whether `po` was requested or not. | |||
auto dump_val_object = [&](ValueObject &valobj) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Would you mind also applying this function to the block that handles persistent variables (I just added it in #85152). Thanks.
The code that prints ValueObjects is duplicated across two different cases of the dwim-print command, and a subsequent commit will add a third case. As such, this commit factors out the common code into a lambda. A free function was considered, but there is too much function-local context required in that. We also reword some of the comments so that they stop counting cases, making it easier to add other cases later.
The code that prints ValueObjects is duplicated across two different cases of the dwim-print command, and a subsequent commit will add a third case. As such, this commit factors out the common code into a lambda. A free function was considered, but there is too much function-local context required in that. We also reword some of the comments so that they stop counting cases, making it easier to add other cases later. (cherry picked from commit 65d444b)
The code that prints ValueObjects is duplicated across two different cases of the dwim-print command, and a subsequent commit will add a third case. As such, this commit factors out the common code into a lambda. A free function was considered, but there is too much function-local context required in that.
We also reword some of the comments so that they stop counting cases, making it easier to add other cases later.