10 #include <sys/types.h>
49 llvm::StringRef expr, llvm::StringRef prefix,
54 m_expr_prefix(std::
string(prefix)), m_language(language),
55 m_desired_type(desired_type), m_options(options) {}
62 lldb::StackFrameSP frame_sp = exe_ctx.
GetFrameSP();
65 m_address = frame_sp->GetFrameCodeAddress();
69 lldb::TargetSP &target_sp,
70 lldb::ProcessSP &process_sp,
71 lldb::StackFrameSP &frame_sp) {
75 if (process_sp != expected_process_sp)
86 frame_sp->GetFrameCodeAddress(),
87 target_sp.get()) == 0);
94 lldb::TargetSP target_sp;
95 lldb::ProcessSP process_sp;
96 lldb::StackFrameSP frame_sp;
108 "Couldn't load '%s' because the context is incomplete",
113 lldb::VariableSP var_sp;
114 lldb::ValueObjectSP valobj_sp;
116 valobj_sp = frame_sp->GetValueForVariableExpressionPath(
124 if (!err.
Success() || !valobj_sp.get())
131 "Couldn't load '%s' because its value couldn't be evaluated",
142 llvm::StringRef expr, llvm::StringRef prefix,
143 lldb::ValueObjectSP &result_valobj_sp,
Status &
error,
148 static unsigned const ctx_type_mask =
149 lldb::TypeFlags::eTypeIsClass | lldb::TypeFlags::eTypeIsStructUnion;
151 LLDB_LOG(log,
"== [UserExpression::Evaluate] Passed a context object of "
152 "an invalid type, can't run expressions.");
153 error.SetErrorString(
"a context object of an invalid type passed");
167 LLDB_LOG(log,
"== [UserExpression::Evaluate] Passed a NULL target, can't "
169 error.SetErrorString(
"expression passed a null target");
177 LLDB_LOG(log,
"== [UserExpression::Evaluate] Expression may not run, but "
178 "is not constant ==");
180 error.SetErrorString(
"expression needed to run but couldn't");
182 return execution_results;
191 (process ==
nullptr || !process->
CanJIT()))
201 llvm::StringRef full_prefix;
202 llvm::StringRef option_prefix(options.
GetPrefix());
204 if (!prefix.empty() && !option_prefix.empty()) {
206 full_prefix_storage.append(
std::string(option_prefix));
207 full_prefix = full_prefix_storage;
208 }
else if (!prefix.empty())
209 full_prefix = prefix;
211 full_prefix = option_prefix;
220 language = frame->GetLanguage();
223 lldb::UserExpressionSP user_expression_sp(
225 desired_type, options, ctx_obj,
228 LLDB_LOG(log,
"== [UserExpression::Evaluate] Getting expression: {0} ==",
233 LLDB_LOG(log,
"== [UserExpression::Evaluate] Parsing expression {0} ==",
236 const bool keep_expression_in_memory =
true;
240 error.SetErrorString(
"expression interrupted by callback before parse");
249 user_expression_sp->Parse(diagnostic_manager, exe_ctx, execution_policy,
250 keep_expression_in_memory, generate_debug_info);
254 if (fixed_expression ==
nullptr)
255 fixed_expression = &tmp_fixed_expression;
257 *fixed_expression = user_expression_sp->GetFixedText().str();
260 if (!parse_success) {
263 user_expression_sp.reset();
268 for (uint64_t i = 0; i < max_fix_retries; ++i) {
270 lldb::UserExpressionSP fixed_expression_sp(
272 fixed_expression->c_str(), full_prefix, language, desired_type,
273 options, ctx_obj,
error));
275 parse_success = fixed_expression_sp->Parse(
276 fixed_diagnostic_manager, exe_ctx, execution_policy,
277 keep_expression_in_memory, generate_debug_info);
279 diagnostic_manager.
Clear();
280 user_expression_sp = fixed_expression_sp;
285 if (!fixed_expression_sp->GetFixedText().empty()) {
286 *fixed_expression = fixed_expression_sp->GetFixedText().str();
290 fixed_expression->clear();
297 if (!parse_success) {
300 llvm::raw_string_ostream os(msg);
301 os <<
"expression failed to parse:\n";
305 os <<
"unknown error";
307 !fixed_expression->empty())
308 os <<
"\nfixed expression suggested:\n " << *fixed_expression;
310 error.SetExpressionError(execution_results, msg.c_str());
315 lldb::ExpressionVariableSP expr_result;
318 !user_expression_sp->CanInterpret()) {
319 LLDB_LOG(log,
"== [UserExpression::Evaluate] Expression may not run, but "
320 "is not constant ==");
324 "expression needed to run but couldn't");
330 error.SetExpressionError(
332 "expression interrupted by callback before execution");
338 diagnostic_manager.
Clear();
340 LLDB_LOG(log,
"== [UserExpression::Evaluate] Executing expression ==");
343 user_expression_sp->Execute(diagnostic_manager, exe_ctx, options,
344 user_expression_sp, expr_result);
347 LLDB_LOG(log,
"== [UserExpression::Evaluate] Execution completed "
351 error.SetExpressionError(
352 execution_results,
"expression failed to execute, unknown error");
354 error.SetExpressionError(execution_results,
358 result_valobj_sp = expr_result->GetValueObject();
359 result_valobj_sp->SetPreferredDisplayLanguage(language);
362 "== [UserExpression::Evaluate] Execution completed "
363 "normally with result {0} ==",
364 result_valobj_sp->GetValueAsCString());
366 LLDB_LOG(log,
"== [UserExpression::Evaluate] Execution completed "
367 "normally with no result ==");
376 error.SetExpressionError(
378 "expression interrupted by callback after complete");
382 if (result_valobj_sp.get() ==
nullptr) {
387 return execution_results;
394 lldb::UserExpressionSP &shared_ptr_to_me,
395 lldb::ExpressionVariableSP &result_var) {
397 diagnostic_manager, exe_ctx, options, shared_ptr_to_me, result_var);
400 if (
auto *persistent_state =
402 persistent_state->RemovePersistentVariable(result_var);