ExecutionResults Target::EvaluateExpression ( const char *expr_cstr, StackFrame *frame, bool unwind_on_error, bool keep_in_memory, lldb::ValueObjectSP &result_valobj_sp ) { ExecutionResults execution_results = eExecutionSetupError; result_valobj_sp.reset(); ExecutionContext exe_ctx; if (frame) { frame->CalculateExecutionContext(exe_ctx); Error error; const uint32_t expr_path_options = StackFrame::eExpressionPathOptionCheckPtrVsMember | StackFrame::eExpressionPathOptionsNoFragileObjcIvar; result_valobj_sp = frame->GetValueForVariableExpressionPath (expr_cstr, expr_path_options, error); } else if (m_process_sp) { m_process_sp->CalculateExecutionContext(exe_ctx); } else { CalculateExecutionContext(exe_ctx); } if (result_valobj_sp) { execution_results = eExecutionCompleted; // We got a result from the frame variable expression path above... ConstString persistent_variable_name (m_persistent_variables.GetNextPersistentVariableName()); lldb::ValueObjectSP const_valobj_sp; // Check in case our value is already a constant value if (result_valobj_sp->GetIsConstant()) { const_valobj_sp = result_valobj_sp; const_valobj_sp->SetName (persistent_variable_name); } else const_valobj_sp = result_valobj_sp->CreateConstantValue (exe_ctx.GetBestExecutionContextScope(), persistent_variable_name); lldb::ValueObjectSP live_valobj_sp = result_valobj_sp; result_valobj_sp = const_valobj_sp; ClangExpressionVariableSP clang_expr_variable_sp(m_persistent_variables.CreatePersistentVariable(result_valobj_sp)); assert (clang_expr_variable_sp.get()); // Set flags and live data as appropriate const Value &result_value = live_valobj_sp->GetValue(); switch (result_value.GetValueType()) { case Value::eValueTypeHostAddress: case Value::eValueTypeFileAddress: // we don't do anything with these for now break; case Value::eValueTypeScalar: clang_expr_variable_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated; clang_expr_variable_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation; break; case Value::eValueTypeLoadAddress: clang_expr_variable_sp->m_live_sp = live_valobj_sp; clang_expr_variable_sp->m_flags |= ClangExpressionVariable::EVIsProgramReference; break; } } else { // Make sure we aren't just trying to see the value of a persistent // variable (something like "$0") lldb::ClangExpressionVariableSP persistent_var_sp; // Only check for persistent variables the expression starts with a '$' if (expr_cstr[0] == '$') persistent_var_sp = m_persistent_variables.GetVariable (expr_cstr); if (persistent_var_sp) { result_valobj_sp = persistent_var_sp->GetValueObject (); execution_results = eExecutionCompleted; } else { const char *prefix = GetExpressionPrefixContentsAsCString(); execution_results = ClangUserExpression::Evaluate (exe_ctx, unwind_on_error, keep_in_memory, expr_cstr, prefix, result_valobj_sp); } } return execution_results; }