aboutsummaryrefslogtreecommitdiff
path: root/lldb/source/Expression/UserExpression.cpp
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2022-07-03 14:10:23 +0000
committerDimitry Andric <dim@FreeBSD.org>2022-07-03 14:10:23 +0000
commit145449b1e420787bb99721a429341fa6be3adfb6 (patch)
tree1d56ae694a6de602e348dd80165cf881a36600ed /lldb/source/Expression/UserExpression.cpp
parentecbca9f5fb7d7613d2b94982c4825eb0d33d6842 (diff)
Diffstat (limited to 'lldb/source/Expression/UserExpression.cpp')
-rw-r--r--lldb/source/Expression/UserExpression.cpp24
1 files changed, 20 insertions, 4 deletions
diff --git a/lldb/source/Expression/UserExpression.cpp b/lldb/source/Expression/UserExpression.cpp
index 692594b03f16..f821603f03e5 100644
--- a/lldb/source/Expression/UserExpression.cpp
+++ b/lldb/source/Expression/UserExpression.cpp
@@ -37,6 +37,7 @@
#include "lldb/Target/ThreadPlan.h"
#include "lldb/Target/ThreadPlanCallUserExpression.h"
#include "lldb/Utility/ConstString.h"
+#include "lldb/Utility/LLDBLog.h"
#include "lldb/Utility/Log.h"
#include "lldb/Utility/StreamString.h"
@@ -141,12 +142,12 @@ UserExpression::Evaluate(ExecutionContext &exe_ctx,
llvm::StringRef expr, llvm::StringRef prefix,
lldb::ValueObjectSP &result_valobj_sp, Status &error,
std::string *fixed_expression, ValueObject *ctx_obj) {
- Log *log(lldb_private::GetLogIfAnyCategoriesSet(LIBLLDB_LOG_EXPRESSIONS |
- LIBLLDB_LOG_STEP));
+ Log *log(GetLog(LLDBLog::Expressions | LLDBLog::Step));
if (ctx_obj) {
- static unsigned const ctx_type_mask =
- lldb::TypeFlags::eTypeIsClass | lldb::TypeFlags::eTypeIsStructUnion;
+ static unsigned const ctx_type_mask = lldb::TypeFlags::eTypeIsClass |
+ lldb::TypeFlags::eTypeIsStructUnion |
+ lldb::TypeFlags::eTypeIsReference;
if (!(ctx_obj->GetTypeInfo() & ctx_type_mask)) {
LLDB_LOG(log, "== [UserExpression::Evaluate] Passed a context object of "
"an invalid type, can't run expressions.");
@@ -155,6 +156,21 @@ UserExpression::Evaluate(ExecutionContext &exe_ctx,
}
}
+ if (ctx_obj && ctx_obj->GetTypeInfo() & lldb::TypeFlags::eTypeIsReference) {
+ Status error;
+ lldb::ValueObjectSP deref_ctx_sp = ctx_obj->Dereference(error);
+ if (!error.Success()) {
+ LLDB_LOG(log, "== [UserExpression::Evaluate] Passed a context object of "
+ "a reference type that can't be dereferenced, can't run "
+ "expressions.");
+ error.SetErrorString(
+ "passed context object of an reference type cannot be deferenced");
+ return lldb::eExpressionSetupError;
+ }
+
+ ctx_obj = deref_ctx_sp.get();
+ }
+
lldb_private::ExecutionPolicy execution_policy = options.GetExecutionPolicy();
lldb::LanguageType language = options.GetLanguage();
const ResultType desired_type = options.DoesCoerceToId()