//===-- CommandObjectDWIMPrint.cpp ------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "CommandObjectDWIMPrint.h" #include "lldb/Core/ValueObject.h" #include "lldb/Interpreter/CommandInterpreter.h" #include "lldb/Interpreter/CommandObject.h" #include "lldb/Interpreter/CommandReturnObject.h" #include "lldb/Target/StackFrame.h" #include "lldb/Utility/ConstString.h" #include "lldb/lldb-enumerations.h" #include "lldb/lldb-forward.h" using namespace llvm; using namespace lldb; using namespace lldb_private; CommandObjectDWIMPrint::CommandObjectDWIMPrint(CommandInterpreter &interpreter) : CommandObjectRaw(interpreter, "dwim-print", "Print a variable or expression.", "dwim-print [ | ]", eCommandProcessMustBePaused | eCommandTryTargetAPILock) { } bool CommandObjectDWIMPrint::DoExecute(StringRef expr, CommandReturnObject &result) { // Ignore leading and trailing whitespace. expr = expr.trim(); if (expr.empty()) { result.AppendErrorWithFormatv("'{0}' takes a variable or expression", m_cmd_name); return false; } auto verbosity = GetDebugger().GetDWIMPrintVerbosity(); // First, try `expr` as the name of a frame variable. if (StackFrame *frame = m_exe_ctx.GetFramePtr()) { auto valobj_sp = frame->FindVariable(ConstString(expr)); if (valobj_sp && valobj_sp->GetError().Success()) { if (verbosity == eDWIMPrintVerbosityFull) result.AppendMessageWithFormatv("note: ran `frame variable {0}`", expr); valobj_sp->Dump(result.GetOutputStream()); result.SetStatus(eReturnStatusSuccessFinishResult); return true; } } // Second, also lastly, try `expr` as a source expression to evaluate. { Target *target_ptr = m_exe_ctx.GetTargetPtr(); // Fallback to the dummy target, which can allow for expression evaluation. Target &target = target_ptr ? *target_ptr : GetDummyTarget(); auto *exe_scope = m_exe_ctx.GetBestExecutionContextScope(); ValueObjectSP valobj_sp; if (target.EvaluateExpression(expr, exe_scope, valobj_sp) == eExpressionCompleted) { if (verbosity != eDWIMPrintVerbosityNone) result.AppendMessageWithFormatv("note: ran `expression -- {0}`", expr); valobj_sp->Dump(result.GetOutputStream()); result.SetStatus(eReturnStatusSuccessFinishResult); return true; } else { if (valobj_sp) result.SetError(valobj_sp->GetError()); else result.AppendErrorWithFormatv( "unknown error evaluating expression `{0}`", expr); return false; } } }