Skip to content

Commit f134b8e

Browse files
committed
[lldb] Fallback to expression eval when Dump of variable fails in dwim-print (llvm#151374)
Previously, when dwim-print finds a frame variables, it returns immediately after calling `Dump`, even if `Dump` returns an error. This is most likely to happen when evaluating an object description, ie `po`. This changes dwim-print to continue on to expression evaluation when `Dump`ing a variable returns an error . This is to allow for diagnostics that match `expression`. (cherry picked from commit f23c10f)
1 parent 92e60fa commit f134b8e

File tree

1 file changed

+30
-19
lines changed

1 file changed

+30
-19
lines changed

lldb/source/Commands/CommandObjectDWIMPrint.cpp

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,15 @@
1919
#include "lldb/Target/MemoryRegionInfo.h"
2020
#include "lldb/Target/StackFrame.h"
2121
#include "lldb/Utility/ConstString.h"
22+
#include "lldb/Utility/LLDBLog.h"
23+
#include "lldb/Utility/Log.h"
2224
#include "lldb/ValueObject/ValueObject.h"
2325
#include "lldb/lldb-defines.h"
2426
#include "lldb/lldb-enumerations.h"
2527
#include "lldb/lldb-forward.h"
2628
#include "lldb/lldb-types.h"
2729
#include "llvm/ADT/StringRef.h"
30+
#include "llvm/Support/Error.h"
2831

2932
#include <regex>
3033

@@ -134,27 +137,22 @@ void CommandObjectDWIMPrint::DoExecute(StringRef command,
134137
};
135138

136139
// Dump `valobj` according to whether `po` was requested or not.
137-
auto dump_val_object = [&](ValueObject &valobj) {
140+
auto dump_val_object = [&](ValueObject &valobj) -> Error {
138141
if (is_po) {
139142
StreamString temp_result_stream;
140-
if (llvm::Error error = valobj.Dump(temp_result_stream, dump_options)) {
141-
result.AppendError(toString(std::move(error)));
142-
return;
143-
}
143+
if (Error err = valobj.Dump(temp_result_stream, dump_options))
144+
return err;
144145
llvm::StringRef output = temp_result_stream.GetString();
145146
maybe_add_hint(output);
146147
result.GetOutputStream() << output;
147148
} else {
148-
llvm::Error error =
149-
valobj.Dump(result.GetOutputStream(), dump_options);
150-
if (error) {
151-
result.AppendError(toString(std::move(error)));
152-
return;
153-
}
149+
if (Error err = valobj.Dump(result.GetOutputStream(), dump_options))
150+
return err;
154151
}
155152
m_interpreter.PrintWarningsIfNecessary(result.GetOutputStream(),
156153
m_cmd_name);
157154
result.SetStatus(eReturnStatusSuccessFinishResult);
155+
return Error::success();
158156
};
159157

160158
// First, try `expr` as a _limited_ frame variable expression path: only the
@@ -188,8 +186,13 @@ void CommandObjectDWIMPrint::DoExecute(StringRef command,
188186
expr);
189187
}
190188

191-
dump_val_object(*valobj_sp);
192-
return;
189+
Error err = dump_val_object(*valobj_sp);
190+
if (!err)
191+
return;
192+
193+
// Dump failed, continue on to expression evaluation.
194+
LLDB_LOG_ERROR(GetLog(LLDBLog::Expressions), std::move(err),
195+
"could not print frame variable '{1}': {0}", expr);
193196
}
194197
}
195198

@@ -235,8 +238,14 @@ void CommandObjectDWIMPrint::DoExecute(StringRef command,
235238
if (auto *state = target.GetPersistentExpressionStateForLanguage(language))
236239
if (auto var_sp = state->GetVariable(expr))
237240
if (auto valobj_sp = var_sp->GetValueObject()) {
238-
dump_val_object(*valobj_sp);
239-
return;
241+
Error err = dump_val_object(*valobj_sp);
242+
if (!err)
243+
return;
244+
245+
// Dump failed, continue on to expression evaluation.
246+
LLDB_LOG_ERROR(GetLog(LLDBLog::Expressions), std::move(err),
247+
"could not print persistent variable '{1}': {0}",
248+
expr);
240249
}
241250

242251
// Third, and lastly, try `expr` as a source expression to evaluate.
@@ -287,10 +296,12 @@ void CommandObjectDWIMPrint::DoExecute(StringRef command,
287296
result.AppendNoteWithFormatv("ran `expression {0}{1}`", flags, expr);
288297
}
289298

290-
if (valobj_sp->GetError().GetError() != UserExpression::kNoResult)
291-
dump_val_object(*valobj_sp);
292-
else
293-
result.SetStatus(eReturnStatusSuccessFinishResult);
299+
if (valobj_sp->GetError().GetError() != UserExpression::kNoResult) {
300+
if (Error err = dump_val_object(*valobj_sp))
301+
result.SetError(std::move(err));
302+
} else {
303+
result.SetStatus(eReturnStatusSuccessFinishNoResult);
304+
}
294305

295306
if (suppress_result)
296307
if (auto result_var_sp =

0 commit comments

Comments
 (0)